On Fri, 12 Oct 2012, Jan Hubicka wrote:
> > 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?
My preference is to do what was requested in some bugreport,
split the array-bounds warning into a may and a must case
(obviously giving away the possibility a function is not executed).
For always executed stmts issue the 'must' case, for not always
executed stmts issue the 'may' case. Disable the may case
for -O3 bootstrap.
The other preference is to attach to-be issued warnings to stmts
and issue them only if the stmt didn't turn out to be dead.
In general there is a conflict between warning late to expose
knowledge from optimization and not emit too many false positives.
That said, I don't worry about -O3 bootstrap warnings - simply
disable those warnings that turn out to be too noisy and have
false positives. I thought we had -Wno-error=array-bounds
for example.
Richard.