On Wed, Oct 7, 2015 at 10:53 AM, Richard Biener <rguent...@suse.de> 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. OK for mainline and release branches after a few days. Thanks, Uros.