------- Comment #4 from danglin at gcc dot gnu dot org 2006-02-13 23:36 ------- Here's what 3.4 does for the testcase:
(insn 38 204 205 0 (set (reg:HI 19 %r19) (mem:HI (plus:SI (reg/v/f:SI 3 %r3 [orig:97 w ] [97]) (const_int 256 [0x100])) [4 S2 A16])) 52 {*pa.md:2878} (nil) (expr_list:REG_EQUIV (mem:HI (plus:SI (reg/v/f:SI 3 %r3 [orig:97 w ] [97]) (const_int 256 [0x100])) [4 S2 A16]) (nil))) (insn 205 38 206 0 (set (mem:SI (plus:SI (reg/f:SI 30 %r30) (const_int -16 [0xfffffff0])) [0 S4 A32]) (reg:SI 19 %r19)) 37 {*pa.md:2265} (nil) (nil)) (insn 206 205 23 0 (set (reg:SI 78 %fr27) (mem:SI (plus:SI (reg/f:SI 30 %r30) (const_int -16 [0xfffffff0])) [0 S4 A32])) 37 {*pa.md:2265} (nil ) (nil)) ... (insn 217 74 218 0 (set (mem:SI (plus:SI (reg/f:SI 30 %r30) (const_int -16 [0xfffffff0])) [0 S4 A32]) (reg:SI 78 %fr27)) 37 {*pa.md:2265} (nil) (nil)) (insn 218 217 39 0 (set (reg:SI 19 %r19) (mem:SI (plus:SI (reg/f:SI 30 %r30) (const_int -16 [0xfffffff0])) [0 S4 A32])) 37 {*pa.md:2265} (nil ) (nil)) (insn 39 218 219 0 (set (reg:SI 19 %r19) (sign_extend:SI (reg:HI 19 %r19))) 83 {extendhisi2} (insn_list 38 (nil)) (nil)) (insn 219 39 220 0 (set (mem:SI (plus:SI (reg/f:SI 30 %r30) (const_int -16 [0xfffffff0])) [0 S4 A32]) (reg:SI 19 %r19)) 37 {*pa.md:2265} (nil) (nil)) (insn 220 219 221 0 (set (reg:SI 78 %fr27 [118]) (mem:SI (plus:SI (reg/f:SI 30 %r30) (const_int -16 [0xfffffff0])) [0 S4 A32])) 37 {*pa.md:2265} (nil ) (nil)) ... (insn 42 222 83 0 (set (reg:DI 78 %fr27 [123]) (mult:DI (zero_extend:DI (reg:SI 78 %fr27 [118])) (zero_extend:DI (reg:SI 69 %fr22R)))) 112 {umulsidi3} (insn_list 41 (insn_list 39 (nil))) (nil)) I guess the bug was instroduced by the removal of the SECONDARY_MEMORY_NEEDED_RTX define. Without it reload isn't smart enough to use SImode for the general to floating-point register copy. Probably, adding alternatives to do the copy will fix the problem, and just maybe if the alternatives are disparaged reload won't use them. Yuck. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26255