aboutsummaryrefslogtreecommitdiff
path: root/gcc/reload1.c
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2006-08-17 08:55:02 +0000
committerAlexandre Oliva <aoliva@gcc.gnu.org>2006-08-17 08:55:02 +0000
commit3f1e3e7010cf18ef218f107015b8f66fc75ed4d9 (patch)
tree5846cb80d97c878963127f9d3c488c23dfc9286c /gcc/reload1.c
parentd3b30e42b73d0a369046e53fcdbe69517c0195be (diff)
downloadgcc-3f1e3e7010cf18ef218f107015b8f66fc75ed4d9.zip
gcc-3f1e3e7010cf18ef218f107015b8f66fc75ed4d9.tar.gz
gcc-3f1e3e7010cf18ef218f107015b8f66fc75ed4d9.tar.bz2
re PR target/28146 (-O2 produces invalid code on s390-linux-gnu: gcc-4.1.2 20060608)
PR target/28146 * reload.h (reg_equiv_alt_mem_list): New declaration. * reload1.c (reg_equiv_alt_mem_list): New definition. (reload): Initialize it and release it. (delete_output_reload): Use it. * reload.c (push_reg_equiv_alt_mem): New function. (find_reloads_toplev): Call it. (find_reloads_address, find_reloads_address_1): Likewise. (find_reloads_subreg_address): Likewise. From-SVN: r116215
Diffstat (limited to 'gcc/reload1.c')
-rw-r--r--gcc/reload1.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/gcc/reload1.c b/gcc/reload1.c
index 210b007..8ce042f 100644
--- a/gcc/reload1.c
+++ b/gcc/reload1.c
@@ -123,6 +123,10 @@ rtx *reg_equiv_address;
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;
@@ -703,6 +707,7 @@ reload (rtx first, int global)
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);
reg_max_ref_width = XCNEWVEC (unsigned int, max_regno);
reg_old_renumber = XCNEWVEC (short, max_regno);
@@ -1260,6 +1265,11 @@ reload (rtx first, int global)
if (offsets_at)
free (offsets_at);
+ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
+ if (reg_equiv_alt_mem_list[i])
+ free_EXPR_LIST_list (&reg_equiv_alt_mem_list[i]);
+ free (reg_equiv_alt_mem_list);
+
free (reg_equiv_mem);
reg_equiv_init = 0;
free (reg_equiv_address);
@@ -7849,6 +7859,11 @@ delete_output_reload (rtx insn, int j, int last_reload_reg)
n_occurrences += count_occurrences (PATTERN (insn),
eliminate_regs (substed, 0,
NULL_RTX), 0);
+ 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);
+ }
if (n_occurrences > n_inherited)
return;