From eb6bcfb017d409db793b8fa6fde93f85f8ec75cc Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Sat, 14 Dec 2013 23:08:48 +0100 Subject: [PATCH] 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 --- gcc/ChangeLog | 5 +++++ gcc/ipa-prop.c | 2 ++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/ipa/devirt-19.C | 32 ++++++++++++++++++++++++++++ 4 files changed, 44 insertions(+) create mode 100644 gcc/testsuite/g++.dg/ipa/devirt-19.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ab586ff6483f..93e857df8dc1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2013-12-14 Jan Hubicka + + PR middle-end/58477 + * ipa-prop.c (stmt_may_be_vtbl_ptr_store): Skip clobbers. + 2013-12-14 Jan Hubicka PR middle-end/58477 diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c index 94266c0ec3e1..650e6002b870 100644 --- a/gcc/ipa-prop.c +++ b/gcc/ipa-prop.c @@ -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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d9106ea4212c..ccb78290915c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-12-14 Jan Hubicka + + PR middle-end/58477 + * g++.dg/ipa/devirt-19.C: New testcase. + 2013-12-14 Marek Polacek * c-c++-common/ubsan/overflow-negate-1.c: Add more testing. Don't diff --git a/gcc/testsuite/g++.dg/ipa/devirt-19.C b/gcc/testsuite/g++.dg/ipa/devirt-19.C new file mode 100644 index 000000000000..13686e3e0257 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/devirt-19.C @@ -0,0 +1,32 @@ +/* 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 class C { +public: + T Key; + const M &m_fn2(const T &); + virtual void m_fn1() {} + B _map; +}; + +C b; +template const M &C::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" } } */ + -- 2.47.3