On Thu, Jan 5, 2017 at 5:06 AM, Alexandre Oliva <aol...@redhat.com> wrote: > On Jan 4, 2017, Alexandre Oliva <aol...@redhat.com> wrote: > >> I'll prepare and post a patch anyway, but do we want to make it >> standard practice? > > Here it is. > > simplify_transformation_to_array had the nested loop unrolled 7 times, > which is reasonable given that it iterates over arrays of size > GFC_MAX_DIMENSIONS == 7. > > The problem is that the last iteration increments the index, tests > that it's less than result->rank, and then accesses the arrays with > the incremented index. > > We did not optimize out that part in the 7th iteration, so VRP flagged > the unreachable code as accessing arrays past the end. > > It couldn't possibly know that we'd never reach that part, since the > test was on result->rank, and it's not obvious (for the compiler) that > result->rank <= GFC_MAX_DIMENSIONS. > > Even an assert to that effect before the enclosing loop didn't avoid > the warning turned to error, though; I suppose there might be some > aliasing at play, because moving the assert into the loop does. An > assert on the index itself would also work, even more efficiently, but > we're just silencing the warning instead. > > Regstrapped on x86_64-linux-gnu and i686-linux-gnu. Ok to install?
Reasonable -- I'll leave it for others to comment on that "standard practice" part (it'll be the first case of using this IIRC). Richard. > for gcc/fortran/ChangeLog > > * simplify.c (simplify_transformation_to_array): Silence > array bounds warning. Fix whitespace. > --- > gcc/fortran/simplify.c | 11 ++++++++++- > 1 file changed, 10 insertions(+), 1 deletion(-) > > diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c > index 549d9005..db860f7 100644 > --- a/gcc/fortran/simplify.c > +++ b/gcc/fortran/simplify.c > @@ -610,9 +610,18 @@ simplify_transformation_to_array (gfc_expr *result, > gfc_expr *array, gfc_expr *d > n++; > if (n < result->rank) > { > - count [n]++; > +#pragma GCC diagnostic push > + /* If the nested loop is unrolled GFC_MAX_DIMENSIONS > + times, we'd warn for the last iteration, because the > + array index will have already been incremented to the > + array sizes, and we can't tell that this must make > + the test against result->rank false, because ranks > + must not exceed GFC_MAX_DIMENSIONS. */ > +#pragma GCC diagnostic ignored "-Warray-bounds" > + count[n]++; > base += sstride[n]; > dest += dstride[n]; > +#pragma GCC diagnostic pop > } > else > done = true; > > > -- > Alexandre Oliva, freedom fighter http://FSFLA.org/~lxoliva/ > You must be the change you wish to see in the world. -- Gandhi > Be Free! -- http://FSFLA.org/ FSF Latin America board member > Free Software Evangelist|Red Hat Brasil GNU Toolchain Engineer