From cc39d386a1a12a9f4721d0b9faaf0212b11d2cbd Mon Sep 17 00:00:00 2001 From: Luke Lau Date: Thu, 4 Dec 2025 03:40:46 +0800 Subject: [PATCH] [RISCV] Remove last use of experimental.vp.splat in RISCVCodeGenPrepare. NFCI Stacked on #170539 RISCVCodeGenPrepare is the last user of the vp.splat intrinsic, where it uses it to expand a zero strided load into a scalar load and splat. This replaces it with a regular splat followed by a vp_merge to set the lanes past EVL as poison. We need to set the EVL here because RISCVISelDAGToDAG will try and recombine it back into a zero strided load, and we want to preserve the original VL. We need to set --- llvm/lib/Target/RISCV/RISCVCodeGenPrepare.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Target/RISCV/RISCVCodeGenPrepare.cpp b/llvm/lib/Target/RISCV/RISCVCodeGenPrepare.cpp index ab450f9c4a61d..1ee4c66a5bde5 100644 --- a/llvm/lib/Target/RISCV/RISCVCodeGenPrepare.cpp +++ b/llvm/lib/Target/RISCV/RISCVCodeGenPrepare.cpp @@ -271,8 +271,10 @@ bool RISCVCodeGenPrepare::expandVPStrideLoad(IntrinsicInst &II) { IRBuilder<> Builder(&II); Type *STy = VTy->getElementType(); Value *Val = Builder.CreateLoad(STy, BasePtr); - Value *Res = Builder.CreateIntrinsic(Intrinsic::experimental_vp_splat, {VTy}, - {Val, II.getOperand(2), VL}); + Value *Res = Builder.CreateIntrinsic( + Intrinsic::vp_merge, VTy, + {II.getOperand(2), Builder.CreateVectorSplat(VTy->getElementCount(), Val), + PoisonValue::get(VTy), VL}); II.replaceAllUsesWith(Res); II.eraseFromParent();