From 7d9318fe779436a6e41289be84ac2084b06573ac Mon Sep 17 00:00:00 2001 From: Karl Meakin Date: Tue, 21 Mar 2023 00:12:21 +0000 Subject: [PATCH] cranelift: rewrite `iabs(ineg(x))` and `iabs(iabs(x))` (#6072) * cranelift: rerwite `iabs(ineg(x))`` and `iabs(iabs(x))` * Fix comment on `iabs(iabs(x))` rewrite * Remove subsume on rewrite for `iabs(ineg(x))` --- cranelift/codegen/src/opts/algebraic.isle | 8 ++++++++ .../filetests/filetests/egraph/algebraic.clif | 17 +++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/cranelift/codegen/src/opts/algebraic.isle b/cranelift/codegen/src/opts/algebraic.isle index cce5ebe6c1..6bc0492498 100644 --- a/cranelift/codegen/src/opts/algebraic.isle +++ b/cranelift/codegen/src/opts/algebraic.isle @@ -39,6 +39,14 @@ (rule (simplify (imul ty (ineg ty x) (ineg ty y))) (subsume (imul ty x y))) +;; iabs(ineg(x)) == iabs(x). +(rule (simplify (iabs ty (ineg ty x))) + (iabs ty x)) + +;; iabs(iabs(x)) == iabs(x). +(rule (simplify (iabs ty inner @ (iabs ty x))) + (subsume inner)) + ;; 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 c29d67abee..f157ac1784 100644 --- a/cranelift/filetests/filetests/egraph/algebraic.clif +++ b/cranelift/filetests/filetests/egraph/algebraic.clif @@ -242,6 +242,23 @@ block0(v0: i32, v1: i32): ; check: return v5 } +function %iabs_ineg(i32) -> i32 { +block0(v0: i32): + v1 = ineg v0 + v2 = iabs v1 + return v2 + ; check: v3 = iabs v0 + ; check: return v3 +} + +function %iabs_iabs(i32) -> i32 { +block0(v0: i32): + v1 = iabs v0 + v2 = iabs v1 + return v2 + ; check: return v1 +} + function %isub_self(i32) -> i32 { block0(v0: i32): v1 = isub v0, v0