152 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 52; RUN: opt -disable-output -passes='print<access-info>' %s 2>&1 | FileCheck %s3 4target datalayout = "e-m:e-p:128:128:128"5 6; Tests with 128 bit inductions and 128 bit pointer width and index size.7 8 9define void @backward_i128(ptr %A, i128 %n) {10; CHECK-LABEL: 'backward_i128'11; CHECK-NEXT: loop:12; 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 loop13; CHECK-NEXT: Backward loop carried data dependence.14; CHECK-NEXT: Dependences:15; CHECK-NEXT: Backward:16; CHECK-NEXT: %l = load i32, ptr %gep.A, align 4 ->17; CHECK-NEXT: store i32 %l, ptr %gep.A.1, align 418; CHECK-EMPTY:19; CHECK-NEXT: Run-time memory checks:20; CHECK-NEXT: Grouped accesses:21; CHECK-EMPTY:22; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.23; CHECK-NEXT: SCEV assumptions:24; CHECK-EMPTY:25; CHECK-NEXT: Expressions re-written:26;27entry:28 br label %loop29 30loop:31 %iv = phi i128 [ 0, %entry ], [ %iv.next, %loop ]32 %gep.A = getelementptr inbounds i32, ptr %A, i128 %iv33 %l = load i32, ptr %gep.A34 %iv.1 = add nuw nsw i128 %iv, 135 %gep.A.1 = getelementptr inbounds i32, ptr %A, i128 %iv.136 store i32 %l, ptr %gep.A.137 %iv.next = add i128 %iv, 138 %ec = icmp eq i128 %iv.next, %n39 br i1 %ec, label %exit, label %loop40 41exit:42 ret void43}44 45define void @forward_i128(ptr %A, i128 %n) {46; CHECK-LABEL: 'forward_i128'47; CHECK-NEXT: loop:48; CHECK-NEXT: Memory dependences are safe49; CHECK-NEXT: Dependences:50; CHECK-NEXT: Forward:51; CHECK-NEXT: %l = load i32, ptr %gep.A.1, align 4 ->52; CHECK-NEXT: store i32 %l, ptr %gep.A, align 453; CHECK-EMPTY:54; CHECK-NEXT: Run-time memory checks:55; CHECK-NEXT: Grouped accesses:56; CHECK-EMPTY:57; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.58; CHECK-NEXT: SCEV assumptions:59; CHECK-EMPTY:60; CHECK-NEXT: Expressions re-written:61;62entry:63 br label %loop64 65loop:66 %iv = phi i128 [ 0, %entry ], [ %iv.next, %loop ]67 %iv.1 = add nuw nsw i128 %iv, 168 %gep.A.1 = getelementptr inbounds i32, ptr %A, i128 %iv.169 %l = load i32, ptr %gep.A.170 %gep.A = getelementptr inbounds i32, ptr %A, i128 %iv71 store i32 %l, ptr %gep.A72 %iv.next = add i128 %iv, 173 %ec = icmp eq i128 %iv.next, %n74 br i1 %ec, label %exit, label %loop75 76exit:77 ret void78}79 80define void @forward_negative_step(ptr %A, i128 %n) {81; CHECK-LABEL: 'forward_negative_step'82; CHECK-NEXT: loop:83; CHECK-NEXT: Memory dependences are safe84; CHECK-NEXT: Dependences:85; CHECK-NEXT: Forward:86; CHECK-NEXT: %l = load i32, ptr %gep.A, align 4 ->87; CHECK-NEXT: store i32 %l, ptr %gep.A.1, align 488; CHECK-EMPTY:89; CHECK-NEXT: Run-time memory checks:90; CHECK-NEXT: Grouped accesses:91; CHECK-EMPTY:92; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.93; CHECK-NEXT: SCEV assumptions:94; CHECK-EMPTY:95; CHECK-NEXT: Expressions re-written:96;97entry:98 br label %loop99 100loop:101 %iv = phi i128 [ 36893488147419103232, %entry ], [ %iv.next, %loop ]102 %gep.A = getelementptr inbounds i32, ptr %A, i128 %iv103 %l = load i32, ptr %gep.A104 %iv.1 = add nuw nsw i128 %iv, 1105 %gep.A.1 = getelementptr inbounds i32, ptr %A, i128 %iv.1106 store i32 %l, ptr %gep.A.1107 %iv.next = add nsw i128 %iv, -1108 %ec = icmp eq i128 %iv.next, %n109 br i1 %ec, label %exit, label %loop110 111exit:112 ret void113}114 115; The induction step is i128 2^63 + 1, which does not fit into a 64 bit signed116; integer.117define void @forward_i128_step_63bit_plus_one(ptr %A, i128 %n) {118; CHECK-LABEL: 'forward_i128_step_63bit_plus_one'119; CHECK-NEXT: loop:120; 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 loop121; CHECK-NEXT: Unsafe indirect dependence.122; CHECK-NEXT: Dependences:123; CHECK-NEXT: IndirectUnsafe:124; CHECK-NEXT: %l = load i32, ptr %gep.A.1, align 4 ->125; CHECK-NEXT: store i32 %l, ptr %gep.A, align 4126; CHECK-EMPTY:127; CHECK-NEXT: Run-time memory checks:128; CHECK-NEXT: Grouped accesses:129; CHECK-EMPTY:130; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.131; CHECK-NEXT: SCEV assumptions:132; CHECK-EMPTY:133; CHECK-NEXT: Expressions re-written:134;135entry:136 br label %loop137 138loop:139 %iv = phi i128 [ 0, %entry ], [ %iv.next, %loop ]140 %iv.1 = add nuw nsw i128 %iv, 1141 %gep.A.1 = getelementptr inbounds i32, ptr %A, i128 %iv.1142 %l = load i32, ptr %gep.A.1143 %gep.A = getelementptr inbounds i32, ptr %A, i128 %iv144 store i32 %l, ptr %gep.A145 %iv.next = add i128 %iv, 9223372036854775809146 %ec = icmp eq i128 %iv.next, %n147 br i1 %ec, label %exit, label %loop148 149exit:150 ret void151}152