[llvm-commits] CVS: llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp

Reid Spencer rspencer at reidspencer.com
Sun Jan 14 16:16:21 PST 2007


On Sun, 2007-01-14 at 12:33 -0600, Chris Lattner wrote:
> 
> Changes in directory llvm/lib/Transforms/Utils:
> 
> BreakCriticalEdges.cpp updated: 1.38 -> 1.39
> ---
> Log message:
> 
> Fix PR1110: http://llvm.org/PR1110  and Analysis/Dominators/2007-01-14-BreakCritEdges.ll by being
> more careful about unreachable code when updating dominator info.

I believe this patch has now broken:
test/Regression/Analysis/Dominators/2006-10-02-BreakCritEdges.ll

It is reporting: 
Printing analysis 'Dominator Tree Construction' for function 'f':
=============================--------------------------------
Inorder Dominator Tree:
  [1]  %entry
    [2]  %brtrue
      [3]  %brtrue.brfalse_crit_edge
      [3]  %brtrue.brtrue_crit_edge
    [2]  %brfalse

which doesn't match the expected pattern of grep '3.*%brtrue$'

I'm unsure of whether this is an intended change and the test case
should be updated or whether the test case is correct and the patch
broke -break-crit-edges.

Reid.

> 
> 
> ---
> Diffs of the changes:  (+40 -35)
> 
>  BreakCriticalEdges.cpp |   75 ++++++++++++++++++++++++++-----------------------
>  1 files changed, 40 insertions(+), 35 deletions(-)
> 
> 
> Index: llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp
> diff -u llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp:1.38 llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp:1.39
> --- llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp:1.38	Tue Dec 19 16:17:40 2006
> +++ llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp	Sun Jan 14 12:33:35 2007
> @@ -182,49 +182,54 @@
>    
>    // Should we update DominatorSet information?
>    if (DominatorSet *DS = P->getAnalysisToUpdate<DominatorSet>()) {
> -    // The blocks that dominate the new one are the blocks that dominate TIBB
> -    // plus the new block itself.
> -    DominatorSet::DomSetType DomSet = DS->getDominators(TIBB);
> -    DomSet.insert(NewBB);  // A block always dominates itself.
> -    DS->addBasicBlock(NewBB, DomSet);
> -    
> -    // If NewBBDominatesDestBB hasn't been computed yet, do so with DS.
> -    if (!OtherPreds.empty()) {
> -      while (!OtherPreds.empty() && NewBBDominatesDestBB) {
> -        NewBBDominatesDestBB = DS->dominates(DestBB, OtherPreds.back());
> -        OtherPreds.pop_back();
> +    DominatorSet::iterator DSI = DS->find(TIBB);
> +    if (DSI != DS->end()) {    // TIBB is reachable?
> +      // The blocks that dominate the new one are the blocks that dominate TIBB
> +      // plus the new block itself.
> +      DominatorSet::DomSetType DomSet = DSI->second;  // Copy domset.
> +      DomSet.insert(NewBB);  // A block always dominates itself.
> +      DS->addBasicBlock(NewBB, DomSet);
> +      
> +      // If NewBBDominatesDestBB hasn't been computed yet, do so with DS.
> +      if (!OtherPreds.empty()) {
> +        while (!OtherPreds.empty() && NewBBDominatesDestBB) {
> +          NewBBDominatesDestBB = DS->dominates(DestBB, OtherPreds.back());
> +          OtherPreds.pop_back();
> +        }
> +        OtherPreds.clear();
> +      }
> +      
> +      // If NewBBDominatesDestBB, then NewBB dominates DestBB, otherwise it
> +      // doesn't dominate anything.  If NewBB does dominates DestBB, then it
> +      // dominates everything that DestBB dominates.
> +      if (NewBBDominatesDestBB) {
> +        for (DominatorSet::iterator I = DS->begin(), E = DS->end(); I != E; ++I)
> +          if (I->second.count(DestBB))
> +            I->second.insert(NewBB);
>        }
> -      OtherPreds.clear();
> -    }
> -    
> -    // If NewBBDominatesDestBB, then NewBB dominates DestBB, otherwise it
> -    // doesn't dominate anything.  If NewBB does dominates DestBB, then it
> -    // dominates everything that DestBB dominates.
> -    if (NewBBDominatesDestBB) {
> -      for (DominatorSet::iterator I = DS->begin(), E = DS->end(); I != E; ++I)
> -        if (I->second.count(DestBB))
> -          I->second.insert(NewBB);
>      }
>    }
>  
>    // Should we update ImmediateDominator information?
>    if (ImmediateDominators *ID = P->getAnalysisToUpdate<ImmediateDominators>()) {
> -    // TIBB is the new immediate dominator for NewBB.
> -    ID->addNewBlock(NewBB, TIBB);
> -    
> -    // If NewBBDominatesDestBB hasn't been computed yet, do so with ID.
> -    if (!OtherPreds.empty()) {
> -      while (!OtherPreds.empty() && NewBBDominatesDestBB) {
> -        NewBBDominatesDestBB = ID->dominates(DestBB, OtherPreds.back());
> -        OtherPreds.pop_back();
> +    if (ID->get(TIBB)) {  // Only do this if TIBB is reachable.
> +      // TIBB is the new immediate dominator for NewBB.
> +      ID->addNewBlock(NewBB, TIBB);
> +      
> +      // If NewBBDominatesDestBB hasn't been computed yet, do so with ID.
> +      if (!OtherPreds.empty()) {
> +        while (!OtherPreds.empty() && NewBBDominatesDestBB) {
> +          NewBBDominatesDestBB = ID->dominates(DestBB, OtherPreds.back());
> +          OtherPreds.pop_back();
> +        }
> +        OtherPreds.clear();
>        }
> -      OtherPreds.clear();
> +      
> +      // If NewBBDominatesDestBB, then NewBB dominates DestBB, otherwise it
> +      // doesn't dominate anything.
> +      if (NewBBDominatesDestBB)
> +        ID->setImmediateDominator(DestBB, NewBB);
>      }
> -    
> -    // If NewBBDominatesDestBB, then NewBB dominates DestBB, otherwise it
> -    // doesn't dominate anything.
> -    if (NewBBDominatesDestBB)
> -      ID->setImmediateDominator(DestBB, NewBB);
>    }
>  
>    // Update the forest?
> 
> 
> 
> _______________________________________________
> 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