@@ -194,3 +194,84 @@ loop:
194
194
exit:
195
195
ret void
196
196
}
197
+
198
+ ; In the following test, the sink is loop-invariant.
199
+
200
+ define void @type_size_equivalence_sink_loopinv (ptr nocapture %vec , i64 %n ) {
201
+ ; CHECK-LABEL: 'type_size_equivalence_sink_loopinv'
202
+ ; CHECK-NEXT: loop:
203
+ ; CHECK-NEXT: Memory dependences are safe
204
+ ; CHECK-NEXT: Dependences:
205
+ ; CHECK-NEXT: Run-time memory checks:
206
+ ; CHECK-NEXT: Grouped accesses:
207
+ ; CHECK-EMPTY:
208
+ ; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
209
+ ; CHECK-NEXT: SCEV assumptions:
210
+ ; CHECK-EMPTY:
211
+ ; CHECK-NEXT: Expressions re-written:
212
+ ;
213
+ entry:
214
+ %gep.n = getelementptr inbounds i64 , ptr %vec , i64 %n
215
+ br label %loop
216
+
217
+ loop:
218
+ %iv = phi i64 [ 0 , %entry ], [ %iv.next , %loop ]
219
+
220
+ %gep.iv = getelementptr i64 , ptr %vec , i64 %iv
221
+ %ld.i64 = load i64 , ptr %gep.iv , align 8
222
+
223
+ %ld.i64.i32 = trunc i64 %ld.i64 to i32
224
+ store i32 %ld.i64.i32 , ptr %gep.n , align 8
225
+
226
+ %iv.next = add nuw nsw i64 %iv , 1
227
+ %cond = icmp eq i64 %iv.next , %n
228
+ br i1 %cond , label %exit , label %loop
229
+
230
+ exit:
231
+ ret void
232
+ }
233
+
234
+ ; Variant of the above, with a negative induction step and a gep exposing
235
+ ; type-mismtach.
236
+
237
+ define void @type_size_equivalence_sink_loopinv_negind (ptr nocapture %vec , i64 %n ) {
238
+ ; CHECK-LABEL: 'type_size_equivalence_sink_loopinv_negind'
239
+ ; CHECK-NEXT: loop:
240
+ ; 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
241
+ ; CHECK-NEXT: Unknown data dependence.
242
+ ; CHECK-NEXT: Dependences:
243
+ ; CHECK-NEXT: Unknown:
244
+ ; CHECK-NEXT: %ld.i64 = load i64, ptr %gep.minus.iv.4, align 8 ->
245
+ ; CHECK-NEXT: store i32 %ld.i64.i32, ptr %gep.minus.n, align 8
246
+ ; CHECK-EMPTY:
247
+ ; CHECK-NEXT: Run-time memory checks:
248
+ ; CHECK-NEXT: Grouped accesses:
249
+ ; CHECK-EMPTY:
250
+ ; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
251
+ ; CHECK-NEXT: SCEV assumptions:
252
+ ; CHECK-EMPTY:
253
+ ; CHECK-NEXT: Expressions re-written:
254
+ ;
255
+ entry:
256
+ %minus.n = sub nsw i64 0 , %n
257
+ %gep.minus.n = getelementptr inbounds i64 , ptr %vec , i64 %minus.n
258
+ br label %loop
259
+
260
+ loop:
261
+ %iv = phi i64 [ 0 , %entry ], [ %iv.next , %loop ]
262
+
263
+ %minus.iv = sub nsw i64 0 , %iv
264
+ %gep.minus.iv = getelementptr i64 , ptr %vec , i64 %minus.iv
265
+ %gep.minus.iv.4 = getelementptr i8 , ptr %gep.minus.iv , i64 -4
266
+ %ld.i64 = load i64 , ptr %gep.minus.iv.4 , align 8
267
+
268
+ %ld.i64.i32 = trunc i64 %ld.i64 to i32
269
+ store i32 %ld.i64.i32 , ptr %gep.minus.n , align 8
270
+
271
+ %iv.next = add nuw nsw i64 %iv , 1
272
+ %cond = icmp eq i64 %iv.next , %n
273
+ br i1 %cond , label %exit , label %loop
274
+
275
+ exit:
276
+ ret void
277
+ }
0 commit comments