Unsigned compares with UMAX (or UMAX-1) are equivalent to equality tests. These are preferable since it's easier to reason about them in other simplifications. So canonicalize these compares to equality tests. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@xxxxxxxxx> --- simplify.c | 8 ++++++++ validation/optim/set-uimm2.c | 1 - 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/simplify.c b/simplify.c index 160a6ab15e7f..7921300f7280 100644 --- a/simplify.c +++ b/simplify.c @@ -1090,6 +1090,8 @@ static int simplify_compare_constant(struct instruction *insn, long long value) return replace_with_pseudo(insn, value_pseudo(0)); if (value == 1) // (x < 1) --> (x == 0) return replace_binop_value(insn, OP_SET_EQ, 0); + else if (value == bits) // (x < ~0) --> (x != ~0) + return replace_binop_value(insn, OP_SET_NE, value); else // (x < y) --> (x <= (y-1)) changed |= replace_binop_value(insn, OP_SET_BE, value - 1); break; @@ -1098,6 +1100,8 @@ static int simplify_compare_constant(struct instruction *insn, long long value) return replace_with_pseudo(insn, value_pseudo(1)); if (value == 1) // (x >= 1) --> (x != 0) return replace_binop_value(insn, OP_SET_NE, 0); + else if (value == bits) // (x >= ~0) --> (x == ~0) + return replace_binop_value(insn, OP_SET_EQ, value); else // (x >= y) --> (x > (y-1) changed |= replace_binop_value(insn, OP_SET_A, value - 1); break; @@ -1106,12 +1110,16 @@ static int simplify_compare_constant(struct instruction *insn, long long value) return replace_opcode(insn, OP_SET_EQ); if (value == bits) // (x <= ~0) --> 1 return replace_with_pseudo(insn, value_pseudo(1)); + if (value == (bits - 1)) // (x <= ~1) --> (x != ~0) + return replace_binop_value(insn, OP_SET_NE, bits); break; case OP_SET_A: if (!value) // (x > 0) --> (x != 0) return replace_opcode(insn, OP_SET_NE); if (value == bits) // (x > ~0) --> 0 return replace_with_pseudo(insn, value_pseudo(0)); + if (value == (bits - 1)) // (x > ~1) --> (x == ~0) + return replace_binop_value(insn, OP_SET_EQ, bits); break; } return changed; diff --git a/validation/optim/set-uimm2.c b/validation/optim/set-uimm2.c index efa326f532ce..9138ae7276e7 100644 --- a/validation/optim/set-uimm2.c +++ b/validation/optim/set-uimm2.c @@ -6,7 +6,6 @@ static _Bool setgt_umax(unsigned int a) { return (a > ~1) == (a == ~0); } /* * check-name: set-uimm2 * check-command: test-linearize $file - * check-known-to-fail * * check-output-ignore * check-output-returns: 1 -- 2.29.2