59
59
ret void
60
60
}
61
61
62
+ define void @all_exits_dominate_latch_countable_exits_at_most_501_iterations_known_deref (ptr dereferenceable (2000 ) %A , ptr dereferenceable (2000 ) %B ) {
63
+ ; CHECK-LABEL: 'all_exits_dominate_latch_countable_exits_at_most_501_iterations_known_deref'
64
+ ; CHECK-NEXT: loop.header:
65
+ ; CHECK-NEXT: Memory dependences are safe with run-time checks
66
+ ; CHECK-NEXT: Dependences:
67
+ ; CHECK-NEXT: Run-time memory checks:
68
+ ; CHECK-NEXT: Check 0:
69
+ ; CHECK-NEXT: Comparing group GRP0:
70
+ ; CHECK-NEXT: %gep.B = getelementptr inbounds i32, ptr %B, i64 %iv
71
+ ; CHECK-NEXT: Against group GRP1:
72
+ ; CHECK-NEXT: %gep.A = getelementptr inbounds i32, ptr %A, i64 %iv
73
+ ; CHECK-NEXT: Grouped accesses:
74
+ ; CHECK-NEXT: Group GRP0:
75
+ ; CHECK-NEXT: (Low: %B High: (2004 + %B))
76
+ ; CHECK-NEXT: Member: {%B,+,4}<nuw><%loop.header>
77
+ ; CHECK-NEXT: Group GRP1:
78
+ ; CHECK-NEXT: (Low: %A High: (2004 + %A))
79
+ ; CHECK-NEXT: Member: {%A,+,4}<nuw><%loop.header>
80
+ ; CHECK-EMPTY:
81
+ ; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
82
+ ; CHECK-NEXT: SCEV assumptions:
83
+ ; CHECK-EMPTY:
84
+ ; CHECK-NEXT: Expressions re-written:
85
+ ;
86
+ entry:
87
+ br label %loop.header
88
+
89
+ loop.header:
90
+ %iv = phi i64 [ 0 , %entry ], [ %iv.next , %latch ]
91
+ %gep.A = getelementptr inbounds i32 , ptr %A , i64 %iv
92
+ %gep.B = getelementptr inbounds i32 , ptr %B , i64 %iv
93
+ %l = load i32 , ptr %gep.A , align 4
94
+ store i32 0 , ptr %gep.B , align 4
95
+ %cntable.c.1 = icmp ult i64 %iv , 1000
96
+ %iv.next = add nuw nsw i64 %iv , 1
97
+ br i1 %cntable.c.1 , label %b2 , label %e.1
98
+
99
+ b2:
100
+ %uncntable.c.0 = icmp eq i32 %l , 0
101
+ br i1 %uncntable.c.0 , label %e.2 , label %b3
102
+
103
+ b3:
104
+ %cntable.c.2 = icmp eq i64 %iv.next , 501
105
+ br i1 %cntable.c.2 , label %cleanup4 , label %latch
106
+
107
+ latch:
108
+ br label %loop.header
109
+
110
+ cleanup4:
111
+ ret void
112
+
113
+ e.1 :
114
+ ret void
115
+
116
+ e.2 :
117
+ ret void
118
+ }
119
+
120
+
62
121
define void @all_exits_dominate_latch_countable_exits_at_most_500_iterations_not_known_deref (ptr %A , ptr %B ) {
63
122
; CHECK-LABEL: 'all_exits_dominate_latch_countable_exits_at_most_500_iterations_not_known_deref'
64
123
; CHECK-NEXT: loop.header:
@@ -130,6 +189,64 @@ define i32 @all_exits_dominate_latch_countable_exits_at_most_1000_iterations_kno
130
189
; CHECK-NEXT: %gep.A = getelementptr inbounds i32, ptr %A, i64 %iv
131
190
; CHECK-NEXT: Grouped accesses:
132
191
; CHECK-NEXT: Group GRP0:
192
+ ; CHECK-NEXT: (Low: %B High: (4000 + %B)<nuw>)
193
+ ; CHECK-NEXT: Member: {%B,+,4}<nuw><%loop.header>
194
+ ; CHECK-NEXT: Group GRP1:
195
+ ; CHECK-NEXT: (Low: %A High: (4000 + %A)<nuw>)
196
+ ; CHECK-NEXT: Member: {%A,+,4}<nuw><%loop.header>
197
+ ; CHECK-EMPTY:
198
+ ; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
199
+ ; CHECK-NEXT: SCEV assumptions:
200
+ ; CHECK-EMPTY:
201
+ ; CHECK-NEXT: Expressions re-written:
202
+ ;
203
+ entry:
204
+ br label %loop.header
205
+
206
+ loop.header:
207
+ %iv = phi i64 [ 0 , %entry ], [ %iv.next , %latch ]
208
+ %gep.A = getelementptr inbounds i32 , ptr %A , i64 %iv
209
+ %gep.B = getelementptr inbounds i32 , ptr %B , i64 %iv
210
+ %l = load i32 , ptr %gep.A , align 4
211
+ store i32 0 , ptr %gep.B , align 4
212
+ %cntable.c.1 = icmp ult i64 %iv , 999
213
+ br i1 %cntable.c.1 , label %b2 , label %e.1
214
+
215
+ b2:
216
+ %uncntable.c.0 = icmp eq i32 %l , 0
217
+ br i1 %uncntable.c.0 , label %e.2 , label %b3
218
+
219
+ b3:
220
+ %iv.next = add nuw nsw i64 %iv , 1
221
+ %cntable.c.2 = icmp eq i64 %iv.next , 2000
222
+ br i1 %cntable.c.2 , label %e.0 , label %latch
223
+
224
+ latch:
225
+ br label %loop.header
226
+
227
+ e.0 :
228
+ ret i32 0
229
+
230
+ e.1 :
231
+ ret i32 1
232
+
233
+ e.2 :
234
+ ret i32 2
235
+ }
236
+
237
+ define i32 @all_exits_dominate_latch_countable_exits_at_most_1001_iterations_known_deref (ptr dereferenceable (4000 ) %A , ptr dereferenceable (4000 ) %B ) {
238
+ ; CHECK-LABEL: 'all_exits_dominate_latch_countable_exits_at_most_1001_iterations_known_deref'
239
+ ; CHECK-NEXT: loop.header:
240
+ ; CHECK-NEXT: Memory dependences are safe with run-time checks
241
+ ; CHECK-NEXT: Dependences:
242
+ ; CHECK-NEXT: Run-time memory checks:
243
+ ; CHECK-NEXT: Check 0:
244
+ ; CHECK-NEXT: Comparing group GRP0:
245
+ ; CHECK-NEXT: %gep.B = getelementptr inbounds i32, ptr %B, i64 %iv
246
+ ; CHECK-NEXT: Against group GRP1:
247
+ ; CHECK-NEXT: %gep.A = getelementptr inbounds i32, ptr %A, i64 %iv
248
+ ; CHECK-NEXT: Grouped accesses:
249
+ ; CHECK-NEXT: Group GRP0:
133
250
; CHECK-NEXT: (Low: %B High: (4004 + %B))
134
251
; CHECK-NEXT: Member: {%B,+,4}<nuw><%loop.header>
135
252
; CHECK-NEXT: Group GRP1:
@@ -188,10 +305,10 @@ define i32 @all_exits_dominate_latch_countable_exits_at_most_1000_iterations_not
188
305
; CHECK-NEXT: %gep.A = getelementptr inbounds i32, ptr %A, i64 %iv
189
306
; CHECK-NEXT: Grouped accesses:
190
307
; CHECK-NEXT: Group GRP0:
191
- ; CHECK-NEXT: (Low: %B High: (4004 + %B))
308
+ ; CHECK-NEXT: (Low: %B High: (4000 + %B))
192
309
; CHECK-NEXT: Member: {%B,+,4}<nuw><%loop.header>
193
310
; CHECK-NEXT: Group GRP1:
194
- ; CHECK-NEXT: (Low: %A High: (4004 + %A))
311
+ ; CHECK-NEXT: (Low: %A High: (4000 + %A))
195
312
; CHECK-NEXT: Member: {%A,+,4}<nuw><%loop.header>
196
313
; CHECK-EMPTY:
197
314
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
@@ -208,7 +325,7 @@ loop.header:
208
325
%gep.B = getelementptr inbounds i32 , ptr %B , i64 %iv
209
326
%l = load i32 , ptr %gep.A , align 4
210
327
store i32 0 , ptr %gep.B , align 4
211
- %cntable.c.1 = icmp ult i64 %iv , 1000
328
+ %cntable.c.1 = icmp ult i64 %iv , 999
212
329
br i1 %cntable.c.1 , label %b2 , label %e.1
213
330
214
331
b2:
0 commit comments