From 6ee87759e3ddcaca0cda3d9fd53e69cff7315c1d Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Tue, 8 Jul 2025 13:54:11 -0700 Subject: [PATCH] [RISCV][IR] Implement verifier check for llvm.experimental.vp.splice immediate. (#147458) This applies the same check as llvm.vector.splice which checks that the immediate is in the range [-VL, VL-1] where VL is the minimum vector length. If vscale_range is available, the lower bound is used to increase the known minimum vector length for this check. This ensures the immediate is in range for any possible value of vscale that satisfies the vscale_range. --- llvm/lib/IR/Verifier.cpp | 30 ++- .../RISCV/rvv/vp-splice-mask-vectors.ll | 84 +++---- llvm/test/CodeGen/RISCV/rvv/vp-splice.ll | 212 +++++++++--------- llvm/test/Verifier/invalid-vp-intrinsics.ll | 33 +++ 4 files changed, 210 insertions(+), 149 deletions(-) diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index 227afe2b7b61..eb747bc48a8a 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -6939,20 +6939,44 @@ void Verifier::visitVPIntrinsic(VPIntrinsic &VPI) { break; } } - if (VPI.getIntrinsicID() == Intrinsic::vp_fcmp) { + + switch (VPI.getIntrinsicID()) { + case Intrinsic::vp_fcmp: { auto Pred = cast(&VPI)->getPredicate(); Check(CmpInst::isFPPredicate(Pred), "invalid predicate for VP FP comparison intrinsic", &VPI); + break; } - if (VPI.getIntrinsicID() == Intrinsic::vp_icmp) { + case Intrinsic::vp_icmp: { auto Pred = cast(&VPI)->getPredicate(); Check(CmpInst::isIntPredicate(Pred), "invalid predicate for VP integer comparison intrinsic", &VPI); + break; } - if (VPI.getIntrinsicID() == Intrinsic::vp_is_fpclass) { + case Intrinsic::vp_is_fpclass: { auto TestMask = cast(VPI.getOperand(1)); Check((TestMask->getZExtValue() & ~static_cast(fcAllFlags)) == 0, "unsupported bits for llvm.vp.is.fpclass test mask"); + break; + } + case Intrinsic::experimental_vp_splice: { + VectorType *VecTy = cast(VPI.getType()); + int64_t Idx = cast(VPI.getArgOperand(2))->getSExtValue(); + int64_t KnownMinNumElements = VecTy->getElementCount().getKnownMinValue(); + if (VPI.getParent() && VPI.getParent()->getParent()) { + AttributeList Attrs = VPI.getParent()->getParent()->getAttributes(); + if (Attrs.hasFnAttr(Attribute::VScaleRange)) + KnownMinNumElements *= Attrs.getFnAttrs().getVScaleRangeMin(); + } + Check((Idx < 0 && std::abs(Idx) <= KnownMinNumElements) || + (Idx >= 0 && Idx < KnownMinNumElements), + "The splice index exceeds the range [-VL, VL-1] where VL is the " + "known minimum number of elements in the vector. For scalable " + "vectors the minimum number of elements is determined from " + "vscale_range.", + &VPI); + break; + } } } diff --git a/llvm/test/CodeGen/RISCV/rvv/vp-splice-mask-vectors.ll b/llvm/test/CodeGen/RISCV/rvv/vp-splice-mask-vectors.ll index 3b0b18353746..709269904dbd 100644 --- a/llvm/test/CodeGen/RISCV/rvv/vp-splice-mask-vectors.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vp-splice-mask-vectors.ll @@ -10,7 +10,7 @@ declare @llvm.experimental.vp.splice.nxv16i1( @llvm.experimental.vp.splice.nxv32i1(, , i32, , i32, i32) declare @llvm.experimental.vp.splice.nxv64i1(, , i32, , i32, i32) -define @test_vp_splice_nxv1i1( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv1i1( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv1i1: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a1, e8, mf8, ta, ma @@ -22,19 +22,19 @@ define @test_vp_splice_nxv1i1( %va, @llvm.experimental.vp.splice.nxv1i1( %va, %vb, i32 5, splat (i1 1), i32 %evla, i32 %evlb) + %v = call @llvm.experimental.vp.splice.nxv1i1( %va, %vb, i32 1, splat (i1 1), i32 %evla, i32 %evlb) ret %v } -define @test_vp_splice_nxv1i1_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv1i1_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv1i1_negative_offset: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a1, e8, mf8, ta, ma @@ -46,19 +46,19 @@ define @test_vp_splice_nxv1i1_negative_offset( @llvm.experimental.vp.splice.nxv1i1( %va, %vb, i32 -5, splat (i1 1), i32 %evla, i32 %evlb) + %v = call @llvm.experimental.vp.splice.nxv1i1( %va, %vb, i32 -2, splat (i1 1), i32 %evla, i32 %evlb) ret %v } -define @test_vp_splice_nxv1i1_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv1i1_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv1i1_masked: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a1, e8, mf8, ta, ma @@ -70,20 +70,20 @@ define @test_vp_splice_nxv1i1_masked( %va, @llvm.experimental.vp.splice.nxv1i1( %va, %vb, i32 5, %mask, i32 %evla, i32 %evlb) + %v = call @llvm.experimental.vp.splice.nxv1i1( %va, %vb, i32 1, %mask, i32 %evla, i32 %evlb) ret %v } -define @test_vp_splice_nxv2i1( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv2i1( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv2i1: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a1, e8, mf4, ta, ma @@ -95,19 +95,19 @@ define @test_vp_splice_nxv2i1( %va, @llvm.experimental.vp.splice.nxv2i1( %va, %vb, i32 5, splat (i1 1), i32 %evla, i32 %evlb) + %v = call @llvm.experimental.vp.splice.nxv2i1( %va, %vb, i32 3, splat (i1 1), i32 %evla, i32 %evlb) ret %v } -define @test_vp_splice_nxv2i1_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv2i1_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv2i1_negative_offset: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a1, e8, mf4, ta, ma @@ -119,19 +119,19 @@ define @test_vp_splice_nxv2i1_negative_offset( @llvm.experimental.vp.splice.nxv2i1( %va, %vb, i32 -5, splat (i1 1), i32 %evla, i32 %evlb) + %v = call @llvm.experimental.vp.splice.nxv2i1( %va, %vb, i32 -4, splat (i1 1), i32 %evla, i32 %evlb) ret %v } -define @test_vp_splice_nxv2i1_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv2i1_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv2i1_masked: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a1, e8, mf4, ta, ma @@ -143,20 +143,20 @@ define @test_vp_splice_nxv2i1_masked( %va, @llvm.experimental.vp.splice.nxv2i1( %va, %vb, i32 5, %mask, i32 %evla, i32 %evlb) + %v = call @llvm.experimental.vp.splice.nxv2i1( %va, %vb, i32 3, %mask, i32 %evla, i32 %evlb) ret %v } -define @test_vp_splice_nxv4i1( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv4i1( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv4i1: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a1, e8, mf2, ta, ma @@ -180,7 +180,7 @@ define @test_vp_splice_nxv4i1( %va, %v } -define @test_vp_splice_nxv4i1_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv4i1_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv4i1_negative_offset: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a1, e8, mf2, ta, ma @@ -204,7 +204,7 @@ define @test_vp_splice_nxv4i1_negative_offset( %v } -define @test_vp_splice_nxv4i1_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv4i1_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv4i1_masked: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a1, e8, mf2, ta, ma @@ -229,7 +229,7 @@ define @test_vp_splice_nxv4i1_masked( %va, %v } -define @test_vp_splice_nxv8i1( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv8i1( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv8i1: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a1, e8, m1, ta, ma @@ -253,7 +253,7 @@ define @test_vp_splice_nxv8i1( %va, %v } -define @test_vp_splice_nxv8i1_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv8i1_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv8i1_negative_offset: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a1, e8, m1, ta, ma @@ -277,7 +277,7 @@ define @test_vp_splice_nxv8i1_negative_offset( %v } -define @test_vp_splice_nxv8i1_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv8i1_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv8i1_masked: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a1, e8, m1, ta, ma @@ -302,7 +302,7 @@ define @test_vp_splice_nxv8i1_masked( %va, %v } -define @test_vp_splice_nxv16i1( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv16i1( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv16i1: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a1, e8, m2, ta, ma @@ -326,7 +326,7 @@ define @test_vp_splice_nxv16i1( %va, %v } -define @test_vp_splice_nxv16i1_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv16i1_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv16i1_negative_offset: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a1, e8, m2, ta, ma @@ -350,7 +350,7 @@ define @test_vp_splice_nxv16i1_negative_offset( %v } -define @test_vp_splice_nxv16i1_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv16i1_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv16i1_masked: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a1, e8, m2, ta, ma @@ -376,7 +376,7 @@ define @test_vp_splice_nxv16i1_masked( %va, ret %v } -define @test_vp_splice_nxv32i1( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv32i1( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv32i1: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a1, e8, m4, ta, ma @@ -400,7 +400,7 @@ define @test_vp_splice_nxv32i1( %va, %v } -define @test_vp_splice_nxv32i1_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv32i1_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv32i1_negative_offset: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a1, e8, m4, ta, ma @@ -424,7 +424,7 @@ define @test_vp_splice_nxv32i1_negative_offset( %v } -define @test_vp_splice_nxv32i1_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv32i1_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv32i1_masked: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a1, e8, m4, ta, ma @@ -450,7 +450,7 @@ define @test_vp_splice_nxv32i1_masked( %va, ret %v } -define @test_vp_splice_nxv64i1( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv64i1( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv64i1: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a1, e8, m8, ta, ma @@ -474,7 +474,7 @@ define @test_vp_splice_nxv64i1( %va, %v } -define @test_vp_splice_nxv64i1_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv64i1_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv64i1_negative_offset: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a1, e8, m8, ta, ma @@ -498,7 +498,7 @@ define @test_vp_splice_nxv64i1_negative_offset( %v } -define @test_vp_splice_nxv64i1_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv64i1_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv64i1_masked: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a1, e8, m8, ta, ma @@ -523,3 +523,5 @@ define @test_vp_splice_nxv64i1_masked( %va, %v = call @llvm.experimental.vp.splice.nxv64i1( %va, %vb, i32 5, %mask, i32 %evla, i32 %evlb) ret %v } + +attributes #0 = { vscale_range(2,0) } diff --git a/llvm/test/CodeGen/RISCV/rvv/vp-splice.ll b/llvm/test/CodeGen/RISCV/rvv/vp-splice.ll index 9c8c5da75ff7..e6a57ae6b1ea 100644 --- a/llvm/test/CodeGen/RISCV/rvv/vp-splice.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vp-splice.ll @@ -4,33 +4,33 @@ ; RUN: llc -mtriple riscv64 -mattr=+f,+d,+v,+zfh,+zfbfmin,+zvfhmin,+zvfbfmin -verify-machineinstrs \ ; RUN: < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN -define @test_vp_splice_nxv2i64( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv2i64( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv2i64: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, a0, -5 +; CHECK-NEXT: addi a0, a0, -3 ; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma -; CHECK-NEXT: vslidedown.vi v8, v8, 5 +; CHECK-NEXT: vslidedown.vi v8, v8, 3 ; CHECK-NEXT: vsetvli zero, a1, e64, m2, ta, ma ; CHECK-NEXT: vslideup.vx v8, v10, a0 ; CHECK-NEXT: ret - %v = call @llvm.experimental.vp.splice.nxv2i64( %va, %vb, i32 5, splat (i1 1), i32 %evla, i32 %evlb) + %v = call @llvm.experimental.vp.splice.nxv2i64( %va, %vb, i32 3, splat (i1 1), i32 %evla, i32 %evlb) ret %v } -define @test_vp_splice_nxv2i64_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv2i64_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv2i64_negative_offset: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, a0, -5 -; CHECK-NEXT: vsetivli zero, 5, e64, m2, ta, ma +; CHECK-NEXT: addi a0, a0, -3 +; CHECK-NEXT: vsetivli zero, 3, e64, m2, ta, ma ; CHECK-NEXT: vslidedown.vx v8, v8, a0 ; CHECK-NEXT: vsetvli zero, a1, e64, m2, ta, ma -; CHECK-NEXT: vslideup.vi v8, v10, 5 +; CHECK-NEXT: vslideup.vi v8, v10, 3 ; CHECK-NEXT: ret - %v = call @llvm.experimental.vp.splice.nxv2i64( %va, %vb, i32 -5, splat (i1 1), i32 %evla, i32 %evlb) + %v = call @llvm.experimental.vp.splice.nxv2i64( %va, %vb, i32 -3, splat (i1 1), i32 %evla, i32 %evlb) ret %v } -define @test_vp_splice_nxv2i64_zero_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv2i64_zero_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv2i64_zero_offset: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a1, e64, m2, ta, ma @@ -40,98 +40,98 @@ define @test_vp_splice_nxv2i64_zero_offset( ret %v } -define @test_vp_splice_nxv2i64_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv2i64_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv2i64_masked: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, a0, -5 +; CHECK-NEXT: addi a0, a0, -3 ; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma -; CHECK-NEXT: vslidedown.vi v8, v8, 5, v0.t +; CHECK-NEXT: vslidedown.vi v8, v8, 3, v0.t ; CHECK-NEXT: vsetvli zero, a1, e64, m2, ta, mu ; CHECK-NEXT: vslideup.vx v8, v10, a0, v0.t ; CHECK-NEXT: ret - %v = call @llvm.experimental.vp.splice.nxv2i64( %va, %vb, i32 5, %mask, i32 %evla, i32 %evlb) + %v = call @llvm.experimental.vp.splice.nxv2i64( %va, %vb, i32 3, %mask, i32 %evla, i32 %evlb) ret %v } -define @test_vp_splice_nxv1i64( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv1i64( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv1i64: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, a0, -5 +; CHECK-NEXT: addi a0, a0, -1 ; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma -; CHECK-NEXT: vslidedown.vi v8, v8, 5 +; CHECK-NEXT: vslidedown.vi v8, v8, 1 ; CHECK-NEXT: vsetvli zero, a1, e64, m1, ta, ma ; CHECK-NEXT: vslideup.vx v8, v9, a0 ; CHECK-NEXT: ret - %v = call @llvm.experimental.vp.splice.nxv1i64( %va, %vb, i32 5, splat (i1 1), i32 %evla, i32 %evlb) + %v = call @llvm.experimental.vp.splice.nxv1i64( %va, %vb, i32 1, splat (i1 1), i32 %evla, i32 %evlb) ret %v } -define @test_vp_splice_nxv1i64_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv1i64_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv1i64_negative_offset: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, a0, -5 -; CHECK-NEXT: vsetivli zero, 5, e64, m1, ta, ma +; CHECK-NEXT: addi a0, a0, -2 +; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma ; CHECK-NEXT: vslidedown.vx v8, v8, a0 ; CHECK-NEXT: vsetvli zero, a1, e64, m1, ta, ma -; CHECK-NEXT: vslideup.vi v8, v9, 5 +; CHECK-NEXT: vslideup.vi v8, v9, 2 ; CHECK-NEXT: ret - %v = call @llvm.experimental.vp.splice.nxv1i64( %va, %vb, i32 -5, splat (i1 1), i32 %evla, i32 %evlb) + %v = call @llvm.experimental.vp.splice.nxv1i64( %va, %vb, i32 -2, splat (i1 1), i32 %evla, i32 %evlb) ret %v } -define @test_vp_splice_nxv1i64_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv1i64_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv1i64_masked: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, a0, -5 +; CHECK-NEXT: addi a0, a0, -1 ; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma -; CHECK-NEXT: vslidedown.vi v8, v8, 5, v0.t +; CHECK-NEXT: vslidedown.vi v8, v8, 1, v0.t ; CHECK-NEXT: vsetvli zero, a1, e64, m1, ta, mu ; CHECK-NEXT: vslideup.vx v8, v9, a0, v0.t ; CHECK-NEXT: ret - %v = call @llvm.experimental.vp.splice.nxv1i64( %va, %vb, i32 5, %mask, i32 %evla, i32 %evlb) + %v = call @llvm.experimental.vp.splice.nxv1i64( %va, %vb, i32 1, %mask, i32 %evla, i32 %evlb) ret %v } -define @test_vp_splice_nxv2i32( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv2i32( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv2i32: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, a0, -5 +; CHECK-NEXT: addi a0, a0, -3 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma -; CHECK-NEXT: vslidedown.vi v8, v8, 5 +; CHECK-NEXT: vslidedown.vi v8, v8, 3 ; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma ; CHECK-NEXT: vslideup.vx v8, v9, a0 ; CHECK-NEXT: ret - %v = call @llvm.experimental.vp.splice.nxv2i32( %va, %vb, i32 5, splat (i1 1), i32 %evla, i32 %evlb) + %v = call @llvm.experimental.vp.splice.nxv2i32( %va, %vb, i32 3, splat (i1 1), i32 %evla, i32 %evlb) ret %v } -define @test_vp_splice_nxv2i32_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv2i32_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv2i32_negative_offset: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, a0, -5 -; CHECK-NEXT: vsetivli zero, 5, e32, m1, ta, ma +; CHECK-NEXT: addi a0, a0, -4 +; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma ; CHECK-NEXT: vslidedown.vx v8, v8, a0 ; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma -; CHECK-NEXT: vslideup.vi v8, v9, 5 +; CHECK-NEXT: vslideup.vi v8, v9, 4 ; CHECK-NEXT: ret - %v = call @llvm.experimental.vp.splice.nxv2i32( %va, %vb, i32 -5, splat (i1 1), i32 %evla, i32 %evlb) + %v = call @llvm.experimental.vp.splice.nxv2i32( %va, %vb, i32 -4, splat (i1 1), i32 %evla, i32 %evlb) ret %v } -define @test_vp_splice_nxv2i32_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv2i32_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv2i32_masked: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, a0, -5 +; CHECK-NEXT: addi a0, a0, -3 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma -; CHECK-NEXT: vslidedown.vi v8, v8, 5, v0.t +; CHECK-NEXT: vslidedown.vi v8, v8, 3, v0.t ; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, mu ; CHECK-NEXT: vslideup.vx v8, v9, a0, v0.t ; CHECK-NEXT: ret - %v = call @llvm.experimental.vp.splice.nxv2i32( %va, %vb, i32 5, %mask, i32 %evla, i32 %evlb) + %v = call @llvm.experimental.vp.splice.nxv2i32( %va, %vb, i32 3, %mask, i32 %evla, i32 %evlb) ret %v } -define @test_vp_splice_nxv4i16( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv4i16( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv4i16: ; CHECK: # %bb.0: ; CHECK-NEXT: addi a0, a0, -5 @@ -144,7 +144,7 @@ define @test_vp_splice_nxv4i16( %va, %v } -define @test_vp_splice_nxv4i16_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv4i16_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv4i16_negative_offset: ; CHECK: # %bb.0: ; CHECK-NEXT: addi a0, a0, -5 @@ -157,7 +157,7 @@ define @test_vp_splice_nxv4i16_negative_offset( %v } -define @test_vp_splice_nxv4i16_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv4i16_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv4i16_masked: ; CHECK: # %bb.0: ; CHECK-NEXT: addi a0, a0, -5 @@ -170,7 +170,7 @@ define @test_vp_splice_nxv4i16_masked( %va, ret %v } -define @test_vp_splice_nxv8i8( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv8i8( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv8i8: ; CHECK: # %bb.0: ; CHECK-NEXT: addi a0, a0, -5 @@ -183,7 +183,7 @@ define @test_vp_splice_nxv8i8( %va, %v } -define @test_vp_splice_nxv8i8_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv8i8_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv8i8_negative_offset: ; CHECK: # %bb.0: ; CHECK-NEXT: addi a0, a0, -5 @@ -196,7 +196,7 @@ define @test_vp_splice_nxv8i8_negative_offset( %v } -define @test_vp_splice_nxv8i8_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv8i8_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv8i8_masked: ; CHECK: # %bb.0: ; CHECK-NEXT: addi a0, a0, -5 @@ -209,85 +209,85 @@ define @test_vp_splice_nxv8i8_masked( %va, %v } -define @test_vp_splice_nxv1f64( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv1f64( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv1f64: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, a0, -5 +; CHECK-NEXT: addi a0, a0, -1 ; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma -; CHECK-NEXT: vslidedown.vi v8, v8, 5 +; CHECK-NEXT: vslidedown.vi v8, v8, 1 ; CHECK-NEXT: vsetvli zero, a1, e64, m1, ta, ma ; CHECK-NEXT: vslideup.vx v8, v9, a0 ; CHECK-NEXT: ret - %v = call @llvm.experimental.vp.splice.nxv1f64( %va, %vb, i32 5, splat (i1 1), i32 %evla, i32 %evlb) + %v = call @llvm.experimental.vp.splice.nxv1f64( %va, %vb, i32 1, splat (i1 1), i32 %evla, i32 %evlb) ret %v } -define @test_vp_splice_nxv1f64_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv1f64_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv1f64_negative_offset: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, a0, -5 -; CHECK-NEXT: vsetivli zero, 5, e64, m1, ta, ma +; CHECK-NEXT: addi a0, a0, -2 +; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma ; CHECK-NEXT: vslidedown.vx v8, v8, a0 ; CHECK-NEXT: vsetvli zero, a1, e64, m1, ta, ma -; CHECK-NEXT: vslideup.vi v8, v9, 5 +; CHECK-NEXT: vslideup.vi v8, v9, 2 ; CHECK-NEXT: ret - %v = call @llvm.experimental.vp.splice.nxv1f64( %va, %vb, i32 -5, splat (i1 1), i32 %evla, i32 %evlb) + %v = call @llvm.experimental.vp.splice.nxv1f64( %va, %vb, i32 -2, splat (i1 1), i32 %evla, i32 %evlb) ret %v } -define @test_vp_splice_nxv1f64_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv1f64_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv1f64_masked: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, a0, -5 +; CHECK-NEXT: addi a0, a0, -1 ; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma -; CHECK-NEXT: vslidedown.vi v8, v8, 5, v0.t +; CHECK-NEXT: vslidedown.vi v8, v8, 1, v0.t ; CHECK-NEXT: vsetvli zero, a1, e64, m1, ta, mu ; CHECK-NEXT: vslideup.vx v8, v9, a0, v0.t ; CHECK-NEXT: ret - %v = call @llvm.experimental.vp.splice.nxv1f64( %va, %vb, i32 5, %mask, i32 %evla, i32 %evlb) + %v = call @llvm.experimental.vp.splice.nxv1f64( %va, %vb, i32 1, %mask, i32 %evla, i32 %evlb) ret %v } -define @test_vp_splice_nxv2f32( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv2f32( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv2f32: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, a0, -5 +; CHECK-NEXT: addi a0, a0, -3 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma -; CHECK-NEXT: vslidedown.vi v8, v8, 5 +; CHECK-NEXT: vslidedown.vi v8, v8, 3 ; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma ; CHECK-NEXT: vslideup.vx v8, v9, a0 ; CHECK-NEXT: ret - %v = call @llvm.experimental.vp.splice.nxv2f32( %va, %vb, i32 5, splat (i1 1), i32 %evla, i32 %evlb) + %v = call @llvm.experimental.vp.splice.nxv2f32( %va, %vb, i32 3, splat (i1 1), i32 %evla, i32 %evlb) ret %v } -define @test_vp_splice_nxv2f32_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv2f32_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv2f32_negative_offset: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, a0, -5 -; CHECK-NEXT: vsetivli zero, 5, e32, m1, ta, ma +; CHECK-NEXT: addi a0, a0, -3 +; CHECK-NEXT: vsetivli zero, 3, e32, m1, ta, ma ; CHECK-NEXT: vslidedown.vx v8, v8, a0 ; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma -; CHECK-NEXT: vslideup.vi v8, v9, 5 +; CHECK-NEXT: vslideup.vi v8, v9, 3 ; CHECK-NEXT: ret - %v = call @llvm.experimental.vp.splice.nxv2f32( %va, %vb, i32 -5, splat (i1 1), i32 %evla, i32 %evlb) + %v = call @llvm.experimental.vp.splice.nxv2f32( %va, %vb, i32 -3, splat (i1 1), i32 %evla, i32 %evlb) ret %v } -define @test_vp_splice_nxv2f32_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv2f32_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv2f32_masked: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, a0, -5 +; CHECK-NEXT: addi a0, a0, -3 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma -; CHECK-NEXT: vslidedown.vi v8, v8, 5, v0.t +; CHECK-NEXT: vslidedown.vi v8, v8, 3, v0.t ; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, mu ; CHECK-NEXT: vslideup.vx v8, v9, a0, v0.t ; CHECK-NEXT: ret - %v = call @llvm.experimental.vp.splice.nxv2f32( %va, %vb, i32 5, %mask, i32 %evla, i32 %evlb) + %v = call @llvm.experimental.vp.splice.nxv2f32( %va, %vb, i32 3, %mask, i32 %evla, i32 %evlb) ret %v } -define @test_vp_splice_nxv16i64( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) nounwind { +define @test_vp_splice_nxv16i64( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv16i64: ; CHECK: # %bb.0: ; CHECK-NEXT: csrr a4, vlenb @@ -355,7 +355,7 @@ define @test_vp_splice_nxv16i64( %va, %v } -define @test_vp_splice_nxv16i64_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) nounwind { +define @test_vp_splice_nxv16i64_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv16i64_negative_offset: ; CHECK: # %bb.0: ; CHECK-NEXT: csrr a5, vlenb @@ -428,85 +428,85 @@ define @test_vp_splice_nxv16i64_negative_offset( %v } -define @test_vp_splice_nxv2f16( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv2f16( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv2f16: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, a0, -5 +; CHECK-NEXT: addi a0, a0, -3 ; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma -; CHECK-NEXT: vslidedown.vi v8, v8, 5 +; CHECK-NEXT: vslidedown.vi v8, v8, 3 ; CHECK-NEXT: vsetvli zero, a1, e16, mf2, ta, ma ; CHECK-NEXT: vslideup.vx v8, v9, a0 ; CHECK-NEXT: ret - %v = call @llvm.experimental.vp.splice.nxv2f16( %va, %vb, i32 5, splat (i1 1), i32 %evla, i32 %evlb) + %v = call @llvm.experimental.vp.splice.nxv2f16( %va, %vb, i32 3, splat (i1 1), i32 %evla, i32 %evlb) ret %v } -define @test_vp_splice_nxv2f16_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv2f16_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv2f16_negative_offset: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, a0, -5 -; CHECK-NEXT: vsetivli zero, 5, e16, mf2, ta, ma +; CHECK-NEXT: addi a0, a0, -3 +; CHECK-NEXT: vsetivli zero, 3, e16, mf2, ta, ma ; CHECK-NEXT: vslidedown.vx v8, v8, a0 ; CHECK-NEXT: vsetvli zero, a1, e16, mf2, ta, ma -; CHECK-NEXT: vslideup.vi v8, v9, 5 +; CHECK-NEXT: vslideup.vi v8, v9, 3 ; CHECK-NEXT: ret - %v = call @llvm.experimental.vp.splice.nxv2f16( %va, %vb, i32 -5, splat (i1 1), i32 %evla, i32 %evlb) + %v = call @llvm.experimental.vp.splice.nxv2f16( %va, %vb, i32 -3, splat (i1 1), i32 %evla, i32 %evlb) ret %v } -define @test_vp_splice_nxv2f16_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv2f16_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv2f16_masked: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, a0, -5 +; CHECK-NEXT: addi a0, a0, -3 ; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma -; CHECK-NEXT: vslidedown.vi v8, v8, 5, v0.t +; CHECK-NEXT: vslidedown.vi v8, v8, 3, v0.t ; CHECK-NEXT: vsetvli zero, a1, e16, mf2, ta, mu ; CHECK-NEXT: vslideup.vx v8, v9, a0, v0.t ; CHECK-NEXT: ret - %v = call @llvm.experimental.vp.splice.nxv2f16( %va, %vb, i32 5, %mask, i32 %evla, i32 %evlb) + %v = call @llvm.experimental.vp.splice.nxv2f16( %va, %vb, i32 3, %mask, i32 %evla, i32 %evlb) ret %v } -define @test_vp_splice_nxv2bf16( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv2bf16( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv2bf16: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, a0, -5 +; CHECK-NEXT: addi a0, a0, -3 ; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma -; CHECK-NEXT: vslidedown.vi v8, v8, 5 +; CHECK-NEXT: vslidedown.vi v8, v8, 3 ; CHECK-NEXT: vsetvli zero, a1, e16, mf2, ta, ma ; CHECK-NEXT: vslideup.vx v8, v9, a0 ; CHECK-NEXT: ret - %v = call @llvm.experimental.vp.splice.nxv2bf16( %va, %vb, i32 5, splat (i1 1), i32 %evla, i32 %evlb) + %v = call @llvm.experimental.vp.splice.nxv2bf16( %va, %vb, i32 3, splat (i1 1), i32 %evla, i32 %evlb) ret %v } -define @test_vp_splice_nxv2bf16_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv2bf16_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv2bf16_negative_offset: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, a0, -5 -; CHECK-NEXT: vsetivli zero, 5, e16, mf2, ta, ma +; CHECK-NEXT: addi a0, a0, -3 +; CHECK-NEXT: vsetivli zero, 3, e16, mf2, ta, ma ; CHECK-NEXT: vslidedown.vx v8, v8, a0 ; CHECK-NEXT: vsetvli zero, a1, e16, mf2, ta, ma -; CHECK-NEXT: vslideup.vi v8, v9, 5 +; CHECK-NEXT: vslideup.vi v8, v9, 3 ; CHECK-NEXT: ret - %v = call @llvm.experimental.vp.splice.nxv2bf16( %va, %vb, i32 -5, splat (i1 1), i32 %evla, i32 %evlb) + %v = call @llvm.experimental.vp.splice.nxv2bf16( %va, %vb, i32 -3, splat (i1 1), i32 %evla, i32 %evlb) ret %v } -define @test_vp_splice_nxv2bf16_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) { +define @test_vp_splice_nxv2bf16_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; CHECK-LABEL: test_vp_splice_nxv2bf16_masked: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, a0, -5 +; CHECK-NEXT: addi a0, a0, -3 ; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma -; CHECK-NEXT: vslidedown.vi v8, v8, 5, v0.t +; CHECK-NEXT: vslidedown.vi v8, v8, 3, v0.t ; CHECK-NEXT: vsetvli zero, a1, e16, mf2, ta, mu ; CHECK-NEXT: vslideup.vx v8, v9, a0, v0.t ; CHECK-NEXT: ret - %v = call @llvm.experimental.vp.splice.nxv2bf16( %va, %vb, i32 5, %mask, i32 %evla, i32 %evlb) + %v = call @llvm.experimental.vp.splice.nxv2bf16( %va, %vb, i32 3, %mask, i32 %evla, i32 %evlb) ret %v } -define @test_vp_splice_nxv2i32_with_firstelt(i32 %first, %vb, %mask, i32 zeroext %evl) { +define @test_vp_splice_nxv2i32_with_firstelt(i32 %first, %vb, %mask, i32 zeroext %evl) #0 { ; CHECK-LABEL: test_vp_splice_nxv2i32_with_firstelt: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma @@ -518,7 +518,7 @@ define @test_vp_splice_nxv2i32_with_firstelt(i32 %first, %v } -define @test_vp_splice_nxv2i32_with_splat_firstelt(i32 %first, %vb, %mask, i32 zeroext %evl) { +define @test_vp_splice_nxv2i32_with_splat_firstelt(i32 %first, %vb, %mask, i32 zeroext %evl) #0 { ; CHECK-LABEL: test_vp_splice_nxv2i32_with_splat_firstelt: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma @@ -531,7 +531,7 @@ define @test_vp_splice_nxv2i32_with_splat_firstelt(i32 %first ret %v } -define @test_vp_splice_nxv2f32_with_firstelt(float %first, %vb, %mask, i32 zeroext %evl) { +define @test_vp_splice_nxv2f32_with_firstelt(float %first, %vb, %mask, i32 zeroext %evl) #0 { ; CHECK-LABEL: test_vp_splice_nxv2f32_with_firstelt: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma @@ -543,7 +543,7 @@ define @test_vp_splice_nxv2f32_with_firstelt(float %first, ret %v } -define @test_vp_splice_nxv2f16_with_firstelt(half %first, %vb, %mask, i32 zeroext %evl) { +define @test_vp_splice_nxv2f16_with_firstelt(half %first, %vb, %mask, i32 zeroext %evl) #0 { ; ZVFH-LABEL: test_vp_splice_nxv2f16_with_firstelt: ; ZVFH: # %bb.0: ; ZVFH-NEXT: vsetvli zero, a0, e16, mf2, ta, ma @@ -563,7 +563,7 @@ define @test_vp_splice_nxv2f16_with_firstelt(half %first, %v } -define @test_vp_splice_nxv2bf16_with_firstelt(bfloat %first, %vb, %mask, i32 zeroext %evl) { +define @test_vp_splice_nxv2bf16_with_firstelt(bfloat %first, %vb, %mask, i32 zeroext %evl) #0 { ; CHECK-LABEL: test_vp_splice_nxv2bf16_with_firstelt: ; CHECK: # %bb.0: ; CHECK-NEXT: fmv.x.h a1, fa0 @@ -575,3 +575,5 @@ define @test_vp_splice_nxv2bf16_with_firstelt(bfloat %firs %v = call @llvm.experimental.vp.splice.nxv2bf16( %va, %vb, i32 0, %mask, i32 1, i32 %evl) ret %v } + +attributes #0 = { nounwind vscale_range(2,0) } diff --git a/llvm/test/Verifier/invalid-vp-intrinsics.ll b/llvm/test/Verifier/invalid-vp-intrinsics.ll index 08639352c3ea..9923867757e7 100644 --- a/llvm/test/Verifier/invalid-vp-intrinsics.ll +++ b/llvm/test/Verifier/invalid-vp-intrinsics.ll @@ -33,3 +33,36 @@ define void @test_vp_icmp(<4 x i32> %a, <4 x i32> %b, <4 x i1> %m, i32 %n) { %r1 = call <4 x i1> @llvm.vp.icmp.v4i32(<4 x i32> %a, <4 x i32> %b, metadata !"oeq", <4 x i1> %m, i32 %n) ret void } + +; CHECK: The splice index exceeds the range [-VL, VL-1] where VL is the known minimum number of elements in the vector +define <2 x double> @splice_v2f64_idx_neg3(<2 x double> %a, <2 x double> %b, i32 %evl1, i32 %evl2) #0 { + %res = call <2 x double> @llvm.experimental.vp.splice.v2f64(<2 x double> %a, <2 x double> %b, i32 -3, <2 x i1> splat (i1 1), i32 %evl1, i32 %evl2) + ret <2 x double> %res +} + +; CHECK: The splice index exceeds the range [-VL, VL-1] where VL is the known minimum number of elements in the vector +define @splice_nxv2f64_idx_neg3_vscale_min1( %a, %b, i32 %evl1, i32 %evl2) #0 { + %res = call @llvm.experimental.vp.splice.nxv2f64( %a, %b, i32 -3, splat (i1 1), i32 %evl1, i32 %evl2) + ret %res +} + +; CHECK: The splice index exceeds the range [-VL, VL-1] where VL is the known minimum number of elements in the vector +define @splice_nxv2f64_idx_neg5_vscale_min2( %a, %b, i32 %evl1, i32 %evl2) #1 { + %res = call @llvm.experimental.vp.splice.nxv2f64( %a, %b, i32 -5, splat (i1 1), i32 %evl1, i32 %evl2) + ret %res +} + +; CHECK: The splice index exceeds the range [-VL, VL-1] where VL is the known minimum number of elements in the vector +define <2 x double> @splice_v2f64_idx2(<2 x double> %a, <2 x double> %b, i32 %evl1, i32 %evl2) #0 { + %res = call <2 x double> @llvm.experimental.vp.splice.v2f64(<2 x double> %a, <2 x double> %b, i32 2, <2 x i1> splat (i1 1), i32 %evl1, i32 %evl2) + ret <2 x double> %res +} + +; CHECK: The splice index exceeds the range [-VL, VL-1] where VL is the known minimum number of elements in the vector +define <2 x double> @splice_v2f64_idx3(<2 x double> %a, <2 x double> %b, i32 %evl1, i32 %evl2) #1 { + %res = call <2 x double> @llvm.experimental.vp.splice.v2f64(<2 x double> %a, <2 x double> %b, i32 4, <2 x i1> splat (i1 1), i32 %evl1, i32 %evl2) + ret <2 x double> %res +} + +attributes #0 = { vscale_range(1,16) } +attributes #1 = { vscale_range(2,16) }