diff options
| author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2016-12-14 22:41:47 +0100 |
|---|---|---|
| committer | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2018-06-28 18:54:37 +0200 |
| commit | 0b99639411481e56cb0e6bfca01c7944c607f707 (patch) | |
| tree | ef11b69246c6b007f658929dc7573911796db454 | |
| parent | 9f5e91bd0cb00ab4657c4f975fa5717d478ed4b0 (diff) | |
| download | sparse-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.c | 9 | ||||
| -rw-r--r-- | validation/optim/bits-not-zero.c | 15 |
2 files changed, 23 insertions, 1 deletions
@@ -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 + */ |
