[llvm-commits] [llvm] r53735 - /llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
Dan Gohman
gohman at apple.com
Fri Jul 18 09:48:16 PDT 2008
Hi Owen,
I reverted this because it causes an ICE in SPEC 464.h264ref. Can you
investigate?
Thanks,
Dan
On Jul 17, 2008, at 1:00 PM, Owen Anderson wrote:
> Author: resistor
> Date: Thu Jul 17 15:00:46 2008
> New Revision: 53735
>
> URL: http://llvm.org/viewvc/llvm-project?rev=53735&view=rev
> Log:
> Use MergeBlockIntoPredecessor to simplify some code.
>
> Modified:
> llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
>
> Modified: llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp?rev=53735&r1=53734&r2=53735&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp (original)
> +++ llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp Thu Jul 17
> 15:00:46 2008
> @@ -2036,6 +2036,12 @@
> // pred, and if there is only one distinct successor of the
> predecessor, and
> // if there are no PHI nodes.
> //
> + if (MergeBlockIntoPredecessor(BB))
> + return true;
> +
> + // Otherwise, if this block only has a single predecessor, and if
> that block
> + // is a conditional branch, see if we can hoist any code from
> this block up
> + // into our predecessor.
> pred_iterator PI(pred_begin(BB)), PE(pred_end(BB));
> BasicBlock *OnlyPred = *PI++;
> for (; PI != PE; ++PI) // Search all predecessors, see if they
> are all same
> @@ -2043,57 +2049,7 @@
> OnlyPred = 0; // There are multiple different
> predecessors...
> break;
> }
> -
> - BasicBlock *OnlySucc = 0;
> - if (OnlyPred && OnlyPred != BB && // Don't break self loops
> - OnlyPred->getTerminator()->getOpcode() !=
> Instruction::Invoke) {
> - // Check to see if there is only one distinct successor...
> - succ_iterator SI(succ_begin(OnlyPred)), SE(succ_end(OnlyPred));
> - OnlySucc = BB;
> - for (; SI != SE; ++SI)
> - if (*SI != OnlySucc) {
> - OnlySucc = 0; // There are multiple distinct successors!
> - break;
> - }
> - }
> -
> - if (OnlySucc) {
> - DOUT << "Merging: " << *BB << "into: " << *OnlyPred;
> -
> - // Resolve any PHI nodes at the start of the block. They are all
> - // guaranteed to have exactly one entry if they exist, unless
> there are
> - // multiple duplicate (but guaranteed to be equal) entries for
> the
> - // incoming edges. This occurs when there are multiple edges
> from
> - // OnlyPred to OnlySucc.
> - //
> - 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.
> - OnlyPred->getInstList().pop_back();
> -
> - // Move all definitions in the successor to the predecessor.
> - OnlyPred->getInstList().splice(OnlyPred->end(), BB-
> >getInstList());
> -
> - // Make all PHI nodes that referred to BB now refer to Pred as
> their
> - // source.
> - BB->replaceAllUsesWith(OnlyPred);
> -
> - // Inherit predecessors name if it exists.
> - if (!OnlyPred->hasName())
> - OnlyPred->takeName(BB);
> -
> - // Erase basic block from the function.
> - M->getBasicBlockList().erase(BB);
> -
> - return true;
> - }
> -
> - // Otherwise, if this block only has a single predecessor, and if
> that block
> - // is a conditional branch, see if we can hoist any code from
> this block up
> - // into our predecessor.
> +
> if (OnlyPred)
> if (BranchInst *BI = dyn_cast<BranchInst>(OnlyPred-
> >getTerminator()))
> if (BI->isConditional()) {
> @@ -2101,6 +2057,7 @@
> BasicBlock *OtherBB = BI->getSuccessor(BI->getSuccessor(0)
> == BB);
> PI = pred_begin(OtherBB);
> ++PI;
> +
> if (PI == pred_end(OtherBB)) {
> // We have a conditional branch to two blocks that are
> only reachable
> // from the condbr. We know that the condbr dominates the
> two blocks,
> @@ -2108,7 +2065,7 @@
> // blocks. If so, we can hoist it up to the branching
> block.
> Changed |= HoistThenElseCodeToIf(BI);
> } else {
> - OnlySucc = NULL;
> + BasicBlock* OnlySucc = NULL;
> for (succ_iterator SI = succ_begin(BB), SE = succ_end(BB);
> SI != SE; ++SI) {
> if (!OnlySucc)
>
>
> _______________________________________________
> 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