Commit eb6bcfb0 by Jan Hubicka Committed by Jan Hubicka

re PR c++/58477 (ice in cgraph_speculative_call_info)

	PR middle-end/58477
	* ipa-prop.c (stmt_may_be_vtbl_ptr_store): Skip clobbers.
	* g++.dg/ipa/devirt-19.C: New testcase.

From-SVN: r205993
parent 0a73546d
2013-12-14 Jan Hubicka <jh@suse.cz>
PR middle-end/58477
* ipa-prop.c (stmt_may_be_vtbl_ptr_store): Skip clobbers.
2013-12-14 Jan Hubicka <jh@suse.cz>
PR middle-end/58477
* cgraphclones.c (cgraph_clone_edge): Do not resolve speculative edges.
2013-12-14 H.J. Lu <hongjiu.lu@intel.com>
......@@ -560,6 +560,8 @@ stmt_may_be_vtbl_ptr_store (gimple stmt)
{
if (is_gimple_call (stmt))
return false;
else if (gimple_clobber_p (stmt))
return false;
else if (is_gimple_assign (stmt))
{
tree lhs = gimple_assign_lhs (stmt);
......
2013-12-14 Jan Hubicka <jh@suse.cz>
PR middle-end/58477
* g++.dg/ipa/devirt-19.C: New testcase.
2013-12-14 Marek Polacek <polacek@redhat.com>
* c-c++-common/ubsan/overflow-negate-1.c: Add more testing. Don't
......
/* We should specialize for &b and devirtualize the call.
Previously we were failing by considering CLOBBER statement to be
a type change. */
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-ipa-cp" } */
struct A {
void operator==(const A &);
};
class B {
public:
A m_fn1();
A m_fn2();
};
template <typename T, typename M> class C {
public:
T Key;
const M &m_fn2(const T &);
virtual void m_fn1() {}
B _map;
};
C<int, int> b;
template <typename T, typename M> const M &C<T, M>::m_fn2(const T &) {
A a = _map.m_fn2();
a == _map.m_fn1();
m_fn1();
}
void fn1() { b.m_fn2(0); }
/* { dg-final { scan-ipa-dump-times "Discovered a virtual call to a known target" 1 "cp" } } */
/* { dg-final { cleanup-ipa-dump "cp" } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment