summaryrefslogtreecommitdiff
path: root/src/passes/OptimizeInstructions.cpp
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-10-14 18:18:10 -0700
committerAlon Zakai <alonzakai@gmail.com>2016-10-15 10:28:15 -0700
commit6deb76d51d58ec910855c38eaf4f2cdd5619076d (patch)
tree3684184200f5f596c0b9b1592fa8a44320f2a15a /src/passes/OptimizeInstructions.cpp
parentf38142569b0fc29f3831ada7b23ac928b58c5b42 (diff)
downloadbinaryen-6deb76d51d58ec910855c38eaf4f2cdd5619076d.tar.gz
binaryen-6deb76d51d58ec910855c38eaf4f2cdd5619076d.tar.bz2
binaryen-6deb76d51d58ec910855c38eaf4f2cdd5619076d.zip
optimize out i32.and of -1
Diffstat (limited to 'src/passes/OptimizeInstructions.cpp')
-rw-r--r--src/passes/OptimizeInstructions.cpp13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/passes/OptimizeInstructions.cpp b/src/passes/OptimizeInstructions.cpp
index 7547f332a..0b54f9756 100644
--- a/src/passes/OptimizeInstructions.cpp
+++ b/src/passes/OptimizeInstructions.cpp
@@ -224,10 +224,15 @@ struct OptimizeInstructions : public WalkerPass<PostWalker<OptimizeInstructions,
}
}
} else if (binary->op == AndInt32) {
- if (auto* load = binary->left->dynCast<Load>()) {
- if (auto* right = binary->right->dynCast<Const>()) {
- if (right->type == i32) {
- auto mask = right->value.geti32();
+ if (auto* right = binary->right->dynCast<Const>()) {
+ if (right->type == i32) {
+ auto mask = right->value.geti32();
+ // and with -1 does nothing (common in asm.js output)
+ if (mask == -1) {
+ return binary->left;
+ }
+ // small loads do not need to be masted, the load itself masks
+ if (auto* load = binary->left->dynCast<Load>()) {
if ((load->bytes == 1 && mask == 0xff) ||
(load->bytes == 2 && mask == 0xffff)) {
load->signed_ = false;