[PATCH] D26877: Minor fixes in Loop Strength Reduction
Wei Mi via llvm-commits
llvm-commits at lists.llvm.org
Mon Nov 21 15:29:49 PST 2016
Sure, please.
Thanks,
Wei.
On Mon, Nov 21, 2016 at 3:28 PM, Evgeny Stupachenko <evstupac at gmail.com> wrote:
> 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