This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Add -mno-r11 option to suppress load of ppc64 static chain in indirect calls


On Wed, Jul 6, 2011 at 6:29 PM, Michael Meissner
<meissner@linux.vnet.ibm.com> wrote:
> This patch adds an option to not load the static chain (r11) for 64-bit PowerPC
> calls through function pointers (or virtual function). ?Most of the languages
> on the PowerPC do not need the static chain being loaded when called, and
> adding this instruction can slow down code that calls very short functions.
>
> In addition, if the function does not call alloca, setjmp or deal with
> exceptions where the stack is modified, the compiler can move the store of the
> TOC value for the current function to the prologue of the function, rather than
> at each call site.
>
> The effect of these patches is to speed up 464.h264ref in the Spec 2006
> benchmark by about 7% if -mno-r11 is used, and 5% if it is not used (but the
> save of the TOC register is hoisted). ?I believe this is due to the load of the
> current function's TOC (r2) having to wait until the store queue is drained
> with the store just before the call.
>
> Unfortunately, I do see a 3% slowdown in 429.mcf, which I don't know what the
> cause is.
>
> I have bootstraped the compiler and saw that there were no regressions in make
> check. ?Is it ok to install in the trunk?
>
> [gcc]
> 2011-07-06 ?Michael Meissner ?<meissner@linux.vnet.ibm.com>
>
> ? ? ? ?* config/rs6000/rs6000-protos.h (rs6000_call_indirect_aix): New
> ? ? ? ?declaration.
> ? ? ? ?(rs6000_save_toc_in_prologue_p): Ditto.
>
> ? ? ? ?* config/rs6000/rs6000.opt (-mr11): New switch to disable loading
> ? ? ? ?up the static chain (r11) during indirect function calls.
> ? ? ? ?(-msave-toc-indirect): New undocumented debug switch.
>
> ? ? ? ?* config/rs6000/rs6000.c (struct machine_function): Add
> ? ? ? ?save_toc_in_prologue field to note whether the prologue needs to
> ? ? ? ?save the TOC value in the reserved stack location.
> ? ? ? ?(rs6000_emit_prologue): Use TOC_REGNUM instead of 2. ?If we need
> ? ? ? ?to save the TOC in the prologue, do so.
> ? ? ? ?(rs6000_trampoline_init): Don't allow creating AIX style
> ? ? ? ?trampolines if -mno-r11 is in effect.
> ? ? ? ?(rs6000_call_indirect_aix): New function to create AIX style
> ? ? ? ?indirect calls, adding support for -mno-r11 to suppress loading
> ? ? ? ?the static chain, and saving the TOC in the prologue instead of
> ? ? ? ?the call body.
> ? ? ? ?(rs6000_save_toc_in_prologue_p): Return true if we are saving the
> ? ? ? ?TOC in the prologue.
>
> ? ? ? ?* config/rs6000/rs6000.md (STACK_POINTER_REGNUM): Add more fixed
> ? ? ? ?register numbers.
> ? ? ? ?(TOC_REGNUM): Ditto.
> ? ? ? ?(STATIC_CHAIN_REGNUM): Ditto.
> ? ? ? ?(ARG_POINTER_REGNUM): Ditto.
> ? ? ? ?(SFP_REGNO): Delete, unused.
> ? ? ? ?(TOC_SAVE_OFFSET_32BIT): Add constants for AIX TOC save and
> ? ? ? ?function descriptor offsets.
> ? ? ? ?(TOC_SAVE_OFFSET_64BIT): Ditto.
> ? ? ? ?(AIX_FUNC_DESC_TOC_32BIT): Ditto.
> ? ? ? ?(AIX_FUNC_DESC_TOC_64BIT): Ditto.
> ? ? ? ?(AIX_FUNC_DESC_SC_32BIT): Ditto.
> ? ? ? ?(AIX_FUNC_DESC_SC_64BIT): Ditto.
> ? ? ? ?(ptrload): New mode attribute for the appropriate load of a
> ? ? ? ?pointer.
> ? ? ? ?(call_indirect_aix32): Delete, rewrite AIX indirect function
> ? ? ? ?calls.
> ? ? ? ?(call_indirect_aix64): Ditto.
> ? ? ? ?(call_value_indirect_aix32): Ditto.
> ? ? ? ?(call_value_indirect_aix64): Ditto.
> ? ? ? ?(call_indirect_nonlocal_aix32_internal): Ditto.
> ? ? ? ?(call_indirect_nonlocal_aix32): Ditto.
> ? ? ? ?(call_indirect_nonlocal_aix64_internal): Ditto.
> ? ? ? ?(call_indirect_nonlocal_aix64): Ditto.
> ? ? ? ?(call): Rewrite AIX indirect function calls. ?Add support for
> ? ? ? ?eliminating the static chain, and for moving the save of the TOC
> ? ? ? ?to the function prologue.
> ? ? ? ?(call_value): Ditto.
> ? ? ? ?(call_indirect_aix<ptrsize>): Ditto.
> ? ? ? ?(call_indirect_aix<ptrsize>_internal): Ditto.
> ? ? ? ?(call_indirect_aix<ptrsize>_internal2): Ditto.
> ? ? ? ?(call_indirect_aix<ptrsize>_nor11): Ditto.
> ? ? ? ?(call_value_indirect_aix<ptrsize>): Ditto.
> ? ? ? ?(call_value_indirect_aix<ptrsize>_internal): Ditto.
> ? ? ? ?(call_value_indirect_aix<ptrsize>_internal2): Ditto.
> ? ? ? ?(call_value_indirect_aix<ptrsize>_nor11): Ditto.
> ? ? ? ?(call_nonlocal_aix32): Relocate in the rs6000.md file.
> ? ? ? ?(call_nonlocal_aix64): Ditto.
>
> ? ? ? ?* doc/invoke.texi (RS/6000 and PowerPC Options): Add -mr11 and
> ? ? ? ?-mno-r11 documentation.
> [gcc/testsuite]
> 2011-07-06 ?Michael Meissner ?<meissner@linux.vnet.ibm.com>
>
> ? ? ? ?* gcc.target/powerpc/no-r11-1.c: New test for -mr11, -mno-r11.
> ? ? ? ?* gcc.target/powerpc/no-r11-2.c: Ditto.
> ? ? ? ?* gcc.target/powerpc/no-r11-3.c: Ditto.

Okay.

Thanks, David


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]