diff options
author | Jeff Law <law@redhat.com> | 2011-03-30 09:18:30 -0600 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 2011-03-30 09:18:30 -0600 |
commit | f2034d064c29d9620c5562b2b5b517bdc6c7a672 (patch) | |
tree | f600906a3414c87afd503872e7330139e7eb57ed /gcc/reload1.c | |
parent | 159b81b00a8683b5fe7efdbaff73391a8d9e2d96 (diff) | |
download | gcc-f2034d064c29d9620c5562b2b5b517bdc6c7a672.zip gcc-f2034d064c29d9620c5562b2b5b517bdc6c7a672.tar.gz gcc-f2034d064c29d9620c5562b2b5b517bdc6c7a672.tar.bz2 |
reload.h (reg_equiv_constant): Move into new structure reg_equivs, define accessor macro.
* reload.h (reg_equiv_constant): Move into new structure reg_equivs,
define accessor macro.
(reg_equiv_invariant, reg_equiv_memory_loc): Likewise.
(reg_equiv_address, reg_equiv_mem, reg_equiv_alt_mem_list): Likewise.
(reg_equiv_init): Likewise.
(reg_equivs_size): New variable.
(reg_equiv_init_size): Remove.
(allocate_initial_values): Move prototype to here from....
* integrate.h (allocate_initial_values): Remove prototype.
* integrate.c: Include reload.h.
(allocate_initial_values): Corresponding changes.
* ira.c (find_reg_equiv_invariant_cost): Corresponding changes.
(fix_reg_equiv_init, no_equiv): Corresponding changes.
(update_equiv_regs): Corresponding changes.
(ira): Corresponding changes.
* reload.c (push_reg_equiv_alt_mem): Corresponding changes.
(push_secondary_reload): Corresponding changes.
(push_reload, find_reloads, find_reloads_toplev): Corresponding changes.
(make_memloc, find_reloads_address): Corresponding changes.
(subst_reg_equivs, subst_indexed_address): Corresponding changes.
(find_reloads_address_1): Corresponding changes.
(find_reloads_subreg_address, subst_reloads): Corresponding changes.
(refers_to_regno_for_reload_p): Corresponding changes.
(reg_overlap_mentioned_for_reload_p): Corresponding changes.
(refers_to_mem_for_reload_p, find_equiv_reg): Corresponding changes.
* reload1.c: Include ggc.h.
(grow_reg_equivs): New function.
(replace_pseudos_in, reload): Corresponding changes.
(calculate_needs_all_insns, alter_regs): Corresponding changes.
(eliminate_regs_1, elimination_effects): Corresponding changes.
(emit_input_reload_insns, emit_output_reload_insns): Likewise.
(delete_output_reload): Likewise.
* caller-save.c (mark_referenced_regs): Corresponding changes.
* alpha/alpha.c (resolve_reload_operand): Corresponding changes.
* frv/predicates.md (frv_load_operand): Corresponding changes.
* microblaze/microblaze.c (double_memory_operand): Corresponding
changes.
* avr/avr.h (LEGITIMIZE_RELOAD_ADDRESS): Corresponding changes.
* xtensa/xtensa.c (fixup_subreg_mem): Corresponding changes.
* mn10300/mn10300.c (mn10300_secondary_reload): Corresponding
changes.
* m68k/m68k.c (emit_move_sequence): Corresponding changes.
* arm/arm.c (arm_reload_in_hi, arm_reload_out_hi): Corresponding
changes.
* pa/pa.c (emit_move_sequence): Corresponding changes.
* vax/vax.c (nonindexed_address_p): Corresponding changes.
From-SVN: r171731
Diffstat (limited to 'gcc/reload1.c')
-rw-r--r-- | gcc/reload1.c | 290 |
1 files changed, 135 insertions, 155 deletions
diff --git a/gcc/reload1.c b/gcc/reload1.c index 100e5e9..6dde9a2 100644 --- a/gcc/reload1.c +++ b/gcc/reload1.c @@ -30,6 +30,7 @@ along with GCC; see the file COPYING3. If not see #include "tm_p.h" #include "obstack.h" #include "insn-config.h" +#include "ggc.h" #include "flags.h" #include "function.h" #include "expr.h" @@ -101,48 +102,9 @@ static regset_head reg_has_output_reload; in the current insn. */ static HARD_REG_SET reg_is_output_reload; -/* Element N is the constant value to which pseudo reg N is equivalent, - or zero if pseudo reg N is not equivalent to a constant. - find_reloads looks at this in order to replace pseudo reg N - with the constant it stands for. */ -rtx *reg_equiv_constant; - -/* Element N is an invariant value to which pseudo reg N is equivalent. - eliminate_regs_in_insn uses this to replace pseudos in particular - contexts. */ -rtx *reg_equiv_invariant; - -/* Element N is a memory location to which pseudo reg N is equivalent, - prior to any register elimination (such as frame pointer to stack - pointer). Depending on whether or not it is a valid address, this value - is transferred to either reg_equiv_address or reg_equiv_mem. */ -rtx *reg_equiv_memory_loc; - -/* We allocate reg_equiv_memory_loc inside a varray so that the garbage - collector can keep track of what is inside. */ -VEC(rtx,gc) *reg_equiv_memory_loc_vec; - -/* Element N is the address of stack slot to which pseudo reg N is equivalent. - This is used when the address is not valid as a memory address - (because its displacement is too big for the machine.) */ -rtx *reg_equiv_address; - -/* Element N is the memory slot to which pseudo reg N is equivalent, - or zero if pseudo reg N is not equivalent to a memory slot. */ -rtx *reg_equiv_mem; - -/* Element N is an EXPR_LIST of REG_EQUIVs containing MEMs with - alternate representations of the location of pseudo reg N. */ -rtx *reg_equiv_alt_mem_list; - /* Widest width in which each pseudo reg is referred to (via subreg). */ static unsigned int *reg_max_ref_width; -/* Element N is the list of insns that initialized reg N from its equivalent - constant or memory slot. */ -rtx *reg_equiv_init; -int reg_equiv_init_size; - /* Vector to remember old contents of reg_renumber before spilling. */ static short *reg_old_renumber; @@ -362,6 +324,8 @@ static int first_label_num; static char *offsets_known_at; static HOST_WIDE_INT (*offsets_at)[NUM_ELIMINABLE_REGS]; +VEC(reg_equivs_t,gc) *reg_equivs; + /* Stack of addresses where an rtx has been changed. We can undo the changes by popping items off the stack and restoring the original value at each location. @@ -596,14 +560,14 @@ replace_pseudos_in (rtx *loc, enum machine_mode mem_mode, rtx usage) return; } - if (reg_equiv_constant[regno]) - *loc = reg_equiv_constant[regno]; - else if (reg_equiv_invariant[regno]) - *loc = reg_equiv_invariant[regno]; - else if (reg_equiv_mem[regno]) - *loc = reg_equiv_mem[regno]; - else if (reg_equiv_address[regno]) - *loc = gen_rtx_MEM (GET_MODE (x), reg_equiv_address[regno]); + if (reg_equiv_constant (regno)) + *loc = reg_equiv_constant (regno); + else if (reg_equiv_invariant (regno)) + *loc = reg_equiv_invariant (regno); + else if (reg_equiv_mem (regno)) + *loc = reg_equiv_mem (regno); + else if (reg_equiv_address (regno)) + *loc = gen_rtx_MEM (GET_MODE (x), reg_equiv_address (regno)); else { gcc_assert (!REG_P (regno_reg_rtx[regno]) @@ -682,6 +646,26 @@ has_nonexceptional_receiver (void) return false; } +/* Grow (or allocate) the REG_EQUIVS array from its current size (which may be + zero elements) to MAX_REG_NUM elements. + + Initialize all new fields to NULL and update REG_EQUIVS_SIZE. */ +void +grow_reg_equivs (void) +{ + int old_size = VEC_length (reg_equivs_t, reg_equivs); + int max_regno = max_reg_num (); + int i; + + VEC_reserve (reg_equivs_t, gc, reg_equivs, max_regno); + for (i = old_size; i < max_regno; i++) + { + VEC_quick_insert (reg_equivs_t, reg_equivs, i, 0); + memset (VEC_index (reg_equivs_t, reg_equivs, i), 0, sizeof (reg_equivs_t)); + } + +} + /* Global variables used by reload and its subroutines. */ @@ -769,6 +753,18 @@ reload (rtx first, int global) if (! call_used_regs[i] && ! fixed_regs[i] && ! LOCAL_REGNO (i)) df_set_regs_ever_live (i, true); + /* Find all the pseudo registers that didn't get hard regs + but do have known equivalent constants or memory slots. + These include parameters (known equivalent to parameter slots) + and cse'd or loop-moved constant memory addresses. + + Record constant equivalents in reg_equiv_constant + so they will be substituted by find_reloads. + Record memory equivalents in reg_mem_equiv so they can + be substituted eventually by altering the REG-rtx's. */ + + grow_reg_equivs (); + reg_max_ref_width = XCNEWVEC (unsigned int, max_regno); reg_old_renumber = XCNEWVEC (short, max_regno); memcpy (reg_old_renumber, reg_renumber, max_regno * sizeof (short)); pseudo_forbidden_regs = XNEWVEC (HARD_REG_SET, max_regno); @@ -882,15 +878,15 @@ reload (rtx first, int global) so this problem goes away. But that's very hairy. */ for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++) - if (reg_renumber[i] < 0 && reg_equiv_memory_loc[i]) + if (reg_renumber[i] < 0 && reg_equiv_memory_loc (i)) { - rtx x = eliminate_regs (reg_equiv_memory_loc[i], VOIDmode, + rtx x = eliminate_regs (reg_equiv_memory_loc (i), VOIDmode, NULL_RTX); if (strict_memory_address_addr_space_p (GET_MODE (regno_reg_rtx[i]), XEXP (x, 0), MEM_ADDR_SPACE (x))) - reg_equiv_mem[i] = x, reg_equiv_address[i] = 0; + reg_equiv_mem (i) = x, reg_equiv_address (i) = 0; else if (CONSTANT_P (XEXP (x, 0)) || (REG_P (XEXP (x, 0)) && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER) @@ -899,7 +895,7 @@ reload (rtx first, int global) && (REGNO (XEXP (XEXP (x, 0), 0)) < FIRST_PSEUDO_REGISTER) && CONSTANT_P (XEXP (XEXP (x, 0), 1)))) - reg_equiv_address[i] = XEXP (x, 0), reg_equiv_mem[i] = 0; + reg_equiv_mem (i) = XEXP (x, 0), reg_equiv_mem (i) = 0; else { /* Make a new stack slot. Then indicate that something @@ -908,8 +904,8 @@ reload (rtx first, int global) below might change some offset. reg_equiv_{mem,address} will be set up for this pseudo on the next pass around the loop. */ - reg_equiv_memory_loc[i] = 0; - reg_equiv_init[i] = 0; + reg_equiv_memory_loc (i) = 0; + reg_equiv_init (i) = 0; alter_reg (i, -1, true); } } @@ -1023,10 +1019,10 @@ reload (rtx first, int global) for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++) { - if (reg_renumber[i] < 0 && reg_equiv_init[i] != 0) + if (reg_renumber[i] < 0 && reg_equiv_init (i) != 0) { rtx list; - for (list = reg_equiv_init[i]; list; list = XEXP (list, 1)) + for (list = reg_equiv_init (i); list; list = XEXP (list, 1)) { rtx equiv_insn = XEXP (list, 0); @@ -1094,11 +1090,11 @@ reload (rtx first, int global) { rtx addr = 0; - if (reg_equiv_mem[i]) - addr = XEXP (reg_equiv_mem[i], 0); + if (reg_equiv_mem (i)) + addr = XEXP (reg_equiv_mem (i), 0); - if (reg_equiv_address[i]) - addr = reg_equiv_address[i]; + if (reg_equiv_address (i)) + addr = reg_equiv_address (i); if (addr) { @@ -1109,8 +1105,8 @@ reload (rtx first, int global) REG_USERVAR_P (reg) = 0; PUT_CODE (reg, MEM); XEXP (reg, 0) = addr; - if (reg_equiv_memory_loc[i]) - MEM_COPY_ATTRIBUTES (reg, reg_equiv_memory_loc[i]); + if (reg_equiv_memory_loc (i)) + MEM_COPY_ATTRIBUTES (reg, reg_equiv_memory_loc (i)); else { MEM_IN_STRUCT_P (reg) = MEM_SCALAR_P (reg) = 0; @@ -1118,8 +1114,8 @@ reload (rtx first, int global) } MEM_NOTRAP_P (reg) = 1; } - else if (reg_equiv_mem[i]) - XEXP (reg_equiv_mem[i], 0) = addr; + else if (reg_equiv_mem (i)) + XEXP (reg_equiv_mem (i), 0) = addr; } /* We don't want complex addressing modes in debug insns @@ -1131,10 +1127,10 @@ reload (rtx first, int global) rtx equiv = 0; df_ref use, next; - if (reg_equiv_constant[i]) - equiv = reg_equiv_constant[i]; - else if (reg_equiv_invariant[i]) - equiv = reg_equiv_invariant[i]; + if (reg_equiv_constant (i)) + equiv = reg_equiv_constant (i); + else if (reg_equiv_invariant (i)) + equiv = reg_equiv_invariant (i); else if (reg && MEM_P (reg)) equiv = targetm.delegitimize_address (reg); else if (reg && REG_P (reg) && (int)REGNO (reg) != i) @@ -1287,7 +1283,7 @@ reload (rtx first, int global) /* Indicate that we no longer have known memory locations or constants. */ free_reg_equiv (); - reg_equiv_init = 0; + free (reg_max_ref_width); free (reg_old_renumber); free (pseudo_previous_regs); @@ -1509,9 +1505,9 @@ calculate_needs_all_insns (int global) /* Skip insns that only set an equivalence. */ if (set && REG_P (SET_DEST (set)) && reg_renumber[REGNO (SET_DEST (set))] < 0 - && (reg_equiv_constant[REGNO (SET_DEST (set))] - || (reg_equiv_invariant[REGNO (SET_DEST (set))])) - && reg_equiv_init[REGNO (SET_DEST (set))]) + && (reg_equiv_constant (REGNO (SET_DEST (set))) + || (reg_equiv_invariant (REGNO (SET_DEST (set))))) + && reg_equiv_init (REGNO (SET_DEST (set)))) continue; /* If needed, eliminate any eliminable registers. */ @@ -1540,12 +1536,10 @@ calculate_needs_all_insns (int global) || (REG_P (SET_SRC (set)) && REG_P (SET_DEST (set)) && reg_renumber[REGNO (SET_SRC (set))] < 0 && reg_renumber[REGNO (SET_DEST (set))] < 0 - && reg_equiv_memory_loc[REGNO (SET_SRC (set))] != NULL - && reg_equiv_memory_loc[REGNO (SET_DEST (set))] != NULL - && rtx_equal_p (reg_equiv_memory_loc - [REGNO (SET_SRC (set))], - reg_equiv_memory_loc - [REGNO (SET_DEST (set))])))) + && reg_equiv_memory_loc (REGNO (SET_SRC (set))) != NULL + && reg_equiv_memory_loc (REGNO (SET_DEST (set))) != NULL + && rtx_equal_p (reg_equiv_memory_loc (REGNO (SET_SRC (set))), + reg_equiv_memory_loc (REGNO (SET_DEST (set))))))) { if (ira_conflicts_p) /* Inform IRA about the insn deletion. */ @@ -1636,11 +1630,11 @@ calculate_elim_costs_all_insns (void) /* Skip insns that only set an equivalence. */ if (set && REG_P (SET_DEST (set)) && reg_renumber[REGNO (SET_DEST (set))] < 0 - && (reg_equiv_constant[REGNO (SET_DEST (set))] - || (reg_equiv_invariant[REGNO (SET_DEST (set))]))) + && (reg_equiv_constant (REGNO (SET_DEST (set))) + || reg_equiv_invariant (REGNO (SET_DEST (set))))) { unsigned regno = REGNO (SET_DEST (set)); - rtx init = reg_equiv_init[regno]; + rtx init = reg_equiv_init (regno); if (init) { rtx t = eliminate_regs_1 (SET_SRC (set), VOIDmode, insn, @@ -1664,9 +1658,9 @@ calculate_elim_costs_all_insns (void) } for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++) { - if (reg_equiv_invariant[i]) + if (reg_equiv_invariant (i)) { - if (reg_equiv_init[i]) + if (reg_equiv_init (i)) { int cost = reg_equiv_init_cost[i]; if (dump_file) @@ -1686,7 +1680,6 @@ calculate_elim_costs_all_insns (void) } } - free_reg_equiv (); free (reg_equiv_init_cost); } @@ -2173,9 +2166,10 @@ alter_reg (int i, int from_reg, bool dont_share_p) if (reg_renumber[i] < 0 && REG_N_REFS (i) > 0 - && reg_equiv_constant[i] == 0 - && (reg_equiv_invariant[i] == 0 || reg_equiv_init[i] == 0) - && reg_equiv_memory_loc[i] == 0) + && reg_equiv_constant (i) == 0 + && (reg_equiv_invariant (i) == 0 + || reg_equiv_init (i) == 0) + && reg_equiv_memory_loc (i) == 0) { rtx x = NULL_RTX; enum machine_mode mode = GET_MODE (regno_reg_rtx[i]); @@ -2299,7 +2293,7 @@ alter_reg (int i, int from_reg, bool dont_share_p) set_mem_attrs_for_spill (x); /* Save the stack slot for later. */ - reg_equiv_memory_loc[i] = x; + reg_equiv_memory_loc (i) = x; } } @@ -2494,10 +2488,10 @@ note_reg_elim_costly (rtx *px, void *data) if (REG_P (x) && REGNO (x) >= FIRST_PSEUDO_REGISTER - && reg_equiv_init[REGNO (x)] - && reg_equiv_invariant[REGNO (x)]) + && reg_equiv_init (REGNO (x)) + && reg_equiv_invariant (REGNO (x))) { - rtx t = reg_equiv_invariant[REGNO (x)]; + rtx t = reg_equiv_invariant (REGNO (x)); rtx new_rtx = eliminate_regs_1 (t, Pmode, insn, true, true); int cost = rtx_cost (new_rtx, SET, optimize_bb_for_speed_p (elim_bb)); int freq = REG_FREQ_FROM_BB (elim_bb); @@ -2582,14 +2576,15 @@ eliminate_regs_1 (rtx x, enum machine_mode mem_mode, rtx insn, } else if (reg_renumber && reg_renumber[regno] < 0 - && reg_equiv_invariant && reg_equiv_invariant[regno]) + && reg_equivs + && reg_equiv_invariant (regno)) { if (may_use_invariant || (insn && DEBUG_INSN_P (insn))) - return eliminate_regs_1 (copy_rtx (reg_equiv_invariant[regno]), + return eliminate_regs_1 (copy_rtx (reg_equiv_invariant (regno)), mem_mode, insn, true, for_costs); /* There exists at least one use of REGNO that cannot be eliminated. Prevent the defining insn from being deleted. */ - reg_equiv_init[regno] = NULL_RTX; + reg_equiv_init (regno) = NULL_RTX; if (!for_costs) alter_reg (regno, -1, true); } @@ -2666,14 +2661,14 @@ eliminate_regs_1 (rtx x, enum machine_mode mem_mode, rtx insn, if (GET_CODE (new0) == PLUS && REG_P (new1) && REGNO (new1) >= FIRST_PSEUDO_REGISTER && reg_renumber[REGNO (new1)] < 0 - && reg_equiv_constant != 0 - && reg_equiv_constant[REGNO (new1)] != 0) - new1 = reg_equiv_constant[REGNO (new1)]; + && reg_equivs + && reg_equiv_constant (REGNO (new1)) != 0) + new1 = reg_equiv_constant (REGNO (new1)); else if (GET_CODE (new1) == PLUS && REG_P (new0) && REGNO (new0) >= FIRST_PSEUDO_REGISTER && reg_renumber[REGNO (new0)] < 0 - && reg_equiv_constant[REGNO (new0)] != 0) - new0 = reg_equiv_constant[REGNO (new0)]; + && reg_equiv_constant (REGNO (new0)) != 0) + new0 = reg_equiv_constant (REGNO (new0)); new_rtx = form_sum (GET_MODE (x), new0, new1); @@ -2835,14 +2830,13 @@ eliminate_regs_1 (rtx x, enum machine_mode mem_mode, rtx insn, if (REG_P (SUBREG_REG (x)) && (GET_MODE_SIZE (GET_MODE (x)) <= GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))) - && reg_equiv_memory_loc != 0 - && reg_equiv_memory_loc[REGNO (SUBREG_REG (x))] != 0) + && reg_equivs + && reg_equiv_memory_loc (REGNO (SUBREG_REG (x))) != 0) { new_rtx = SUBREG_REG (x); } else - new_rtx = eliminate_regs_1 (SUBREG_REG (x), mem_mode, insn, false, - for_costs); + new_rtx = eliminate_regs_1 (SUBREG_REG (x), mem_mode, insn, false, for_costs); if (new_rtx != SUBREG_REG (x)) { @@ -3002,10 +2996,11 @@ elimination_effects (rtx x, enum machine_mode mem_mode) } } - else if (reg_renumber[regno] < 0 && reg_equiv_constant - && reg_equiv_constant[regno] - && ! function_invariant_p (reg_equiv_constant[regno])) - elimination_effects (reg_equiv_constant[regno], mem_mode); + else if (reg_renumber[regno] < 0 + && reg_equiv_constant (0) + && reg_equiv_constant (regno) + && ! function_invariant_p (reg_equiv_constant (regno))) + elimination_effects (reg_equiv_constant (regno), mem_mode); return; case PRE_INC: @@ -3073,8 +3068,8 @@ elimination_effects (rtx x, enum machine_mode mem_mode) if (REG_P (SUBREG_REG (x)) && (GET_MODE_SIZE (GET_MODE (x)) <= GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))) - && reg_equiv_memory_loc != 0 - && reg_equiv_memory_loc[REGNO (SUBREG_REG (x))] != 0) + && reg_equivs != 0 + && reg_equiv_memory_loc (REGNO (SUBREG_REG (x))) != 0) return; elimination_effects (SUBREG_REG (x), mem_mode); @@ -4100,11 +4095,7 @@ init_eliminable_invariants (rtx first, bool do_subregs) int i; rtx insn; - reg_equiv_constant = XCNEWVEC (rtx, max_regno); - reg_equiv_invariant = XCNEWVEC (rtx, max_regno); - reg_equiv_mem = XCNEWVEC (rtx, max_regno); - reg_equiv_alt_mem_list = XCNEWVEC (rtx, max_regno); - reg_equiv_address = XCNEWVEC (rtx, max_regno); + grow_reg_equivs (); if (do_subregs) reg_max_ref_width = XCNEWVEC (unsigned int, max_regno); else @@ -4166,7 +4157,7 @@ init_eliminable_invariants (rtx first, bool do_subregs) /* Always unshare the equivalence, so we can substitute into this insn without touching the equivalence. */ - reg_equiv_memory_loc[i] = copy_rtx (x); + reg_equiv_memory_loc (i) = copy_rtx (x); } else if (function_invariant_p (x)) { @@ -4174,41 +4165,41 @@ init_eliminable_invariants (rtx first, bool do_subregs) { /* This is PLUS of frame pointer and a constant, and might be shared. Unshare it. */ - reg_equiv_invariant[i] = copy_rtx (x); + reg_equiv_invariant (i) = copy_rtx (x); num_eliminable_invariants++; } else if (x == frame_pointer_rtx || x == arg_pointer_rtx) { - reg_equiv_invariant[i] = x; + reg_equiv_invariant (i) = x; num_eliminable_invariants++; } else if (LEGITIMATE_CONSTANT_P (x)) - reg_equiv_constant[i] = x; + reg_equiv_constant (i) = x; else { - reg_equiv_memory_loc[i] + reg_equiv_memory_loc (i) = force_const_mem (GET_MODE (SET_DEST (set)), x); - if (! reg_equiv_memory_loc[i]) - reg_equiv_init[i] = NULL_RTX; + if (! reg_equiv_memory_loc (i)) + reg_equiv_init (i) = NULL_RTX; } } else { - reg_equiv_init[i] = NULL_RTX; + reg_equiv_init (i) = NULL_RTX; continue; } } else - reg_equiv_init[i] = NULL_RTX; + reg_equiv_init (i) = NULL_RTX; } } if (dump_file) for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++) - if (reg_equiv_init[i]) + if (reg_equiv_init (i)) { fprintf (dump_file, "init_insns for %u: ", i); - print_inline_rtx (dump_file, reg_equiv_init[i], 20); + print_inline_rtx (dump_file, reg_equiv_init (i), 20); fprintf (dump_file, "\n"); } } @@ -4221,14 +4212,6 @@ free_reg_equiv (void) { int i; - if (reg_equiv_constant) - free (reg_equiv_constant); - if (reg_equiv_invariant) - free (reg_equiv_invariant); - reg_equiv_constant = 0; - reg_equiv_invariant = 0; - VEC_free (rtx, gc, reg_equiv_memory_loc_vec); - reg_equiv_memory_loc = 0; if (offsets_known_at) free (offsets_known_at); @@ -4238,12 +4221,11 @@ free_reg_equiv (void) offsets_known_at = 0; for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) - if (reg_equiv_alt_mem_list[i]) - free_EXPR_LIST_list (®_equiv_alt_mem_list[i]); - free (reg_equiv_alt_mem_list); + if (reg_equiv_alt_mem_list (i)) + free_EXPR_LIST_list (®_equiv_alt_mem_list (i)); + VEC_free (reg_equivs_t, gc, reg_equivs); + reg_equivs = NULL; - free (reg_equiv_mem); - free (reg_equiv_address); } /* Kick all pseudos out of hard register REGNO. @@ -7299,15 +7281,15 @@ emit_input_reload_insns (struct insn_chain *chain, struct reload *rl, tmp = SUBREG_REG (tmp); if (REG_P (tmp) && REGNO (tmp) >= FIRST_PSEUDO_REGISTER - && (reg_equiv_memory_loc[REGNO (tmp)] != 0 - || reg_equiv_constant[REGNO (tmp)] != 0)) + && (reg_equiv_memory_loc (REGNO (tmp)) != 0 + || reg_equiv_constant (REGNO (tmp)) != 0)) { - if (! reg_equiv_mem[REGNO (tmp)] + if (! reg_equiv_mem (REGNO (tmp)) || num_not_at_initial_offset || GET_CODE (oldequiv) == SUBREG) real_oldequiv = rl->in; else - real_oldequiv = reg_equiv_mem[REGNO (tmp)]; + real_oldequiv = reg_equiv_mem (REGNO (tmp)); } tmp = old; @@ -7315,15 +7297,15 @@ emit_input_reload_insns (struct insn_chain *chain, struct reload *rl, tmp = SUBREG_REG (tmp); if (REG_P (tmp) && REGNO (tmp) >= FIRST_PSEUDO_REGISTER - && (reg_equiv_memory_loc[REGNO (tmp)] != 0 - || reg_equiv_constant[REGNO (tmp)] != 0)) + && (reg_equiv_memory_loc (REGNO (tmp)) != 0 + || reg_equiv_constant (REGNO (tmp)) != 0)) { - if (! reg_equiv_mem[REGNO (tmp)] + if (! reg_equiv_mem (REGNO (tmp)) || num_not_at_initial_offset || GET_CODE (old) == SUBREG) real_old = rl->in; else - real_old = reg_equiv_mem[REGNO (tmp)]; + real_old = reg_equiv_mem (REGNO (tmp)); } second_reload_reg = rld[secondary_reload].reg_rtx; @@ -7493,16 +7475,14 @@ emit_input_reload_insns (struct insn_chain *chain, struct reload *rl, if ((REG_P (oldequiv) && REGNO (oldequiv) >= FIRST_PSEUDO_REGISTER - && (reg_equiv_memory_loc[REGNO (oldequiv)] != 0 - || reg_equiv_constant[REGNO (oldequiv)] != 0)) + && (reg_equiv_memory_loc (REGNO (oldequiv)) != 0 + || reg_equiv_constant (REGNO (oldequiv)) != 0)) || (GET_CODE (oldequiv) == SUBREG && REG_P (SUBREG_REG (oldequiv)) && (REGNO (SUBREG_REG (oldequiv)) >= FIRST_PSEUDO_REGISTER) - && ((reg_equiv_memory_loc - [REGNO (SUBREG_REG (oldequiv))] != 0) - || (reg_equiv_constant - [REGNO (SUBREG_REG (oldequiv))] != 0))) + && ((reg_equiv_memory_loc (REGNO (SUBREG_REG (oldequiv))) != 0) + || (reg_equiv_constant (REGNO (SUBREG_REG (oldequiv))) != 0))) || (CONSTANT_P (oldequiv) && (targetm.preferred_reload_class (oldequiv, REGNO_REG_CLASS (REGNO (reloadreg))) @@ -7560,8 +7540,8 @@ emit_output_reload_insns (struct insn_chain *chain, struct reload *rl, int tertiary_reload = rld[secondary_reload].secondary_out_reload; if (REG_P (old) && REGNO (old) >= FIRST_PSEUDO_REGISTER - && reg_equiv_mem[REGNO (old)] != 0) - real_old = reg_equiv_mem[REGNO (old)]; + && reg_equiv_mem (REGNO (old)) != 0) + real_old = reg_equiv_mem (REGNO (old)); if (secondary_reload_class (0, rl->rclass, mode, real_old) != NO_REGS) { @@ -8690,7 +8670,7 @@ delete_output_reload (rtx insn, int j, int last_reload_reg, rtx new_reload_reg) while (GET_CODE (reg) == SUBREG) reg = SUBREG_REG (reg); - substed = reg_equiv_memory_loc[REGNO (reg)]; + substed = reg_equiv_memory_loc (REGNO (reg)); /* This is unsafe if the operand occurs more often in the current insn than it is inherited. */ @@ -8723,7 +8703,7 @@ delete_output_reload (rtx insn, int j, int last_reload_reg, rtx new_reload_reg) n_occurrences += count_occurrences (PATTERN (insn), eliminate_regs (substed, VOIDmode, NULL_RTX), 0); - for (i1 = reg_equiv_alt_mem_list[REGNO (reg)]; i1; i1 = XEXP (i1, 1)) + for (i1 = reg_equiv_alt_mem_list (REGNO (reg)); i1; i1 = XEXP (i1, 1)) { gcc_assert (!rtx_equal_p (XEXP (i1, 0), substed)); n_occurrences += count_occurrences (PATTERN (insn), XEXP (i1, 0), 0); |