Skip to content

Commit 1464aee

Browse files
committed
[LAA] Add tests with non-constant backward deps with known min value.
Add a set of tests with non-constant backward dependences, where the minimum value is known (via the start value of the outer AddRec).
1 parent 878c141 commit 1464aee

File tree

1 file changed

+258
-0
lines changed

1 file changed

+258
-0
lines changed
Lines changed: 258 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,258 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt -passes='print<access-info>' -disable-output %s 2>&1 | FileCheck %s
3+
; RUN: opt -passes='print<access-info>' -disable-output -mtriple=arm64-apple-macosx %s 2>&1 | FileCheck %s
4+
; RUN: opt -passes='print<access-info>' -disable-output -mtriple=arm64-apple-macosx -mattr=+sve %s 2>&1 | FileCheck %s
5+
6+
; REQUIRES: aarch64-registered-target
7+
8+
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
9+
10+
define void @backward_min_distance_8(ptr %A, i64 %N) {
11+
; CHECK-LABEL: 'backward_min_distance_8'
12+
; CHECK-NEXT: loop:
13+
; CHECK-NEXT: Memory dependences are safe with run-time checks
14+
; CHECK-NEXT: Dependences:
15+
; CHECK-NEXT: Run-time memory checks:
16+
; CHECK-NEXT: Check 0:
17+
; CHECK-NEXT: Comparing group ([[GRP1:0x[0-9a-f]+]]):
18+
; CHECK-NEXT: %gep.off.iv = getelementptr inbounds i8, ptr %gep.off, i64 %iv
19+
; CHECK-NEXT: Against group ([[GRP2:0x[0-9a-f]+]]):
20+
; CHECK-NEXT: %gep = getelementptr inbounds i8, ptr %A, i64 %iv
21+
; CHECK-NEXT: Grouped accesses:
22+
; CHECK-NEXT: Group [[GRP1]]:
23+
; CHECK-NEXT: (Low: {(1 + %A)<nuw>,+,1}<nuw><%outer.header> High: {(257 + %A),+,1}<nw><%outer.header>)
24+
; CHECK-NEXT: Member: {{\{\{}}(1 + %A)<nuw>,+,1}<nuw><%outer.header>,+,1}<nuw><%loop>
25+
; CHECK-NEXT: Group [[GRP2]]:
26+
; CHECK-NEXT: (Low: %A High: (256 + %A))
27+
; CHECK-NEXT: Member: {%A,+,1}<nuw><%loop>
28+
; CHECK-EMPTY:
29+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
30+
; CHECK-NEXT: SCEV assumptions:
31+
; CHECK-EMPTY:
32+
; CHECK-NEXT: Expressions re-written:
33+
; CHECK-NEXT: outer.header:
34+
; CHECK-NEXT: Report: loop is not the innermost loop
35+
; CHECK-NEXT: Dependences:
36+
; CHECK-NEXT: Run-time memory checks:
37+
; CHECK-NEXT: Grouped accesses:
38+
; CHECK-EMPTY:
39+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
40+
; CHECK-NEXT: SCEV assumptions:
41+
; CHECK-EMPTY:
42+
; CHECK-NEXT: Expressions re-written:
43+
;
44+
entry:
45+
br label %outer.header
46+
47+
outer.header:
48+
%outer.iv = phi i64 [ 1, %entry ], [ %outer.iv.next, %outer.latch ]
49+
%gep.off = getelementptr inbounds i8, ptr %A, i64 %outer.iv
50+
br label %loop
51+
52+
loop:
53+
%iv = phi i64 [ 0, %outer.header ], [ %iv.next, %loop ]
54+
%gep = getelementptr inbounds i8, ptr %A, i64 %iv
55+
%l = load i8 , ptr %gep, align 4
56+
%add = add nsw i8 %l, 5
57+
%gep.off.iv = getelementptr inbounds i8, ptr %gep.off, i64 %iv
58+
store i8 %add, ptr %gep.off.iv, align 4
59+
%iv.next = add nuw nsw i64 %iv, 1
60+
%exitcond.not = icmp eq i64 %iv.next, 256
61+
br i1 %exitcond.not, label %outer.latch, label %loop
62+
63+
outer.latch:
64+
%outer.iv.next = add nuw nsw i64 %outer.iv, 1
65+
%ec.2 = icmp eq i64 %outer.iv.next, %N
66+
br i1 %ec.2, label %exit, label %outer.header
67+
68+
exit:
69+
ret void
70+
}
71+
72+
define void @backward_min_distance_120(ptr %A, i64 %N) {
73+
; CHECK-LABEL: 'backward_min_distance_120'
74+
; CHECK-NEXT: loop:
75+
; CHECK-NEXT: Memory dependences are safe with run-time checks
76+
; CHECK-NEXT: Dependences:
77+
; CHECK-NEXT: Run-time memory checks:
78+
; CHECK-NEXT: Check 0:
79+
; CHECK-NEXT: Comparing group ([[GRP3:0x[0-9a-f]+]]):
80+
; CHECK-NEXT: %gep.off.iv = getelementptr inbounds i8, ptr %gep.off, i64 %iv
81+
; CHECK-NEXT: Against group ([[GRP4:0x[0-9a-f]+]]):
82+
; CHECK-NEXT: %gep = getelementptr inbounds i8, ptr %A, i64 %iv
83+
; CHECK-NEXT: Grouped accesses:
84+
; CHECK-NEXT: Group [[GRP3]]:
85+
; CHECK-NEXT: (Low: {(15 + %A)<nuw>,+,1}<nuw><%outer.header> High: {(271 + %A),+,1}<nw><%outer.header>)
86+
; CHECK-NEXT: Member: {{\{\{}}(15 + %A)<nuw>,+,1}<nuw><%outer.header>,+,1}<nuw><%loop>
87+
; CHECK-NEXT: Group [[GRP4]]:
88+
; CHECK-NEXT: (Low: %A High: (256 + %A))
89+
; CHECK-NEXT: Member: {%A,+,1}<nuw><%loop>
90+
; CHECK-EMPTY:
91+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
92+
; CHECK-NEXT: SCEV assumptions:
93+
; CHECK-EMPTY:
94+
; CHECK-NEXT: Expressions re-written:
95+
; CHECK-NEXT: outer.header:
96+
; CHECK-NEXT: Report: loop is not the innermost loop
97+
; CHECK-NEXT: Dependences:
98+
; CHECK-NEXT: Run-time memory checks:
99+
; CHECK-NEXT: Grouped accesses:
100+
; CHECK-EMPTY:
101+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
102+
; CHECK-NEXT: SCEV assumptions:
103+
; CHECK-EMPTY:
104+
; CHECK-NEXT: Expressions re-written:
105+
;
106+
entry:
107+
br label %outer.header
108+
109+
outer.header:
110+
%outer.iv = phi i64 [ 15, %entry ], [ %outer.iv.next, %outer.latch ]
111+
%gep.off = getelementptr inbounds i8, ptr %A, i64 %outer.iv
112+
br label %loop
113+
114+
loop:
115+
%iv = phi i64 [ 0, %outer.header ], [ %iv.next, %loop ]
116+
%gep = getelementptr inbounds i8, ptr %A, i64 %iv
117+
%l = load i8 , ptr %gep, align 4
118+
%add = add nsw i8 %l, 5
119+
%gep.off.iv = getelementptr inbounds i8, ptr %gep.off, i64 %iv
120+
store i8 %add, ptr %gep.off.iv, align 4
121+
%iv.next = add nuw nsw i64 %iv, 1
122+
%exitcond.not = icmp eq i64 %iv.next, 256
123+
br i1 %exitcond.not, label %outer.latch, label %loop
124+
125+
outer.latch:
126+
%outer.iv.next = add nuw nsw i64 %outer.iv, 1
127+
%ec.2 = icmp eq i64 %outer.iv.next, %N
128+
br i1 %ec.2, label %exit, label %outer.header
129+
130+
exit:
131+
ret void
132+
}
133+
134+
135+
declare void @llvm.assume(i1)
136+
define void @backward_min_distance_128(ptr %A, i64 %N) {
137+
; CHECK-LABEL: 'backward_min_distance_128'
138+
; CHECK-NEXT: loop:
139+
; CHECK-NEXT: Memory dependences are safe with run-time checks
140+
; CHECK-NEXT: Dependences:
141+
; CHECK-NEXT: Run-time memory checks:
142+
; CHECK-NEXT: Check 0:
143+
; CHECK-NEXT: Comparing group ([[GRP5:0x[0-9a-f]+]]):
144+
; CHECK-NEXT: %gep.off.iv = getelementptr inbounds i8, ptr %gep.off, i64 %iv
145+
; CHECK-NEXT: Against group ([[GRP6:0x[0-9a-f]+]]):
146+
; CHECK-NEXT: %gep = getelementptr inbounds i8, ptr %A, i64 %iv
147+
; CHECK-NEXT: Grouped accesses:
148+
; CHECK-NEXT: Group [[GRP5]]:
149+
; CHECK-NEXT: (Low: {(16 + %A)<nuw>,+,1}<nuw><%outer.header> High: {(272 + %A),+,1}<nw><%outer.header>)
150+
; CHECK-NEXT: Member: {{\{\{}}(16 + %A)<nuw>,+,1}<nuw><%outer.header>,+,1}<nuw><%loop>
151+
; CHECK-NEXT: Group [[GRP6]]:
152+
; CHECK-NEXT: (Low: %A High: (256 + %A))
153+
; CHECK-NEXT: Member: {%A,+,1}<nuw><%loop>
154+
; CHECK-EMPTY:
155+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
156+
; CHECK-NEXT: SCEV assumptions:
157+
; CHECK-EMPTY:
158+
; CHECK-NEXT: Expressions re-written:
159+
; CHECK-NEXT: outer.header:
160+
; CHECK-NEXT: Report: loop is not the innermost loop
161+
; CHECK-NEXT: Dependences:
162+
; CHECK-NEXT: Run-time memory checks:
163+
; CHECK-NEXT: Grouped accesses:
164+
; CHECK-EMPTY:
165+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
166+
; CHECK-NEXT: SCEV assumptions:
167+
; CHECK-EMPTY:
168+
; CHECK-NEXT: Expressions re-written:
169+
;
170+
entry:
171+
br label %outer.header
172+
173+
outer.header:
174+
%outer.iv = phi i64 [ 16, %entry ], [ %outer.iv.next, %outer.latch ]
175+
%gep.off = getelementptr inbounds i8, ptr %A, i64 %outer.iv
176+
br label %loop
177+
178+
loop:
179+
%iv = phi i64 [ 0, %outer.header ], [ %iv.next, %loop ]
180+
%gep = getelementptr inbounds i8, ptr %A, i64 %iv
181+
%l = load i8 , ptr %gep, align 4
182+
%add = add nsw i8 %l, 5
183+
%gep.off.iv = getelementptr inbounds i8, ptr %gep.off, i64 %iv
184+
store i8 %add, ptr %gep.off.iv, align 4
185+
%iv.next = add nuw nsw i64 %iv, 1
186+
%exitcond.not = icmp eq i64 %iv.next, 256
187+
br i1 %exitcond.not, label %outer.latch, label %loop
188+
189+
outer.latch:
190+
%outer.iv.next = add nuw nsw i64 %outer.iv, 1
191+
%ec.2 = icmp eq i64 %outer.iv.next, %N
192+
br i1 %ec.2, label %exit, label %outer.header
193+
194+
exit:
195+
ret void
196+
}
197+
198+
define void @backward_min_distance_256(ptr %A, i64 %N) {
199+
; CHECK-LABEL: 'backward_min_distance_256'
200+
; CHECK-NEXT: loop:
201+
; CHECK-NEXT: Memory dependences are safe with run-time checks
202+
; CHECK-NEXT: Dependences:
203+
; CHECK-NEXT: Run-time memory checks:
204+
; CHECK-NEXT: Check 0:
205+
; CHECK-NEXT: Comparing group ([[GRP7:0x[0-9a-f]+]]):
206+
; CHECK-NEXT: %gep.off.iv = getelementptr inbounds i8, ptr %gep.off, i64 %iv
207+
; CHECK-NEXT: Against group ([[GRP8:0x[0-9a-f]+]]):
208+
; CHECK-NEXT: %gep = getelementptr inbounds i8, ptr %A, i64 %iv
209+
; CHECK-NEXT: Grouped accesses:
210+
; CHECK-NEXT: Group [[GRP7]]:
211+
; CHECK-NEXT: (Low: {(32 + %A)<nuw>,+,1}<nuw><%outer.header> High: {(288 + %A),+,1}<nw><%outer.header>)
212+
; CHECK-NEXT: Member: {{\{\{}}(32 + %A)<nuw>,+,1}<nuw><%outer.header>,+,1}<nuw><%loop>
213+
; CHECK-NEXT: Group [[GRP8]]:
214+
; CHECK-NEXT: (Low: %A High: (256 + %A))
215+
; CHECK-NEXT: Member: {%A,+,1}<nuw><%loop>
216+
; CHECK-EMPTY:
217+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
218+
; CHECK-NEXT: SCEV assumptions:
219+
; CHECK-EMPTY:
220+
; CHECK-NEXT: Expressions re-written:
221+
; CHECK-NEXT: outer.header:
222+
; CHECK-NEXT: Report: loop is not the innermost loop
223+
; CHECK-NEXT: Dependences:
224+
; CHECK-NEXT: Run-time memory checks:
225+
; CHECK-NEXT: Grouped accesses:
226+
; CHECK-EMPTY:
227+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
228+
; CHECK-NEXT: SCEV assumptions:
229+
; CHECK-EMPTY:
230+
; CHECK-NEXT: Expressions re-written:
231+
;
232+
entry:
233+
br label %outer.header
234+
235+
outer.header:
236+
%outer.iv = phi i64 [ 32, %entry ], [ %outer.iv.next, %outer.latch ]
237+
%gep.off = getelementptr inbounds i8, ptr %A, i64 %outer.iv
238+
br label %loop
239+
240+
loop:
241+
%iv = phi i64 [ 0, %outer.header ], [ %iv.next, %loop ]
242+
%gep = getelementptr inbounds i8, ptr %A, i64 %iv
243+
%l = load i8 , ptr %gep, align 4
244+
%add = add nsw i8 %l, 5
245+
%gep.off.iv = getelementptr inbounds i8, ptr %gep.off, i64 %iv
246+
store i8 %add, ptr %gep.off.iv, align 4
247+
%iv.next = add nuw nsw i64 %iv, 1
248+
%exitcond.not = icmp eq i64 %iv.next, 256
249+
br i1 %exitcond.not, label %outer.latch, label %loop
250+
251+
outer.latch:
252+
%outer.iv.next = add nuw nsw i64 %outer.iv, 1
253+
%ec.2 = icmp eq i64 %outer.iv.next, %N
254+
br i1 %ec.2, label %exit, label %outer.header
255+
256+
exit:
257+
ret void
258+
}

0 commit comments

Comments
 (0)