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.

Reply via email to