Hi, I am trying to track down/fix PR target/45291. The problem is that pass .subreg1 generates invalid subregs.
According to internals "10.8 Registers and Memory, Normal Subregs" a normal (non-paradoxical) subreg as Lvalue sets the specifyed subreg and leaves the remaining part of the target word undefined. This happens in the following test case unsigned char func1(void); void funct2(int l); void dummy(void) { int l = 256 * func1() + func1(); if (l > 256) return; func1(); funct2(l); } compiled with avr-gcc -S pr45291.c -O2 -mmcu=atmega8 -dP -da -v Using built-in specs. COLLECT_GCC=/home/georg/gcc/install/gcc-4.5/bin/avr-gcc COLLECT_LTO_WRAPPER=/mnt/nfs/home/georg/gcc/install/gcc-4.5/bin/../libexec/gcc/avr/4.5.3/lto-wrapper Target: avr Configured with: /gnu/source/gcc.gnu.org/branches/gcc-4_5-branch/configure --target=avr --prefix=/home/georg/gcc/install/gcc-4.5 --enable-languages=c,c++ --disable-libssp --disable-libada --disable-nls --disable-shared Thread model: single gcc version 4.5.3 20110223 (prerelease) (GCC) COLLECT_GCC_OPTIONS='-O2' '-S' '-mmcu=atmega8' '-dP' '-da' '-v' /mnt/nfs/home/georg/gcc/install/gcc-4.5/bin/../libexec/gcc/avr/4.5.3/cc1 -quiet -v -imultilib avr4 -iprefix /mnt/nfs/home/georg/gcc/install/gcc-4.5/bin/../lib/gcc/avr/4.5.3/ pr45291.c -quiet -dumpbase pr45291.c -dP -da -mmcu=atmega8 -auxbase pr45291 -O2 -version -o pr45291.s GNU C (GCC) version 4.5.3 20110223 (prerelease) (avr) compiled by GNU C version 4.3.2 [gcc-4_3-branch revision 141291], GMP version 4.3.1, MPFR version 2.4.2, MPC version 0.8.1 [...] COLLECT_GCC_OPTIONS='-O2' '-S' '-mmcu=atmega8' '-dP' '-da' '-v' ====================== In pass .148r.jump everything looks fine: (note 2 3 6 2 NOTE_INSN_FUNCTION_BEG) (call_insn 6 2 7 2 pr45291.c:6 (set (reg:QI 24 r24) (call (mem:HI (symbol_ref:HI ("func1") [flags 0x41] <function_decl 0xb76a5700 func1>) [0 S2 A8]) (const_int 0 [0x0]))) 123 {call_value_insn} (nil) (nil)) (insn 7 6 9 2 pr45291.c:6 (set (reg:QI 41 [ D.1925 ]) (reg:QI 24 r24)) 4 {*movqi} (nil)) (call_insn 9 7 10 2 pr45291.c:6 (set (reg:QI 24 r24) (call (mem:HI (symbol_ref:HI ("func1") [flags 0x41] <function_decl 0xb76a5700 func1>) [0 S2 A8]) (const_int 0 [0x0]))) 123 {call_value_insn} (nil) (nil)) (insn 10 9 11 2 pr45291.c:6 (set (reg:QI 44 [ D.1928 ]) (reg:QI 24 r24)) 4 {*movqi} (nil)) (insn 11 10 12 2 pr45291.c:6 (set (reg:HI 49) (zero_extend:HI (reg:QI 41 [ D.1925 ]))) 94 {zero_extendqihi2} (nil)) (insn 12 11 13 2 pr45291.c:6 (set (reg:HI 50) (ashift:HI (reg:HI 49) (const_int 8 [0x8]))) 68 {ashlhi3} (nil)) (insn 13 12 14 2 pr45291.c:6 (set (reg:HI 51) (zero_extend:HI (reg:QI 44 [ D.1928 ]))) 94 {zero_extendqihi2} (nil)) (insn 14 13 15 2 pr45291.c:6 (set (reg/v:HI 46 [ l ]) (plus:HI (reg:HI 50) (reg:HI 51))) 22 {*addhi3} (nil)) Then .149r.subreg1 generates insns 33 and 34 with insn 34 nullifying insn 33. (note 2 3 6 2 NOTE_INSN_FUNCTION_BEG) (call_insn 6 2 7 2 pr45291.c:6 (set (reg:QI 24 r24) (call (mem:HI (symbol_ref:HI ("func1") [flags 0x41] <function_decl 0xb76c6700 func1>) [0 S2 A8]) (const_int 0 [0x0]))) 123 {call_value_insn} (nil) (nil)) (insn 7 6 9 2 pr45291.c:6 (set (reg:QI 41 [ D.1925 ]) (reg:QI 24 r24)) 4 {*movqi} (nil)) (call_insn 9 7 10 2 pr45291.c:6 (set (reg:QI 24 r24) (call (mem:HI (symbol_ref:HI ("func1") [flags 0x41] <function_decl 0xb76c6700 func1>) [0 S2 A8]) (const_int 0 [0x0]))) 123 {call_value_insn} (nil) (nil)) (insn 10 9 31 2 pr45291.c:6 (set (reg:QI 44 [ D.1928 ]) (reg:QI 24 r24)) 4 {*movqi} (nil)) (insn 31 10 32 2 pr45291.c:6 (set (reg:QI 54) (reg:QI 41 [ D.1925 ])) 4 {*movqi} (nil)) (insn 32 31 33 2 pr45291.c:6 (set (reg:QI 55 [+1 ]) (const_int 0 [0x0])) 4 {*movqi} (nil)) (insn 33 32 34 2 pr45291.c:6 (set (subreg:QI (reg:HI 50) 1) (reg:QI 54)) 4 {*movqi} (nil)) (insn 34 33 13 2 pr45291.c:6 (set (subreg:QI (reg:HI 50) 0) (const_int 0 [0x0])) 4 {*movqi} (nil)) (insn 13 34 14 2 pr45291.c:6 (set (reg:HI 51) (zero_extend:HI (reg:QI 44 [ D.1928 ]))) 94 {zero_extendqihi2} (nil)) (insn 14 13 15 2 pr45291.c:6 (set (reg/v:HI 46 [ l ]) (plus:HI (reg:HI 50) (reg:HI 51))) 22 {*addhi3} (nil)) Insn 33 survives until .188r.ira and is kicked out there. So despite my comment in the original bug report where I suspected avr backend to emit the bad subregs, it is actually a middle-end bug, right? Target avr suffers from similar problems in 4.3, 4.4 and 4.6 which are all reported against avr backend, not against middleend/rtl optimizers. PR46779 shows the bug for avr-gcc-4.4.6 (prerelease) Thanks, Johann