diff --git a/cranelift/codegen/src/opts/selects.isle b/cranelift/codegen/src/opts/selects.isle index 4ec353c3fb7b..7bf08d051384 100644 --- a/cranelift/codegen/src/opts/selects.isle +++ b/cranelift/codegen/src/opts/selects.isle @@ -102,3 +102,11 @@ (rule (simplify (select ty d a (select ty d _ y))) (select ty d a y)) (rule (simplify (select ty d (select ty d x _) a)) (select ty d x a)) +;; (n < m) → ((if c then m else x) < (if c then n else x)) = false +(rule + (simplify (slt cty + (select ty c (iconst_s ty z) x) + (select ty c (iconst_s ty y) x))) + (if-let true (i64_lt y z)) + (iconst_u cty 0)) + diff --git a/cranelift/filetests/filetests/egraph/selects.clif b/cranelift/filetests/filetests/egraph/selects.clif index 08b3ab2ed2ff..a63bed895051 100644 --- a/cranelift/filetests/filetests/egraph/selects.clif +++ b/cranelift/filetests/filetests/egraph/selects.clif @@ -61,3 +61,18 @@ block0(v0: i8): ; return v8 ; } +function %test_slt_select_consts(i8, i32) -> i8 fast { +block0(v0: i8, v1: i32): + v2 = iconst.i32 20 + v3 = iconst.i32 10 + v4 = select v0, v2, v1 + v5 = select v0, v3, v1 + v6 = icmp slt v4, v5 + return v6 +} + +; function %test_slt_select_consts(i8, i32) -> i8 fast { +; block0(v0: i8, v1: i32): +; v7 = iconst.i8 0 +; return v7 ; v7 = 0 +; } diff --git a/cranelift/filetests/filetests/runtests/select.clif b/cranelift/filetests/filetests/runtests/select.clif index d05a21547970..63b821cbc80a 100644 --- a/cranelift/filetests/filetests/runtests/select.clif +++ b/cranelift/filetests/filetests/runtests/select.clif @@ -441,3 +441,15 @@ block0(v0: i64, v1: i64): ; run: %simplify_select_ult_ne_i64(7, 9) == 0 ; run: %simplify_select_ult_ne_i64(3, 1) == 1 ; run: %simplify_select_ult_ne_i64(-1, 42) == 1 + +function %test_slt_select_consts(i8, i32) -> i8 fast { +block0(v0: i8, v1: i32): + v2 = iconst.i32 20 + v3 = iconst.i32 10 + v4 = select v0, v2, v1 + v5 = select v0, v3, v1 + v6 = icmp slt v4, v5 + return v6 +} + +; run: %test_slt_select_consts(3, 42) == 0