This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Fix ICE in inline_small_functions


Hi,
this patch fixes ICE in inline_small_functions checking consistency of the
growth cache.  When removing speculation the cache needs to be reset because
the frequencies of edges change.

Bootstrapped/regtested x86_64-linux, comitted.

Honza

	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.
Index: testsuite/g++.dg/torture/pr64565.C
===================================================================
--- testsuite/g++.dg/torture/pr64565.C	(revision 0)
+++ testsuite/g++.dg/torture/pr64565.C	(revision 0)
@@ -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 ();
+    }
+}
Index: ipa-inline.c
===================================================================
--- ipa-inline.c	(revision 219452)
+++ ipa-inline.c	(working copy)
@@ -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 Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]