From: Richard Kenner Date: Fri, 18 Apr 2003 22:39:23 +0000 (+0000) Subject: function.c (purge_addressof_1): For ADDRESSOF... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=34d21fe3054dc40c9aca6a0073d233e766944c52;p=gcc.git function.c (purge_addressof_1): For ADDRESSOF... * function.c (purge_addressof_1): For ADDRESSOF, see if SUB is a hard or virtual register and copy into pseudo if replacement fails. From-SVN: r65798 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 894ea5658f0..a4681a71115 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,9 @@ 2003-04-18 Richard Kenner - * cfgcleanup.c (flow_find_cross_jump): Use INSN_P,not active_insn_p. + * function.c (purge_addressof_1): For ADDRESSOF, see if SUB is a + hard or virtual register and copy into pseudo if replacement fails. + + * cfgcleanup.c (flow_find_cross_jump): Use INSN_P, not active_insn_p. * expmed.c (mask_rtx): Avoid undefined shifts for BITSIZE of 0. diff --git a/gcc/function.c b/gcc/function.c index 699fd21e6d4..b75a07e15a6 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -3052,7 +3052,15 @@ purge_addressof_1 (loc, insn, force, store, may_postpone, ht) return true; start_sequence (); - sub = force_operand (sub, NULL_RTX); + + /* If SUB is a or virtual register, try it as a pseudo-register. + Otherwise, perhaps SUB is an expression, so generate code to compute + it. */ + if (GET_CODE (sub) == REG && REGNO (sub) <= LAST_VIRTUAL_REGISTER) + sub = copy_to_reg (sub); + else + sub = force_operand (sub, NULL_RTX); + if (! validate_change (insn, loc, sub, 0) && ! validate_replace_rtx (x, sub, insn)) abort ();