summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2015-02-10 13:37:54 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2015-02-10 13:37:54 +0000
commit9251bb6fe90954f1e7d00ace92b44837fe0b97b3 (patch)
treec92bf0ac60a485f33803b2ee862e103fe4440a76
parent41ae9eb422c96f38b1334621fe3767b877e7e747 (diff)
downloadgcc-9251bb6fe90954f1e7d00ace92b44837fe0b97b3.tar.gz
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. * g++.dg/torture/pr64995.C: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@220581 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/torture/pr64995.C28
-rw-r--r--gcc/tree-ssa-sccvn.c14
4 files changed, 49 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7f3816c3e70..788571c0715 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,13 @@
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
* tree-vect-loop.c (vect_estimate_min_profitable_iters): Properly
pass a scalar-stmt count estimate to the cost model.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 15d5e2d67cd..d1d8692a723 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
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
* gcc.dg/vect/costmodel/x86_64/costmodel-pr64909.c: New testcase.
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