mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-06 06:33:24 +00:00
[SeparateConstOffsetFromGEP] Fix an illegitimate optimization on zext
zext(a + b) != zext(a) + zext(b) even if a + b >= 0 && b >= 0. e.g., a = i4 0b1111, b = i4 0b0001 zext a + b to i8 = zext 0b0000 to i8 = 0b00000000 (zext a to i8) + (zext b to i8) = 0b00001111 + 0b00000001 = 0b00010000 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@210439 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b9422f1d77
commit
d8fdbb2ea8
@ -321,9 +321,9 @@ bool ConstantOffsetExtractor::CanTraceInto(bool SignExtended,
|
||||
// 1 | 0 | sext(BO) == sext(A) op sext(B)
|
||||
// 1 | 1 | zext(sext(BO)) ==
|
||||
// | | zext(sext(A)) op zext(sext(B))
|
||||
if (BO->getOpcode() == Instruction::Add && NonNegative) {
|
||||
if (BO->getOpcode() == Instruction::Add && !ZeroExtended && NonNegative) {
|
||||
// If a + b >= 0 and (a >= 0 or b >= 0), then
|
||||
// s/zext(a + b) = s/zext(a) + s/zext(b)
|
||||
// sext(a + b) = sext(a) + sext(b)
|
||||
// even if the addition is not marked nsw.
|
||||
//
|
||||
// Leveraging this invarient, we can trace into an sext'ed inbound GEP
|
||||
|
Loading…
x
Reference in New Issue
Block a user