aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2013-12-14 23:08:48 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2013-12-14 22:08:48 +0000
commiteb6bcfb017d409db793b8fa6fde93f85f8ec75cc (patch)
tree7b31311713785c0380254b91af5cc99bda4c041d /gcc
parent0a73546d3c46876969276e1730907e6faec7428d (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/ipa-prop.c2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/ipa/devirt-19.C32
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" } } */
+