function.h (virtuals_instantiated): Declare.
authorDJ Delorie <dj@redhat.com>
Thu, 5 Apr 2001 20:13:53 +0000 (16:13 -0400)
committerDJ Delorie <dj@gcc.gnu.org>
Thu, 5 Apr 2001 20:13:53 +0000 (16:13 -0400)
* function.h (virtuals_instantiated): Declare.
* function.c: (virtuals_instantiated): Make global.
* calls.c (emit_library_call_value_1): Use
virtual_outgoing_args_rtx only if it hasn't been instantiated.
Otherwise, use the stack pointer directly.

From-SVN: r41127

gcc/ChangeLog
gcc/calls.c
gcc/function.c
gcc/function.h

index f40281a..25682a3 100644 (file)
@@ -1,3 +1,11 @@
+2001-04-05  DJ Delorie  <dj@redhat.com>
+
+       * function.h (virtuals_instantiated): Declare.
+       * function.c: (virtuals_instantiated): Make global.
+       * calls.c (emit_library_call_value_1): Use
+       virtual_outgoing_args_rtx only if it hasn't been instantiated.
+       Otherwise, use the stack pointer directly.
+
 Thu Apr  5 19:13:33 CEST 2001  Jan Hubicka  <jh@suse.cz>
 
        * i386.c (x86_initialize_trampoline): New global function.
index eb54aee..d0f3a14 100644 (file)
@@ -59,6 +59,10 @@ Boston, MA 02111-1307, USA.  */
 #define PUSH_ARGS_REVERSED 0
 #endif
 
+#ifndef STACK_POINTER_OFFSET
+#define STACK_POINTER_OFFSET    0
+#endif
+
 /* Like PREFERRED_STACK_BOUNDARY but in units of bytes, not bits.  */
 #define STACK_BYTES (PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT)
 
@@ -3820,11 +3824,15 @@ emit_library_call_value_1 (retval, orgfun, value, fn_type, outmode, nargs, p)
               highest_outgoing_arg_in_use - initial_highest_arg_in_use);
       needed = 0;
 
-      /* The address of the outgoing argument list must not be copied to a
-        register here, because argblock would be left pointing to the
-        wrong place after the call to allocate_dynamic_stack_space below.  */
+      /* We must be careful to use virtual regs before they're instantiated,
+         and real regs afterwards.  Loop optimization, for example, can create
+        new libcalls after we've instantiated the virtual regs, and if we
+        use virtuals anyway, they won't match the rtl patterns.  */
 
-      argblock = virtual_outgoing_args_rtx;
+      if (virtuals_instantiated)
+       argblock = plus_constant (stack_pointer_rtx, STACK_POINTER_OFFSET);
+      else
+       argblock = virtual_outgoing_args_rtx;
     }
   else
     {
index c31029b..ee18258 100644 (file)
@@ -120,8 +120,10 @@ int current_function_sp_is_unchanging;
 int current_function_uses_only_leaf_regs;
 
 /* Nonzero once virtual register instantiation has been done.
-   assign_stack_local uses frame_pointer_rtx when this is nonzero.  */
-static int virtuals_instantiated;
+   assign_stack_local uses frame_pointer_rtx when this is nonzero.
+   calls.c:emit_library_call_value_1 uses it to set up
+   post-instantiation libcalls.  */
+int virtuals_instantiated;
 
 /* These variables hold pointers to functions to create and destroy
    target specific, per-function data structures.  */
index 5621c6b..f27c2b0 100644 (file)
@@ -481,6 +481,9 @@ extern struct function *cfun;
 /* A list of all functions we have compiled so far.  */
 extern struct function *all_functions;
 
+/* Nonzero if we've already converted virtual regs to hard regs.  */
+extern int virtuals_instantiated;
+
 /* For backward compatibility... eventually these should all go away.  */
 #define current_function_name (cfun->name)
 #define current_function_pops_args (cfun->pops_args)