@@ -634,6 +634,13 @@ static int simplify_constant_rightside(struct instruction *insn)
return replace_with_pseudo(insn, insn->src2);
goto case_neutral_zero;
+ case OP_XOR:
+ if ((value & bits) == bits) {
+ insn->opcode = OP_NOT;
+ return REPEAT_CSE;
+ }
+ goto case_neutral_zero;
+
case OP_SUB:
if (value) {
insn->opcode = OP_ADD;
@@ -642,7 +649,6 @@ static int simplify_constant_rightside(struct instruction *insn)
}
/* Fall through */
case OP_ADD:
- case OP_XOR:
case OP_SHL:
case OP_LSR:
case_neutral_zero:
@@ -1,5 +1,6 @@
int or_not0(int a) { return a | ~0; }
int and_not0(int a) { return a & ~0; }
+int xor_not0(int a) { return a ^ ~0; }
/*
* check-name: bool-not-zero
@@ -18,5 +19,12 @@ and_not0:
ret.32 %arg1
+xor_not0:
+.L4:
+ <entry-point>
+ not.32 %r8 <- %arg1
+ ret.32 %r8
+
+
* check-output-end
*/
This is yet anohter simple identity with the potential to trigger more simplifications. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com> --- simplify.c | 8 +++++++- validation/optim/bits-not-zero.c | 8 ++++++++ 2 files changed, 15 insertions(+), 1 deletion(-)