xref: /llvm-project/llvm/test/Analysis/LoopAccessAnalysis/num-iters-for-store-load-conflict.ll (revision 184290e579ccb909faf9a03e35266ed23cf26e23)
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
4define 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;
22entry:
23  br label %loop
24
25loop:
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
36exit:
37  ret void
38}
39
40define 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;
58entry:
59  br label %loop
60
61loop:
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
72exit:
73  ret void
74}
75
76define 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;
94entry:
95  br label %loop
96
97loop:
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
108exit:
109  ret void
110}
111
112define 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;
130entry:
131  br label %loop
132
133loop:
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
144exit:
145  ret void
146}
147
148define 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;
166entry:
167  br label %loop
168
169loop:
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
180exit:
181  ret void
182}
183
184define 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;
202entry:
203  br label %loop
204
205loop:
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
216exit:
217  ret void
218}
219
220define 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;
238entry:
239  br label %loop
240
241loop:
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
252exit:
253  ret void
254}
255
256@A = global [37 x [37 x double]] zeroinitializer, align 8
257
258define 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;
286entry:
287  br label %outer.header
288
289outer.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
294inner:
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
304outer.latch:
305  %outer.ec = icmp eq i64 %outer.iv.next, %x
306  br i1 %outer.ec, label %exit, label %outer.header
307
308exit:
309  ret void
310}
311