On Thu, Jul 28, 2016 at 2:51 PM, Bin.Cheng <amker.ch...@gmail.com> wrote:
> On Wed, Jul 27, 2016 at 11:07 AM, Richard Biener
> <richard.guent...@gmail.com> wrote:
>> On Tue, Jul 26, 2016 at 7:10 PM, Bin Cheng <bin.ch...@arm.com> wrote:
>>> Hi,
>>> This patch adds support for constraint flags in loop structure.  Different 
>>> to existing boolean flags which are set by niter analyzer, constraint flag 
>>> is mainly set by consumers and affects certain semantics of niter analyzer 
>>> APIs.  Currently niter APIs affected are number_of_iterations_exit* and 
>>> their callers.  Constraint flags are added to support handling of possible 
>>> infinite loops in GCC.  One typical usecase of constraint is in vectorizer, 
>>> as described in patch's comment:
>>>
>>>   /* ...
>>>        1) Compute niter->assumptions by calling niter analyzer API and
>>>           record it as possible condition for loop versioning.
>>>        2) Clear buffered result of niter/scev analyzer.
>>>        3) Set constraint LOOP_C_FINITE assuming the loop is finite.
>>>        4) Analyze data references.  Since data reference analysis depends
>>>           on niter/scev analyzer, the point is that niter/scev analysis
>>>           is done under circumstance of LOOP_C_FINITE constraint.
>>>        5) Version the loop with assumptions computed in step 1).
>>>        6) Vectorize the versioned loop in which assumptions is guarded to
>>>           be true.
>>>        7) Update constraints in versioned loops so that niter analyzer
>>>           in following passes can use it.
>>>
>>>      Note consumers are usually the loop optimizers and it is consumers'
>>>      responsibility to set/clear constraints correctly.  Failing to do
>>>      that might result in hard to track bugs in niter/scev analyzer.  */
>>>
>>> Next patch will use constraint to vectorize possible infinite loop by 
>>> versioning, I would also expect possible infinite loops (loops with 
>>> assumptions) can be handled by more optimizers.  This patch itself doesn't 
>>> change GCC behavior, bootstrap and test on x86_64.  Any comments?
>>
>> +     Note consumers are usually the loop optimizers and it is consumers'
>> +     responsibility to set/clear constraints correctly.  Failing to do
>> +     that might result in hard to track bugs in niter/scev analyzer.  */
>>
>> "in hard to track down bugs in niter/scev consumers"
>>
>> +static inline void
>> +loop_constraint_clr (struct loop *loop, unsigned c)
>> +{
>>
>> use _clear (similar to loops_state_clear).  Function comments missing.
>>
>> I think we want to copy constraints in copy_loop_info.
>>
>> Please place the 'constraints' field in struct loop somewhere better,
>> between two pointers we have 4 bytes wasted on a 64bit arch.
>> Maybe you can group all bools and put constraints next to safelen
>> (yeah, we'd still waste some padding, not sure if we want to turn
>> the bools and estimate_state into a bitfield).
>>
>> It would be nice to document the constraints in doc/loop.texi.
>>
>> Ok with that changes.
> Hi,
> Attachment is the updated patch with comments addressed.

Ok.

Thanks,
Richard.

> Thanks,
> bin
>
>
> 2016-07-27  Bin Cheng  <bin.ch...@arm.com>
>
>     * cfgloop.h (struct loop): New field constraints.
>     (LOOP_C_INFINITE, LOOP_C_FINITE): New macros.
>     (loop_constraint_set, loop_constraint_clr, loop_constraint_set_p): New
>     functions.
>     * cfgloop.c (alloc_loop): Initialize new field.
>     * cfgloopmanip.c (copy_loop_info): Copy constraints.
>     * tree-ssa-loop-niter.c (number_of_iterations_exit_assumptions):
>     Adjust niter analysis wrto loop constraints.
>     * doc/loop.texi (@node Number of iterations): Add description for loop
>     constraints.

Reply via email to