aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2016-12-15 12:00:20 +0100
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2018-06-28 18:54:44 +0200
commit395b4de3d5084493d4dea2da74b735cc3bb8e886 (patch)
tree6db49fa4af6d025b9ad347267e5982caf8025bdd
parentcd1366255259df08c3e1508976130d978e22da48 (diff)
downloadsparse-dev-395b4de3d5084493d4dea2da74b735cc3bb8e886.tar.gz
simplify 'x ^ ~0' to '~x'
This is yet another simple identity with the potential to trigger more simplifications. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-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
*/