OSDN Git Service

* sibcall.c (indentify_call_return_value): Find last call in the chain;
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 28 Mar 2000 21:03:37 +0000 (21:03 +0000)
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 28 Mar 2000 21:03:37 +0000 (21:03 +0000)
        Allow stack adjustment after function call.

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

gcc/ChangeLog
gcc/sibcall.c

index 41f3741..abbdd6c 100644 (file)
@@ -25,6 +25,9 @@ Tue Mar 28 11:55:48 2000  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
 
 Tue Mar 28 08:29:46 2000  Jan Hubicka  <jh@suse.cz>
 
+       * sibcall.c (indentify_call_return_value): Find last call in the chain;
+       Allow stack adjustment after function call.
+
        * regmove.c (struct csa_memlist): Make mem field rtx *.
        (record_one_stack_ref): Accept rtx * instead of rtx as parameter.
        (try_apply_stack_adjustment): Replace whole MEM rtx.
index 1a3a310..34cf5a9 100644 (file)
@@ -53,10 +53,12 @@ identify_call_return_value (cp, p_hard_return, p_soft_return)
 {
   rtx insn, set, hard, soft;
 
-  /* Search forward through the "normal" call sequence to the CALL insn.  */
   insn = XEXP (cp, 0);
-  while (GET_CODE (insn) != CALL_INSN)
+  /* Search backward through the "normal" call sequence to the CALL insn.  */
+  while (NEXT_INSN (insn))
     insn = NEXT_INSN (insn);
+  while (GET_CODE (insn) != CALL_INSN)
+    insn = PREV_INSN (insn);
 
   /* Assume the pattern is (set (dest) (call ...)), or that the first
      member of a parallel is.  This is the hard return register used
@@ -75,6 +77,11 @@ identify_call_return_value (cp, p_hard_return, p_soft_return)
   if (GET_CODE (hard) != REG)
     return 0;
     
+  /* Stack adjustment done after call may appear here.  */
+  insn = skip_stack_adjustment (insn);
+  if (! insn)
+    return 0;
+
   /* If there's nothing after, there's no soft return value.  */
   insn = NEXT_INSN (insn);
   if (! insn)