X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Freload.c;h=66894dc1db7bebd792cf7aff5011bdb340d45c96;hb=1e5fcbe2009a34584768d8b8833756bc8de97dc3;hp=f6a008d957df03aae610706219fbccc7eb46ca5b;hpb=6006f9fd085c65362c5c9a9622e3f127e83420cb;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/reload.c b/gcc/reload.c index f6a008d957d..66894dc1db7 100644 --- a/gcc/reload.c +++ b/gcc/reload.c @@ -3778,6 +3778,27 @@ find_reloads (rtx insn, int replace, int ind_levels, int live_known, goal_alternative_win[i] = 1; } + /* Likewise any invalid constants appearing as operand of a PLUS + that is to be reloaded. */ + for (i = 0; i < noperands; i++) + if (! goal_alternative_win[i] + && GET_CODE (recog_data.operand[i]) == PLUS + && CONST_POOL_OK_P (XEXP (recog_data.operand[i], 1)) + && (PREFERRED_RELOAD_CLASS (XEXP (recog_data.operand[i], 1), + (enum reg_class) goal_alternative[i]) + == NO_REGS) + && operand_mode[i] != VOIDmode) + { + rtx tem = force_const_mem (operand_mode[i], + XEXP (recog_data.operand[i], 1)); + tem = gen_rtx_PLUS (operand_mode[i], + XEXP (recog_data.operand[i], 0), tem); + + substed_operand[i] = recog_data.operand[i] + = find_reloads_toplev (tem, i, address_type[i], + ind_levels, 0, insn, NULL); + } + /* Record the values of the earlyclobber operands for the caller. */ if (goal_earlyclobber) for (i = 0; i < noperands; i++)