diff options
author | Alexandre Oliva <aoliva@redhat.com> | 2006-08-17 08:55:02 +0000 |
---|---|---|
committer | Alexandre Oliva <aoliva@gcc.gnu.org> | 2006-08-17 08:55:02 +0000 |
commit | 3f1e3e7010cf18ef218f107015b8f66fc75ed4d9 (patch) | |
tree | 5846cb80d97c878963127f9d3c488c23dfc9286c /gcc/reload1.c | |
parent | d3b30e42b73d0a369046e53fcdbe69517c0195be (diff) | |
download | gcc-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.c | 15 |
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 (®_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; |