Re: [RFC] more no-wrap conditions for IV analyzing and scev

2021-07-28 Thread Richard Biener
On Fri, 23 Jul 2021, guojiufu wrote:

> On 2021-06-21 20:36, Richard Biener wrote:
> > On Mon, 21 Jun 2021, guojiufu wrote:
> > 
> >> On 2021-06-21 14:19, guojiufu via Gcc-patches wrote:
> >> > On 2021-06-09 19:18, guojiufu wrote:
> >> >> On 2021-06-09 17:42, guojiufu via Gcc-patches wrote:
> >> >>> On 2021-06-08 18:13, Richard Biener wrote:
> >>  On Fri, 4 Jun 2021, Jiufu Guo wrote:
> >> 
> >> >>> cut...
> >> > cut...
> >> >>
> >> 
> >> Besides the method in the previous mails, 
> >> I’m thinking of another way to split loops:
> >> 
> >> foo (int *a, int *b, unsigned k, unsigned n)
> >> {   
> >>  while (++k != n)
> >>    a[k] = b[k] + 1;   
> >> } 
> >> 
> >> We may split it into:
> >> if (k >> {
> >>   while (++k < n)  //loop1
> >>    a[k] = b[k] + 1;   
> >> }
> >> else
> >> {
> >>  while (++k != n) //loop2
> >>    a[k] = b[k] + 1;  
> >> }
> >> 
> >> In most cases, loop1 would be hit, the overhead of this method is only
> >> checking “if (k >> which would be smaller than the previous method.
> > 
> > That would be your original approach of versioning the loop.  I think
> > I suggested that for this scalar evolution and dataref analysis should
> > be enhanced to build up conditions under which IV evolutions are
> > affine (non-wrapping) and the versioning code in actual transforms
> > should then do the appropriate versioning (like the vectorizer already
> > does for niter analysis ->assumptions for example).
> 
> Hi Richi,
> 
> Thanks for your suggestion!
> 
> The original idea was trying to cover cases like multi-exit loops, while it
> seems not benefited too much.  The method you said would help for common
> cases.
> 
> I'm thinking of the methods to implement this:
> During scev analyzing, add more possible wrap checking (especially for
> unsigned)
> for convert_affine_scev/scev_probably_wraps_p/chrec_convert_1;  introducing
> no_wrap_assumption for the conditions of no-wrapping on given chrec/iv.
> And using this assumption in simple_iv_with_niters/dr_analyze_innermost.
> 
> One question is, where is the best place to add this assumption?
> Is it a flexible idea to add no_wrap_assumption to affine_iv/loop, and
> set the assumption when scev checks wrap?

I'm not sure what you exactly mean here.  I was thinking of
making analyze_scalar_evolution return more than a plain
tree, for example by providing an alternate (optional) output,
for example a pointer to some new scev_info that could initially
be just

struct scev_info {
  tree assumptions;
};

when analyze_scalar_evolution recurses there are certain points
it can end up returning chrec_dont_know.  If we passed in the
alternate output there might be the possibility to add
to the assumption to make the result well-defined (and yes,
this extends to chrec_fold_* routines, mostly chrec_convert
I think).  Handled cases could be added piecewise, just passing
down the scev_info pointer will be intrusive initially.

For simple_iv there's already a struct we could add 'assumptions'
to (and maybe a flag to the API whether assumptions are allowed).

For DR analysis the same could be done.

Richard.

> Thanks for your suggestions!
> 
> BR.
> Jiufu
> 
> 
> > 
> > Richard.
> > 
> cut
> 
> 

-- 
Richard Biener 
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)


Re: [RFC] more no-wrap conditions for IV analyzing and scev

2021-07-22 Thread guojiufu via Gcc-patches

On 2021-06-21 20:36, Richard Biener wrote:

On Mon, 21 Jun 2021, guojiufu wrote:


On 2021-06-21 14:19, guojiufu via Gcc-patches wrote:
> On 2021-06-09 19:18, guojiufu wrote:
>> On 2021-06-09 17:42, guojiufu via Gcc-patches wrote:
>>> On 2021-06-08 18:13, Richard Biener wrote:
 On Fri, 4 Jun 2021, Jiufu Guo wrote:

>>> cut...
> cut...
>>

Besides the method in the previous mails, 
I’m thinking of another way to split loops:

foo (int *a, int *b, unsigned k, unsigned n)
{   
 while (++k != n)
   a[k] = b[k] + 1;   
} 

We may split it into:
if (k

That would be your original approach of versioning the loop.  I think
I suggested that for this scalar evolution and dataref analysis should
be enhanced to build up conditions under which IV evolutions are
affine (non-wrapping) and the versioning code in actual transforms
should then do the appropriate versioning (like the vectorizer already
does for niter analysis ->assumptions for example).


Hi Richi,

Thanks for your suggestion!

The original idea was trying to cover cases like multi-exit loops, while 
it
seems not benefited too much.  The method you said would help for common 
cases.


I'm thinking of the methods to implement this:
During scev analyzing, add more possible wrap checking (especially for 
unsigned)
for convert_affine_scev/scev_probably_wraps_p/chrec_convert_1;  
introducing

no_wrap_assumption for the conditions of no-wrapping on given chrec/iv.
And using this assumption in simple_iv_with_niters/dr_analyze_innermost.

One question is, where is the best place to add this assumption?
Is it a flexible idea to add no_wrap_assumption to affine_iv/loop, and
set the assumption when scev checks wrap?

Thanks for your suggestions!

BR.
Jiufu




Richard.


cut