diff options
Diffstat (limited to 'lib/CodeGen/IfConversion.cpp')
| -rw-r--r-- | lib/CodeGen/IfConversion.cpp | 33 | 
1 files changed, 9 insertions, 24 deletions
diff --git a/lib/CodeGen/IfConversion.cpp b/lib/CodeGen/IfConversion.cpp index 628d599a3cc7..1c33f3b6800e 100644 --- a/lib/CodeGen/IfConversion.cpp +++ b/lib/CodeGen/IfConversion.cpp @@ -39,7 +39,7 @@  using namespace llvm; -#define DEBUG_TYPE "ifcvt" +#define DEBUG_TYPE "if-converter"  // Hidden options for help debugging.  static cl::opt<int> IfCvtFnStart("ifcvt-fn-start", cl::init(-1), cl::Hidden); @@ -316,9 +316,9 @@ namespace {  char &llvm::IfConverterID = IfConverter::ID; -INITIALIZE_PASS_BEGIN(IfConverter, "if-converter", "If Converter", false, false) +INITIALIZE_PASS_BEGIN(IfConverter, DEBUG_TYPE, "If Converter", false, false)  INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfo) -INITIALIZE_PASS_END(IfConverter, "if-converter", "If Converter", false, false) +INITIALIZE_PASS_END(IfConverter, DEBUG_TYPE, "If Converter", false, false)  bool IfConverter::runOnMachineFunction(MachineFunction &MF) {    if (skipFunction(*MF.getFunction()) || (PredicateFtor && !PredicateFtor(MF))) @@ -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;  | 
