From 41aa3a38572bd643ae958fb23a9fad87cdddd9bb Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 28 Feb 2017 15:32:24 +0000 Subject: [PATCH] re PR tree-optimization/79740 (ICE on -Os and above in both 32-bit and 64-bit modes on x86_64-linux-gnu (internal compiler error: in VN_INFO_GET, at tree-ssa-sccvn.c:407 })) 2017-02-28 Richard Biener PR tree-optimization/79740 * tree-ssa-sccvn.c (vn_nary_op_insert_into): Allow redundant inserts. (visit_nary_op): Insert the nary into the hashtable if we pattern-matched sth. * tree-ssa-pre.c (eliminate_insert): Robustify. * gcc.dg/torture/pr79740.c: New testcase. From-SVN: r245780 --- gcc/ChangeLog | 9 +++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr79740.c | 19 +++++++++++++++++++ gcc/tree-ssa-pre.c | 10 +++++++--- gcc/tree-ssa-sccvn.c | 21 +++++++++++++++++++-- 5 files changed, 59 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr79740.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b65f820950f..17acce53557 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2017-02-28 Richard Biener + + PR tree-optimization/79740 + * tree-ssa-sccvn.c (vn_nary_op_insert_into): Allow redundant + inserts. + (visit_nary_op): Insert the nary into the hashtable if we + pattern-matched sth. + * tree-ssa-pre.c (eliminate_insert): Robustify. + 2017-02-28 Richard Biener PR middle-end/79731 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 82933d379f0..a09eb286c97 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-02-28 Richard Biener + + PR tree-optimization/79740 + * gcc.dg/torture/pr79740.c: New testcase. + 2017-02-28 Richard Biener PR middle-end/79731 diff --git a/gcc/testsuite/gcc.dg/torture/pr79740.c b/gcc/testsuite/gcc.dg/torture/pr79740.c new file mode 100644 index 00000000000..25b8de53561 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr79740.c @@ -0,0 +1,19 @@ +/* { dg-do compile } */ + +int a; +short b; +short fn1(unsigned short p1) { return p1 << a; } + +int main() +{ + short c; + int d = 4; + for (; b;) + { + c = d + 1; + fn1(c); + d = 0; + } + d++; + return 0; +} diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index a1d76774fae..bdf48ad7d8a 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -4099,8 +4099,12 @@ eliminate_push_avail (tree op) static tree eliminate_insert (gimple_stmt_iterator *gsi, tree val) { - gimple *stmt = gimple_seq_first_stmt (VN_INFO (val)->expr); - if (!is_gimple_assign (stmt) + /* We can insert a sequence with a single assignment only. */ + gimple_seq stmts = VN_INFO (val)->expr; + if (!gimple_seq_singleton_p (stmts)) + return NULL_TREE; + gassign *stmt = dyn_cast (gimple_seq_first_stmt (stmts)); + if (!stmt || (!CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (stmt)) && gimple_assign_rhs_code (stmt) != VIEW_CONVERT_EXPR && gimple_assign_rhs_code (stmt) != BIT_FIELD_REF @@ -4116,8 +4120,8 @@ eliminate_insert (gimple_stmt_iterator *gsi, tree val) if (!leader) return NULL_TREE; - gimple_seq stmts = NULL; tree res; + stmts = NULL; if (gimple_assign_rhs_code (stmt) == BIT_FIELD_REF) res = gimple_build (&stmts, BIT_FIELD_REF, TREE_TYPE (val), leader, diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index 4f5e85243bd..e7502de790d 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -2820,6 +2820,15 @@ vn_nary_op_insert_into (vn_nary_op_t vno, vn_nary_op_table_type *table, vno->hashcode = vn_nary_op_compute_hash (vno); slot = table->find_slot_with_hash (vno, vno->hashcode, INSERT); + /* While we do not want to insert things twice it's awkward to + avoid it in the case where visit_nary_op pattern-matches stuff + and ends up simplifying the replacement to itself. We then + get two inserts, one from visit_nary_op and one from + vn_nary_build_or_lookup. + So allow inserts with the same value number. */ + if (*slot && (*slot)->result == vno->result) + return *slot; + gcc_assert (!*slot); *slot = vno; @@ -3544,7 +3553,11 @@ visit_nary_op (tree lhs, gassign *stmt) result = vn_nary_build_or_lookup (NOP_EXPR, type, ops); if (result) - return set_ssa_val_to (lhs, result); + { + bool changed = set_ssa_val_to (lhs, result); + vn_nary_op_insert_stmt (stmt, result); + return changed; + } } else { @@ -3555,7 +3568,11 @@ visit_nary_op (tree lhs, gassign *stmt) TREE_TYPE (lhs), ops); if (result) - return set_ssa_val_to (lhs, result); + { + bool changed = set_ssa_val_to (lhs, result); + vn_nary_op_insert_stmt (stmt, result); + return changed; + } } } } -- 2.30.2