Hi,
this patch ICE where the profile in cgraph mismatch profile in BB. This is 
becuase
of expansion of speculative devirtualization where we get some roundoff issues.

Bootstrapped/regtested x86_64-linux, comitted.
Honza

        PR ipa/83619
        * g++.dg/torture/pr83619.C: New testcase.
        * cgraph.c (cgraph_edge::redirect_call_stmt_to_callee): Update edge
        frequencies.
Index: cgraph.c
===================================================================
--- cgraph.c    (revision 256847)
+++ cgraph.c    (working copy)
@@ -1327,6 +1327,7 @@ cgraph_edge::redirect_call_stmt_to_calle
          e->speculative = false;
          e->caller->set_call_stmt_including_clones (e->call_stmt, new_stmt,
                                                     false);
+         e->count = gimple_bb (e->call_stmt)->count;
 
          /* Fix edges for BUILT_IN_CHKP_BNDRET calls attached to the
             processed call stmt.  */
@@ -1346,6 +1347,7 @@ cgraph_edge::redirect_call_stmt_to_calle
            }
 
          e2->speculative = false;
+         e2->count = gimple_bb (e2->call_stmt)->count;
          ref->speculative = false;
          ref->stmt = NULL;
          /* Indirect edges are not both in the call site hash.
Index: testsuite/g++.dg/torture/pr83619.C
===================================================================
--- testsuite/g++.dg/torture/pr83619.C  (revision 0)
+++ testsuite/g++.dg/torture/pr83619.C  (working copy)
@@ -0,0 +1,67 @@
+// { dg-do compile }
+int a;
+class d
+{
+public:
+  virtual unsigned c ();
+};
+class e;
+class i
+{
+  void h ();
+
+public:
+  void
+  operator= (e *f)
+  {
+    j<int>::c (f);
+    h ();
+  }
+  template <class> struct j
+  {
+    static void
+    c (e *g)
+    {
+      g->c ();
+    }
+  };
+};
+class k;
+class l
+{
+public:
+  l (int);
+  k *operator-> ();
+};
+class e : public d
+{
+};
+class m final : e
+{
+  unsigned c ();
+};
+class k
+{
+public:
+  virtual int o (e *) = 0;
+};
+class H : d, k
+{
+  int o (e *);
+  i n;
+};
+unsigned
+m::c ()
+{
+  l b = 0;
+  b->o (this);
+  return a;
+}
+int
+H::o (e *p)
+{
+  n = p;
+  return a;
+}
+
+

Reply via email to