Skip to content

Commit 5138ccd

Browse files
committed
[LAA] Add etra tests with strides with different signs.
Extra tests with strides with different signs for #88039.
1 parent 70abbd9 commit 5138ccd

File tree

1 file changed

+231
-0
lines changed

1 file changed

+231
-0
lines changed

llvm/test/Analysis/LoopAccessAnalysis/non-constant-strides-forward.ll

Lines changed: 231 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,3 +180,234 @@ loop:
180180
exit:
181181
ret void
182182
}
183+
184+
; Tests with accesses with strides with different signs.
185+
define void @strides_with_different_directions_1(ptr %A) {
186+
; CHECK-LABEL: 'strides_with_different_directions_1'
187+
; CHECK-NEXT: loop:
188+
; 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
189+
; CHECK-NEXT: Unknown data dependence.
190+
; CHECK-NEXT: Dependences:
191+
; CHECK-NEXT: Unknown:
192+
; CHECK-NEXT: %l = load i32, ptr %gep.mul.2, align 4 ->
193+
; CHECK-NEXT: store i32 %add, ptr %gep, align 4
194+
; CHECK-EMPTY:
195+
; CHECK-NEXT: Run-time memory checks:
196+
; CHECK-NEXT: Grouped accesses:
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
205+
206+
loop:
207+
%iv.1 = phi i64 [ 0, %entry ], [ %iv.1.next, %loop ]
208+
%iv.2 = phi i64 [ 300, %entry ], [ %iv.2.next, %loop ]
209+
%gep.mul.2 = getelementptr inbounds i32, ptr %A, i64 %iv.1
210+
%l = load i32, ptr %gep.mul.2, align 4
211+
%add = add nsw i32 %l, 5
212+
%gep = getelementptr inbounds i32, ptr %A, i64 %iv.2
213+
store i32 %add, ptr %gep, align 4
214+
%iv.1.next = add nuw nsw i64 %iv.1, 1
215+
%iv.2.next = add nsw i64 %iv.2, -1
216+
%exitcond.not = icmp eq i64 %iv.1.next, 256
217+
br i1 %exitcond.not, label %exit, label %loop
218+
219+
exit:
220+
ret void
221+
}
222+
223+
define void @strides_with_different_directions_2(ptr %A) {
224+
; CHECK-LABEL: 'strides_with_different_directions_2'
225+
; CHECK-NEXT: loop:
226+
; 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
227+
; CHECK-NEXT: Unknown data dependence.
228+
; CHECK-NEXT: Dependences:
229+
; CHECK-NEXT: Unknown:
230+
; CHECK-NEXT: %l = load i32, ptr %gep.mul.2, align 4 ->
231+
; CHECK-NEXT: store i32 %add, ptr %gep, align 4
232+
; CHECK-EMPTY:
233+
; CHECK-NEXT: Run-time memory checks:
234+
; CHECK-NEXT: Grouped accesses:
235+
; CHECK-EMPTY:
236+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
237+
; CHECK-NEXT: SCEV assumptions:
238+
; CHECK-EMPTY:
239+
; CHECK-NEXT: Expressions re-written:
240+
;
241+
entry:
242+
br label %loop
243+
244+
loop:
245+
%iv.1 = phi i64 [ 0, %entry ], [ %iv.1.next, %loop ]
246+
%iv.2 = phi i64 [ 300, %entry ], [ %iv.2.next, %loop ]
247+
%gep.mul.2 = getelementptr inbounds i32, ptr %A, i64 %iv.2
248+
%l = load i32, ptr %gep.mul.2, align 4
249+
%add = add nsw i32 %l, 5
250+
%gep = getelementptr inbounds i32, ptr %A, i64 %iv.1
251+
store i32 %add, ptr %gep, align 4
252+
%iv.1.next = add nuw nsw i64 %iv.1, 1
253+
%iv.2.next = add nsw i64 %iv.2, -1
254+
%exitcond.not = icmp eq i64 %iv.1.next, 256
255+
br i1 %exitcond.not, label %exit, label %loop
256+
257+
exit:
258+
ret void
259+
}
260+
261+
define void @strides_with_different_directions_3(ptr %A) {
262+
; CHECK-LABEL: 'strides_with_different_directions_3'
263+
; CHECK-NEXT: loop:
264+
; 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
265+
; CHECK-NEXT: Unknown data dependence.
266+
; CHECK-NEXT: Dependences:
267+
; CHECK-NEXT: Unknown:
268+
; CHECK-NEXT: %l = load i32, ptr %gep.mul.2, align 4 ->
269+
; CHECK-NEXT: store i32 %add, ptr %gep, align 4
270+
; CHECK-EMPTY:
271+
; CHECK-NEXT: Run-time memory checks:
272+
; CHECK-NEXT: Grouped accesses:
273+
; CHECK-EMPTY:
274+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
275+
; CHECK-NEXT: SCEV assumptions:
276+
; CHECK-EMPTY:
277+
; CHECK-NEXT: Expressions re-written:
278+
;
279+
entry:
280+
br label %loop
281+
282+
loop:
283+
%iv.1 = phi i64 [ 0, %entry ], [ %iv.1.next, %loop ]
284+
%iv.2 = phi i64 [ 600, %entry ], [ %iv.2.next, %loop ]
285+
%gep.mul.2 = getelementptr inbounds i32, ptr %A, i64 %iv.1
286+
%l = load i32, ptr %gep.mul.2, align 4
287+
%add = add nsw i32 %l, 5
288+
%gep = getelementptr inbounds i32, ptr %A, i64 %iv.2
289+
store i32 %add, ptr %gep, align 4
290+
%iv.1.next = add nuw nsw i64 %iv.1, 1
291+
%iv.2.next = add nsw i64 %iv.2, -2
292+
%exitcond.not = icmp eq i64 %iv.1.next, 256
293+
br i1 %exitcond.not, label %exit, label %loop
294+
295+
exit:
296+
ret void
297+
}
298+
299+
define void @strides_with_different_directions_4(ptr %A) {
300+
; CHECK-LABEL: 'strides_with_different_directions_4'
301+
; CHECK-NEXT: loop:
302+
; 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
303+
; CHECK-NEXT: Unknown data dependence.
304+
; CHECK-NEXT: Dependences:
305+
; CHECK-NEXT: Unknown:
306+
; CHECK-NEXT: %l = load i32, ptr %gep.mul.2, align 4 ->
307+
; CHECK-NEXT: store i32 %add, ptr %gep, align 4
308+
; CHECK-EMPTY:
309+
; CHECK-NEXT: Run-time memory checks:
310+
; CHECK-NEXT: Grouped accesses:
311+
; CHECK-EMPTY:
312+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
313+
; CHECK-NEXT: SCEV assumptions:
314+
; CHECK-EMPTY:
315+
; CHECK-NEXT: Expressions re-written:
316+
;
317+
entry:
318+
br label %loop
319+
320+
loop:
321+
%iv.1 = phi i64 [ 0, %entry ], [ %iv.1.next, %loop ]
322+
%iv.2 = phi i64 [ 600, %entry ], [ %iv.2.next, %loop ]
323+
%gep.mul.2 = getelementptr inbounds i32, ptr %A, i64 %iv.2
324+
%l = load i32, ptr %gep.mul.2, align 4
325+
%add = add nsw i32 %l, 5
326+
%gep = getelementptr inbounds i32, ptr %A, i64 %iv.1
327+
store i32 %add, ptr %gep, align 4
328+
%iv.1.next = add nuw nsw i64 %iv.1, 1
329+
%iv.2.next = add nsw i64 %iv.2, -2
330+
%exitcond.not = icmp eq i64 %iv.1.next, 256
331+
br i1 %exitcond.not, label %exit, label %loop
332+
333+
exit:
334+
ret void
335+
}
336+
337+
define void @non_constant_strides_with_different_directions_1(ptr %A) {
338+
; CHECK-LABEL: 'non_constant_strides_with_different_directions_1'
339+
; CHECK-NEXT: loop:
340+
; 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
341+
; CHECK-NEXT: Unknown data dependence.
342+
; CHECK-NEXT: Dependences:
343+
; CHECK-NEXT: Unknown:
344+
; CHECK-NEXT: %l = load i32, ptr %gep.mul.2, align 4 ->
345+
; CHECK-NEXT: store i32 %add, ptr %gep, align 4
346+
; CHECK-EMPTY:
347+
; CHECK-NEXT: Run-time memory checks:
348+
; CHECK-NEXT: Grouped accesses:
349+
; CHECK-EMPTY:
350+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
351+
; CHECK-NEXT: SCEV assumptions:
352+
; CHECK-EMPTY:
353+
; CHECK-NEXT: Expressions re-written:
354+
;
355+
entry:
356+
br label %loop
357+
358+
loop:
359+
%iv.1 = phi i64 [ 0, %entry ], [ %iv.1.next, %loop ]
360+
%iv.2 = phi i64 [ 300, %entry ], [ %iv.2.next, %loop ]
361+
%iv.mul.2 = shl nuw nsw i64 %iv.1, 1
362+
%gep.mul.2 = getelementptr inbounds i32, ptr %A, i64 %iv.mul.2
363+
%l = load i32, ptr %gep.mul.2, align 4
364+
%add = add nsw i32 %l, 5
365+
%gep = getelementptr inbounds i32, ptr %A, i64 %iv.2
366+
store i32 %add, ptr %gep, align 4
367+
%iv.1.next = add nuw nsw i64 %iv.1, 1
368+
%iv.2.next = add nsw i64 %iv.2, -1
369+
%exitcond.not = icmp eq i64 %iv.1.next, 256
370+
br i1 %exitcond.not, label %exit, label %loop
371+
372+
exit:
373+
ret void
374+
}
375+
376+
define void @non_constant_strides_with_different_directions_2(ptr %A) {
377+
; CHECK-LABEL: 'non_constant_strides_with_different_directions_2'
378+
; CHECK-NEXT: loop:
379+
; 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
380+
; CHECK-NEXT: Unknown data dependence.
381+
; CHECK-NEXT: Dependences:
382+
; CHECK-NEXT: Unknown:
383+
; CHECK-NEXT: %l = load i32, ptr %gep.mul.2, align 4 ->
384+
; CHECK-NEXT: store i32 %add, ptr %gep, align 4
385+
; CHECK-EMPTY:
386+
; CHECK-NEXT: Run-time memory checks:
387+
; CHECK-NEXT: Grouped accesses:
388+
; CHECK-EMPTY:
389+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
390+
; CHECK-NEXT: SCEV assumptions:
391+
; CHECK-EMPTY:
392+
; CHECK-NEXT: Expressions re-written:
393+
;
394+
entry:
395+
br label %loop
396+
397+
loop:
398+
%iv.1 = phi i64 [ 0, %entry ], [ %iv.1.next, %loop ]
399+
%iv.2 = phi i64 [ 300, %entry ], [ %iv.2.next, %loop ]
400+
%iv.mul.2 = shl nuw nsw i64 %iv.2, 1
401+
%gep.mul.2 = getelementptr inbounds i32, ptr %A, i64 %iv.mul.2
402+
%l = load i32, ptr %gep.mul.2, align 4
403+
%add = add nsw i32 %l, 5
404+
%gep = getelementptr inbounds i32, ptr %A, i64 %iv.1
405+
store i32 %add, ptr %gep, align 4
406+
%iv.1.next = add nuw nsw i64 %iv.1, 1
407+
%iv.2.next = add nsw i64 %iv.2, -1
408+
%exitcond.not = icmp eq i64 %iv.1.next, 256
409+
br i1 %exitcond.not, label %exit, label %loop
410+
411+
exit:
412+
ret void
413+
}

0 commit comments

Comments
 (0)