diff options
author | Richard Guenther <rguenther@suse.de> | 2008-08-29 11:40:47 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2008-08-29 11:40:47 +0000 |
commit | 443aa7d5764a1786880bf6d10f522f5e3cfe2795 (patch) | |
tree | dc8788bf2f2b7a8da7c763095a173b0fd86a9e23 /gcc/tree-ssa-operands.c | |
parent | fcbe056b117ca90358096b0dc75b0072a5722580 (diff) | |
download | gcc-443aa7d5764a1786880bf6d10f522f5e3cfe2795.zip gcc-443aa7d5764a1786880bf6d10f522f5e3cfe2795.tar.gz gcc-443aa7d5764a1786880bf6d10f522f5e3cfe2795.tar.bz2 |
re PR middle-end/37236 (ICE: in mark_operand_necessary, at tree-ssa-dce.c:242)
2008-08-29 Richard Guenther <rguenther@suse.de>
PR middle-end/37236
* tree-ssa-structalias.c (intra_create_variable_infos): Mark
PARAM_NOALIAS tags with is_heapvar.
* tree-ssa-operands.c (access_can_touch_variable): Offset
based tests do not apply for heapvars. Fix offset test.
* gfortran.fortran-torture/compile/pr37236.f: New testcase.
From-SVN: r139763
Diffstat (limited to 'gcc/tree-ssa-operands.c')
-rw-r--r-- | gcc/tree-ssa-operands.c | 43 |
1 files changed, 22 insertions, 21 deletions
diff --git a/gcc/tree-ssa-operands.c b/gcc/tree-ssa-operands.c index 8c94baa..801d2de 100644 --- a/gcc/tree-ssa-operands.c +++ b/gcc/tree-ssa-operands.c @@ -1247,26 +1247,26 @@ access_can_touch_variable (tree ref, tree alias, HOST_WIDE_INT offset, D.874_2 = (*my_char_ref_1)[1]{lb: 1 sz: 1}; */ 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) - && (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 - /* When the struct has may_alias attached to it, we need not to - return true. */ - && get_alias_set (base)) + && flag_strict_aliasing + && TREE_CODE (ref) != INDIRECT_REF + && !MTAG_P (alias) + && 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 + /* 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 "); @@ -1285,11 +1285,12 @@ access_can_touch_variable (tree ref, tree alias, HOST_WIDE_INT offset, && flag_strict_aliasing && TREE_CODE (ref) != INDIRECT_REF && !MTAG_P (alias) + && !var_ann (alias)->is_heapvar && !POINTER_TYPE_P (TREE_TYPE (alias)) && offsetgtz && DECL_SIZE (alias) && TREE_CODE (DECL_SIZE (alias)) == INTEGER_CST - && uoffset > TREE_INT_CST_LOW (DECL_SIZE (alias))) + && uoffset >= TREE_INT_CST_LOW (DECL_SIZE (alias))) { #ifdef ACCESS_DEBUGGING fprintf (stderr, "Access to "); |