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