xref: /llvm-project/llvm/test/Analysis/LoopAccessAnalysis/early-exit-runtime-checks.ll (revision e949b54a5b7cd7cd0690fa126be3363a21f05a8e)
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5
2; RUN: opt -passes='print<access-info>' -disable-output %s 2>&1 | FileCheck %s
3
4define void @all_exits_dominate_latch_countable_exits_at_most_500_iterations(ptr %A, ptr %B) {
5; CHECK-LABEL: 'all_exits_dominate_latch_countable_exits_at_most_500_iterations'
6; CHECK-NEXT:    loop.header:
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.B = getelementptr inbounds i32, ptr %B, i64 %iv
13; CHECK-NEXT:        Against group ([[GRP2:0x[0-9a-f]+]]):
14; CHECK-NEXT:          %gep.A = getelementptr inbounds i32, ptr %A, i64 %iv
15; CHECK-NEXT:      Grouped accesses:
16; CHECK-NEXT:        Group [[GRP1]]:
17; CHECK-NEXT:          (Low: %B High: (2000 + %B))
18; CHECK-NEXT:            Member: {%B,+,4}<nuw><%loop.header>
19; CHECK-NEXT:        Group [[GRP2]]:
20; CHECK-NEXT:          (Low: %A High: (2000 + %A))
21; CHECK-NEXT:            Member: {%A,+,4}<nuw><%loop.header>
22; CHECK-EMPTY:
23; CHECK-NEXT:      Non vectorizable stores to invariant address were not found in loop.
24; CHECK-NEXT:      SCEV assumptions:
25; CHECK-EMPTY:
26; CHECK-NEXT:      Expressions re-written:
27;
28entry:
29  br label %loop.header
30
31loop.header:
32  %iv = phi i64 [ 0, %entry ], [ %iv.next, %latch ]
33  %gep.A = getelementptr inbounds i32, ptr %A, i64 %iv
34  %gep.B = getelementptr inbounds i32, ptr %B, i64 %iv
35  %l = load i32, ptr %gep.A, align 4
36  store i32 0, ptr %gep.B, align 4
37  %cntable.c.1 = icmp ult i64 %iv, 1000
38  %iv.next = add nuw nsw i64 %iv, 1
39  br i1 %cntable.c.1, label %b2, label %e.1
40
41b2:
42  %uncntable.c.0 = icmp eq i32 %l, 0
43  br i1 %uncntable.c.0, label %e.2, label %b3
44
45b3:
46  %cntable.c.2 = icmp eq i64 %iv.next, 500
47  br i1 %cntable.c.2, label %cleanup4, label %latch
48
49latch:
50  br label %loop.header
51
52cleanup4:
53  ret void
54
55e.1:
56  ret void
57e.2:
58  ret void
59
60}
61
62
63
64define i32 @all_exits_dominate_latch_countable_exits_at_most_1000_iterations(ptr %A, ptr %B) {
65; CHECK-LABEL: 'all_exits_dominate_latch_countable_exits_at_most_1000_iterations'
66; CHECK-NEXT:    loop.header:
67; CHECK-NEXT:      Memory dependences are safe with run-time checks
68; CHECK-NEXT:      Dependences:
69; CHECK-NEXT:      Run-time memory checks:
70; CHECK-NEXT:      Check 0:
71; CHECK-NEXT:        Comparing group ([[GRP3:0x[0-9a-f]+]]):
72; CHECK-NEXT:          %gep.B = getelementptr inbounds i32, ptr %B, i64 %iv
73; CHECK-NEXT:        Against group ([[GRP4:0x[0-9a-f]+]]):
74; CHECK-NEXT:          %gep.A = getelementptr inbounds i32, ptr %A, i64 %iv
75; CHECK-NEXT:      Grouped accesses:
76; CHECK-NEXT:        Group [[GRP3]]:
77; CHECK-NEXT:          (Low: %B High: (4004 + %B))
78; CHECK-NEXT:            Member: {%B,+,4}<nuw><%loop.header>
79; CHECK-NEXT:        Group [[GRP4]]:
80; CHECK-NEXT:          (Low: %A High: (4004 + %A))
81; CHECK-NEXT:            Member: {%A,+,4}<nuw><%loop.header>
82; CHECK-EMPTY:
83; CHECK-NEXT:      Non vectorizable stores to invariant address were not found in loop.
84; CHECK-NEXT:      SCEV assumptions:
85; CHECK-EMPTY:
86; CHECK-NEXT:      Expressions re-written:
87;
88entry:
89  br label %loop.header
90
91loop.header:
92  %iv = phi i64 [ 0, %entry ], [ %iv.next, %latch ]
93  %gep.A = getelementptr inbounds i32, ptr %A, i64 %iv
94  %gep.B = getelementptr inbounds i32, ptr %B, i64 %iv
95  %l = load i32, ptr %gep.A, align 4
96  store i32 0, ptr %gep.B, align 4
97  %cntable.c.1 = icmp ult i64 %iv, 1000
98  br i1 %cntable.c.1, label %b2, label %e.1
99
100b2:
101  %uncntable.c.0 = icmp eq i32 %l, 0
102  br i1 %uncntable.c.0, label %e.2, label %b3
103
104b3:
105  %iv.next = add nuw nsw i64 %iv, 1
106  %cntable.c.2 = icmp eq i64 %iv.next, 2000
107  br i1 %cntable.c.2, label %e.0, label %latch
108
109latch:
110  br label %loop.header
111
112e.0:
113  ret i32 0
114
115e.1:
116  ret i32 1
117
118e.2:
119  ret i32 2
120}
121
122
123define i32 @not_all_exits_dominate_latch(ptr %A, ptr %B) {
124; CHECK-LABEL: 'not_all_exits_dominate_latch'
125; CHECK-NEXT:    loop.header:
126; CHECK-NEXT:      Report: could not determine number of loop iterations
127; CHECK-NEXT:      Dependences:
128; CHECK-NEXT:      Run-time memory checks:
129; CHECK-NEXT:      Grouped accesses:
130; CHECK-EMPTY:
131; CHECK-NEXT:      Non vectorizable stores to invariant address were not found in loop.
132; CHECK-NEXT:      SCEV assumptions:
133; CHECK-EMPTY:
134; CHECK-NEXT:      Expressions re-written:
135;
136entry:
137  br label %loop.header
138
139loop.header:
140  %iv = phi i64 [ 0, %entry ], [ %iv.next, %latch ]
141  %gep.A = getelementptr inbounds i32, ptr %A, i64 %iv
142  %gep.B = getelementptr inbounds i32, ptr %B, i64 %iv
143  %l = load i32, ptr %gep.A, align 4
144  store i32 0, ptr %gep.B, align 4
145  %cntable.c.1 = icmp ult i64 %iv, 1000
146  %iv.next = add nuw nsw i64 %iv, 1
147  br i1 %cntable.c.1, label %b2, label %latch
148
149b2:
150  %uncntable.c.0 = icmp eq i32 %l, 0
151  br i1 %uncntable.c.0, label %e.2, label %b3
152
153b3:
154  %cntable.c.2 = icmp eq i64 %iv.next, 2000
155  br i1 %cntable.c.2, label %e.0, label %latch
156
157latch:
158  br label %loop.header
159
160e.0:
161  ret i32 0
162
163e.2:
164  ret i32 1
165}
166
167define i32 @b3_does_not_dominate_latch(ptr %A, ptr %B) {
168; CHECK-LABEL: 'b3_does_not_dominate_latch'
169; CHECK-NEXT:    loop.header:
170; CHECK-NEXT:      Memory dependences are safe with run-time checks
171; CHECK-NEXT:      Dependences:
172; CHECK-NEXT:      Run-time memory checks:
173; CHECK-NEXT:      Check 0:
174; CHECK-NEXT:        Comparing group ([[GRP5:0x[0-9a-f]+]]):
175; CHECK-NEXT:          %gep.B = getelementptr inbounds i32, ptr %B, i64 %iv
176; CHECK-NEXT:        Against group ([[GRP6:0x[0-9a-f]+]]):
177; CHECK-NEXT:          %gep.A = getelementptr inbounds i32, ptr %A, i64 %iv
178; CHECK-NEXT:      Grouped accesses:
179; CHECK-NEXT:        Group [[GRP5]]:
180; CHECK-NEXT:          (Low: %B High: (4004 + %B))
181; CHECK-NEXT:            Member: {%B,+,4}<nuw><%loop.header>
182; CHECK-NEXT:        Group [[GRP6]]:
183; CHECK-NEXT:          (Low: %A High: (4004 + %A))
184; CHECK-NEXT:            Member: {%A,+,4}<nuw><%loop.header>
185; CHECK-EMPTY:
186; CHECK-NEXT:      Non vectorizable stores to invariant address were not found in loop.
187; CHECK-NEXT:      SCEV assumptions:
188; CHECK-EMPTY:
189; CHECK-NEXT:      Expressions re-written:
190;
191entry:
192  br label %loop.header
193
194loop.header:
195  %iv = phi i64 [ 0, %entry ], [ %iv.next, %latch ]
196  %gep.A = getelementptr inbounds i32, ptr %A, i64 %iv
197  %gep.B = getelementptr inbounds i32, ptr %B, i64 %iv
198  %l = load i32, ptr %gep.A, align 4
199  store i32 0, ptr %gep.B, align 4
200  %cntable.c.1 = icmp ult i64 %iv, 1000
201  %iv.next = add nuw nsw i64 %iv, 1
202  br i1 %cntable.c.1, label %b2, label %e.1
203
204b2:
205  %uncntable.c.0 = icmp eq i32 %l, 0
206  br i1 %uncntable.c.0, label %latch, label %b3
207
208b3:
209  %cntable.c.2 = icmp eq i64 %iv.next, 500
210  br i1 %cntable.c.2, label %e.0, label %latch
211
212latch:
213  br label %loop.header
214
215e.0:
216  ret i32 0
217
218e.1:
219  ret i32 1
220}
221