Fix -fipa-icf -fprofile-use ICE

Jan Hubicka hubicka@ucw.cz
Sun Feb 1 18:14:00 GMT 2015


Hi,
this PR is about IPA icf first releasing body during profile merge and then
attempting to use result to build tunk.

Bootstrapped/regtested x86_64-linux.  Tested on Firefox build.  Will commit it
shortly.

Honza

	PR ipa/64872
	* ipa-utils.c (ipa_merge_profiles): Add release argument.
	* ipa-icf.c (sem_function::merge): Do not release body when merging.
	* ipa-utils.h (ipa_merge_profiles): Update prototype.
Index: ipa-utils.c
===================================================================
--- ipa-utils.c	(revision 220313)
+++ ipa-utils.c	(working copy)
@@ -407,11 +407,13 @@ get_base_var (tree t)
 
 
 /* SRC and DST are going to be merged.  Take SRC's profile and merge it into
-   DST so it is not going to be lost.  Destroy SRC's body on the way.  */
+   DST so it is not going to be lost.  Possibly destroy SRC's body on the way
+   unless PRESERVE_BODY is set.  */
 
 void
 ipa_merge_profiles (struct cgraph_node *dst,
-		    struct cgraph_node *src)
+		    struct cgraph_node *src,
+		    bool preserve_body)
 {
   tree oldsrcdecl = src->decl;
   struct function *srccfun, *dstcfun;
@@ -652,7 +654,8 @@ ipa_merge_profiles (struct cgraph_node *
 	      e->frequency = freq;
 	    }
 	}
-      src->release_body ();
+      if (!preserve_body)
+        src->release_body ();
       inline_update_overall_summary (dst);
     }
   /* TODO: if there is no match, we can scale up.  */
Index: ipa-icf.c
===================================================================
--- ipa-icf.c	(revision 220313)
+++ ipa-icf.c	(working copy)
@@ -762,7 +762,7 @@ sem_function::merge (sem_item *alias_ite
         }
 
       alias->icf_merged = true;
-      ipa_merge_profiles (local_original, alias);
+      ipa_merge_profiles (local_original, alias, true);
       alias->create_wrapper (local_original);
 
       if (dump_file)
Index: ipa-utils.h
===================================================================
--- ipa-utils.h	(revision 220313)
+++ ipa-utils.h	(working copy)
@@ -44,7 +44,7 @@ bool ipa_edge_within_scc (struct cgraph_
 int ipa_reverse_postorder (struct cgraph_node **);
 tree get_base_var (tree);
 void ipa_merge_profiles (struct cgraph_node *dst,
-			 struct cgraph_node *src);
+			 struct cgraph_node *src, bool preserve_body = false);
 bool recursive_call_p (tree, tree);
 
 /* In ipa-profile.c  */



More information about the Gcc-patches mailing list