aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1994-02-12 12:29:24 -0500
committerRichard Kenner <kenner@gcc.gnu.org>1994-02-12 12:29:24 -0500
commitebef2728229324d5818fbf958cf14c77e5e61921 (patch)
tree20fe87ef01d28a66b3f6ad70cdbee70fb8c1fae4 /gcc
parent99360286e576de3a3e03d52fe1d8d5656d75cdcc (diff)
downloadgcc-ebef2728229324d5818fbf958cf14c77e5e61921.zip
gcc-ebef2728229324d5818fbf958cf14c77e5e61921.tar.gz
gcc-ebef2728229324d5818fbf958cf14c77e5e61921.tar.bz2
(expand_call): When preserving subexpressions, don't put expensive
arguments directly into hard registers. From-SVN: r6543
Diffstat (limited to 'gcc')
-rw-r--r--gcc/calls.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/gcc/calls.c b/gcc/calls.c
index 898272d..4f3e61b 100644
--- a/gcc/calls.c
+++ b/gcc/calls.c
@@ -1,5 +1,5 @@
/* Convert function calls to rtl insns, for GNU C compiler.
- Copyright (C) 1989, 1992, 1993 Free Software Foundation, Inc.
+ Copyright (C) 1989, 1992, 1993, 1994 Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -1566,6 +1566,18 @@ expand_call (exp, target, ignore)
= convert_modes (args[i].mode,
TYPE_MODE (TREE_TYPE (args[i].tree_value)),
args[i].value, args[i].unsignedp);
+
+ /* If the value is expensive, and we are inside an appropriately
+ short loop, put the value into a pseudo and then put the pseudo
+ into the hard reg. */
+
+ if ((! (GET_CODE (args[i].value) == REG
+ || (GET_CODE (args[i].value) == SUBREG
+ && GET_CODE (SUBREG_REG (args[i].value)) == REG)))
+ && args[i].mode != BLKmode
+ && rtx_cost (args[i].value, SET) > 2
+ && preserve_subexpressions_p ())
+ args[i].value = copy_to_mode_reg (args[i].mode, args[i].value);
}
#if defined(ACCUMULATE_OUTGOING_ARGS) && defined(REG_PARM_STACK_SPACE)