[llvm-commits] CVS: llvm/lib/CodeGen/BranchFolding.cpp MachineBasicBlock.cpp

Evan Cheng evan.cheng at apple.com
Mon Jun 18 15:43:53 PDT 2007



Changes in directory llvm/lib/CodeGen:

BranchFolding.cpp updated: 1.67 -> 1.68
MachineBasicBlock.cpp updated: 1.46 -> 1.47
---
Log message:

Move CorrectExtraCFGEdges() from BranchFolding.cpp to a MachineBasicBlock method.

---
Diffs of the changes:  (+64 -75)

 BranchFolding.cpp     |   79 ++------------------------------------------------
 MachineBasicBlock.cpp |   60 +++++++++++++++++++++++++++++++++++++
 2 files changed, 64 insertions(+), 75 deletions(-)


Index: llvm/lib/CodeGen/BranchFolding.cpp
diff -u llvm/lib/CodeGen/BranchFolding.cpp:1.67 llvm/lib/CodeGen/BranchFolding.cpp:1.68
--- llvm/lib/CodeGen/BranchFolding.cpp:1.67	Thu Jun  7 20:08:52 2007
+++ llvm/lib/CodeGen/BranchFolding.cpp	Mon Jun 18 17:43:31 2007
@@ -87,12 +87,6 @@
   char BranchFolder::ID = 0;
 }
 
-static bool CorrectExtraCFGEdges(MachineBasicBlock &MBB, 
-                                 MachineBasicBlock *DestA,
-                                 MachineBasicBlock *DestB,
-                                 bool isCond, 
-                                 MachineFunction::iterator FallThru);
-
 FunctionPass *llvm::createBranchFoldingPass(bool DefaultEnableTailMerge) { 
       return new BranchFolder(DefaultEnableTailMerge); }
 
@@ -133,8 +127,7 @@
     MachineBasicBlock *MBB = I, *TBB = 0, *FBB = 0;
     std::vector<MachineOperand> Cond;
     if (!TII->AnalyzeBranch(*MBB, TBB, FBB, Cond))
-      EverMadeChange |= CorrectExtraCFGEdges(*MBB, TBB, FBB, 
-                        !Cond.empty(), next(I));
+      EverMadeChange |= MBB->CorrectExtraCFGEdges(TBB, FBB, !Cond.empty());
   }
 
   RegInfo = MF.getTarget().getRegisterInfo();
@@ -702,68 +695,6 @@
 }
 
 
-/// CorrectExtraCFGEdges - Various pieces of code can cause excess edges in the
-/// CFG to be inserted.  If we have proven that MBB can only branch to DestA and
-/// DestB, remove any other MBB successors from the CFG.  DestA and DestB can
-/// be null.
-/// Besides DestA and DestB, retain other edges leading to LandingPads (currently
-/// there can be only one; we don't check or require that here).
-/// Note it is possible that DestA and/or DestB are LandingPads.
-static bool CorrectExtraCFGEdges(MachineBasicBlock &MBB, 
-                                 MachineBasicBlock *DestA,
-                                 MachineBasicBlock *DestB,
-                                 bool isCond, 
-                                 MachineFunction::iterator FallThru) {
-  bool MadeChange = false;
-  bool AddedFallThrough = false;
-  
-  // If this block ends with a conditional branch that falls through to its
-  // successor, set DestB as the successor.
-  if (isCond) {
-    if (DestB == 0 && FallThru != MBB.getParent()->end()) {
-      DestB = FallThru;
-      AddedFallThrough = true;
-    }
-  } else {
-    // If this is an unconditional branch with no explicit dest, it must just be
-    // a fallthrough into DestB.
-    if (DestA == 0 && FallThru != MBB.getParent()->end()) {
-      DestA = FallThru;
-      AddedFallThrough = true;
-    }
-  }
-  
-  MachineBasicBlock::succ_iterator SI = MBB.succ_begin();
-  MachineBasicBlock *OrigDestA = DestA, *OrigDestB = DestB;
-  while (SI != MBB.succ_end()) {
-    if (*SI == DestA && DestA == DestB) {
-      DestA = DestB = 0;
-      ++SI;
-    } else if (*SI == DestA) {
-      DestA = 0;
-      ++SI;
-    } else if (*SI == DestB) {
-      DestB = 0;
-      ++SI;
-    } else if ((*SI)->isLandingPad() && 
-               *SI!=OrigDestA && *SI!=OrigDestB) {
-      ++SI;
-    } else {
-      // Otherwise, this is a superfluous edge, remove it.
-      MBB.removeSuccessor(SI);
-      MadeChange = true;
-    }
-  }
-  if (!AddedFallThrough) {
-    assert(DestA == 0 && DestB == 0 &&
-           "MachineCFG is missing edges!");
-  } else if (isCond) {
-    assert(DestA == 0 && "MachineCFG is missing edges!");
-  }
-  return MadeChange;
-}
-
-
 /// CanFallThrough - Return true if the specified block (with the specified
 /// branch condition) can implicitly transfer control to the block after it by
 /// falling off the end of it.  This should return false if it can reach the
@@ -880,8 +811,8 @@
     TII->AnalyzeBranch(PrevBB, PriorTBB, PriorFBB, PriorCond);
   if (!PriorUnAnalyzable) {
     // If the CFG for the prior block has extra edges, remove them.
-    MadeChange |= CorrectExtraCFGEdges(PrevBB, PriorTBB, PriorFBB,
-                                       !PriorCond.empty(), MBB);
+    MadeChange |= PrevBB.CorrectExtraCFGEdges(PriorTBB, PriorFBB,
+                                              !PriorCond.empty());
     
     // If the previous branch is conditional and both conditions go to the same
     // destination, remove the branch, replacing it with an unconditional one or
@@ -993,9 +924,7 @@
   bool CurUnAnalyzable = TII->AnalyzeBranch(*MBB, CurTBB, CurFBB, CurCond);
   if (!CurUnAnalyzable) {
     // If the CFG for the prior block has extra edges, remove them.
-    MadeChange |= CorrectExtraCFGEdges(*MBB, CurTBB, CurFBB,
-                                       !CurCond.empty(),
-                                       ++MachineFunction::iterator(MBB));
+    MadeChange |= MBB->CorrectExtraCFGEdges(CurTBB, CurFBB, !CurCond.empty());
 
     // If this is a two-way branch, and the FBB branches to this block, reverse 
     // the condition so the single-basic-block loop is faster.  Instead of:


Index: llvm/lib/CodeGen/MachineBasicBlock.cpp
diff -u llvm/lib/CodeGen/MachineBasicBlock.cpp:1.46 llvm/lib/CodeGen/MachineBasicBlock.cpp:1.47
--- llvm/lib/CodeGen/MachineBasicBlock.cpp:1.46	Mon Jun  4 01:44:01 2007
+++ llvm/lib/CodeGen/MachineBasicBlock.cpp	Mon Jun 18 17:43:31 2007
@@ -225,3 +225,63 @@
     addSuccessor(New);
 }
 
+/// CorrectExtraCFGEdges - Various pieces of code can cause excess edges in the
+/// CFG to be inserted.  If we have proven that MBB can only branch to DestA and
+/// DestB, remove any other MBB successors from the CFG.  DestA and DestB can
+/// be null.
+/// Besides DestA and DestB, retain other edges leading to LandingPads (currently
+/// there can be only one; we don't check or require that here).
+/// Note it is possible that DestA and/or DestB are LandingPads.
+bool MachineBasicBlock::CorrectExtraCFGEdges(MachineBasicBlock *DestA,
+                                             MachineBasicBlock *DestB,
+                                             bool isCond) {
+  bool MadeChange = false;
+  bool AddedFallThrough = false;
+
+  MachineBasicBlock *FallThru = getNext();
+  
+  // If this block ends with a conditional branch that falls through to its
+  // successor, set DestB as the successor.
+  if (isCond) {
+    if (DestB == 0 && FallThru != getParent()->end()) {
+      DestB = FallThru;
+      AddedFallThrough = true;
+    }
+  } else {
+    // If this is an unconditional branch with no explicit dest, it must just be
+    // a fallthrough into DestB.
+    if (DestA == 0 && FallThru != getParent()->end()) {
+      DestA = FallThru;
+      AddedFallThrough = true;
+    }
+  }
+  
+  MachineBasicBlock::succ_iterator SI = succ_begin();
+  MachineBasicBlock *OrigDestA = DestA, *OrigDestB = DestB;
+  while (SI != succ_end()) {
+    if (*SI == DestA && DestA == DestB) {
+      DestA = DestB = 0;
+      ++SI;
+    } else if (*SI == DestA) {
+      DestA = 0;
+      ++SI;
+    } else if (*SI == DestB) {
+      DestB = 0;
+      ++SI;
+    } else if ((*SI)->isLandingPad() && 
+               *SI!=OrigDestA && *SI!=OrigDestB) {
+      ++SI;
+    } else {
+      // Otherwise, this is a superfluous edge, remove it.
+      removeSuccessor(SI);
+      MadeChange = true;
+    }
+  }
+  if (!AddedFallThrough) {
+    assert(DestA == 0 && DestB == 0 &&
+           "MachineCFG is missing edges!");
+  } else if (isCond) {
+    assert(DestA == 0 && "MachineCFG is missing edges!");
+  }
+  return MadeChange;
+}






More information about the llvm-commits mailing list