aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2017-02-28 15:32:24 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2017-02-28 15:32:24 +0000
commit41aa3a38572bd643ae958fb23a9fad87cdddd9bb (patch)
treedbbfdd34b9627de77f02682c0884df4ffbfa6a56
parent587240d2494dae65fd67d5bd642a6123ecc89738 (diff)
downloadgcc-41aa3a38572bd643ae958fb23a9fad87cdddd9bb.zip
gcc-41aa3a38572bd643ae958fb23a9fad87cdddd9bb.tar.gz
gcc-41aa3a38572bd643ae958fb23a9fad87cdddd9bb.tar.bz2
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 <rguenther@suse.de> 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
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr79740.c19
-rw-r--r--gcc/tree-ssa-pre.c10
-rw-r--r--gcc/tree-ssa-sccvn.c21
5 files changed, 59 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b65f820..17acce5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,14 @@
2017-02-28 Richard Biener <rguenther@suse.de>
+ 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 <rguenther@suse.de>
+
PR middle-end/79731
* fold-const.c (decode_field_reference): Reject out-of-bound
accesses.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 82933d3..a09eb28 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2017-02-28 Richard Biener <rguenther@suse.de>
+ PR tree-optimization/79740
+ * gcc.dg/torture/pr79740.c: New testcase.
+
+2017-02-28 Richard Biener <rguenther@suse.de>
+
PR middle-end/79731
* c-c++-common/torture/pr79731.c: New testcase.
diff --git a/gcc/testsuite/gcc.dg/torture/pr79740.c b/gcc/testsuite/gcc.dg/torture/pr79740.c
new file mode 100644
index 0000000..25b8de5
--- /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 a1d7677..bdf48ad7 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 <gassign *> (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 4f5e852..e7502de 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;
+ }
}
}
}