diff options
author | Alon Zakai (kripken) <alonzakai@gmail.com> | 2017-02-13 17:35:39 -0800 |
---|---|---|
committer | Alon Zakai (kripken) <alonzakai@gmail.com> | 2017-02-16 22:45:40 -0800 |
commit | ced44f4fd543b50980d4bf674fa6a30f9c31790f (patch) | |
tree | 21dbebbdce5a0e38db3c6438384f5914de93c517 /src | |
parent | eec567640d154147fb88754fd13aada738a63eef (diff) | |
download | binaryen-ced44f4fd543b50980d4bf674fa6a30f9c31790f.tar.gz binaryen-ced44f4fd543b50980d4bf674fa6a30f9c31790f.tar.bz2 binaryen-ced44f4fd543b50980d4bf674fa6a30f9c31790f.zip |
take into account loads into local info in OptimizeInstructions
Diffstat (limited to 'src')
-rw-r--r-- | src/passes/OptimizeInstructions.cpp | 17 |
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 } } |