aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
-rw-r--r--simplify.c11
-rw-r--r--validation/optim/shl-and0.c1
2 files changed, 11 insertions, 1 deletions
diff --git a/simplify.c b/simplify.c
index b9aa88b1..54ee9421 100644
--- a/simplify.c
+++ b/simplify.c
@@ -720,6 +720,17 @@ static int simplify_shift(struct instruction *insn, pseudo_t pseudo, long long v
if (value >= size)
goto zero;
switch(DEF_OPCODE(def, pseudo)) {
+ case OP_AND:
+ // simplify (A & M) << S
+ if (!constant(def->src2))
+ break;
+ mask = bits_mask(insn->size) >> value;
+ omask = def->src2->value;
+ nmask = omask & mask;
+ if (nmask == 0)
+ return replace_with_pseudo(insn, value_pseudo(0));
+ // do not simplify into ((A << S) & (M << S))
+ break;
case OP_LSR:
// replace ((x >> S) << S)
// by (x & (-1 << S))
diff --git a/validation/optim/shl-and0.c b/validation/optim/shl-and0.c
index 289859ae..894bd882 100644
--- a/validation/optim/shl-and0.c
+++ b/validation/optim/shl-and0.c
@@ -7,7 +7,6 @@ unsigned shl_and0(unsigned x)
/*
* check-name: shl-and0
* check-command: test-linearize -Wno-decl $file
- * check-known-to-fail
*
* check-output-ignore
* check-output-contains: ret\\..*\\$0$