diff options
author | Vladimir Makarov <vmakarov@redhat.com> | 2013-01-18 18:14:52 +0000 |
---|---|---|
committer | Vladimir Makarov <vmakarov@gcc.gnu.org> | 2013-01-18 18:14:52 +0000 |
commit | 66aa7879c87e4ecc9f99509c517afa0b4401f0c4 (patch) | |
tree | 7308d5c9506147515f2396d2adb371c25f8a0b2f /gcc/lra-constraints.c | |
parent | 3f0fee7b4d54d49364a47021c7d2dd9bd4c84c73 (diff) | |
download | gcc-66aa7879c87e4ecc9f99509c517afa0b4401f0c4.zip gcc-66aa7879c87e4ecc9f99509c517afa0b4401f0c4.tar.gz gcc-66aa7879c87e4ecc9f99509c517afa0b4401f0c4.tar.bz2 |
re PR target/55433 ([LRA] ICE on excessive reloads)
2013-01-18 Vladimir Makarov <vmakarov@redhat.com>
PR target/55433
* lra-constraints.c (curr_insn_transform): Reuse original insn for
secondary memory move.
(inherit_reload_reg): Use rclass instead of cl for
check_secondary_memory_needed_p.
2013-01-18 Vladimir Makarov <vmakarov@redhat.com>
PR target/55433
* gcc.target/i386/pr55433.c: New.
From-SVN: r195302
Diffstat (limited to 'gcc/lra-constraints.c')
-rw-r--r-- | gcc/lra-constraints.c | 48 |
1 files changed, 30 insertions, 18 deletions
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c index 334e95b..f13f372 100644 --- a/gcc/lra-constraints.c +++ b/gcc/lra-constraints.c @@ -2791,30 +2791,42 @@ curr_insn_transform (void) if (use_sec_mem_p) { - rtx new_reg, set, src, dest; - enum machine_mode sec_mode; + rtx new_reg, src, dest, rld, rld_subst; + enum machine_mode sec_mode, rld_mode; lra_assert (sec_mem_p); - set = single_set (curr_insn); - lra_assert (set != NULL_RTX && ! side_effects_p (set)); - dest = SET_DEST (set); - src = SET_SRC (set); + lra_assert (curr_static_id->operand[0].type == OP_OUT + && curr_static_id->operand[1].type == OP_IN); + dest = *curr_id->operand_loc[0]; + src = *curr_id->operand_loc[1]; + rld = (GET_MODE_SIZE (GET_MODE (dest)) <= GET_MODE_SIZE (GET_MODE (src)) + ? dest : src); + rld_mode = GET_MODE (rld); #ifdef SECONDARY_MEMORY_NEEDED_MODE - sec_mode = SECONDARY_MEMORY_NEEDED_MODE (GET_MODE (src)); + sec_mode = SECONDARY_MEMORY_NEEDED_MODE (rld_mode); #else - sec_mode = GET_MODE (src); + sec_mode = rld_mode; #endif new_reg = lra_create_new_reg (sec_mode, NULL_RTX, NO_REGS, "secondary"); /* If the mode is changed, it should be wider. */ - lra_assert (GET_MODE_SIZE (GET_MODE (new_reg)) - >= GET_MODE_SIZE (GET_MODE (src))); - after = emit_spill_move (false, new_reg, dest); - lra_process_new_insns (curr_insn, NULL_RTX, after, - "Inserting the sec. move"); - before = emit_spill_move (true, new_reg, src); - lra_process_new_insns (curr_insn, before, NULL_RTX, "Changing on"); - lra_set_insn_deleted (curr_insn); + lra_assert (GET_MODE_SIZE (sec_mode) >= GET_MODE_SIZE (rld_mode)); + rld_subst = (sec_mode == rld_mode ? new_reg : gen_lowpart_SUBREG (rld_mode, new_reg)); + if (dest == rld) + { + *curr_id->operand_loc[0] = rld_subst; + after = emit_spill_move (false, new_reg, dest); + lra_process_new_insns (curr_insn, NULL_RTX, after, + "Inserting the sec. move"); + } + else + { + *curr_id->operand_loc[1] = rld_subst; + before = emit_spill_move (true, new_reg, src); + lra_process_new_insns (curr_insn, before, NULL_RTX, + "Inserting the sec. move"); + } + lra_update_insn_regno_info (curr_insn); return true; } #endif @@ -3801,7 +3813,7 @@ inherit_reload_reg (bool def_p, int original_regno, rclass = cl; } - if (check_secondary_memory_needed_p (cl, next_usage_insns)) + if (check_secondary_memory_needed_p (rclass, next_usage_insns)) { /* Reject inheritance resulting in secondary memory moves. Otherwise, there is a danger in LRA cycling. Also such @@ -3820,7 +3832,7 @@ inherit_reload_reg (bool def_p, int original_regno, " Rejecting inheritance for insn %d(%s)<-%d(%s) " "as secondary mem is needed\n", REGNO (dest), reg_class_names[get_reg_class (REGNO (dest))], - original_regno, reg_class_names[cl]); + original_regno, reg_class_names[rclass]); fprintf (lra_dump_file, " >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"); } |