aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorBernd Schmidt <bernds@redhat.com>2001-08-05 16:44:38 +0000
committerBernd Schmidt <bernds@gcc.gnu.org>2001-08-05 16:44:38 +0000
commit1ad72cef6d4385100a927336c7ccd042b59edf4b (patch)
tree499d2f78fbf0cf915ed24453ea8594b71b11a9d7 /gcc
parent703cf2116b305e872abdc5728e6034af629817bf (diff)
downloadgcc-1ad72cef6d4385100a927336c7ccd042b59edf4b.zip
gcc-1ad72cef6d4385100a927336c7ccd042b59edf4b.tar.gz
gcc-1ad72cef6d4385100a927336c7ccd042b59edf4b.tar.bz2
Fix gen_nop_type abort
From-SVN: r44647
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog3
-rw-r--r--gcc/config/ia64/ia64.c46
2 files changed, 35 insertions, 14 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5cd75a5..f81f01d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -12,6 +12,9 @@
(do_spill, do_restore): Use it to add REG_INC note.
* config/ia64/ia64.md (movti_internal): Add REG_INC notes as needed.
+ * config/ia64/ia64.c (ia64_sched_reorder): Defer scheduling of
+ asms if other insns are available.
+
2001-08-04 Hans-Peter Nilsson <hp@bitrange.com>
* config/sh/sh.c (sh_asm_named_section): Fix typo in align
diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c
index 0b51613..8ff1c8f 100644
--- a/gcc/config/ia64/ia64.c
+++ b/gcc/config/ia64/ia64.c
@@ -5982,10 +5982,10 @@ ia64_sched_reorder (dump, sched_verbose, ready, pn_ready,
int *pn_ready;
int reorder_type, clock_var;
{
+ int n_asms;
int n_ready = *pn_ready;
rtx *e_ready = ready + n_ready;
rtx *insnp;
- rtx highest;
if (sched_verbose)
{
@@ -6029,7 +6029,7 @@ ia64_sched_reorder (dump, sched_verbose, ready, pn_ready,
maybe_rotate (sched_verbose ? dump : NULL);
/* First, move all USEs, CLOBBERs and other crud out of the way. */
- highest = ready[n_ready - 1];
+ n_asms = 0;
for (insnp = ready; insnp < e_ready; insnp++)
if (insnp < e_ready)
{
@@ -6037,24 +6037,42 @@ ia64_sched_reorder (dump, sched_verbose, ready, pn_ready,
enum attr_type t = ia64_safe_type (insn);
if (t == TYPE_UNKNOWN)
{
- highest = ready[n_ready - 1];
- ready[n_ready - 1] = insn;
- *insnp = highest;
- if (ia64_final_schedule && group_barrier_needed_p (insn))
+ if (GET_CODE (PATTERN (insn)) == ASM_INPUT
+ || asm_noperands (PATTERN (insn)) >= 0)
{
- schedule_stop (sched_verbose ? dump : NULL);
- sched_data.last_was_stop = 1;
- maybe_rotate (sched_verbose ? dump : NULL);
+ rtx lowest = ready[0];
+ ready[0] = insn;
+ *insnp = lowest;
+ n_asms++;
}
- else if (GET_CODE (PATTERN (insn)) == ASM_INPUT
- || asm_noperands (PATTERN (insn)) >= 0)
+ else
{
- /* It must be an asm of some kind. */
- cycle_end_fill_slots (sched_verbose ? dump : NULL);
+ rtx highest = ready[n_ready - 1];
+ ready[n_ready - 1] = insn;
+ *insnp = highest;
+ if (ia64_final_schedule && group_barrier_needed_p (insn))
+ {
+ schedule_stop (sched_verbose ? dump : NULL);
+ sched_data.last_was_stop = 1;
+ maybe_rotate (sched_verbose ? dump : NULL);
+ }
+
+ return 1;
}
- return 1;
}
}
+ if (n_asms < n_ready)
+ {
+ /* Some normal insns to process. Skip the asms. */
+ ready += n_asms;
+ n_ready -= n_asms;
+ }
+ else if (n_ready > 0)
+ {
+ /* Only asm insns left. */
+ cycle_end_fill_slots (sched_verbose ? dump : NULL);
+ return 1;
+ }
if (ia64_final_schedule)
{