diff --git a/llvm/lib/IR/Instructions.cpp b/llvm/lib/IR/Instructions.cpp index 7c64ca7b72753..3559bb3c9c6b7 100644 --- a/llvm/lib/IR/Instructions.cpp +++ b/llvm/lib/IR/Instructions.cpp @@ -309,6 +309,7 @@ CallInst *CallInst::Create(CallInst *CI, ArrayRef OpB, NewCI->setCallingConv(CI->getCallingConv()); NewCI->SubclassOptionalData = CI->SubclassOptionalData; NewCI->setAttributes(CI->getAttributes()); + NewCI->setDebugLoc(CI->getDebugLoc()); return NewCI; } @@ -596,6 +597,7 @@ InvokeInst *InvokeInst::Create(InvokeInst *II, ArrayRef OpB, NewII->setCallingConv(II->getCallingConv()); NewII->SubclassOptionalData = II->SubclassOptionalData; NewII->setAttributes(II->getAttributes()); + NewII->setDebugLoc(II->getDebugLoc()); return NewII; } diff --git a/llvm/lib/Transforms/Utils/InlineFunction.cpp b/llvm/lib/Transforms/Utils/InlineFunction.cpp index 2d38f1cea5757..185bc6da31ebb 100644 --- a/llvm/lib/Transforms/Utils/InlineFunction.cpp +++ b/llvm/lib/Transforms/Utils/InlineFunction.cpp @@ -1447,7 +1447,6 @@ bool llvm::InlineFunction(CallSite CS, InlineFunctionInfo &IFI, NewInst = CallInst::Create(cast(I), OpBundles, I); else NewInst = InvokeInst::Create(cast(I), OpBundles, I); - NewInst->setDebugLoc(I->getDebugLoc()); NewInst->takeName(I); I->replaceAllUsesWith(NewInst); I->eraseFromParent(); diff --git a/llvm/unittests/IR/InstructionsTest.cpp b/llvm/unittests/IR/InstructionsTest.cpp index 3ca3ad2b6e837..afcccb31de1ca 100644 --- a/llvm/unittests/IR/InstructionsTest.cpp +++ b/llvm/unittests/IR/InstructionsTest.cpp @@ -518,7 +518,66 @@ TEST(InstructionsTest, CloneCall) { } } -} // end anonymous namespace -} // end namespace llvm +TEST(InstructionsTest, AlterCallBundles) { + LLVMContext &C(getGlobalContext()); + Type *Int32Ty = Type::getInt32Ty(C); + Type *FnTy = FunctionType::get(Int32Ty, Int32Ty, /*isVarArg=*/false); + Value *Callee = Constant::getNullValue(FnTy->getPointerTo()); + Value *Args[] = {ConstantInt::get(Int32Ty, 42)}; + OperandBundleDef OldBundle("before", UndefValue::get(Int32Ty)); + std::unique_ptr Call( + CallInst::Create(Callee, Args, OldBundle, "result")); + Call->setTailCallKind(CallInst::TailCallKind::TCK_NoTail); + AttrBuilder AB; + AB.addAttribute(Attribute::Cold); + Call->setAttributes(AttributeSet::get(C, AttributeSet::FunctionIndex, AB)); + Call->setDebugLoc(DebugLoc(MDNode::get(C, None))); + + OperandBundleDef NewBundle("after", ConstantInt::get(Int32Ty, 7)); + std::unique_ptr Clone(CallInst::Create(Call.get(), NewBundle)); + EXPECT_EQ(Call->getNumArgOperands(), Clone->getNumArgOperands()); + EXPECT_EQ(Call->getArgOperand(0), Clone->getArgOperand(0)); + EXPECT_EQ(Call->getCallingConv(), Clone->getCallingConv()); + EXPECT_EQ(Call->getTailCallKind(), Clone->getTailCallKind()); + EXPECT_TRUE(Clone->hasFnAttr(Attribute::AttrKind::Cold)); + EXPECT_EQ(Call->getDebugLoc(), Clone->getDebugLoc()); + EXPECT_EQ(Clone->getNumOperandBundles(), 1); + EXPECT_TRUE(Clone->getOperandBundle("after").hasValue()); +} +TEST(InstructionsTest, AlterInvokeBundles) { + LLVMContext &C(getGlobalContext()); + Type *Int32Ty = Type::getInt32Ty(C); + Type *FnTy = FunctionType::get(Int32Ty, Int32Ty, /*isVarArg=*/false); + Value *Callee = Constant::getNullValue(FnTy->getPointerTo()); + Value *Args[] = {ConstantInt::get(Int32Ty, 42)}; + BasicBlock *NormalDest = BasicBlock::Create(C); + BasicBlock *UnwindDest = BasicBlock::Create(C); + OperandBundleDef OldBundle("before", UndefValue::get(Int32Ty)); + InvokeInst *Invoke(InvokeInst::Create(Callee, NormalDest, UnwindDest, Args, + OldBundle, "result")); + AttrBuilder AB; + AB.addAttribute(Attribute::Cold); + Invoke->setAttributes(AttributeSet::get(C, AttributeSet::FunctionIndex, AB)); + Invoke->setDebugLoc(DebugLoc(MDNode::get(C, None))); + + OperandBundleDef NewBundle("after", ConstantInt::get(Int32Ty, 7)); + InvokeInst *Clone(InvokeInst::Create(Invoke, NewBundle)); + EXPECT_EQ(Invoke->getNormalDest(), Clone->getNormalDest()); + EXPECT_EQ(Invoke->getUnwindDest(), Clone->getUnwindDest()); + EXPECT_EQ(Invoke->getNumArgOperands(), Clone->getNumArgOperands()); + EXPECT_EQ(Invoke->getArgOperand(0), Clone->getArgOperand(0)); + EXPECT_EQ(Invoke->getCallingConv(), Clone->getCallingConv()); + EXPECT_TRUE(Clone->hasFnAttr(Attribute::AttrKind::Cold)); + EXPECT_EQ(Invoke->getDebugLoc(), Clone->getDebugLoc()); + EXPECT_EQ(Clone->getNumOperandBundles(), 1); + EXPECT_TRUE(Clone->getOperandBundle("after").hasValue()); + + delete Invoke; + delete Clone; + delete NormalDest; + delete UnwindDest; +} +} // end anonymous namespace +} // end namespace llvm