[Bug middle-end/33330] [4.3 Regression] Wrong alias for accessing scalar through array

rguenth at gcc dot gnu dot org gcc-bugzilla@gcc.gnu.org
Fri Sep 7 10:24:00 GMT 2007



------- Comment #3 from rguenth at gcc dot gnu dot org  2007-09-07 10:24 -------
Through this:

  else if (ref
           && flag_strict_aliasing
           && TREE_CODE (ref) != INDIRECT_REF
           && !MTAG_P (alias)
           && base
           && (TREE_CODE (base) != INDIRECT_REF
               || TREE_CODE (TREE_TYPE (base)) != UNION_TYPE)
           && !AGGREGATE_TYPE_P (TREE_TYPE (alias))
           && TREE_CODE (TREE_TYPE (alias)) != COMPLEX_TYPE
           && !var_ann (alias)->is_heapvar
           /* When the struct has may_alias attached to it, we need not to
              return true.  */
           && get_alias_set (base))
    {
#ifdef ACCESS_DEBUGGING
      fprintf (stderr, "Access to ");
      print_generic_expr (stderr, ref, 0);
      fprintf (stderr, " may not touch ");
      print_generic_expr (stderr, alias, 0);
      fprintf (stderr, " in function %s\n", get_name (current_function_decl));
#endif
      return false;
    }

(gdb) call debug_generic_expr (ref)
(*my_char_ref_1)[1]{lb: 1 sz: 1}
(gdb) call debug_generic_expr (alias)
my_char
(gdb) call debug_generic_expr (base)
*my_char_ref_1

we miss the case accessing a variable through an array type of size one.
Something like

Index: tree-ssa-operands.c
===================================================================
--- tree-ssa-operands.c (revision 128188)
+++ tree-ssa-operands.c (working copy)
@@ -1300,6 +1300,13 @@ access_can_touch_variable (tree ref, tre
           && 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
+                  && 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

fixes it.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33330



More information about the Gcc-bugs mailing list