[llvm-commits] CVS: llvm/lib/CodeGen/IfConversion.cpp
Evan Cheng
evan.cheng at apple.com
Tue May 29 15:31:45 PDT 2007
Changes in directory llvm/lib/CodeGen:
IfConversion.cpp updated: 1.13 -> 1.14
---
Log message:
If there is an empty block between a source and its successor block, it still requires a unconditional branch.
---
Diffs of the changes: (+37 -30)
IfConversion.cpp | 67 ++++++++++++++++++++++++++++++-------------------------
1 files changed, 37 insertions(+), 30 deletions(-)
Index: llvm/lib/CodeGen/IfConversion.cpp
diff -u llvm/lib/CodeGen/IfConversion.cpp:1.13 llvm/lib/CodeGen/IfConversion.cpp:1.14
--- llvm/lib/CodeGen/IfConversion.cpp:1.13 Thu May 24 19:59:01 2007
+++ llvm/lib/CodeGen/IfConversion.cpp Tue May 29 17:31:16 2007
@@ -339,6 +339,14 @@
}
}
+/// 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 @@
// 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::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 @@
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 @@
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 @@
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.
More information about the llvm-commits
mailing list