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