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