summaryrefslogtreecommitdiff
path: root/src/passes/OptimizeInstructions.cpp
diff options
context:
space:
mode:
authorAlon Zakai (kripken) <alonzakai@gmail.com>2017-02-11 13:13:24 -0800
committerAlon Zakai (kripken) <alonzakai@gmail.com>2017-02-16 22:45:36 -0800
commit51d57932a34dd265a8c3c35a6773387e5dd7bc9e (patch)
tree0ddc232fa0e2211af0e177a508f76b86fbf0714b /src/passes/OptimizeInstructions.cpp
parent41eee37bc153a68b0f0c46162e21f825d1784499 (diff)
downloadbinaryen-51d57932a34dd265a8c3c35a6773387e5dd7bc9e.tar.gz
binaryen-51d57932a34dd265a8c3c35a6773387e5dd7bc9e.tar.bz2
binaryen-51d57932a34dd265a8c3c35a6773387e5dd7bc9e.zip
optimize sign-extends to eqz
Diffstat (limited to 'src/passes/OptimizeInstructions.cpp')
-rw-r--r--src/passes/OptimizeInstructions.cpp7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/passes/OptimizeInstructions.cpp b/src/passes/OptimizeInstructions.cpp
index ef18ea777..561e7882c 100644
--- a/src/passes/OptimizeInstructions.cpp
+++ b/src/passes/OptimizeInstructions.cpp
@@ -468,6 +468,13 @@ struct OptimizeInstructions : public WalkerPass<PostWalker<OptimizeInstructions,
default: {}
}
}
+ // eqz of a sign extension can be of zero-extension
+ if (auto* ext = getSignExt(unary->value)) {
+ // we are comparing a sign extend to a constant, which means we can use a cheaper zext
+ auto bits = getSignExtBits(unary->value);
+ unary->value = makeZeroExt(ext, bits);
+ return unary;
+ }
}
} else if (auto* set = curr->dynCast<SetGlobal>()) {
// optimize out a set of a get