mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 11:02:59 +02:00
Revert "[IfConversion] Keep the CFG updated incrementally in IfConvertTriangle"
The reverted change introdued assertions ala: "MachineBasicBlock::succ_iterator llvm::MachineBasicBlock::removeSuccessor(succ_iterator, bool): Assertion `I != Successors.end() && "Not a current successor!"' Mikael, the original committer, wrote me that he is working on a fix, but that it likely will take some time to get this resolved. As this bug is one of the last two issues that keep the AOSP buildbot from turning green, I revert the original commit r302876. I am looking forward to see this recommitted after the assertion has been resolved. llvm-svn: 304128
This commit is contained in:
parent
86f4730576
commit
5d54610f39
@ -1588,32 +1588,22 @@ bool IfConverter::IfConvertTriangle(BBInfo &BBI, IfcvtKind Kind) {
|
||||
BBCvt = MBPI->getEdgeProbability(BBI.BB, &CvtMBB);
|
||||
}
|
||||
|
||||
// To be able to insert code freely at the end of BBI we sometimes remove
|
||||
// the branch from BBI to NextMBB temporarily. Remember if this happened.
|
||||
bool RemovedBranchToNextMBB = false;
|
||||
if (CvtMBB.pred_size() > 1) {
|
||||
BBI.NonPredSize -= TII->removeBranch(*BBI.BB);
|
||||
// Copy instructions in the true block, predicate them, and add them to
|
||||
// the entry block.
|
||||
CopyAndPredicateBlock(BBI, *CvtBBI, Cond, true);
|
||||
|
||||
// Keep the CFG updated.
|
||||
// RemoveExtraEdges won't work if the block has an unanalyzable branch, so
|
||||
// explicitly remove CvtBBI as a successor.
|
||||
BBI.BB->removeSuccessor(&CvtMBB, true);
|
||||
} else {
|
||||
// Predicate the 'true' block after removing its branch.
|
||||
CvtBBI->NonPredSize -= TII->removeBranch(CvtMBB);
|
||||
PredicateBlock(*CvtBBI, CvtMBB.end(), Cond);
|
||||
|
||||
// Remove the branch from the entry of the triangle to NextBB to be able to
|
||||
// do the merge below. Keep the CFG updated, but remember we removed the
|
||||
// branch since we do want to execute NextMBB, either by introducing a
|
||||
// branch to it again, or merging it into the entry block.
|
||||
// How it's handled is decided further down.
|
||||
BBI.NonPredSize -= TII->removeBranch(*BBI.BB);
|
||||
BBI.BB->removeSuccessor(&NextMBB, true);
|
||||
RemovedBranchToNextMBB = true;
|
||||
|
||||
// Now merge the entry of the triangle with the true block.
|
||||
BBI.NonPredSize -= TII->removeBranch(*BBI.BB);
|
||||
MergeBlocks(BBI, *CvtBBI, false);
|
||||
}
|
||||
|
||||
@ -1651,19 +1641,12 @@ bool IfConverter::IfConvertTriangle(BBInfo &BBI, IfcvtKind Kind) {
|
||||
// block. By not merging them, we make it possible to iteratively
|
||||
// ifcvt the blocks.
|
||||
if (!HasEarlyExit &&
|
||||
// We might have removed BBI from NextMBB's predecessor list above but
|
||||
// we want it to be there, so consider that too.
|
||||
(NextMBB.pred_size() == (RemovedBranchToNextMBB ? 0 : 1)) &&
|
||||
!NextBBI->HasFallThrough &&
|
||||
NextMBB.pred_size() == 1 && !NextBBI->HasFallThrough &&
|
||||
!NextMBB.hasAddressTaken()) {
|
||||
// We will merge NextBBI into BBI, and thus remove the current
|
||||
// fallthrough from BBI into CvtBBI.
|
||||
BBI.BB->removeSuccessor(&CvtMBB, true);
|
||||
MergeBlocks(BBI, *NextBBI);
|
||||
FalseBBDead = true;
|
||||
} else {
|
||||
InsertUncondBranch(*BBI.BB, NextMBB, TII);
|
||||
BBI.BB->addSuccessor(&NextMBB);
|
||||
BBI.HasFallThrough = false;
|
||||
}
|
||||
// Mixed predicated and unpredicated code. This cannot be iteratively
|
||||
@ -1671,6 +1654,8 @@ bool IfConverter::IfConvertTriangle(BBInfo &BBI, IfcvtKind Kind) {
|
||||
IterIfcvt = false;
|
||||
}
|
||||
|
||||
RemoveExtraEdges(BBI);
|
||||
|
||||
// Update block info. BB can be iteratively if-converted.
|
||||
if (!IterIfcvt)
|
||||
BBI.IsDone = true;
|
||||
|
@ -1,24 +0,0 @@
|
||||
# RUN: llc -mtriple=arm-apple-ios -run-pass=if-converter %s -o - | FileCheck %s
|
||||
---
|
||||
name: foo
|
||||
body: |
|
||||
bb.0:
|
||||
B %bb.2
|
||||
|
||||
bb.1:
|
||||
BX_RET 14, 0
|
||||
|
||||
bb.2:
|
||||
Bcc %bb.1, 1, %cpsr
|
||||
|
||||
bb.3:
|
||||
B %bb.1
|
||||
|
||||
...
|
||||
|
||||
# We should get a single block containing the BX_RET, with no successors at all
|
||||
|
||||
# CHECK: body:
|
||||
# CHECK-NEXT: bb.0:
|
||||
# CHECK-NEXT: BX_RET
|
||||
|
Loading…
Reference in New Issue
Block a user