http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49487
Georg-Johann Lay <gjl at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |ice-on-valid-code CC| |gjl at gcc dot gnu.org --- Comment #4 from Georg-Johann Lay <gjl at gcc dot gnu.org> 2011-06-24 20:11:20 UTC --- I see this on 4.5.2 In 185r.asmcons we have insn 40: (insn 40 38 41 4 foo.c:6 (parallel [ (set (reg:HI 94) (rotate:HI (reg/v:HI 66 [ _x ]) (const_int 8 [0x8]))) (clobber (reg:QI 95)) ]) 64 {*rotbhi} (expr_list:REG_DEAD (reg/v:HI 66 [ _x ]) (expr_list:REG_UNUSED (reg:QI 95) (nil)))) and in 188r.ira it is: (insn 40 38 41 4 foo.c:6 (parallel [ (set (reg:HI 20 r20 [94]) (rotate:HI (reg/v:HI 20 r20 [orig:66 _x ] [66]) (const_int 8 [0x8]))) (clobber (mem/c:QI (plus:HI (reg/f:HI 28 r28) (const_int 1 [0x1])) [3 %sfp+1 S1 A8])) ]) 64 {*rotbhi} (nil)) At first sight I thought it is a reload bug, but it's not. The bug goes like that: operand3 gets constraint verbatim from rotx iterator, witch reads for HI (HI "X,X,X") That was correct if reload would supply a scratch. However, these rot patterns don't request a scratch, the respective expander already supplies a pseudo. So the "X" does not mean "don't need a scratch", instead it means "everything is fine" so that reload need not generate reload insns to force "r" or whatever constraint. So either the constrint must be "=&r" or so if a pseudo is pre-generated (this is waste because the reg is not needed and can even force a frame/frame pointer) or this has to be rewritten as a proper scratch.