On Tue, 6 Oct 2015, H.J. Lu wrote: > On Tue, Oct 6, 2015 at 8:01 AM, H.J. Lu <hjl.to...@gmail.com> wrote: > > On Tue, Oct 6, 2015 at 6:39 AM, Richard Biener <rguent...@suse.de> wrote: > >> On Tue, 6 Oct 2015, H.J. Lu wrote: > >> > >>> On Tue, Oct 06, 2015 at 02:30:59PM +0200, Richard Biener wrote: > >>> > On Tue, Oct 6, 2015 at 1:43 PM, H.J. Lu <hongjiu...@intel.com> wrote: > >>> > > 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? > >>> > > >>> > Hmm, I think set_cfun hook should handle this. expand_to_rtl_hook > >>> > shouldn't > >>> > mess with per-function stuff. > >>> > > >>> > Richard. > >>> > > >>> > >>> I am testig this patch. OK for trunk if there is no regresion? > >>> > >>> > >>> H.J. > >>> -- > >>> ix86_maybe_switch_abi is called to late during RTL expansion and we > >>> 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. Instead, > >>> ix86_maybe_switch_abi should be merged with ix86_set_current_function. > >>> > >>> PR target/67850 > >>> * config/i386/i386.c (ix86_set_current_function): Renamed > >>> to ... > >>> (ix86_set_current_function_1): This. > >>> (ix86_set_current_function): New. incorporate old > >>> ix86_set_current_function and ix86_maybe_switch_abi. > >>> (ix86_maybe_switch_abi): Removed. > >>> (TARGET_EXPAND_TO_RTL_HOOK): Likewise. > >>> --- > >>> gcc/config/i386/i386.c | 33 ++++++++++++++++++--------------- > >>> 1 file changed, 18 insertions(+), 15 deletions(-) > >>> > >>> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c > >>> index d59b59b..a0adf3d 100644 > >>> --- a/gcc/config/i386/i386.c > >>> +++ b/gcc/config/i386/i386.c > >>> @@ -6222,7 +6222,7 @@ ix86_reset_previous_fndecl (void) > >>> FNDECL. The argument might be NULL to indicate processing at top > >>> level, outside of any function scope. */ > >>> static void > >>> -ix86_set_current_function (tree fndecl) > >>> +ix86_set_current_function_1 (tree fndecl) > >>> { > >>> /* Only change the context if the function changes. This hook is > >>> called > >>> several times in the course of compiling a function, and we don't > >>> want to > >>> @@ -6262,6 +6262,23 @@ ix86_set_current_function (tree fndecl) > >>> ix86_previous_fndecl = fndecl; > >>> } > >>> > >>> +static void > >>> +ix86_set_current_function (tree fndecl) > >>> +{ > >>> + ix86_set_current_function_1 (fndecl); > >>> + > >>> + if (!cfun) > >>> + return; > >> > >> I think you want to test !fndecl here. Why split this out at all? > >> The ix86_previous_fndecl caching should still work, no? > >> > >>> + /* 64-bit MS and SYSV ABI have different set of call used registers. > >>> + Avoid expensive re-initialization of init_regs each time we switch > >>> + function context since this is needed only during RTL expansion. */ > >> > >> The comment is now wrong (and your bug shows it was wrong previously). > >> > > > > Here is the updated patch. OK for master if there is no > > regression on Linux/x86-64? > > > > There is no regression. OK for trunk?
Ok with me but I defer to Uros for the approval. Richard.