mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-24 12:19:53 +00:00
Manually remove successors in if conversion when CopyAndPredicateBlock is used
In the simple and triangle if-conversion cases, when CopyAndPredicateBlock is used because the to-be-predicated block has other predecessors, we need to explicitly remove the old copied block from the successors list. Normally if conversion relies on TII->AnalyzeBranch combined with BB->CorrectExtraCFGEdges to cleanup the successors list, but if the predicated block contained an un-analyzable branch (such as a now-predicated return), then this will fail. These extra successors were causing a problem on PPC because it was causing later passes (such as PPCEarlyReturm) to leave dead return-only basic blocks in the code. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@179227 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
3c08eef20b
commit
9af7014019
@ -1054,6 +1054,10 @@ bool IfConverter::IfConvertSimple(BBInfo &BBI, IfcvtKind Kind) {
|
||||
// Copy instructions in the true block, predicate them, and add them to
|
||||
// the entry block.
|
||||
CopyAndPredicateBlock(BBI, *CvtBBI, Cond, Redefs);
|
||||
|
||||
// RemoveExtraEdges won't work if the block has an unanalyzable branch, so
|
||||
// explicitly remove CvtBBI as a successor.
|
||||
BBI.BB->removeSuccessor(CvtBBI->BB);
|
||||
} else {
|
||||
PredicateBlock(*CvtBBI, CvtBBI->BB->end(), Cond, Redefs);
|
||||
|
||||
@ -1146,6 +1150,10 @@ bool IfConverter::IfConvertTriangle(BBInfo &BBI, IfcvtKind Kind) {
|
||||
// Copy instructions in the true block, predicate them, and add them to
|
||||
// the entry block.
|
||||
CopyAndPredicateBlock(BBI, *CvtBBI, Cond, Redefs, true);
|
||||
|
||||
// RemoveExtraEdges won't work if the block has an unanalyzable branch, so
|
||||
// explicitly remove CvtBBI as a successor.
|
||||
BBI.BB->removeSuccessor(CvtBBI->BB);
|
||||
} else {
|
||||
// Predicate the 'true' block after removing its branch.
|
||||
CvtBBI->NonPredSize -= TII->RemoveBranch(*CvtBBI->BB);
|
||||
|
@ -53,6 +53,7 @@ for.end: ; preds = %for.body, %if.end,
|
||||
; CHECK: bnelr
|
||||
; CHECK: bnelr
|
||||
; CHECK: bdzlr
|
||||
; CHECK-NOT: blr
|
||||
}
|
||||
|
||||
attributes #0 = { nounwind }
|
||||
|
@ -17,7 +17,6 @@ while.end: ; preds = %while.body, %while.
|
||||
|
||||
; CHECK: @_Z8example3iPiS_
|
||||
; CHECK: bnelr
|
||||
; CHECK: bnelr
|
||||
}
|
||||
|
||||
attributes #0 = { noinline nounwind }
|
||||
|
Loading…
Reference in New Issue
Block a user