The following fixes PR64955 where we forgot to valueize VOPs before using them as value-number.
Bootstrapped on x86_64-unknown-linux-gnu, testing in progress. Richard. 2015-10-10 Richard Biener <rguent...@suse.de> 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. Index: gcc/tree-ssa-sccvn.c =================================================================== --- gcc/tree-ssa-sccvn.c (revision 220578) +++ gcc/tree-ssa-sccvn.c (working copy) @@ -1606,7 +1606,7 @@ vn_reference_lookup_or_insert_for_pieces 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 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 { 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 Index: gcc/testsuite/g++.dg/torture/pr64995.C =================================================================== --- gcc/testsuite/g++.dg/torture/pr64995.C (revision 0) +++ gcc/testsuite/g++.dg/torture/pr64995.C (working copy) @@ -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(); +}