+2015-02-10 Richard Biener <rguenther@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.
+
2015-02-10 Richard Biener <rguenther@suse.de>
PR tree-optimization/64909
+2015-02-10 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/64995
+ * g++.dg/torture/pr64995.C: New testcase.
+
2015-02-10 Richard Biener <rguenther@suse.de>
PR tree-optimization/64909
--- /dev/null
+// { 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();
+}
va_heap> operands,
tree value)
{
- struct vn_reference_s vr1;
+ vn_reference_s vr1;
vn_reference_t result;
unsigned value_id;
vr1.vuse = vuse;
}
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)
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.
{
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);
}
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
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