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

Dan Gohman gohman at apple.com
Fri Jun 13 15:48:12 PDT 2008


No, it's still possible to eliminate an iv when the condition has
multiple users. But it's complicated when the iv to be used in the
new condition is defined later in the block than one of the
condition's users.

Dan

On Jun 13, 2008, at 3:28 PM, Evan Cheng wrote:

> 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
>
> _______________________________________________
> 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