re PR ipa/64565 (ICE: in inline_small_functions, at ipa-inline.c:1664)
authorJan Hubicka <hubicka@ucw.cz>
Tue, 13 Jan 2015 20:59:37 +0000 (21:59 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Tue, 13 Jan 2015 20:59:37 +0000 (20:59 +0000)
PR ipa/64565
* g++.dg/torture/pr64565.C: New testcase.
* ipa-inline.c (inline_small_functions): Update callee keys after
resolving speculation
(inline_small_functions): Always check monotonicity of the queue.

From-SVN: r219556

gcc/ChangeLog
gcc/ipa-inline.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr64565.C [new file with mode: 0644]

index bdc390302866aa24b1a9d8570e324f21cbc25bd6..ef6430706eb7b5e628a07382e03ad165c85a9205 100644 (file)
@@ -1,3 +1,10 @@
+2015-01-13  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR ipa/64565
+       * ipa-inline.c (inline_small_functions): Update callee keys after
+       resolving speculation
+       (inline_small_functions): Always check monotonicity of the queue.
+
 2015-01-13  Marek Polacek  <polacek@redhat.com>
 
        PR middle-end/64391
index a99001ad484da5e31395bdbd7c7f1058996c072a..61e470f303e5137e87bab7c2520cdca4ee3b0de6 100644 (file)
@@ -1626,6 +1626,8 @@ inline_small_functions (void)
          reset_edge_caches (where);
           update_caller_keys (&edge_heap, where,
                              updated_nodes, NULL);
+          update_callee_keys (&edge_heap, where,
+                             updated_nodes);
           bitmap_clear (updated_nodes);
        }
     }
@@ -1661,7 +1663,7 @@ inline_small_functions (void)
       /* Disable checking for profile because roundoff errors may cause slight
          deviations in the order.  */
       gcc_assert (max_count || cached_badness == current_badness);
-      gcc_assert (max_count || current_badness >= badness);
+      gcc_assert (current_badness >= badness);
 #else
       current_badness = edge_badness (edge, false);
 #endif
index a40d625e1e2b94d7e89e9799d8322598963300c4..a0163c3875f4f104c180f28d5f6bc052bb212c00 100644 (file)
@@ -1,3 +1,8 @@
+2015-01-13  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR ipa/64565
+       * g++.dg/torture/pr64565.C: New testcase.
+
 2015-01-13  Marek Polacek  <polacek@redhat.com>
 
        PR middle-end/64391
diff --git a/gcc/testsuite/g++.dg/torture/pr64565.C b/gcc/testsuite/g++.dg/torture/pr64565.C
new file mode 100644 (file)
index 0000000..42b0239
--- /dev/null
@@ -0,0 +1,89 @@
+/* { dg-do compile } */
+typedef enum
+{
+  NS_OK
+} nsresult;
+struct A
+{
+  static int kIID;
+};
+class B
+{
+};
+class C
+{
+public:
+  C (B p1) { m_fn1 (p1, A::kIID); }
+  void m_fn1 (B, int);
+};
+class D;
+class F
+{
+public:
+  F (int);
+};
+class G
+{
+public:
+  D *operator[](int);
+};
+class H
+{
+  virtual nsresult m_fn2 ();
+
+public:
+  void m_fn3 ();
+};
+class J : H
+{
+  G mQueries;
+  int mLiveUpdate;
+  nsresult m_fn2 ();
+};
+class D
+{
+public:
+  nsresult m_fn4 (int);
+  void m_fn5 (int);
+};
+class I
+{
+public:
+  static I *
+  m_fn6 ()
+  {
+    B __trans_tmp_3;
+    if (!gHistoryService)
+      C serv = __trans_tmp_3;
+  }
+  void m_fn7 ();
+  static I *gHistoryService;
+};
+D *Refresh___trans_tmp_2;
+D Refresh___trans_tmp_6, Refresh___trans_tmp_5;
+int Refresh_hasDomain;
+nsresult
+J::m_fn2 ()
+{
+  m_fn3 ();
+  I history = *I::m_fn6 ();
+  switch (mLiveUpdate)
+    {
+    case 1:
+      {
+        mQueries[0];
+        F query = 0;
+        if (Refresh_hasDomain)
+          return NS_OK;
+      }
+    case 0:
+      {
+        Refresh___trans_tmp_2 = mQueries[0];
+        F query = Refresh___trans_tmp_5.m_fn4 (0);
+        history.m_fn7 ();
+        Refresh___trans_tmp_6.m_fn5 (0);
+      }
+    case 3:
+      m_fn2 ();
+    }
+}