From 331dc84013b27d0f13c640262248e51a5864d26d Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 6 Jun 2017 12:46:41 +0000 Subject: [PATCH] re PR tree-optimization/80974 (wrong code (generated code hangs) at -O2 on x86_64-linux-gnu) 2017-06-06 Richard Biener 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 --- gcc/ChangeLog | 6 ++++ gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gcc.dg/torture/pr80974.c | 39 +++++++++++++++++++++++ gcc/tree-ssa-sccvn.c | 44 +++++++++----------------- 4 files changed, 65 insertions(+), 29 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr80974.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 245ec28096c..38d552433c3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2017-06-06 Richard Biener + + PR tree-optimization/80974 + * tree-ssa-sccvn.c (set_ssa_val_to): Do not change but only + keep or clear leaders SSA info. + 2017-06-06 Tom de Vries * config/nvptx/nvptx.c (split_mode_p): New function. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8aed9bc4ff2..a23dc7a184a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-06-06 Richard Biener + + PR tree-optimization/80974 + * gcc.dg/torture/pr80974.c: New testcase. + 2017-06-06 Thomas Preud'homme * gcc.dg/utf16-4.c: Accept "long unsigned int" as well as diff --git a/gcc/testsuite/gcc.dg/torture/pr80974.c b/gcc/testsuite/gcc.dg/torture/pr80974.c new file mode 100644 index 00000000000..4918607ba1f --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr80974.c @@ -0,0 +1,39 @@ +/* { dg-do run } */ + +int a, b, c, d, e, f, g[4]; + +static int fn1 () +{ + int h, i; + if (b) + goto L1; +L2:; + int m = a; + while (1) + { + int n = 2; + e = !f && (n = 5); + if (e) + for (h = 0; h < 9; h++) + for (i = 0; i < 6; i++) + if (a) + g[h] = 4; + if (d) + goto L2; + a & n || b; +L1: + if (a) + L3: + c = m; + if (a) + goto L3; + if (b < 5) + return 0; + } +} + +int main () +{ + fn1 (); + return 0; +} diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index c140c358fc3..ff5c800662b 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)) -- 2.30.2