261 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 -mtriple=riscv64 -mattr=+v < %s 2>&1 | FileCheck %s3; RUN: opt -passes='print<access-info>' -disable-output -mtriple=x86_64 < %s 2>&1 | FileCheck %s4 5; REQUIRES: riscv-registered-target, x86-registered-target6 7; Dependence distance between read and write is greater than the trip8; count of the loop. Thus, values written are never read for any9; valid vectorization of the loop.10define void @test(ptr %p) {11; CHECK-LABEL: 'test'12; CHECK-NEXT: loop:13; CHECK-NEXT: Memory dependences are safe14; CHECK-NEXT: Dependences:15; CHECK-NEXT: Run-time memory checks:16; CHECK-NEXT: Grouped accesses:17; CHECK-EMPTY:18; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.19; CHECK-NEXT: SCEV assumptions:20; CHECK-EMPTY:21; CHECK-NEXT: Expressions re-written:22;23entry:24 br label %loop25 26loop:27 %iv = phi i64 [0, %entry], [%iv.next, %loop]28 %a1 = getelementptr i64, ptr %p, i64 %iv29 %v = load i64, ptr %a1, align 830 %offset = add i64 %iv, 20031 %a2 = getelementptr i64, ptr %p, i64 %offset32 store i64 %v, ptr %a2, align 833 %iv.next = add i64 %iv, 134 %cmp = icmp ne i64 %iv, 19935 br i1 %cmp, label %loop, label %exit36 37exit:38 ret void39}40 41; Dependence distance is less than trip count, thus we must prove that42; chosen VF guaranteed to be less than dependence distance.43define void @test_may_clobber1(ptr %p) {44; CHECK-LABEL: 'test_may_clobber1'45; CHECK-NEXT: loop:46; CHECK-NEXT: Memory dependences are safe with a maximum safe vector width of 6400 bits, with a maximum safe store-load forward width of 256 bits47; CHECK-NEXT: Dependences:48; CHECK-NEXT: BackwardVectorizable:49; CHECK-NEXT: %v = load i64, ptr %a1, align 32 ->50; CHECK-NEXT: store i64 %v, ptr %a2, align 3251; CHECK-EMPTY:52; CHECK-NEXT: Run-time memory checks:53; CHECK-NEXT: Grouped accesses:54; CHECK-EMPTY:55; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.56; CHECK-NEXT: SCEV assumptions:57; CHECK-EMPTY:58; CHECK-NEXT: Expressions re-written:59;60entry:61 br label %loop62 63loop:64 %iv = phi i64 [0, %entry], [%iv.next, %loop]65 %a1 = getelementptr i64, ptr %p, i64 %iv66 %v = load i64, ptr %a1, align 3267 %offset = add i64 %iv, 10068 %a2 = getelementptr i64, ptr %p, i64 %offset69 store i64 %v, ptr %a2, align 3270 %iv.next = add i64 %iv, 171 %cmp = icmp ne i64 %iv, 19972 br i1 %cmp, label %loop, label %exit73 74exit:75 ret void76}77 78define void @test_may_clobber2(ptr %p) {79; CHECK-LABEL: 'test_may_clobber2'80; CHECK-NEXT: loop:81; 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 loop82; CHECK-NEXT: Backward loop carried data dependence that prevents store-to-load forwarding.83; CHECK-NEXT: Dependences:84; CHECK-NEXT: BackwardVectorizableButPreventsForwarding:85; CHECK-NEXT: %v = load i64, ptr %a1, align 32 ->86; CHECK-NEXT: store i64 %v, ptr %a2, align 3287; CHECK-EMPTY:88; CHECK-NEXT: Run-time memory checks:89; CHECK-NEXT: Grouped accesses:90; CHECK-EMPTY:91; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.92; CHECK-NEXT: SCEV assumptions:93; CHECK-EMPTY:94; CHECK-NEXT: Expressions re-written:95;96entry:97 br label %loop98 99loop:100 %iv = phi i64 [0, %entry], [%iv.next, %loop]101 %a1 = getelementptr i64, ptr %p, i64 %iv102 %v = load i64, ptr %a1, align 32103 %offset = add i64 %iv, 9104 %a2 = getelementptr i64, ptr %p, i64 %offset105 store i64 %v, ptr %a2, align 32106 %iv.next = add i64 %iv, 1107 %cmp = icmp ne i64 %iv, 199108 br i1 %cmp, label %loop, label %exit109 110exit:111 ret void112}113 114define void @test_may_clobber3(ptr %p) {115; CHECK-LABEL: 'test_may_clobber3'116; CHECK-NEXT: loop:117; CHECK-NEXT: Memory dependences are safe with a maximum safe vector width of 640 bits, with a maximum safe store-load forward width of 128 bits118; CHECK-NEXT: Dependences:119; CHECK-NEXT: BackwardVectorizable:120; CHECK-NEXT: %v = load i64, ptr %a1, align 32 ->121; CHECK-NEXT: store i64 %v, ptr %a2, align 32122; CHECK-EMPTY:123; CHECK-NEXT: Run-time memory checks:124; CHECK-NEXT: Grouped accesses:125; CHECK-EMPTY:126; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.127; CHECK-NEXT: SCEV assumptions:128; CHECK-EMPTY:129; CHECK-NEXT: Expressions re-written:130;131entry:132 br label %loop133 134loop:135 %iv = phi i64 [0, %entry], [%iv.next, %loop]136 %a1 = getelementptr i64, ptr %p, i64 %iv137 %v = load i64, ptr %a1, align 32138 %offset = add i64 %iv, 10139 %a2 = getelementptr i64, ptr %p, i64 %offset140 store i64 %v, ptr %a2, align 32141 %iv.next = add i64 %iv, 1142 %cmp = icmp ne i64 %iv, 199143 br i1 %cmp, label %loop, label %exit144 145exit:146 ret void147}148 149; Trivially no overlap due to minimum distance (8192) exceeding value of VLEN and LMUL.150define void @trivial_due_max_vscale(ptr %p) {151; CHECK-LABEL: 'trivial_due_max_vscale'152; CHECK-NEXT: loop:153; CHECK-NEXT: Memory dependences are safe154; CHECK-NEXT: Dependences:155; CHECK-NEXT: Run-time memory checks:156; CHECK-NEXT: Grouped accesses:157; CHECK-EMPTY:158; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.159; CHECK-NEXT: SCEV assumptions:160; CHECK-EMPTY:161; CHECK-NEXT: Expressions re-written:162;163entry:164 br label %loop165 166loop:167 %iv = phi i64 [0, %entry], [%iv.next, %loop]168 %a1 = getelementptr i64, ptr %p, i64 %iv169 %v = load i64, ptr %a1, align 32170 %offset = add i64 %iv, 8192171 %a2 = getelementptr i64, ptr %p, i64 %offset172 store i64 %v, ptr %a2, align 32173 %iv.next = add i64 %iv, 1174 %cmp = icmp ne i64 %iv, 199175 br i1 %cmp, label %loop, label %exit176 177exit:178 ret void179}180 181; Dependence distance could be violated via LMUL>=2 or interleaving.182define void @no_high_lmul_or_interleave(ptr %p) {183; CHECK-LABEL: 'no_high_lmul_or_interleave'184; CHECK-NEXT: loop:185; CHECK-NEXT: Memory dependences are safe with a maximum safe vector width of 65536 bits186; CHECK-NEXT: Dependences:187; CHECK-NEXT: BackwardVectorizable:188; CHECK-NEXT: %v = load i64, ptr %a1, align 32 ->189; CHECK-NEXT: store i64 %v, ptr %a2, align 32190; CHECK-EMPTY:191; CHECK-NEXT: Run-time memory checks:192; CHECK-NEXT: Grouped accesses:193; CHECK-EMPTY:194; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.195; CHECK-NEXT: SCEV assumptions:196; CHECK-EMPTY:197; CHECK-NEXT: Expressions re-written:198;199entry:200 br label %loop201 202loop:203 %iv = phi i64 [0, %entry], [%iv.next, %loop]204 %a1 = getelementptr i64, ptr %p, i64 %iv205 %v = load i64, ptr %a1, align 32206 %offset = add i64 %iv, 1024207 %a2 = getelementptr i64, ptr %p, i64 %offset208 store i64 %v, ptr %a2, align 32209 %iv.next = add i64 %iv, 1210 %cmp = icmp ne i64 %iv, 3001211 br i1 %cmp, label %loop, label %exit212 213exit:214 ret void215}216 217define void @non_power_2_storeloadforward(ptr %A) {218; CHECK-LABEL: 'non_power_2_storeloadforward'219; CHECK-NEXT: loop:220; 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 loop221; CHECK-NEXT: Backward loop carried data dependence that prevents store-to-load forwarding.222; CHECK-NEXT: Dependences:223; CHECK-NEXT: Forward:224; CHECK-NEXT: %3 = load i32, ptr %gep.iv.4, align 4 ->225; CHECK-NEXT: store i32 %add3, ptr %gep.iv, align 4226; CHECK-EMPTY:227; CHECK-NEXT: BackwardVectorizableButPreventsForwarding:228; CHECK-NEXT: %1 = load i32, ptr %gep.iv.sub.3, align 4 ->229; CHECK-NEXT: store i32 %add3, ptr %gep.iv, align 4230; CHECK-EMPTY:231; CHECK-NEXT: Run-time memory checks:232; CHECK-NEXT: Grouped accesses:233; CHECK-EMPTY:234; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.235; CHECK-NEXT: SCEV assumptions:236; CHECK-EMPTY:237; CHECK-NEXT: Expressions re-written:238;239entry:240 br label %loop241 242loop:243 %iv = phi i64 [ 16, %entry ], [ %iv.next, %loop ]244 %0 = add nsw i64 %iv, -3245 %gep.iv.sub.3 = getelementptr inbounds i32, ptr %A, i64 %0246 %1 = load i32, ptr %gep.iv.sub.3, align 4247 %2 = add nsw i64 %iv, 4248 %gep.iv.4 = getelementptr inbounds i32, ptr %A, i64 %2249 %3 = load i32, ptr %gep.iv.4, align 4250 %add3 = add nsw i32 %3, %1251 %gep.iv = getelementptr inbounds i32, ptr %A, i64 %iv252 store i32 %add3, ptr %gep.iv, align 4253 %iv.next = add i64 %iv, 1254 %iv.trunc = trunc i64 %iv.next to i32255 %exitcond = icmp ne i32 %iv.trunc, 128256 br i1 %exitcond, label %loop, label %exit257 258exit:259 ret void260}261