public inbox for gcc-bugs@sourceware.org help / color / mirror / Atom feed
* [Bug inline-asm/67944] New: GCC emits unnecessary push/pop for callee-save reads. @ 2015-10-12 20:48 alex.reinking at gmail dot com 2015-10-12 21:39 ` [Bug inline-asm/67944] " segher at gcc dot gnu.org ` (2 more replies) 0 siblings, 3 replies; 4+ messages in thread From: alex.reinking at gmail dot com @ 2015-10-12 20:48 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67944 Bug ID: 67944 Summary: GCC emits unnecessary push/pop for callee-save reads. Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: inline-asm Assignee: unassigned at gcc dot gnu.org Reporter: alex.reinking at gmail dot com Target Milestone: --- When trying to return the current value of a register in a function via a local register variable, the compiler will emit a useless push/pop instruction as in the following example: C code: unsigned int readEBX(void) { register unsigned int reg asm("ebx"); return reg; } Assembly: readEBX(): mov eax, ebx push ebx pop ebx ret This same pattern occurs for all callee-save registers: ebx, esi, edi, ebp The code is properly-optimized for: eax, ecx, edx, esp See also my StackOverflow question: See also this Godbolt* result: https://goo.gl/bzgt4P * Try substituting different registers to compare ^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug inline-asm/67944] GCC emits unnecessary push/pop for callee-save reads. 2015-10-12 20:48 [Bug inline-asm/67944] New: GCC emits unnecessary push/pop for callee-save reads alex.reinking at gmail dot com @ 2015-10-12 21:39 ` segher at gcc dot gnu.org 2015-10-12 23:34 ` alex.reinking at gmail dot com 2015-10-13 13:09 ` segher at gcc dot gnu.org 2 siblings, 0 replies; 4+ messages in thread From: segher at gcc dot gnu.org @ 2015-10-12 21:39 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67944 Segher Boessenkool <segher at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |segher at gcc dot gnu.org --- Comment #1 from Segher Boessenkool <segher at gcc dot gnu.org> --- You're returning an uninitialised variable. What do you expect this code to do? ^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug inline-asm/67944] GCC emits unnecessary push/pop for callee-save reads. 2015-10-12 20:48 [Bug inline-asm/67944] New: GCC emits unnecessary push/pop for callee-save reads alex.reinking at gmail dot com 2015-10-12 21:39 ` [Bug inline-asm/67944] " segher at gcc dot gnu.org @ 2015-10-12 23:34 ` alex.reinking at gmail dot com 2015-10-13 13:09 ` segher at gcc dot gnu.org 2 siblings, 0 replies; 4+ messages in thread From: alex.reinking at gmail dot com @ 2015-10-12 23:34 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67944 --- Comment #2 from Alex Reinking <alex.reinking at gmail dot com> --- I expect it to return whatever is currently stored in ebx. Which it does, but suboptimally. In my particular case, ebx is populated by a system call. I wanted to put the inline assembly for retrieving that value in its own function so I wouldn't have to remember the local register variable syntax. The code I posted is simply a somehow minimal example of the anomalous assembly generated. The question here is more "Why does gcc emit a push ebx; pop ebx?" than "How should I retrieve whatever is currently in ebx?" ^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug inline-asm/67944] GCC emits unnecessary push/pop for callee-save reads. 2015-10-12 20:48 [Bug inline-asm/67944] New: GCC emits unnecessary push/pop for callee-save reads alex.reinking at gmail dot com 2015-10-12 21:39 ` [Bug inline-asm/67944] " segher at gcc dot gnu.org 2015-10-12 23:34 ` alex.reinking at gmail dot com @ 2015-10-13 13:09 ` segher at gcc dot gnu.org 2 siblings, 0 replies; 4+ messages in thread From: segher at gcc dot gnu.org @ 2015-10-13 13:09 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67944 --- Comment #3 from Segher Boessenkool <segher at gcc dot gnu.org> --- Your expectation is not in line with what the compiler actually promises you: the only guarantee is that the local register variable will be in (in your case) ebx _where used in an asm statement_. Other than that, it is just a local variable. You get a save/restore sequence in the prologue and epilogue because ebx is a non-volatile register and this function uses that register. Scheduling later moves the push later in the code. If you want to simply grab what is in ebx, you can use asm, like long reg; asm("mov %%ebx,%0" : "=r"(reg)); ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2015-10-13 13:09 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2015-10-12 20:48 [Bug inline-asm/67944] New: GCC emits unnecessary push/pop for callee-save reads alex.reinking at gmail dot com 2015-10-12 21:39 ` [Bug inline-asm/67944] " segher at gcc dot gnu.org 2015-10-12 23:34 ` alex.reinking at gmail dot com 2015-10-13 13:09 ` segher at gcc dot gnu.org
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).