summaryrefslogtreecommitdiff
path: root/gcc/sel-sched-ir.c
diff options
context:
space:
mode:
authorAndrey Belevantsev <abel@ispras.ru>2016-03-15 18:13:29 +0300
committerAndrey Belevantsev <abel@gcc.gnu.org>2016-03-15 18:13:29 +0300
commit74ea9ab61bdbc4f34222e0bd0b351ed1a48d46a2 (patch)
tree8017fc5d458182e7092f7583bc919e33353ec025 /gcc/sel-sched-ir.c
parent045d50559b3c9e0a01044084cec13a4fef11c6d9 (diff)
re PR target/64411 (ICE: in verify_target_availability, at sel-sched.c:1577 with -Os -mcmodel=medium -fPIC -fschedule-insns -fselective-scheduling)
gcc/ PR target/64411 * sched-deps.c (get_implicit_reg_pending_clobbers): New function, factored out from ... (sched_analyze_insn): ... here. * sched-int.h (get_implicit_reg_pending_clobbers): Declare it. * sel-sched-ir.c (setup_id_implicit_regs): New function, use get_implicit_reg_pending_clobbers in it. (setup_id_reg_sets): Use setup_id_implicit_regs. (deps_init_id): Ditto. testsuite/ PR target/64411 * gcc.target/i386/pr64411.C: New test. From-SVN: r234216
Diffstat (limited to 'gcc/sel-sched-ir.c')
-rw-r--r--gcc/sel-sched-ir.c26
1 files changed, 22 insertions, 4 deletions
diff --git a/gcc/sel-sched-ir.c b/gcc/sel-sched-ir.c
index d6c86b86bf2..5cb36dfbef1 100644
--- a/gcc/sel-sched-ir.c
+++ b/gcc/sel-sched-ir.c
@@ -2650,6 +2650,23 @@ maybe_downgrade_id_to_use (idata_t id, insn_t insn)
IDATA_TYPE (id) = USE;
}
+/* Setup implicit register clobbers calculated by sched-deps for INSN
+ before reload and save them in ID. */
+static void
+setup_id_implicit_regs (idata_t id, insn_t insn)
+{
+ if (reload_completed)
+ return;
+
+ HARD_REG_SET temp;
+ unsigned regno;
+ hard_reg_set_iterator hrsi;
+
+ get_implicit_reg_pending_clobbers (&temp, insn);
+ EXECUTE_IF_SET_IN_HARD_REG_SET (temp, 0, regno, hrsi)
+ SET_REGNO_REG_SET (IDATA_REG_SETS (id), regno);
+}
+
/* Setup register sets describing INSN in ID. */
static void
setup_id_reg_sets (idata_t id, insn_t insn)
@@ -2704,6 +2721,9 @@ setup_id_reg_sets (idata_t id, insn_t insn)
}
}
+ /* Also get implicit reg clobbers from sched-deps. */
+ setup_id_implicit_regs (id, insn);
+
return_regset_to_pool (tmp);
}
@@ -2735,20 +2755,18 @@ deps_init_id (idata_t id, insn_t insn, bool force_unique_p)
deps_init_id_data.force_use_p = false;
init_deps (dc, false);
-
memcpy (&deps_init_id_sched_deps_info,
&const_deps_init_id_sched_deps_info,
sizeof (deps_init_id_sched_deps_info));
-
if (spec_info != NULL)
deps_init_id_sched_deps_info.generate_spec_deps = 1;
-
sched_deps_info = &deps_init_id_sched_deps_info;
deps_analyze_insn (dc, insn);
+ /* Implicit reg clobbers received from sched-deps separately. */
+ setup_id_implicit_regs (id, insn);
free_deps (dc);
-
deps_init_id_data.id = NULL;
}