On Thu, Jul 14, 2016 at 12:42 PM, Richard Biener
<richard.guent...@gmail.com> wrote:
> On Wed, Jul 13, 2016 at 6:09 PM, Bin.Cheng <amker.ch...@gmail.com> wrote:
>> On Fri, Jul 1, 2016 at 11:33 AM, Richard Biener
>> <richard.guent...@gmail.com> wrote:
>>> On Tue, Jun 28, 2016 at 8:18 AM, Bin Cheng <bin.ch...@arm.com> wrote:
>>>> Hi,
>>>> At the moment, loop niter analyzer depends on simple_iv to understand 
>>>> control induction variable in order to do further niter analysis.  For 
>>>> cases reported in PR57558 (comment #4), the control variable is not an 
>>>> SCEV because it's converted from an smaller type and that type could 
>>>> overflow/wrap.  As a result, niter information for such loops won't be 
>>>> analyzed because number_of_iterations_exit exits immediately once 
>>>> simple_iv fails.  As a matter of fact, niter analyzer can be improved by 
>>>> computing an additional assumption under which the loop won't be infinite 
>>>> (or the corresponding iv doesn't overflow).  This patch does so by 
>>>> changing both scev and niter analyzer.  It introduces a new interface 
>>>> simple_iv_with_niters which is used in niter analyzer.  The new interface 
>>>> returns an IV as well as a possible niter expression, the expression 
>>>> indicates the maximum number the IV can iterate before the returned 
>>>> simple_iv becoming invalid.  Given below example:
>>>>
>>>>   short unsigned int i;
>>>>   int _1;
>>>>
>>>>   <bb 2>:
>>>>   goto <bb 4>;
>>>>
>>>>   <bb 3>:
>>>>   arr[_1] = -1;
>>>>   i_6 = i_2 + 1;
>>>>
>>>>   <bb 4>:
>>>>   # i_2 = PHI <1(2), i_6(3)>
>>>>   _1 = (int) i_2;
>>>>   if (_1 != 199)
>>>>     goto <bb 3>;
>>>>   else
>>>>     goto <bb 5>;
>>>>
>>>>   <bb 5>:
>>>>   return;
>>>>
>>>> When analyzing variable "_1", the old interface simple_iv returns false, 
>>>> while the new interface returns <{1, 1}_loop, 65534>.  It means "_1" is a 
>>>> valid SCEV as long as it doesn't iterate more than 65534 times.
>>>> This patch also introduces a new interface in niter analyzer 
>>>> number_of_iterations_exit_assumptions.  The new interface further derives 
>>>> assumption from the result of simple_iv_with_niters, and the assumption 
>>>> can be used by other optimizers.  As for this loop, it's an unexpected 
>>>> gain because assumption (198 < 65534) is naturally TRUE.
>>>> For loops that could be infinite, the assumption will be an expression.  
>>>> This improvement is still good, for example, the next patch to will 
>>>> vectorize such loops with help of this patch.
>>>>
>>>> This patch also changes how assumptions is handled in niter analyzer.  At 
>>>> the moment, (non-true) assumptions are not supported unless 
>>>> -funsafe-loop-optimizations are specified, after this patch, the new 
>>>> interface exposes assumptions to niter user and let them make their own 
>>>> decision.  In effect, this patch discards -funsafe-loop-optimizations on 
>>>> GIMPLE level, which we think is not a very useful option anyway.  Next 
>>>> patch will xfails tests for this option.  Well, the option is not totally 
>>>> discarded because it requires RTL changes too.  I will follow up that 
>>>> after gimple part change.
>>>>
>>>> Bootstrap and test on x86_64 and AArch64.  Is it OK?
>>>
>>> Please make simple_iv_with_niters accept NULL as iv_niters and pass
>>> NULL from simple_iv to avoid useless work.
>>>
>>> You have chosen to make the flags per loop instead of say, flags on
>>> the global loop state.  The patch itself doesn't set the flag
>>> on any loop thus it doesn't really belong into this patch IMHO, so
>>> maybe you can split it out.  We do already have a plethora
>>> of "flags" (badly packed) in struct loop and while I see the interface
>>> is sth very specific adding another 4 bytes doesn't look
>>> too nice here (but maybe we don't care, struct loop isn't allocated
>>> that much hopefully).  I'd like to see a better comment
>>> before the flags part in cfgloop.h though noting that those are not
>>> flags computed by the compiler but flags that are set
>>> by the consumer that affect semantics of certain (document which)
>>> APIs.  And that consumers are expected to re-set
>>> flags back!  (failing to do that might be a source of hard to track down 
>>> bugs?)
>>>
>>> Anyway, the _assumtions part of the patch is ok with the suggested change.
>>>
>> Hi Richard,
>> According to your suggestion, I split the original patch into two, and
>> this is the first part.  It improves scalar evolution and loop niter
>> analyzer so that (possible) infinite loop can be handled.  As a bonus
>> point, it also picks up normal loops which were missed before, for
>> example, loop in the added test.
>>
>> Bootstrap and test on x86_64 ongoing, Is it OK?
>
> Ok.
Applied as revision 238367, failure of gcc.dg/tree-ssa/pr19210-*.c
will be handled by following patch removing
-funsafe-loop-optimizations.

Thanks,
bin
>
> Thanks,
> Richard.
>
>> Thanks,
>> bin
>>
>> 2016-07-13  Bin Cheng  <bin.ch...@arm.com>
>>
>>     * tree-scalar-evolution.c (simple_iv_with_niters): New funcion.
>>     (derive_simple_iv_with_niters): New function.
>>     (simple_iv): Rewrite using simple_iv_with_niters.
>>     * tree-scalar-evolution.h (simple_iv_with_niters): New decl.
>>     * tree-ssa-loop-niter.c (number_of_iterations_exit_assumptions): New
>>     function.
>>     (number_of_iterations_exit): Rewrite using above function.
>>     * tree-ssa-loop-niter.h (number_of_iterations_exit_assumptions): New
>>     Decl.
>>
>> gcc/testsuite/ChangeLog
>> 2016-07-13  Bin Cheng  <bin.ch...@arm.com>
>>
>>     * gcc.dg/tree-ssa/loop-41.c: New test.

Reply via email to