I'm looking at a set of reloads that look like this:

(insn 238 3802 239 35 (set (reg/v:HI 175 [ ch ])
        (sign_extend:HI (mem:QI (reg/v/f:HI 176 [ fmt ]) [0 S1 A8]))) 46 
{extendqihi2} (nil)
    (nil))

Note that the md pattern uses a "0" constraint; sign-extend is a
one-op insn.

Reloads for insn # 238
Reload 0: reload_in (HI) = (plus:HI (reg/f:HI 7 fb)
                                    (const_int -128))
        A_REGS, RELOAD_OTHER (opnum = 0)
        reload_in_reg: (plus:HI (reg/f:HI 7 fb)
                                (const_int -128))
        reload_reg_rtx: (reg:HI 4 a0)
Reload 1: A_REGS, RELOAD_FOR_OTHER_ADDRESS (opnum = 0)
        reload_in_reg: (plus:HI (reg/f:HI 7 fb)
                                (const_int -128))
        reload_reg_rtx: (reg:HI 4 a0)
Reload 2: reload_in (HI) = (mem/c:HI (plus:HI (plus:HI (reg/f:HI 7 fb)
                                                       (const_int -128))
                                              (const_int -476)) [108 fmt+0 S2 
A8])
        A_REGS, RELOAD_FOR_OTHER_ADDRESS (opnum = 0), can't combine
        reload_in_reg: (reg/v/f:HI 176 [ fmt ])
        reload_reg_rtx: (reg:HI 5 a1)
Reload 3: reload_in (QI) = (mem:QI (reg/v/f:HI 176 [ fmt ]) [0 S1 A8])
        reload_out (HI) = (mem/c:HI (plus:HI (plus:HI (reg/f:HI 7 fb)
                                                      (const_int -128))
                                             (const_int -474)) [107 ch+0 S2 A8])
        HL_REGS, RELOAD_OTHER (opnum = 0)
        reload_in_reg: (mem:QI (reg/v/f:HI 176 [ fmt ]) [0 S1 A8])
        reload_out_reg: (reg/v:HI 175 [ ch ])
        reload_reg_rtx: (reg:HI 0 r0)

It generates insns for reloads 0, 2, and 3, but in this order:

reload 0 (OTHER) : insns 4152..4156
reload 2 (OADDR) : insn 4157
reload 3 (OTHER) : insns 4158..4159


(insn 4157 3802 4153 34 (set (reg:HI 5 a1)
        (mem/c:HI (plus:HI (reg:HI 4 a0)
                (const_int -476 [0xfffffffffffffe24])) [108 fmt+0 S2 A8])) 33 
{movhi_op} (nil)
    (nil))

(insn 4153 4157 4155 34 (set (reg:HI 4 a0)
        (const_int -128 [0xffffffffffffff80])) 33 {movhi_op} (nil)
    (nil))

(insn 4155 4153 4156 34 (set (reg:HI 4 a0)
        (reg/f:HI 7 fb)) 33 {movhi_op} (nil)
    (nil))

(insn 4156 4155 4158 34 (set (reg:HI 4 a0)
        (plus:HI (reg:HI 4 a0)
            (const_int -128 [0xffffffffffffff80]))) 2 {addhi3} (nil)
    (expr_list:REG_EQUIV (plus:HI (reg/f:HI 7 fb)
            (const_int -128 [0xffffffffffffff80]))
        (nil)))

(insn 4158 4156 238 34 (set (reg:QI 0 r0)
        (mem:QI (reg:HI 5 a1) [0 S1 A8])) 32 {movqi_op} (nil)
    (nil))

(insn 238 4158 4159 34 (set (reg:HI 0 r0)
        (sign_extend:HI (reg:QI 0 r0))) 46 {extendqihi2} (nil)
    (nil))

(insn 4159 238 4160 34 (set (mem/c:HI (plus:HI (reg:HI 4 a0)
                (const_int -474 [0xfffffffffffffe26])) [107 ch+0 S2 A8])
        (reg:HI 0 r0)) 33 {movhi_op} (nil)
    (nil))

Note that 4157 is out of order.  I *think* what's happening is that
the MERGE_TO_OTHER macro isn't taking into account that if you merge
RELOAD_OTHER and RELOAD_FOR_OTHER_ADDRESS, you can't end up with a
RELOAD_OTHER.

Either that or there's an earlier bug in that reload 0 should be
RELOAD_FOR_OTHER_ADDR too.  I think fixing either would solve
my problem.

Comments?

Reply via email to