1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
2; RUN: opt -passes='print<access-info>' < %s -disable-output 2>&1 | FileCheck %s
3
4define void @laa(ptr nocapture readonly %Base1, ptr nocapture readonly %Base2, ptr %Dest) {
5; CHECK-LABEL: 'laa'
6; CHECK-NEXT:    loop:
7; CHECK-NEXT:      Memory dependences are safe with run-time checks
8; CHECK-NEXT:      Dependences:
9; CHECK-NEXT:      Run-time memory checks:
10; CHECK-NEXT:      Check 0:
11; CHECK-NEXT:        Comparing group ([[GRP1:0x[0-9a-f]+]]):
12; CHECK-NEXT:          %gep.Dest = getelementptr inbounds float, ptr %Dest, i64 %iv
13; CHECK-NEXT:          %gep.Dest = getelementptr inbounds float, ptr %Dest, i64 %iv
14; CHECK-NEXT:        Against group ([[GRP2:0x[0-9a-f]+]]):
15; CHECK-NEXT:          %select = select i1 %cmp, ptr %gep.1, ptr %gep.2
16; CHECK-NEXT:      Check 1:
17; CHECK-NEXT:        Comparing group ([[GRP1]]):
18; CHECK-NEXT:          %gep.Dest = getelementptr inbounds float, ptr %Dest, i64 %iv
19; CHECK-NEXT:          %gep.Dest = getelementptr inbounds float, ptr %Dest, i64 %iv
20; CHECK-NEXT:        Against group ([[GRP3:0x[0-9a-f]+]]):
21; CHECK-NEXT:          %select = select i1 %cmp, ptr %gep.1, ptr %gep.2
22; CHECK-NEXT:      Grouped accesses:
23; CHECK-NEXT:        Group [[GRP1]]:
24; CHECK-NEXT:          (Low: %Dest High: (400 + %Dest))
25; CHECK-NEXT:            Member: {%Dest,+,4}<nuw><%loop>
26; CHECK-NEXT:            Member: {%Dest,+,4}<nuw><%loop>
27; CHECK-NEXT:        Group [[GRP2]]:
28; CHECK-NEXT:          (Low: %Base1 High: (400 + %Base1))
29; CHECK-NEXT:            Member: {%Base1,+,4}<nw><%loop>
30; CHECK-NEXT:        Group [[GRP3]]:
31; CHECK-NEXT:          (Low: %Base2 High: (400 + %Base2))
32; CHECK-NEXT:            Member: {%Base2,+,4}<nw><%loop>
33; CHECK-EMPTY:
34; CHECK-NEXT:      Non vectorizable stores to invariant address were not found in loop.
35; CHECK-NEXT:      SCEV assumptions:
36; CHECK-EMPTY:
37; CHECK-NEXT:      Expressions re-written:
38;
39entry:
40  br label %loop
41
42loop:
43  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
44  %gep.Dest = getelementptr inbounds float, ptr %Dest, i64 %iv
45  %l.Dest = load float, ptr %gep.Dest
46  %cmp = fcmp une float %l.Dest, 0.0
47  %gep.1 = getelementptr inbounds float, ptr %Base1, i64 %iv
48  %gep.2 = getelementptr inbounds float, ptr %Base2, i64 %iv
49  %select = select i1 %cmp, ptr %gep.1, ptr %gep.2
50  %sink = load float, ptr %select, align 4
51  store float %sink, ptr %gep.Dest, align 4
52  %iv.next = add nuw nsw i64 %iv, 1
53  %exitcond.not = icmp eq i64 %iv.next, 100
54  br i1 %exitcond.not, label %exit, label %loop
55
56exit:
57  ret void
58}
59
60define void @test_brace_escapes(ptr noundef %arr) {
61; CHECK-LABEL: 'test_brace_escapes'
62; CHECK-NEXT:    loop.1:
63; CHECK-NEXT:      Report: could not determine number of loop iterations
64; CHECK-NEXT:      Dependences:
65; CHECK-NEXT:      Run-time memory checks:
66; CHECK-NEXT:      Grouped accesses:
67; CHECK-EMPTY:
68; CHECK-NEXT:      Non vectorizable stores to invariant address were not found in loop.
69; CHECK-NEXT:      SCEV assumptions:
70; CHECK-EMPTY:
71; CHECK-NEXT:      Expressions re-written:
72; CHECK-NEXT:    loop.2:
73; CHECK-NEXT:      Memory dependences are safe with run-time checks
74; CHECK-NEXT:      Dependences:
75; CHECK-NEXT:      Run-time memory checks:
76; CHECK-NEXT:      Check 0:
77; CHECK-NEXT:        Comparing group ([[GRP4:0x[0-9a-f]+]]):
78; CHECK-NEXT:          %gep.iv.2 = getelementptr inbounds ptr, ptr %arr, i64 %iv.2
79; CHECK-NEXT:        Against group ([[GRP5:0x[0-9a-f]+]]):
80; CHECK-NEXT:          %gep.iv.1 = getelementptr inbounds ptr, ptr %arr, i64 %iv.1
81; CHECK-NEXT:      Grouped accesses:
82; CHECK-NEXT:        Group [[GRP4]]:
83; CHECK-NEXT:          (Low: {(64 + %arr),+,64}<%loop.1> High: {(8064 + %arr),+,64}<%loop.1>)
84; CHECK-NEXT:            Member: {{\{\{}}(64 + %arr),+,64}<%loop.1>,+,8}<%loop.2>
85; CHECK-NEXT:        Group [[GRP5]]:
86; CHECK-NEXT:          (Low: %arr High: (8000 + %arr))
87; CHECK-NEXT:            Member: {%arr,+,8}<nuw><%loop.2>
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.1
96
97loop.1:
98  %iv = phi i64 [ %iv.next, %loop.1 ], [ 8, %entry ]
99  %arr.addr.0.i = phi ptr [ %incdec.ptr.i, %loop.1 ], [ %arr, %entry ]
100  %incdec.ptr.i = getelementptr inbounds ptr, ptr %arr.addr.0.i, i64 1
101  %0 = load ptr, ptr %arr.addr.0.i, align 8
102  %tobool.not.i = icmp eq ptr %0, null
103  %iv.next = add i64 %iv, 8
104  br i1 %tobool.not.i, label %loop.1.exit, label %loop.1
105
106loop.1.exit:
107  %iv.lcssa = phi i64 [ %iv, %loop.1 ]
108  br label %loop.2
109
110loop.2:
111  %iv.1 = phi i64 [ 0, %loop.1.exit ], [ %iv.1.next, %loop.2 ]
112  %iv.2 = phi i64 [ %iv.lcssa, %loop.1.exit ], [ %iv.2.next, %loop.2 ]
113  %gep.iv.1 = getelementptr inbounds ptr, ptr %arr, i64 %iv.1
114  %l.1 = load ptr, ptr %gep.iv.1, align 8
115  %iv.2.next = add nsw i64 %iv.2, 1
116  %gep.iv.2 = getelementptr inbounds ptr, ptr %arr, i64 %iv.2
117  store ptr %l.1, ptr %gep.iv.2, align 8
118  %iv.1.next = add nuw nsw i64 %iv.1, 1
119  %cmp = icmp ult i64 %iv.1.next, 1000
120  br i1 %cmp, label %loop.2, label %exit
121
122exit:
123  ret void
124}
125
126