On 16-10-14 23:46, Eric Botcazou wrote:
Having said that, in my mind, what is confusing about the name
-fuse-caller-save, is that in fact the caller-save registers are already
used in register allocation. It's just that they're used across calls
without the need to save them, but
-fuse-caller-save-across-calls-without-saving-if-possible is not such a
good option name.

Agreed.

Another thing that - in my mind - is confusing is that there's an option
fcaller-saves which controls behaviour for caller-save registers:
- for -fno-caller-saves, caller-save registers are not used across calls
- for -fcaller-saves, caller-save registers are used across calls
The name is similar to -fuse-caller-save, and it won't be clear from just
the names what the difference is.

OK, so the existing -fcaller-saves is in fact -fuse-caller-saves,

Right, in the sense that a caller-save is the save of caller-save register, as opposed to short for a caller-save register, which is how it's used in -fuse-caller-save.

which means
that we should really find a better name for yours. :-)


Agreed :)

I've pondered the name -fipa-ira, but I rejected that earlier because that
might suggest actual register allocation at the interprocedural scope,
while this is only register allocation at the scope of a single procedure,
taking some interprocedural information into account. Furthermore, it's not
only ira that uses the interprocedural information.

So, let's a generate a list of option names.
-fuse-caller-save
-fuse-call-clobbered
-fprecise-call-clobbers
-foptimize-call-clobbers
-fprune-call-clobbers
-freduce-call-clobbers
-fcall-clobbers-ipa

Any preferences, alternatives?

Given the existing -fcaller-saves, I'd keep "caller-saves" in the name, so
something along the lines of -foptimize-caller-saves or -fipa-caller-saves.


Let's look at the effect of the option (after the recent fix for PR61605) on gcc.target/i386/fuse-calller-save.c:
...
 foo:
 .LFB1:
        .cfi_startproc
-       pushq   %rbx
-       .cfi_def_cfa_offset 16
-       .cfi_offset 3, -16
-       movl    %edi, %ebx
        call    bar
-       addl    %ebx, %eax
-       popq    %rbx
-       .cfi_def_cfa_offset 8
+       addl    %edi, %eax
        ret
        .cfi_endproc
 .LFE1:
...
So, the effect is: instead of using a callee-save register, we use a caller-save register to store a value that's live over a call, without needing to add a caller-save, as would be normally the case.

If I see an option -foptimize-caller-saves, I'd expect the effect to be that without, there are some caller-saves and with, there are less. This is not the case in the diff above. Nevertheless, if we'd have a case where we already have caller-saves, that would be indeed the observed effect. I'm just trying to point out that the optimization does more than just removing caller-saves.

The optimization, at it's core, can be regarded as removing superfluous clobbers from calls, and everything else is derived from that:
- if a caller-save register is not clobbered by a call, then there's no need
  for a caller-save before that call, so it's cheaper to use across that call
  than a callee-save register.
  (which explains what we see in the diff)
- if a caller-save register is live across a call, and is not clobbered by a
  call, then there's no need for a caller-save, and it can be removed.
  (which explains what we see in case we have an example where there are
   actual caller-saves without the optimization, and less so with the
   optimization)

I'm starting to lean towards -foptimize-call-clobbers or similar.

Thanks,
- Tom

Reply via email to