[bootstrap-O3,fortran] silence warning in simplify_transformation_to_array
authorAlexandre Oliva <aoliva@redhat.com>
Fri, 6 Jan 2017 03:34:37 +0000 (03:34 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Fri, 6 Jan 2017 03:34:37 +0000 (03:34 +0000)
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.

for  gcc/fortran/ChangeLog

* simplify.c (simplify_transformation_to_array): Silence
array bounds warning.  Fix whitespace.

From-SVN: r244122

gcc/fortran/ChangeLog
gcc/fortran/simplify.c

index 95c5279e48c857b20e6daa108cfc28d35766865f..d1892de8bb1f502d1b3da38f5305d3f815d05ada 100644 (file)
@@ -1,3 +1,8 @@
+2017-01-06  Alexandre Oliva <aoliva@redhat.com>
+
+       * simplify.c (simplify_transformation_to_array): Silence
+       array bounds warning.  Fix whitespace.
+
 2017-01-04  Alexandre Oliva <aoliva@redhat.com>
 
        * module.c (load_omp_udrs): Initialize name.
index a5a50de5cabca9ba2d3b53c7a63f045e589ae791..c5e7b671691da81d404d7857e0b3cf630f213084 100644 (file)
@@ -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;