77;; x+0 == x.
88(rule iadd_x_plus_zero (simplify (iadd ty
99 x
10- (iconst_u ty 0 )))
10+ (all_zero ty)))
1111 (subsume x))
1212;; x-0 == x.
1313(rule (simplify (isub ty
1414 x
15- (iconst_u ty 0 )))
15+ (all_zero ty)))
1616 (subsume x))
1717;; 0-x == (ineg x).
1818(rule (simplify (isub ty
19- (iconst_u ty 0 )
19+ (all_zero ty)
2020 x))
2121 (ineg ty x))
2222
4747 (subsume inner))
4848
4949;; x-x == 0.
50- (rule (simplify (isub ty x x)) (subsume (iconst_u ty 0 )))
50+ (rule (simplify (isub ty x x)) (subsume (all_zero ty)))
5151
5252;; x*1 == x.
5353(rule (simplify (imul ty
5858;; x*0 == 0.
5959(rule (simplify (imul ty
6060 _
61- zero @ (iconst_u ty 0 )))
61+ zero @ (all_zero ty)))
6262 (subsume zero))
6363
6464;; x*-1 == ineg(x).
127127 (apply_div_const_magic_s64 (Opcode.Sdiv) x d))
128128
129129;; x % 1 == 0
130- (rule (simplify_skeleton (urem x (iconst_u ty 1))) (iconst_u ty 0 ))
131- (rule (simplify_skeleton (srem x (iconst_u ty 1))) (iconst_u ty 0 ))
132- (rule (simplify_skeleton (srem x (iconst_s ty -1))) (iconst_u ty 0 ))
130+ (rule (simplify_skeleton (urem x (iconst_u ty 1))) (all_zero ty))
131+ (rule (simplify_skeleton (srem x (iconst_u ty 1))) (all_zero ty))
132+ (rule (simplify_skeleton (srem x (iconst_s ty -1))) (all_zero ty))
133133
134134;; Unsigned `x % d == x & ((1 << ilog2(d)) - 1)` when `d` is a power of two.
135135(rule (simplify_skeleton (urem x (iconst_u ty (u64_extract_power_of_two d))))
340340(rule (simplify (isub ty (iadd ty y x) (iadd ty z x))) (isub ty y z))
341341
342342;; (x - y) + (y - x) --> 0
343- (rule (simplify (iadd ty (isub ty x y) (isub ty y x))) (subsume (iconst_u ty 0 )))
343+ (rule (simplify (iadd ty (isub ty x y) (isub ty y x))) (subsume (all_zero ty)))
344344
345345;; ((x - z) - (y - z)) --> (x - y)
346346(rule (simplify (isub ty (isub ty x z) (isub ty y z))) (isub ty x y))
392392
393393;; Helper to create a "true" value for a comparison. For scalar integers this is
394394;; a value of 1 but for vectors this is -1 since each lane is filled with all
395- ;; 1s. We use `(iconst_u ty 0 )` for falses for both integers and vector . This is
395+ ;; 1s. We use `(all_zero ty)` for falses for both integers and vectors . This is
396396;; because of the Cranelift semantics:
397397;; When comparing scalars, the result is 1 if the condition holds, or 0 otherwise.
398398;; When comparing vectors, the result is -1 (all-ones) if the condition holds, or 0 otherwise.
407407(rule (simplify (eq ty (iadd cty y x) (iadd cty y x))) (cmp_true ty))
408408
409409;; (x - y) != x --> y != 0
410- (rule (simplify (ne cty (isub ty x y) x)) (ne cty y (iconst_u ty 0 )))
411- (rule (simplify (ne cty x (isub ty x y))) (ne cty y (iconst_u ty 0 )))
410+ (rule (simplify (ne cty (isub ty x y) x)) (ne cty y (all_zero ty)))
411+ (rule (simplify (ne cty x (isub ty x y))) (ne cty y (all_zero ty)))
412412
413413;; (x - y) == x --> y == 0
414- (rule (simplify (eq cty (isub ty x y) x)) (eq cty y (iconst_u ty 0 )))
415- (rule (simplify (eq cty x (isub ty x y))) (eq cty y (iconst_u ty 0 )))
414+ (rule (simplify (eq cty (isub ty x y) x)) (eq cty y (all_zero ty)))
415+ (rule (simplify (eq cty x (isub ty x y))) (eq cty y (all_zero ty)))
416416
417417;; (x + y) == y --> x == 0
418- (rule (simplify (eq cty (iadd ty x y) y)) (eq cty x (iconst_u ty 0 )))
419- (rule (simplify (eq cty (iadd ty y x) y)) (eq cty x (iconst_u ty 0 )))
420- (rule (simplify (eq cty y (iadd ty x y))) (eq cty x (iconst_u ty 0 )))
421- (rule (simplify (eq cty y (iadd ty y x))) (eq cty x (iconst_u ty 0 )))
418+ (rule (simplify (eq cty (iadd ty x y) y)) (eq cty x (all_zero ty)))
419+ (rule (simplify (eq cty (iadd ty y x) y)) (eq cty x (all_zero ty)))
420+ (rule (simplify (eq cty y (iadd ty x y))) (eq cty x (all_zero ty)))
421+ (rule (simplify (eq cty y (iadd ty y x))) (eq cty x (all_zero ty)))
422422
423423;; -x == -y --> x == y
424424(rule (simplify (eq ty (ineg ty x) (ineg ty y))) (eq ty x y))
574574(rule (simplify (umax ty (umin ty x y) (umax ty y x))) (umax ty x y))
575575
576576;; x > max(x, y) --> 0
577- (rule (simplify (sgt ty x (smax ty x y))) (iconst_u ty 0 ))
578- (rule (simplify (sgt ty x (smax ty y x))) (iconst_u ty 0 ))
579- (rule (simplify (slt ty (smax ty x y) x)) (iconst_u ty 0 ))
580- (rule (simplify (slt ty (smax ty y x) x)) (iconst_u ty 0 ))
581- (rule (simplify (ugt ty x (umax ty x y))) (iconst_u ty 0 ))
582- (rule (simplify (ugt ty x (umax ty y x))) (iconst_u ty 0 ))
583- (rule (simplify (ult ty (umax ty x y) x)) (iconst_u ty 0 ))
584- (rule (simplify (ult ty (umax ty y x) x)) (iconst_u ty 0 ))
577+ (rule (simplify (sgt ty x (smax ty x y))) (all_zero ty))
578+ (rule (simplify (sgt ty x (smax ty y x))) (all_zero ty))
579+ (rule (simplify (slt ty (smax ty x y) x)) (all_zero ty))
580+ (rule (simplify (slt ty (smax ty y x) x)) (all_zero ty))
581+ (rule (simplify (ugt ty x (umax ty x y))) (all_zero ty))
582+ (rule (simplify (ugt ty x (umax ty y x))) (all_zero ty))
583+ (rule (simplify (ult ty (umax ty x y) x)) (all_zero ty))
584+ (rule (simplify (ult ty (umax ty y x) x)) (all_zero ty))
585585
586586;; (-X) * C = X * (-C)
587587(rule imul_ineg_const (simplify (imul (fits_in_64 ty) (ineg ty x) (iconst ty y))) (imul ty x (iconst ty (imm64_neg ty y))))
619619(rule (simplify (imul ty (umax ty (ineg ty x) x) (umax ty (ineg ty x) x))) (imul ty x x))
620620(rule (simplify (imul ty (umax ty (ineg ty x) x) (umax ty x (ineg ty x)))) (imul ty x x))
621621(rule (simplify (imul ty (umax ty x (ineg ty x)) (umax ty (ineg ty x) x))) (imul ty x x))
622- (rule (simplify (imul ty (umax ty x (ineg ty x)) (umax ty x (ineg ty x)))) (imul ty x x))
622+ (rule (simplify (imul ty (umax ty x (ineg ty x)) (umax ty x (ineg ty x)))) (imul ty x x))
623+
624+ ;; x /u (1 << y) --> x >>u y
625+ (rule (simplify_skeleton (udiv x (ishl ty (iconst_u ty 1) y)))
626+ (ushr ty x y))
0 commit comments