diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp --- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp @@ -13475,11 +13475,12 @@ ISD::isBuildVectorOfConstantSDNodes(Val.getNode())) { // Get the constant vector bits APInt NewC(Val.getValueSizeInBits(), 0); + uint64_t EleSize = Val.getScalarValueSizeInBits(); for (unsigned i = 0; i < Val.getNumOperands(); i++) { if (Val.getOperand(i).isUndef()) continue; - NewC.insertBits(Val.getConstantOperandAPInt(i), - i * Val.getScalarValueSizeInBits()); + NewC.insertBits(Val.getConstantOperandAPInt(i).trunc(EleSize), + i * EleSize); } MVT NewVT = MVT::getIntegerVT(MemVT.getSizeInBits()); diff --git a/llvm/test/CodeGen/RISCV/rvv/pr64588.ll b/llvm/test/CodeGen/RISCV/rvv/pr64588.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/rvv/pr64588.ll @@ -0,0 +1,17 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 +; RUN: llc < %s -mtriple riscv64 -mattr=+zve64x | FileCheck %s + +define void @bar(ptr %p, ptr %q) { +; CHECK-LABEL: bar: +; CHECK: # %bb.0: +; CHECK-NEXT: sd zero, 0(a0) +; CHECK-NEXT: sd zero, 8(a0) +; CHECK-NEXT: ret + %v = insertelement <64 x i64> zeroinitializer, i64 0, i32 1 + %trunc = trunc <64 x i64> %v to <64 x i1> + %p1 = getelementptr i8, ptr %p, i32 0 + %p2 = getelementptr i8, ptr %p, i32 8 + store <64 x i1> %trunc, ptr %p1 + store <8 x i8> zeroinitializer, ptr %p2 + ret void +}