[llvm] r235725 - [WinEH] Split the landingpad BB instead of cloning it
Reid Kleckner
reid at kleckner.net
Fri Apr 24 09:22:20 PDT 2015
Author: rnk
Date: Fri Apr 24 11:22:19 2015
New Revision: 235725
URL: http://llvm.org/viewvc/llvm-project?rev=235725&view=rev
Log:
[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.
Modified:
llvm/trunk/lib/CodeGen/WinEHPrepare.cpp
llvm/trunk/test/CodeGen/WinEH/cppeh-catch-all.ll
llvm/trunk/test/CodeGen/WinEH/cppeh-catch-scalar.ll
llvm/trunk/test/CodeGen/WinEH/cppeh-catch-unwind.ll
llvm/trunk/test/CodeGen/WinEH/cppeh-frame-vars.ll
llvm/trunk/test/CodeGen/WinEH/cppeh-min-unwind.ll
llvm/trunk/test/CodeGen/WinEH/cppeh-multi-catch.ll
Modified: llvm/trunk/lib/CodeGen/WinEHPrepare.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/WinEHPrepare.cpp?rev=235725&r1=235724&r2=235725&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/WinEHPrepare.cpp (original)
+++ llvm/trunk/lib/CodeGen/WinEHPrepare.cpp Fri Apr 24 11:22:19 2015
@@ -670,25 +670,13 @@ bool WinEHPrepare::prepareExceptionHandl
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<PHINode>(LPadBB->begin()));
- auto *NewLPad = cast<LandingPadInst>(LPad->clone());
- NewLPadBB->getInstList().push_back(NewLPad);
- while (!pred_empty(LPadBB)) {
- auto *pred = *pred_begin(LPadBB);
- InvokeInst *Invoke = cast<InvokeInst>(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<PHINode>(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::prepareExceptionHandl
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<BasicBlock *> ReturnTargets;
@@ -744,7 +732,7 @@ bool WinEHPrepare::prepareExceptionHandl
}
}
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
Modified: llvm/trunk/test/CodeGen/WinEH/cppeh-catch-all.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/WinEH/cppeh-catch-all.ll?rev=235725&r1=235724&r2=235725&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/WinEH/cppeh-catch-all.ll (original)
+++ llvm/trunk/test/CodeGen/WinEH/cppeh-catch-all.ll Fri Apr 24 11:22:19 2015
@@ -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 {
Modified: llvm/trunk/test/CodeGen/WinEH/cppeh-catch-scalar.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/WinEH/cppeh-catch-scalar.ll?rev=235725&r1=235724&r2=235725&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/WinEH/cppeh-catch-scalar.ll (original)
+++ llvm/trunk/test/CodeGen/WinEH/cppeh-catch-scalar.ll Fri Apr 24 11:22:19 2015
@@ -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 {
Modified: llvm/trunk/test/CodeGen/WinEH/cppeh-catch-unwind.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/WinEH/cppeh-catch-unwind.ll?rev=235725&r1=235724&r2=235725&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/WinEH/cppeh-catch-unwind.ll (original)
+++ llvm/trunk/test/CodeGen/WinEH/cppeh-catch-unwind.ll Fri Apr 24 11:22:19 2015
@@ -38,7 +38,7 @@ $"\01??_R0H at 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 at 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:
; 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"()
Modified: llvm/trunk/test/CodeGen/WinEH/cppeh-frame-vars.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/WinEH/cppeh-frame-vars.ll?rev=235725&r1=235724&r2=235725&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/WinEH/cppeh-frame-vars.ll (original)
+++ llvm/trunk/test/CodeGen/WinEH/cppeh-frame-vars.ll Fri Apr 24 11:22:19 2015
@@ -84,7 +84,7 @@ for.cond:
; 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"()
Modified: llvm/trunk/test/CodeGen/WinEH/cppeh-min-unwind.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/WinEH/cppeh-min-unwind.ll?rev=235725&r1=235724&r2=235725&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/WinEH/cppeh-min-unwind.ll (original)
+++ llvm/trunk/test/CodeGen/WinEH/cppeh-min-unwind.ll Fri Apr 24 11:22:19 2015
@@ -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 {
Modified: llvm/trunk/test/CodeGen/WinEH/cppeh-multi-catch.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/WinEH/cppeh-multi-catch.ll?rev=235725&r1=235724&r2=235725&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/WinEH/cppeh-multi-catch.ll (original)
+++ llvm/trunk/test/CodeGen/WinEH/cppeh-multi-catch.ll Fri Apr 24 11:22:19 2015
@@ -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 {
More information about the llvm-commits
mailing list