[llvm-commits] [llvm] r53705 - in /llvm/trunk: include/llvm/Transforms/Utils/BasicBlockUtils.h lib/Transforms/Scalar/GVN.cpp lib/Transforms/Utils/BasicBlockUtils.cpp

Chris Lattner clattner at apple.com
Thu Jul 17 11:12:36 PDT 2008


On Jul 16, 2008, at 5:01 PM, Owen Anderson wrote:

> Author: resistor
> Date: Wed Jul 16 19:01:40 2008
> New Revision: 53705
>
> URL: http://llvm.org/viewvc/llvm-project?rev=53705&view=rev
> Log:
> Factor MergeBlockIntoPredecessor out into BasicBlockUtils.

Great!  Can simplifycfg and jump threading use this now?

-Chris

>
>
> Modified:
>    llvm/trunk/include/llvm/Transforms/Utils/BasicBlockUtils.h
>    llvm/trunk/lib/Transforms/Scalar/GVN.cpp
>    llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp
>
> Modified: llvm/trunk/include/llvm/Transforms/Utils/BasicBlockUtils.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Utils/BasicBlockUtils.h?rev=53705&r1=53704&r2=53705&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/include/llvm/Transforms/Utils/BasicBlockUtils.h  
> (original)
> +++ llvm/trunk/include/llvm/Transforms/Utils/BasicBlockUtils.h Wed  
> Jul 16 19:01:40 2008
> @@ -25,6 +25,10 @@
> class Instruction;
> class Pass;
>
> +/// MergeBlockIntoPredecessor - Attempts to merge a block into its  
> predecessor,
> +/// if possible.  The return value indicates success or failure.
> +bool MergeBlockIntoPredecessor(BasicBlock* BB, Pass* P);
> +
> // ReplaceInstWithValue - Replace all uses of an instruction  
> (specified by BI)
> // with a value, then remove and delete the original instruction.
> //
>
> Modified: llvm/trunk/lib/Transforms/Scalar/GVN.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/GVN.cpp?rev=53705&r1=53704&r2=53705&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/Transforms/Scalar/GVN.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/GVN.cpp Wed Jul 16 19:01:40 2008
> @@ -1125,7 +1125,10 @@
>   for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ) {
>     BasicBlock* BB = FI;
>     ++FI;
> -    changed |= mergeBlockIntoPredecessor(BB);
> +    bool removedBlock = MergeBlockIntoPredecessor(BB, this);
> +    if (removedBlock) NumGVNBlocks++;
> +
> +    changed |= removedBlock;
>   }
>
>   while (shouldContinue) {
> @@ -1336,56 +1339,6 @@
>   return changed;
> }
>
> -// mergeBlockIntoPredecessor - If this block is the only successor
> -// of its predecessor, and the edge is non-critical,
> -// fold it into that predecessor.
> -bool GVN::mergeBlockIntoPredecessor(BasicBlock* BB) {
> -  // Can't merge the entry block.
> -  if (pred_begin(BB) == pred_end(BB)) return false;
> -  // Can't merge if there are multiple preds.
> -  if (++pred_begin(BB) != pred_end(BB)) return false;
> -
> -  BasicBlock* PredBB = *pred_begin(BB);
> -
> -  // Can't merge if the edge is critical.
> -  if (PredBB->getTerminator()->getNumSuccessors() != 1) return false;
> -
> -  // Begin by getting rid of unneeded PHIs.
> -  while (PHINode *PN = dyn_cast<PHINode>(&BB->front())) {
> -    PN->replaceAllUsesWith(PN->getIncomingValue(0));
> -    BB->getInstList().pop_front();  // Delete the phi node...
> -  }
> -
> -  // Delete the unconditional branch from the predecessor...
> -  PredBB->getInstList().pop_back();
> -
> -  // Move all definitions in the successor to the predecessor...
> -  PredBB->getInstList().splice(PredBB->end(), BB->getInstList());
> -
> -  // Make all PHI nodes that referred to BB now refer to Pred as  
> their
> -  // source...
> -  BB->replaceAllUsesWith(PredBB);
> -
> -  // Finally, erase the old block and update dominator info.
> -  DominatorTree& DT = getAnalysis<DominatorTree>();
> -  DomTreeNode* DTN = DT[BB];
> -  DomTreeNode* PredDTN = DT[PredBB];
> -
> -  if (DTN) {
> -    SmallPtrSet<DomTreeNode*, 8> Children(DTN->begin(), DTN->end());
> -    for (SmallPtrSet<DomTreeNode*, 8>::iterator DI =  
> Children.begin(),
> -         DE = Children.end(); DI != DE; ++DI)
> -      DT.changeImmediateDominator(*DI, PredDTN);
> -
> -    DT.eraseNode(BB);
> -  }
> -
> -  BB->eraseFromParent();
> -
> -  NumGVNBlocks++;
> -  return true;
> -}
> -
> // iterateOnFunction - Executes one iteration of GVN
> bool GVN::iterateOnFunction(Function &F) {
>   // Clean out global sets from any previous functions
>
> Modified: llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp?rev=53705&r1=53704&r2=53705&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp (original)
> +++ llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp Wed Jul 16  
> 19:01:40 2008
> @@ -23,6 +23,58 @@
> #include <algorithm>
> using namespace llvm;
>
> +/// MergeBlockIntoPredecessor - Attempts to merge a block into its  
> predecessor,
> +/// if possible.  The return value indicates success or failure.
> +bool llvm::MergeBlockIntoPredecessor(BasicBlock* BB, Pass* P) {
> +  // Can't merge the entry block.
> +  if (pred_begin(BB) == pred_end(BB)) return false;
> +  // Can't merge if there are multiple preds.
> +  if (++pred_begin(BB) != pred_end(BB)) return false;
> +
> +  BasicBlock* PredBB = *pred_begin(BB);
> +
> +  // Can't merge if the edge is critical.
> +  if (PredBB->getTerminator()->getNumSuccessors() != 1) return false;
> +
> +  // Begin by getting rid of unneeded PHIs.
> +  while (PHINode *PN = dyn_cast<PHINode>(&BB->front())) {
> +    PN->replaceAllUsesWith(PN->getIncomingValue(0));
> +    BB->getInstList().pop_front();  // Delete the phi node...
> +  }
> +
> +  // Delete the unconditional branch from the predecessor...
> +  PredBB->getInstList().pop_back();
> +
> +  // Move all definitions in the successor to the predecessor...
> +  PredBB->getInstList().splice(PredBB->end(), BB->getInstList());
> +
> +  // Make all PHI nodes that referred to BB now refer to Pred as  
> their
> +  // source...
> +  BB->replaceAllUsesWith(PredBB);
> +
> +  // Finally, erase the old block and update dominator info.
> +  if (P) {
> +    if (DominatorTree* DT = P- 
> >getAnalysisToUpdate<DominatorTree>()) {
> +      DomTreeNode* DTN = DT->getNode(BB);
> +      DomTreeNode* PredDTN = DT->getNode(PredBB);
> +
> +      if (DTN) {
> +        SmallPtrSet<DomTreeNode*, 8> Children(DTN->begin(), DTN- 
> >end());
> +        for (SmallPtrSet<DomTreeNode*, 8>::iterator DI =  
> Children.begin(),
> +             DE = Children.end(); DI != DE; ++DI)
> +          DT->changeImmediateDominator(*DI, PredDTN);
> +
> +        DT->eraseNode(BB);
> +      }
> +    }
> +  }
> +
> +  BB->eraseFromParent();
> +
> +
> +  return true;
> +}
> +
> /// ReplaceInstWithValue - Replace all uses of an instruction  
> (specified by BI)
> /// with a value, then remove and delete the original instruction.
> ///
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list