[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