]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/58477 (ice in cgraph_speculative_call_info)
authorJan Hubicka <jh@suse.cz>
Sat, 14 Dec 2013 22:08:48 +0000 (23:08 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Sat, 14 Dec 2013 22:08:48 +0000 (22:08 +0000)
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
gcc/ipa-prop.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ipa/devirt-19.C [new file with mode: 0644]

index ab586ff6483f4b7cf012e81b135a42cb7171e299..93e857df8dc124d387a51278b158762491404fc3 100644 (file)
@@ -1,3 +1,8 @@
+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
index 94266c0ec3e185fc919f80b44396390299fb2e19..650e6002b8706b38e435ffdbfa0e1d2fdd4f268f 100644 (file)
@@ -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);
index d9106ea4212cf1e0d3c56db77a3c1bbf8b185bf3..ccb78290915c805e79dcd9216b55f2493c88f0b7 100644 (file)
@@ -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 (file)
index 0000000..13686e3
--- /dev/null
@@ -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" } } */
+