summaryrefslogtreecommitdiff
path: root/gcc/ipa-prop.c
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2019-11-11 19:11:02 +0000
committerJan Hubicka <hubicka@gcc.gnu.org>2019-11-11 19:11:02 +0000
commit98aad294705ac35aec058e020867d736d841dad0 (patch)
tree06af2352f1bd5c5a3cbfdd8ba9ab736bb6dd968c /gcc/ipa-prop.c
parent8be34204decbb1bd751bee05394be5c995831503 (diff)
ipa-prop.c (ipa_propagate_indirect_call_infos): Remove ipcp summary.
* ipa-prop.c (ipa_propagate_indirect_call_infos): Remove ipcp summary. (ipcp_transformation_t::duplicate): Break out from ... (ipa_node_params_t::duplicate): ... here; add copying of agg replacements. * ipa-prop.h (ipcp_transformation): Add constructor and destructor. (ipcp_transformation_t): Add duplicate. From-SVN: r278062
Diffstat (limited to 'gcc/ipa-prop.c')
-rw-r--r--gcc/ipa-prop.c41
1 files changed, 22 insertions, 19 deletions
diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c
index 71fbf192ffd..a6c135f242b 100644
--- a/gcc/ipa-prop.c
+++ b/gcc/ipa-prop.c
@@ -3746,6 +3746,8 @@ ipa_propagate_indirect_call_infos (struct cgraph_edge *cs,
if (ok)
ipa_edge_args_sum->remove (cs);
}
+ if (ipcp_transformation_sum)
+ ipcp_transformation_sum->remove (cs->callee);
return changed;
}
@@ -3986,27 +3988,28 @@ ipa_node_params_t::duplicate(cgraph_node *src, cgraph_node *dst,
}
ipa_set_node_agg_value_chain (dst, new_av);
}
+}
- ipcp_transformation *src_trans = ipcp_get_transformation_summary (src);
-
- if (src_trans)
- {
- ipcp_transformation_initialize ();
- src_trans = ipcp_transformation_sum->get_create (src);
- ipcp_transformation *dst_trans
- = ipcp_transformation_sum->get_create (dst);
-
- dst_trans->bits = vec_safe_copy (src_trans->bits);
+/* Duplication of ipcp transformation summaries. */
- const vec<ipa_vr, va_gc> *src_vr = src_trans->m_vr;
- vec<ipa_vr, va_gc> *&dst_vr
- = ipcp_get_transformation_summary (dst)->m_vr;
- if (vec_safe_length (src_trans->m_vr) > 0)
- {
- vec_safe_reserve_exact (dst_vr, src_vr->length ());
- for (unsigned i = 0; i < src_vr->length (); ++i)
- dst_vr->quick_push ((*src_vr)[i]);
- }
+void
+ipcp_transformation_t::duplicate(cgraph_node *, cgraph_node *dst,
+ ipcp_transformation *src_trans,
+ ipcp_transformation *dst_trans)
+{
+ /* Avoid redundant work of duplicating vectors we will never use. */
+ if (dst->inlined_to)
+ return;
+ dst_trans->bits = vec_safe_copy (src_trans->bits);
+ dst_trans->m_vr = vec_safe_copy (src_trans->m_vr);
+ ipa_agg_replacement_value *agg = src_trans->agg_values,
+ **aggptr = &dst_trans->agg_values;
+ while (agg)
+ {
+ *aggptr = ggc_alloc<ipa_agg_replacement_value> ();
+ **aggptr = *agg;
+ agg = agg->next;
+ aggptr = &(*aggptr)->next;
}
}