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