Skip to content

Commit ecae3ed

Browse files
committed
[LAA] Apply loop guards to dependence distance.
After supporting non-constant dependence distances in 933f492, applying information from loop guards can help further disambiguate dependencies.
1 parent e1f279e commit ecae3ed

File tree

2 files changed

+27
-38
lines changed

2 files changed

+27
-38
lines changed

llvm/lib/Analysis/LoopAccessAnalysis.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2005,6 +2005,9 @@ getDependenceDistanceStrideAndSize(
20052005
return MemoryDepChecker::Dependence::Unknown;
20062006
}
20072007

2008+
if (!isa<SCEVConstant, SCEVCouldNotCompute>(Dist))
2009+
Dist = SE.applyLoopGuards(Dist, InnermostLoop);
2010+
20082011
uint64_t TypeByteSize = DL.getTypeAllocSize(ATy);
20092012
bool HasSameSize =
20102013
DL.getTypeStoreSizeInBits(ATy) == DL.getTypeStoreSizeInBits(BTy);

llvm/test/Analysis/LoopAccessAnalysis/offset-range-known-via-assume.ll

Lines changed: 24 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,19 @@ declare void @llvm.assume(i1)
77

88
declare void @use(ptr noundef)
99

10-
; TODO: %offset is known positive via assume, so we should be able to detect the
10+
; %offset is known positive via assume, so we should be able to detect the
1111
; forward dependence.
1212
define void @offset_i8_known_positive_via_assume_forward_dep_1(ptr %A, i64 %offset, i64 %N) {
1313
; CHECK-LABEL: 'offset_i8_known_positive_via_assume_forward_dep_1'
1414
; CHECK-NEXT: loop:
15-
; CHECK-NEXT: Memory dependences are safe with run-time checks
15+
; CHECK-NEXT: Memory dependences are safe
1616
; CHECK-NEXT: Dependences:
17+
; CHECK-NEXT: Forward:
18+
; CHECK-NEXT: %l = load i8, ptr %gep.off, align 4 ->
19+
; CHECK-NEXT: store i8 %add, ptr %gep, align 4
20+
; CHECK-EMPTY:
1721
; CHECK-NEXT: Run-time memory checks:
18-
; CHECK-NEXT: Check 0:
19-
; CHECK-NEXT: Comparing group ([[GRP1:0x[0-9a-f]+]]):
20-
; CHECK-NEXT: %gep = getelementptr inbounds i8, ptr %A, i64 %iv
21-
; CHECK-NEXT: Against group ([[GRP2:0x[0-9a-f]+]]):
22-
; CHECK-NEXT: %gep.off = getelementptr inbounds i8, ptr %off, i64 %iv
2322
; CHECK-NEXT: Grouped accesses:
24-
; CHECK-NEXT: Group [[GRP1]]:
25-
; CHECK-NEXT: (Low: %A High: (%N + %A))
26-
; CHECK-NEXT: Member: {%A,+,1}<nuw><%loop>
27-
; CHECK-NEXT: Group [[GRP2]]:
28-
; CHECK-NEXT: (Low: (%offset + %A) High: (%offset + %N + %A))
29-
; CHECK-NEXT: Member: {(%offset + %A),+,1}<nw><%loop>
3023
; CHECK-EMPTY:
3124
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
3225
; CHECK-NEXT: SCEV assumptions:
@@ -62,15 +55,15 @@ define void @offset_i32_known_positive_via_assume_forward_dep_1(ptr %A, i64 %off
6255
; CHECK-NEXT: Dependences:
6356
; CHECK-NEXT: Run-time memory checks:
6457
; CHECK-NEXT: Check 0:
65-
; CHECK-NEXT: Comparing group ([[GRP3:0x[0-9a-f]+]]):
58+
; CHECK-NEXT: Comparing group ([[GRP1:0x[0-9a-f]+]]):
6659
; CHECK-NEXT: %gep = getelementptr inbounds i32, ptr %A, i64 %iv
67-
; CHECK-NEXT: Against group ([[GRP4:0x[0-9a-f]+]]):
60+
; CHECK-NEXT: Against group ([[GRP2:0x[0-9a-f]+]]):
6861
; CHECK-NEXT: %gep.off = getelementptr inbounds i32, ptr %off, i64 %iv
6962
; CHECK-NEXT: Grouped accesses:
70-
; CHECK-NEXT: Group [[GRP3]]:
63+
; CHECK-NEXT: Group [[GRP1]]:
7164
; CHECK-NEXT: (Low: %A High: (-3 + (4 * %N) + %A))
7265
; CHECK-NEXT: Member: {%A,+,4}<nuw><%loop>
73-
; CHECK-NEXT: Group [[GRP4]]:
66+
; CHECK-NEXT: Group [[GRP2]]:
7467
; CHECK-NEXT: (Low: ((4 * %offset)<nsw> + %A) High: (-3 + (4 * %offset)<nsw> + (4 * %N) + %A))
7568
; CHECK-NEXT: Member: {((4 * %offset)<nsw> + %A),+,4}<nw><%loop>
7669
; CHECK-EMPTY:
@@ -103,26 +96,19 @@ exit:
10396
ret void
10497
}
10598

106-
; TODO: %offset is known positive via assume, so we should be able to detect the
99+
; %offset is known positive via assume, so we should be able to detect the
107100
; forward dependence.
108101
define void @offset_known_positive_via_assume_forward_dep_2(ptr %A, i64 %offset, i64 %N) {
109102
; CHECK-LABEL: 'offset_known_positive_via_assume_forward_dep_2'
110103
; CHECK-NEXT: loop:
111-
; CHECK-NEXT: Memory dependences are safe with run-time checks
104+
; CHECK-NEXT: Memory dependences are safe
112105
; CHECK-NEXT: Dependences:
106+
; CHECK-NEXT: Forward:
107+
; CHECK-NEXT: %l = load i32, ptr %gep.off, align 4 ->
108+
; CHECK-NEXT: store i32 %add, ptr %gep, align 4
109+
; CHECK-EMPTY:
113110
; CHECK-NEXT: Run-time memory checks:
114-
; CHECK-NEXT: Check 0:
115-
; CHECK-NEXT: Comparing group ([[GRP5:0x[0-9a-f]+]]):
116-
; CHECK-NEXT: %gep = getelementptr inbounds i32, ptr %A, i64 %iv
117-
; CHECK-NEXT: Against group ([[GRP6:0x[0-9a-f]+]]):
118-
; CHECK-NEXT: %gep.off = getelementptr inbounds i32, ptr %off, i64 %iv
119111
; CHECK-NEXT: Grouped accesses:
120-
; CHECK-NEXT: Group [[GRP5]]:
121-
; CHECK-NEXT: (Low: %A High: ((4 * %N) + %A))
122-
; CHECK-NEXT: Member: {%A,+,4}<nuw><%loop>
123-
; CHECK-NEXT: Group [[GRP6]]:
124-
; CHECK-NEXT: (Low: ((4 * %offset)<nsw> + %A) High: ((4 * %offset)<nsw> + (4 * %N) + %A))
125-
; CHECK-NEXT: Member: {((4 * %offset)<nsw> + %A),+,4}<nw><%loop>
126112
; CHECK-EMPTY:
127113
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
128114
; CHECK-NEXT: SCEV assumptions:
@@ -160,15 +146,15 @@ define void @offset_may_be_negative_via_assume_unknown_dep(ptr %A, i64 %offset,
160146
; CHECK-NEXT: Dependences:
161147
; CHECK-NEXT: Run-time memory checks:
162148
; CHECK-NEXT: Check 0:
163-
; CHECK-NEXT: Comparing group ([[GRP7:0x[0-9a-f]+]]):
149+
; CHECK-NEXT: Comparing group ([[GRP3:0x[0-9a-f]+]]):
164150
; CHECK-NEXT: %gep.mul.2 = getelementptr inbounds i32, ptr %A, i64 %iv
165-
; CHECK-NEXT: Against group ([[GRP8:0x[0-9a-f]+]]):
151+
; CHECK-NEXT: Against group ([[GRP4:0x[0-9a-f]+]]):
166152
; CHECK-NEXT: %gep = getelementptr inbounds i32, ptr %off, i64 %iv
167153
; CHECK-NEXT: Grouped accesses:
168-
; CHECK-NEXT: Group [[GRP7]]:
154+
; CHECK-NEXT: Group [[GRP3]]:
169155
; CHECK-NEXT: (Low: %A High: ((4 * %N) + %A))
170156
; CHECK-NEXT: Member: {%A,+,4}<nuw><%loop>
171-
; CHECK-NEXT: Group [[GRP8]]:
157+
; CHECK-NEXT: Group [[GRP4]]:
172158
; CHECK-NEXT: (Low: ((4 * %offset)<nsw> + %A) High: ((4 * %offset)<nsw> + (4 * %N) + %A))
173159
; CHECK-NEXT: Member: {((4 * %offset)<nsw> + %A),+,4}<nw><%loop>
174160
; CHECK-EMPTY:
@@ -207,15 +193,15 @@ define void @offset_no_assumes(ptr %A, i64 %offset, i64 %N) {
207193
; CHECK-NEXT: Dependences:
208194
; CHECK-NEXT: Run-time memory checks:
209195
; CHECK-NEXT: Check 0:
210-
; CHECK-NEXT: Comparing group ([[GRP9:0x[0-9a-f]+]]):
196+
; CHECK-NEXT: Comparing group ([[GRP5:0x[0-9a-f]+]]):
211197
; CHECK-NEXT: %gep = getelementptr inbounds i32, ptr %A, i64 %iv
212-
; CHECK-NEXT: Against group ([[GRP10:0x[0-9a-f]+]]):
198+
; CHECK-NEXT: Against group ([[GRP6:0x[0-9a-f]+]]):
213199
; CHECK-NEXT: %gep.off = getelementptr inbounds i32, ptr %off, i64 %iv
214200
; CHECK-NEXT: Grouped accesses:
215-
; CHECK-NEXT: Group [[GRP9]]:
201+
; CHECK-NEXT: Group [[GRP5]]:
216202
; CHECK-NEXT: (Low: %A High: ((4 * %N) + %A))
217203
; CHECK-NEXT: Member: {%A,+,4}<nuw><%loop>
218-
; CHECK-NEXT: Group [[GRP10]]:
204+
; CHECK-NEXT: Group [[GRP6]]:
219205
; CHECK-NEXT: (Low: ((4 * %offset)<nsw> + %A) High: ((4 * %offset)<nsw> + (4 * %N) + %A))
220206
; CHECK-NEXT: Member: {((4 * %offset)<nsw> + %A),+,4}<nw><%loop>
221207
; CHECK-EMPTY:

0 commit comments

Comments
 (0)