diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1994-02-12 12:29:24 -0500 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1994-02-12 12:29:24 -0500 |
commit | ebef2728229324d5818fbf958cf14c77e5e61921 (patch) | |
tree | 20fe87ef01d28a66b3f6ad70cdbee70fb8c1fae4 /gcc | |
parent | 99360286e576de3a3e03d52fe1d8d5656d75cdcc (diff) | |
download | gcc-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.c | 14 |
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) |