craneleft: cancel ineg when args to imul (#6053)

* craneleft: cancel `ineg`/`iabs` when args to `imul`

* Remove unsound `iabs(x) * iabs(y) == x*y` rewrite
This commit is contained in:
Karl Meakin
2023-03-17 19:41:20 +00:00
committed by GitHub
parent 2e48babf23
commit c3f5b71b6a
2 changed files with 14 additions and 0 deletions

View File

@@ -35,6 +35,10 @@
;; ineg(ineg(x)) == x. ;; ineg(ineg(x)) == x.
(rule (simplify (ineg ty (ineg ty x))) (subsume x)) (rule (simplify (ineg ty (ineg ty x))) (subsume x))
;; ineg(x) * ineg(y) == x*y.
(rule (simplify (imul ty (ineg ty x) (ineg ty y)))
(subsume (imul ty x y)))
;; x-x == 0. ;; x-x == 0.
(rule (simplify (isub (fits_in_64 (ty_int ty)) x x)) (subsume (iconst ty (imm64 0)))) (rule (simplify (isub (fits_in_64 (ty_int ty)) x x)) (subsume (iconst ty (imm64 0))))

View File

@@ -232,6 +232,16 @@ block0(v0: i32):
; check: return v0 ; check: return v0
} }
function %imul_ineg_cancel(i32, i32) -> i32 {
block0(v0: i32, v1: i32):
v2 = ineg v0
v3 = ineg v1
v4 = imul v2, v3
return v4
; check: v5 = imul v0, v1
; check: return v5
}
function %isub_self(i32) -> i32 { function %isub_self(i32) -> i32 {
block0(v0: i32): block0(v0: i32):
v1 = isub v0, v0 v1 = isub v0, v0