re PR target/15653 (Gcc 3.4 ICE on valid code)
authorVladimir Makarov <vmakarov@redhat.com>
Thu, 10 Jun 2004 21:06:07 +0000 (21:06 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Thu, 10 Jun 2004 21:06:07 +0000 (21:06 +0000)
2004-06-10  Vladimir Makarov  <vmakarov@redhat.com>

PR target/15653
* haifa-sched.c (schedule_block): Finish cycle after issuing asm
insn.

From-SVN: r82942

gcc/ChangeLog
gcc/haifa-sched.c

index 7bd6609729522b406df6f3944172a51285669c4f..6a1b4db0d09406b96a2fa6022248f97a0275dac9 100644 (file)
@@ -1,3 +1,9 @@
+2004-06-10  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR target/15653
+       * haifa-sched.c (schedule_block): Finish cycle after issuing asm
+       insn.
+
 2004-06-10  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
 
        PR web/15263
index af8b8a7015719a49f5664f63648c7a7240f3e6a9..033aaae17579c0e2d81ff767ca960b3cca8f7da1 100644 (file)
@@ -2378,6 +2378,7 @@ schedule_block (int b, int rgn_n_insns)
        {
          rtx insn;
          int cost;
+         bool asm_p = false;
 
          if (sched_verbose >= 2)
            {
@@ -2435,9 +2436,9 @@ schedule_block (int b, int rgn_n_insns)
              memcpy (temp_state, curr_state, dfa_state_size);
              if (recog_memoized (insn) < 0)
                {
-                 if (!first_cycle_insn_p
-                     && (GET_CODE (PATTERN (insn)) == ASM_INPUT
-                         || asm_noperands (PATTERN (insn)) >= 0))
+                 asm_p = (GET_CODE (PATTERN (insn)) == ASM_INPUT
+                          || asm_noperands (PATTERN (insn)) >= 0);
+                 if (!first_cycle_insn_p && asm_p)
                    /* This is asm insn which is tryed to be issued on the
                       cycle not first.  Issue it on the next cycle.  */
                    cost = 1;
@@ -2552,6 +2553,10 @@ schedule_block (int b, int rgn_n_insns)
            can_issue_more--;
 
          advance = schedule_insn (insn, &ready, clock_var);
+
+         /* After issuing an asm insn we should start a new cycle.  */
+         if (advance == 0 && asm_p)
+           advance = 1;
          if (advance != 0)
            break;