http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53617
Bug #: 53617 Summary: Suboptimal PC-relative addressing code on x86 Classification: Unclassified Product: gcc Version: unknown Status: UNCONFIRMED Severity: enhancement Priority: P3 Component: target AssignedTo: unassig...@gcc.gnu.org ReportedBy: bug...@aerifal.cx Consider a function of the form: int *foo() { static int x; return &x; } When GCC compiles this, the result is similar to the following hand-written asm: call 1f 1: pop %ecx add $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx lea x@GOTOFF(%ecx),%eax ret i.e. it loads the address of the GOT in a register, then computes the GOT-relative address of the variable. This makes sense when the GOT address will be needed for more than one address lookup, but it's unnecessarily costly in the case where it's only used for a single variable, in which case the following code would be better: call 1f 1: pop %eax add $[x-1b], %eax ret The same principle applies to a great deal more code, and of course it works when __i686.get_pc_thunk.cx or similar is being used, too. Is there any way GCC could be enhanced to generate this superior code when possible?