summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlon Zakai (kripken) <alonzakai@gmail.com>2017-02-13 17:47:48 -0800
committerAlon Zakai (kripken) <alonzakai@gmail.com>2017-02-16 22:45:40 -0800
commitff8705ef08502411093cef7a90c7f30833147af1 (patch)
treea87e230a8bcab95a9ff8d25b60657dc9ba8d5508 /src
parentced44f4fd543b50980d4bf674fa6a30f9c31790f (diff)
downloadbinaryen-ff8705ef08502411093cef7a90c7f30833147af1.tar.gz
binaryen-ff8705ef08502411093cef7a90c7f30833147af1.tar.bz2
binaryen-ff8705ef08502411093cef7a90c7f30833147af1.zip
optimize a compare of a load_s and a sign-extend into a load_u and a cheaper zero-extend
Diffstat (limited to 'src')
-rw-r--r--src/passes/OptimizeInstructions.cpp18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/passes/OptimizeInstructions.cpp b/src/passes/OptimizeInstructions.cpp
index 026f3f7ec..49d025f82 100644
--- a/src/passes/OptimizeInstructions.cpp
+++ b/src/passes/OptimizeInstructions.cpp
@@ -515,6 +515,24 @@ struct OptimizeInstructions : public WalkerPass<PostWalker<OptimizeInstructions,
binary->left = makeZeroExt(left, bits);
binary->right = makeZeroExt(right, bits);
return binary;
+ } else if (auto* load = getFallthroughDynCast<Load>(binary->right)) {
+ // we are comparing a load to a sign-ext, we may be able to switch to zext
+ auto leftBits = getSignExtBits(binary->left);
+ if (load->signed_ && leftBits == load->bytes * 8) {
+ load->signed_ = false;
+ binary->left = makeZeroExt(left, leftBits);
+ return binary;
+ }
+ }
+ } else if (auto* load = getFallthroughDynCast<Load>(binary->left)) {
+ if (auto* right = getSignExt(binary->right)) {
+ // we are comparing a load to a sign-ext, we may be able to switch to zext
+ auto rightBits = getSignExtBits(binary->right);
+ if (load->signed_ && rightBits == load->bytes * 8) {
+ load->signed_ = false;
+ binary->right = makeZeroExt(right, rightBits);
+ return binary;
+ }
}
}
// note that both left and right may be consts, but then we let precompute compute the constant result