[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 16:56:09 PDT 2008


On Jun 13, 2008, at 4:34 PM, Dan Gohman wrote:

>
> On Jun 13, 2008, at 3:58 PM, Evan Cheng wrote:
>
>>
>> On Jun 13, 2008, at 3:48 PM, Dan Gohman wrote:
>>
>>> 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
>>
>> The only time that's possible is if all the other uses are memory
>> operations, right?
>
> No; it's the condition that's important here. In the testcase,
> the icmp has two users: the conditional branch at the end of the
> block, and also a select instruction in the middle of the block.
> The select precedes the add that LSR wants to use for the new
> stride.
>
> I'll look into the compile-time impact of traversing the block
> to detect this condition.

Thanks. There are probably very few cases where there are more than  
one uses in the block. Since we are dealing with icmp instruction it  
should be cheap to determine if there are uses between the icmp and  
the end of the block.

Evan

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