diff options
author | Jan Hubicka <jh@suse.cz> | 2013-12-14 23:08:48 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2013-12-14 22:08:48 +0000 |
commit | eb6bcfb017d409db793b8fa6fde93f85f8ec75cc (patch) | |
tree | 7b31311713785c0380254b91af5cc99bda4c041d /gcc | |
parent | 0a73546d3c46876969276e1730907e6faec7428d (diff) | |
download | gcc-eb6bcfb017d409db793b8fa6fde93f85f8ec75cc.zip gcc-eb6bcfb017d409db793b8fa6fde93f85f8ec75cc.tar.gz gcc-eb6bcfb017d409db793b8fa6fde93f85f8ec75cc.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/ipa-prop.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ipa/devirt-19.C | 32 |
4 files changed, 44 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ab586ff..93e857df 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,11 @@ 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> diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c index 94266c0..650e600 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 d9106ea..ccb7829 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +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 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 0000000..13686e3 --- /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 <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" } } */ + |