1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 3 2; RUN: opt -passes='print<access-info>' -disable-output %s 2>&1 | FileCheck %s 3 4; Test cases for using the backedge-taken-count to rule out dependencies between 5; an invariant and strided accesses. 6 7define void @test_distance_greater_than_BTC_100(ptr %a) { 8; CHECK-LABEL: 'test_distance_greater_than_BTC_100' 9; CHECK-NEXT: loop: 10; CHECK-NEXT: Memory dependences are safe 11; CHECK-NEXT: Dependences: 12; CHECK-NEXT: Run-time memory checks: 13; CHECK-NEXT: Grouped accesses: 14; CHECK-EMPTY: 15; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 16; CHECK-NEXT: SCEV assumptions: 17; CHECK-EMPTY: 18; CHECK-NEXT: Expressions re-written: 19; 20entry: 21 %gep.x = getelementptr i32, ptr %a, i32 100 22 br label %loop 23 24loop: 25 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 26 %gep = getelementptr i32, ptr %a, i32 %iv 27 %l = load i32, ptr %gep.x 28 store i32 %l, ptr %gep 29 %iv.next = add i32 %iv, 1 30 %ec = icmp eq i32 %iv.next, 100 31 br i1 %ec, label %exit, label %loop 32 33exit: 34 ret void 35} 36 37define void @test_distance_much_greater_than_BTC_100(ptr %a) { 38; CHECK-LABEL: 'test_distance_much_greater_than_BTC_100' 39; CHECK-NEXT: loop: 40; 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 41; CHECK-NEXT: Unknown data dependence. 42; CHECK-NEXT: Dependences: 43; CHECK-NEXT: Unknown: 44; CHECK-NEXT: %l = load i32, ptr %gep.x, align 4 -> 45; CHECK-NEXT: store i32 %l, ptr %gep, align 4 46; CHECK-EMPTY: 47; CHECK-NEXT: Run-time memory checks: 48; CHECK-NEXT: Grouped accesses: 49; CHECK-EMPTY: 50; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 51; CHECK-NEXT: SCEV assumptions: 52; CHECK-EMPTY: 53; CHECK-NEXT: Expressions re-written: 54; 55entry: 56 %gep.x = getelementptr i32, ptr %a, i32 200 57 br label %loop 58 59loop: 60 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 61 %gep = getelementptr i32, ptr %a, i32 %iv 62 %l = load i32, ptr %gep.x 63 store i32 %l, ptr %gep 64 %iv.next = add i32 %iv, 1 65 %ec = icmp eq i32 %iv.next, 100 66 br i1 %ec, label %exit, label %loop 67 68exit: 69 ret void 70} 71 72define void @test_distance_equal_BTC_100(ptr %a) { 73; CHECK-LABEL: 'test_distance_equal_BTC_100' 74; CHECK-NEXT: loop: 75; 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 76; CHECK-NEXT: Unknown data dependence. 77; CHECK-NEXT: Dependences: 78; CHECK-NEXT: Unknown: 79; CHECK-NEXT: %l = load i32, ptr %gep.x, align 4 -> 80; CHECK-NEXT: store i32 %l, ptr %gep, align 4 81; CHECK-EMPTY: 82; CHECK-NEXT: Run-time memory checks: 83; CHECK-NEXT: Grouped accesses: 84; CHECK-EMPTY: 85; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 86; CHECK-NEXT: SCEV assumptions: 87; CHECK-EMPTY: 88; CHECK-NEXT: Expressions re-written: 89; 90entry: 91 %gep.x = getelementptr i32, ptr %a, i32 99 92 br label %loop 93 94loop: 95 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 96 %gep = getelementptr i32, ptr %a, i32 %iv 97 %l = load i32, ptr %gep.x 98 store i32 %l, ptr %gep 99 %iv.next = add i32 %iv, 1 100 %ec = icmp eq i32 %iv.next, 100 101 br i1 %ec, label %exit, label %loop 102 103exit: 104 ret void 105} 106 107define void @test_distance_greater_than_BTC_10000(ptr %a) { 108; CHECK-LABEL: 'test_distance_greater_than_BTC_10000' 109; CHECK-NEXT: loop: 110; CHECK-NEXT: Memory dependences are safe 111; CHECK-NEXT: Dependences: 112; CHECK-NEXT: Run-time memory checks: 113; CHECK-NEXT: Grouped accesses: 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 %gep.x = getelementptr i32, ptr %a, i32 10000 122 br label %loop 123 124loop: 125 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 126 %gep = getelementptr i32, ptr %a, i32 %iv 127 %l = load i32, ptr %gep.x 128 store i32 %l, ptr %gep 129 %iv.next = add i32 %iv, 1 130 %ec = icmp eq i32 %iv.next, 10000 131 br i1 %ec, label %exit, label %loop 132 133exit: 134 ret void 135} 136 137define void @test_distance_equal_to_BTC_10000(ptr %a) { 138; CHECK-LABEL: 'test_distance_equal_to_BTC_10000' 139; CHECK-NEXT: loop: 140; 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 141; CHECK-NEXT: Unknown data dependence. 142; CHECK-NEXT: Dependences: 143; CHECK-NEXT: Unknown: 144; CHECK-NEXT: %l = load i32, ptr %gep.x, align 4 -> 145; CHECK-NEXT: store i32 %l, ptr %gep, align 4 146; CHECK-EMPTY: 147; CHECK-NEXT: Run-time memory checks: 148; CHECK-NEXT: Grouped accesses: 149; CHECK-EMPTY: 150; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 151; CHECK-NEXT: SCEV assumptions: 152; CHECK-EMPTY: 153; CHECK-NEXT: Expressions re-written: 154; 155entry: 156 %gep.x = getelementptr i32, ptr %a, i32 9999 157 br label %loop 158 159loop: 160 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 161 %gep = getelementptr i32, ptr %a, i32 %iv 162 %l = load i32, ptr %gep.x 163 store i32 %l, ptr %gep 164 %iv.next = add i32 %iv, 1 165 %ec = icmp eq i32 %iv.next, 100000 166 br i1 %ec, label %exit, label %loop 167 168exit: 169 ret void 170} 171 172define void @test_btc_is_unknown_value(ptr %a, i32 %N) { 173; CHECK-LABEL: 'test_btc_is_unknown_value' 174; CHECK-NEXT: loop: 175; 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 176; CHECK-NEXT: Unknown data dependence. 177; CHECK-NEXT: Dependences: 178; CHECK-NEXT: Unknown: 179; CHECK-NEXT: %l = load i32, ptr %gep.x, align 4 -> 180; CHECK-NEXT: store i32 %l, ptr %gep, align 4 181; CHECK-EMPTY: 182; CHECK-NEXT: Run-time memory checks: 183; CHECK-NEXT: Grouped accesses: 184; CHECK-NEXT: Group [[GRP1:0x[0-9a-f]+]]: 185; CHECK-NEXT: (Low: (400 + %a) High: (404 + %a)) 186; CHECK-NEXT: Member: (400 + %a) 187; CHECK-NEXT: Group [[GRP2:0x[0-9a-f]+]]: 188; CHECK-NEXT: (Low: %a High: (4 + (4 * (zext i32 (-1 + %N) to i64))<nuw><nsw> + %a)) 189; CHECK-NEXT: Member: {%a,+,4}<nw><%loop> 190; CHECK-EMPTY: 191; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 192; CHECK-NEXT: SCEV assumptions: 193; CHECK-NEXT: {0,+,1}<nuw><%loop> Added Flags: <nssw> 194; CHECK-EMPTY: 195; CHECK-NEXT: Expressions re-written: 196; CHECK-NEXT: [PSE] %gep = getelementptr i32, ptr %a, i32 %iv: 197; CHECK-NEXT: ((4 * (sext i32 {0,+,1}<nuw><%loop> to i64))<nsw> + %a) 198; CHECK-NEXT: --> {%a,+,4}<nw><%loop> 199; 200entry: 201 %gep.x = getelementptr i32, ptr %a, i32 100 202 br label %loop 203 204loop: 205 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 206 %gep = getelementptr i32, ptr %a, i32 %iv 207 %l = load i32, ptr %gep.x 208 store i32 %l, ptr %gep 209 %iv.next = add i32 %iv, 1 210 %ec = icmp eq i32 %iv.next, %N 211 br i1 %ec, label %exit, label %loop 212 213exit: 214 ret void 215} 216