> On Thu, 11 Oct 2012, Jan Hubicka wrote:
> 
> > Hi,
> > this patch address problem I run into with strenghtened cunroll pass.  I 
> > made
> > cunroll to use loop_max_iterations bounds into an account that makes us to
> > occasionally produce out of bounds loop accesses in loop like:
> > 
> > for (i=0;i<n;i++)
> > {
> >   <something>
> >   if (test)
> >     break
> >   a[i]=1;
> > }
> > Here the constantly sized array appears in loop with multiple exits and we 
> > then
> > in the last iteration produce out of bound array (since we need to 
> > duplicate 
> > <something> and tree-ssa-vrp warns.
> > 
> > I think this is more generic problem (though appearing rarely): as soon as 
> > we
> > specialize the code, we can no longer warn about out of bounds accesses 
> > when we
> > prove array ref to be constant.  We have no idea if this code path will 
> > execute
> > in practice.
> > 
> > Seems resonable?  I think similar problems can be constructed by inlining, 
> > too.
> > Regtested/bootstrapped x86_64-linux.
> 
> No, I don't think this is reasonable.  There are other PRs for this
> as well, btw.
> 
> The array-bounds warning in VRP needs to be conditional if the
> path to it isn't always executed, too (thus a may-be warning).

Well, this is, of course, in full generality a whole program analysis that we
do not want to solve in the compiler :)

OK, I am also not very happy about this patch, but I need something for the 
cunroll
change. I wonder what are the options:
 1) leave the warning and say that -O3 bootstrap need -Wno-error.
    We do used unitialized warnings during -O3 bootstrap too, but I do not like
    this variant, since used uninitialized can be silenced by extra 
initialization,
    while this warning can not. Also these warnings are very confusing and 
bogus.
 2) make complette unrolling to only silence the warnings in the last copy of 
the
    loop only when it knows it may contain out of bound accesses
 3) make loop-niter really collect basic blocks that must be unreachable in the
    last iteration and make cunroll to take this into account and insert
    unreachable builtin on beggining of those blocks.

Obviously 3) is most complette.  I am however not sure how to add it to niter
API.  I do not think we want to record the lists of basic block into loop bound
structure since they wil be hard to update.  But then we need to someone
extern max_niter API to optionally return it when needed.

You are more familiar with that code than me, any preferences?
Honza
> 
> Richard.

Reply via email to