+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
{
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
--- /dev/null
+/* 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" } } */
+