bug or feature? CSE optimizes away global, fixed register
Georg-Johann Lay
avr@gjlay.de
Tue Jun 9 13:12:00 GMT 2009
Andrew Haley schrieb:
> Georg-Johann Lay wrote:
>> David Hagood schrieb:
>>> On Sun, 2009-06-07 at 12:00 +0200, Georg-Johann Lay wrote:
>>>> in the test cases
>>>>
>>>> register unsigned char reg2 asm ("r2");
>>>> As gcc 3.4.6 behaves as expected (e.g. in bar, the access to reg2
>>>> remains in the loop), I wonder if this aggressive optimization is a bug?
>>>> IMO that is a bug because reg2 is a fixed register and should
>>>> therefore be treated just like volatile. Unfortunately, gcc has
>>>> nothing like REG_VOLATILE_P to tag a reg being volatile, but as I
>>>> said global fixed registers should be treated that way.
>>> Try adding a volatile to the variable:
>>>
>>> register volatile unsigned char reg2 asm ("r2");
>> That has no effect. Note that register is not a mem. Older versions of
>> gcc reported a warning on volatile register like "effect is not what you
>> might expect". Moreover, gcc cannot track volatile registers.
>> rtl.h reads:
>>
>> /* 1 in a MEM or ASM_OPERANDS expression if the memory reference is
>> volatile.
>> 1 in an INSN, CALL_INSN, JUMP_INSN, CODE_LABEL, BARRIER, or NOTE
>> if it has been deleted.
>> 1 in a REG expression if corresponds to a variable declared by the
>> user,
>> 0 for an internally generated temporary.
>> 1 in a SUBREG with a negative value.
>> 1 in a LABEL_REF, REG_LABEL_TARGET or REG_LABEL_OPERAND note for a
>> non-local label.
>> In a SYMBOL_REF, this flag is used for machine-specific purposes. */
>> unsigned int volatil : 1;
>>
>> What gcc knows is that some registers are or may be fixed, so it should
>> care about that.
>
> Surely if you're using a global register as a mailbox, all you have to do
> is read/write it with volatile asms.
That does not work. The generated code is /exactly/ the same.
I did not write "register volatile" in my original post because volatile
is just syntactic sugar together with register. It is confusing and
misleading to use volatile together with register because gcc ignores it
and does not even report a warning.
Georg-Johann
More information about the Gcc-help
mailing list