brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.7 KiB · 39d8676 Raw
87 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=slp-vectorizer -mtriple=riscv64 -mattr=+v \3; RUN: -riscv-v-slp-max-vf=0 -S | FileCheck %s4 5; This should not be vectorized, as the cost of computing the offsets nullifies6; the benefits of vectorizing:7;8; copy_with_offset_v2i8:9;         addi    a0, a0, 810;         vsetivli        zero, 2, e8, mf8, ta, ma11;         vle8.v  v8, (a0)12;         addi    a1, a1, 1613;         vse8.v  v8, (a1)14;         ret15;16; Compared to the scalar version where the offsets can be folded into the17; addressing mode:18;19; copy_with_offset_v2i8:20;         lbu     a2, 8(a0)21;         lbu     a0, 9(a0)22;         sb      a2, 16(a1)23;         sb      a0, 17(a1)24;	  ret25 26define void @copy_with_offset_v2i8(ptr noalias %p, ptr noalias %q) {27; CHECK-LABEL: @copy_with_offset_v2i8(28; CHECK-NEXT:  entry:29; CHECK-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 830; CHECK-NEXT:    [[X1:%.*]] = load i8, ptr [[P1]], align 131; CHECK-NEXT:    [[Q1:%.*]] = getelementptr i8, ptr [[Q:%.*]], i32 1632; CHECK-NEXT:    store i8 [[X1]], ptr [[Q1]], align 133; CHECK-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 934; CHECK-NEXT:    [[X2:%.*]] = load i8, ptr [[P2]], align 135; CHECK-NEXT:    [[Q2:%.*]] = getelementptr i8, ptr [[Q]], i32 1736; CHECK-NEXT:    store i8 [[X2]], ptr [[Q2]], align 137; CHECK-NEXT:    ret void38;39entry:40  %p1 = getelementptr i8, ptr %p, i32 841  %x1 = load i8, ptr %p142  %q1 = getelementptr i8, ptr %q, i32 1643  store i8 %x1, ptr %q144 45  %p2 = getelementptr i8, ptr %p, i32 946  %x2 = load i8, ptr %p247  %q2 = getelementptr i8, ptr %q, i32 1748  store i8 %x2, ptr %q249 50  ret void51}52 53; This on the other hand, should be vectorized as the vector savings outweigh54; the GEP costs.55define void @copy_with_offset_v4i8(ptr noalias %p, ptr noalias %q) {56; CHECK-LABEL: @copy_with_offset_v4i8(57; CHECK-NEXT:  entry:58; CHECK-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 859; CHECK-NEXT:    [[Q1:%.*]] = getelementptr i8, ptr [[Q:%.*]], i32 1660; CHECK-NEXT:    [[TMP0:%.*]] = load <4 x i8>, ptr [[P1]], align 161; CHECK-NEXT:    store <4 x i8> [[TMP0]], ptr [[Q1]], align 162; CHECK-NEXT:    ret void63;64entry:65  %p1 = getelementptr i8, ptr %p, i32 866  %x1 = load i8, ptr %p167  %q1 = getelementptr i8, ptr %q, i32 1668  store i8 %x1, ptr %q169 70  %p2 = getelementptr i8, ptr %p, i32 971  %x2 = load i8, ptr %p272  %q2 = getelementptr i8, ptr %q, i32 1773  store i8 %x2, ptr %q274 75  %p3 = getelementptr i8, ptr %p, i32 1076  %x3 = load i8, ptr %p377  %q3 = getelementptr i8, ptr %q, i32 1878  store i8 %x3, ptr %q379 80  %p4 = getelementptr i8, ptr %p, i32 1181  %x4 = load i8, ptr %p482  %q4 = getelementptr i8, ptr %q, i32 1983  store i8 %x4, ptr %q484 85  ret void86}87