diff options
author | Richard Biener <rguenther@suse.de> | 2017-06-06 12:46:41 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2017-06-06 12:46:41 +0000 |
commit | 331dc84013b27d0f13c640262248e51a5864d26d (patch) | |
tree | 365ee2a809f0ad3977898a23486965220a381600 /gcc/tree-ssa-sccvn.c | |
parent | 38827811dd5d0e07c8f31d780732d3e429aee4fa (diff) | |
download | gcc-331dc84013b27d0f13c640262248e51a5864d26d.zip gcc-331dc84013b27d0f13c640262248e51a5864d26d.tar.gz gcc-331dc84013b27d0f13c640262248e51a5864d26d.tar.bz2 |
re PR tree-optimization/80974 (wrong code (generated code hangs) at -O2 on x86_64-linux-gnu)
2017-06-06 Richard Biener <rguenther@suse.de>
PR tree-optimization/80974
* tree-ssa-sccvn.c (set_ssa_val_to): Do not change but only
keep or clear leaders SSA info.
* gcc.dg/torture/pr80974.c: New testcase.
From-SVN: r248919
Diffstat (limited to 'gcc/tree-ssa-sccvn.c')
-rw-r--r-- | gcc/tree-ssa-sccvn.c | 44 |
1 files changed, 15 insertions, 29 deletions
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index c140c35..ff5c800 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -3328,6 +3328,9 @@ set_ssa_val_to (tree from, tree to) == get_addr_base_and_unit_offset (TREE_OPERAND (to, 0), &toff)) && coff == toff)) { + if (dump_file && (dump_flags & TDF_DETAILS)) + fprintf (dump_file, " (changed)\n"); + /* If we equate two SSA names we have to make the side-band info of the leader conservative (and remember whatever original value was present). */ @@ -3342,22 +3345,6 @@ set_ssa_val_to (tree from, tree to) gimple_bb (SSA_NAME_DEF_STMT (to)))) /* Keep the info from the dominator. */ ; - else if (SSA_NAME_IS_DEFAULT_DEF (from) - || dominated_by_p_w_unex - (gimple_bb (SSA_NAME_DEF_STMT (to)), - gimple_bb (SSA_NAME_DEF_STMT (from)))) - { - /* Save old info. */ - if (! VN_INFO (to)->info.range_info) - { - VN_INFO (to)->info.range_info = SSA_NAME_RANGE_INFO (to); - VN_INFO (to)->range_info_anti_range_p - = SSA_NAME_ANTI_RANGE_P (to); - } - /* Use that from the dominator. */ - SSA_NAME_RANGE_INFO (to) = SSA_NAME_RANGE_INFO (from); - SSA_NAME_ANTI_RANGE_P (to) = SSA_NAME_ANTI_RANGE_P (from); - } else { /* Save old info. */ @@ -3369,6 +3356,12 @@ set_ssa_val_to (tree from, tree to) } /* Rather than allocating memory and unioning the info just clear it. */ + if (dump_file && (dump_flags & TDF_DETAILS)) + { + fprintf (dump_file, "clearing range info of "); + print_generic_expr (dump_file, to); + fprintf (dump_file, "\n"); + } SSA_NAME_RANGE_INFO (to) = NULL; } } @@ -3381,17 +3374,6 @@ set_ssa_val_to (tree from, tree to) gimple_bb (SSA_NAME_DEF_STMT (to)))) /* Keep the info from the dominator. */ ; - else if (SSA_NAME_IS_DEFAULT_DEF (from) - || dominated_by_p_w_unex - (gimple_bb (SSA_NAME_DEF_STMT (to)), - gimple_bb (SSA_NAME_DEF_STMT (from)))) - { - /* Save old info. */ - if (! VN_INFO (to)->info.ptr_info) - VN_INFO (to)->info.ptr_info = SSA_NAME_PTR_INFO (to); - /* Use that from the dominator. */ - SSA_NAME_PTR_INFO (to) = SSA_NAME_PTR_INFO (from); - } else if (! SSA_NAME_PTR_INFO (from) /* Handle the case of trivially equivalent info. */ || memcmp (SSA_NAME_PTR_INFO (to), @@ -3403,14 +3385,18 @@ set_ssa_val_to (tree from, tree to) VN_INFO (to)->info.ptr_info = SSA_NAME_PTR_INFO (to); /* Rather than allocating memory and unioning the info just clear it. */ + if (dump_file && (dump_flags & TDF_DETAILS)) + { + fprintf (dump_file, "clearing points-to info of "); + print_generic_expr (dump_file, to); + fprintf (dump_file, "\n"); + } SSA_NAME_PTR_INFO (to) = NULL; } } } VN_INFO (from)->valnum = to; - if (dump_file && (dump_flags & TDF_DETAILS)) - fprintf (dump_file, " (changed)\n"); return true; } if (dump_file && (dump_flags & TDF_DETAILS)) |