mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-16 13:01:21 +08:00
re PR tree-optimization/64995 (ICE in vn_reference_insert_pieces, at tree-ssa-sccvn.c:2341)
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. From-SVN: r220581
This commit is contained in:
parent
696814edb8
commit
703c9ccdc6
@ -1,3 +1,11 @@
|
||||
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
|
||||
|
@ -1,3 +1,8 @@
|
||||
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
|
||||
|
28
gcc/testsuite/g++.dg/torture/pr64995.C
Normal file
28
gcc/testsuite/g++.dg/torture/pr64995.C
Normal file
@ -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();
|
||||
}
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user