Skip to content

Commit 184290e

Browse files
committed
[LAA] Add tests with dependencies may preventing st-to-ld forwarding.
Add test cases with varying distances between stores and loads that may prevent store-to-load forwarding.
1 parent 2ca101f commit 184290e

File tree

1 file changed

+310
-0
lines changed

1 file changed

+310
-0
lines changed
Lines changed: 310 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,310 @@
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+
4+
define void @forward_dist_7(ptr %A, ptr noalias %B) {
5+
; CHECK-LABEL: 'forward_dist_7'
6+
; CHECK-NEXT: loop:
7+
; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop
8+
; CHECK-NEXT: Forward loop carried data dependence that prevents store-to-load forwarding.
9+
; CHECK-NEXT: Dependences:
10+
; CHECK-NEXT: ForwardButPreventsForwarding:
11+
; CHECK-NEXT: store i32 0, ptr %gep.2, align 4 ->
12+
; CHECK-NEXT: %l = load i32, ptr %gep.1, align 4
13+
; CHECK-EMPTY:
14+
; CHECK-NEXT: Run-time memory checks:
15+
; CHECK-NEXT: Grouped accesses:
16+
; CHECK-EMPTY:
17+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
18+
; CHECK-NEXT: SCEV assumptions:
19+
; CHECK-EMPTY:
20+
; CHECK-NEXT: Expressions re-written:
21+
;
22+
entry:
23+
br label %loop
24+
25+
loop:
26+
%iv = phi i64 [ 0, %entry ], [ %next, %loop ]
27+
%gep.1 = getelementptr i32, ptr %A, i64 %iv
28+
%gep.2 = getelementptr i32, ptr %gep.1, i64 7
29+
store i32 0, ptr %gep.2, align 4
30+
%l = load i32, ptr %gep.1
31+
store i32 %l, ptr %B
32+
%next = add nuw nsw i64 %iv, 1
33+
%ec = icmp eq i64 %iv, 1000
34+
br i1 %ec, label %exit, label %loop
35+
36+
exit:
37+
ret void
38+
}
39+
40+
define void @forward_dist_9(ptr %A, ptr noalias %B) {
41+
; CHECK-LABEL: 'forward_dist_9'
42+
; CHECK-NEXT: loop:
43+
; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop
44+
; CHECK-NEXT: Forward loop carried data dependence that prevents store-to-load forwarding.
45+
; CHECK-NEXT: Dependences:
46+
; CHECK-NEXT: ForwardButPreventsForwarding:
47+
; CHECK-NEXT: store i32 0, ptr %gep.2, align 4 ->
48+
; CHECK-NEXT: %l = load i32, ptr %gep.1, align 4
49+
; CHECK-EMPTY:
50+
; CHECK-NEXT: Run-time memory checks:
51+
; CHECK-NEXT: Grouped accesses:
52+
; CHECK-EMPTY:
53+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
54+
; CHECK-NEXT: SCEV assumptions:
55+
; CHECK-EMPTY:
56+
; CHECK-NEXT: Expressions re-written:
57+
;
58+
entry:
59+
br label %loop
60+
61+
loop:
62+
%iv = phi i64 [ 0, %entry ], [ %next, %loop ]
63+
%gep.1 = getelementptr i32, ptr %A, i64 %iv
64+
%gep.2 = getelementptr i32, ptr %gep.1, i64 9
65+
store i32 0, ptr %gep.2, align 4
66+
%l = load i32, ptr %gep.1
67+
store i32 %l, ptr %B
68+
%next = add nuw nsw i64 %iv, 1
69+
%ec = icmp eq i64 %iv, 1000
70+
br i1 %ec, label %exit, label %loop
71+
72+
exit:
73+
ret void
74+
}
75+
76+
define void @forward_dist_11(ptr %A, ptr noalias %B) {
77+
; CHECK-LABEL: 'forward_dist_11'
78+
; CHECK-NEXT: loop:
79+
; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop
80+
; CHECK-NEXT: Forward loop carried data dependence that prevents store-to-load forwarding.
81+
; CHECK-NEXT: Dependences:
82+
; CHECK-NEXT: ForwardButPreventsForwarding:
83+
; CHECK-NEXT: store i32 0, ptr %gep.2, align 4 ->
84+
; CHECK-NEXT: %l = load i32, ptr %gep.1, align 4
85+
; CHECK-EMPTY:
86+
; CHECK-NEXT: Run-time memory checks:
87+
; CHECK-NEXT: Grouped accesses:
88+
; CHECK-EMPTY:
89+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
90+
; CHECK-NEXT: SCEV assumptions:
91+
; CHECK-EMPTY:
92+
; CHECK-NEXT: Expressions re-written:
93+
;
94+
entry:
95+
br label %loop
96+
97+
loop:
98+
%iv = phi i64 [ 0, %entry ], [ %next, %loop ]
99+
%gep.1 = getelementptr i32, ptr %A, i64 %iv
100+
%gep.2 = getelementptr i32, ptr %gep.1, i64 9
101+
store i32 0, ptr %gep.2, align 4
102+
%l = load i32, ptr %gep.1
103+
store i32 %l, ptr %B
104+
%next = add nuw nsw i64 %iv, 1
105+
%ec = icmp eq i64 %iv, 1000
106+
br i1 %ec, label %exit, label %loop
107+
108+
exit:
109+
ret void
110+
}
111+
112+
define void @forward_dist_13(ptr %A, ptr noalias %B) {
113+
; CHECK-LABEL: 'forward_dist_13'
114+
; CHECK-NEXT: loop:
115+
; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop
116+
; CHECK-NEXT: Forward loop carried data dependence that prevents store-to-load forwarding.
117+
; CHECK-NEXT: Dependences:
118+
; CHECK-NEXT: ForwardButPreventsForwarding:
119+
; CHECK-NEXT: store i32 0, ptr %gep.2, align 4 ->
120+
; CHECK-NEXT: %l = load i32, ptr %gep.1, align 4
121+
; CHECK-EMPTY:
122+
; CHECK-NEXT: Run-time memory checks:
123+
; CHECK-NEXT: Grouped accesses:
124+
; CHECK-EMPTY:
125+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
126+
; CHECK-NEXT: SCEV assumptions:
127+
; CHECK-EMPTY:
128+
; CHECK-NEXT: Expressions re-written:
129+
;
130+
entry:
131+
br label %loop
132+
133+
loop:
134+
%iv = phi i64 [ 0, %entry ], [ %next, %loop ]
135+
%gep.1 = getelementptr i32, ptr %A, i64 %iv
136+
%gep.2 = getelementptr i32, ptr %gep.1, i64 13
137+
store i32 0, ptr %gep.2, align 4
138+
%l = load i32, ptr %gep.1
139+
store i32 %l, ptr %B
140+
%next = add nuw nsw i64 %iv, 1
141+
%ec = icmp eq i64 %iv, 1000
142+
br i1 %ec, label %exit, label %loop
143+
144+
exit:
145+
ret void
146+
}
147+
148+
define void @forward_dist_15(ptr %A, ptr noalias %B) {
149+
; CHECK-LABEL: 'forward_dist_15'
150+
; CHECK-NEXT: loop:
151+
; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop
152+
; CHECK-NEXT: Forward loop carried data dependence that prevents store-to-load forwarding.
153+
; CHECK-NEXT: Dependences:
154+
; CHECK-NEXT: ForwardButPreventsForwarding:
155+
; CHECK-NEXT: store i32 0, ptr %gep.2, align 4 ->
156+
; CHECK-NEXT: %l = load i32, ptr %gep.1, align 4
157+
; CHECK-EMPTY:
158+
; CHECK-NEXT: Run-time memory checks:
159+
; CHECK-NEXT: Grouped accesses:
160+
; CHECK-EMPTY:
161+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
162+
; CHECK-NEXT: SCEV assumptions:
163+
; CHECK-EMPTY:
164+
; CHECK-NEXT: Expressions re-written:
165+
;
166+
entry:
167+
br label %loop
168+
169+
loop:
170+
%iv = phi i64 [ 0, %entry ], [ %next, %loop ]
171+
%gep.1 = getelementptr i32, ptr %A, i64 %iv
172+
%gep.2 = getelementptr i32, ptr %gep.1, i64 13
173+
store i32 0, ptr %gep.2, align 4
174+
%l = load i32, ptr %gep.1
175+
store i32 %l, ptr %B
176+
%next = add nuw nsw i64 %iv, 1
177+
%ec = icmp eq i64 %iv, 1000
178+
br i1 %ec, label %exit, label %loop
179+
180+
exit:
181+
ret void
182+
}
183+
184+
define void @forward_dist_17(ptr %A, ptr noalias %B) {
185+
; CHECK-LABEL: 'forward_dist_17'
186+
; CHECK-NEXT: loop:
187+
; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop
188+
; CHECK-NEXT: Forward loop carried data dependence that prevents store-to-load forwarding.
189+
; CHECK-NEXT: Dependences:
190+
; CHECK-NEXT: ForwardButPreventsForwarding:
191+
; CHECK-NEXT: store i32 0, ptr %gep.2, align 4 ->
192+
; CHECK-NEXT: %l = load i32, ptr %gep.1, align 4
193+
; CHECK-EMPTY:
194+
; CHECK-NEXT: Run-time memory checks:
195+
; CHECK-NEXT: Grouped accesses:
196+
; CHECK-EMPTY:
197+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
198+
; CHECK-NEXT: SCEV assumptions:
199+
; CHECK-EMPTY:
200+
; CHECK-NEXT: Expressions re-written:
201+
;
202+
entry:
203+
br label %loop
204+
205+
loop:
206+
%iv = phi i64 [ 0, %entry ], [ %next, %loop ]
207+
%gep.1 = getelementptr i32, ptr %A, i64 %iv
208+
%gep.2 = getelementptr i32, ptr %gep.1, i64 17
209+
store i32 0, ptr %gep.2, align 4
210+
%l = load i32, ptr %gep.1
211+
store i32 %l, ptr %B
212+
%next = add nuw nsw i64 %iv, 1
213+
%ec = icmp eq i64 %iv, 1000
214+
br i1 %ec, label %exit, label %loop
215+
216+
exit:
217+
ret void
218+
}
219+
220+
define void @forward_dist_19(ptr %A, ptr noalias %B) {
221+
; CHECK-LABEL: 'forward_dist_19'
222+
; CHECK-NEXT: loop:
223+
; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop
224+
; CHECK-NEXT: Forward loop carried data dependence that prevents store-to-load forwarding.
225+
; CHECK-NEXT: Dependences:
226+
; CHECK-NEXT: ForwardButPreventsForwarding:
227+
; CHECK-NEXT: store i32 0, ptr %gep.2, align 4 ->
228+
; CHECK-NEXT: %l = load i32, ptr %gep.1, align 4
229+
; CHECK-EMPTY:
230+
; CHECK-NEXT: Run-time memory checks:
231+
; CHECK-NEXT: Grouped accesses:
232+
; CHECK-EMPTY:
233+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
234+
; CHECK-NEXT: SCEV assumptions:
235+
; CHECK-EMPTY:
236+
; CHECK-NEXT: Expressions re-written:
237+
;
238+
entry:
239+
br label %loop
240+
241+
loop:
242+
%iv = phi i64 [ 0, %entry ], [ %next, %loop ]
243+
%gep.1 = getelementptr i32, ptr %A, i64 %iv
244+
%gep.2 = getelementptr i32, ptr %gep.1, i64 19
245+
store i32 0, ptr %gep.2, align 4
246+
%l = load i32, ptr %gep.1
247+
store i32 %l, ptr %B
248+
%next = add nuw nsw i64 %iv, 1
249+
%ec = icmp eq i64 %iv, 1000
250+
br i1 %ec, label %exit, label %loop
251+
252+
exit:
253+
ret void
254+
}
255+
256+
@A = global [37 x [37 x double]] zeroinitializer, align 8
257+
258+
define void @unknown_loop_bounds(i64 %x, i64 %y) {
259+
; CHECK-LABEL: 'unknown_loop_bounds'
260+
; CHECK-NEXT: inner:
261+
; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop
262+
; CHECK-NEXT: Backward loop carried data dependence that prevents store-to-load forwarding.
263+
; CHECK-NEXT: Dependences:
264+
; CHECK-NEXT: BackwardVectorizableButPreventsForwarding:
265+
; CHECK-NEXT: %l = load double, ptr %gep.0, align 8 ->
266+
; CHECK-NEXT: store double %l, ptr %gep.1, align 8
267+
; CHECK-EMPTY:
268+
; CHECK-NEXT: Run-time memory checks:
269+
; CHECK-NEXT: Grouped accesses:
270+
; CHECK-EMPTY:
271+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
272+
; CHECK-NEXT: SCEV assumptions:
273+
; CHECK-EMPTY:
274+
; CHECK-NEXT: Expressions re-written:
275+
; CHECK-NEXT: outer.header:
276+
; CHECK-NEXT: Report: loop is not the innermost loop
277+
; CHECK-NEXT: Dependences:
278+
; CHECK-NEXT: Run-time memory checks:
279+
; CHECK-NEXT: Grouped accesses:
280+
; CHECK-EMPTY:
281+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
282+
; CHECK-NEXT: SCEV assumptions:
283+
; CHECK-EMPTY:
284+
; CHECK-NEXT: Expressions re-written:
285+
;
286+
entry:
287+
br label %outer.header
288+
289+
outer.header:
290+
%outer.iv = phi i64 [ 0, %entry ], [ %outer.iv.next, %outer.latch ]
291+
%outer.iv.next = add nuw nsw i64 %outer.iv, 1
292+
br label %inner
293+
294+
inner:
295+
%inner.iv = phi i64 [ 0, %outer.header ], [ %inner.iv.next, %inner ]
296+
%gep.0 = getelementptr inbounds [37 x [37 x double]], ptr @A, i64 0, i64 %outer.iv, i64 %inner.iv
297+
%l = load double, ptr %gep.0, align 8
298+
%gep.1 = getelementptr inbounds [37 x [37 x double]], ptr @A, i64 0, i64 %outer.iv.next, i64 %inner.iv
299+
store double %l, ptr %gep.1, align 8
300+
%inner.iv.next = add nuw nsw i64 %inner.iv, 1
301+
%inner.ec = icmp eq i64 %inner.iv.next, %y
302+
br i1 %inner.ec, label %outer.latch, label %inner
303+
304+
outer.latch:
305+
%outer.ec = icmp eq i64 %outer.iv.next, %x
306+
br i1 %outer.ec, label %exit, label %outer.header
307+
308+
exit:
309+
ret void
310+
}

0 commit comments

Comments
 (0)