[llvm-commits] [llvm] r101165 - /llvm/trunk/lib/CodeGen/MachineSink.cpp

Chris Lattner clattner at apple.com
Tue Apr 13 15:42:06 PDT 2010


On Apr 13, 2010, at 12:06 PM, Jakob Stoklund Olesen wrote:

> Author: stoklund
> Date: Tue Apr 13 14:06:14 2010
> New Revision: 101165
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=101165&view=rev
> Log:
> Teach MachineSinking to handle easy critical edges.
> 
> Sometimes it is desirable to sink instructions along a critical edge:
> 
> x = ...
> if (a && b) ...
> else use(x);
> 
> The 'a && b' condition creates a critical edge to the else block, but we still
> want to sink the computation of x into the block. The else block is dominated by
> the parent block, so we are not pushing instructions into new code paths.

Nice, testcase? :)

-Chris

> 
> Modified:
>    llvm/trunk/lib/CodeGen/MachineSink.cpp
> 
> Modified: llvm/trunk/lib/CodeGen/MachineSink.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineSink.cpp?rev=101165&r1=101164&r2=101165&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/MachineSink.cpp (original)
> +++ llvm/trunk/lib/CodeGen/MachineSink.cpp Tue Apr 13 14:06:14 2010
> @@ -276,8 +276,23 @@
>   // but for now we just punt.
>   // FIXME: Split critical edges if not backedges.
>   if (SuccToSinkTo->pred_size() > 1) {
> -    DEBUG(dbgs() << " *** PUNTING: Critical edge found\n");
> -    return false;
> +    // We cannot sink a load across a critical edge - there may be stores in
> +    // other code paths.
> +    bool store = true;
> +    if (!MI->isSafeToMove(TII, AA, store)) {
> +      DEBUG(dbgs() << " *** PUNTING: Wont sink load along critical edge.\n");
> +      return false;
> +    }
> +
> +    // We don't want to sink across a critical edge if we don't dominate the
> +    // successor. We could be introducing calculations to new code paths.
> +    if (!DT->dominates(ParentBlock, SuccToSinkTo)) {
> +      DEBUG(dbgs() << " *** PUNTING: Critical edge found\n");
> +      return false;
> +    }
> +
> +    // Otherwise we are OK with sinking along a critical edge.
> +    DEBUG(dbgs() << "Sinking along critical edge.\n");
>   }
> 
>   // Determine where to insert into.  Skip phi nodes.
> 
> 
> _______________________________________________
> 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