mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-14 16:33:28 +00:00
fix PR7589: In brief:
gep P, (zext x) != gep P, (sext x) DecomposeGEPExpression was getting this wrong, confusing basicaa. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@111352 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
903175096e
commit
91b2307a89
@ -1018,9 +1018,9 @@ static Value *GetLinearExpression(Value *V, APInt &Scale, APInt &Offset,
|
||||
}
|
||||
}
|
||||
|
||||
// Since clients don't care about the high bits of the value, just scales and
|
||||
// offsets, we can look through extensions.
|
||||
if (isa<SExtInst>(V) || isa<ZExtInst>(V)) {
|
||||
// Since GEP indices are sign extended anyway, we don't care about the high
|
||||
// bits of a sign extended value - just scales and offsets.
|
||||
if (isa<SExtInst>(V)) {
|
||||
Value *CastOp = cast<CastInst>(V)->getOperand(0);
|
||||
unsigned OldWidth = Scale.getBitWidth();
|
||||
unsigned SmallWidth = CastOp->getType()->getPrimitiveSizeInBits();
|
||||
|
@ -104,3 +104,24 @@ define i32 @constexpr_test() {
|
||||
; CHECK: @constexpr_test
|
||||
; CHECK: ret i32 0
|
||||
}
|
||||
|
||||
|
||||
|
||||
; PR7589
|
||||
; These two index expressions are different, this cannot be CSE'd.
|
||||
define i16 @zext_sext_confusion(i16* %row2col, i5 %j) nounwind{
|
||||
entry:
|
||||
%sum5.cast = zext i5 %j to i64 ; <i64> [#uses=1]
|
||||
%P1 = getelementptr i16* %row2col, i64 %sum5.cast
|
||||
%row2col.load.1.2 = load i16* %P1, align 1 ; <i16> [#uses=1]
|
||||
|
||||
%sum13.cast31 = sext i5 %j to i6 ; <i6> [#uses=1]
|
||||
%sum13.cast = zext i6 %sum13.cast31 to i64 ; <i64> [#uses=1]
|
||||
%P2 = getelementptr i16* %row2col, i64 %sum13.cast
|
||||
%row2col.load.1.6 = load i16* %P2, align 1 ; <i16> [#uses=1]
|
||||
|
||||
%.ret = sub i16 %row2col.load.1.6, %row2col.load.1.2 ; <i16> [#uses=1]
|
||||
ret i16 %.ret
|
||||
; CHECK: @zext_sext_confusion
|
||||
; CHECK: ret i16 %.ret
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user