On Thu, Nov 21, 2019 at 12:31 AM Janne Blomqvist <blomqvist.ja...@gmail.com> wrote: > > On Thu, Nov 21, 2019 at 12:18 AM Janne Blomqvist > <blomqvist.ja...@gmail.com> wrote: > > > > On Wed, Nov 20, 2019 at 11:35 PM Thomas König <t...@tkoenig.net> wrote: > > > (Why do we zero %eax > > > before each call? It should not be a variadic call right?) > > > > Not sure. Maybe some belt and suspenders thing? I guess someone better > > versed in ABI minutiae knows better. It's not Fortran-specific though, > > the C frontend does the same when calling a void function. > > Ah, scratch that, it is some varargs-thing, I had forgot that a C > function with no arguments or lacking a prototype is considered a > varargs. The code > > void foo(); > void bar(void); > > void testfoo() > { > foo(); > } > > void testbar() > { > bar(); > } > > void testunprototyped() > { > baz(); > } > > > generates code (elided scaffolding): > > testfoo: > xorl %eax, %eax > jmp foo > testbar: > jmp bar > testunprototyped: > xorl %eax, %eax > jmp baz > > > So probably this is due to the Fortran procedures lacking an interface > being considered varargs by the caller. Starts to smell like some > leftover from PR 87689?
Thinking some more about it, I'm thinking we should leave it as is, even though it's a (small) code bloat. So Fortran calling a procedure with an implicit interface most closely resembles the C unprototyped function call. The problem is that we don't know much about the callee. What if a Fortran procedure calls a C varargs procedure? In the Fortran caller, we don't know whether the callee is varargs or not, but if we don't zero %eax all hell could break loose if it happened to be a varargs function. Yes, we could hide behind Fortran not supporting varargs, and it's all the users fault, but is it really worth it? I'd say no. (in some cases zeroing a register is used to tell the OoO hw to kill a dependency, so it can be beneficial for performance even if not strictly required for correctness) -- Janne Blomqvist