aboutsummaryrefslogtreecommitdiff
path: root/gcc/lra.c
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2013-11-20 20:32:57 +0000
committerVladimir Makarov <vmakarov@gcc.gnu.org>2013-11-20 20:32:57 +0000
commita2d0d374f69a87cde1a18bbcf197ff45168764fa (patch)
tree438f88188d619344b0bd8235fbee7824d4eb962e /gcc/lra.c
parent1fef36449e233448605e7812f4e2874baf05ce53 (diff)
downloadgcc-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.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/gcc/lra.c b/gcc/lra.c
index ff89342..f4791a2 100644
--- a/gcc/lra.c
+++ b/gcc/lra.c
@@ -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));