diff options
author | Bernd Schmidt <bernds@redhat.com> | 2001-08-05 16:44:38 +0000 |
---|---|---|
committer | Bernd Schmidt <bernds@gcc.gnu.org> | 2001-08-05 16:44:38 +0000 |
commit | 1ad72cef6d4385100a927336c7ccd042b59edf4b (patch) | |
tree | 499d2f78fbf0cf915ed24453ea8594b71b11a9d7 /gcc | |
parent | 703cf2116b305e872abdc5728e6034af629817bf (diff) | |
download | gcc-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/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/config/ia64/ia64.c | 46 |
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) { |