OSDN Git Service

* reorg.c (find_end_label): If a suitable RETURN insn exists at
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 16 Aug 1993 00:16:56 +0000 (00:16 +0000)
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 16 Aug 1993 00:16:56 +0000 (00:16 +0000)
        the end of the current function, place a label in front of it
        for the end_of_function_label.

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

gcc/reorg.c

index 12fe836..9806216 100644 (file)
@@ -738,8 +738,26 @@ find_end_label ()
                 || GET_CODE (PATTERN (insn)) == CLOBBER)))
     insn = PREV_INSN (insn);
 
-  if (GET_CODE (insn) == CODE_LABEL)
-   end_of_function_label = insn;
+  /* When a target threads its epilogue we might already have a 
+     suitable return insn.  If so put a label before it for the
+     end_of_function_label.  */
+  if (GET_CODE (insn) == BARRIER
+      && GET_CODE (PREV_INSN (insn)) == JUMP_INSN
+      && GET_CODE (PATTERN (PREV_INSN (insn))) == RETURN)
+    {
+      rtx temp = PREV_INSN (PREV_INSN (insn));
+      end_of_function_label = gen_label_rtx ();
+      LABEL_NUSES (end_of_function_label) = 0;
+
+      /* Put the label before an USE insns that may proceed the RETURN insn. */
+      while (GET_CODE (temp) == USE)
+       temp = PREV_INSN (temp);
+
+      emit_label_after (end_of_function_label, temp);
+    }
+
+  else if (GET_CODE (insn) == CODE_LABEL)
+    end_of_function_label = insn;
   else
     {
       /* Otherwise, make a new label and emit a RETURN and BARRIER,