mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-13 04:38:24 +00:00
fix two significant issues with FoldTwoEntryPHINode:
first, it can kick in on blocks whose conditions have been folded to a constant, even though one of the edges will be trivially folded. second, it doesn't clean up the "if diamond" that it just eliminated away. This is a problem because other simplifycfg xforms kick in depending on the order of block visitation, causing pointless work. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@121762 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -1148,7 +1148,10 @@ static bool FoldTwoEntryPHINode(PHINode *PN, const TargetData *TD) {
|
||||
BasicBlock *BB = PN->getParent();
|
||||
BasicBlock *IfTrue, *IfFalse;
|
||||
Value *IfCond = GetIfCondition(BB, IfTrue, IfFalse);
|
||||
if (!IfCond) return false;
|
||||
if (!IfCond ||
|
||||
// Don't bother if the branch will be constant folded trivially.
|
||||
isa<ConstantInt>(IfCond))
|
||||
return false;
|
||||
|
||||
// Okay, we found that we can merge this two-entry phi node into a select.
|
||||
// Doing so would require us to fold *all* two entry phi nodes in this block.
|
||||
@ -1243,6 +1246,13 @@ static bool FoldTwoEntryPHINode(PHINode *PN, const TargetData *TD) {
|
||||
NV->takeName(PN);
|
||||
PN->eraseFromParent();
|
||||
}
|
||||
|
||||
// At this point, IfBlock1 and IfBlock2 are both empty, so our if statement
|
||||
// has been flattened. Change DomBlock to jump directly to our new block to
|
||||
// avoid other simplifycfg's kicking in on the diamond.
|
||||
TerminatorInst *OldTI = DomBlock->getTerminator();
|
||||
BranchInst::Create(BB, OldTI);
|
||||
OldTI->eraseFromParent();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user