[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