xref: /llvm-project/llvm/test/Analysis/LoopAccessAnalysis/pointer-phis.ll (revision 3a4376b8f90686f754ee51b296a064ab03c12895)
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 3
2; RUN: opt -passes='print<access-info>' -disable-output  < %s 2>&1 | FileCheck %s
3
4%s1 = type { [32000 x double], [32000 x double], [32000 x double] }
5
6define i32 @load_with_pointer_phi_no_runtime_checks(ptr %data) {
7; CHECK-LABEL: 'load_with_pointer_phi_no_runtime_checks'
8; CHECK-NEXT:    loop.header:
9; CHECK-NEXT:      Memory dependences are safe
10; CHECK-NEXT:      Dependences:
11; CHECK-NEXT:      Run-time memory checks:
12; CHECK-NEXT:      Grouped accesses:
13; CHECK-EMPTY:
14; CHECK-NEXT:      Non vectorizable stores to invariant address were not found in loop.
15; CHECK-NEXT:      SCEV assumptions:
16; CHECK-EMPTY:
17; CHECK-NEXT:      Expressions re-written:
18;
19entry:
20  br label %loop.header
21
22loop.header:                                        ; preds = %loop.latch, %entry
23  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]
24  %iv.next = add nuw nsw i64 %iv, 1
25  %cmp5 = icmp ult i64 %iv, 15999
26  %arrayidx = getelementptr inbounds %s1, ptr %data, i64 0, i32 0, i64 %iv
27  br i1 %cmp5, label %if.then, label %if.else
28
29if.then:                                          ; preds = %loop.header
30  %gep.1 = getelementptr inbounds %s1, ptr %data, i64 0, i32 1, i64 %iv
31  br label %loop.latch
32
33if.else:                                          ; preds = %loop.header
34  %gep.2 = getelementptr inbounds %s1, ptr %data, i64 0, i32 2, i64 %iv
35  br label %loop.latch
36
37loop.latch:                                          ; preds = %if.else, %if.then
38  %gep.2.sink = phi ptr [ %gep.2, %if.else ], [ %gep.1, %if.then ]
39  %v8 = load double, ptr %gep.2.sink, align 8
40  %mul16 = fmul double 3.0, %v8
41  store double %mul16, ptr %arrayidx, align 8
42  %exitcond.not = icmp eq i64 %iv.next, 32000
43  br i1 %exitcond.not, label %exit, label %loop.header
44
45exit:                                             ; preds = %loop.latch
46  ret i32 10
47}
48
49define i32 @store_with_pointer_phi_no_runtime_checks(ptr %data) {
50; CHECK-LABEL: 'store_with_pointer_phi_no_runtime_checks'
51; CHECK-NEXT:    loop.header:
52; CHECK-NEXT:      Memory dependences are safe
53; CHECK-NEXT:      Dependences:
54; CHECK-NEXT:      Run-time memory checks:
55; CHECK-NEXT:      Grouped accesses:
56; CHECK-EMPTY:
57; CHECK-NEXT:      Non vectorizable stores to invariant address were not found in loop.
58; CHECK-NEXT:      SCEV assumptions:
59; CHECK-EMPTY:
60; CHECK-NEXT:      Expressions re-written:
61;
62entry:
63  br label %loop.header
64
65loop.header:                                        ; preds = %loop.latch, %entry
66  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]
67  %iv.next = add nuw nsw i64 %iv, 1
68  %cmp5 = icmp ult i64 %iv, 15999
69  %arrayidx = getelementptr inbounds %s1, ptr %data, i64 0, i32 0, i64 %iv
70  br i1 %cmp5, label %if.then, label %if.else
71
72if.then:                                          ; preds = %loop.header
73  %gep.1 = getelementptr inbounds %s1, ptr %data, i64 0, i32 1, i64 %iv
74  br label %loop.latch
75
76if.else:                                          ; preds = %loop.header
77  %gep.2 = getelementptr inbounds %s1, ptr %data, i64 0, i32 2, i64 %iv
78  br label %loop.latch
79
80loop.latch:                                          ; preds = %if.else, %if.then
81  %gep.2.sink = phi ptr [ %gep.2, %if.else ], [ %gep.1, %if.then ]
82  %v8 = load double, ptr %arrayidx, align 8
83  %mul16 = fmul double 3.0, %v8
84  store double %mul16, ptr %gep.2.sink, align 8
85  %exitcond.not = icmp eq i64 %iv.next, 32000
86  br i1 %exitcond.not, label %exit, label %loop.header
87
88exit:                                             ; preds = %loop.latch
89  ret i32 10
90}
91
92define i32 @store_with_pointer_phi_runtime_checks(ptr %A, ptr %B, ptr %C) {
93; CHECK-LABEL: 'store_with_pointer_phi_runtime_checks'
94; CHECK-NEXT:    loop.header:
95; CHECK-NEXT:      Memory dependences are safe with run-time checks
96; CHECK-NEXT:      Dependences:
97; CHECK-NEXT:      Run-time memory checks:
98; CHECK-NEXT:      Check 0:
99; CHECK-NEXT:        Comparing group ([[GRP1:0x[0-9a-f]+]]):
100; CHECK-NEXT:          %gep.1 = getelementptr inbounds double, ptr %B, i64 %iv
101; CHECK-NEXT:        Against group ([[GRP2:0x[0-9a-f]+]]):
102; CHECK-NEXT:          %gep.2 = getelementptr inbounds double, ptr %C, i64 %iv
103; CHECK-NEXT:      Check 1:
104; CHECK-NEXT:        Comparing group ([[GRP1]]):
105; CHECK-NEXT:          %gep.1 = getelementptr inbounds double, ptr %B, i64 %iv
106; CHECK-NEXT:        Against group ([[GRP3:0x[0-9a-f]+]]):
107; CHECK-NEXT:          %arrayidx = getelementptr inbounds double, ptr %A, i64 %iv
108; CHECK-NEXT:      Check 2:
109; CHECK-NEXT:        Comparing group ([[GRP2]]):
110; CHECK-NEXT:          %gep.2 = getelementptr inbounds double, ptr %C, i64 %iv
111; CHECK-NEXT:        Against group ([[GRP3]]):
112; CHECK-NEXT:          %arrayidx = getelementptr inbounds double, ptr %A, i64 %iv
113; CHECK-NEXT:      Grouped accesses:
114; CHECK-NEXT:        Group [[GRP1]]:
115; CHECK-NEXT:          (Low: %B High: (256000 + %B))
116; CHECK-NEXT:            Member: {%B,+,8}<nw><%loop.header>
117; CHECK-NEXT:        Group [[GRP2]]:
118; CHECK-NEXT:          (Low: %C High: (256000 + %C))
119; CHECK-NEXT:            Member: {%C,+,8}<nw><%loop.header>
120; CHECK-NEXT:        Group [[GRP3]]:
121; CHECK-NEXT:          (Low: %A High: (256000 + %A))
122; CHECK-NEXT:            Member: {%A,+,8}<nw><%loop.header>
123; CHECK-EMPTY:
124; CHECK-NEXT:      Non vectorizable stores to invariant address were not found in loop.
125; CHECK-NEXT:      SCEV assumptions:
126; CHECK-EMPTY:
127; CHECK-NEXT:      Expressions re-written:
128;
129entry:
130  br label %loop.header
131
132loop.header:                                        ; preds = %loop.latch, %entry
133  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]
134  %iv.next = add nuw nsw i64 %iv, 1
135  %cmp5 = icmp ult i64 %iv, 15999
136  %arrayidx = getelementptr inbounds double, ptr %A, i64 %iv
137  br i1 %cmp5, label %if.then, label %if.else
138
139if.then:                                          ; preds = %loop.header
140  %gep.1 = getelementptr inbounds double, ptr %B, i64 %iv
141  br label %loop.latch
142
143if.else:                                          ; preds = %loop.header
144  %gep.2 = getelementptr inbounds double, ptr %C, i64 %iv
145  br label %loop.latch
146
147loop.latch:                                          ; preds = %if.else, %if.then
148  %gep.2.sink = phi ptr [ %gep.2, %if.else ], [ %gep.1, %if.then ]
149  %v8 = load double, ptr %arrayidx, align 8
150  %mul16 = fmul double 3.0, %v8
151  store double %mul16, ptr %gep.2.sink, align 8
152  %exitcond.not = icmp eq i64 %iv.next, 32000
153  br i1 %exitcond.not, label %exit, label %loop.header
154
155exit:                                             ; preds = %loop.latch
156  ret i32 10
157}
158
159define i32 @load_with_pointer_phi_outside_loop(ptr %A, ptr %B, ptr %C, i1 %c.0, i1 %c.1) {
160; CHECK-LABEL: 'load_with_pointer_phi_outside_loop'
161; CHECK-NEXT:    loop.header:
162; 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
163; CHECK-NEXT:  Unknown data dependence.
164; CHECK-NEXT:      Dependences:
165; CHECK-NEXT:        Unknown:
166; CHECK-NEXT:            %v8 = load double, ptr %ptr, align 8 ->
167; CHECK-NEXT:            store double %mul16, ptr %arrayidx, align 8
168; CHECK-EMPTY:
169; CHECK-NEXT:      Run-time memory checks:
170; CHECK-NEXT:      Grouped accesses:
171; CHECK-EMPTY:
172; CHECK-NEXT:      Non vectorizable stores to invariant address were not found in loop.
173; CHECK-NEXT:      SCEV assumptions:
174; CHECK-EMPTY:
175; CHECK-NEXT:      Expressions re-written:
176;
177entry:
178  br i1 %c.0, label %if.then, label %if.else
179
180if.then:
181  br label %loop.ph
182
183if.else:
184  %ptr.select = select i1 %c.1, ptr %C, ptr %B
185  br label %loop.ph
186
187loop.ph:
188  %ptr = phi ptr [ %A, %if.then ], [ %ptr.select, %if.else ]
189  br label %loop.header
190
191loop.header:                                        ; preds = %loop.latch, %entry
192  %iv = phi i64 [ 0, %loop.ph ], [ %iv.next, %loop.header ]
193  %iv.next = add nuw nsw i64 %iv, 1
194  %arrayidx = getelementptr inbounds double, ptr %A, i64 %iv
195  %v8 = load double, ptr %ptr, align 8
196  %mul16 = fmul double 3.0, %v8
197  store double %mul16, ptr %arrayidx, align 8
198  %exitcond.not = icmp eq i64 %iv.next, 32000
199  br i1 %exitcond.not, label %exit, label %loop.header
200
201exit:                                             ; preds = %loop.latch
202  ret i32 10
203}
204
205define i32 @store_with_pointer_phi_outside_loop(ptr %A, ptr %B, ptr %C, i1 %c.0, i1 %c.1) {
206; CHECK-LABEL: 'store_with_pointer_phi_outside_loop'
207; CHECK-NEXT:    loop.header:
208; 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
209; CHECK-NEXT:  Unknown data dependence.
210; CHECK-NEXT:      Dependences:
211; CHECK-NEXT:        Unknown:
212; CHECK-NEXT:            %v8 = load double, ptr %arrayidx, align 8 ->
213; CHECK-NEXT:            store double %mul16, ptr %ptr, align 8
214; CHECK-EMPTY:
215; CHECK-NEXT:      Run-time memory checks:
216; CHECK-NEXT:      Grouped accesses:
217; CHECK-EMPTY:
218; CHECK-NEXT:      Non vectorizable stores to invariant address were not found in loop.
219; CHECK-NEXT:      SCEV assumptions:
220; CHECK-EMPTY:
221; CHECK-NEXT:      Expressions re-written:
222;
223entry:
224  br i1 %c.0, label %if.then, label %if.else
225
226if.then:
227  br label %loop.ph
228
229if.else:
230  %ptr.select = select i1 %c.1, ptr %C, ptr %B
231  br label %loop.ph
232
233loop.ph:
234  %ptr = phi ptr [ %A, %if.then ], [ %ptr.select, %if.else ]
235  br label %loop.header
236
237loop.header:                                        ; preds = %loop.latch, %entry
238  %iv = phi i64 [ 0, %loop.ph ], [ %iv.next, %loop.header ]
239  %iv.next = add nuw nsw i64 %iv, 1
240  %arrayidx = getelementptr inbounds double, ptr %A, i64 %iv
241  %v8 = load double, ptr %arrayidx, align 8
242  %mul16 = fmul double 3.0, %v8
243  store double %mul16, ptr %ptr, align 8
244  %exitcond.not = icmp eq i64 %iv.next, 32000
245  br i1 %exitcond.not, label %exit, label %loop.header
246
247exit:                                             ; preds = %loop.latch
248  ret i32 10
249}
250
251define i32 @store_with_pointer_phi_incoming_phi(ptr %A, ptr %B, ptr %C, i1 %c.0, i1 %c.1) {
252; CHECK-LABEL: 'store_with_pointer_phi_incoming_phi'
253; CHECK-NEXT:    loop.header:
254; 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
255; CHECK-NEXT:  Unknown data dependence.
256; CHECK-NEXT:      Dependences:
257; CHECK-NEXT:        Unknown:
258; CHECK-NEXT:            %v8 = load double, ptr %arrayidx, align 8 ->
259; CHECK-NEXT:            store double %mul16, ptr %ptr.2, align 8
260; CHECK-EMPTY:
261; CHECK-NEXT:      Run-time memory checks:
262; CHECK-NEXT:      Check 0:
263; CHECK-NEXT:        Comparing group ([[GRP4:0x[0-9a-f]+]]):
264; CHECK-NEXT:        ptr %C
265; CHECK-NEXT:        Against group ([[GRP5:0x[0-9a-f]+]]):
266; CHECK-NEXT:        ptr %B
267; CHECK-NEXT:      Check 1:
268; CHECK-NEXT:        Comparing group ([[GRP4]]):
269; CHECK-NEXT:        ptr %C
270; CHECK-NEXT:        Against group ([[GRP6:0x[0-9a-f]+]]):
271; CHECK-NEXT:          %arrayidx = getelementptr inbounds double, ptr %A, i64 %iv
272; CHECK-NEXT:        ptr %A
273; CHECK-NEXT:      Check 2:
274; CHECK-NEXT:        Comparing group ([[GRP5]]):
275; CHECK-NEXT:        ptr %B
276; CHECK-NEXT:        Against group ([[GRP6]]):
277; CHECK-NEXT:          %arrayidx = getelementptr inbounds double, ptr %A, i64 %iv
278; CHECK-NEXT:        ptr %A
279; CHECK-NEXT:      Grouped accesses:
280; CHECK-NEXT:        Group [[GRP4]]:
281; CHECK-NEXT:          (Low: %C High: (8 + %C))
282; CHECK-NEXT:            Member: %C
283; CHECK-NEXT:        Group [[GRP5]]:
284; CHECK-NEXT:          (Low: %B High: (8 + %B))
285; CHECK-NEXT:            Member: %B
286; CHECK-NEXT:        Group [[GRP6]]:
287; CHECK-NEXT:          (Low: %A High: (256000 + %A))
288; CHECK-NEXT:            Member: {%A,+,8}<nuw><%loop.header>
289; CHECK-NEXT:            Member: %A
290; CHECK-EMPTY:
291; CHECK-NEXT:      Non vectorizable stores to invariant address were not found in loop.
292; CHECK-NEXT:      SCEV assumptions:
293; CHECK-EMPTY:
294; CHECK-NEXT:      Expressions re-written:
295;
296; CHECK-EMPTY
297entry:
298  br label %loop.header
299
300loop.header:                                        ; preds = %loop.latch, %entry
301  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]
302  %iv.next = add nuw nsw i64 %iv, 1
303  %arrayidx = getelementptr inbounds double, ptr %A, i64 %iv
304  %v8 = load double, ptr %arrayidx, align 8
305  %mul16 = fmul double 3.0, %v8
306  br i1 %c.0, label %loop.then, label %loop.latch
307
308loop.then:
309  br i1 %c.0, label %loop.then.2, label %loop.else.2
310
311loop.then.2:
312  br label %merge.2
313
314loop.else.2:
315  br label %merge.2
316
317
318merge.2:
319  %ptr = phi ptr [ %A, %loop.then.2 ], [ %B, %loop.else.2 ]
320  br label %loop.latch
321
322
323loop.latch:
324  %ptr.2 = phi ptr [ %ptr, %merge.2], [ %C, %loop.header ]
325  store double %mul16, ptr %ptr.2, align 8
326  %exitcond.not = icmp eq i64 %iv.next, 32000
327  br i1 %exitcond.not, label %exit, label %loop.header
328
329exit:                                             ; preds = %loop.latch
330  ret i32 10
331}
332
333; Test cases with pointer phis forming a cycle.
334define i32 @store_with_pointer_phi_incoming_phi_irreducible_cycle(ptr %A, ptr %B, ptr %C, i1 %c.0, i1 %c.1) {
335; CHECK-LABEL: 'store_with_pointer_phi_incoming_phi_irreducible_cycle'
336; CHECK-NEXT:    loop.header:
337; 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
338; CHECK-NEXT:  Unknown data dependence.
339; CHECK-NEXT:      Dependences:
340; CHECK-NEXT:        Unknown:
341; CHECK-NEXT:            %v8 = load double, ptr %arrayidx, align 8 ->
342; CHECK-NEXT:            store double %mul16, ptr %ptr.3, align 8
343; CHECK-EMPTY:
344; CHECK-NEXT:      Run-time memory checks:
345; CHECK-NEXT:      Check 0:
346; CHECK-NEXT:        Comparing group ([[GRP7:0x[0-9a-f]+]]):
347; CHECK-NEXT:        ptr %C
348; CHECK-NEXT:        Against group ([[GRP8:0x[0-9a-f]+]]):
349; CHECK-NEXT:        ptr %B
350; CHECK-NEXT:      Check 1:
351; CHECK-NEXT:        Comparing group ([[GRP7]]):
352; CHECK-NEXT:        ptr %C
353; CHECK-NEXT:        Against group ([[GRP9:0x[0-9a-f]+]]):
354; CHECK-NEXT:          %arrayidx = getelementptr inbounds double, ptr %A, i64 %iv
355; CHECK-NEXT:        ptr %A
356; CHECK-NEXT:      Check 2:
357; CHECK-NEXT:        Comparing group ([[GRP8]]):
358; CHECK-NEXT:        ptr %B
359; CHECK-NEXT:        Against group ([[GRP9]]):
360; CHECK-NEXT:          %arrayidx = getelementptr inbounds double, ptr %A, i64 %iv
361; CHECK-NEXT:        ptr %A
362; CHECK-NEXT:      Grouped accesses:
363; CHECK-NEXT:        Group [[GRP7]]:
364; CHECK-NEXT:          (Low: %C High: (8 + %C))
365; CHECK-NEXT:            Member: %C
366; CHECK-NEXT:        Group [[GRP8]]:
367; CHECK-NEXT:          (Low: %B High: (8 + %B))
368; CHECK-NEXT:            Member: %B
369; CHECK-NEXT:        Group [[GRP9]]:
370; CHECK-NEXT:          (Low: %A High: (256000 + %A))
371; CHECK-NEXT:            Member: {%A,+,8}<nuw><%loop.header>
372; CHECK-NEXT:            Member: %A
373; CHECK-EMPTY:
374; CHECK-NEXT:      Non vectorizable stores to invariant address were not found in loop.
375; CHECK-NEXT:      SCEV assumptions:
376; CHECK-EMPTY:
377; CHECK-NEXT:      Expressions re-written:
378;
379; CHECK-EMPTY
380entry:
381  br label %loop.header
382
383loop.header:                                        ; preds = %loop.latch, %entry
384  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]
385  %iv.next = add nuw nsw i64 %iv, 1
386  %arrayidx = getelementptr inbounds double, ptr %A, i64 %iv
387  %v8 = load double, ptr %arrayidx, align 8
388  %mul16 = fmul double 3.0, %v8
389  br i1 %c.0, label %loop.then, label %loop.latch
390
391loop.then:
392  br i1 %c.0, label %BB.A, label %BB.B
393
394BB.A:
395  %ptr = phi ptr [ %A, %loop.then ], [ %ptr.2, %BB.B ]
396  br label %BB.B
397
398BB.B:
399  %ptr.2 = phi ptr [ %ptr, %BB.A ], [ %B, %loop.then ]
400  br i1 %c.1, label %loop.latch, label %BB.A
401
402loop.latch:
403  %ptr.3 = phi ptr [ %ptr.2, %BB.B ], [ %C, %loop.header ]
404  store double %mul16, ptr %ptr.3, align 8
405  %exitcond.not = icmp eq i64 %iv.next, 32000
406  br i1 %exitcond.not, label %exit, label %loop.header
407
408exit:                                             ; preds = %loop.latch
409  ret i32 10
410}
411
412define i32 @store_with_pointer_phi_outside_loop_select(ptr %A, ptr %B, ptr %C, i1 %c.0, i1 %c.1) {
413; CHECK-LABEL: 'store_with_pointer_phi_outside_loop_select'
414; CHECK-NEXT:    loop.header:
415; 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
416; CHECK-NEXT:  Unknown data dependence.
417; CHECK-NEXT:      Dependences:
418; CHECK-NEXT:        Unknown:
419; CHECK-NEXT:            %v8 = load double, ptr %arrayidx, align 8 ->
420; CHECK-NEXT:            store double %mul16, ptr %ptr, align 8
421; CHECK-EMPTY:
422; CHECK-NEXT:      Run-time memory checks:
423; CHECK-NEXT:      Grouped accesses:
424; CHECK-EMPTY:
425; CHECK-NEXT:      Non vectorizable stores to invariant address were not found in loop.
426; CHECK-NEXT:      SCEV assumptions:
427; CHECK-EMPTY:
428; CHECK-NEXT:      Expressions re-written:
429;
430entry:
431  br i1 %c.0, label %if.then, label %if.else
432
433if.then:
434  br label %loop.ph
435
436if.else:
437  %ptr.select = select i1 %c.1, ptr %C, ptr %B
438  br label %loop.ph
439
440loop.ph:
441  %ptr = phi ptr [ %A, %if.then ], [ %ptr.select, %if.else ]
442  br label %loop.header
443
444loop.header:                                        ; preds = %loop.latch, %entry
445  %iv = phi i64 [ 0, %loop.ph ], [ %iv.next, %loop.header ]
446  %iv.next = add nuw nsw i64 %iv, 1
447  %arrayidx = getelementptr inbounds double, ptr %A, i64 %iv
448  %v8 = load double, ptr %arrayidx, align 8
449  %mul16 = fmul double 3.0, %v8
450  store double %mul16, ptr %ptr, align 8
451  %exitcond.not = icmp eq i64 %iv.next, 32000
452  br i1 %exitcond.not, label %exit, label %loop.header
453
454exit:                                             ; preds = %loop.latch
455  ret i32 10
456}
457
458define i32 @store_with_pointer_phi_in_same_bb_use_other_phi(ptr %A, ptr %B, ptr %C, ptr %D, i1 %c.0, i1 %c.1) {
459; CHECK-LABEL: 'store_with_pointer_phi_in_same_bb_use_other_phi'
460; CHECK-NEXT:    loop.header:
461; CHECK-NEXT:      Report: cannot identify array bounds
462; CHECK-NEXT:      Dependences:
463; CHECK-NEXT:      Run-time memory checks:
464; CHECK-NEXT:      Grouped accesses:
465; CHECK-EMPTY:
466; CHECK-NEXT:      Non vectorizable stores to invariant address were not found in loop.
467; CHECK-NEXT:      SCEV assumptions:
468; CHECK-EMPTY:
469; CHECK-NEXT:      Expressions re-written:
470;
471entry:
472  br label %loop.header
473
474loop.header:                                        ; preds = %loop.latch, %entry
475  %ptr.0 = phi ptr [ %C, %entry ], [ %D, %loop.header ]
476  %ptr.1 = phi ptr [ %B, %entry ], [ %ptr.0, %loop.header ]
477  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.header ]
478  %iv.next = add nuw nsw i64 %iv, 1
479  %arrayidx = getelementptr inbounds double, ptr %A, i64 %iv
480  %v8 = load double, ptr %arrayidx, align 8
481  %mul16 = fmul double 3.0, %v8
482  store double %mul16, ptr %ptr.1, align 8
483  %exitcond.not = icmp eq i64 %iv.next, 32000
484  br i1 %exitcond.not, label %exit, label %loop.header
485
486exit:                                             ; preds = %loop.latch
487  ret i32 10
488}
489
490define void @phi_load_store_memdep_check(i1 %c, ptr %A, ptr %B, ptr %C) {
491; CHECK-LABEL: 'phi_load_store_memdep_check'
492; CHECK-NEXT:    for.body:
493; 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
494; CHECK-NEXT:  Unknown data dependence.
495; CHECK-NEXT:      Dependences:
496; CHECK-NEXT:        Unknown:
497; CHECK-NEXT:            %lv3 = load i16, ptr %c.sink, align 2 ->
498; CHECK-NEXT:            store i16 %add, ptr %c.sink, align 1
499; CHECK-EMPTY:
500; CHECK-NEXT:        Unknown:
501; CHECK-NEXT:            %lv3 = load i16, ptr %c.sink, align 2 ->
502; CHECK-NEXT:            store i16 %add, ptr %c.sink, align 1
503; CHECK-EMPTY:
504; CHECK-NEXT:      Run-time memory checks:
505; CHECK-NEXT:      Check 0:
506; CHECK-NEXT:        Comparing group ([[GRP10:0x[0-9a-f]+]]):
507; CHECK-NEXT:        ptr %A
508; CHECK-NEXT:        ptr %A
509; CHECK-NEXT:        Against group ([[GRP11:0x[0-9a-f]+]]):
510; CHECK-NEXT:        ptr %C
511; CHECK-NEXT:        ptr %C
512; CHECK-NEXT:      Check 1:
513; CHECK-NEXT:        Comparing group ([[GRP10]]):
514; CHECK-NEXT:        ptr %A
515; CHECK-NEXT:        ptr %A
516; CHECK-NEXT:        Against group ([[GRP12:0x[0-9a-f]+]]):
517; CHECK-NEXT:        ptr %B
518; CHECK-NEXT:        ptr %B
519; CHECK-NEXT:      Check 2:
520; CHECK-NEXT:        Comparing group ([[GRP11]]):
521; CHECK-NEXT:        ptr %C
522; CHECK-NEXT:        ptr %C
523; CHECK-NEXT:        Against group ([[GRP12]]):
524; CHECK-NEXT:        ptr %B
525; CHECK-NEXT:        ptr %B
526; CHECK-NEXT:      Grouped accesses:
527; CHECK-NEXT:        Group [[GRP10]]:
528; CHECK-NEXT:          (Low: %A High: (2 + %A))
529; CHECK-NEXT:            Member: %A
530; CHECK-NEXT:            Member: %A
531; CHECK-NEXT:        Group [[GRP11]]:
532; CHECK-NEXT:          (Low: %C High: (2 + %C))
533; CHECK-NEXT:            Member: %C
534; CHECK-NEXT:            Member: %C
535; CHECK-NEXT:        Group [[GRP12]]:
536; CHECK-NEXT:          (Low: %B High: (2 + %B))
537; CHECK-NEXT:            Member: %B
538; CHECK-NEXT:            Member: %B
539; CHECK-EMPTY:
540; CHECK-NEXT:      Non vectorizable stores to invariant address were found in loop.
541; CHECK-NEXT:      SCEV assumptions:
542; CHECK-EMPTY:
543; CHECK-NEXT:      Expressions re-written:
544;
545entry:
546  br label %for.body
547
548for.body:                                         ; preds = %if.end, %entry
549  %iv = phi i16 [ 0, %entry ], [ %iv.next, %if.end ]
550  %lv = load i16, ptr %A, align 1
551  store i16 %lv, ptr %A, align 1
552  br i1 %c, label %if.then, label %if.end
553
554if.then:                                          ; preds = %for.body
555  %lv2 = load i16, ptr %A, align 1
556  br label %if.end
557
558if.end:                                           ; preds = %if.then, %for.body
559  %c.sink = phi ptr [ %B, %if.then ], [ %C, %for.body ]
560  %lv3 = load i16, ptr %c.sink
561  %add = add i16 %lv3, 10
562  store i16 %add, ptr %c.sink, align 1
563  %iv.next = add nuw nsw i16 %iv, 1
564  %tobool.not = icmp eq i16 %iv.next, 1000
565  br i1 %tobool.not, label %for.end.loopexit, label %for.body
566
567for.end.loopexit:                                 ; preds = %if.end
568  ret void
569}
570