summaryrefslogtreecommitdiff
path: root/src/passes/OptimizeInstructions.cpp
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-10-14 17:01:06 -0700
committerAlon Zakai <alonzakai@gmail.com>2016-10-15 10:18:13 -0700
commitf38142569b0fc29f3831ada7b23ac928b58c5b42 (patch)
tree189754631dd3c8f028a7dc720e138b853afae76e /src/passes/OptimizeInstructions.cpp
parent16b9087e17effc544d82a69b93de17d8f8c979e2 (diff)
downloadbinaryen-f38142569b0fc29f3831ada7b23ac928b58c5b42.tar.gz
binaryen-f38142569b0fc29f3831ada7b23ac928b58c5b42.tar.bz2
binaryen-f38142569b0fc29f3831ada7b23ac928b58c5b42.zip
optimize loads and stores that mask their values, as the load/store operation masks itself
Diffstat (limited to 'src/passes/OptimizeInstructions.cpp')
-rw-r--r--src/passes/OptimizeInstructions.cpp28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/passes/OptimizeInstructions.cpp b/src/passes/OptimizeInstructions.cpp
index f467b395e..7547f332a 100644
--- a/src/passes/OptimizeInstructions.cpp
+++ b/src/passes/OptimizeInstructions.cpp
@@ -223,6 +223,19 @@ struct OptimizeInstructions : public WalkerPass<PostWalker<OptimizeInstructions,
return Builder(*getModule()).makeUnary(EqZInt32, binary->right);
}
}
+ } 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 ((load->bytes == 1 && mask == 0xff) ||
+ (load->bytes == 2 && mask == 0xffff)) {
+ load->signed_ = false;
+ return load;
+ }
+ }
+ }
+ }
}
} else if (auto* unary = curr->dynCast<Unary>()) {
// de-morgan's laws
@@ -294,6 +307,21 @@ struct OptimizeInstructions : public WalkerPass<PostWalker<OptimizeInstructions,
if (br->condition) {
br->condition = optimizeBoolean(br->condition);
}
+ } else if (auto* store = curr->dynCast<Store>()) {
+ // stores of fewer bits truncates anyhow
+ if (auto* value = store->value->dynCast<Binary>()) {
+ if (value->op == AndInt32) {
+ if (auto* right = value->right->dynCast<Const>()) {
+ if (right->type == i32) {
+ auto mask = right->value.geti32();
+ if ((store->bytes == 1 && mask == 0xff) ||
+ (store->bytes == 2 && mask == 0xffff)) {
+ store->value = value->left;
+ }
+ }
+ }
+ }
+ }
}
return nullptr;
}