diff options
Diffstat (limited to 'gcc/combine.c')
-rw-r--r-- | gcc/combine.c | 33 |
1 files changed, 18 insertions, 15 deletions
diff --git a/gcc/combine.c b/gcc/combine.c index cc7c7de..26cdf49 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -75,6 +75,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include "coretypes.h" #include "tm.h" #include "rtl.h" +#include "tree.h" #include "tm_p.h" #include "flags.h" #include "regs.h" @@ -88,6 +89,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include "recog.h" #include "real.h" #include "toplev.h" +#include "target.h" /* It is not safe to use ordinary gen_lowpart in combine. Use gen_lowpart_for_combine instead. See comments there. */ @@ -799,30 +801,31 @@ init_reg_last_arrays (void) static void setup_incoming_promotions (void) { -#ifdef PROMOTE_FUNCTION_ARGS unsigned int regno; rtx reg; enum machine_mode mode; int unsignedp; rtx first = get_insns (); + if (targetm.calls.promote_function_args (TREE_TYPE (cfun->decl))) + { #ifndef OUTGOING_REGNO #define OUTGOING_REGNO(N) N #endif - for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++) - /* Check whether this register can hold an incoming pointer - argument. FUNCTION_ARG_REGNO_P tests outgoing register - numbers, so translate if necessary due to register windows. */ - if (FUNCTION_ARG_REGNO_P (OUTGOING_REGNO (regno)) - && (reg = promoted_input_arg (regno, &mode, &unsignedp)) != 0) - { - record_value_for_reg - (reg, first, gen_rtx_fmt_e ((unsignedp ? ZERO_EXTEND - : SIGN_EXTEND), - GET_MODE (reg), - gen_rtx_CLOBBER (mode, const0_rtx))); - } -#endif + for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++) + /* Check whether this register can hold an incoming pointer + argument. FUNCTION_ARG_REGNO_P tests outgoing register + numbers, so translate if necessary due to register windows. */ + if (FUNCTION_ARG_REGNO_P (OUTGOING_REGNO (regno)) + && (reg = promoted_input_arg (regno, &mode, &unsignedp)) != 0) + { + record_value_for_reg + (reg, first, gen_rtx_fmt_e ((unsignedp ? ZERO_EXTEND + : SIGN_EXTEND), + GET_MODE (reg), + gen_rtx_CLOBBER (mode, const0_rtx))); + } + } } /* Called via note_stores. If X is a pseudo that is narrower than |