* config/ia64/ia64.c (emit_all_insn_group_barriers): Flush state
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 22 Aug 2001 08:18:33 +0000 (08:18 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 22 Aug 2001 08:18:33 +0000 (08:18 +0000)
        at barrier insns.  Emit stop bits before barriers.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@45102 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 6e5858d..25f0028 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 2c539fe..5cba624 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 ();