diff --git a/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp b/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp index 6b4d2168e7493..c2552a95ad210 100644 --- a/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp @@ -2387,8 +2387,10 @@ SDValue NVPTXTargetLowering::LowerVECTOR_SHUFFLE(SDValue Op, const ShuffleVectorSDNode *SVN = cast(Op.getNode()); SDValue V2 = Op.getOperand(1); uint32_t Selector = 0; - for (auto I : llvm::enumerate(SVN->getMask())) - Selector |= (I.value() << (I.index() * 4)); + for (auto I : llvm::enumerate(SVN->getMask())) { + if (I.value() != -1) // -1 is a placeholder for undef. + Selector |= (I.value() << (I.index() * 4)); + } SDLoc DL(Op); return DAG.getNode(NVPTXISD::PRMT, DL, MVT::v4i8, V1, V2, diff --git a/llvm/test/CodeGen/NVPTX/shuffle-vec-undef-init.ll b/llvm/test/CodeGen/NVPTX/shuffle-vec-undef-init.ll new file mode 100644 index 0000000000000..4f147f28e1a57 --- /dev/null +++ b/llvm/test/CodeGen/NVPTX/shuffle-vec-undef-init.ll @@ -0,0 +1,18 @@ +; RUN: llc < %s -march=nvptx -mcpu=sm_20 -verify-machineinstrs | FileCheck %s +; RUN: llc < %s -march=nvptx -mcpu=sm_20 -verify-machineinstrs | FileCheck %s -check-prefix=CHECK-FOUND + +define void @kernel_func(ptr %in.vec, ptr %out.vec0) nounwind { + entry: + %wide.vec = load <32 x i8>, ptr %in.vec, align 64 + %vec0 = shufflevector <32 x i8> %wide.vec, <32 x i8> undef, <4 x i32> + store <4 x i8> %vec0, ptr %out.vec0, align 64 + ret void + +; CHECK-FOUND: prmt.b32 {{.*}} 16384; +; CHECK-FOUND: prmt.b32 {{.*}} 64; +; CHECK-FOUND: prmt.b32 {{.*}} 30224; + +; CHECK: @kernel_func +; CHECK-NOT: prmt.b32 {{.*}} -1; +; CHECK: -- End function +}