Skip to content

Commit

Permalink
[OperandBundles] Copy DebugLoc with calls/invokes
Browse files Browse the repository at this point in the history
Summary:
The overloads of CallInst::Create and InvokeInst::Create that are used to
adjust operand bundles purport to create a new instruction "identical in
every way except [for] the operand bundles", so copy the DebugLoc along
with everything else.


Reviewers: sanjoy, majnemer

Subscribers: majnemer, dblaikie, llvm-commits

Differential Revision: http://reviews.llvm.org/D16157

llvm-svn: 257745
  • Loading branch information
JosephTremoulet committed Jan 14, 2016
1 parent d5d8887 commit bba70e4
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 3 deletions.
2 changes: 2 additions & 0 deletions llvm/lib/IR/Instructions.cpp
Expand Up @@ -309,6 +309,7 @@ CallInst *CallInst::Create(CallInst *CI, ArrayRef<OperandBundleDef> OpB,
NewCI->setCallingConv(CI->getCallingConv());
NewCI->SubclassOptionalData = CI->SubclassOptionalData;
NewCI->setAttributes(CI->getAttributes());
NewCI->setDebugLoc(CI->getDebugLoc());
return NewCI;
}

Expand Down Expand Up @@ -596,6 +597,7 @@ InvokeInst *InvokeInst::Create(InvokeInst *II, ArrayRef<OperandBundleDef> OpB,
NewII->setCallingConv(II->getCallingConv());
NewII->SubclassOptionalData = II->SubclassOptionalData;
NewII->setAttributes(II->getAttributes());
NewII->setDebugLoc(II->getDebugLoc());
return NewII;
}

Expand Down
1 change: 0 additions & 1 deletion llvm/lib/Transforms/Utils/InlineFunction.cpp
Expand Up @@ -1447,7 +1447,6 @@ bool llvm::InlineFunction(CallSite CS, InlineFunctionInfo &IFI,
NewInst = CallInst::Create(cast<CallInst>(I), OpBundles, I);
else
NewInst = InvokeInst::Create(cast<InvokeInst>(I), OpBundles, I);
NewInst->setDebugLoc(I->getDebugLoc());
NewInst->takeName(I);
I->replaceAllUsesWith(NewInst);
I->eraseFromParent();
Expand Down
63 changes: 61 additions & 2 deletions llvm/unittests/IR/InstructionsTest.cpp
Expand Up @@ -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<CallInst> 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<CallInst> 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

0 comments on commit bba70e4

Please sign in to comment.