diff options
| author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2016-12-15 12:00:20 +0100 |
|---|---|---|
| committer | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2018-06-28 18:54:44 +0200 |
| commit | 395b4de3d5084493d4dea2da74b735cc3bb8e886 (patch) | |
| tree | 6db49fa4af6d025b9ad347267e5982caf8025bdd | |
| parent | cd1366255259df08c3e1508976130d978e22da48 (diff) | |
| download | sparse-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.c | 8 | ||||
| -rw-r--r-- | validation/optim/bits-not-zero.c | 8 |
2 files changed, 15 insertions, 1 deletions
@@ -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 */ |
