re PR ipa/64872 (ICE: Segmentation fault during Chromium PGO build)
authorJan Hubicka <hubicka@ucw.cz>
Sun, 1 Feb 2015 18:46:14 +0000 (19:46 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Sun, 1 Feb 2015 18:46:14 +0000 (18:46 +0000)
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.

From-SVN: r220329

gcc/ChangeLog
gcc/ipa-icf.c
gcc/ipa-utils.c
gcc/ipa-utils.h

index ce07fba1b741f0fd0506c117585b2513ab274b7a..548e5dcd26c69cd298309df3c0481510bbf36c22 100644 (file)
@@ -1,3 +1,10 @@
+2015-01-29  Jan Hubicka  <hubicka@ucw.cz>
+
+       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.
+
 2015-02-01  Jakub Jelinek  <jakub@redhat.com>
 
        PR debug/64817
index afb5be5097c6a2853d3a53fda92ec55b17ff199d..9b2d117b9736a425e65264c65f675ad2271046d6 100644 (file)
@@ -762,7 +762,7 @@ sem_function::merge (sem_item *alias_item)
         }
 
       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 a8bb42d42639a21fca24336b3c7a6eff04dbeec6..076d71dd0d9ad16b4da6c106a749e9477f3b2057 100644 (file)
@@ -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 *dst,
              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 b815b742c7afa7c2cbc761eebc9eccbfc334c54f..ea0f8b379f4baeb560f509d355db40ea33b8aa69 100644 (file)
@@ -44,7 +44,7 @@ bool ipa_edge_within_scc (struct cgraph_edge *);
 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  */