Skip to content

Commit 53d3652

Browse files
authored
[Cranelift] (x * y) (==/!=) z --> x (==/!=) (y / z) (#11994)
* add opt * add tests * add tests * update opt * fix desc * change desc * fix * fix
1 parent 6f4d26e commit 53d3652

File tree

3 files changed

+94
-1
lines changed

3 files changed

+94
-1
lines changed

cranelift/codegen/src/opts/arithmetic.isle

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,3 +347,48 @@
347347
;; (x - y) - x => -y
348348
(rule (simplify (isub ty (isub ty x y) x))(ineg ty y))
349349

350+
;; (x * C) (==/!=) D --> x (==/!=) (D / C) when C is odd and divides D
351+
(rule
352+
(simplify (ne ty (iconst_u ty1 x) (imul ty1 y (iconst_u ty1 z))))
353+
(if-let 0 (u64_rem x z))
354+
(if-let 1 (u64_rem z 2))
355+
(ne ty y (iconst ty1 (imm64 (u64_div x z)))))
356+
(rule
357+
(simplify (ne ty (iconst_u ty1 x) (imul ty1 (iconst_u ty1 y) z)))
358+
(if-let 0 (u64_rem x y))
359+
(if-let 1 (u64_rem y 2))
360+
(ne ty z (iconst ty1 (imm64 (u64_div x y)))))
361+
(rule
362+
(simplify (ne ty (imul ty1 x (iconst_u ty1 y)) (iconst_u ty1 z)))
363+
(if-let 0 (u64_rem z y))
364+
(if-let 1 (u64_rem y 2))
365+
(ne ty x (iconst ty1 (imm64 (u64_div z y)))))
366+
(rule
367+
(simplify (ne ty (imul ty1 (iconst_u ty1 x) y) (iconst_u ty1 z)))
368+
(if-let 0 (u64_rem z x))
369+
(if-let 1 (u64_rem x 2))
370+
(ne ty y (iconst ty1 (imm64 (u64_div z x)))))
371+
372+
373+
(rule
374+
(simplify (eq ty (iconst_u ty1 x) (imul ty1 y (iconst_u ty1 z))))
375+
(if-let 0 (u64_rem x z))
376+
(if-let 1 (u64_rem z 2))
377+
(eq ty y (iconst ty1 (imm64 (u64_div x z)))))
378+
(rule
379+
(simplify (eq ty (iconst_u ty1 x) (imul ty1 (iconst_u ty1 y) z)))
380+
(if-let 0 (u64_rem x y))
381+
(if-let 1 (u64_rem y 2))
382+
(eq ty z (iconst ty1 (imm64 (u64_div x y)))))
383+
(rule
384+
(simplify (eq ty (imul ty1 x (iconst_u ty1 y)) (iconst_u ty1 z)))
385+
(if-let 0 (u64_rem z y))
386+
(if-let 1 (u64_rem y 2))
387+
(eq ty x (iconst ty1 (imm64 (u64_div z y)))))
388+
(rule
389+
(simplify (eq ty (imul ty1 (iconst_u ty1 x) y) (iconst_u ty1 z)))
390+
(if-let 0 (u64_rem z x))
391+
(if-let 1 (u64_rem x 2))
392+
(eq ty y (iconst ty1 (imm64 (u64_div z x)))))
393+
394+

cranelift/filetests/filetests/egraph/arithmetic.clif

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,6 @@ block0(v0: i32, v1: i32):
404404
; check: return v5
405405
}
406406

407-
408407
;; (x - y) - x => -y
409408
function %simplify_sub_sub_self(i32, i32) -> i32 {
410409
block0(v0: i32, v1: i32):
@@ -415,3 +414,28 @@ block0(v0: i32, v1: i32):
415414
; check: return v4
416415
}
417416

417+
;; (x * y) (==/!=) z --> x (==/!=) (y / z) when z is odd and divides y
418+
function %eq_mul_odd(i32) -> i8 {
419+
block0(v0: i32):
420+
v1 = iconst.i32 7
421+
v2 = iconst.i32 42
422+
v3 = imul v0, v1
423+
v4 = icmp eq v3, v2
424+
return v4
425+
; check: v5 = iconst.i32 6
426+
; check: v6 = icmp eq v0, v5
427+
; return v6
428+
}
429+
430+
function %ne_mul_odd(i32) -> i8 {
431+
block0(v0: i32):
432+
v1 = iconst.i32 7
433+
v2 = iconst.i32 42
434+
v3 = imul v0, v1
435+
v4 = icmp ne v3, v2
436+
return v4
437+
; check: v5 = iconst.i32 6
438+
; check: v6 = icmp ne v0, v5
439+
; return v6
440+
}
441+

cranelift/filetests/filetests/runtests/arithmetic.clif

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -608,3 +608,27 @@ block0(v0: i32, v1: i32):
608608

609609
; run: %simplify_sub_sub_self(42, 5) == -5
610610

611+
;; (x * y) (==/!=) z --> x (==/!=) (y / z) when z is odd and divides y
612+
function %eq_mul_odd(i32) -> i8 {
613+
block0(v0: i32):
614+
v1 = iconst.i32 7
615+
v2 = iconst.i32 42
616+
v3 = imul v0, v1
617+
v4 = icmp eq v3, v2
618+
return v4
619+
}
620+
621+
; run: %eq_mul_odd(6) == 1
622+
; run: %eq_mul_odd(7) == 0
623+
624+
function %ne_mul_odd(i32) -> i8 {
625+
block0(v0: i32):
626+
v1 = iconst.i32 7
627+
v2 = iconst.i32 42
628+
v3 = imul v0, v1
629+
v4 = icmp ne v3, v2
630+
return v4
631+
}
632+
633+
; run: %ne_mul_odd(6) == 0
634+
; run: %ne_mul_odd(7) == 1

0 commit comments

Comments
 (0)