This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Enable EBX for x86 in 32bits PIC code
- From: Evgeny Stupachenko <evstupac at gmail dot com>
- To: gcc at gcc dot gnu dot org
- Cc: Uros Bizjak <ubizjak at gmail dot com>
- Date: Mon, 7 Jul 2014 14:00:33 +0400
- Subject: Enable EBX for x86 in 32bits PIC code
- Authentication-results: sourceware.org; auth=none
Hi All,
Currently GCC permanently reserves EBX as the GOT register.
(config/i386/i386.c:4289)
/* The PIC register, if it exists, is fixed. */
j = PIC_OFFSET_TABLE_REGNUM;
if (j != INVALID_REGNUM)
fixed_regs[j] = call_used_regs[j] = 1;
This leads to significant performance losses in PIC mode:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54232
According to my measurements ~3% generally and up to 20% in inner loops.
CLANG uses all registers for allocation and therefore now has
competitive advantage in 32bits PIC mode comparing to GCC.
This mode is used in all Android applications and therefore is
important for many compiler customers.
There are at least 2 possible solutions.
1.
While call expand emit SET_GOT -> EBX and MOV EBX -> some local register: LGOT
Prior to each call emit MOV LGOT -> EBX
Use LGOT as new GOT register for globals.
2.
Set EBX as each CALL parameter.
Emit MOV EBX->LGOT in each call.
Use LGOT as new GOT register for globals.
Do you have any comments, ideas?
Thanks,
Evgeny