On Thu, Dec 18, 2014 at 2:24 PM, Uros Bizjak <ubiz...@gmail.com> wrote:
> On Thu, Dec 18, 2014 at 2:11 PM, H.J. Lu <hongjiu...@intel.com> wrote:
>> The Linux kernel never passes floating point arguments around, vararg
>> functions or not. Hence no vector registers are ever used when calling a
>> vararg function.  But gcc still dutifully emits an "xor %eax,%eax" before
>> each and every call of a vararg function.  Since no callee use that for
>> anything, these instructions are redundant.
>>
>> This patch adds the -mskip-rax-setup option to skip setting up RAX
>> register when SSE is disabled and there are no variable arguments passed
>> in vector registers.  Since RAX register is used to avoid unnecessarily
>> saving vector registers on stack when passing variable arguments, the
>> impacts of this option are callees may waste some stack space, misbehave
>> or jump to a random location.  GCC 4.4 or newer don't those issues,
>> regardless the RAX register value since they don't check the RAX register
>> value when SSE is disabled, regardless the RAX register value:
>>
>> https://gcc.gnu.org/ml/gcc-patches/2008-09/msg00127.html
>>
>> I used it on kernel 3.17.7:
>>
>>    text    data     bss       dec     hex    filename
>> 11493571  2271232  5926912  19691715 12c78c3 vmlinux.skip-rax
>> 11517879  2271232  5926912  19716023 12cd7b7 vmlinux.orig
>>
>> It removed 14309 redundant "xor %eax,%eax" instructions and saved about
>> 27KB.  I am currently running the new kernel without any problem.  OK
>> for trunk?
>
> How about skipping RAX setup unconditionally for !TARGET_SSE? Please
> see ix86_conditional_register_usage, where SSE registers are squashed
> for !TARGET_SSE, so it is not possible to use them even in the inline
> asm.

... when -ffreestanding is in effect, of course.

Uros.

Reply via email to