@@ -194,3 +194,84 @@ loop:
194194exit:
195195 ret void
196196}
197+
198+ ; In the following test, the source is loop-invariant.
199+
200+ define void @type_size_equivalence_src_loopinv (ptr nocapture %vec , i64 %n ) {
201+ ; CHECK-LABEL: 'type_size_equivalence_src_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+ br label %loop
215+
216+ loop:
217+ %iv = phi i64 [ 0 , %entry ], [ %iv.next , %loop ]
218+
219+ %gep.iv = getelementptr i64 , ptr %vec , i64 %iv
220+ %ld.i64 = load i64 , ptr %gep.iv , align 8
221+
222+ %gep.n = getelementptr inbounds i64 , ptr %vec , i64 %n
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_src_loopinv_negind (ptr nocapture %vec , i64 %n ) {
238+ ; CHECK-LABEL: 'type_size_equivalence_src_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+ br label %loop
257+
258+ loop:
259+ %iv = phi i64 [ 0 , %entry ], [ %iv.next , %loop ]
260+
261+ %minus.iv = sub nsw i64 0 , %iv
262+ %gep.minus.iv = getelementptr i64 , ptr %vec , i64 %minus.iv
263+ %gep.minus.iv.4 = getelementptr i8 , ptr %gep.minus.iv , i64 -4
264+ %ld.i64 = load i64 , ptr %gep.minus.iv.4 , align 8
265+
266+ %minus.n = sub nsw i64 0 , %n
267+ %gep.minus.n = getelementptr inbounds i64 , ptr %vec , i64 %minus.n
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