From ced44f4fd543b50980d4bf674fa6a30f9c31790f Mon Sep 17 00:00:00 2001 From: "Alon Zakai (kripken)" Date: Mon, 13 Feb 2017 17:35:39 -0800 Subject: take into account loads into local info in OptimizeInstructions --- src/passes/OptimizeInstructions.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) (limited to 'src') 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> { // 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(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 } } -- cgit v1.2.3