131 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 42; RUN: opt -passes='print<access-info>' -disable-output %s 2>&1 | FileCheck %s3 4target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"5 6; TODO: No runtime checks should be needed, as the distance between accesses7; is large enough to need runtime checks.8define void @test_distance_positive_independent_via_trip_count(ptr %A) {9; CHECK-LABEL: 'test_distance_positive_independent_via_trip_count'10; CHECK-NEXT: loop:11; CHECK-NEXT: Memory dependences are safe12; CHECK-NEXT: Dependences:13; CHECK-NEXT: Run-time memory checks:14; CHECK-NEXT: Grouped accesses:15; CHECK-EMPTY:16; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.17; CHECK-NEXT: SCEV assumptions:18; CHECK-EMPTY:19; CHECK-NEXT: Expressions re-written:20;21entry:22 %A.400 = getelementptr inbounds i8, ptr %A, i64 40023 br label %loop24 25loop:26 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]27 %gep.A.400 = getelementptr inbounds i32, ptr %A.400, i64 %iv28 %gep.A = getelementptr inbounds i8, ptr %A, i64 %iv29 %l = load i8, ptr %gep.A, align 130 %ext = zext i8 %l to i3231 store i32 %ext, ptr %gep.A.400, align 432 %iv.next = add nuw nsw i64 %iv, 133 %ec = icmp eq i64 %iv, 10034 br i1 %ec, label %exit, label %loop35 36exit:37 ret void38}39 40; TODO: Currently this is considered vectorizable with runtime checks, but the41; runtime checks are never true.42define void @test_distance_positive_backwards(ptr %A) {43; CHECK-LABEL: 'test_distance_positive_backwards'44; CHECK-NEXT: loop:45; CHECK-NEXT: Memory dependences are safe with run-time checks46; CHECK-NEXT: Dependences:47; CHECK-NEXT: Run-time memory checks:48; CHECK-NEXT: Check 0:49; CHECK-NEXT: Comparing group GRP0:50; CHECK-NEXT: %gep.A.400 = getelementptr inbounds i32, ptr %A.1, i64 %iv51; CHECK-NEXT: Against group GRP1:52; CHECK-NEXT: %gep.A = getelementptr inbounds i8, ptr %A, i64 %iv53; CHECK-NEXT: Grouped accesses:54; CHECK-NEXT: Group GRP0:55; CHECK-NEXT: (Low: (1 + %A)<nuw> High: (405 + %A))56; CHECK-NEXT: Member: {(1 + %A)<nuw>,+,4}<nuw><%loop>57; CHECK-NEXT: Group GRP1:58; CHECK-NEXT: (Low: %A High: (101 + %A))59; CHECK-NEXT: Member: {%A,+,1}<nuw><%loop>60; CHECK-EMPTY:61; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.62; CHECK-NEXT: SCEV assumptions:63; CHECK-EMPTY:64; CHECK-NEXT: Expressions re-written:65;66entry:67 %A.1 = getelementptr inbounds i8, ptr %A, i64 168 br label %loop69 70loop:71 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]72 %gep.A.400 = getelementptr inbounds i32, ptr %A.1, i64 %iv73 %gep.A = getelementptr inbounds i8, ptr %A, i64 %iv74 %l = load i8, ptr %gep.A, align 175 %ext = zext i8 %l to i3276 store i32 %ext, ptr %gep.A.400, align 477 %iv.next = add nuw nsw i64 %iv, 178 %ec = icmp eq i64 %iv, 10079 br i1 %ec, label %exit, label %loop80 81exit:82 ret void83}84 85define void @test_distance_positive_via_assume(ptr %A, i64 %off) {86; CHECK-LABEL: 'test_distance_positive_via_assume'87; CHECK-NEXT: loop:88; CHECK-NEXT: Memory dependences are safe with run-time checks89; CHECK-NEXT: Dependences:90; CHECK-NEXT: Run-time memory checks:91; CHECK-NEXT: Check 0:92; CHECK-NEXT: Comparing group GRP0:93; CHECK-NEXT: %gep.A.400 = getelementptr inbounds i32, ptr %A.off, i64 %iv94; CHECK-NEXT: Against group GRP1:95; CHECK-NEXT: %gep.A = getelementptr inbounds i8, ptr %A, i64 %iv96; CHECK-NEXT: Grouped accesses:97; CHECK-NEXT: Group GRP0:98; CHECK-NEXT: (Low: (%off + %A) High: (404 + %off + %A))99; CHECK-NEXT: Member: {(%off + %A),+,4}<nw><%loop>100; CHECK-NEXT: Group GRP1:101; CHECK-NEXT: (Low: %A High: (101 + %A))102; CHECK-NEXT: Member: {%A,+,1}<nuw><%loop>103; CHECK-EMPTY:104; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.105; CHECK-NEXT: SCEV assumptions:106; CHECK-EMPTY:107; CHECK-NEXT: Expressions re-written:108;109entry:110 %c = icmp sgt i64 %off, 0111 call void @llvm.assume(i1 %c)112 %A.off = getelementptr inbounds i8, ptr %A, i64 %off113 br label %loop114 115loop:116 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]117 %gep.A.400 = getelementptr inbounds i32, ptr %A.off, i64 %iv118 %gep.A = getelementptr inbounds i8, ptr %A, i64 %iv119 %l = load i8, ptr %gep.A, align 1120 %ext = zext i8 %l to i32121 store i32 %ext, ptr %gep.A.400, align 4122 %iv.next = add nuw nsw i64 %iv, 1123 %ec = icmp eq i64 %iv, 100124 br i1 %ec, label %exit, label %loop125 126exit:127 ret void128}129 130declare void @llvm.assume(i1)131