[PATCH] D26877: Minor fixes in Loop Strength Reduction

Evgeny Stupachenko via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 21 15:28:18 PST 2016


Thanks Wei,

Would you mind if I add it to the review?

Evgeny

On Mon, Nov 21, 2016 at 3:23 PM, Wei Mi <wmi at google.com> wrote:
> I attached the testcase: test/Transforms/LoopStrengthReduce/X86/bestreg.ll
>
> The testcase is relatively large because otherwise the pruning search
> space heuristic will not be triggered.
>
> For the testcase, without the patch, we will generate two
> getelementptrs for the address of every store inside of loop. With the
> patch, we only generate one getelementptr for the address of every
> store. The different number of getelementptrs will translate to
> instruction number difference inside of inner loop.
>
> Thanks,
> Wei.
>
>
>
> On Mon, Nov 21, 2016 at 2:33 PM, Wei Mi <wmi at google.com> wrote:
>> We found a testcase related with item3 and the patch here fixed it. I
>> will contribute a testcase soon. Thanks for the patch!
>>
>> Thanks,
>> Wei.
>>
>>
>> On Mon, Nov 21, 2016 at 2:18 PM, Evgeny Stupachenko <evstupac at gmail.com> wrote:
>>> evstupac updated this revision to Diff 78784.
>>> evstupac added a comment.
>>>
>>> "2. Debug print: ..." committed separately.
>>>
>>>
>>> Repository:
>>>   rL LLVM
>>>
>>> https://reviews.llvm.org/D26877
>>>
>>> Files:
>>>   lib/Transforms/Scalar/LoopStrengthReduce.cpp
>>>
>>>
>>> Index: lib/Transforms/Scalar/LoopStrengthReduce.cpp
>>> ===================================================================
>>> --- lib/Transforms/Scalar/LoopStrengthReduce.cpp
>>> +++ lib/Transforms/Scalar/LoopStrengthReduce.cpp
>>> @@ -1674,7 +1674,7 @@
>>>    SmallPtrSet<Use*, MaxChains> IVIncSet;
>>>
>>>    void OptimizeShadowIV();
>>> -  bool FindIVUserForCond(ICmpInst *Cond, IVStrideUse *&CondUse);
>>> +  bool FindIVUserForInst(Instruction *Inst, IVStrideUse *&InstUse);
>>>    ICmpInst *OptimizeMax(ICmpInst *Cond, IVStrideUse* &CondUse);
>>>    void OptimizeLoopTermCond();
>>>
>>> @@ -1896,15 +1896,15 @@
>>>    }
>>>  }
>>>
>>> -/// If Cond has an operand that is an expression of an IV, set the IV user and
>>> +/// If Inst has an operand that is an expression of an IV, set the IV user and
>>>  /// stride information and return true, otherwise return false.
>>> -bool LSRInstance::FindIVUserForCond(ICmpInst *Cond, IVStrideUse *&CondUse) {
>>> +bool LSRInstance::FindIVUserForInst(Instruction *Inst, IVStrideUse *&InstUse) {
>>>    for (IVStrideUse &U : IU)
>>> -    if (U.getUser() == Cond) {
>>> +    if (U.getUser() == Inst) {
>>>        // NOTE: we could handle setcc instructions with multiple uses here, but
>>>        // InstCombine does it as well for simple uses, it's not clear that it
>>>        // occurs enough in real life to handle.
>>> -      CondUse = &U;
>>> +      InstUse = &U;
>>>        return true;
>>>      }
>>>    return false;
>>> @@ -2114,7 +2114,7 @@
>>>      // Search IVUsesByStride to find Cond's IVUse if there is one.
>>>      IVStrideUse *CondUse = nullptr;
>>>      ICmpInst *Cond = cast<ICmpInst>(TermBr->getCondition());
>>> -    if (!FindIVUserForCond(Cond, CondUse))
>>> +    if (!FindIVUserForInst(Cond, CondUse))
>>>        continue;
>>>
>>>      // If the trip count is computed in terms of a max (due to ScalarEvolution
>>> @@ -4144,9 +4144,10 @@
>>>      for (const SCEV *Reg : RegUses) {
>>>        if (Taken.count(Reg))
>>>          continue;
>>> -      if (!Best)
>>> +      if (!Best) {
>>>          Best = Reg;
>>> -      else {
>>> +        BestNum = RegUses.getUsedByIndices(Reg).count();
>>> +      } else {
>>>          unsigned Count = RegUses.getUsedByIndices(Reg).count();
>>>          if (Count > BestNum) {
>>>            Best = Reg;
>>>
>>>


More information about the llvm-commits mailing list