gcc-4.5/4.4: Bug in .subreg1 pass?
Georg Johann Lay
avr@gjlay.de
Fri Feb 25 20:37:00 GMT 2011
Paul Koning schrieb:
> On Feb 24, 2011, at 12:46 PM, Eric Botcazou wrote:
>
>
>>> Maybe the misunderstanding occurs when the mode of the subreg is
>>> less than word_size? It would certainly make sense that a
>>> subreg write of less than word_size leaves the bits undefined.
>>>
>>> ie, if word_size is SImode and we had a write to
>>>
>>> (subreg:HI (reg:SI) 0)
>>>
>>> Then the upper bits are left undefined.
>>>
>>>
>>> Contrast that to the same RTL, but word_size is HImode
>>>
>>> (subreg:HI (reg:SI) 0)
>>>
>>> Would leave the upper bits untouched.
>>
>> That's the conventional wisdom I think. Sub-word and word-sized
>> subregs don't behave the same, in particular when they are on the
>> LHS of an assignment.
>
>
> That's certainly what the manual says.
>
I still don't understand.
The manual says:
http://gcc.gnu.org/onlinedocs/gccint/Regs-and-Memory.html#Regs-and-Memory
> When storing to a normal subreg that is smaller than a word, the
> other bits of the referenced word are usually left in an undefined
> state. This laxity makes it easier to generate efficient code for
> such instructions. To represent an instruction that preserves all the
> bits outside of those in the subreg, use strict_low_part or
> zero_extract around the subreg.
What does "word" mean here? Is it a 32-bit entity or is it according to
word_mode which is QImode for avr?
In the latter case, all code generated by subreg lowering and RTL
lowering (which expands DI operation to bulk of (set (subreg:QI (DI)) as
avr backend does not have DI-insns) is fine and I will have to dig in
IRA for PR45291, PR46779 and maybe others.
In the first case all code that RTL lowering produces for 64-bit stuff
would be incorrect which is hard to imagine...
Some lines after that, internals give an example for HI subregs of PSI:
> If "UNITS_PER_WORD <= 2" then these two subregs:
> (subreg:HI (reg:PSI 0) 0)
> (subreg:HI (reg:PSI 0) 2)
> represent independent 2-byte accesses that together span the whole of
> "(reg:PSI 0)". Storing to the first subreg does not affect the value
> of the second, and vice versa.
So the same should be true for QI-subregs of scalar modes if
UNITS_PER_WORT = 1. Right?
Georg-Johann
More information about the Gcc
mailing list