diff --git a/llvm/include/llvm/IR/IRBuilder.h b/llvm/include/llvm/IR/IRBuilder.h --- a/llvm/include/llvm/IR/IRBuilder.h +++ b/llvm/include/llvm/IR/IRBuilder.h @@ -2452,6 +2452,16 @@ return CreateExtractElement(Vec, getInt64(Idx), Name); } + Value *CreateInsertElement(Type *VecTy, Value *NewElt, Value *Idx, + const Twine &Name = "") { + return CreateInsertElement(PoisonValue::get(VecTy), NewElt, Idx, Name); + } + + Value *CreateInsertElement(Type *VecTy, Value *NewElt, uint64_t Idx, + const Twine &Name = "") { + return CreateInsertElement(PoisonValue::get(VecTy), NewElt, Idx, Name); + } + Value *CreateInsertElement(Value *Vec, Value *NewElt, Value *Idx, const Twine &Name = "") { if (auto *VC = dyn_cast(Vec)) diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp --- a/llvm/lib/IR/AutoUpgrade.cpp +++ b/llvm/lib/IR/AutoUpgrade.cpp @@ -2417,7 +2417,7 @@ EltTy->getPointerTo()); Value *Load = Builder.CreateLoad(EltTy, Cast); Type *I32Ty = Type::getInt32Ty(C); - Rep = UndefValue::get(VecTy); + Rep = PoisonValue::get(VecTy); for (unsigned I = 0; I < EltNum; ++I) Rep = Builder.CreateInsertElement(Rep, Load, ConstantInt::get(I32Ty, I)); diff --git a/llvm/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp b/llvm/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp --- a/llvm/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp @@ -212,7 +212,7 @@ // If any of the elements has been modified, construct the equivalent // vector or aggregate value with a set instructions and the converted // elements. - Value *NewValue = UndefValue::get(C->getType()); + Value *NewValue = PoisonValue::get(C->getType()); if (isa(C)) { for (unsigned i = 0; i < NumOperands; ++i) { Value *Idx = ConstantInt::get(Type::getInt32Ty(M->getContext()), i); diff --git a/llvm/unittests/IR/IRBuilderTest.cpp b/llvm/unittests/IR/IRBuilderTest.cpp --- a/llvm/unittests/IR/IRBuilderTest.cpp +++ b/llvm/unittests/IR/IRBuilderTest.cpp @@ -878,8 +878,7 @@ auto VecTy = FixedVectorType::get(Builder.getInt64Ty(), 4); auto Elt1 = Builder.getInt64(-1); auto Elt2 = Builder.getInt64(-2); - Value *Vec = UndefValue::get(VecTy); - Vec = Builder.CreateInsertElement(Vec, Elt1, Builder.getInt8(1)); + Value *Vec = Builder.CreateInsertElement(VecTy, Elt1, Builder.getInt8(1)); Vec = Builder.CreateInsertElement(Vec, Elt2, 2); auto X1 = Builder.CreateExtractElement(Vec, 1); auto X2 = Builder.CreateExtractElement(Vec, Builder.getInt32(2)); diff --git a/llvm/unittests/IR/PatternMatch.cpp b/llvm/unittests/IR/PatternMatch.cpp --- a/llvm/unittests/IR/PatternMatch.cpp +++ b/llvm/unittests/IR/PatternMatch.cpp @@ -940,8 +940,7 @@ VecElemIdxs.push_back(ConstantInt::get(i32, 2)); auto *IdxVec = ConstantVector::get(VecElemIdxs); - Value *UndefVec = UndefValue::get(VecTy); - Value *VI1 = IRB.CreateInsertElement(UndefVec, IRB.getInt8(1), (uint64_t)0); + Value *VI1 = IRB.CreateInsertElement(VecTy, IRB.getInt8(1), (uint64_t)0); Value *VI2 = IRB.CreateInsertElement(VI1, Val2, Val); Value *VI3 = IRB.CreateInsertElement(VI1, Val2, (uint64_t)1); Value *VI4 = IRB.CreateInsertElement(VI1, IRB.getInt8(2), Val);