From a7fe83dbeb86c87756edaea40eb9365790519410 Mon Sep 17 00:00:00 2001 From: Karl Meakin Date: Thu, 16 Mar 2023 19:56:16 +0000 Subject: [PATCH 1/2] cranelift: simplify `x-x` to `0` --- 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 ce04c271670a..40e6ccaf7c07 100644 --- a/cranelift/codegen/src/opts/algebraic.isle +++ b/cranelift/codegen/src/opts/algebraic.isle @@ -35,6 +35,9 @@ ;; ineg(ineg(x)) == x. (rule (simplify (ineg ty (ineg ty x))) (subsume x)) +;; x-x == 0. +(rule (simplify (isub ty x x)) (subsume (iconst ty (imm64 0)))) + ;; 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 02d38cdd9d36..faae822feb8c 100644 --- a/cranelift/filetests/filetests/egraph/algebraic.clif +++ b/cranelift/filetests/filetests/egraph/algebraic.clif @@ -232,6 +232,14 @@ block0(v0: i32): ; check: return v0 } +function %isub_self(i32) -> i32 { +block0(v0: i32): + v1 = isub v0, v0 + return v1 + ; check: v2 = iconst.i32 0 + ; check: return v2 +} + function %or_and_y_with_not_y_i8(i8, i8) -> i8 { block0(v0: i8, v1: i8): v2 = band v0, v1 From ed62feb895d3f1f0585970f7d8f8226dc0bb04f0 Mon Sep 17 00:00:00 2001 From: Karl Meakin Date: Thu, 16 Mar 2023 20:23:25 +0000 Subject: [PATCH 2/2] Guard `x-x => 0` rewrite with `fits_in_64` --- cranelift/codegen/src/opts/algebraic.isle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cranelift/codegen/src/opts/algebraic.isle b/cranelift/codegen/src/opts/algebraic.isle index 40e6ccaf7c07..3efa05dfe32e 100644 --- a/cranelift/codegen/src/opts/algebraic.isle +++ b/cranelift/codegen/src/opts/algebraic.isle @@ -36,7 +36,7 @@ (rule (simplify (ineg ty (ineg ty x))) (subsume x)) ;; x-x == 0. -(rule (simplify (isub ty x x)) (subsume (iconst ty (imm64 0)))) +(rule (simplify (isub (fits_in_64 (ty_int ty)) x x)) (subsume (iconst ty (imm64 0)))) ;; x*1 == 1*x == x. (rule (simplify (imul ty