OSDN Git Service

Fix gen_nop_type abort
authorbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 5 Aug 2001 16:44:38 +0000 (16:44 +0000)
committerbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 5 Aug 2001 16:44:38 +0000 (16:44 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@44647 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/ia64/ia64.c

index 5cd75a5..f81f01d 100644 (file)
@@ -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
index 0b51613..8ff1c8f 100644 (file)
@@ -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)
     {