[llvm-commits] CVS: llvm/lib/CodeGen/IfConversion.cpp
Evan Cheng
evan.cheng at apple.com
Mon Jun 18 15:45:20 PDT 2007
Changes in directory llvm/lib/CodeGen:
IfConversion.cpp updated: 1.56 -> 1.57
---
Log message:
Fix some fragile code wrt CFG edge updating.
---
Diffs of the changes: (+39 -74)
IfConversion.cpp | 113 ++++++++++++++++++-------------------------------------
1 files changed, 39 insertions(+), 74 deletions(-)
Index: llvm/lib/CodeGen/IfConversion.cpp
diff -u llvm/lib/CodeGen/IfConversion.cpp:1.56 llvm/lib/CodeGen/IfConversion.cpp:1.57
--- llvm/lib/CodeGen/IfConversion.cpp:1.56 Mon Jun 18 03:37:25 2007
+++ llvm/lib/CodeGen/IfConversion.cpp Mon Jun 18 17:44:57 2007
@@ -486,11 +486,12 @@
return false;
if (TT == NULL && (TrueBBI.IsBrAnalyzable || FalseBBI.IsBrAnalyzable))
return false;
- // FIXME: Allow false block to have an early exit?
- if (TrueBBI.BB->pred_size() > 1 ||
- FalseBBI.BB->pred_size() > 1 ||
- TrueBBI.FalseBB || FalseBBI.FalseBB ||
- (TrueBBI.ClobbersPred && FalseBBI.ClobbersPred))
+ if (TrueBBI.BB->pred_size() > 1 || FalseBBI.BB->pred_size() > 1)
+ return false;
+
+ // FIXME: Allow true block to have an early exit?
+ if (TrueBBI.FalseBB || FalseBBI.FalseBB ||
+ (TrueBBI.ClobbersPred && FalseBBI.ClobbersPred))
return false;
MachineBasicBlock::iterator TI = TrueBBI.BB->begin();
@@ -806,16 +807,8 @@
void IfConverter::RemoveExtraEdges(BBInfo &BBI) {
MachineBasicBlock *TBB = NULL, *FBB = NULL;
std::vector<MachineOperand> Cond;
- bool isAnalyzable = !TII->AnalyzeBranch(*BBI.BB, TBB, FBB, Cond);
- bool CanFallthrough = isAnalyzable && (TBB == NULL || FBB == NULL);
- if (BBI.TrueBB && BBI.BB->isSuccessor(BBI.TrueBB))
- if (!(BBI.TrueBB == TBB || BBI.TrueBB == FBB ||
- (CanFallthrough && getNextBlock(BBI.BB) == BBI.TrueBB)))
- BBI.BB->removeSuccessor(BBI.TrueBB);
- if (BBI.FalseBB && BBI.BB->isSuccessor(BBI.FalseBB))
- if (!(BBI.FalseBB == TBB || BBI.FalseBB == FBB ||
- (CanFallthrough && getNextBlock(BBI.BB) == BBI.FalseBB)))
- BBI.BB->removeSuccessor(BBI.FalseBB);
+ if (!TII->AnalyzeBranch(*BBI.BB, TBB, FBB, Cond))
+ BBI.BB->CorrectExtraCFGEdges(TBB, FBB, !Cond.empty());
}
/// IfConvertSimple - If convert a simple (split, no rejoin) sub-CFG.
@@ -936,23 +929,19 @@
PredicateBlock(*CvtBBI, CvtBBI->BB->end(), Cond);
}
+ if (!DupBB) {
+ // Now merge the entry of the triangle with the true block.
+ BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);
+ MergeBlocks(BBI, *CvtBBI);
+ }
+
// If 'true' block has a 'false' successor, add an exit branch to it.
if (HasEarlyExit) {
std::vector<MachineOperand> RevCond(CvtBBI->BrCond);
if (TII->ReverseBranchCondition(RevCond))
assert(false && "Unable to reverse branch condition!");
- if (DupBB) {
- TII->InsertBranch(*BBI.BB, CvtBBI->FalseBB, NULL, RevCond);
- BBI.BB->addSuccessor(CvtBBI->FalseBB);
- } else {
- TII->InsertBranch(*CvtBBI->BB, CvtBBI->FalseBB, NULL, RevCond);
- }
- }
-
- if (!DupBB) {
- // Now merge the entry of the triangle with the true block.
- BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);
- MergeBlocks(BBI, *CvtBBI);
+ TII->InsertBranch(*BBI.BB, CvtBBI->FalseBB, NULL, RevCond);
+ BBI.BB->addSuccessor(CvtBBI->FalseBB);
}
// Merge in the 'false' block if the 'false' block has no other
@@ -1024,25 +1013,18 @@
TII->ReverseBranchCondition(RevCond);
std::vector<MachineOperand> *Cond1 = &BBI.BrCond;
std::vector<MachineOperand> *Cond2 = &RevCond;
- bool NeedBr1 = BBI1->FalseBB != NULL;
- bool NeedBr2 = BBI2->FalseBB != NULL;
// Figure out the more profitable ordering.
bool DoSwap = false;
if (TrueBBI.ClobbersPred && !FalseBBI.ClobbersPred)
DoSwap = true;
else if (TrueBBI.ClobbersPred == FalseBBI.ClobbersPred) {
- if (!NeedBr1 && NeedBr2)
+ if (TrueBBI.NonPredSize > FalseBBI.NonPredSize)
DoSwap = true;
- else if (NeedBr1 == NeedBr2) {
- if (TrueBBI.NonPredSize > FalseBBI.NonPredSize)
- DoSwap = true;
- }
}
if (DoSwap) {
std::swap(BBI1, BBI2);
std::swap(Cond1, Cond2);
- std::swap(NeedBr1, NeedBr2);
}
// Remove the conditional branch from entry to the blocks.
@@ -1069,10 +1051,6 @@
BBI1->BB->erase(DI1, BBI1->BB->end());
PredicateBlock(*BBI1, BBI1->BB->end(), *Cond1);
- // Add an early exit branch if needed.
- if (NeedBr1)
- TII->InsertBranch(*BBI1->BB, BBI1->FalseBB, NULL, *Cond1);
-
// Predicate the 'false' block.
BBI2->NonPredSize -= TII->RemoveBranch(*BBI2->BB);
DI2 = BBI2->BB->end();
@@ -1082,30 +1060,9 @@
}
PredicateBlock(*BBI2, DI2, *Cond2);
- // Add an unconditional branch from 'false' to to 'false' successor if it
- // will not be the fallthrough block.
- if (NeedBr2 && !NeedBr1) {
- // If BBI2 isn't going to be merged in, then the existing fallthrough
- // or branch is fine.
- if (!canFallThroughTo(BBI.BB, BBI2->FalseBB)) {
- InsertUncondBranch(BBI2->BB, BBI2->FalseBB, TII);
- BBI2->HasFallThrough = false;
- }
- }
-
- // Keep them as two separate blocks if there is an early exit.
- if (!NeedBr1)
- MergeBlocks(*BBI1, *BBI2);
-
- // Merge the combined block into the entry of the diamond.
+ // Merge the true block into the entry of the diamond.
MergeBlocks(BBI, *BBI1);
-
- // 'True' and 'false' aren't combined, see if we need to add a unconditional
- // branch to the 'false' block.
- if (NeedBr1 && !canFallThroughTo(BBI.BB, BBI2->BB)) {
- InsertUncondBranch(BBI.BB, BBI2->BB, TII);
- BBI1->HasFallThrough = false;
- }
+ MergeBlocks(BBI, *BBI2);
// If the if-converted block fallthrough or unconditionally branch into the
// tail block, and the tail block does not have other predecessors, then
@@ -1113,19 +1070,13 @@
// tail, add a unconditional branch to it.
if (TailBB) {
BBInfo TailBBI = BBAnalysis[TailBB->getNumber()];
- BBInfo *LastBBI = NeedBr1 ? BBI2 : &BBI;
- bool HasEarlyExit = NeedBr1 ? NeedBr2 : false;
- if (!HasEarlyExit &&
- TailBB->pred_size() == 1 && !TailBBI.HasFallThrough) {
- LastBBI->NonPredSize -= TII->RemoveBranch(*LastBBI->BB);
- MergeBlocks(*LastBBI, TailBBI);
+ if (TailBB->pred_size() == 1 && !TailBBI.HasFallThrough) {
+ BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);
+ MergeBlocks(BBI, TailBBI);
TailBBI.IsDone = true;
} else {
- bool isFallThrough = canFallThroughTo(LastBBI->BB, TailBB);
- if (!isFallThrough) {
- InsertUncondBranch(LastBBI->BB, TailBB, TII);
- LastBBI->HasFallThrough = false;
- }
+ InsertUncondBranch(BBI.BB, TailBB, TII);
+ BBI.HasFallThrough = false;
}
}
@@ -1185,6 +1136,20 @@
}
}
+ std::vector<MachineBasicBlock *> Succs(FromBBI.BB->succ_begin(),
+ FromBBI.BB->succ_end());
+ MachineBasicBlock *NBB = getNextBlock(FromBBI.BB);
+ MachineBasicBlock *FallThrough = FromBBI.HasFallThrough ? NBB : NULL;
+
+ for (unsigned i = 0, e = Succs.size(); i != e; ++i) {
+ MachineBasicBlock *Succ = Succs[i];
+ // Fallthrough edge can't be transferred.
+ if (Succ == FallThrough)
+ continue;
+ if (!ToBBI.BB->isSuccessor(Succ))
+ ToBBI.BB->addSuccessor(Succ);
+ }
+
std::copy(FromBBI.Predicate.begin(), FromBBI.Predicate.end(),
std::back_inserter(ToBBI.Predicate));
std::copy(Cond.begin(), Cond.end(), std::back_inserter(ToBBI.Predicate));
@@ -1227,7 +1192,7 @@
}
// Now FromBBI always fall through to the next block!
- if (NBB)
+ if (NBB && !FromBBI.BB->isSuccessor(NBB))
FromBBI.BB->addSuccessor(NBB);
std::copy(FromBBI.Predicate.begin(), FromBBI.Predicate.end(),
More information about the llvm-commits
mailing list