OSDN Git Service

(nonlocal_label_list): New variable.
authorwilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 21 Jul 1993 21:44:07 +0000 (21:44 +0000)
committerwilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 21 Jul 1993 21:44:07 +0000 (21:44 +0000)
(combine_instructions): Set it.
(try_combine, distribute_links): CALL_INSN terminates a basic
block if nonlocal_label_list is set.

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

gcc/combine.c

index 879f8c3..fa18f29 100644 (file)
@@ -187,6 +187,11 @@ static int subst_low_cuid;
    structures.  */
 
 static int previous_num_undos;
+
+/* This is non-zero if there exists at least one nonlocal_label in the
+   current function.  This affects how basic block structure is determined.  */
+
+static rtx nonlocal_label_list;
 \f
 /* The next group of arrays allows the recording of the last value assigned
    to (hard or pseudo) register n.  We use this information to see if a
@@ -527,6 +532,8 @@ combine_instructions (f, nregs)
 
   setup_incoming_promotions ();
 
+  nonlocal_label_list = nonlocal_label_rtx_list ();
+
   for (insn = f; insn; insn = next ? next : NEXT_INSN (insn))
     {
       next = 0;
@@ -1875,6 +1882,8 @@ try_combine (i3, i2, i1)
 
          for (insn = NEXT_INSN (i3);
               insn && GET_CODE (insn) != CODE_LABEL
+              && (GET_CODE (PREV_INSN (insn)) != CALL_INSN
+                  || nonlocal_label_list == 0)
               && GET_CODE (PREV_INSN (insn)) != JUMP_INSN;
               insn = NEXT_INSN (insn))
            {
@@ -2047,7 +2056,9 @@ try_combine (i3, i2, i1)
                      XEXP (link, 0) = i3;
 
                if (GET_CODE (insn) == CODE_LABEL
-                   || GET_CODE (insn) == JUMP_INSN)
+                   || GET_CODE (insn) == JUMP_INSN
+                   || (GET_CODE (PREV_INSN (insn)) == CALL_INSN
+                       && nonlocal_label_list != 0))
                  break;
              }
          }
@@ -10037,6 +10048,8 @@ distribute_links (links)
 
       for (insn = NEXT_INSN (XEXP (link, 0));
           (insn && GET_CODE (insn) != CODE_LABEL
+           && (GET_CODE (PREV_INSN (insn)) != CALL_INSN
+               || nonlocal_label_list == 0)
            && GET_CODE (PREV_INSN (insn)) != JUMP_INSN);
           insn = NEXT_INSN (insn))
        if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'