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