Richard Guenther wrote:
> On Wed, Aug 3, 2011 at 3:27 PM, Michael Matz <m...@suse.de> wrote:
>> Hi,
>>
>> On Wed, 3 Aug 2011, Richard Guenther wrote:
>>
>>>> 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;
>>>>
>>>> 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.
>>> Yes, I like that idea.
>> I do too.  Except it doesn't work :)
>>
>> There's a common idiom of accessing registers read-only by declaring local
>> register vars.  E.g. to (*grasp*) the stack pointer.  There won't be a DEF
>> for that register var, and hence at use-points we couldn't reload any
>> sensible values into those registers (and we really shouldn't clobber the
>> stack pointer in this way).
>>
>> We could introduce that special semantic only for non-reserved registers,
>> and require no writes to register vars for reserved registers.
>>
>> Or we could simply do:
>>
>>  if (any_local_reg_vars)
>>    optimize = 0;
>>
>> But I already see people wanting to _do_ optimization also with local reg
>> vars, "just not the wrong optimizations" ;-/

Definitely yes.  As I wrote above, if you see asm it's not unlikely that it
is  a piece of performance critical code.

> I'd say we should start rejecting all these bogus constructs by default
> (maybe accepting them with -fpermissive and then, well, maybe generate
> some dwim code).  That is, local register var decls are only valid
> with an initializer, they are implicitly constant (you can't re-assign to 
> them).
> Reserved registers are a no-go (like %esp), either global or local.

Would that help? Like in code

static inline void foo (int arg)
{
   register const int reg asm ("r1") = arg;
   asm ("..."::"r"(reg));
}

And with output constraints like "=r,0" or "+r".  Or in local blocks:

static inline void foo (int arg)
{
   register const int reg asm ("r1") = arg;

   ...
   {
       register const int reg2 asm ("r1") = reg;
       asm ("..."::"r"(reg2));
   }
}



Do the current optimizers shred inline asm with ordinary constraints
but without local registers?

If yes, there is a considerable problem in the optimizers and/or in GCC.

If not, why can't local register variables work similarly, i.e. propagate
the register information into respective asms and forget about it for
the variables?

Johann

> Richard.
> 
>> Ciao,
>> Michael.

Reply via email to