From 91bb9f80e58963d65a5cd305b438a2d7009cdb09 Mon Sep 17 00:00:00 2001 From: Martin Jambor Date: Wed, 18 May 2016 18:38:56 +0200 Subject: Indirect inlining of targets from references of global constants 2016-05-18 Martin Jambor PR ipa/69708 * cgraph.h (cgraph_indirect_call_info): New field guaranteed_unmodified. * ipa-cp.c (ipa_get_indirect_edge_target_1): Also pass parameter value to ipa_find_agg_cst_for_param, check guaranteed_unmodified when appropriate. * ipa-inline-analysis.c (evaluate_conditions_for_known_args): Also pass the parameter value to ipa_find_agg_cst_for_param. * ipa-prop.c (ipa_load_from_parm_agg): New parameter guaranteed_unmodified, store AA results there instead of bailing out if present. (ipa_note_param_call): Also initialize guaranteed_unmodified flag. (ipa_analyze_indirect_call_uses): Also set guaranteed_unmodified flag. (find_constructor_constant_at_offset): New function. (ipa_find_agg_cst_from_init): Likewise. (ipa_find_agg_cst_for_param): Also seearch for aggregate values in static initializers of contants, report back through a new paameter from_global_constant if that was the case. (try_make_edge_direct_simple_call): Also pass parameter value to ipa_find_agg_cst_for_param, check guaranteed_unmodified when appropriate. (ipa_write_indirect_edge_info): Stream new flag guaranteed_unmodified. (ipa_read_indirect_edge_info): Likewise. * ipa-prop.h (ipa_find_agg_cst_for_param): Update declaration. (ipa_load_from_parm_agg): Likewise. testsuite/ * gcc.dg/ipa/iinline-cstagg-1.c: New test. * gcc.dg/ipa/ipcp-cstagg-1.c: Likewise. * gcc.dg/ipa/ipcp-cstagg-2.c: Likewise. * gcc.dg/ipa/ipcp-cstagg-3.c: Likewise. * gcc.dg/ipa/ipcp-cstagg-4.c: Likewise. From-SVN: r236416 --- gcc/ipa-cp.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) (limited to 'gcc/ipa-cp.c') diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c index 5900d4d..2183da0 100644 --- a/gcc/ipa-cp.c +++ b/gcc/ipa-cp.c @@ -1999,9 +1999,9 @@ ipa_get_indirect_edge_target_1 (struct cgraph_edge *ie, if (ie->indirect_info->agg_contents) { - if (agg_reps) + t = NULL; + if (agg_reps && ie->indirect_info->guaranteed_unmodified) { - t = NULL; while (agg_reps) { if (agg_reps->index == param_index @@ -2014,15 +2014,22 @@ ipa_get_indirect_edge_target_1 (struct cgraph_edge *ie, agg_reps = agg_reps->next; } } - else if (known_aggs.length () > (unsigned int) param_index) + if (!t) { struct ipa_agg_jump_function *agg; - agg = known_aggs[param_index]; - t = ipa_find_agg_cst_for_param (agg, ie->indirect_info->offset, - ie->indirect_info->by_ref); + if (known_aggs.length () > (unsigned int) param_index) + agg = known_aggs[param_index]; + else + agg = NULL; + bool from_global_constant; + t = ipa_find_agg_cst_for_param (agg, known_csts[param_index], + ie->indirect_info->offset, + ie->indirect_info->by_ref, + &from_global_constant); + if (!from_global_constant + && !ie->indirect_info->guaranteed_unmodified) + t = NULL_TREE; } - else - t = NULL; } else t = known_csts[param_index]; @@ -2066,7 +2073,8 @@ ipa_get_indirect_edge_target_1 (struct cgraph_edge *ie, { struct ipa_agg_jump_function *agg; agg = known_aggs[param_index]; - t = ipa_find_agg_cst_for_param (agg, ie->indirect_info->offset, + t = ipa_find_agg_cst_for_param (agg, known_csts[param_index], + ie->indirect_info->offset, true); } -- cgit v1.1