180 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 52; RUN: opt -passes='print<access-info>' -disable-output %s 2>&1 | FileCheck %s3 4target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"5 6define void @runtime_checks_with_symbolic_max_btc_neg_1(ptr %P, ptr %S, i32 %x, i32 %y) {7; CHECK-LABEL: 'runtime_checks_with_symbolic_max_btc_neg_1'8; CHECK-NEXT: loop:9; CHECK-NEXT: Memory dependences are safe with run-time checks10; CHECK-NEXT: Dependences:11; CHECK-NEXT: Run-time memory checks:12; CHECK-NEXT: Check 0:13; CHECK-NEXT: Comparing group GRP0:14; CHECK-NEXT: %gep.iv = getelementptr inbounds i32, ptr %P, i32 %iv15; CHECK-NEXT: Against group GRP1:16; CHECK-NEXT: ptr %S17; CHECK-NEXT: Grouped accesses:18; CHECK-NEXT: Group GRP0:19; CHECK-NEXT: (Low: ((4 * %y) + %P) High: inttoptr (i32 -1 to ptr))20; CHECK-NEXT: Member: {((4 * %y) + %P),+,4}<%loop>21; CHECK-NEXT: Group GRP1:22; CHECK-NEXT: (Low: %S High: (4 + %S))23; CHECK-NEXT: Member: %S24; CHECK-EMPTY:25; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.26; CHECK-NEXT: SCEV assumptions:27; CHECK-EMPTY:28; CHECK-NEXT: Expressions re-written:29;30entry:31 br label %loop32 33loop:34 %iv = phi i32 [ %y, %entry ], [ %iv.next, %loop ]35 %gep.iv = getelementptr inbounds i32, ptr %P, i32 %iv36 %l = load i32, ptr %S37 store i32 %l, ptr %gep.iv, align 438 %iv.next = add nsw i32 %iv, 139 %c.2 = icmp slt i32 %iv.next, %l40 br i1 %c.2, label %loop, label %exit41 42exit:43 ret void44}45 46define void @runtime_check_with_symbolic_max_btc_neg_2(ptr %P, ptr %S, i32 %x, i32 %y) {47; CHECK-LABEL: 'runtime_check_with_symbolic_max_btc_neg_2'48; CHECK-NEXT: loop:49; CHECK-NEXT: Memory dependences are safe with run-time checks50; CHECK-NEXT: Dependences:51; CHECK-NEXT: Run-time memory checks:52; CHECK-NEXT: Check 0:53; CHECK-NEXT: Comparing group GRP0:54; CHECK-NEXT: %gep.iv = getelementptr inbounds i32, ptr %P, i32 %iv55; CHECK-NEXT: Against group GRP1:56; CHECK-NEXT: ptr %S57; CHECK-NEXT: Grouped accesses:58; CHECK-NEXT: Group GRP0:59; CHECK-NEXT: (Low: ((4 * %y) + %P) High: inttoptr (i32 -1 to ptr))60; CHECK-NEXT: Member: {((4 * %y) + %P),+,4}<%loop>61; CHECK-NEXT: Group GRP1:62; CHECK-NEXT: (Low: %S High: (4 + %S))63; CHECK-NEXT: Member: %S64; CHECK-EMPTY:65; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.66; CHECK-NEXT: SCEV assumptions:67; CHECK-EMPTY:68; CHECK-NEXT: Expressions re-written:69;70entry:71 br label %loop72 73loop:74 %iv = phi i32 [ %y, %entry ], [ %iv.next, %loop ]75 %gep.iv = getelementptr inbounds i32, ptr %P, i32 %iv76 %l = load i32, ptr %S77 store i32 %l, ptr %gep.iv, align 478 %iv.next = add nsw i32 %iv, 179 %a = and i32 %l, -280 %c.2 = icmp slt i32 %iv.next, %a81 br i1 %c.2, label %loop, label %exit82 83exit:84 ret void85}86 87define i32 @check_no_dep_via_bounds_compare_symbolic_max_btc_neg_1(ptr %P, i32 %x, i32 %y) {88; CHECK-LABEL: 'check_no_dep_via_bounds_compare_symbolic_max_btc_neg_1'89; CHECK-NEXT: loop:90; 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 loop91; CHECK-NEXT: Unknown data dependence.92; CHECK-NEXT: Dependences:93; CHECK-NEXT: Unknown:94; CHECK-NEXT: store i64 0, ptr %gep.iv, align 4 ->95; CHECK-NEXT: %l.2 = load i32, ptr %gep.P.4, align 496; CHECK-EMPTY:97; CHECK-NEXT: Unknown:98; CHECK-NEXT: %l = load i32, ptr %gep.iv, align 4 ->99; CHECK-NEXT: store i64 0, ptr %gep.iv, align 4100; CHECK-EMPTY:101; CHECK-NEXT: Run-time memory checks:102; CHECK-NEXT: Grouped accesses: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 %gep.P.4 = getelementptr inbounds nuw i8, ptr %P, i32 4111 %gep.P.8 = getelementptr inbounds nuw i8, ptr %P, i32 8112 br label %loop113 114loop:115 %1 = phi i32 [ %x, %entry ], [ %sel, %loop.latch ]116 %iv = phi i32 [ %y, %entry ], [ %iv.next, %loop.latch ]117 %gep.iv = getelementptr inbounds i64, ptr %gep.P.8, i32 %iv118 %l = load i32, ptr %gep.iv, align 4119 %c.1 = icmp eq i32 %l, 3120 br i1 %c.1, label %loop.latch, label %if.then121 122if.then: ; preds = %for.body123 store i64 0, ptr %gep.iv, align 4124 %l.2 = load i32, ptr %gep.P.4125 br label %loop.latch126 127loop.latch:128 %sel = phi i32 [ %l.2, %if.then ], [ %1, %loop ]129 %iv.next = add nsw i32 %iv, 1130 %c.2 = icmp slt i32 %iv.next, %sel131 br i1 %c.2, label %loop, label %exit132 133exit:134 %res = phi i32 [ %iv.next, %loop.latch ]135 ret i32 %res136}137 138; Evaluating at symbolic max BTC wraps around to a positive139; offset: (2 + (2 * %y) + %P).140define void @runtime_check_with_symbolic_max_wraps_to_positive_offset(ptr %P, ptr %S, i32 %x, i32 %y) {141; CHECK-LABEL: 'runtime_check_with_symbolic_max_wraps_to_positive_offset'142; CHECK-NEXT: loop:143; CHECK-NEXT: Memory dependences are safe with run-time checks144; CHECK-NEXT: Dependences:145; CHECK-NEXT: Run-time memory checks:146; CHECK-NEXT: Check 0:147; CHECK-NEXT: Comparing group GRP0:148; CHECK-NEXT: %gep.iv = getelementptr inbounds i16, ptr %P, i32 %iv149; CHECK-NEXT: Against group GRP1:150; CHECK-NEXT: ptr %S151; CHECK-NEXT: Grouped accesses:152; CHECK-NEXT: Group GRP0:153; CHECK-NEXT: (Low: ((2 * %y) + %P) High: inttoptr (i32 -1 to ptr))154; CHECK-NEXT: Member: {((2 * %y) + %P),+,2}<%loop>155; CHECK-NEXT: Group GRP1:156; CHECK-NEXT: (Low: %S High: (4 + %S))157; CHECK-NEXT: Member: %S158; CHECK-EMPTY:159; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.160; CHECK-NEXT: SCEV assumptions:161; CHECK-EMPTY:162; CHECK-NEXT: Expressions re-written:163;164entry:165 br label %loop166 167loop:168 %iv = phi i32 [ %y, %entry ], [ %iv.next, %loop ]169 %gep.iv = getelementptr inbounds i16 , ptr %P, i32 %iv170 %l = load i32, ptr %S171 store i16 0, ptr %gep.iv, align 4172 %iv.next = add nsw i32 %iv, 1173 %a = and i32 %l, 2147483648174 %c.2 = icmp slt i32 %iv.next, %a175 br i1 %c.2, label %loop, label %exit176 177exit:178 ret void179}180