------- 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