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

Reply via email to