1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 4 2; RUN: opt -passes='print<access-info>' -disable-output %s 2>&1 | FileCheck %s 3 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 accesses 7; 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 safe with run-time checks 12; CHECK-NEXT: Dependences: 13; CHECK-NEXT: Run-time memory checks: 14; CHECK-NEXT: Check 0: 15; CHECK-NEXT: Comparing group ([[GRP1:0x[0-9a-f]+]]): 16; CHECK-NEXT: %gep.A.400 = getelementptr inbounds i32, ptr %A.400, i64 %iv 17; CHECK-NEXT: Against group ([[GRP2:0x[0-9a-f]+]]): 18; CHECK-NEXT: %gep.A = getelementptr inbounds i8, ptr %A, i64 %iv 19; CHECK-NEXT: Grouped accesses: 20; CHECK-NEXT: Group [[GRP1]]: 21; CHECK-NEXT: (Low: (400 + %A)<nuw> High: (804 + %A)) 22; CHECK-NEXT: Member: {(400 + %A)<nuw>,+,4}<nuw><%loop> 23; CHECK-NEXT: Group [[GRP2]]: 24; CHECK-NEXT: (Low: %A High: (101 + %A)) 25; CHECK-NEXT: Member: {%A,+,1}<nuw><%loop> 26; CHECK-EMPTY: 27; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 28; CHECK-NEXT: SCEV assumptions: 29; CHECK-EMPTY: 30; CHECK-NEXT: Expressions re-written: 31; 32entry: 33 %A.400 = getelementptr inbounds i8, ptr %A, i64 400 34 br label %loop 35 36loop: 37 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] 38 %gep.A.400 = getelementptr inbounds i32, ptr %A.400, i64 %iv 39 %gep.A = getelementptr inbounds i8, ptr %A, i64 %iv 40 %l = load i8, ptr %gep.A, align 1 41 %ext = zext i8 %l to i32 42 store i32 %ext, ptr %gep.A.400, align 4 43 %iv.next = add nuw nsw i64 %iv, 1 44 %ec = icmp eq i64 %iv, 100 45 br i1 %ec, label %exit, label %loop 46 47exit: 48 ret void 49} 50 51; TODO: Currently this is considered vectorizable with runtime checks, but the 52; runtime checks are never true. 53define void @test_distance_positive_backwards(ptr %A) { 54; CHECK-LABEL: 'test_distance_positive_backwards' 55; CHECK-NEXT: loop: 56; CHECK-NEXT: Memory dependences are safe with run-time checks 57; CHECK-NEXT: Dependences: 58; CHECK-NEXT: Run-time memory checks: 59; CHECK-NEXT: Check 0: 60; CHECK-NEXT: Comparing group ([[GRP3:0x[0-9a-f]+]]): 61; CHECK-NEXT: %gep.A.400 = getelementptr inbounds i32, ptr %A.1, i64 %iv 62; CHECK-NEXT: Against group ([[GRP4:0x[0-9a-f]+]]): 63; CHECK-NEXT: %gep.A = getelementptr inbounds i8, ptr %A, i64 %iv 64; CHECK-NEXT: Grouped accesses: 65; CHECK-NEXT: Group [[GRP3]]: 66; CHECK-NEXT: (Low: (1 + %A)<nuw> High: (405 + %A)) 67; CHECK-NEXT: Member: {(1 + %A)<nuw>,+,4}<nuw><%loop> 68; CHECK-NEXT: Group [[GRP4]]: 69; CHECK-NEXT: (Low: %A High: (101 + %A)) 70; CHECK-NEXT: Member: {%A,+,1}<nuw><%loop> 71; CHECK-EMPTY: 72; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 73; CHECK-NEXT: SCEV assumptions: 74; CHECK-EMPTY: 75; CHECK-NEXT: Expressions re-written: 76; 77entry: 78 %A.1 = getelementptr inbounds i8, ptr %A, i64 1 79 br label %loop 80 81loop: 82 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] 83 %gep.A.400 = getelementptr inbounds i32, ptr %A.1, i64 %iv 84 %gep.A = getelementptr inbounds i8, ptr %A, i64 %iv 85 %l = load i8, ptr %gep.A, align 1 86 %ext = zext i8 %l to i32 87 store i32 %ext, ptr %gep.A.400, align 4 88 %iv.next = add nuw nsw i64 %iv, 1 89 %ec = icmp eq i64 %iv, 100 90 br i1 %ec, label %exit, label %loop 91 92exit: 93 ret void 94} 95 96define void @test_distance_positive_via_assume(ptr %A, i64 %off) { 97; CHECK-LABEL: 'test_distance_positive_via_assume' 98; CHECK-NEXT: loop: 99; CHECK-NEXT: Memory dependences are safe with run-time checks 100; CHECK-NEXT: Dependences: 101; CHECK-NEXT: Run-time memory checks: 102; CHECK-NEXT: Check 0: 103; CHECK-NEXT: Comparing group ([[GRP5:0x[0-9a-f]+]]): 104; CHECK-NEXT: %gep.A.400 = getelementptr inbounds i32, ptr %A.off, i64 %iv 105; CHECK-NEXT: Against group ([[GRP6:0x[0-9a-f]+]]): 106; CHECK-NEXT: %gep.A = getelementptr inbounds i8, ptr %A, i64 %iv 107; CHECK-NEXT: Grouped accesses: 108; CHECK-NEXT: Group [[GRP5]]: 109; CHECK-NEXT: (Low: (%off + %A) High: (404 + %off + %A)) 110; CHECK-NEXT: Member: {(%off + %A),+,4}<nw><%loop> 111; CHECK-NEXT: Group [[GRP6]]: 112; CHECK-NEXT: (Low: %A High: (101 + %A)) 113; CHECK-NEXT: Member: {%A,+,1}<nuw><%loop> 114; CHECK-EMPTY: 115; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 116; CHECK-NEXT: SCEV assumptions: 117; CHECK-EMPTY: 118; CHECK-NEXT: Expressions re-written: 119; 120entry: 121 %c = icmp sgt i64 %off, 0 122 call void @llvm.assume(i1 %c) 123 %A.off = getelementptr inbounds i8, ptr %A, i64 %off 124 br label %loop 125 126loop: 127 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] 128 %gep.A.400 = getelementptr inbounds i32, ptr %A.off, i64 %iv 129 %gep.A = getelementptr inbounds i8, ptr %A, i64 %iv 130 %l = load i8, ptr %gep.A, align 1 131 %ext = zext i8 %l to i32 132 store i32 %ext, ptr %gep.A.400, align 4 133 %iv.next = add nuw nsw i64 %iv, 1 134 %ec = icmp eq i64 %iv, 100 135 br i1 %ec, label %exit, label %loop 136 137exit: 138 ret void 139} 140 141declare void @llvm.assume(i1) 142