Skip to content

Commit 3596b17

Browse files
committed
[DA] Add check for base pointer invariance
1 parent 0b6d75d commit 3596b17

File tree

2 files changed

+25
-9
lines changed

2 files changed

+25
-9
lines changed

llvm/lib/Analysis/DependenceAnalysis.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3383,6 +3383,10 @@ bool DependenceInfo::tryDelinearize(Instruction *Src, Instruction *Dst,
33833383
SrcSubscripts, DstSubscripts))
33843384
return false;
33853385

3386+
assert(isLoopInvariant(SrcBase, SrcLoop) &&
3387+
isLoopInvariant(DstBase, DstLoop) &&
3388+
"Expected SrcBase and DstBase to be loop invariant");
3389+
33863390
int Size = SrcSubscripts.size();
33873391
LLVM_DEBUG({
33883392
dbgs() << "\nSrcSubscripts: ";
@@ -3666,6 +3670,18 @@ DependenceInfo::depends(Instruction *Src, Instruction *Dst,
36663670
SCEVUnionPredicate(Assume, *SE));
36673671
}
36683672

3673+
// Even if the base pointers are the same, they may not be loop-invariant. It
3674+
// could lead to incorrect results, as we're analyzing loop-carried
3675+
// dependencies.
3676+
Loop *SrcLoop = LI->getLoopFor(Src->getParent());
3677+
Loop *DstLoop = LI->getLoopFor(Dst->getParent());
3678+
if (!isLoopInvariant(SrcBase, SrcLoop) ||
3679+
!isLoopInvariant(DstBase, DstLoop)) {
3680+
LLVM_DEBUG(dbgs() << "The base pointer is not loop invariant.\n");
3681+
return std::make_unique<Dependence>(Src, Dst,
3682+
SCEVUnionPredicate(Assume, *SE));
3683+
}
3684+
36693685
uint64_t EltSize = SrcLoc.Size.toRaw();
36703686
const SCEV *SrcEv = SE->getMinusSCEV(SrcSCEV, SrcBase);
36713687
const SCEV *DstEv = SE->getMinusSCEV(DstSCEV, DstBase);

llvm/test/Analysis/DependenceAnalysis/FlipFlopBaseAddress.ll

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@
88
define float @bug41488_test1(float %f) {
99
; CHECK-LABEL: 'bug41488_test1'
1010
; CHECK-NEXT: Src: %0 = load float, ptr %p, align 4 --> Dst: %0 = load float, ptr %p, align 4
11-
; CHECK-NEXT: da analyze - input [*]!
11+
; CHECK-NEXT: da analyze - confused!
1212
; CHECK-NEXT: Src: %0 = load float, ptr %p, align 4 --> Dst: store float %f, ptr %q, align 4
1313
; CHECK-NEXT: da analyze - confused!
1414
; CHECK-NEXT: Src: store float %f, ptr %q, align 4 --> Dst: store float %f, ptr %q, align 4
15-
; CHECK-NEXT: da analyze - output [*]!
15+
; CHECK-NEXT: da analyze - confused!
1616
;
1717
entry:
1818
%g = alloca float, align 4
@@ -34,11 +34,11 @@ for.cond.cleanup:
3434
define void @bug41488_test2(i32 %n) {
3535
; CHECK-LABEL: 'bug41488_test2'
3636
; CHECK-NEXT: Src: %0 = load float, ptr %p, align 4 --> Dst: %0 = load float, ptr %p, align 4
37-
; CHECK-NEXT: da analyze - input [*]!
37+
; CHECK-NEXT: da analyze - confused!
3838
; CHECK-NEXT: Src: %0 = load float, ptr %p, align 4 --> Dst: store float 0.000000e+00, ptr %q, align 4
3939
; CHECK-NEXT: da analyze - confused!
4040
; CHECK-NEXT: Src: store float 0.000000e+00, ptr %q, align 4 --> Dst: store float 0.000000e+00, ptr %q, align 4
41-
; CHECK-NEXT: da analyze - output [*]!
41+
; CHECK-NEXT: da analyze - confused!
4242
;
4343
entry:
4444
%g = alloca float, align 4
@@ -68,7 +68,7 @@ define void @bug53942_foo(i32 noundef %n, ptr noalias nocapture noundef writeonl
6868
; CHECK-NEXT: Src: %.pre = load double, ptr %B, align 8 --> Dst: store double %.pre, ptr %arrayidx2, align 8
6969
; CHECK-NEXT: da analyze - confused!
7070
; CHECK-NEXT: Src: store double %.pre, ptr %arrayidx2, align 8 --> Dst: store double %.pre, ptr %arrayidx2, align 8
71-
; CHECK-NEXT: da analyze - output [*]!
71+
; CHECK-NEXT: da analyze - confused!
7272
;
7373
entry:
7474
%cmp8 = icmp sgt i32 %n, 1
@@ -99,11 +99,11 @@ for.body: ; preds = %for.body.preheader,
9999
define void @bug53942_bar(i32 noundef %n, ptr noalias noundef %A, ptr noalias noundef %B) {
100100
; CHECK-LABEL: 'bug53942_bar'
101101
; CHECK-NEXT: Src: %0 = load double, ptr %arrayidx, align 8 --> Dst: %0 = load double, ptr %arrayidx, align 8
102-
; CHECK-NEXT: da analyze - input [*]!
102+
; CHECK-NEXT: da analyze - confused!
103103
; CHECK-NEXT: Src: %0 = load double, ptr %arrayidx, align 8 --> Dst: store double %0, ptr %arrayidx8, align 8
104104
; CHECK-NEXT: da analyze - confused!
105105
; CHECK-NEXT: Src: store double %0, ptr %arrayidx8, align 8 --> Dst: store double %0, ptr %arrayidx8, align 8
106-
; CHECK-NEXT: da analyze - output [*]!
106+
; CHECK-NEXT: da analyze - confused!
107107
;
108108
entry:
109109
br label %for.cond
@@ -173,7 +173,7 @@ for.end: ; preds = %for.cond.cleanup
173173
define void @non_invariant_baseptr_with_identical_obj(ptr %A) {
174174
; CHECK-LABEL: 'non_invariant_baseptr_with_identical_obj'
175175
; CHECK-NEXT: Src: store i32 1, ptr %idx, align 4 --> Dst: store i32 1, ptr %idx, align 4
176-
; CHECK-NEXT: da analyze - none!
176+
; CHECK-NEXT: da analyze - confused!
177177
;
178178
entry:
179179
br label %loop.i.header
@@ -222,7 +222,7 @@ exit:
222222
define void @non_invariant_baseptr_with_identical_underlying_obj2(ptr %A) {
223223
; CHECK-LABEL: 'non_invariant_baseptr_with_identical_underlying_obj2'
224224
; CHECK-NEXT: Src: store i32 1, ptr %idx, align 4 --> Dst: store i32 1, ptr %idx, align 4
225-
; CHECK-NEXT: da analyze - none!
225+
; CHECK-NEXT: da analyze - confused!
226226
;
227227
entry:
228228
br label %loop.i.header

0 commit comments

Comments
 (0)