aboutsummaryrefslogtreecommitdiff
path: root/gcc/function.c
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2002-02-14 19:27:21 +0000
committerAlexandre Oliva <aoliva@gcc.gnu.org>2002-02-14 19:27:21 +0000
commit4606272bc4fd9daccd4723530a650822a8527671 (patch)
treee36f8b6bc6513154e4262e917071e6980c5fc8e0 /gcc/function.c
parent0b46224d2bb618a97a700e985cedb42d25039d96 (diff)
downloadgcc-4606272bc4fd9daccd4723530a650822a8527671.zip
gcc-4606272bc4fd9daccd4723530a650822a8527671.tar.gz
gcc-4606272bc4fd9daccd4723530a650822a8527671.tar.bz2
function.c (assign_parms): Demote promoted argument passed by transparent reference.
* function.c (assign_parms): Demote promoted argument passed by transparent reference. From-SVN: r49774
Diffstat (limited to 'gcc/function.c')
-rw-r--r--gcc/function.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/gcc/function.c b/gcc/function.c
index d304b30..634e74b 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -4749,13 +4749,15 @@ assign_parms (fndecl)
/* If we were passed a pointer but the actual value
can safely live in a register, put it in one. */
if (passed_pointer && TYPE_MODE (TREE_TYPE (parm)) != BLKmode
- && ! ((! optimize
- && ! DECL_REGISTER (parm))
- || TREE_SIDE_EFFECTS (parm)
- /* If -ffloat-store specified, don't put explicit
- float variables into registers. */
- || (flag_float_store
- && TREE_CODE (TREE_TYPE (parm)) == REAL_TYPE)))
+ /* If by-reference argument was promoted, demote it. */
+ && (TYPE_MODE (TREE_TYPE (parm)) != GET_MODE (DECL_RTL (parm))
+ || ! ((! optimize
+ && ! DECL_REGISTER (parm))
+ || TREE_SIDE_EFFECTS (parm)
+ /* If -ffloat-store specified, don't put explicit
+ float variables into registers. */
+ || (flag_float_store
+ && TREE_CODE (TREE_TYPE (parm)) == REAL_TYPE))))
{
/* We can't use nominal_mode, because it will have been set to
Pmode above. We must use the actual mode of the parm. */