diff options
author | Ulrich Weigand <uweigand@de.ibm.com> | 2004-10-14 18:32:04 +0000 |
---|---|---|
committer | Ulrich Weigand <uweigand@gcc.gnu.org> | 2004-10-14 18:32:04 +0000 |
commit | d58005c7d647a2c0ae5f842c34792f2582879e10 (patch) | |
tree | 0c4c2b3cfe155b28ab774d52e64484b7007ac262 /gcc/reload.c | |
parent | 3020563ae2865bc728ad4f113dfd36e6b0bb764a (diff) | |
download | gcc-d58005c7d647a2c0ae5f842c34792f2582879e10.zip gcc-d58005c7d647a2c0ae5f842c34792f2582879e10.tar.gz gcc-d58005c7d647a2c0ae5f842c34792f2582879e10.tar.bz2 |
reload.c (find_reloads): When reloading a PLUS with constant operand...
* reload.c (find_reloads): When reloading a PLUS with constant
operand, make sure the constant is pushed to the constant pool
if required.
* config/s390/s390.c (s390_secondary_input_reload_class): Remove
reload bug workaround.
(s390_expand_plus_operand): Likewise.
From-SVN: r89047
Diffstat (limited to 'gcc/reload.c')
-rw-r--r-- | gcc/reload.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/gcc/reload.c b/gcc/reload.c index f6a008d..66894dc 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++) |