diff --git a/cranelift/codegen/src/opts/icmp.isle b/cranelift/codegen/src/opts/icmp.isle index d48281adc5..aef7cd499d 100644 --- a/cranelift/codegen/src/opts/icmp.isle +++ b/cranelift/codegen/src/opts/icmp.isle @@ -47,11 +47,36 @@ (iconst _ (u64_from_imm64 1)))) extend) +;; Rewrite loose inequalities to strict inequalities: +;; ule(x, c) == ult(x, c+1), for c != UMAX. +(rule (simplify (ule (fits_in_64 (ty_int bty)) x (iconst cty (u64_from_imm64 c)))) + (if-let $false (u64_eq c (ty_umax cty))) + (ult bty x (iconst cty (imm64 (u64_add c 1))))) + +;; uge(x, c) == ugt(x, c-1), for c != 0. +(rule (simplify (uge (fits_in_64 (ty_int bty)) x (iconst cty (u64_from_imm64 c)))) + (if-let $false (u64_eq c 0)) + (ugt bty x (iconst cty (imm64 (u64_sub c 1))))) + +;; sle(x, c) == slt(x, c+1), for c != SMAX. +(rule (simplify (sle (fits_in_64 (ty_int bty)) x (iconst cty (u64_from_imm64 c)))) + (if-let $false (u64_eq c (ty_smax cty))) + (slt bty x (iconst cty (imm64 (u64_add c 1))))) + +;; sge(x, c) == sgt(x, c-1), for c != SMIN. +(rule (simplify (sge (fits_in_64 (ty_int bty)) x (iconst cty (u64_from_imm64 c)))) + (if-let $false (u64_eq c (ty_smin cty))) + (sgt bty x (iconst cty (imm64 (u64_sub c 1))))) + ;; Comparisons against largest/smallest signed/unsigned values: ;; ult(x, 0) == false. (rule (simplify (ult (fits_in_64 (ty_int bty)) x zero @ (iconst _ (u64_from_imm64 0)))) (subsume (iconst bty (imm64 0)))) +;; ult(x, 1) == eq(x, 0) +(rule (simplify (ult (fits_in_64 (ty_int bty)) x (iconst cty (u64_from_imm64 0)))) + (eq bty x (iconst cty (imm64 0)))) + ;; ule(x, 0) == eq(x, 0) (rule (simplify (ule (fits_in_64 (ty_int bty)) x zero @ (iconst _ (u64_from_imm64 0)))) (eq bty x zero)) @@ -84,6 +109,11 @@ (if-let $true (u64_eq y (ty_umax cty))) (eq bty x umax)) +;; ugt(x, UMAX-1) == eq(x, UMAX). +(rule (simplify (ugt (fits_in_64 (ty_int bty)) x (iconst cty (u64_from_imm64 y)))) + (if-let $true (u64_eq y (u64_sub (ty_umax cty) 1))) + (eq bty x (iconst cty (imm64 (ty_umax cty))))) + ;; slt(x, SMIN) == false. (rule (simplify (slt (fits_in_64 (ty_int bty)) x smin @ (iconst cty (u64_from_imm64 y)))) (if-let $true (u64_eq y (ty_smin cty))) @@ -94,6 +124,11 @@ (if-let $true (u64_eq y (ty_smin cty))) (eq bty x smin)) +;; slt(x, SMIN+1) == eq(x, SMIN). +(rule (simplify (slt (fits_in_64 (ty_int bty)) x (iconst cty (u64_from_imm64 y)))) + (if-let $true (u64_eq y (u64_add (ty_smin cty) 1))) + (eq bty x (iconst cty (imm64 (ty_smin cty))))) + ;; sgt(x, SMIN) == ne(x, SMIN). (rule (simplify (sgt (fits_in_64 (ty_int bty)) x smin @ (iconst cty (u64_from_imm64 y)))) (if-let $true (u64_eq y (ty_smin cty))) @@ -124,6 +159,11 @@ (if-let $true (u64_eq y (ty_smax cty))) (eq bty x smax)) +;; sgt(x, SMAX-1) == eq(x, SMAX). +(rule (simplify (sgt (fits_in_64 (ty_int bty)) x (iconst cty (u64_from_imm64 y)))) + (if-let $true (u64_eq y (u64_sub (ty_smax cty) 1))) + (eq bty x (iconst cty (imm64 (ty_smax cty))))) + ;; `band`/`bor` of 2 comparisons: (rule (simplify (band ty (icmp ty cc1 x y) (icmp ty cc2 x y))) (if-let signed (intcc_comparable cc1 cc2)) diff --git a/cranelift/filetests/filetests/egraph/algebraic.clif b/cranelift/filetests/filetests/egraph/algebraic.clif index deeb3d1bf7..3f41f2991e 100644 --- a/cranelift/filetests/filetests/egraph/algebraic.clif +++ b/cranelift/filetests/filetests/egraph/algebraic.clif @@ -441,8 +441,8 @@ block0(v1: i32): return v4 } -; check: v5 = iconst.i8 1 -; check: return v5 +; check: v7 = iconst.i8 1 +; check: return v7 function %double_uextend(i16) -> i64 { block0(v1: i16): diff --git a/cranelift/filetests/filetests/egraph/cprop.clif b/cranelift/filetests/filetests/egraph/cprop.clif index 972fb0dce2..736e6c5c2b 100644 --- a/cranelift/filetests/filetests/egraph/cprop.clif +++ b/cranelift/filetests/filetests/egraph/cprop.clif @@ -163,8 +163,8 @@ block0: return v2 } -; check: v3 = iconst.i8 1 -; nextln: return v3 +; check: v5 = iconst.i8 1 +; nextln: return v5 function %icmp_uge_i32() -> i8 { block0: @@ -174,8 +174,8 @@ block0: return v2 } -; check: v3 = iconst.i8 0 -; nextln: return v3 +; check: v4 = iconst.i8 0 +; nextln: return v4 function %icmp_ugt_i32() -> i8 { block0: @@ -207,8 +207,8 @@ block0: return v2 } -; check: v3 = iconst.i8 1 -; nextln: return v3 +; check: v5 = iconst.i8 1 +; nextln: return v5 function %icmp_sge_i32() -> i8 { block0: @@ -218,8 +218,8 @@ block0: return v2 } -; check: v3 = iconst.i8 0 -; nextln: return v3 +; check: v5 = iconst.i8 0 +; nextln: return v5 function %icmp_sgt_i32() -> i8 { block0: diff --git a/cranelift/filetests/filetests/egraph/icmp-parameterized.clif b/cranelift/filetests/filetests/egraph/icmp-parameterized.clif index babeb6b225..ec1679c2c2 100644 --- a/cranelift/filetests/filetests/egraph/icmp-parameterized.clif +++ b/cranelift/filetests/filetests/egraph/icmp-parameterized.clif @@ -4,7 +4,7 @@ set use_egraphs=true target x86_64 ;; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -;; !!! GENERATED BY 'make-parameterized-icmp-tests.sh' DO NOT EDIT !!! +;; !!! GENERATED BY 'make-icmp-parameterized-tests.sh' DO NOT EDIT !!! ;; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ;; run with the 'CRANELIFT_TEST_BLESS=1' env var set to update this file @@ -138,38 +138,6 @@ block0(v0: i32): ; return v2 ; v2 = 1 ; } -function %mask_icmp_result(i64, i64) -> i8 { -block0(v1: i64, v2: i64): - v3 = icmp ult v1, v2 - v4 = iconst.i8 1 - v5 = band v3, v4 - return v5 -} - -; function %mask_icmp_result(i64, i64) -> i8 fast { -; block0(v1: i64, v2: i64): -; v3 = icmp ult v1, v2 -; v6 -> v3 -; return v3 -; } - -function %mask_icmp_extend_result(i64, i64) -> i64 { -block0(v1: i64, v2: i64): - v3 = icmp ult v1, v2 - v4 = uextend.i64 v3 - v5 = iconst.i64 1 - v6 = band v4, v5 - return v6 -} - -; function %mask_icmp_extend_result(i64, i64) -> i64 fast { -; block0(v1: i64, v2: i64): -; v3 = icmp ult v1, v2 -; v4 = uextend.i64 v3 -; v7 -> v4 -; return v4 -; } - function %icmp_eq_umin(i32) -> i8 { block0(v0: i32): v1 = iconst.i32 0 @@ -184,6 +152,20 @@ block0(v0: i32): ; return v2 ; } +function %icmp_eq_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 1 + v2 = icmp eq v0, v1 + return v2 +} + +; function %icmp_eq_1(i32) -> i8 fast { +; block0(v0: i32): +; v1 = iconst.i32 1 +; v2 = icmp eq v0, v1 ; v1 = 1 +; return v2 +; } + function %icmp_eq_umax(i32) -> i8 { block0(v0: i32): v1 = iconst.i32 0xFFFF_FFFF @@ -198,6 +180,20 @@ block0(v0: i32): ; return v2 ; } +function %icmp_eq_umax_minus_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 0xFFFF_FFFE + v2 = icmp eq v0, v1 + return v2 +} + +; function %icmp_eq_umax_minus_1(i32) -> i8 fast { +; block0(v0: i32): +; v1 = iconst.i32 0xffff_fffe +; v2 = icmp eq v0, v1 ; v1 = 0xffff_fffe +; return v2 +; } + function %icmp_eq_smin(i32) -> i8 { block0(v0: i32): v1 = iconst.i32 0x8000_0000 @@ -212,6 +208,20 @@ block0(v0: i32): ; return v2 ; } +function %icmp_eq_smin_plus_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 0x8000_0001 + v2 = icmp eq v0, v1 + return v2 +} + +; function %icmp_eq_smin_plus_1(i32) -> i8 fast { +; block0(v0: i32): +; v1 = iconst.i32 0x8000_0001 +; v2 = icmp eq v0, v1 ; v1 = 0x8000_0001 +; return v2 +; } + function %icmp_eq_smax(i32) -> i8 { block0(v0: i32): v1 = iconst.i32 0x7FFF_FFFF @@ -226,6 +236,20 @@ block0(v0: i32): ; return v2 ; } +function %icmp_eq_smax_minus_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 0x7FFF_FFFE + v2 = icmp eq v0, v1 + return v2 +} + +; function %icmp_eq_smax_minus_1(i32) -> i8 fast { +; block0(v0: i32): +; v1 = iconst.i32 0x7fff_fffe +; v2 = icmp eq v0, v1 ; v1 = 0x7fff_fffe +; return v2 +; } + function %icmp_ne_umin(i32) -> i8 { block0(v0: i32): v1 = iconst.i32 0 @@ -240,6 +264,20 @@ block0(v0: i32): ; return v2 ; } +function %icmp_ne_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 1 + v2 = icmp ne v0, v1 + return v2 +} + +; function %icmp_ne_1(i32) -> i8 fast { +; block0(v0: i32): +; v1 = iconst.i32 1 +; v2 = icmp ne v0, v1 ; v1 = 1 +; return v2 +; } + function %icmp_ne_umax(i32) -> i8 { block0(v0: i32): v1 = iconst.i32 0xFFFF_FFFF @@ -254,6 +292,20 @@ block0(v0: i32): ; return v2 ; } +function %icmp_ne_umax_minus_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 0xFFFF_FFFE + v2 = icmp ne v0, v1 + return v2 +} + +; function %icmp_ne_umax_minus_1(i32) -> i8 fast { +; block0(v0: i32): +; v1 = iconst.i32 0xffff_fffe +; v2 = icmp ne v0, v1 ; v1 = 0xffff_fffe +; return v2 +; } + function %icmp_ne_smin(i32) -> i8 { block0(v0: i32): v1 = iconst.i32 0x8000_0000 @@ -268,6 +320,20 @@ block0(v0: i32): ; return v2 ; } +function %icmp_ne_smin_plus_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 0x8000_0001 + v2 = icmp ne v0, v1 + return v2 +} + +; function %icmp_ne_smin_plus_1(i32) -> i8 fast { +; block0(v0: i32): +; v1 = iconst.i32 0x8000_0001 +; v2 = icmp ne v0, v1 ; v1 = 0x8000_0001 +; return v2 +; } + function %icmp_ne_smax(i32) -> i8 { block0(v0: i32): v1 = iconst.i32 0x7FFF_FFFF @@ -282,6 +348,20 @@ block0(v0: i32): ; return v2 ; } +function %icmp_ne_smax_minus_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 0x7FFF_FFFE + v2 = icmp ne v0, v1 + return v2 +} + +; function %icmp_ne_smax_minus_1(i32) -> i8 fast { +; block0(v0: i32): +; v1 = iconst.i32 0x7fff_fffe +; v2 = icmp ne v0, v1 ; v1 = 0x7fff_fffe +; return v2 +; } + function %icmp_ult_umin(i32) -> i8 { block0(v0: i32): v1 = iconst.i32 0 @@ -295,6 +375,20 @@ block0(v0: i32): ; return v3 ; v3 = 0 ; } +function %icmp_ult_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 1 + v2 = icmp ult v0, v1 + return v2 +} + +; function %icmp_ult_1(i32) -> i8 fast { +; block0(v0: i32): +; v1 = iconst.i32 1 +; v2 = icmp ult v0, v1 ; v1 = 1 +; return v2 +; } + function %icmp_ult_umax(i32) -> i8 { block0(v0: i32): v1 = iconst.i32 0xFFFF_FFFF @@ -310,6 +404,20 @@ block0(v0: i32): ; return v3 ; } +function %icmp_ult_umax_minus_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 0xFFFF_FFFE + v2 = icmp ult v0, v1 + return v2 +} + +; function %icmp_ult_umax_minus_1(i32) -> i8 fast { +; block0(v0: i32): +; v1 = iconst.i32 0xffff_fffe +; v2 = icmp ult v0, v1 ; v1 = 0xffff_fffe +; return v2 +; } + function %icmp_ult_smin(i32) -> i8 { block0(v0: i32): v1 = iconst.i32 0x8000_0000 @@ -324,6 +432,20 @@ block0(v0: i32): ; return v2 ; } +function %icmp_ult_smin_plus_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 0x8000_0001 + v2 = icmp ult v0, v1 + return v2 +} + +; function %icmp_ult_smin_plus_1(i32) -> i8 fast { +; block0(v0: i32): +; v1 = iconst.i32 0x8000_0001 +; v2 = icmp ult v0, v1 ; v1 = 0x8000_0001 +; return v2 +; } + function %icmp_ult_smax(i32) -> i8 { block0(v0: i32): v1 = iconst.i32 0x7FFF_FFFF @@ -338,6 +460,20 @@ block0(v0: i32): ; return v2 ; } +function %icmp_ult_smax_minus_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 0x7FFF_FFFE + v2 = icmp ult v0, v1 + return v2 +} + +; function %icmp_ult_smax_minus_1(i32) -> i8 fast { +; block0(v0: i32): +; v1 = iconst.i32 0x7fff_fffe +; v2 = icmp ult v0, v1 ; v1 = 0x7fff_fffe +; return v2 +; } + function %icmp_ule_umin(i32) -> i8 { block0(v0: i32): v1 = iconst.i32 0 @@ -348,9 +484,24 @@ block0(v0: i32): ; function %icmp_ule_umin(i32) -> i8 fast { ; block0(v0: i32): ; v1 = iconst.i32 0 -; v3 = icmp eq v0, v1 ; v1 = 0 -; v4 -> v3 -; return v3 +; v5 = icmp eq v0, v1 ; v1 = 0 +; v7 -> v5 +; return v5 +; } + +function %icmp_ule_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 1 + v2 = icmp ule v0, v1 + return v2 +} + +; function %icmp_ule_1(i32) -> i8 fast { +; block0(v0: i32): +; v3 = iconst.i32 2 +; v4 = icmp ult v0, v3 ; v3 = 2 +; v5 -> v4 +; return v4 ; } function %icmp_ule_umax(i32) -> i8 { @@ -366,6 +517,22 @@ block0(v0: i32): ; return v3 ; v3 = 1 ; } +function %icmp_ule_umax_minus_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 0xFFFF_FFFE + v2 = icmp ule v0, v1 + return v2 +} + +; function %icmp_ule_umax_minus_1(i32) -> i8 fast { +; block0(v0: i32): +; v3 = iconst.i32 0xffff_ffff +; v5 = icmp ne v0, v3 ; v3 = 0xffff_ffff +; v6 -> v5 +; v7 -> v6 +; return v5 +; } + function %icmp_ule_smin(i32) -> i8 { block0(v0: i32): v1 = iconst.i32 0x8000_0000 @@ -375,9 +542,25 @@ block0(v0: i32): ; function %icmp_ule_smin(i32) -> i8 fast { ; block0(v0: i32): -; v1 = iconst.i32 0x8000_0000 -; v2 = icmp ule v0, v1 ; v1 = 0x8000_0000 -; return v2 +; v3 = iconst.i32 0x8000_0001 +; v4 = icmp ult v0, v3 ; v3 = 0x8000_0001 +; v5 -> v4 +; return v4 +; } + +function %icmp_ule_smin_plus_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 0x8000_0001 + v2 = icmp ule v0, v1 + return v2 +} + +; function %icmp_ule_smin_plus_1(i32) -> i8 fast { +; block0(v0: i32): +; v3 = iconst.i32 0x8000_0002 +; v4 = icmp ult v0, v3 ; v3 = 0x8000_0002 +; v5 -> v4 +; return v4 ; } function %icmp_ule_smax(i32) -> i8 { @@ -389,9 +572,25 @@ block0(v0: i32): ; function %icmp_ule_smax(i32) -> i8 fast { ; block0(v0: i32): -; v1 = iconst.i32 0x7fff_ffff -; v2 = icmp ule v0, v1 ; v1 = 0x7fff_ffff -; return v2 +; v3 = iconst.i32 0x8000_0000 +; v4 = icmp ult v0, v3 ; v3 = 0x8000_0000 +; v5 -> v4 +; return v4 +; } + +function %icmp_ule_smax_minus_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 0x7FFF_FFFE + v2 = icmp ule v0, v1 + return v2 +} + +; function %icmp_ule_smax_minus_1(i32) -> i8 fast { +; block0(v0: i32): +; v3 = iconst.i32 0x7fff_ffff +; v4 = icmp ult v0, v3 ; v3 = 0x7fff_ffff +; v5 -> v4 +; return v4 ; } function %icmp_ugt_umin(i32) -> i8 { @@ -409,6 +608,20 @@ block0(v0: i32): ; return v3 ; } +function %icmp_ugt_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 1 + v2 = icmp ugt v0, v1 + return v2 +} + +; function %icmp_ugt_1(i32) -> i8 fast { +; block0(v0: i32): +; v1 = iconst.i32 1 +; v2 = icmp ugt v0, v1 ; v1 = 1 +; return v2 +; } + function %icmp_ugt_umax(i32) -> i8 { block0(v0: i32): v1 = iconst.i32 0xFFFF_FFFF @@ -422,6 +635,21 @@ block0(v0: i32): ; return v3 ; v3 = 0 ; } +function %icmp_ugt_umax_minus_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 0xFFFF_FFFE + v2 = icmp ugt v0, v1 + return v2 +} + +; function %icmp_ugt_umax_minus_1(i32) -> i8 fast { +; block0(v0: i32): +; v3 = iconst.i32 0xffff_ffff +; v4 = icmp eq v0, v3 ; v3 = 0xffff_ffff +; v5 -> v4 +; return v4 +; } + function %icmp_ugt_smin(i32) -> i8 { block0(v0: i32): v1 = iconst.i32 0x8000_0000 @@ -436,6 +664,20 @@ block0(v0: i32): ; return v2 ; } +function %icmp_ugt_smin_plus_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 0x8000_0001 + v2 = icmp ugt v0, v1 + return v2 +} + +; function %icmp_ugt_smin_plus_1(i32) -> i8 fast { +; block0(v0: i32): +; v1 = iconst.i32 0x8000_0001 +; v2 = icmp ugt v0, v1 ; v1 = 0x8000_0001 +; return v2 +; } + function %icmp_ugt_smax(i32) -> i8 { block0(v0: i32): v1 = iconst.i32 0x7FFF_FFFF @@ -450,6 +692,20 @@ block0(v0: i32): ; return v2 ; } +function %icmp_ugt_smax_minus_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 0x7FFF_FFFE + v2 = icmp ugt v0, v1 + return v2 +} + +; function %icmp_ugt_smax_minus_1(i32) -> i8 fast { +; block0(v0: i32): +; v1 = iconst.i32 0x7fff_fffe +; v2 = icmp ugt v0, v1 ; v1 = 0x7fff_fffe +; return v2 +; } + function %icmp_uge_umin(i32) -> i8 { block0(v0: i32): v1 = iconst.i32 0 @@ -463,6 +719,22 @@ block0(v0: i32): ; return v3 ; v3 = 1 ; } +function %icmp_uge_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 1 + v2 = icmp uge v0, v1 + return v2 +} + +; function %icmp_uge_1(i32) -> i8 fast { +; block0(v0: i32): +; v3 = iconst.i32 0 +; v5 = icmp ne v0, v3 ; v3 = 0 +; v6 -> v5 +; v7 -> v6 +; return v5 +; } + function %icmp_uge_umax(i32) -> i8 { block0(v0: i32): v1 = iconst.i32 0xFFFF_FFFF @@ -474,10 +746,27 @@ block0(v0: i32): ; block0(v0: i32): ; v1 = iconst.i32 0xffff_ffff ; v3 = icmp eq v0, v1 ; v1 = 0xffff_ffff -; v4 -> v3 +; v6 -> v3 +; v7 -> v3 +; v8 -> v6 ; return v3 ; } +function %icmp_uge_umax_minus_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 0xFFFF_FFFE + v2 = icmp uge v0, v1 + return v2 +} + +; function %icmp_uge_umax_minus_1(i32) -> i8 fast { +; block0(v0: i32): +; v3 = iconst.i32 0xffff_fffd +; v4 = icmp ugt v0, v3 ; v3 = 0xffff_fffd +; v5 -> v4 +; return v4 +; } + function %icmp_uge_smin(i32) -> i8 { block0(v0: i32): v1 = iconst.i32 0x8000_0000 @@ -487,9 +776,25 @@ block0(v0: i32): ; function %icmp_uge_smin(i32) -> i8 fast { ; block0(v0: i32): -; v1 = iconst.i32 0x8000_0000 -; v2 = icmp uge v0, v1 ; v1 = 0x8000_0000 -; return v2 +; v3 = iconst.i32 0x7fff_ffff +; v4 = icmp ugt v0, v3 ; v3 = 0x7fff_ffff +; v5 -> v4 +; return v4 +; } + +function %icmp_uge_smin_plus_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 0x8000_0001 + v2 = icmp uge v0, v1 + return v2 +} + +; function %icmp_uge_smin_plus_1(i32) -> i8 fast { +; block0(v0: i32): +; v3 = iconst.i32 0x8000_0000 +; v4 = icmp ugt v0, v3 ; v3 = 0x8000_0000 +; v5 -> v4 +; return v4 ; } function %icmp_uge_smax(i32) -> i8 { @@ -501,9 +806,25 @@ block0(v0: i32): ; function %icmp_uge_smax(i32) -> i8 fast { ; block0(v0: i32): -; v1 = iconst.i32 0x7fff_ffff -; v2 = icmp uge v0, v1 ; v1 = 0x7fff_ffff -; return v2 +; v3 = iconst.i32 0x7fff_fffe +; v4 = icmp ugt v0, v3 ; v3 = 0x7fff_fffe +; v5 -> v4 +; return v4 +; } + +function %icmp_uge_smax_minus_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 0x7FFF_FFFE + v2 = icmp uge v0, v1 + return v2 +} + +; function %icmp_uge_smax_minus_1(i32) -> i8 fast { +; block0(v0: i32): +; v3 = iconst.i32 0x7fff_fffd +; v4 = icmp ugt v0, v3 ; v3 = 0x7fff_fffd +; v5 -> v4 +; return v4 ; } function %icmp_slt_umin(i32) -> i8 { @@ -520,6 +841,20 @@ block0(v0: i32): ; return v2 ; } +function %icmp_slt_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 1 + v2 = icmp slt v0, v1 + return v2 +} + +; function %icmp_slt_1(i32) -> i8 fast { +; block0(v0: i32): +; v1 = iconst.i32 1 +; v2 = icmp slt v0, v1 ; v1 = 1 +; return v2 +; } + function %icmp_slt_umax(i32) -> i8 { block0(v0: i32): v1 = iconst.i32 0xFFFF_FFFF @@ -534,6 +869,20 @@ block0(v0: i32): ; return v2 ; } +function %icmp_slt_umax_minus_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 0xFFFF_FFFE + v2 = icmp slt v0, v1 + return v2 +} + +; function %icmp_slt_umax_minus_1(i32) -> i8 fast { +; block0(v0: i32): +; v1 = iconst.i32 0xffff_fffe +; v2 = icmp slt v0, v1 ; v1 = 0xffff_fffe +; return v2 +; } + function %icmp_slt_smin(i32) -> i8 { block0(v0: i32): v1 = iconst.i32 0x8000_0000 @@ -547,6 +896,21 @@ block0(v0: i32): ; return v3 ; v3 = 0 ; } +function %icmp_slt_smin_plus_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 0x8000_0001 + v2 = icmp slt v0, v1 + return v2 +} + +; function %icmp_slt_smin_plus_1(i32) -> i8 fast { +; block0(v0: i32): +; v3 = iconst.i32 0x8000_0000 +; v4 = icmp eq v0, v3 ; v3 = 0x8000_0000 +; v5 -> v4 +; return v4 +; } + function %icmp_slt_smax(i32) -> i8 { block0(v0: i32): v1 = iconst.i32 0x7FFF_FFFF @@ -562,6 +926,20 @@ block0(v0: i32): ; return v3 ; } +function %icmp_slt_smax_minus_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 0x7FFF_FFFE + v2 = icmp slt v0, v1 + return v2 +} + +; function %icmp_slt_smax_minus_1(i32) -> i8 fast { +; block0(v0: i32): +; v1 = iconst.i32 0x7fff_fffe +; v2 = icmp slt v0, v1 ; v1 = 0x7fff_fffe +; return v2 +; } + function %icmp_sle_umin(i32) -> i8 { block0(v0: i32): v1 = iconst.i32 0 @@ -571,9 +949,25 @@ block0(v0: i32): ; function %icmp_sle_umin(i32) -> i8 fast { ; block0(v0: i32): -; v1 = iconst.i32 0 -; v2 = icmp sle v0, v1 ; v1 = 0 -; return v2 +; v3 = iconst.i32 1 +; v4 = icmp slt v0, v3 ; v3 = 1 +; v5 -> v4 +; return v4 +; } + +function %icmp_sle_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 1 + v2 = icmp sle v0, v1 + return v2 +} + +; function %icmp_sle_1(i32) -> i8 fast { +; block0(v0: i32): +; v3 = iconst.i32 2 +; v4 = icmp slt v0, v3 ; v3 = 2 +; v5 -> v4 +; return v4 ; } function %icmp_sle_umax(i32) -> i8 { @@ -585,9 +979,25 @@ block0(v0: i32): ; function %icmp_sle_umax(i32) -> i8 fast { ; block0(v0: i32): -; v1 = iconst.i32 0xffff_ffff -; v2 = icmp sle v0, v1 ; v1 = 0xffff_ffff -; return v2 +; v3 = iconst.i32 0x0001_0000_0000 +; v4 = icmp slt v0, v3 ; v3 = 0x0001_0000_0000 +; v5 -> v4 +; return v4 +; } + +function %icmp_sle_umax_minus_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 0xFFFF_FFFE + v2 = icmp sle v0, v1 + return v2 +} + +; function %icmp_sle_umax_minus_1(i32) -> i8 fast { +; block0(v0: i32): +; v3 = iconst.i32 0xffff_ffff +; v4 = icmp slt v0, v3 ; v3 = 0xffff_ffff +; v5 -> v4 +; return v4 ; } function %icmp_sle_smin(i32) -> i8 { @@ -600,9 +1010,26 @@ block0(v0: i32): ; function %icmp_sle_smin(i32) -> i8 fast { ; block0(v0: i32): ; v1 = iconst.i32 0x8000_0000 -; v3 = icmp eq v0, v1 ; v1 = 0x8000_0000 -; v4 -> v3 -; return v3 +; v5 = icmp eq v0, v1 ; v1 = 0x8000_0000 +; v6 -> v5 +; v8 -> v5 +; v7 -> v6 +; return v5 +; } + +function %icmp_sle_smin_plus_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 0x8000_0001 + v2 = icmp sle v0, v1 + return v2 +} + +; function %icmp_sle_smin_plus_1(i32) -> i8 fast { +; block0(v0: i32): +; v3 = iconst.i32 0x8000_0002 +; v4 = icmp slt v0, v3 ; v3 = 0x8000_0002 +; v5 -> v4 +; return v4 ; } function %icmp_sle_smax(i32) -> i8 { @@ -618,6 +1045,22 @@ block0(v0: i32): ; return v3 ; v3 = 1 ; } +function %icmp_sle_smax_minus_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 0x7FFF_FFFE + v2 = icmp sle v0, v1 + return v2 +} + +; function %icmp_sle_smax_minus_1(i32) -> i8 fast { +; block0(v0: i32): +; v3 = iconst.i32 0x7fff_ffff +; v5 = icmp ne v0, v3 ; v3 = 0x7fff_ffff +; v6 -> v5 +; v7 -> v6 +; return v5 +; } + function %icmp_sgt_umin(i32) -> i8 { block0(v0: i32): v1 = iconst.i32 0 @@ -632,6 +1075,20 @@ block0(v0: i32): ; return v2 ; } +function %icmp_sgt_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 1 + v2 = icmp sgt v0, v1 + return v2 +} + +; function %icmp_sgt_1(i32) -> i8 fast { +; block0(v0: i32): +; v1 = iconst.i32 1 +; v2 = icmp sgt v0, v1 ; v1 = 1 +; return v2 +; } + function %icmp_sgt_umax(i32) -> i8 { block0(v0: i32): v1 = iconst.i32 0xFFFF_FFFF @@ -646,6 +1103,20 @@ block0(v0: i32): ; return v2 ; } +function %icmp_sgt_umax_minus_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 0xFFFF_FFFE + v2 = icmp sgt v0, v1 + return v2 +} + +; function %icmp_sgt_umax_minus_1(i32) -> i8 fast { +; block0(v0: i32): +; v1 = iconst.i32 0xffff_fffe +; v2 = icmp sgt v0, v1 ; v1 = 0xffff_fffe +; return v2 +; } + function %icmp_sgt_smin(i32) -> i8 { block0(v0: i32): v1 = iconst.i32 0x8000_0000 @@ -661,6 +1132,20 @@ block0(v0: i32): ; return v3 ; } +function %icmp_sgt_smin_plus_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 0x8000_0001 + v2 = icmp sgt v0, v1 + return v2 +} + +; function %icmp_sgt_smin_plus_1(i32) -> i8 fast { +; block0(v0: i32): +; v1 = iconst.i32 0x8000_0001 +; v2 = icmp sgt v0, v1 ; v1 = 0x8000_0001 +; return v2 +; } + function %icmp_sgt_smax(i32) -> i8 { block0(v0: i32): v1 = iconst.i32 0x7FFF_FFFF @@ -674,6 +1159,21 @@ block0(v0: i32): ; return v3 ; v3 = 0 ; } +function %icmp_sgt_smax_minus_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 0x7FFF_FFFE + v2 = icmp sgt v0, v1 + return v2 +} + +; function %icmp_sgt_smax_minus_1(i32) -> i8 fast { +; block0(v0: i32): +; v3 = iconst.i32 0x7fff_ffff +; v4 = icmp eq v0, v3 ; v3 = 0x7fff_ffff +; v5 -> v4 +; return v4 +; } + function %icmp_sge_umin(i32) -> i8 { block0(v0: i32): v1 = iconst.i32 0 @@ -683,9 +1183,25 @@ block0(v0: i32): ; function %icmp_sge_umin(i32) -> i8 fast { ; block0(v0: i32): -; v1 = iconst.i32 0 -; v2 = icmp sge v0, v1 ; v1 = 0 -; return v2 +; v3 = iconst.i32 -1 +; v4 = icmp sgt v0, v3 ; v3 = -1 +; v5 -> v4 +; return v4 +; } + +function %icmp_sge_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 1 + v2 = icmp sge v0, v1 + return v2 +} + +; function %icmp_sge_1(i32) -> i8 fast { +; block0(v0: i32): +; v3 = iconst.i32 0 +; v4 = icmp sgt v0, v3 ; v3 = 0 +; v5 -> v4 +; return v4 ; } function %icmp_sge_umax(i32) -> i8 { @@ -697,9 +1213,25 @@ block0(v0: i32): ; function %icmp_sge_umax(i32) -> i8 fast { ; block0(v0: i32): -; v1 = iconst.i32 0xffff_ffff -; v2 = icmp sge v0, v1 ; v1 = 0xffff_ffff -; return v2 +; v3 = iconst.i32 0xffff_fffe +; v4 = icmp sgt v0, v3 ; v3 = 0xffff_fffe +; v5 -> v4 +; return v4 +; } + +function %icmp_sge_umax_minus_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 0xFFFF_FFFE + v2 = icmp sge v0, v1 + return v2 +} + +; function %icmp_sge_umax_minus_1(i32) -> i8 fast { +; block0(v0: i32): +; v3 = iconst.i32 0xffff_fffd +; v4 = icmp sgt v0, v3 ; v3 = 0xffff_fffd +; v5 -> v4 +; return v4 ; } function %icmp_sge_smin(i32) -> i8 { @@ -715,6 +1247,22 @@ block0(v0: i32): ; return v3 ; v3 = 1 ; } +function %icmp_sge_smin_plus_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 0x8000_0001 + v2 = icmp sge v0, v1 + return v2 +} + +; function %icmp_sge_smin_plus_1(i32) -> i8 fast { +; block0(v0: i32): +; v3 = iconst.i32 0x8000_0000 +; v5 = icmp ne v0, v3 ; v3 = 0x8000_0000 +; v6 -> v5 +; v7 -> v6 +; return v5 +; } + function %icmp_sge_smax(i32) -> i8 { block0(v0: i32): v1 = iconst.i32 0x7FFF_FFFF @@ -725,9 +1273,26 @@ block0(v0: i32): ; function %icmp_sge_smax(i32) -> i8 fast { ; block0(v0: i32): ; v1 = iconst.i32 0x7fff_ffff -; v3 = icmp eq v0, v1 ; v1 = 0x7fff_ffff -; v4 -> v3 -; return v3 +; v5 = icmp eq v0, v1 ; v1 = 0x7fff_ffff +; v6 -> v5 +; v8 -> v5 +; v7 -> v6 +; return v5 +; } + +function %icmp_sge_smax_minus_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 0x7FFF_FFFE + v2 = icmp sge v0, v1 + return v2 +} + +; function %icmp_sge_smax_minus_1(i32) -> i8 fast { +; block0(v0: i32): +; v3 = iconst.i32 0x7fff_fffd +; v4 = icmp sgt v0, v3 ; v3 = 0x7fff_fffd +; v5 -> v4 +; return v4 ; } function %icmp_and_eq_eq(i32, i32) -> i8 { diff --git a/cranelift/filetests/filetests/egraph/make-icmp-parameterized-tests.sh b/cranelift/filetests/filetests/egraph/make-icmp-parameterized-tests.sh index f1f061c522..9913c528e2 100755 --- a/cranelift/filetests/filetests/egraph/make-icmp-parameterized-tests.sh +++ b/cranelift/filetests/filetests/egraph/make-icmp-parameterized-tests.sh @@ -2,7 +2,7 @@ set -e cd $(dirname "$0") -out=parameterized-icmp.clif +out=icmp-parameterized.clif CCS="eq ne ult ule ugt uge slt sle sgt sge" function main { @@ -43,6 +43,13 @@ block0(v0: i32): return v2 } +function %icmp_${cc}_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 1 + v2 = icmp ${cc} v0, v1 + return v2 +} + function %icmp_${cc}_umax(i32) -> i8 { block0(v0: i32): v1 = iconst.i32 0xFFFF_FFFF @@ -50,6 +57,13 @@ block0(v0: i32): return v2 } +function %icmp_${cc}_umax_minus_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 0xFFFF_FFFE + v2 = icmp ${cc} v0, v1 + return v2 +} + function %icmp_${cc}_smin(i32) -> i8 { block0(v0: i32): v1 = iconst.i32 0x8000_0000 @@ -57,6 +71,13 @@ block0(v0: i32): return v2 } +function %icmp_${cc}_smin_plus_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 0x8000_0001 + v2 = icmp ${cc} v0, v1 + return v2 +} + function %icmp_${cc}_smax(i32) -> i8 { block0(v0: i32): v1 = iconst.i32 0x7FFF_FFFF @@ -64,6 +85,13 @@ block0(v0: i32): return v2 } +function %icmp_${cc}_smax_minus_1(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 0x7FFF_FFFE + v2 = icmp ${cc} v0, v1 + return v2 +} + EOF done