]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR ipa/83619 (ICE in inliner: caller edge count does not match BB count)
authorJan Hubicka <hubicka@ucw.cz>
Thu, 18 Jan 2018 15:57:48 +0000 (16:57 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Thu, 18 Jan 2018 15:57:48 +0000 (15:57 +0000)
PR ipa/83619
* g++.dg/torture/pr83619.C: New testcase.
* cgraph.c (cgraph_edge::redirect_call_stmt_to_callee): Update edge
frequencies.

From-SVN: r256850

gcc/ChangeLog
gcc/cgraph.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr83619.C [new file with mode: 0644]

index 19116fb62444baa3d7a133fed76dc9476114d2fa..fcbd840a7076af196046117aec5ff7777e3275f7 100644 (file)
@@ -1,3 +1,9 @@
+2018-01-18  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR ipa/83619
+       * cgraph.c (cgraph_edge::redirect_call_stmt_to_callee): Update edge
+       frequencies.
+
 2018-01-18  Boris Kolpackov  <boris@codesynthesis.com>
 
         PR other/70268
index 802214dc81c4b6d389ff8b35228425b210d034a8..9a7d54d7ceedbdeaa6f7898ecb534806b3389fd7 100644 (file)
@@ -1327,6 +1327,7 @@ cgraph_edge::redirect_call_stmt_to_callee (void)
          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_callee (void)
            }
 
          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 faf17998c755b9687977a75b645788c0908f2f4f..c45345f7790beb5ddf7a0682d030e8fb5dffbc52 100644 (file)
@@ -1,3 +1,8 @@
+2018-01-18  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR ipa/83619
+       * g++.dg/torture/pr83619.C: New testcase.
+
 2018-01-18  Christophe Lyon <christophe.lyon@linaro.org>
 
        * lib/target-supports.exp (check_effective_target_arm_arch_FUNC_ok):
diff --git a/gcc/testsuite/g++.dg/torture/pr83619.C b/gcc/testsuite/g++.dg/torture/pr83619.C
new file mode 100644 (file)
index 0000000..a5ca537
--- /dev/null
@@ -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;
+}
+
+