diff options
author | Alon Zakai (kripken) <alonzakai@gmail.com> | 2017-02-13 17:47:48 -0800 |
---|---|---|
committer | Alon Zakai (kripken) <alonzakai@gmail.com> | 2017-02-16 22:45:40 -0800 |
commit | ff8705ef08502411093cef7a90c7f30833147af1 (patch) | |
tree | a87e230a8bcab95a9ff8d25b60657dc9ba8d5508 /src | |
parent | ced44f4fd543b50980d4bf674fa6a30f9c31790f (diff) | |
download | binaryen-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.cpp | 18 |
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 |