[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