From dccc2d62691c0cd156f279d8536bdef44c833c06 Mon Sep 17 00:00:00 2001 From: Karl Meakin Date: Thu, 16 Mar 2023 22:14:05 +0000 Subject: [PATCH] cranelift: simplify `ineg(ineg(x))` to `x` (#6033) --- cranelift/codegen/src/opts/algebraic.isle | 3 +++ cranelift/filetests/filetests/egraph/algebraic.clif | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/cranelift/codegen/src/opts/algebraic.isle b/cranelift/codegen/src/opts/algebraic.isle index d7663df0313b..16ae97040aa4 100644 --- a/cranelift/codegen/src/opts/algebraic.isle +++ b/cranelift/codegen/src/opts/algebraic.isle @@ -32,6 +32,9 @@ x)) (ineg ty x)) +;; ineg(ineg(x)) == x. +(rule (simplify (ineg ty (ineg ty x))) (subsume x)) + ;; x*1 == 1*x == x. (rule (simplify (imul ty x diff --git a/cranelift/filetests/filetests/egraph/algebraic.clif b/cranelift/filetests/filetests/egraph/algebraic.clif index 573135d3b099..5520f0a4db94 100644 --- a/cranelift/filetests/filetests/egraph/algebraic.clif +++ b/cranelift/filetests/filetests/egraph/algebraic.clif @@ -224,6 +224,14 @@ block0(v0: i8): ; check: return v5 } +function %double_ineg(i32) -> i32 { +block0(v0: i32): + v1 = ineg v0 + v2 = ineg v1 + return v2 + ; check: return v0 +} + function %or_and_y_with_not_y_i8(i8, i8) -> i8 { block0(v0: i8, v1: i8): v2 = band v0, v1