Skip to content

Commit 74d974f

Browse files
committed
[LAA] Pre-commit tests exercising different types
Pre-commit tests exercising different types of source/sink in depend_diff_types.ll, in preparation to weaken the HasSameSize check in LoopAccessAnalysis.
1 parent 2b8696b commit 74d974f

File tree

1 file changed

+217
-0
lines changed

1 file changed

+217
-0
lines changed

llvm/test/Analysis/LoopAccessAnalysis/depend_diff_types.ll

Lines changed: 217 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,3 +262,220 @@ loop:
262262
exit:
263263
ret void
264264
}
265+
266+
define void @different_type_sizes_strided_accesses_independent(ptr %dst) {
267+
; CHECK-LABEL: 'different_type_sizes_strided_accesses_independent'
268+
; CHECK-NEXT: loop:
269+
; 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
270+
; CHECK-NEXT: Unknown data dependence.
271+
; CHECK-NEXT: Dependences:
272+
; CHECK-NEXT: Unknown:
273+
; CHECK-NEXT: store i16 0, ptr %gep.iv, align 2 ->
274+
; CHECK-NEXT: store i8 1, ptr %gep.10.iv, align 1
275+
; CHECK-EMPTY:
276+
; CHECK-NEXT: Run-time memory checks:
277+
; CHECK-NEXT: Grouped accesses:
278+
; CHECK-EMPTY:
279+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
280+
; CHECK-NEXT: SCEV assumptions:
281+
; CHECK-EMPTY:
282+
; CHECK-NEXT: Expressions re-written:
283+
;
284+
entry:
285+
%gep.10 = getelementptr nuw i8, ptr %dst, i64 10
286+
br label %loop
287+
288+
loop:
289+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
290+
%gep.iv = getelementptr i8, ptr %dst, i64 %iv
291+
store i16 0, ptr %gep.iv
292+
%gep.10.iv = getelementptr i8, ptr %gep.10, i64 %iv
293+
store i8 1, ptr %gep.10.iv
294+
%iv.next = add i64 %iv, 8
295+
%ec = icmp eq i64 %iv.next, 64
296+
br i1 %ec, label %exit, label %loop
297+
298+
exit:
299+
ret void
300+
}
301+
302+
define void @different_type_sizes_strided_accesses_dependent(ptr %dst) {
303+
; CHECK-LABEL: 'different_type_sizes_strided_accesses_dependent'
304+
; CHECK-NEXT: loop:
305+
; 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
306+
; CHECK-NEXT: Unknown data dependence.
307+
; CHECK-NEXT: Dependences:
308+
; CHECK-NEXT: Unknown:
309+
; CHECK-NEXT: store i64 0, ptr %gep.iv, align 4 ->
310+
; CHECK-NEXT: store i8 1, ptr %gep.10.iv, align 1
311+
; CHECK-EMPTY:
312+
; CHECK-NEXT: Run-time memory checks:
313+
; CHECK-NEXT: Grouped accesses:
314+
; CHECK-EMPTY:
315+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
316+
; CHECK-NEXT: SCEV assumptions:
317+
; CHECK-EMPTY:
318+
; CHECK-NEXT: Expressions re-written:
319+
;
320+
entry:
321+
%gep.10 = getelementptr nuw i8, ptr %dst, i64 10
322+
br label %loop
323+
324+
loop:
325+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
326+
%gep.iv = getelementptr i8, ptr %dst, i64 %iv
327+
store i64 0, ptr %gep.iv
328+
%gep.10.iv = getelementptr i8, ptr %gep.10, i64 %iv
329+
store i8 1, ptr %gep.10.iv
330+
%iv.next = add i64 %iv, 8
331+
%ec = icmp eq i64 %iv.next, 64
332+
br i1 %ec, label %exit, label %loop
333+
334+
exit:
335+
ret void
336+
}
337+
338+
define void @different_type_sizes_source_size_backwardvectorizible(ptr %dst) {
339+
; CHECK-LABEL: 'different_type_sizes_source_size_backwardvectorizible'
340+
; CHECK-NEXT: loop:
341+
; 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
342+
; CHECK-NEXT: Unknown data dependence.
343+
; CHECK-NEXT: Dependences:
344+
; CHECK-NEXT: Unknown:
345+
; CHECK-NEXT: store i16 0, ptr %gep.iv, align 2 ->
346+
; CHECK-NEXT: store i32 1, ptr %gep.10.iv, align 4
347+
; CHECK-EMPTY:
348+
; CHECK-NEXT: Run-time memory checks:
349+
; CHECK-NEXT: Grouped accesses:
350+
; CHECK-EMPTY:
351+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
352+
; CHECK-NEXT: SCEV assumptions:
353+
; CHECK-EMPTY:
354+
; CHECK-NEXT: Expressions re-written:
355+
;
356+
entry:
357+
%gep.10 = getelementptr nuw i8, ptr %dst, i64 10
358+
br label %loop
359+
360+
loop:
361+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
362+
%gep.iv = getelementptr i8, ptr %dst, i64 %iv
363+
store i16 0, ptr %gep.iv
364+
%gep.10.iv = getelementptr i8, ptr %gep.10, i64 %iv
365+
store i32 1, ptr %gep.10.iv
366+
%iv.next = add i64 %iv, 8
367+
%ec = icmp eq i64 %iv.next, 64
368+
br i1 %ec, label %exit, label %loop
369+
370+
exit:
371+
ret void
372+
}
373+
374+
define void @different_type_sizes_forward(ptr %dst) {
375+
; CHECK-LABEL: 'different_type_sizes_forward'
376+
; CHECK-NEXT: loop:
377+
; CHECK-NEXT: Memory dependences are safe
378+
; CHECK-NEXT: Dependences:
379+
; CHECK-NEXT: Forward:
380+
; CHECK-NEXT: store i32 0, ptr %gep.10.iv, align 4 ->
381+
; CHECK-NEXT: store i16 1, ptr %gep.iv, align 2
382+
; CHECK-EMPTY:
383+
; CHECK-NEXT: Run-time memory checks:
384+
; CHECK-NEXT: Grouped accesses:
385+
; CHECK-EMPTY:
386+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
387+
; CHECK-NEXT: SCEV assumptions:
388+
; CHECK-EMPTY:
389+
; CHECK-NEXT: Expressions re-written:
390+
;
391+
entry:
392+
%gep.10 = getelementptr nuw i8, ptr %dst, i64 10
393+
br label %loop
394+
395+
loop:
396+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
397+
%gep.10.iv = getelementptr i8, ptr %gep.10, i64 %iv
398+
store i32 0, ptr %gep.10.iv
399+
%gep.iv = getelementptr i8, ptr %dst, i64 %iv
400+
store i16 1, ptr %gep.iv
401+
%iv.next = add i64 %iv, 8
402+
%ec = icmp eq i64 %iv.next, 64
403+
br i1 %ec, label %exit, label %loop
404+
405+
exit:
406+
ret void
407+
}
408+
409+
define void @different_type_sizes_store_size_cannot_prevent_forwarding(ptr %A, ptr noalias %B) {
410+
; CHECK-LABEL: 'different_type_sizes_store_size_cannot_prevent_forwarding'
411+
; CHECK-NEXT: loop:
412+
; 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
413+
; CHECK-NEXT: Forward loop carried data dependence that prevents store-to-load forwarding.
414+
; CHECK-NEXT: Dependences:
415+
; CHECK-NEXT: ForwardButPreventsForwarding:
416+
; CHECK-NEXT: store i32 0, ptr %gep.A, align 4 ->
417+
; CHECK-NEXT: %l = load i16, ptr %gep.A.1, align 2
418+
; CHECK-EMPTY:
419+
; CHECK-NEXT: Run-time memory checks:
420+
; CHECK-NEXT: Grouped accesses:
421+
; CHECK-EMPTY:
422+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
423+
; CHECK-NEXT: SCEV assumptions:
424+
; CHECK-EMPTY:
425+
; CHECK-NEXT: Expressions re-written:
426+
;
427+
entry:
428+
%A.1 = getelementptr i32, ptr %A, i64 1
429+
br label %loop
430+
431+
loop:
432+
%iv = phi i64 [ 1022, %entry ], [ %iv.next, %loop ]
433+
%gep.A = getelementptr inbounds i32, ptr %A, i64 %iv
434+
store i32 0, ptr %gep.A
435+
%gep.A.1 = getelementptr i32, ptr %A.1, i64 %iv
436+
%l = load i16, ptr %gep.A.1
437+
store i16 %l, ptr %B
438+
%iv.next = add nsw i64 %iv, -1
439+
%cmp = icmp eq i64 %iv, 0
440+
br i1 %cmp, label %exit, label %loop
441+
442+
exit:
443+
ret void
444+
}
445+
446+
define void @different_type_sizes_load_size_prevents_forwarding(ptr %A, ptr noalias %B) {
447+
; CHECK-LABEL: 'different_type_sizes_load_size_prevents_forwarding'
448+
; CHECK-NEXT: loop:
449+
; 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
450+
; CHECK-NEXT: Forward loop carried data dependence that prevents store-to-load forwarding.
451+
; CHECK-NEXT: Dependences:
452+
; CHECK-NEXT: ForwardButPreventsForwarding:
453+
; CHECK-NEXT: store i16 0, ptr %gep.A, align 2 ->
454+
; CHECK-NEXT: %l = load i32, ptr %gep.A.1, align 4
455+
; CHECK-EMPTY:
456+
; CHECK-NEXT: Run-time memory checks:
457+
; CHECK-NEXT: Grouped accesses:
458+
; CHECK-EMPTY:
459+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
460+
; CHECK-NEXT: SCEV assumptions:
461+
; CHECK-EMPTY:
462+
; CHECK-NEXT: Expressions re-written:
463+
;
464+
entry:
465+
%A.1 = getelementptr i32, ptr %A, i64 1
466+
br label %loop
467+
468+
loop:
469+
%iv = phi i64 [ 1022, %entry ], [ %iv.next, %loop ]
470+
%gep.A = getelementptr inbounds i32, ptr %A, i64 %iv
471+
store i16 0, ptr %gep.A
472+
%gep.A.1 = getelementptr i32, ptr %A.1, i64 %iv
473+
%l = load i32, ptr %gep.A.1
474+
store i32 %l, ptr %B
475+
%iv.next = add nsw i64 %iv, -1
476+
%cmp = icmp eq i64 %iv, 0
477+
br i1 %cmp, label %exit, label %loop
478+
479+
exit:
480+
ret void
481+
}

0 commit comments

Comments
 (0)