xref: /llvm-project/llvm/test/Analysis/LoopAccessAnalysis/underlying-object-loop-varying-phi.ll (revision a3ad5faa321848376b277db369313c80d3df2152)
14cfd4a78SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 4
24cfd4a78SFlorian Hahn; RUN: opt -passes='print<access-info>' -disable-output %s 2>&1 | FileCheck %s
34cfd4a78SFlorian Hahn
44cfd4a78SFlorian Hahntarget datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
54cfd4a78SFlorian Hahn
64cfd4a78SFlorian Hahn; Test case for https://github.com/llvm/llvm-project/issues/82665.
74cfd4a78SFlorian Hahndefine void @indirect_ptr_recurrences_read_write(ptr %A, ptr %B) {
84cfd4a78SFlorian Hahn; CHECK-LABEL: 'indirect_ptr_recurrences_read_write'
94cfd4a78SFlorian Hahn; CHECK-NEXT:    loop:
10b274b236SFlorian Hahn; 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
11b274b236SFlorian Hahn; CHECK-NEXT:  Unsafe indirect dependence.
124cfd4a78SFlorian Hahn; CHECK-NEXT:      Dependences:
13*a3ad5faaSFlorian Hahn; CHECK-NEXT:        IndirectUnsafe:
14b274b236SFlorian Hahn; CHECK-NEXT:            %l = load i32, ptr %ptr.recur, align 4, !tbaa !4 ->
15b274b236SFlorian Hahn; CHECK-NEXT:            store i32 %xor, ptr %ptr.recur, align 4, !tbaa !4
16b274b236SFlorian Hahn; CHECK-EMPTY:
174cfd4a78SFlorian Hahn; CHECK-NEXT:      Run-time memory checks:
184cfd4a78SFlorian Hahn; CHECK-NEXT:      Grouped accesses:
194cfd4a78SFlorian Hahn; CHECK-EMPTY:
204cfd4a78SFlorian Hahn; CHECK-NEXT:      Non vectorizable stores to invariant address were not found in loop.
214cfd4a78SFlorian Hahn; CHECK-NEXT:      SCEV assumptions:
224cfd4a78SFlorian Hahn; CHECK-EMPTY:
234cfd4a78SFlorian Hahn; CHECK-NEXT:      Expressions re-written:
244cfd4a78SFlorian Hahn;
254cfd4a78SFlorian Hahnentry:
264cfd4a78SFlorian Hahn  br label %loop
274cfd4a78SFlorian Hahn
284cfd4a78SFlorian Hahnloop:
294cfd4a78SFlorian Hahn  %iv = phi i64 [ 1, %entry ], [ %iv.next, %loop ]
304cfd4a78SFlorian Hahn  %ptr.recur = phi ptr [ %A, %entry ], [ %ptr.next, %loop ]
314cfd4a78SFlorian Hahn  %gep.B = getelementptr inbounds ptr, ptr %B, i64 %iv
324cfd4a78SFlorian Hahn  %ptr.next = load ptr, ptr %gep.B, align 8, !tbaa !6
334cfd4a78SFlorian Hahn  %l = load i32, ptr %ptr.recur, align 4, !tbaa !10
344cfd4a78SFlorian Hahn  %xor = xor i32 %l, 1
354cfd4a78SFlorian Hahn  store i32 %xor, ptr %ptr.recur, align 4, !tbaa !10
364cfd4a78SFlorian Hahn  %iv.next = add nuw nsw i64 %iv, 1
374cfd4a78SFlorian Hahn  %ec = icmp eq i64 %iv.next, 5
384cfd4a78SFlorian Hahn  br i1 %ec, label %exit, label %loop
394cfd4a78SFlorian Hahn
404cfd4a78SFlorian Hahnexit:
414cfd4a78SFlorian Hahn  ret void
424cfd4a78SFlorian Hahn}
434cfd4a78SFlorian Hahn
444cfd4a78SFlorian Hahndefine i32 @indirect_ptr_recurrences_read_only_loop(ptr %A, ptr %B) {
454cfd4a78SFlorian Hahn; CHECK-LABEL: 'indirect_ptr_recurrences_read_only_loop'
464cfd4a78SFlorian Hahn; CHECK-NEXT:    loop:
474cfd4a78SFlorian Hahn; CHECK-NEXT:      Memory dependences are safe
484cfd4a78SFlorian Hahn; CHECK-NEXT:      Dependences:
494cfd4a78SFlorian Hahn; CHECK-NEXT:      Run-time memory checks:
504cfd4a78SFlorian Hahn; CHECK-NEXT:      Grouped accesses:
514cfd4a78SFlorian Hahn; CHECK-EMPTY:
524cfd4a78SFlorian Hahn; CHECK-NEXT:      Non vectorizable stores to invariant address were not found in loop.
534cfd4a78SFlorian Hahn; CHECK-NEXT:      SCEV assumptions:
544cfd4a78SFlorian Hahn; CHECK-EMPTY:
554cfd4a78SFlorian Hahn; CHECK-NEXT:      Expressions re-written:
564cfd4a78SFlorian Hahn;
574cfd4a78SFlorian Hahnentry:
584cfd4a78SFlorian Hahn  br label %loop
594cfd4a78SFlorian Hahn
604cfd4a78SFlorian Hahnloop:
614cfd4a78SFlorian Hahn  %iv = phi i64 [ 1, %entry ], [ %iv.next, %loop ]
624cfd4a78SFlorian Hahn  %ptr.recur = phi ptr [ %A, %entry ], [ %ptr.next, %loop ]
634cfd4a78SFlorian Hahn  %red = phi i32 [ 0, %entry ], [ %xor, %loop ]
644cfd4a78SFlorian Hahn  %gep.B = getelementptr inbounds ptr, ptr %B, i64 %iv
654cfd4a78SFlorian Hahn  %ptr.next = load ptr, ptr %gep.B, align 8, !tbaa !6
664cfd4a78SFlorian Hahn  %l = load i32, ptr %ptr.recur, align 4, !tbaa !10
674cfd4a78SFlorian Hahn  %xor = xor i32 %l, 1
684cfd4a78SFlorian Hahn  %iv.next = add nuw nsw i64 %iv, 1
694cfd4a78SFlorian Hahn  %ec = icmp eq i64 %iv.next, 5
704cfd4a78SFlorian Hahn  br i1 %ec, label %exit, label %loop
714cfd4a78SFlorian Hahn
724cfd4a78SFlorian Hahnexit:
734cfd4a78SFlorian Hahn  ret i32 %xor
744cfd4a78SFlorian Hahn}
754cfd4a78SFlorian Hahn
764cfd4a78SFlorian Hahndefine void @indirect_ptr_recurrences_read_write_may_alias_no_tbaa(ptr %A, ptr %B) {
774cfd4a78SFlorian Hahn; CHECK-LABEL: 'indirect_ptr_recurrences_read_write_may_alias_no_tbaa'
784cfd4a78SFlorian Hahn; CHECK-NEXT:    loop:
794cfd4a78SFlorian Hahn; CHECK-NEXT:      Report: cannot identify array bounds
804cfd4a78SFlorian Hahn; CHECK-NEXT:      Dependences:
814cfd4a78SFlorian Hahn; CHECK-NEXT:      Run-time memory checks:
824cfd4a78SFlorian Hahn; CHECK-NEXT:      Grouped accesses:
834cfd4a78SFlorian Hahn; CHECK-EMPTY:
844cfd4a78SFlorian Hahn; CHECK-NEXT:      Non vectorizable stores to invariant address were not found in loop.
854cfd4a78SFlorian Hahn; CHECK-NEXT:      SCEV assumptions:
864cfd4a78SFlorian Hahn; CHECK-EMPTY:
874cfd4a78SFlorian Hahn; CHECK-NEXT:      Expressions re-written:
884cfd4a78SFlorian Hahn;
894cfd4a78SFlorian Hahnentry:
904cfd4a78SFlorian Hahn  br label %loop
914cfd4a78SFlorian Hahn
924cfd4a78SFlorian Hahnloop:
934cfd4a78SFlorian Hahn  %iv = phi i64 [ 1, %entry ], [ %iv.next, %loop ]
944cfd4a78SFlorian Hahn  %ptr.recur = phi ptr [ %A, %entry ], [ %ptr.next, %loop ]
954cfd4a78SFlorian Hahn  %gep.B = getelementptr inbounds ptr, ptr %B, i64 %iv
964cfd4a78SFlorian Hahn  %ptr.next = load ptr, ptr %gep.B, align 8, !tbaa !6
974cfd4a78SFlorian Hahn  %l = load i32, ptr %ptr.recur, align 4
984cfd4a78SFlorian Hahn  %xor = xor i32 %l, 1
994cfd4a78SFlorian Hahn  store i32 %xor, ptr %ptr.recur, align 4
1004cfd4a78SFlorian Hahn  %iv.next = add nuw nsw i64 %iv, 1
1014cfd4a78SFlorian Hahn  %ec = icmp eq i64 %iv.next, 5
1024cfd4a78SFlorian Hahn  br i1 %ec, label %exit, label %loop
1034cfd4a78SFlorian Hahn
1044cfd4a78SFlorian Hahnexit:
1054cfd4a78SFlorian Hahn  ret void
1064cfd4a78SFlorian Hahn}
1074cfd4a78SFlorian Hahn
1084cfd4a78SFlorian Hahndefine void @indirect_ptr_recurrences_read_write_may_alias_different_obj(ptr %A, ptr %B, ptr %C) {
1094cfd4a78SFlorian Hahn; CHECK-LABEL: 'indirect_ptr_recurrences_read_write_may_alias_different_obj'
1104cfd4a78SFlorian Hahn; CHECK-NEXT:    loop:
1114cfd4a78SFlorian Hahn; CHECK-NEXT:      Report: cannot identify array bounds
1124cfd4a78SFlorian Hahn; CHECK-NEXT:      Dependences:
1134cfd4a78SFlorian Hahn; CHECK-NEXT:      Run-time memory checks:
1144cfd4a78SFlorian Hahn; CHECK-NEXT:      Grouped accesses:
1154cfd4a78SFlorian Hahn; CHECK-EMPTY:
1164cfd4a78SFlorian Hahn; CHECK-NEXT:      Non vectorizable stores to invariant address were not found in loop.
1174cfd4a78SFlorian Hahn; CHECK-NEXT:      SCEV assumptions:
1184cfd4a78SFlorian Hahn; CHECK-EMPTY:
1194cfd4a78SFlorian Hahn; CHECK-NEXT:      Expressions re-written:
1204cfd4a78SFlorian Hahn;
1214cfd4a78SFlorian Hahnentry:
1224cfd4a78SFlorian Hahn  br label %loop
1234cfd4a78SFlorian Hahn
1244cfd4a78SFlorian Hahnloop:
1254cfd4a78SFlorian Hahn  %iv = phi i64 [ 1, %entry ], [ %iv.next, %loop ]
1264cfd4a78SFlorian Hahn  %ptr.recur = phi ptr [ %A, %entry ], [ %ptr.next, %loop ]
1274cfd4a78SFlorian Hahn  %gep.B = getelementptr inbounds ptr, ptr %B, i64 %iv
1284cfd4a78SFlorian Hahn  %ptr.next = load ptr, ptr %gep.B, align 8, !tbaa !6
1294cfd4a78SFlorian Hahn  %l = load i32, ptr %ptr.recur, align 4
1304cfd4a78SFlorian Hahn  %xor = xor i32 %l, 1
1314cfd4a78SFlorian Hahn  %gep.C = getelementptr inbounds ptr, ptr %C, i64 %iv
1324cfd4a78SFlorian Hahn  store i32 %xor, ptr %gep.C, align 4
1334cfd4a78SFlorian Hahn  %iv.next = add nuw nsw i64 %iv, 1
1344cfd4a78SFlorian Hahn  %ec = icmp eq i64 %iv.next, 5
1354cfd4a78SFlorian Hahn  br i1 %ec, label %exit, label %loop
1364cfd4a78SFlorian Hahn
1374cfd4a78SFlorian Hahnexit:
1384cfd4a78SFlorian Hahn  ret void
1394cfd4a78SFlorian Hahn}
1404cfd4a78SFlorian Hahn
1414cfd4a78SFlorian Hahndefine void @indirect_ptr_recurrences_read_write_may_noalias_different_obj(ptr %A, ptr %B, ptr noalias %C) {
1424cfd4a78SFlorian Hahn; CHECK-LABEL: 'indirect_ptr_recurrences_read_write_may_noalias_different_obj'
1434cfd4a78SFlorian Hahn; CHECK-NEXT:    loop:
1444cfd4a78SFlorian Hahn; CHECK-NEXT:      Memory dependences are safe
1454cfd4a78SFlorian Hahn; CHECK-NEXT:      Dependences:
1464cfd4a78SFlorian Hahn; CHECK-NEXT:      Run-time memory checks:
1474cfd4a78SFlorian Hahn; CHECK-NEXT:      Grouped accesses:
1484cfd4a78SFlorian Hahn; CHECK-EMPTY:
1494cfd4a78SFlorian Hahn; CHECK-NEXT:      Non vectorizable stores to invariant address were not found in loop.
1504cfd4a78SFlorian Hahn; CHECK-NEXT:      SCEV assumptions:
1514cfd4a78SFlorian Hahn; CHECK-EMPTY:
1524cfd4a78SFlorian Hahn; CHECK-NEXT:      Expressions re-written:
1534cfd4a78SFlorian Hahn;
1544cfd4a78SFlorian Hahnentry:
1554cfd4a78SFlorian Hahn  br label %loop
1564cfd4a78SFlorian Hahn
1574cfd4a78SFlorian Hahnloop:
1584cfd4a78SFlorian Hahn  %iv = phi i64 [ 1, %entry ], [ %iv.next, %loop ]
1594cfd4a78SFlorian Hahn  %ptr.recur = phi ptr [ %A, %entry ], [ %ptr.next, %loop ]
1604cfd4a78SFlorian Hahn  %gep.B = getelementptr inbounds ptr, ptr %B, i64 %iv
1614cfd4a78SFlorian Hahn  %ptr.next = load ptr, ptr %gep.B, align 8, !tbaa !6
1624cfd4a78SFlorian Hahn  %l = load i32, ptr %ptr.recur, align 4
1634cfd4a78SFlorian Hahn  %xor = xor i32 %l, 1
1644cfd4a78SFlorian Hahn  %gep.C = getelementptr inbounds ptr, ptr %C, i64 %iv
1654cfd4a78SFlorian Hahn  store i32 %xor, ptr %gep.C, align 4
1664cfd4a78SFlorian Hahn  %iv.next = add nuw nsw i64 %iv, 1
1674cfd4a78SFlorian Hahn  %ec = icmp eq i64 %iv.next, 5
1684cfd4a78SFlorian Hahn  br i1 %ec, label %exit, label %loop
1694cfd4a78SFlorian Hahn
1704cfd4a78SFlorian Hahnexit:
1714cfd4a78SFlorian Hahn  ret void
1724cfd4a78SFlorian Hahn}
1734cfd4a78SFlorian Hahn
1744cfd4a78SFlorian Hahn
1754cfd4a78SFlorian Hahn!6 = !{!7, !7, i64 0}
1764cfd4a78SFlorian Hahn!7 = !{!"any pointer", !8, i64 0}
1774cfd4a78SFlorian Hahn!8 = !{!"omnipotent char", !9, i64 0}
1784cfd4a78SFlorian Hahn!9 = !{!"Simple C/C++ TBAA"}
1794cfd4a78SFlorian Hahn!10 = !{!11, !11, i64 0}
1804cfd4a78SFlorian Hahn!11 = !{!"int", !8, i64 0}
181