diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-10-14 18:18:10 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2016-10-15 10:28:15 -0700 |
commit | 6deb76d51d58ec910855c38eaf4f2cdd5619076d (patch) | |
tree | 3684184200f5f596c0b9b1592fa8a44320f2a15a /src | |
parent | f38142569b0fc29f3831ada7b23ac928b58c5b42 (diff) | |
download | binaryen-6deb76d51d58ec910855c38eaf4f2cdd5619076d.tar.gz binaryen-6deb76d51d58ec910855c38eaf4f2cdd5619076d.tar.bz2 binaryen-6deb76d51d58ec910855c38eaf4f2cdd5619076d.zip |
optimize out i32.and of -1
Diffstat (limited to 'src')
-rw-r--r-- | src/passes/OptimizeInstructions.cpp | 13 |
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; |