aboutsummaryrefslogtreecommitdiff
path: root/gcc/lra-constraints.c
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2012-11-01 19:02:40 +0000
committerVladimir Makarov <vmakarov@gcc.gnu.org>2012-11-01 19:02:40 +0000
commit6cd1dd26753a93d9916335a6f698857915d273c2 (patch)
tree425cf64a79a53b2e6a02bc6d55115af879f51789 /gcc/lra-constraints.c
parenteb1325a42d54328fba8dc5af0346ef9cdafbeef0 (diff)
downloadgcc-6cd1dd26753a93d9916335a6f698857915d273c2.zip
gcc-6cd1dd26753a93d9916335a6f698857915d273c2.tar.gz
gcc-6cd1dd26753a93d9916335a6f698857915d273c2.tar.bz2
re PR middle-end/55150 (Crash in copy_rtx)
2012-11-01 Vladimir Makarov <vmakarov@redhat.com> PR middle-end/55150 * lra-constraints.c (lra_constraints): Check only pseudos with equivalences. Add insns with equivalence pseudos. 2012-11-01 Vladimir Makarov <vmakarov@redhat.com> PR middle-end/55150 * gcc.dg/pr55150.c: Rename to gcc.dg/pr55150-1.c. * gcc.dg/pr55150-2.c: New test. From-SVN: r193065
Diffstat (limited to 'gcc/lra-constraints.c')
-rw-r--r--gcc/lra-constraints.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
index cd0325b..afc49d7 100644
--- a/gcc/lra-constraints.c
+++ b/gcc/lra-constraints.c
@@ -3244,9 +3244,11 @@ lra_constraints (bool first_p)
{
bool changed_p;
int i, hard_regno, new_insns_num;
- unsigned int min_len, new_min_len;
- rtx set, x, dest_reg;
+ unsigned int min_len, new_min_len, uid;
+ rtx set, x, reg, dest_reg;
basic_block last_bb;
+ bitmap_head equiv_insn_bitmap;
+ bitmap_iterator bi;
lra_constraint_iter++;
if (lra_dump_file != NULL)
@@ -3261,10 +3263,12 @@ lra_constraints (bool first_p)
lra_risky_transformations_p = false;
new_insn_uid_start = get_max_uid ();
new_regno_start = first_p ? lra_constraint_new_regno_start : max_reg_num ();
+ bitmap_initialize (&equiv_insn_bitmap, &reg_obstack);
for (i = FIRST_PSEUDO_REGISTER; i < new_regno_start; i++)
if (lra_reg_info[i].nrefs != 0)
{
ira_reg_equiv[i].profitable_p = true;
+ reg = regno_reg_rtx[i];
if ((hard_regno = lra_get_regno_hard_regno (i)) >= 0)
{
int j, nregs = hard_regno_nregs[hard_regno][PSEUDO_REGNO_MODE (i)];
@@ -3272,7 +3276,7 @@ lra_constraints (bool first_p)
for (j = 0; j < nregs; j++)
df_set_regs_ever_live (hard_regno + j, true);
}
- else if ((x = get_equiv_substitution (regno_reg_rtx[i])) != NULL_RTX)
+ else if ((x = get_equiv_substitution (reg)) != reg)
{
bool pseudo_p = contains_reg_p (x, false, false);
rtx set, insn;
@@ -3310,8 +3314,15 @@ lra_constraints (bool first_p)
ira_reg_equiv[i].defined_p = false;
if (contains_reg_p (x, false, true))
ira_reg_equiv[i].profitable_p = false;
+ if (get_equiv_substitution (reg) != reg)
+ bitmap_ior_into (&equiv_insn_bitmap, &lra_reg_info[i].insn_bitmap);
}
}
+ /* We should add all insns containing pseudos which should be
+ substituted by their equivalences. */
+ EXECUTE_IF_SET_IN_BITMAP (&equiv_insn_bitmap, 0, uid, bi)
+ lra_push_insn_by_uid (uid);
+ bitmap_clear (&equiv_insn_bitmap);
lra_eliminate (false);
min_len = lra_insn_stack_length ();
new_insns_num = 0;