aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2013-01-18 18:14:52 +0000
committerVladimir Makarov <vmakarov@gcc.gnu.org>2013-01-18 18:14:52 +0000
commit66aa7879c87e4ecc9f99509c517afa0b4401f0c4 (patch)
tree7308d5c9506147515f2396d2adb371c25f8a0b2f
parent3f0fee7b4d54d49364a47021c7d2dd9bd4c84c73 (diff)
downloadgcc-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
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/lra-constraints.c48
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr55433.c12
4 files changed, 55 insertions, 18 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6ba1e86..2be4cf3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+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 Jakub Jelinek <jakub@redhat.com>
PR middle-end/56015
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");
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 13eb611..c2098a4 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2013-01-18 Vladimir Makarov <vmakarov@redhat.com>
+
+ PR target/55433
+ * gcc.target/i386/pr55433.c: New.
+
2013-01-18 Jakub Jelinek <jakub@redhat.com>
PR middle-end/56015
diff --git a/gcc/testsuite/gcc.target/i386/pr55433.c b/gcc/testsuite/gcc.target/i386/pr55433.c
new file mode 100644
index 0000000..b79b16d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr55433.c
@@ -0,0 +1,12 @@
+/* { dg-do compile {target { *-*-darwin* } } } */
+/* { dg-options "-O1 -m32" } */
+
+typedef unsigned long long tick_t;
+extern int foo(void);
+extern tick_t tick(void);
+double test(void) {
+ struct { tick_t ticks; } st;
+ st.ticks = tick();
+ foo();
+ return (double)st.ticks;
+}