re PR middle-end/33330 (Wrong alias for accessing scalar through array)

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
This commit is contained in:
Richard Guenther 2007-09-07 11:57:57 +00:00 committed by Richard Biener
parent 201b2eadc4
commit ccf64c833f
2 changed files with 23 additions and 0 deletions

View 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

View 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