Hello all,

I am porting GCC 4.5.1 for a private target. For one particular test
reloading pass is being asked to reload the following instruction:

(insn 45 175 46 11 pr20601-1.c:90 (set (reg/f:PQI 3 g3 [70])
        (mem/f:PQI (pre_inc:PQI (reg/f:PQI 1 g1 [orig:55 prephitmp.16
] [55])) [2 S1 A32])) 9 {movpqi_op} (expr_list:REG_INC (reg/f:PQI 1 g1
[orig:55 prephitmp.16 ] [55])
        (nil)))

The address is invalid in this. Base address should always be stored
in the address register. This instruction gets reloaded  in the
following manner:

(insn 175 43 202 11 pr20601-1.c:90 (set (reg/f:PQI 1 g1 [orig:55
prephitmp.16 ] [55])
        (reg/f:PQI 12 as0 [orig:49 e.4 ] [49])) 9 {movpqi_op} (nil))

(insn 202 175 203 11 pr20601-1.c:90 (set (reg/f:PQI 1 g1 [orig:55
prephitmp.16 ] [55])
        (plus:PQI (reg/f:PQI 1 g1 [orig:55 prephitmp.16 ] [55])
            (const_int 1 [0x1]))) 14 {addpqi3} (nil))

(insn 203 202 45 11 pr20601-1.c:90 (set (reg:PQI 28 a0)
        (reg/f:PQI 1 g1 [orig:55 prephitmp.16 ] [55])) 9 {movpqi_op} (nil))

(insn 45 203 46 11 pr20601-1.c:90 (set (reg/f:PQI 3 g3 [70])
        (mem/f:PQI (reg:PQI 28 a0) [2 S1 A32])) 9 {movpqi_op} (nil))

The issue with this reload is that there is no move operation between
GP registers and address registers. So insn 203 is invalid. I am
catching these kinds in secondary reloads, but auto-increment
addressing modes are not handled in that . So if i try to do that in
TARGET_SECONDARY_RELOAD i am getting assert failure from
reload1.c:emit_input_reload_insns() due to the following code:

  /* Auto-increment addresses must be reloaded in a special way.  */
  if (rl->out && ! rl->out_reg)
    {
      /* We are not going to bother supporting the case where a
         incremented register can't be copied directly from
         OLDEQUIV since this seems highly unlikely.  */
      gcc_assert (rl->secondary_in_reload < 0);

How can i overcome this failure?  Can some one suggest a solution?

Thanks for the help.

Regards,
Shafi

Reply via email to