Ulrich Weigand wrote:
> Richard Guenther wrote:
>> On Tue, Aug 2, 2011 at 3:23 PM, Ian Lance Taylor <i...@google.com> wrote:
>>> Richard Guenther <richard.guent...@gmail.com> writes:
>>>> I suggest to amend the documentation for local call-clobbered register
>>>> variables to say that the only valid sequence using them is from a
>>>> non-inlinable function that contains only direct initializations of the
>>>> register variables from constants or parameters.
>>> Let's just implement those requirements in the compiler itself.
>> Doesn't work for existing code, no?  And if thinking new code then
>> I'd rather have explicit dependences (and a way to represent them).
>> Thus, for example
>>
>> asm ("scall" : : "asm("r0")" (10), ...)
>>
>> thus, why force new constraints when we already can figure out
>> local register vars by register name?  Why not extend the constraint
>> syntax somehow to allow specifying the same effect?

Yes this would be exact equivalence of

  register int var asm ("r0") = 10;
  ...
  asm ("scall" : : "r" (var), ...)


> Maybe it would be possible to implement this while keeping the syntax
> of existing code by (re-)defining the semantics of register asm to
> basically say that:
> 
>  If a variable X is declared as register asm for register Y, and X
>  is later on used as operand to an inline asm, the register allocator
>  will choose register Y to hold that asm operand.  (And this is the
>  full specification of register asm semantics, nothing beyond this
>  is guaranteed.)

Yes, that's reasonable.  As I understand the docs, in code like

void foo ()
{
   register int var asm ("r1") = 10;
   asm (";; use r1");
}

there is nothing that connects var to the asm and assuming that
r1 holds 10 in the asm is a user error.

The only place where the asm attached to a variable needs to have
effect are the inline asm sequences that explicitly refer to
respective variables.  If there is no inline asm referencing a
local register variable, there is on difference to a non-register
auto variable; there could even be a warning that in such a case
that

   register int var asm ("r1") = 10;

is equivalent to

   int var = 10;

> It seems this semantics could be implemented very early on, probably
> in the frontend itself.  The frontend would mark the *asm* statement
> as using the specified register (there would be no special handling
> of the *variable* as such, after the frontend is done).  The optimizers
> would then simply be required to pass the asm-statement register
> annotations though, much like today they pass constraints through.
> At the point where register allocation decisions are made, those
> register annotations would then be acted on.
> 
> Bye,
> Ulrich

I wonder why it does not work like that in the current implementation.
Local register variable is just like using a similar constraint
(with the only difference that in general there is no such constraint,
otherwise the developer would use it). A pass like .asmcons could
take care of it just the same way it does for constraints and no
optimizer passed would have to bother if a variable is a local register
or not.

This would render local register variables even more functional
because no one needed to care if there were implicit library calls
or things like that.

Johann

Reply via email to