diff options
author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2020-11-01 16:18:03 +0100 |
---|---|---|
committer | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2020-11-08 02:13:52 +0100 |
commit | 983964c2ff72392fb7a373990f55cfcb2ba832a0 (patch) | |
tree | 11b532ffcfe5079d7cc298cb3867720ca879e74b | |
parent | 2680e82101a685cca986bf619bb1dd21e0573af8 (diff) | |
download | sparse-983964c2ff72392fb7a373990f55cfcb2ba832a0.tar.gz |
cmp: canonicalize unsigned (x {<=,>} SMAX)
Unsigned <= or > against SMAX are equivalent to testing if the
value is positive or not (when interpreted as a signed number).
Canonicalize to this positive/negative test since it only needs
the constant 0 which make it easier to handle at later steps.
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r-- | simplify.c | 4 | ||||
-rw-r--r-- | validation/optim/set-uimm3.c | 1 |
2 files changed, 4 insertions, 1 deletions
@@ -1112,6 +1112,8 @@ static int simplify_compare_constant(struct instruction *insn, long long value) 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); + if (value == (bits >> 1)) // (x u<= SMAX) --> (x s>= 0) + changed |= replace_binop_value(insn, OP_SET_GE, 0); break; case OP_SET_A: if (!value) // (x > 0) --> (x != 0) @@ -1120,6 +1122,8 @@ static int simplify_compare_constant(struct instruction *insn, long long value) 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); + if (value == (bits >> 1)) // (x u> SMAX) --> (x s< 0) + changed |= replace_binop_value(insn, OP_SET_LT, 0); break; } return changed; diff --git a/validation/optim/set-uimm3.c b/validation/optim/set-uimm3.c index b72ef8d6..5160f741 100644 --- a/validation/optim/set-uimm3.c +++ b/validation/optim/set-uimm3.c @@ -4,7 +4,6 @@ int gt(int x) { return (x > 0x7fffffffU) == (x < 0); } /* * check-name: set-uimm3 * check-command: test-linearize -Wno-decl $file - * check-known-to-fail * * check-output-ignore * check-output-returns: 1 |