aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
-rw-r--r--simplify.c8
-rw-r--r--validation/optim/bits-not-zero.c8
2 files changed, 15 insertions, 1 deletions
diff --git a/simplify.c b/simplify.c
index 09cbe16d..c88ea5c3 100644
--- a/simplify.c
+++ b/simplify.c
@@ -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:
diff --git a/validation/optim/bits-not-zero.c b/validation/optim/bits-not-zero.c
index ce74705e..189fe331 100644
--- a/validation/optim/bits-not-zero.c
+++ b/validation/optim/bits-not-zero.c
@@ -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
*/