[llvm-commits] [llvm] r52258 - in /llvm/trunk: lib/Transforms/Scalar/LoopStrengthReduce.cpp test/Transforms/LoopStrengthReduce/change-compare-stride-trickiness.ll

Evan Cheng evan.cheng at apple.com
Fri Jun 13 15:28:42 PDT 2008


Ah ok. I think this is not overly conservative. If there are multiple  
uses, it's probably not profitable to make the transformation anyway  
since it will not be able to eliminate an iv, right?

Evan

On Jun 13, 2008, at 2:43 PM, Dan Gohman wrote:

> Author: djg
> Date: Fri Jun 13 16:43:41 2008
> New Revision: 52258
>
> URL: http://llvm.org/viewvc/llvm-project?rev=52258&view=rev
> Log:
> Protect ChangeCompareStride from situations in which it is possible
> for it to generate use-before-def IR, such as in this testcase.
>
> Added:
>    llvm/trunk/test/Transforms/LoopStrengthReduce/change-compare- 
> stride-trickiness.ll
> Modified:
>    llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp
>
> Modified: llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp?rev=52258&r1=52257&r2=52258&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp Fri Jun  
> 13 16:43:41 2008
> @@ -1529,6 +1529,15 @@
> ICmpInst *LoopStrengthReduce::ChangeCompareStride(Loop *L, ICmpInst  
> *Cond,
>                                                 IVStrideUse* &CondUse,
>                                                 const SCEVHandle*  
> &CondStride) {
> +  // Forgo this transformation if the condition has multiple uses.  
> This is
> +  // over-conservative, but simpler than alternatives. It guards  
> against
> +  // comparisons with a use that occurs earlier than the add  
> instruction for the
> +  // new stride index.  See
> +  // test/Transforms/LoopStrengthReduce/change-compare-stride- 
> trickiness.ll
> +  // for an example of this situation.
> +  if (!Cond->hasOneUse())
> +    return Cond;
> +
>   if (StrideOrder.size() < 2 ||
>       IVUsesByStride[*CondStride].Users.size() != 1)
>     return Cond;
> @@ -1654,9 +1663,9 @@
>       RHS = SCEVExpander::InsertCastOfTo(Instruction::IntToPtr, RHS,  
> NewCmpTy);
>     }
>     // Insert new compare instruction.
> -    Cond = new ICmpInst(Predicate, NewIncV, RHS);
> -    Cond->setName(L->getHeader()->getName() + ".termcond");
> -    OldCond->getParent()->getInstList().insert(OldCond, Cond);
> +    Cond = new ICmpInst(Predicate, NewIncV, RHS,
> +                        L->getHeader()->getName() + ".termcond",
> +                        OldCond);
>
>     // Remove the old compare instruction. The old indvar is  
> probably dead too.
>     DeadInsts.insert(cast<Instruction>(CondUse->OperandValToReplace));
>
> Added: llvm/trunk/test/Transforms/LoopStrengthReduce/change-compare- 
> stride-trickiness.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopStrengthReduce/change-compare-stride-trickiness.ll?rev=52258&view=auto
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/test/Transforms/LoopStrengthReduce/change-compare- 
> stride-trickiness.ll (added)
> +++ llvm/trunk/test/Transforms/LoopStrengthReduce/change-compare- 
> stride-trickiness.ll Fri Jun 13 16:43:41 2008
> @@ -0,0 +1,20 @@
> +; RUN: llvm-as < %s | llc
> +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32- 
> i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64- 
> s0:64:64-f80:128:128"
> +target triple = "x86_64-apple-darwin9"
> +
> +define void @foo() {
> +entry:
> +	br label %loop
> +
> +loop:
> +	%indvar = phi i32 [ 0, %entry ], [ %i.2.0.us1534, %loop ]		; <i32>  
> [#uses=1]
> +	%i.2.0.us1534 = add i32 %indvar, 1		; <i32> [#uses=3]
> +	%tmp611.us1535 = icmp eq i32 %i.2.0.us1534, 4		; <i1> [#uses=2]
> +	%tmp623.us1538 = select i1 %tmp611.us1535, i32 6, i32 0		; <i32>  
> [#uses=0]
> +	%tmp628.us1540 = shl i32 %i.2.0.us1534, 1		; <i32> [#uses=1]
> +	%tmp645646647.us1547 = sext i32 %tmp628.us1540 to i64		; <i64>  
> [#uses=0]
> +	br i1 %tmp611.us1535, label %exit, label %loop
> +
> +exit:
> +	ret void
> +}
>
>
> _______________________________________________
> 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