re PR middle-end/33330 (Wrong alias for accessing scalar through array)
authorRichard Guenther <rguenther@suse.de>
Fri, 7 Sep 2007 11:57:57 +0000 (11:57 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 7 Sep 2007 11:57:57 +0000 (11:57 +0000)
2007-09-07  Richard Guenther  <rguenther@suse.de>

PR middle-end/33330
* tree-ssa-operands.c (access_can_touch_variable): An access
of the form (*p)[0] can touch a variable of same size.

From-SVN: r128240

gcc/ChangeLog
gcc/tree-ssa-operands.c

index be49cf50e604f51cd5315c9439a02b52f41aa0a3..a63a9e9748d44e01d82bfb7b711b5599109c7f6a 100644 (file)
@@ -1,3 +1,9 @@
+2007-09-07  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/33330
+       * tree-ssa-operands.c (access_can_touch_variable): An access
+       of the form (*p)[0] can touch a variable of same size.
+
 2007-09-07  Jan Hubicka  <jh@suse.cz>
 
        * passes.c (init_optimization_passes): Add simple dce and addressable
index c18f97d4960dc02a5724d94a8d7cfbf556579e1d..a3e34ecc766b7d28ff8539edd8bef72c6af4e925 100644 (file)
@@ -1292,6 +1292,15 @@ access_can_touch_variable (tree ref, tree alias, HOST_WIDE_INT offset,
      }
      To implement this, we just punt on accesses through union
      pointers entirely.
+
+     Another case we have to allow is accessing a variable
+     through an array access at offset zero.  This happens from
+     code generated by the fortran frontend like
+
+     char[1:1] & my_char_ref;
+     char my_char;
+     my_char_ref_1 = (char[1:1] &) &my_char;
+     D.874_2 = (*my_char_ref_1)[1]{lb: 1 sz: 1};
   */
   else if (ref 
           && flag_strict_aliasing
@@ -1300,6 +1309,14 @@ access_can_touch_variable (tree ref, tree alias, HOST_WIDE_INT offset,
           && base
           && (TREE_CODE (base) != INDIRECT_REF
               || TREE_CODE (TREE_TYPE (base)) != UNION_TYPE)
+          && (TREE_CODE (base) != INDIRECT_REF
+              || TREE_CODE (ref) != ARRAY_REF
+              || offset != 0
+              || (DECL_SIZE (alias)
+                  && TREE_CODE (DECL_SIZE (alias)) == INTEGER_CST
+                  && size != -1
+                  && (unsigned HOST_WIDE_INT)size
+                     != TREE_INT_CST_LOW (DECL_SIZE (alias))))
           && !AGGREGATE_TYPE_P (TREE_TYPE (alias))
           && TREE_CODE (TREE_TYPE (alias)) != COMPLEX_TYPE
           && !var_ann (alias)->is_heapvar