From 2c3ccaacb7b279ee030a0a911e987a92d491b27c Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Fri, 24 Apr 2015 16:22:19 +0000 Subject: [PATCH] [WinEH] Split the landingpad BB instead of cloning it This means we don't have to RAUW the landingpad instruction and landingpad BB, which is a nice win. llvm-svn: 235725 --- llvm/lib/CodeGen/WinEHPrepare.cpp | 30 ++++++++------------------- llvm/test/CodeGen/WinEH/cppeh-catch-all.ll | 2 +- llvm/test/CodeGen/WinEH/cppeh-catch-scalar.ll | 2 +- llvm/test/CodeGen/WinEH/cppeh-catch-unwind.ll | 6 +++--- llvm/test/CodeGen/WinEH/cppeh-frame-vars.ll | 2 +- llvm/test/CodeGen/WinEH/cppeh-min-unwind.ll | 2 +- llvm/test/CodeGen/WinEH/cppeh-multi-catch.ll | 2 +- 7 files changed, 17 insertions(+), 29 deletions(-) diff --git a/llvm/lib/CodeGen/WinEHPrepare.cpp b/llvm/lib/CodeGen/WinEHPrepare.cpp index 09f3e13..8a0fb7f 100644 --- a/llvm/lib/CodeGen/WinEHPrepare.cpp +++ b/llvm/lib/CodeGen/WinEHPrepare.cpp @@ -670,25 +670,13 @@ bool WinEHPrepare::prepareExceptionHandlers( outlineHandler(Action, &F, LPad, StartBB, FrameVarInfo); } - // Replace the landing pad with a new llvm.eh.action based landing pad. - BasicBlock *NewLPadBB = BasicBlock::Create(Context, "lpad", &F, LPadBB); - assert(!isa(LPadBB->begin())); - auto *NewLPad = cast(LPad->clone()); - NewLPadBB->getInstList().push_back(NewLPad); - while (!pred_empty(LPadBB)) { - auto *pred = *pred_begin(LPadBB); - InvokeInst *Invoke = cast(pred->getTerminator()); - Invoke->setUnwindDest(NewLPadBB); - } - - // Replace the mapping of any nested landing pad that previously mapped - // to this landing pad with a referenced to the cloned version. - for (auto &LPadPair : NestedLPtoOriginalLP) { - const LandingPadInst *OriginalLPad = LPadPair.second; - if (OriginalLPad == LPad) { - LPadPair.second = NewLPad; - } - } + // Split the block after the landingpad instruction so that it is just a + // call to llvm.eh.actions followed by indirectbr. + assert(!isa(LPadBB->begin()) && "lpad phi not removed"); + LPadBB->splitBasicBlock(LPad->getNextNode(), + LPadBB->getName() + ".prepsplit"); + // Erase the branch inserted by the split so we can insert indirectbr. + LPadBB->getTerminator()->eraseFromParent(); // Replace all extracted values with undef and ultimately replace the // landingpad with undef. @@ -733,7 +721,7 @@ bool WinEHPrepare::prepareExceptionHandlers( ActionArgs.push_back(Action->getHandlerBlockOrFunc()); } CallInst *Recover = - CallInst::Create(ActionIntrin, ActionArgs, "recover", NewLPadBB); + CallInst::Create(ActionIntrin, ActionArgs, "recover", LPadBB); // Add an indirect branch listing possible successors of the catch handlers. SetVector ReturnTargets; @@ -744,7 +732,7 @@ bool WinEHPrepare::prepareExceptionHandlers( } } IndirectBrInst *Branch = - IndirectBrInst::Create(Recover, ReturnTargets.size(), NewLPadBB); + IndirectBrInst::Create(Recover, ReturnTargets.size(), LPadBB); for (BasicBlock *Target : ReturnTargets) Branch->addDestination(Target); } // End for each landingpad diff --git a/llvm/test/CodeGen/WinEH/cppeh-catch-all.ll b/llvm/test/CodeGen/WinEH/cppeh-catch-all.ll index 4d017fd..a6c94d4 100644 --- a/llvm/test/CodeGen/WinEH/cppeh-catch-all.ll +++ b/llvm/test/CodeGen/WinEH/cppeh-catch-all.ll @@ -22,7 +22,7 @@ target triple = "x86_64-pc-windows-msvc" ; CHECK: define void @_Z4testv() ; CHECK: entry: ; CHECK: invoke void @_Z9may_throwv() -; CHECK: to label %invoke.cont unwind label %[[LPAD_LABEL:lpad[0-9]+]] +; CHECK: to label %invoke.cont unwind label %[[LPAD_LABEL:lpad[0-9]*]] ; Function Attrs: uwtable define void @_Z4testv() #0 { diff --git a/llvm/test/CodeGen/WinEH/cppeh-catch-scalar.ll b/llvm/test/CodeGen/WinEH/cppeh-catch-scalar.ll index 4ea3838..4faef82 100644 --- a/llvm/test/CodeGen/WinEH/cppeh-catch-scalar.ll +++ b/llvm/test/CodeGen/WinEH/cppeh-catch-scalar.ll @@ -26,7 +26,7 @@ target triple = "x86_64-pc-windows-msvc" ; CHECK: [[I_PTR:\%.+]] = alloca i32, align 4 ; CHECK: call void (...) @llvm.frameescape(i32* [[I_PTR]]) ; CHECK: invoke void @_Z9may_throwv() -; CHECK: to label %invoke.cont unwind label %[[LPAD_LABEL:lpad[0-9]+]] +; CHECK: to label %invoke.cont unwind label %[[LPAD_LABEL:lpad[0-9]*]] ; Function Attrs: uwtable define void @_Z4testv() #0 { diff --git a/llvm/test/CodeGen/WinEH/cppeh-catch-unwind.ll b/llvm/test/CodeGen/WinEH/cppeh-catch-unwind.ll index 37a5429..1a5a7b0 100644 --- a/llvm/test/CodeGen/WinEH/cppeh-catch-unwind.ll +++ b/llvm/test/CodeGen/WinEH/cppeh-catch-unwind.ll @@ -38,7 +38,7 @@ $"\01??_R0H@8" = comdat any ; CHECK: [[TMP1:\%.+]] = alloca i32, align 4 ; CHECK: call void (...) @llvm.frameescape(i32* [[TMP1]], %class.SomeClass* [[OBJ_PTR]], i32* [[TMP0]]) ; CHECK: %call = invoke %class.SomeClass* @"\01??0SomeClass@@QEAA@XZ"(%class.SomeClass* %obj) -; CHECK: to label %invoke.cont unwind label %[[LPAD_LABEL:lpad[0-9]+]] +; CHECK: to label %invoke.cont unwind label %[[LPAD_LABEL:lpad[0-9]*]] ; Function Attrs: uwtable define void @"\01?test@@YAXXZ"() #0 { @@ -51,7 +51,7 @@ entry: ; CHECK: invoke.cont: ; CHECK: invoke void @"\01?may_throw@@YAXXZ"() -; CHECK: to label %invoke.cont2 unwind label %[[LPAD1_LABEL:lpad[0-9]+]] +; CHECK: to label %invoke.cont2 unwind label %[[LPAD1_LABEL:lpad[0-9]*]] invoke.cont: ; preds = %entry invoke void @"\01?may_throw@@YAXXZ"() @@ -59,7 +59,7 @@ invoke.cont: ; preds = %entry ; CHECK: invoke.cont2: ; CHECK: invoke void @"\01?may_throw@@YAXXZ"() -; CHECK: to label %try.cont unwind label %[[LPAD3_LABEL:lpad[0-9]+]] +; CHECK: to label %try.cont unwind label %[[LPAD3_LABEL:lpad[0-9]*]] invoke.cont2: ; preds = %invoke.cont invoke void @"\01?may_throw@@YAXXZ"() diff --git a/llvm/test/CodeGen/WinEH/cppeh-frame-vars.ll b/llvm/test/CodeGen/WinEH/cppeh-frame-vars.ll index 773dc94..eeda431 100644 --- a/llvm/test/CodeGen/WinEH/cppeh-frame-vars.ll +++ b/llvm/test/CodeGen/WinEH/cppeh-frame-vars.ll @@ -84,7 +84,7 @@ for.cond: ; preds = %for.inc, %entry ; CHECK: for.body: ; CHECK: invoke void @"\01?may_throw@@YAXXZ"() -; CHECK: to label %invoke.cont unwind label %[[LPAD_LABEL:lpad[0-9]+]] +; CHECK: to label %invoke.cont unwind label %[[LPAD_LABEL:lpad[0-9]*]] for.body: ; preds = %for.cond invoke void @"\01?may_throw@@YAXXZ"() diff --git a/llvm/test/CodeGen/WinEH/cppeh-min-unwind.ll b/llvm/test/CodeGen/WinEH/cppeh-min-unwind.ll index 7868b33..3fffa47 100644 --- a/llvm/test/CodeGen/WinEH/cppeh-min-unwind.ll +++ b/llvm/test/CodeGen/WinEH/cppeh-min-unwind.ll @@ -27,7 +27,7 @@ target triple = "x86_64-pc-windows-msvc" ; CHECK: call void @_ZN9SomeClassC1Ev(%class.SomeClass* [[OBJ_PTR]]) ; CHECK: call void (...) @llvm.frameescape(%class.SomeClass* [[OBJ_PTR]]) ; CHECK: invoke void @_Z9may_throwv() -; CHECK: to label %invoke.cont unwind label %[[LPAD_LABEL:lpad[0-9]+]] +; CHECK: to label %invoke.cont unwind label %[[LPAD_LABEL:lpad[0-9]*]] ; Function Attrs: uwtable define void @_Z4testv() #0 { diff --git a/llvm/test/CodeGen/WinEH/cppeh-multi-catch.ll b/llvm/test/CodeGen/WinEH/cppeh-multi-catch.ll index 9844eb5..e8965ee 100644 --- a/llvm/test/CodeGen/WinEH/cppeh-multi-catch.ll +++ b/llvm/test/CodeGen/WinEH/cppeh-multi-catch.ll @@ -52,7 +52,7 @@ $"\01??_R0?AVSomeClass@@@8" = comdat any ; CHECK: [[I_PTR:\%.+]] = alloca i32, align 4 ; CHECK: call void (...) @llvm.frameescape(i32* [[I_PTR]], i64* [[LL_PTR]], %class.SomeClass** [[OBJ_PTR]]) ; CHECK: invoke void @"\01?may_throw@@YAXXZ"() -; CHECK: to label %invoke.cont unwind label %[[LPAD_LABEL:lpad[0-9]+]] +; CHECK: to label %invoke.cont unwind label %[[LPAD_LABEL:lpad[0-9]*]] ; Function Attrs: uwtable define void @"\01?test@@YAXXZ"() #0 { -- 2.7.4