[llvm] r251149 - Revert rL251061 [SimplifyCFG] Extend SimplifyResume to handle phi of trivial landing pad.
Chen Li via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 23 14:13:01 PDT 2015
Author: chenli
Date: Fri Oct 23 16:13:01 2015
New Revision: 251149
URL: http://llvm.org/viewvc/llvm-project?rev=251149&view=rev
Log:
Revert rL251061 [SimplifyCFG] Extend SimplifyResume to handle phi of trivial landing pad.
Modified:
llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
llvm/trunk/test/Transforms/SimplifyCFG/invoke_unwind.ll
Modified: llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp?rev=251149&r1=251148&r2=251149&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp Fri Oct 23 16:13:01 2015
@@ -2905,80 +2905,26 @@ bool SimplifyCFGOpt::SimplifyResume(Resu
// exception then zap the landing pad, turning its invokes into calls.
BasicBlock *BB = RI->getParent();
LandingPadInst *LPInst = dyn_cast<LandingPadInst>(BB->getFirstNonPHI());
-
- // If RI->getValue() is a landing pad, check if the first instruction is
- // the same landing pad that caused control to branch here. If RI->getValue
- // is a phi of landing pad, check its predecessor blocks to see if any of
- // them contains a trivial landing pad.
- if (RI->getValue() != LPInst && !isa<PHINode>(RI->getValue()))
+ if (RI->getValue() != LPInst)
+ // Not a landing pad, or the resume is not unwinding the exception that
+ // caused control to branch here.
return false;
- // Check that there are no other instructions except for debug intrinsics
- // between the landing pad (or phi of landing pad) and resume instruction.
- BasicBlock::iterator I = cast<Instruction>(RI->getValue()), E = RI;
+ // Check that there are no other instructions except for debug intrinsics.
+ BasicBlock::iterator I = LPInst->getIterator(), E = RI->getIterator();
while (++I != E)
if (!isa<DbgInfoIntrinsic>(I))
return false;
- SmallVector<BasicBlock *, 4> TrivialUnwindBlocks;
- if (RI->getValue() == LPInst) {
- // Landing pad is in current block, which has already been checked.
- TrivialUnwindBlocks.push_back(BB);
- } else {
- // Check incoming blocks to see if any of them are trivial.
- auto *PhiLPInst = cast<PHINode>(RI->getValue());
- for (unsigned i = 0; i < PhiLPInst->getNumIncomingValues(); i++) {
- auto *IncomingBB = PhiLPInst->getIncomingBlock(i);
- auto *IncomingValue = PhiLPInst->getIncomingValue(i);
-
- auto *LandingPad =
- dyn_cast<LandingPadInst>(IncomingBB->getFirstNonPHI());
- // Not the landing pad that caused the control to branch here.
- if (IncomingValue != LandingPad)
- continue;
-
- bool isTrivial = true;
-
- I = IncomingBB->getFirstNonPHI();
- E = IncomingBB->getTerminator();
- while (++I != E)
- if (!isa<DbgInfoIntrinsic>(I)) {
- isTrivial = false;
- break;
- }
-
- if (isTrivial)
- TrivialUnwindBlocks.push_back(IncomingBB);
- }
- }
-
// Turn all invokes that unwind here into calls and delete the basic block.
- for (auto *TrivialBB : TrivialUnwindBlocks) {
- if (isa<PHINode>(RI->getValue())) {
- // Blocks that will be deleted should also be removed
- // from the phi node.
- BB->removePredecessor(TrivialBB, true);
- }
-
- for (pred_iterator PI = pred_begin(TrivialBB), PE = pred_end(TrivialBB);
- PI != PE;) {
- BasicBlock *Pred = *PI++;
- removeUnwindEdge(Pred);
- }
-
- // The landingpad is now unreachable. Zap it.
- if (TrivialBB == BB)
- BB = nullptr;
- TrivialBB->eraseFromParent();
- }
-
- // Delete the resume block if all its predecessors have been deleted, and we
- // haven't already deleted it above when deleting the landing pad blocks.
- if (BB && pred_begin(BB) == pred_end(BB)) {
- BB->eraseFromParent();
+ for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB); PI != PE;) {
+ BasicBlock *Pred = *PI++;
+ removeUnwindEdge(Pred);
}
- return TrivialUnwindBlocks.size() != 0;
+ // The landingpad is now unreachable. Zap it.
+ BB->eraseFromParent();
+ return true;
}
bool SimplifyCFGOpt::SimplifyCleanupReturn(CleanupReturnInst *RI) {
Modified: llvm/trunk/test/Transforms/SimplifyCFG/invoke_unwind.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SimplifyCFG/invoke_unwind.ll?rev=251149&r1=251148&r2=251149&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/SimplifyCFG/invoke_unwind.ll (original)
+++ llvm/trunk/test/Transforms/SimplifyCFG/invoke_unwind.ll Fri Oct 23 16:13:01 2015
@@ -17,46 +17,4 @@ Rethrow:
resume { i8*, i32 } %exn
}
-declare i64 @dummy1()
-declare i64 @dummy2()
-
-; This testcase checks to see if simplifycfg pass can convert two invoke
-; instructions to call instructions if they share a common trivial unwind
-; block.
-define i64 @test2(i1 %cond) personality i32 (...)* @__gxx_personality_v0 {
-entry:
-; CHECK-LABEL: @test2(
-; CHECK: %call1 = call i64 @dummy1()
-; CHECK: %call2 = call i64 @dummy2()
-; CHECK-NOT: resume { i8*, i32 } %lp
- br i1 %cond, label %br1, label %br2
-
-br1:
- %call1 = invoke i64 @dummy1()
- to label %invoke.cont unwind label %lpad1
-
-br2:
- %call2 = invoke i64 @dummy2()
- to label %invoke.cont unwind label %lpad2
-
-invoke.cont:
- %c = phi i64 [%call1, %br1], [%call2, %br2]
- ret i64 %c
-
-
-lpad1:
- %0 = landingpad { i8*, i32 }
- cleanup
- br label %rethrow
-
-lpad2:
- %1 = landingpad { i8*, i32 }
- cleanup
- br label %rethrow
-
-rethrow:
- %lp = phi { i8*, i32 } [%0, %lpad1], [%1, %lpad2]
- resume { i8*, i32 } %lp
-}
-
declare i32 @__gxx_personality_v0(...)
More information about the llvm-commits
mailing list