diff options
| author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2018-08-16 21:13:06 +0200 |
|---|---|---|
| committer | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2018-08-17 08:51:05 +0200 |
| commit | 1d5acb58b0a45183b80fc45423a93bd38d448d0d (patch) | |
| tree | 959af4259513b4935dbe1d4e7c2599169209743a | |
| parent | 0a24265da5e74cfc8c5d2177edadaaa98a0c2c87 (diff) | |
| download | sparse-dev-1d5acb58b0a45183b80fc45423a93bd38d448d0d.tar.gz | |
reorganize shift-shift simplification
In preparation of the missing simplification of ((x >> S) << S),
reorganize the existing simplification of ((x << S) >> S).
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
| -rw-r--r-- | simplify.c | 14 |
1 files changed, 8 insertions, 6 deletions
@@ -671,14 +671,12 @@ static int simplify_shift(struct instruction *insn, pseudo_t pseudo, long long v return simplify_or_lsr(insn, src, def->src1, value); break; case OP_SHL: - // replace (A << S) >> S - // by A & (Mask(size) >> S) + // replace ((x << S) >> S) + // by (x & (-1 >> S)) if (def->src2 != insn->src2) break; - size = insn->size - value; - insn->opcode = OP_AND; - insn->src2 = value_pseudo((1ULL << size) - 1); - return replace_pseudo(insn, &insn->src1, def->src1); + mask = bits_mask(insn->size - value); + goto replace_mask; } break; case OP_SHL: @@ -709,6 +707,10 @@ new_value: } zero: return replace_with_pseudo(insn, value_pseudo(0)); +replace_mask: + insn->opcode = OP_AND; + insn->src2 = value_pseudo(mask); + return replace_pseudo(insn, &insn->src1, def->src1); } static int simplify_mul_div(struct instruction *insn, long long value) |
