From c3f5b71b6af4a8c073aac021a82716f203aa60a4 Mon Sep 17 00:00:00 2001 From: Karl Meakin Date: Fri, 17 Mar 2023 19:41:20 +0000 Subject: [PATCH] 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 --- cranelift/codegen/src/opts/algebraic.isle | 4 ++++ cranelift/filetests/filetests/egraph/algebraic.clif | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/cranelift/codegen/src/opts/algebraic.isle b/cranelift/codegen/src/opts/algebraic.isle index ede83f7c0f..03ed0be235 100644 --- a/cranelift/codegen/src/opts/algebraic.isle +++ b/cranelift/codegen/src/opts/algebraic.isle @@ -35,6 +35,10 @@ ;; ineg(ineg(x)) == 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. (rule (simplify (isub (fits_in_64 (ty_int ty)) x x)) (subsume (iconst ty (imm64 0)))) diff --git a/cranelift/filetests/filetests/egraph/algebraic.clif b/cranelift/filetests/filetests/egraph/algebraic.clif index 73c39950de..0687330302 100644 --- a/cranelift/filetests/filetests/egraph/algebraic.clif +++ b/cranelift/filetests/filetests/egraph/algebraic.clif @@ -232,6 +232,16 @@ block0(v0: i32): ; 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 { block0(v0: i32): v1 = isub v0, v0