Patchwork Fix ipa-pure-const ICE when mixing -O0 and -O2 LTO objects

login
register
mail settings
Submitter Jan Hubicka
Date July 21, 2010, 11:48 a.m.
Message ID <20100721114807.GC10125@kam.mff.cuni.cz>
Download mbox | patch
Permalink /patch/59433/
State New
Headers show

Comments

Jan Hubicka - July 21, 2010, 11:48 a.m.
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.

Patch

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);
     }
 }