brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.7 KiB · 79dcfd2 Raw
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