summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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
}
}