OSDN Git Service

1998-10-18 Herman A.J. ten Brugge <Haj.Ten.Brugge@net.HCC.nl>
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 19 Oct 1998 20:23:44 +0000 (20:23 +0000)
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 19 Oct 1998 20:23:44 +0000 (20:23 +0000)
        * reorg.c (steal_delay_list_from_target) Check for insns that
        modify the condition codes and effect the direction of the jump
        in the sequence.
Sat Oct 17 13:09:09 1998  Graham  <grahams@rcp.co.uk>
        * function.c (purge_addressof_1): Replace call to
        emit_insns_before() with emit_insn_before().

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

gcc/ChangeLog
gcc/function.c
gcc/reorg.c

index 36ce1ac..85b586d 100644 (file)
@@ -1,3 +1,14 @@
+1998-10-18 Herman A.J. ten Brugge <Haj.Ten.Brugge@net.HCC.nl>
+
+       * reorg.c (steal_delay_list_from_target) Check for insns that
+       modify the condition codes and effect the direction of the jump
+       in the sequence.
+
+Sat Oct 17 13:09:09 1998  Graham  <grahams@rcp.co.uk>
+
+       * function.c (purge_addressof_1): Replace call to
+        emit_insns_before() with emit_insn_before().
+
 Mon Oct 19 19:34:03 1998  Mike Stump <mrs@wrs.com>
 
        * libgcc2.c (__pure_virtual): Call __terminate instead of _exit.
index 148acc0..e7f6afa 100644 (file)
@@ -2860,7 +2860,7 @@ purge_addressof_1 (loc, insn, force, store)
 
       insns = gen_sequence ();
       end_sequence ();
-      emit_insns_before (insns, insn);
+      emit_insn_before (insns, insn);
       return;
     }
   else if (code == MEM && GET_CODE (XEXP (x, 0)) == ADDRESSOF && ! force)
index c93f49e..9400615 100644 (file)
@@ -61,6 +61,10 @@ Boston, MA 02111-1307, USA.  */
    we can hoist insns from the fall-through path for forward branches or
    steal insns from the target of backward branches.
 
+   The TMS320C3x and C4x have three branch delay slots.  When the three
+   slots are filled, the branch penalty is zero.  Most insns can fill the
+   delay slots except jump insns.
+
    Three techniques for filling delay slots have been implemented so far:
 
    (1) `fill_simple_delay_slots' is the simplest, most efficient way
@@ -1687,6 +1691,7 @@ steal_delay_list_from_target (insn, condition, seq, delay_list,
   int must_annul = *pannul_p;
   int i;
   int used_annul = 0;
+  struct resources cc_set;
 
   /* We can't do anything if there are more delay slots in SEQ than we
      can handle, or if we don't know that it will be a taken branch.
@@ -1696,7 +1701,23 @@ steal_delay_list_from_target (insn, condition, seq, delay_list,
      Also, exit if the branch has more than one set, since then it is computing
      other results that can't be ignored, e.g. the HPPA mov&branch instruction.
      ??? It may be possible to move other sets into INSN in addition to
-     moving the instructions in the delay slots.  */
+     moving the instructions in the delay slots.
+
+     We can not steal the delay list if one of the instructions in the
+     current delay_list modifies the condition codes and the jump in the 
+     sequence is a conditional jump. We can not do this because we can
+     not change the direction of the jump because the condition codes
+     will effect the direction of the jump in the sequence. */
+
+  CLEAR_RESOURCE (&cc_set);
+  for (temp = delay_list; temp; temp = XEXP (temp, 1))
+    {
+      rtx trial = XEXP (temp, 0);
+
+      mark_set_resources (trial, &cc_set, 0, 1);
+      if (insn_references_resource_p (XVECEXP (seq , 0, 0), &cc_set, 0))
+        return delay_list;
+    }
 
   if (XVECLEN (seq, 0) - 1 > slots_remaining
       || ! condition_dominates_p (condition, XVECEXP (seq, 0, 0))
@@ -3716,8 +3737,6 @@ fill_slots_from_thread (insn, condition, thread, opposite_thread, likely,
 
                  delay_list = add_to_delay_list (temp, delay_list);
 
-                 mark_set_resources (trial, &opposite_needed, 0, 1);
-
                  if (slots_to_fill == ++(*pslots_filled))
                    {
                      /* Even though we have filled all the slots, we
@@ -3795,9 +3814,7 @@ fill_slots_from_thread (insn, condition, thread, opposite_thread, likely,
     {
       /* If this is the `true' thread, we will want to follow the jump,
         so we can only do this if we have taken everything up to here.  */
-      if (thread_if_true && trial == new_thread
-         && ! insn_references_resource_p (XVECEXP (PATTERN (trial), 0, 0),
-                                          &opposite_needed, 0))
+      if (thread_if_true && trial == new_thread)
        delay_list
          = steal_delay_list_from_target (insn, condition, PATTERN (trial),
                                          delay_list, &set, &needed,