aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2016-12-14 22:41:47 +0100
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2018-06-28 18:54:37 +0200
commit0b99639411481e56cb0e6bfca01c7944c607f707 (patch)
treeef11b69246c6b007f658929dc7573911796db454
parent9f5e91bd0cb00ab4657c4f975fa5717d478ed4b0 (diff)
downloadsparse-dev-0b99639411481e56cb0e6bfca01c7944c607f707.tar.gz
simplify 'x | ~0' to '~0'
This is a simple identity with the potential to trigger more simplifications. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r--simplify.c9
-rw-r--r--validation/optim/bits-not-zero.c15
2 files changed, 23 insertions, 1 deletions
diff --git a/simplify.c b/simplify.c
index ad32fe08..25e2a41c 100644
--- a/simplify.c
+++ b/simplify.c
@@ -620,6 +620,8 @@ static int simplify_seteq_setne(struct instruction *insn, long long value)
static int simplify_constant_rightside(struct instruction *insn)
{
long long value = insn->src2->value;
+ long long sbit = 1ULL << (insn->size - 1);
+ long long bits = sbit | (sbit - 1);
switch (insn->opcode) {
case OP_OR_BOOL:
@@ -627,6 +629,11 @@ static int simplify_constant_rightside(struct instruction *insn)
return replace_with_pseudo(insn, insn->src2);
goto case_neutral_zero;
+ case OP_OR:
+ if ((value & bits) == bits)
+ return replace_with_pseudo(insn, insn->src2);
+ goto case_neutral_zero;
+
case OP_SUB:
if (value) {
insn->opcode = OP_ADD;
@@ -635,7 +642,7 @@ static int simplify_constant_rightside(struct instruction *insn)
}
/* Fall through */
case OP_ADD:
- case OP_OR: case OP_XOR:
+ 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
new file mode 100644
index 00000000..9872794b
--- /dev/null
+++ b/validation/optim/bits-not-zero.c
@@ -0,0 +1,15 @@
+int or_not0(int a) { return a | ~0; }
+
+/*
+ * check-name: bool-not-zero
+ * check-command: test-linearize -Wno-decl $file
+ *
+ * check-output-start
+or_not0:
+.L0:
+ <entry-point>
+ ret.32 $0xffffffff
+
+
+ * check-output-end
+ */