From: Richard Biener Date: Tue, 10 Feb 2015 13:37:54 +0000 (+0000) Subject: re PR tree-optimization/64995 (ICE in vn_reference_insert_pieces, at tree-ssa-sccvn... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=703c9ccdc69438c8d1931c777116ce76d22415de;p=gcc.git re PR tree-optimization/64995 (ICE in vn_reference_insert_pieces, at tree-ssa-sccvn.c:2341) 2015-02-10 Richard Biener PR tree-optimization/64995 * tree-ssa-sccvn.c (set_ssa_val_to): Assert that the value we use is final. (visit_reference_op_store): Always valueize op. (visit_use): Properly valueize vuses. * g++.dg/torture/pr64995.C: New testcase. From-SVN: r220581 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7f3816c3e70..788571c0715 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2015-02-10 Richard Biener + + PR tree-optimization/64995 + * tree-ssa-sccvn.c (set_ssa_val_to): Assert that the + value we use is final. + (visit_reference_op_store): Always valueize op. + (visit_use): Properly valueize vuses. + 2015-02-10 Richard Biener PR tree-optimization/64909 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 15d5e2d67cd..d1d8692a723 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-02-10 Richard Biener + + PR tree-optimization/64995 + * g++.dg/torture/pr64995.C: New testcase. + 2015-02-10 Richard Biener PR tree-optimization/64909 diff --git a/gcc/testsuite/g++.dg/torture/pr64995.C b/gcc/testsuite/g++.dg/torture/pr64995.C new file mode 100644 index 00000000000..f5b97cf371b --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr64995.C @@ -0,0 +1,28 @@ +// { dg-do compile } + +extern "C" double acos(double); +class A { +public: + double mY, mZ; + A(double, double); + double m_fn1(A *); + int *m_fn2(); +}; +double a; +A *b; +A::A(double, double) : mY(), mZ() {} + +double A::m_fn1(A *) { return mY * mZ; } + +inline int *A::m_fn2() { + mZ = 0; + double c = m_fn1(this); + a = acos(c); + double d = m_fn1(b); + acos(d); +} + +void passTime() { + A e(0, 1); + e.m_fn2(); +} diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index 0f1299affb8..e417a1536ef 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -1606,7 +1606,7 @@ vn_reference_lookup_or_insert_for_pieces (tree vuse, va_heap> operands, tree value) { - struct vn_reference_s vr1; + vn_reference_s vr1; vn_reference_t result; unsigned value_id; vr1.vuse = vuse; @@ -2816,7 +2816,8 @@ set_ssa_val_to (tree from, tree to) } gcc_assert (to != NULL_TREE - && (TREE_CODE (to) == SSA_NAME + && ((TREE_CODE (to) == SSA_NAME + && (to == from || SSA_VAL (to) == to)) || is_gimple_min_invariant (to))); if (from != to) @@ -3122,6 +3123,9 @@ visit_reference_op_store (tree lhs, tree op, gimple stmt) tree vuse = gimple_vuse (stmt); tree vdef = gimple_vdef (stmt); + if (TREE_CODE (op) == SSA_NAME) + op = SSA_VAL (op); + /* First we want to lookup using the *vuses* from the store and see if there the last store to this location with the same address had the same value. @@ -3144,8 +3148,6 @@ visit_reference_op_store (tree lhs, tree op, gimple stmt) { if (TREE_CODE (result) == SSA_NAME) result = SSA_VAL (result); - if (TREE_CODE (op) == SSA_NAME) - op = SSA_VAL (op); resultsame = expressions_equal_p (result, op); } @@ -3722,7 +3724,7 @@ visit_use (tree use) changed = set_ssa_val_to (lhs, simplified); if (gimple_vdef (stmt)) changed |= set_ssa_val_to (gimple_vdef (stmt), - gimple_vuse (stmt)); + SSA_VAL (gimple_vuse (stmt))); goto done; } else if (simplified @@ -3731,7 +3733,7 @@ visit_use (tree use) changed = visit_copy (lhs, simplified); if (gimple_vdef (stmt)) changed |= set_ssa_val_to (gimple_vdef (stmt), - gimple_vuse (stmt)); + SSA_VAL (gimple_vuse (stmt))); goto done; } else