diff options
author | Evan Cheng <evan.cheng@apple.com> | 2007-05-29 22:31:16 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2007-05-29 22:31:16 +0000 |
commit | c8ed9badfabf8933acf5fcf8a58248c93f401076 (patch) | |
tree | aae8487ca11e1009316dfe43042659ec10b90a74 /lib/CodeGen/IfConversion.cpp | |
parent | ea12a06a813a2756aed349ae4eac2d9c0d8a144d (diff) |
If there is an empty block between a source and its successor block, it still requires a unconditional branch.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37344 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/IfConversion.cpp')
-rw-r--r-- | lib/CodeGen/IfConversion.cpp | 67 |
1 files changed, 37 insertions, 30 deletions
diff --git a/lib/CodeGen/IfConversion.cpp b/lib/CodeGen/IfConversion.cpp index a8b1d8389a..8e7b0fe45a 100644 --- a/lib/CodeGen/IfConversion.cpp +++ b/lib/CodeGen/IfConversion.cpp @@ -339,6 +339,14 @@ void IfConverter::InvalidatePreds(MachineBasicBlock *BB) { } } +/// InsertUncondBranch - Inserts an unconditional branch from BB to ToBB. +/// +static void InsertUncondBranch(MachineBasicBlock *BB, MachineBasicBlock *ToBB, + const TargetInstrInfo *TII) { + std::vector<MachineOperand> NoCond; + TII->InsertBranch(*BB, ToBB, NULL, NoCond); +} + /// IfConvertEarlyExit - If convert a early exit sub-CFG. /// bool IfConverter::IfConvertEarlyExit(BBInfo &BBI) { @@ -369,10 +377,8 @@ bool IfConverter::IfConvertEarlyExit(BBInfo &BBI) { // unconditional one. BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB); MergeBlocks(BBI, *CvtBBI); - if (!isNextBlock(BBI.BB, NextBBI->BB)) { - std::vector<MachineOperand> NoCond; - TII->InsertBranch(*BBI.BB, NextBBI->BB, NULL, NoCond); - } + if (!isNextBlock(BBI.BB, NextBBI->BB)) + InsertUncondBranch(BBI.BB, NextBBI->BB, TII); std::copy(NewCond.begin(), NewCond.end(), std::back_inserter(BBI.Predicate)); // Update block info. BB can be iteratively if-converted. @@ -430,8 +436,8 @@ bool IfConverter::IfConvertTriangle(BBInfo &BBI) { bool IfConverter::IfConvertDiamond(BBInfo &BBI) { BBI.Kind = ICNotClassfied; - bool TrueNeedCBr; - bool FalseNeedCBr; + bool TrueNeedBr; + bool FalseNeedBr; BBInfo &TrueBBI = BBAnalysis[BBI.TrueBB->getNumber()]; BBInfo &FalseBBI = BBAnalysis[BBI.FalseBB->getNumber()]; FeasibilityAnalysis(TrueBBI, BBI.BrCond); @@ -444,14 +450,14 @@ bool IfConverter::IfConvertDiamond(BBInfo &BBI) { if (Proceed) { // Check the 'true' and 'false' blocks if either isn't ended with a branch. // Either the block fallthrough to another block or it ends with a - // return. If it's the former, add a conditional branch to its successor. - TrueNeedCBr = !TrueBBI.TrueBB && BBI.TrueBB->succ_size(); - FalseNeedCBr = !FalseBBI.TrueBB && BBI.FalseBB->succ_size(); - if (TrueNeedCBr && TrueBBI.ModifyPredicate) { + // return. If it's the former, add a branch to its successor. + TrueNeedBr = !TrueBBI.TrueBB && BBI.TrueBB->succ_size(); + FalseNeedBr = !FalseBBI.TrueBB && BBI.FalseBB->succ_size(); + if (TrueNeedBr && TrueBBI.ModifyPredicate) { TrueBBI.isPredicable = false; Proceed = false; } - if (FalseNeedCBr && FalseBBI.ModifyPredicate) { + if (FalseNeedBr && FalseBBI.ModifyPredicate) { FalseBBI.isPredicable = false; Proceed = false; } @@ -502,32 +508,35 @@ bool IfConverter::IfConvertDiamond(BBInfo &BBI) { TrueBBI.NonPredSize -= TII->RemoveBranch(*BBI.TrueBB); PredicateBlock(TrueBBI, BBI.BrCond); - // Add a conditional branch to 'true' successor if needed. - if (TrueNeedCBr && TrueBBI.ModifyPredicate && - isNextBlock(BBI.TrueBB, *BBI.TrueBB->succ_begin())) - TrueNeedCBr = false; - if (TrueNeedCBr) - TII->InsertBranch(*BBI.TrueBB, *BBI.TrueBB->succ_begin(), NULL, BBI.BrCond); - // Predicate the 'false' block. PredicateBlock(FalseBBI, RevCond, true); - // Add a conditional branch to 'false' successor if needed. - if (FalseNeedCBr && !TrueBBI.ModifyPredicate && - isNextBlock(BBI.FalseBB, *BBI.FalseBB->succ_begin())) - FalseNeedCBr = false; - if (FalseNeedCBr) - TII->InsertBranch(*BBI.FalseBB, *BBI.FalseBB->succ_begin(), NULL, - RevCond); - // Merge the 'true' and 'false' blocks by copying the instructions // from the 'false' block to the 'true' block. That is, unless the true // block would clobber the predicate, in that case, do the opposite. BBInfo *CvtBBI; if (!TrueBBI.ModifyPredicate) { + // Add a conditional branch from 'true' to 'true' successor if needed. + if (TrueNeedBr) + TII->InsertBranch(*BBI.TrueBB, *BBI.TrueBB->succ_begin(), NULL, + BBI.BrCond); + // Add an unconditional branch from 'false' to to 'false' successor if it + // will not be the fallthrough block. + if (FalseNeedBr && + !isNextBlock(BBI.BB, *BBI.FalseBB->succ_begin())) + InsertUncondBranch(BBI.FalseBB, *BBI.FalseBB->succ_begin(), TII); MergeBlocks(TrueBBI, FalseBBI); CvtBBI = &TrueBBI; } else { + // Add a conditional branch from 'false' to 'false' successor if needed. + if (FalseNeedBr) + TII->InsertBranch(*BBI.FalseBB, *BBI.FalseBB->succ_begin(), NULL, + RevCond); + // Add an unconditional branch from 'true' to to 'true' successor if it + // will not be the fallthrough block. + if (TrueNeedBr && + !isNextBlock(BBI.BB, *BBI.TrueBB->succ_begin())) + InsertUncondBranch(BBI.TrueBB, *BBI.TrueBB->succ_begin(), TII); MergeBlocks(FalseBBI, TrueBBI); CvtBBI = &FalseBBI; } @@ -543,10 +552,8 @@ bool IfConverter::IfConvertDiamond(BBInfo &BBI) { MergeBlocks(BBI, *CvtBBI); CvtBBI = &BBI; OkToIfcvt = false; - } else { - std::vector<MachineOperand> NoCond; - TII->InsertBranch(*BBI.BB, CvtBBI->BB, NULL, NoCond); - } + } else + InsertUncondBranch(BBI.BB, CvtBBI->BB, TII); // If the if-converted block fallthrough into the tail block, then // fold the tail block in as well. |