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 ipa-pure-const ICE when mixing -O0 and -O2 LTO objects


Hi,
this patch fixes ICE when building mozilla that mixes -O0 objects with -O2.
We miss ipa-pure-const summary that was worked around by RIchard's patch.
But his patch works only when function index ends up being after the
vector of defined states.
This patch makes it work always and also fixes memory corruption in
remove_node_data.

Bootstrapped/regtested x86_64-linux.  WIll commit it later today if
there are no complains.

Honza

	* ipa-pure-const.c (varying_state): Brea out from ...
	(get_function_state): ... here; always return varying_state
	when state would be NULL otherwise.
	(remove_node_data): Do not free varying state.
Index: ipa-pure-const.c
===================================================================
--- ipa-pure-const.c	(revision 162300)
+++ ipa-pure-const.c	(working copy)
@@ -95,6 +95,11 @@ struct funct_state_d
   bool can_throw;
 };
 
+/* State used when we know nothing about function.  */
+static struct funct_state_d varying_state
+   = { IPA_NEITHER, IPA_NEITHER, true, true, true };
+
+
 typedef struct funct_state_d * funct_state;
 
 /* The storage of the funct_state is abstracted because there is the
@@ -212,13 +217,12 @@ has_function_state (struct cgraph_node *
 static inline funct_state
 get_function_state (struct cgraph_node *node)
 {
-  static struct funct_state_d varying
-    = { IPA_NEITHER, IPA_NEITHER, true, true, true };
   if (!funct_state_vec
-      || VEC_length (funct_state, funct_state_vec) <= (unsigned int)node->uid)
+      || VEC_length (funct_state, funct_state_vec) <= (unsigned int)node->uid
+      || !VEC_index (funct_state, funct_state_vec, node->uid))
     /* We might want to put correct previously_known state into varying.  */
-    return &varying;
-  return VEC_index (funct_state, funct_state_vec, node->uid);
+    return &varying_state;
+ return VEC_index (funct_state, funct_state_vec, node->uid);
 }
 
 /* Set the function state S for NODE.  */
@@ -860,7 +864,9 @@ remove_node_data (struct cgraph_node *no
 {
   if (has_function_state (node))
     {
-      free (get_function_state (node));
+      funct_state l = get_function_state (node);
+      if (l != &varying_state)
+        free (l);
       set_function_state (node, NULL);
     }
 }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]