summaryrefslogtreecommitdiff
path: root/src/passes/OptimizeInstructions.cpp
diff options
context:
space:
mode:
authorAlon Zakai (kripken) <alonzakai@gmail.com>2017-02-13 17:35:39 -0800
committerAlon Zakai (kripken) <alonzakai@gmail.com>2017-02-16 22:45:40 -0800
commitced44f4fd543b50980d4bf674fa6a30f9c31790f (patch)
tree21dbebbdce5a0e38db3c6438384f5914de93c517 /src/passes/OptimizeInstructions.cpp
parenteec567640d154147fb88754fd13aada738a63eef (diff)
downloadbinaryen-ced44f4fd543b50980d4bf674fa6a30f9c31790f.tar.gz
binaryen-ced44f4fd543b50980d4bf674fa6a30f9c31790f.tar.bz2
binaryen-ced44f4fd543b50980d4bf674fa6a30f9c31790f.zip
take into account loads into local info in OptimizeInstructions
Diffstat (limited to 'src/passes/OptimizeInstructions.cpp')
-rw-r--r--src/passes/OptimizeInstructions.cpp17
1 files changed, 10 insertions, 7 deletions
diff --git a/src/passes/OptimizeInstructions.cpp b/src/passes/OptimizeInstructions.cpp
index 8e5ff6c12..026f3f7ec 100644
--- a/src/passes/OptimizeInstructions.cpp
+++ b/src/passes/OptimizeInstructions.cpp
@@ -386,15 +386,18 @@ struct LocalScanner : PostWalker<LocalScanner, Visitor<LocalScanner>> {
// an integer var, worth processing
auto& info = localInfo[curr->index];
info.maxBits = std::max(info.maxBits, getMaxBits(curr->value, this));
+ auto signExtBits = LocalInfo::kUnknown;
if (getSignExt(curr->value)) {
- auto bits = getSignExtBits(curr->value);
- if (info.signExtedBits == 0) {
- info.signExtedBits = bits; // first info we see
- } else if (info.signExtedBits != bits) {
- info.signExtedBits = LocalInfo::kUnknown; // contradictory information, give up
+ signExtBits = getSignExtBits(curr->value);
+ } else if (auto* load = getFallthroughDynCast<Load>(curr->value)) {
+ if (load->signed_) {
+ signExtBits = load->bytes * 8;
}
- } else {
- info.signExtedBits = LocalInfo::kUnknown; // an input which isn't even a sign ext, give up
+ }
+ if (info.signExtedBits == 0) {
+ info.signExtedBits = signExtBits; // first info we see
+ } else if (info.signExtedBits != signExtBits) {
+ info.signExtedBits = LocalInfo::kUnknown; // contradictory information, give up
}
}