diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index 9a0bd235d7e..33d100eb3a0 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -1872,13 +1872,6 @@ void SelectionDAGBuilder::visitInvoke(const InvokeInst &I) { visitInlineAsm(&I); else if (Fn && Fn->isIntrinsic()) { assert(Fn->getIntrinsicID() == Intrinsic::donothing); - // If donothing has a landingpad, we should clear CurrentCallSite. - if (LandingPad) { - MachineModuleInfo &MMI = DAG.getMachineFunction().getMMI(); - unsigned CallSiteIndex = MMI.getCurrentCallSite(); - if (CallSiteIndex) - MMI.setCurrentCallSite(0); - } // Ignore invokes to @llvm.donothing: jump directly to the next BB. } else LowerCallTo(&I, getValue(Callee), false, LandingPad); diff --git a/lib/CodeGen/SjLjEHPrepare.cpp b/lib/CodeGen/SjLjEHPrepare.cpp index b58bb85e49e..3903743878b 100644 --- a/lib/CodeGen/SjLjEHPrepare.cpp +++ b/lib/CodeGen/SjLjEHPrepare.cpp @@ -379,13 +379,22 @@ void SjLjEHPrepare::lowerAcrossUnwindEdges(Function &F, /// the function context and marking the call sites with the appropriate /// values. These values are used by the DWARF EH emitter. bool SjLjEHPrepare::setupEntryBlockAndCallSites(Function &F) { - SmallVector Returns; - SmallVector Invokes; + SmallVector Returns; + SmallVector Invokes; SmallSetVector LPads; // Look through the terminators of the basic blocks to find invokes. for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB) if (InvokeInst *II = dyn_cast(BB->getTerminator())) { + if (Function *Callee = II->getCalledFunction()) + if (Callee->isIntrinsic() && + Callee->getIntrinsicID() == Intrinsic::donothing) { + // Remove the NOP invoke. + BranchInst::Create(II->getNormalDest(), II); + II->eraseFromParent(); + continue; + } + Invokes.push_back(II); LPads.insert(II->getUnwindDest()->getLandingPadInst()); } else if (ReturnInst *RI = dyn_cast(BB->getTerminator())) { diff --git a/test/CodeGen/ARM/invoke-donothing-assert.ll b/test/CodeGen/ARM/invoke-donothing-assert.ll index d0c98f80289..0b607f7edf3 100644 --- a/test/CodeGen/ARM/invoke-donothing-assert.ll +++ b/test/CodeGen/ARM/invoke-donothing-assert.ll @@ -1,13 +1,10 @@ ; RUN: llc < %s -mtriple=armv7-apple-ios | FileCheck %s ; This testcase makes sure we can handle invoke @llvm.donothing without ; assertion failure. -; rdar://problem/13228754 -; CHECK: .globl _main +; & -declare void @callA() -declare i32 @__gxx_personality_sj0(...) - -define void @main() { +; CHECK: .globl _foo +define void @foo() { invoke.cont: invoke void @callA() to label %invoke.cont25 unwind label %lpad2 @@ -36,5 +33,41 @@ eh.resume: resume { i8*, i32 } zeroinitializer } +; CHECK: .globl _bar +define linkonce_odr void @bar(i32* %a) { +if.end.i.i.i: + invoke void @llvm.donothing() + to label %call.i.i.i.noexc unwind label %eh.resume + +call.i.i.i.noexc: + br i1 false, label %cleanup, label %new.notnull.i.i + +new.notnull.i.i: + br label %cleanup + +cleanup: + %0 = load i32* %a, align 4 + %inc294 = add nsw i32 %0, 4 + store i32 %inc294, i32* %a, align 4 + br i1 false, label %_ZN3lol5ArrayIivvvvvvvED1Ev.exit, label %delete.notnull.i.i.i1409 + +delete.notnull.i.i.i1409: + br label %_ZN3lol5ArrayIivvvvvvvED1Ev.exit + +_ZN3lol5ArrayIivvvvvvvED1Ev.exit: + ret void + +eh.resume: + %1 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*) + cleanup + %2 = extractvalue { i8*, i32 } %1, 0 + %3 = extractvalue { i8*, i32 } %1, 1 + %lpad.val = insertvalue { i8*, i32 } undef, i8* %2, 0 + %lpad.val395 = insertvalue { i8*, i32 } %lpad.val, i32 %3, 1 + resume { i8*, i32 } %lpad.val395 +} + +declare void @callA() declare void @callB() declare void @llvm.donothing() nounwind readnone +declare i32 @__gxx_personality_sj0(...)