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

Submitted by Jan Hubicka on July 21, 2010, 11:48 a.m.

Details

Message ID 20100721114807.GC10125@kam.mff.cuni.cz
State New
Headers show

Commit Message

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 hide | download patch | download mbox

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