Skip to content

Commit 7734472

Browse files
committed
[LoopInterchange] Forbid interchange when the dependency is confused
#47259 A confused dependency(*f) in loop should prevent interchange in loops i and j. void test_deps() { for (int i = 0; i <= 3; i++) for (int j = 0; j <= 3; j++) { *f ^= 0x1000; c[j][i] = *f; } }
1 parent 7f25fae commit 7734472

File tree

6 files changed

+23
-22
lines changed

6 files changed

+23
-22
lines changed

llvm/lib/Transforms/Scalar/LoopInterchange.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,13 @@ static bool populateDependencyMatrix(CharMatrix &DepMatrix, unsigned Level,
123123
// Track Output, Flow, and Anti dependencies.
124124
if (auto D = DI->depends(Src, Dst, true)) {
125125
assert(D->isOrdered() && "Expected an output, flow or anti dep.");
126+
127+
if (D->isConfused()) {
128+
LLVM_DEBUG(dbgs() << " Confused dependency between:\n"
129+
<< " " << *Src << "\n"
130+
<< " " << *Dst << "\n");
131+
return false;
132+
}
126133
// If the direction vector is negative, normalize it to
127134
// make it non-negative.
128135
if (D->normalize(SE))

llvm/test/Transforms/LoopInterchange/lcssa.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ for.end16: ; preds = %for.exit
180180
; REMARK: Interchanged
181181
; REMARK-NEXT: lcssa_05
182182

183-
define void @lcssa_05(ptr %ptr) {
183+
define void @lcssa_05(ptr noalias %ptr) {
184184
entry:
185185
br label %outer.header
186186

@@ -225,7 +225,7 @@ for.end16: ; preds = %for.exit
225225
; REMARK: UnsupportedExitPHI
226226
; REMARK-NEXT: lcssa_06
227227

228-
define void @lcssa_06(ptr %ptr, ptr %ptr1) {
228+
define void @lcssa_06(ptr %ptr, ptr noalias %ptr1) {
229229
entry:
230230
br label %outer.header
231231

llvm/test/Transforms/LoopInterchange/pr43326-ideal-access-pattern.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
; REMARKS-NEXT: Name: Interchanged
2828
; REMARKS-NEXT: Function: pr43326-triply-nested
2929

30-
define void @pr43326-triply-nested(ptr %e, ptr %f) {
30+
define void @pr43326-triply-nested(ptr noalias %e, ptr %f) {
3131
entry:
3232
br label %for.outermost.header
3333

llvm/test/Transforms/LoopInterchange/pr47259.ll

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,11 @@
1313
;; }
1414
;; }
1515

16-
; CHECK: Loops interchanged.
16+
17+
; CHECK: Confused dependency between:
18+
; CHECK: store i32 %xor, ptr %arrayidx6, align 4
19+
; CHECK: %1 = load i32, ptr %0, align 4
20+
; CHECK-NOT: Loops interchanged.
1721

1822
@a = global i32 0, align 4
1923
@f = global ptr @a, align 8

llvm/test/Transforms/LoopInterchange/reductions-across-inner-and-outer-loop.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ for1.loopexit: ; preds = %for1.inc
156156
; REMARKS-NEXT: Name: UnsupportedPHIOuter
157157
; REMARKS-NEXT: Function: test4
158158

159-
define i64 @test4(ptr %Arr, ptr %dst) {
159+
define i64 @test4(ptr %Arr, ptr noalias %dst) {
160160
entry:
161161
%gep.dst = getelementptr inbounds i64, ptr %dst, i64 42
162162
br label %for1.header
@@ -234,7 +234,7 @@ for1.loopexit: ; preds = %for1.inc
234234
; REMARKS-NEXT: Name: Interchanged
235235
; REMARKS-NEXT: Function: test5
236236

237-
define float @test5(ptr %Arr, ptr %Arr2) {
237+
define float @test5(ptr %Arr, ptr noalias %Arr2) {
238238
entry:
239239
br label %outer.header
240240

@@ -274,7 +274,7 @@ for.exit: ; preds = %outer.inc
274274
; REMARKS-NEXT: Name: UnsupportedPHIOuter
275275
; REMARKS-NEXT: Function: test6
276276

277-
define float @test6(ptr %Arr, ptr %Arr2) {
277+
define float @test6(ptr %Arr, ptr noalias %Arr2) {
278278
entry:
279279
br label %outer.header
280280

llvm/test/Transforms/LoopInterchange/vector-gep-operand.ll

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,35 +6,25 @@
66
define void @test(ptr noalias %src, ptr %dst) {
77
; CHECK-LABEL: @test(
88
; CHECK-NEXT: entry:
9-
; CHECK-NEXT: br label [[INNER_PREHEADER:%.*]]
10-
; CHECK: outer.header.preheader:
119
; CHECK-NEXT: br label [[OUTER_HEADER:%.*]]
1210
; CHECK: outer.header:
13-
; CHECK-NEXT: [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[OUTER_LATCH:%.*]] ], [ 0, [[OUTER_HEADER_PREHEADER:%.*]] ]
14-
; CHECK-NEXT: br label [[INNER_SPLIT1:%.*]]
15-
; CHECK: inner.preheader:
11+
; CHECK-NEXT: [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[OUTER_LATCH:%.*]] ], [ 0, [[ENTRY:%.*]] ]
1612
; CHECK-NEXT: br label [[INNER:%.*]]
1713
; CHECK: inner:
18-
; CHECK-NEXT: [[J:%.*]] = phi i64 [ [[TMP0:%.*]], [[INNER_SPLIT:%.*]] ], [ 0, [[INNER_PREHEADER]] ]
19-
; CHECK-NEXT: br label [[OUTER_HEADER_PREHEADER]]
20-
; CHECK: inner.split1:
14+
; CHECK-NEXT: [[J:%.*]] = phi i64 [ 0, [[OUTER_HEADER]] ], [ [[J_NEXT:%.*]], [[INNER]] ]
2115
; CHECK-NEXT: [[SRC_GEP:%.*]] = getelementptr inbounds [256 x float], ptr [[SRC:%.*]], <2 x i64> <i64 0, i64 1>, i64 [[J]]
2216
; CHECK-NEXT: [[SRC_0:%.*]] = extractelement <2 x ptr> [[SRC_GEP]], i32 0
2317
; CHECK-NEXT: [[LV_0:%.*]] = load float, ptr [[SRC_0]], align 4
2418
; CHECK-NEXT: [[ADD_0:%.*]] = fadd float [[LV_0]], 1.000000e+00
2519
; CHECK-NEXT: [[DST_GEP:%.*]] = getelementptr inbounds float, ptr [[DST:%.*]], i64 [[J]]
2620
; CHECK-NEXT: store float [[ADD_0]], ptr [[DST_GEP]], align 4
27-
; CHECK-NEXT: [[J_NEXT:%.*]] = add nuw nsw i64 [[J]], 1
21+
; CHECK-NEXT: [[J_NEXT]] = add nuw nsw i64 [[J]], 1
2822
; CHECK-NEXT: [[INNER_EXITCOND:%.*]] = icmp eq i64 [[J_NEXT]], 100
29-
; CHECK-NEXT: br label [[OUTER_LATCH]]
30-
; CHECK: inner.split:
31-
; CHECK-NEXT: [[TMP0]] = add nuw nsw i64 [[J]], 1
32-
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[TMP0]], 100
33-
; CHECK-NEXT: br i1 [[TMP1]], label [[EXIT:%.*]], label [[INNER]]
23+
; CHECK-NEXT: br i1 [[INNER_EXITCOND]], label [[OUTER_LATCH]], label [[INNER]]
3424
; CHECK: outer.latch:
3525
; CHECK-NEXT: [[I_NEXT]] = add nuw nsw i32 [[I]], 1
3626
; CHECK-NEXT: [[OUTER_EXITCOND:%.*]] = icmp eq i32 [[I_NEXT]], 100
37-
; CHECK-NEXT: br i1 [[OUTER_EXITCOND]], label [[INNER_SPLIT]], label [[OUTER_HEADER]]
27+
; CHECK-NEXT: br i1 [[OUTER_EXITCOND]], label [[EXIT:%.*]], label [[OUTER_HEADER]]
3828
; CHECK: exit:
3929
; CHECK-NEXT: ret void
4030
;

0 commit comments

Comments
 (0)