diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-10-14 17:01:06 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2016-10-15 10:18:13 -0700 |
commit | f38142569b0fc29f3831ada7b23ac928b58c5b42 (patch) | |
tree | 189754631dd3c8f028a7dc720e138b853afae76e /src/passes/OptimizeInstructions.cpp | |
parent | 16b9087e17effc544d82a69b93de17d8f8c979e2 (diff) | |
download | binaryen-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.cpp | 28 |
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; } |