forked from OSchip/llvm-project
[SimplifyCFG] Teach SimplifyBranchOnICmpChain() to preserve DomTree
This commit is contained in:
parent
253dc16f9e
commit
c45f765c0d
|
@ -4101,12 +4101,16 @@ bool SimplifyCFGOpt::SimplifyBranchOnICmpChain(BranchInst *BI,
|
|||
<< " cases into SWITCH. BB is:\n"
|
||||
<< *BB);
|
||||
|
||||
SmallVector<DominatorTree::UpdateType, 2> Updates;
|
||||
|
||||
// If there are any extra values that couldn't be folded into the switch
|
||||
// then we evaluate them with an explicit branch first. Split the block
|
||||
// right before the condbr to handle it.
|
||||
if (ExtraCase) {
|
||||
BasicBlock *NewBB =
|
||||
BB->splitBasicBlock(BI->getIterator(), "switch.early.test");
|
||||
SplitBlock(BB, BI, DTU ? &DTU->getDomTree() : nullptr, /*LI=*/nullptr,
|
||||
/*MSSAU=*/nullptr, "switch.early.test");
|
||||
|
||||
// Remove the uncond branch added to the old block.
|
||||
Instruction *OldTI = BB->getTerminator();
|
||||
Builder.SetInsertPoint(OldTI);
|
||||
|
@ -4118,6 +4122,8 @@ bool SimplifyCFGOpt::SimplifyBranchOnICmpChain(BranchInst *BI,
|
|||
|
||||
OldTI->eraseFromParent();
|
||||
|
||||
Updates.push_back({DominatorTree::Insert, BB, EdgeBB});
|
||||
|
||||
// If there are PHI nodes in EdgeBB, then we need to add a new entry to them
|
||||
// for the edge we just added.
|
||||
AddPredecessorToBlock(EdgeBB, BB, NewBB);
|
||||
|
@ -4144,6 +4150,7 @@ bool SimplifyCFGOpt::SimplifyBranchOnICmpChain(BranchInst *BI,
|
|||
// We added edges from PI to the EdgeBB. As such, if there were any
|
||||
// PHI nodes in EdgeBB, they need entries to be added corresponding to
|
||||
// the number of edges added.
|
||||
Updates.push_back({DominatorTree::Insert, BB, EdgeBB});
|
||||
for (BasicBlock::iterator BBI = EdgeBB->begin(); isa<PHINode>(BBI); ++BBI) {
|
||||
PHINode *PN = cast<PHINode>(BBI);
|
||||
Value *InVal = PN->getIncomingValueForBlock(BB);
|
||||
|
@ -4153,6 +4160,8 @@ bool SimplifyCFGOpt::SimplifyBranchOnICmpChain(BranchInst *BI,
|
|||
|
||||
// Erase the old branch instruction.
|
||||
EraseTerminatorAndDCECond(BI);
|
||||
if (DTU)
|
||||
DTU->applyUpdatesPermissive(Updates);
|
||||
|
||||
LLVM_DEBUG(dbgs() << " ** 'icmp' chain result is:\n" << *BB << '\n');
|
||||
return true;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt -S -simplifycfg < %s | FileCheck %s
|
||||
; RUN: opt -S -simplifycfg -simplifycfg-require-and-preserve-domtree=1 < %s | FileCheck %s
|
||||
|
||||
declare i8 @next_char();
|
||||
|
||||
|
|
Loading…
Reference in New Issue