<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jan 13, 2016 at 10:21 PM, Joseph Tremoulet via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: josepht<br>
Date: Thu Jan 14 00:21:42 2016<br>
New Revision: 257745<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=257745&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=257745&view=rev</a><br>
Log:<br>
[OperandBundles] Copy DebugLoc with calls/invokes<br>
<br>
Summary:<br>
The overloads of CallInst::Create and InvokeInst::Create that are used to<br>
adjust operand bundles purport to create a new instruction "identical in<br>
every way except [for] the operand bundles", so copy the DebugLoc along<br>
with everything else.<br>
<br>
<br>
Reviewers: sanjoy, majnemer<br>
<br>
Subscribers: majnemer, dblaikie, llvm-commits<br>
<br>
Differential Revision: <a href="http://reviews.llvm.org/D16157" rel="noreferrer" target="_blank">http://reviews.llvm.org/D16157</a><br>
<br>
Modified:<br>
    llvm/trunk/lib/IR/Instructions.cpp<br>
    llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp<br>
    llvm/trunk/unittests/IR/InstructionsTest.cpp<br>
<br>
Modified: llvm/trunk/lib/IR/Instructions.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Instructions.cpp?rev=257745&r1=257744&r2=257745&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Instructions.cpp?rev=257745&r1=257744&r2=257745&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/IR/Instructions.cpp (original)<br>
+++ llvm/trunk/lib/IR/Instructions.cpp Thu Jan 14 00:21:42 2016<br>
@@ -309,6 +309,7 @@ CallInst *CallInst::Create(CallInst *CI,<br>
   NewCI->setCallingConv(CI->getCallingConv());<br>
   NewCI->SubclassOptionalData = CI->SubclassOptionalData;<br>
   NewCI->setAttributes(CI->getAttributes());<br>
+  NewCI->setDebugLoc(CI->getDebugLoc());<br>
   return NewCI;<br>
 }<br>
<br>
@@ -596,6 +597,7 @@ InvokeInst *InvokeInst::Create(InvokeIns<br>
   NewII->setCallingConv(II->getCallingConv());<br>
   NewII->SubclassOptionalData = II->SubclassOptionalData;<br>
   NewII->setAttributes(II->getAttributes());<br>
+  NewII->setDebugLoc(II->getDebugLoc());<br>
   return NewII;<br>
 }<br>
<br>
<br>
Modified: llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp?rev=257745&r1=257744&r2=257745&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp?rev=257745&r1=257744&r2=257745&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp Thu Jan 14 00:21:42 2016<br>
@@ -1447,7 +1447,6 @@ bool llvm::InlineFunction(CallSite CS, I<br>
           NewInst = CallInst::Create(cast<CallInst>(I), OpBundles, I);<br>
         else<br>
           NewInst = InvokeInst::Create(cast<InvokeInst>(I), OpBundles, I);<br>
-        NewInst->setDebugLoc(I->getDebugLoc());<br>
         NewInst->takeName(I);<br>
         I->replaceAllUsesWith(NewInst);<br>
         I->eraseFromParent();<br>
<br>
Modified: llvm/trunk/unittests/IR/InstructionsTest.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/IR/InstructionsTest.cpp?rev=257745&r1=257744&r2=257745&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/IR/InstructionsTest.cpp?rev=257745&r1=257744&r2=257745&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/unittests/IR/InstructionsTest.cpp (original)<br>
+++ llvm/trunk/unittests/IR/InstructionsTest.cpp Thu Jan 14 00:21:42 2016<br>
@@ -518,7 +518,66 @@ TEST(InstructionsTest, CloneCall) {<br>
   }<br>
 }<br>
<br>
-}  // end anonymous namespace<br>
-}  // end namespace llvm<br>
+TEST(InstructionsTest, AlterCallBundles) {<br>
+  LLVMContext &C(getGlobalContext());<br>
+  Type *Int32Ty = Type::getInt32Ty(C);<br>
+  Type *FnTy = FunctionType::get(Int32Ty, Int32Ty, /*isVarArg=*/false);<br>
+  Value *Callee = Constant::getNullValue(FnTy->getPointerTo());<br>
+  Value *Args[] = {ConstantInt::get(Int32Ty, 42)};<br>
+  OperandBundleDef OldBundle("before", UndefValue::get(Int32Ty));<br>
+  std::unique_ptr<CallInst> Call(<br>
+      CallInst::Create(Callee, Args, OldBundle, "result"));<br>
+  Call->setTailCallKind(CallInst::TailCallKind::TCK_NoTail);<br>
+  AttrBuilder AB;<br>
+  AB.addAttribute(Attribute::Cold);<br>
+  Call->setAttributes(AttributeSet::get(C, AttributeSet::FunctionIndex, AB));<br>
+  Call->setDebugLoc(DebugLoc(MDNode::get(C, None)));<br>
<br>
+  OperandBundleDef NewBundle("after", ConstantInt::get(Int32Ty, 7));<br>
+  std::unique_ptr<CallInst> Clone(CallInst::Create(Call.get(), NewBundle));<br>
+  EXPECT_EQ(Call->getNumArgOperands(), Clone->getNumArgOperands());<br>
+  EXPECT_EQ(Call->getArgOperand(0), Clone->getArgOperand(0));<br>
+  EXPECT_EQ(Call->getCallingConv(), Clone->getCallingConv());<br>
+  EXPECT_EQ(Call->getTailCallKind(), Clone->getTailCallKind());<br>
+  EXPECT_TRUE(Clone->hasFnAttr(Attribute::AttrKind::Cold));<br>
+  EXPECT_EQ(Call->getDebugLoc(), Clone->getDebugLoc());<br>
+  EXPECT_EQ(Clone->getNumOperandBundles(), 1);<br>
+  EXPECT_TRUE(Clone->getOperandBundle("after").hasValue());<br>
+}<br>
+<br>
+TEST(InstructionsTest, AlterInvokeBundles) {<br>
+  LLVMContext &C(getGlobalContext());<br>
+  Type *Int32Ty = Type::getInt32Ty(C);<br>
+  Type *FnTy = FunctionType::get(Int32Ty, Int32Ty, /*isVarArg=*/false);<br>
+  Value *Callee = Constant::getNullValue(FnTy->getPointerTo());<br>
+  Value *Args[] = {ConstantInt::get(Int32Ty, 42)};<br>
+  BasicBlock *NormalDest = BasicBlock::Create(C);<br>
+  BasicBlock *UnwindDest = BasicBlock::Create(C);<br>
+  OperandBundleDef OldBundle("before", UndefValue::get(Int32Ty));<br>
+  InvokeInst *Invoke(InvokeInst::Create(Callee, NormalDest, UnwindDest, Args,<br>
+                                        OldBundle, "result"));<br></blockquote><div><br></div><div>^ generally, prefer copy init (X x = y;) over direct init (X x(y);) when both are valid. Copy init is less powerful (it can't invoke explicit conversions, only implicit ones) so it's easier to read/elss to worry about.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+  AttrBuilder AB;<br>
+  AB.addAttribute(Attribute::Cold);<br>
+  Invoke->setAttributes(AttributeSet::get(C, AttributeSet::FunctionIndex, AB));<br>
+  Invoke->setDebugLoc(DebugLoc(MDNode::get(C, None)));<br>
+<br>
+  OperandBundleDef NewBundle("after", ConstantInt::get(Int32Ty, 7));<br>
+  InvokeInst *Clone(InvokeInst::Create(Invoke, NewBundle));<br>
+  EXPECT_EQ(Invoke->getNormalDest(), Clone->getNormalDest());<br>
+  EXPECT_EQ(Invoke->getUnwindDest(), Clone->getUnwindDest());<br>
+  EXPECT_EQ(Invoke->getNumArgOperands(), Clone->getNumArgOperands());<br>
+  EXPECT_EQ(Invoke->getArgOperand(0), Clone->getArgOperand(0));<br>
+  EXPECT_EQ(Invoke->getCallingConv(), Clone->getCallingConv());<br>
+  EXPECT_TRUE(Clone->hasFnAttr(Attribute::AttrKind::Cold));<br>
+  EXPECT_EQ(Invoke->getDebugLoc(), Clone->getDebugLoc());<br>
+  EXPECT_EQ(Clone->getNumOperandBundles(), 1);<br>
+  EXPECT_TRUE(Clone->getOperandBundle("after").hasValue());<br>
+<br>
+  delete Invoke;<br>
+  delete Clone;<br>
+  delete NormalDest;<br>
+  delete UnwindDest;<br></blockquote><div><br></div><div>unique_ptr rather than explicit memory management here ^</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+}<br>
<br>
+} // end anonymous namespace<br>
+} // end namespace llvm<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>