Since targetm.expand_to_rtl_hook may be called to switch ABI, it should be called for each function before expanding to RTL. Otherwise, we may use the stale information from compilation of the previous function. aggregate_value_p uses call_used_regs. aggregate_value_p is used by IPA and return value optimization, which are called before pass_expand::execute after RTL expansion starts. We need to call targetm.expand_to_rtl_hook early enough in cgraph_node::expand to make sure that everything is in sync when RTL expansion starts.
Tested on Linux/x86-64. OK for trunk? H.J. --- PR middle-end/67850 * cfgexpand.c (pass_expand::execute): Don't call targetm.expand_to_rtl_hook here. * cgraphunit.c (cgraph_node::expand): Call targetm.expand_to_rtl_hook here. --- gcc/cfgexpand.c | 1 - gcc/cgraphunit.c | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index 58e55d2..6891750 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -6150,7 +6150,6 @@ pass_expand::execute (function *fun) /* Mark arrays indexed with non-constant indices with TREE_ADDRESSABLE. */ discover_nonconstant_array_refs (); - targetm.expand_to_rtl_hook (); crtl->stack_alignment_needed = STACK_BOUNDARY; crtl->max_used_stack_slot_alignment = STACK_BOUNDARY; crtl->stack_alignment_estimated = 0; diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c index 04a4d3f..537a089 100644 --- a/gcc/cgraphunit.c +++ b/gcc/cgraphunit.c @@ -1973,6 +1973,9 @@ cgraph_node::expand (void) bitmap_obstack_initialize (®_obstack); /* FIXME, only at RTL generation*/ + /* It may update call_used_regs, which is used by aggregate_value_p. */ + targetm.expand_to_rtl_hook (); + execute_all_ipa_transforms (); /* Perform all tree transforms and optimizations. */ -- 2.4.3