diff options
author | Vladimir Makarov <vmakarov@redhat.com> | 2013-11-20 20:32:57 +0000 |
---|---|---|
committer | Vladimir Makarov <vmakarov@gcc.gnu.org> | 2013-11-20 20:32:57 +0000 |
commit | a2d0d374f69a87cde1a18bbcf197ff45168764fa (patch) | |
tree | 438f88188d619344b0bd8235fbee7824d4eb962e /gcc/lra.c | |
parent | 1fef36449e233448605e7812f4e2874baf05ce53 (diff) | |
download | gcc-a2d0d374f69a87cde1a18bbcf197ff45168764fa.zip gcc-a2d0d374f69a87cde1a18bbcf197ff45168764fa.tar.gz gcc-a2d0d374f69a87cde1a18bbcf197ff45168764fa.tar.bz2 |
re PR rtl-optimization/59133 (ICE after r204219 on SPEC2006 435.gromacs.)
2013-11-20 Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/59133
* lra.c (expand_reg_data): Add new argument. Set up ALL_REGS for
new pseudos.
(lra_create_new_reg_with_unique_value): Pass new argument value.
(lra_emit_add, lra_emit_move): Ditto.
* lra-constraints.c (in_class_p): Add check for move for a new
insn.
(change_class): Rename to lra_change_class. Move to lra-int.h.
(get_reload_reg, narrow_reload_pseudo_class): Adjust calls of
change_class.
(process_addr_reg, process_addr): Ditto.
(curr_insn_transform): Ditto. Add check on old pseudo for
optional reload.
* lra-int.h (lra_get_regno_hard_regno): Move below.
(lra_change_class): Renamed change_class from lra.c.
2013-11-20 Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/59133
* gcc.target/i386/pr59133.c: New.
From-SVN: r205141
Diffstat (limited to 'gcc/lra.c')
-rw-r--r-- | gcc/lra.c | 10 |
1 files changed, 6 insertions, 4 deletions
@@ -130,11 +130,13 @@ static void invalidate_insn_data_regno_info (lra_insn_recog_data_t, rtx, int); /* Expand all regno related info needed for LRA. */ static void -expand_reg_data (void) +expand_reg_data (int old) { resize_reg_info (); expand_reg_info (); ira_expand_reg_equiv (); + for (int i = (int) max_reg_num () - 1; i >= old; i--) + lra_change_class (i, ALL_REGS, " Set", true); } /* Create and return a new reg of ORIGINAL mode. If ORIGINAL is NULL @@ -178,7 +180,7 @@ lra_create_new_reg_with_unique_value (enum machine_mode md_mode, rtx original, title, REGNO (new_reg)); fprintf (lra_dump_file, "\n"); } - expand_reg_data (); + expand_reg_data (max_reg_num ()); setup_reg_classes (REGNO (new_reg), rclass, NO_REGS, rclass); return new_reg; } @@ -417,7 +419,7 @@ lra_emit_add (rtx x, rtx y, rtx z) /* Functions emit_... can create pseudos -- so expand the pseudo data. */ if (old != max_reg_num ()) - expand_reg_data (); + expand_reg_data (old); } /* The number of emitted reload insns so far. */ @@ -443,7 +445,7 @@ lra_emit_move (rtx x, rtx y) /* Function emit_move can create pseudos -- so expand the pseudo data. */ if (old != max_reg_num ()) - expand_reg_data (); + expand_reg_data (old); return; } lra_emit_add (x, XEXP (y, 0), XEXP (y, 1)); |