diff options
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/function.c | 16 |
2 files changed, 14 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 63b4edd..e23395e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2002-02-14 Alexandre Oliva <aoliva@redhat.com> + + * function.c (assign_parms): Demote promoted argument passed by + transparent reference. + 2001-02-14 Joel Sherrill <joel@OARcorp.com> * config/arm/rtems-elf.h, config/h8300/rtems.h: Removed redundant 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. */ |