From 5c8e61cfa26622b1aa1058e61ba68acfdc038dfa Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Wed, 3 Jan 2018 07:19:04 +0000 Subject: poly_int: struct_value_size This patch makes calls.c treat struct_value_size (one of the operands to a call pattern) as polynomial. 2018-01-03 Richard Sandiford Alan Hayward David Sherwood gcc/ * calls.c (emit_call_1, expand_call): Change struct_value_size from a HOST_WIDE_INT to a poly_int64. Co-Authored-By: Alan Hayward Co-Authored-By: David Sherwood From-SVN: r256162 --- gcc/ChangeLog | 7 +++++++ gcc/calls.c | 12 +++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4fb5f44..3f3f0dc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -2,6 +2,13 @@ Alan Hayward David Sherwood + * calls.c (emit_call_1, expand_call): Change struct_value_size from + a HOST_WIDE_INT to a poly_int64. + +2018-01-03 Richard Sandiford + Alan Hayward + David Sherwood + * calls.c (load_register_parameters): Cope with polynomial mode sizes. Require a constant size for BLKmode parameters that aren't described by a PARALLEL. If BLOCK_REG_PADDING diff --git a/gcc/calls.c b/gcc/calls.c index 916ef74..5a0d663 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -378,7 +378,7 @@ emit_call_1 (rtx funexp, tree fntree ATTRIBUTE_UNUSED, tree fndecl ATTRIBUTE_UNU tree funtype ATTRIBUTE_UNUSED, poly_int64 stack_size ATTRIBUTE_UNUSED, poly_int64 rounded_stack_size, - HOST_WIDE_INT struct_value_size ATTRIBUTE_UNUSED, + poly_int64 struct_value_size ATTRIBUTE_UNUSED, rtx next_arg_reg ATTRIBUTE_UNUSED, rtx valreg, int old_inhibit_defer_pop, rtx call_fusage, int ecf_flags, cumulative_args_t args_so_far ATTRIBUTE_UNUSED) @@ -438,7 +438,8 @@ emit_call_1 (rtx funexp, tree fntree ATTRIBUTE_UNUSED, tree fndecl ATTRIBUTE_UNU next_arg_reg, NULL_RTX); else pat = targetm.gen_sibcall (funmem, rounded_stack_size_rtx, - next_arg_reg, GEN_INT (struct_value_size)); + next_arg_reg, + gen_int_mode (struct_value_size, Pmode)); } /* If the target has "call" or "call_value" insns, then prefer them if no arguments are actually popped. If the target does not have @@ -471,7 +472,7 @@ emit_call_1 (rtx funexp, tree fntree ATTRIBUTE_UNUSED, tree fndecl ATTRIBUTE_UNU next_arg_reg, NULL_RTX); else pat = targetm.gen_call (funmem, rounded_stack_size_rtx, next_arg_reg, - GEN_INT (struct_value_size)); + gen_int_mode (struct_value_size, Pmode)); } emit_insn (pat); @@ -3237,7 +3238,7 @@ expand_call (tree exp, rtx target, int ignore) /* Size of aggregate value wanted, or zero if none wanted or if we are using the non-reentrant PCC calling convention or expecting the value in registers. */ - HOST_WIDE_INT struct_value_size = 0; + poly_int64 struct_value_size = 0; /* Nonzero if called function returns an aggregate in memory PCC style, by returning the address of where to find it. */ int pcc_struct_value = 0; @@ -3399,7 +3400,8 @@ expand_call (tree exp, rtx target, int ignore) } #else /* not PCC_STATIC_STRUCT_RETURN */ { - struct_value_size = int_size_in_bytes (rettype); + if (!poly_int_tree_p (TYPE_SIZE_UNIT (rettype), &struct_value_size)) + struct_value_size = -1; /* Even if it is semantically safe to use the target as the return slot, it may be not sufficiently aligned for the return type. */ -- cgit v1.1