Copy the full TailCallKind in CallInst::clone_impl

Split from the musttail inliner change.  This will be covered by an opt
test when the inliner change lands.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@208126 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Reid Kleckner 2014-05-06 20:08:20 +00:00
parent e3e870face
commit 3949749701
2 changed files with 34 additions and 1 deletions

View File

@ -324,7 +324,7 @@ CallInst::CallInst(const CallInst &CI)
OperandTraits<CallInst>::op_end(this) - CI.getNumOperands(),
CI.getNumOperands()) {
setAttributes(CI.getAttributes());
setTailCall(CI.isTailCall());
setTailCallKind(CI.getTailCallKind());
setCallingConv(CI.getCallingConv());
std::copy(CI.op_begin(), CI.op_end(), op_begin());

View File

@ -483,6 +483,39 @@ TEST(InstructionsTest, isEliminableCastPair) {
}
TEST(InstructionsTest, CloneCall) {
LLVMContext &C(getGlobalContext());
Type *Int32Ty = Type::getInt32Ty(C);
Type *ArgTys[] = {Int32Ty, Int32Ty, Int32Ty};
Type *FnTy = FunctionType::get(Int32Ty, ArgTys, /*isVarArg=*/false);
Value *Callee = Constant::getNullValue(FnTy->getPointerTo());
Value *Args[] = {
ConstantInt::get(Int32Ty, 1),
ConstantInt::get(Int32Ty, 2),
ConstantInt::get(Int32Ty, 3)
};
std::unique_ptr<CallInst> Call(CallInst::Create(Callee, Args, "result"));
// Test cloning the tail call kind.
CallInst::TailCallKind Kinds[] = {CallInst::TCK_None, CallInst::TCK_Tail,
CallInst::TCK_MustTail};
for (CallInst::TailCallKind TCK : Kinds) {
Call->setTailCallKind(TCK);
std::unique_ptr<CallInst> Clone(cast<CallInst>(Call->clone()));
EXPECT_EQ(Call->getTailCallKind(), Clone->getTailCallKind());
}
Call->setTailCallKind(CallInst::TCK_None);
// Test cloning an attribute.
{
AttrBuilder AB;
AB.addAttribute(Attribute::ReadOnly);
Call->setAttributes(AttributeSet::get(C, AttributeSet::FunctionIndex, AB));
std::unique_ptr<CallInst> Clone(cast<CallInst>(Call->clone()));
EXPECT_TRUE(Clone->onlyReadsMemory());
}
}
} // end anonymous namespace
} // end namespace llvm