216 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 32; RUN: opt -passes='print<access-info>' -disable-output %s 2>&1 | FileCheck %s3 4; Test cases for using the backedge-taken-count to rule out dependencies between5; 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 safe11; 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 10022 br label %loop23 24loop:25 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]26 %gep = getelementptr i32, ptr %a, i32 %iv27 %l = load i32, ptr %gep.x28 store i32 %l, ptr %gep29 %iv.next = add i32 %iv, 130 %ec = icmp eq i32 %iv.next, 10031 br i1 %ec, label %exit, label %loop32 33exit:34 ret void35}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 loop41; 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 446; 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 20057 br label %loop58 59loop:60 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]61 %gep = getelementptr i32, ptr %a, i32 %iv62 %l = load i32, ptr %gep.x63 store i32 %l, ptr %gep64 %iv.next = add i32 %iv, 165 %ec = icmp eq i32 %iv.next, 10066 br i1 %ec, label %exit, label %loop67 68exit:69 ret void70}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 loop76; 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 481; 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 9992 br label %loop93 94loop:95 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]96 %gep = getelementptr i32, ptr %a, i32 %iv97 %l = load i32, ptr %gep.x98 store i32 %l, ptr %gep99 %iv.next = add i32 %iv, 1100 %ec = icmp eq i32 %iv.next, 100101 br i1 %ec, label %exit, label %loop102 103exit:104 ret void105}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 safe111; 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 10000122 br label %loop123 124loop:125 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]126 %gep = getelementptr i32, ptr %a, i32 %iv127 %l = load i32, ptr %gep.x128 store i32 %l, ptr %gep129 %iv.next = add i32 %iv, 1130 %ec = icmp eq i32 %iv.next, 10000131 br i1 %ec, label %exit, label %loop132 133exit:134 ret void135}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 loop141; 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 4146; 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 9999157 br label %loop158 159loop:160 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]161 %gep = getelementptr i32, ptr %a, i32 %iv162 %l = load i32, ptr %gep.x163 store i32 %l, ptr %gep164 %iv.next = add i32 %iv, 1165 %ec = icmp eq i32 %iv.next, 100000166 br i1 %ec, label %exit, label %loop167 168exit:169 ret void170}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 loop176; 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 4181; CHECK-EMPTY:182; CHECK-NEXT: Run-time memory checks:183; CHECK-NEXT: Grouped accesses:184; CHECK-NEXT: Group GRP0:185; CHECK-NEXT: (Low: (400 + %a) High: (404 + %a))186; CHECK-NEXT: Member: (400 + %a)187; CHECK-NEXT: Group GRP1: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 100202 br label %loop203 204loop:205 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]206 %gep = getelementptr i32, ptr %a, i32 %iv207 %l = load i32, ptr %gep.x208 store i32 %l, ptr %gep209 %iv.next = add i32 %iv, 1210 %ec = icmp eq i32 %iv.next, %N211 br i1 %ec, label %exit, label %loop212 213exit:214 ret void215}216