ia64.c (emit_all_insn_group_barriers): Flush state at barrier insns.
authorRichard Henderson <rth@redhat.com>
Wed, 22 Aug 2001 08:18:33 +0000 (01:18 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Wed, 22 Aug 2001 08:18:33 +0000 (01:18 -0700)
        * config/ia64/ia64.c (emit_all_insn_group_barriers): Flush state
        at barrier insns.  Emit stop bits before barriers.

From-SVN: r45102

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

index 6e5858db2836511019984837950516d735f1ee25..25f0028f573d01fbbc35b7cc0331402e9373a90a 100644 (file)
@@ -1,5 +1,8 @@
 2001-08-21  Richard Henderson  <rth@redhat.com>
 
+       * config/ia64/ia64.c (emit_all_insn_group_barriers): Flush state
+       at barrier insns.  Emit stop bits before barriers.
+
        * flow.c (flow_find_cross_jump): Don't consider unconditional
        return insns for commoning.
 
index 2c539fe7616e3a7a333fb858ff3d69985f3e8cff..5cba6245ef050a4b75654f7d90a99682deddd1ae 100644 (file)
@@ -4811,13 +4811,25 @@ emit_all_insn_group_barriers (dump, insns)
 
   for (insn = insns; insn; insn = NEXT_INSN (insn))
     {
-      if (GET_CODE (insn) == INSN
-              && GET_CODE (PATTERN (insn)) == UNSPEC_VOLATILE
-              && XINT (PATTERN (insn), 1) == 2)
-       init_insn_group_barriers ();
+      if (GET_CODE (insn) == BARRIER)
+       {
+         rtx last = prev_active_insn (insn);
+
+         if (! last)
+           continue;
+         if (GET_CODE (last) == JUMP_INSN
+             && GET_CODE (PATTERN (last)) == ADDR_DIFF_VEC)
+           last = prev_active_insn (last);
+         if (recog_memoized (last) != CODE_FOR_insn_group_barrier)
+           emit_insn_after (gen_insn_group_barrier (GEN_INT (3)), last);
+
+         init_insn_group_barriers ();
+       }
       else if (INSN_P (insn))
        {
-         if (group_barrier_needed_p (insn))
+         if (recog_memoized (insn) == CODE_FOR_insn_group_barrier)
+           init_insn_group_barriers ();
+         else if (group_barrier_needed_p (insn))
            {
              emit_insn_before (gen_insn_group_barrier (GEN_INT (3)), insn);
              init_insn_group_barriers ();