aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
-rw-r--r--simplify.c11
-rw-r--r--validation/optim/shift-zext.c1
-rw-r--r--validation/optim/shl-lsr.c1
-rw-r--r--validation/optim/store-load-bitfield.c12
4 files changed, 14 insertions, 11 deletions
diff --git a/simplify.c b/simplify.c
index e0434425..ab715aad 100644
--- a/simplify.c
+++ b/simplify.c
@@ -656,6 +656,17 @@ static int simplify_shift(struct instruction *insn, pseudo_t pseudo, long long v
if (def_opcode(src) == OP_AND)
return simplify_or_lsr(insn, src, def->src1, value);
break;
+ case OP_SHL:
+ // replace (A << S) >> S
+ // by A & (Mask(size) >> S)
+ if (!constant(def->src2))
+ break;
+ if (def->src2->value != value)
+ break;
+ size = insn->size - value;
+ insn->opcode = OP_AND;
+ insn->src2 = value_pseudo((1ULL << size) - 1);
+ return replace_pseudo(insn, &insn->src1, def->src1);
}
break;
case OP_SHL:
diff --git a/validation/optim/shift-zext.c b/validation/optim/shift-zext.c
index 070416f3..30409bec 100644
--- a/validation/optim/shift-zext.c
+++ b/validation/optim/shift-zext.c
@@ -6,7 +6,6 @@ unsigned int foo(unsigned int x)
/*
* check-name: shift-zext
* check-command: test-linearize -Wno-decl $file
- * check-known-to-fail
*
* check-output-ignore
* check-output-contains: and\\..*%arg1, \\$0xfff
diff --git a/validation/optim/shl-lsr.c b/validation/optim/shl-lsr.c
index 1ab2c48f..4f4b7e66 100644
--- a/validation/optim/shl-lsr.c
+++ b/validation/optim/shl-lsr.c
@@ -6,7 +6,6 @@ unsigned mask(unsigned x)
/*
* check-name: shl-lsr
* check-command: test-linearize -Wno-decl $file
- * check-known-to-fail
*
* check-output-ignore
* check-output-contains: and\\..*0x1ffff
diff --git a/validation/optim/store-load-bitfield.c b/validation/optim/store-load-bitfield.c
index 1d8ff240..f68cb600 100644
--- a/validation/optim/store-load-bitfield.c
+++ b/validation/optim/store-load-bitfield.c
@@ -28,21 +28,15 @@ int sfoo(int a)
ufoo:
.L0:
<entry-point>
- and.32 %r4 <- %arg1, $7
- shl.32 %r5 <- %r4, $2
- lsr.32 %r9 <- %r5, $2
- and.32 %r11 <- %r9, $7
+ and.32 %r11 <- %arg1, $7
ret.32 %r11
sfoo:
.L2:
<entry-point>
- and.32 %r16 <- %arg1, $7
- shl.32 %r17 <- %r16, $2
- lsr.32 %r21 <- %r17, $2
- trunc.3 %r22 <- (32) %r21
- sext.32 %r23 <- (3) %r22
+ trunc.3 %r16 <- (32) %arg1
+ sext.32 %r23 <- (3) %r16
ret.32 %r23