* [PTX] simplify calling struct
@ 2015-12-16 13:53 Nathan Sidwell
2015-12-17 22:59 ` Bernhard Reutner-Fischer
0 siblings, 1 reply; 2+ messages in thread
From: Nathan Sidwell @ 2015-12-16 13:53 UTC (permalink / raw)
To: GCC Patches
[-- Attachment #1: Type: text/plain, Size: 363 bytes --]
PTX's machine_function structure squirrels away the function type to calculate
the presence of varadic args later, rather than calculate it immediately. It
also uses an rtx field as a boolean. This patch reorganizes it with less
verbose names and more apt types.
I also noticed that nvptx_hard_regno_mode_ok wasn't being used, so that's deleted.
nathan
[-- Attachment #2: trunk-ptx-calling.patch --]
[-- Type: text/x-patch, Size: 10027 bytes --]
2015-12-16 Nathan Sidwell <nathan@acm.org>
* config/nvptx/nvptx-protos.h (nvptx_hard_regno_mode_ok): Delete.
* config/nvptx/nvptx.h (struct machine_function):
Reimplement. Adjust all users.
* config/nvptx/nvptx.c (nvptx_declare_function_name): Move stack
and frame array generation earlier.
(nvptx_call_args): Reimplement.
(nvptx_expand_call): Adjust.
(nvptx_hard_reno_mode_ok): Delete.
(nvptx_reorg): Revert scan of hard regs.
Index: config/nvptx/nvptx-protos.h
===================================================================
--- config/nvptx/nvptx-protos.h (revision 231689)
+++ config/nvptx/nvptx-protos.h (working copy)
@@ -41,7 +41,6 @@ extern const char *nvptx_ptx_type_from_m
extern const char *nvptx_output_mov_insn (rtx, rtx);
extern const char *nvptx_output_call_insn (rtx_insn *, rtx, rtx);
extern const char *nvptx_output_return (void);
-extern bool nvptx_hard_regno_mode_ok (int, machine_mode);
extern rtx nvptx_maybe_convert_symbolic_operand (rtx);
#endif
#endif
Index: config/nvptx/nvptx.c
===================================================================
--- config/nvptx/nvptx.c (revision 231689)
+++ config/nvptx/nvptx.c (working copy)
@@ -147,7 +147,7 @@ static struct machine_function *
nvptx_init_machine_status (void)
{
struct machine_function *p = ggc_cleared_alloc<machine_function> ();
- p->ret_reg_mode = VOIDmode;
+ p->return_mode = VOIDmode;
return p;
}
@@ -487,7 +487,7 @@ nvptx_strict_argument_naming (cumulative
static rtx
nvptx_libcall_value (machine_mode mode, const_rtx)
{
- if (cfun->machine->start_call == NULL_RTX)
+ if (!cfun->machine->doing_call)
/* Pretend to return in a hard reg for early uses before pseudos can be
generated. */
return gen_rtx_REG (mode, NVPTX_RETURN_REGNUM);
@@ -506,7 +506,7 @@ nvptx_function_value (const_tree type, c
if (outgoing)
{
- cfun->machine->ret_reg_mode = mode;
+ cfun->machine->return_mode = mode;
return gen_rtx_REG (mode, NVPTX_RETURN_REGNUM);
}
@@ -678,14 +678,14 @@ write_return_type (std::stringstream &s,
optimization-level specific, so no caller can make use of
this data, but more importantly for us, we must ensure it
doesn't change the PTX prototype. */
- mode = (machine_mode) cfun->machine->ret_reg_mode;
+ mode = (machine_mode) cfun->machine->return_mode;
if (mode == VOIDmode)
return return_in_mem;
- /* Clear ret_reg_mode to inhibit copy of retval to non-existent
+ /* Clear return_mode to inhibit copy of retval to non-existent
retval parameter. */
- cfun->machine->ret_reg_mode = VOIDmode;
+ cfun->machine->return_mode = VOIDmode;
}
else
mode = promote_return (mode);
@@ -989,7 +989,18 @@ nvptx_declare_function_name (FILE *file,
fprintf (file, "%s", s.str().c_str());
- if (regno_reg_rtx[OUTGOING_STATIC_CHAIN_REGNUM] != const0_rtx)
+ /* Declare a local var for outgoing varargs. */
+ if (cfun->machine->has_varadic)
+ init_frame (file, STACK_POINTER_REGNUM,
+ UNITS_PER_WORD, crtl->outgoing_args_size);
+
+ /* Declare a local variable for the frame. */
+ HOST_WIDE_INT sz = get_frame_size ();
+ if (sz || cfun->machine->has_chain)
+ init_frame (file, FRAME_POINTER_REGNUM,
+ crtl->stack_alignment_needed / BITS_PER_UNIT, sz);
+
+ if (cfun->machine->has_chain)
fprintf (file, "\t.reg.u%d %s;\n", GET_MODE_BITSIZE (Pmode),
reg_names[OUTGOING_STATIC_CHAIN_REGNUM]);
@@ -1010,17 +1021,6 @@ nvptx_declare_function_name (FILE *file,
}
}
- /* Declare a local var for outgoing varargs. */
- if (cfun->machine->has_call_with_varargs)
- init_frame (file, STACK_POINTER_REGNUM,
- UNITS_PER_WORD, crtl->outgoing_args_size);
-
- /* Declare a local variable for the frame. */
- HOST_WIDE_INT sz = get_frame_size ();
- if (sz || cfun->machine->has_call_with_sc)
- init_frame (file, FRAME_POINTER_REGNUM,
- crtl->stack_alignment_needed / BITS_PER_UNIT, sz);
-
/* Emit axis predicates. */
if (cfun->machine->axis_predicate[0])
nvptx_init_axis_predicate (file,
@@ -1036,7 +1036,7 @@ nvptx_declare_function_name (FILE *file,
const char *
nvptx_output_return (void)
{
- machine_mode mode = (machine_mode)cfun->machine->ret_reg_mode;
+ machine_mode mode = (machine_mode)cfun->machine->return_mode;
if (mode != VOIDmode)
fprintf (asm_out_file, "\tst.param%s\t[%s_out], %s;\n",
@@ -1076,20 +1076,28 @@ nvptx_get_drap_rtx (void)
argument to the next call. */
static void
-nvptx_call_args (rtx arg, tree funtype)
+nvptx_call_args (rtx arg, tree fntype)
{
- if (cfun->machine->start_call == NULL_RTX)
+ if (!cfun->machine->doing_call)
{
- cfun->machine->call_args = NULL;
- cfun->machine->funtype = funtype;
- cfun->machine->start_call = const0_rtx;
+ cfun->machine->doing_call = true;
+ cfun->machine->is_varadic = false;
+ cfun->machine->num_args = 0;
+
+ if (fntype && stdarg_p (fntype))
+ {
+ cfun->machine->is_varadic = true;
+ cfun->machine->has_varadic = true;
+ cfun->machine->num_args++;
+ }
}
- if (arg == pc_rtx)
- return;
- rtx_expr_list *args_so_far = cfun->machine->call_args;
- if (REG_P (arg))
- cfun->machine->call_args = alloc_EXPR_LIST (VOIDmode, arg, args_so_far);
+ if (REG_P (arg) && arg != pc_rtx)
+ {
+ cfun->machine->num_args++;
+ cfun->machine->call_args = alloc_EXPR_LIST (VOIDmode, arg,
+ cfun->machine->call_args);
+ }
}
/* Implement the corresponding END_CALL_ARGS hook. Clear and free the
@@ -1098,7 +1106,7 @@ nvptx_call_args (rtx arg, tree funtype)
static void
nvptx_end_call_args (void)
{
- cfun->machine->start_call = NULL_RTX;
+ cfun->machine->doing_call = false;
free_EXPR_LIST_list (&cfun->machine->call_args);
}
@@ -1111,16 +1119,10 @@ nvptx_end_call_args (void)
void
nvptx_expand_call (rtx retval, rtx address)
{
- int nargs = 0;
rtx callee = XEXP (address, 0);
- rtx pat, t;
- rtvec vec;
rtx varargs = NULL_RTX;
unsigned parallel = 0;
- for (t = cfun->machine->call_args; t; t = XEXP (t, 1))
- nargs++;
-
if (!call_insn_operand (callee, Pmode))
{
callee = force_reg (Pmode, callee);
@@ -1133,7 +1135,7 @@ nvptx_expand_call (rtx retval, rtx addre
if (decl != NULL_TREE)
{
if (DECL_STATIC_CHAIN (decl))
- cfun->machine->has_call_with_sc = true;
+ cfun->machine->has_chain = true;
tree attr = get_oacc_fn_attrib (decl);
if (attr)
@@ -1154,35 +1156,31 @@ nvptx_expand_call (rtx retval, rtx addre
}
}
- if (cfun->machine->funtype
- && stdarg_p (cfun->machine->funtype))
+ unsigned nargs = cfun->machine->num_args;
+ if (cfun->machine->is_varadic)
{
varargs = gen_reg_rtx (Pmode);
emit_move_insn (varargs, stack_pointer_rtx);
- cfun->machine->has_call_with_varargs = true;
}
- vec = rtvec_alloc (nargs + 1 + (varargs ? 1 : 0));
- pat = gen_rtx_PARALLEL (VOIDmode, vec);
+ rtvec vec = rtvec_alloc (nargs + 1);
+ rtx pat = gen_rtx_PARALLEL (VOIDmode, vec);
int vec_pos = 0;
-
+
+ rtx call = gen_rtx_CALL (VOIDmode, address, const0_rtx);
rtx tmp_retval = retval;
- t = gen_rtx_CALL (VOIDmode, address, const0_rtx);
- if (retval != NULL_RTX)
+ if (retval)
{
if (!nvptx_register_operand (retval, GET_MODE (retval)))
tmp_retval = gen_reg_rtx (GET_MODE (retval));
- t = gen_rtx_SET (tmp_retval, t);
+ call = gen_rtx_SET (tmp_retval, call);
}
- XVECEXP (pat, 0, vec_pos++) = t;
+ XVECEXP (pat, 0, vec_pos++) = call;
/* Construct the call insn, including a USE for each argument pseudo
register. These will be used when printing the insn. */
for (rtx arg = cfun->machine->call_args; arg; arg = XEXP (arg, 1))
- {
- rtx this_arg = XEXP (arg, 0);
- XVECEXP (pat, 0, vec_pos++) = gen_rtx_USE (VOIDmode, this_arg);
- }
+ XVECEXP (pat, 0, vec_pos++) = gen_rtx_USE (VOIDmode, XEXP (arg, 0));
if (varargs)
XVECEXP (pat, 0, vec_pos++) = gen_rtx_USE (VOIDmode, varargs);
@@ -1477,18 +1475,6 @@ nvptx_legitimate_address_p (machine_mode
return false;
}
}
-
-/* Implement HARD_REGNO_MODE_OK. We barely use hard regs, but we want
- to ensure that the return register's mode isn't changed. */
-
-bool
-nvptx_hard_regno_mode_ok (int regno, machine_mode mode)
-{
- if (regno != NVPTX_RETURN_REGNUM
- || cfun == NULL || cfun->machine->ret_reg_mode == VOIDmode)
- return true;
- return mode == cfun->machine->ret_reg_mode;
-}
\f
/* Machinery to output constant initializers. When beginning an
initializer, we decide on a fragment size (which is visible in ptx
@@ -3773,7 +3759,7 @@ nvptx_reorg (void)
/* Mark unused regs as unused. */
int max_regs = max_reg_num ();
- for (int i = 0; i < max_regs; i++)
+ for (int i = LAST_VIRTUAL_REGISTER + 1; i < max_regs; i++)
if (REG_N_SETS (i) == 0 && REG_N_REFS (i) == 0)
regno_reg_rtx[i] = const0_rtx;
Index: config/nvptx/nvptx.h
===================================================================
--- config/nvptx/nvptx.h (revision 231689)
+++ config/nvptx/nvptx.h (working copy)
@@ -220,14 +220,15 @@ struct nvptx_args {
#if defined HOST_WIDE_INT
struct GTY(()) machine_function
{
- rtx_expr_list *call_args;
- rtx start_call;
- tree funtype;
- bool has_call_with_varargs;
- bool has_call_with_sc;
- HOST_WIDE_INT outgoing_stdarg_size;
- int ret_reg_mode; /* machine_mode not defined yet. */
- rtx axis_predicate[2];
+ rtx_expr_list *call_args; /* Arg list for the current call. */
+ bool doing_call; /* Within a CALL_ARGS ... CALL_ARGS_END sequence. */
+ bool is_varadic; /* This call is varadic */
+ bool has_varadic; /* Current function has a varadic call. */
+ bool has_chain; /* Current function has outgoing static chain. */
+ int num_args; /* Number of args of current call. */
+ int return_mode; /* Return mode of current fn.
+ (machine_mode not defined yet.) */
+ rtx axis_predicate[2]; /* Neutering predicates. */
};
#endif
\f
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PTX] simplify calling struct
2015-12-16 13:53 [PTX] simplify calling struct Nathan Sidwell
@ 2015-12-17 22:59 ` Bernhard Reutner-Fischer
0 siblings, 0 replies; 2+ messages in thread
From: Bernhard Reutner-Fischer @ 2015-12-17 22:59 UTC (permalink / raw)
To: Nathan Sidwell, GCC Patches
On December 16, 2015 2:53:51 PM GMT+01:00, Nathan Sidwell <nathan@acm.org> wrote:
>PTX's machine_function structure squirrels away the function type to
>calculate
>the presence of varadic args later, rather than calculate it
>immediately. It
>also uses an rtx field as a boolean. This patch reorganizes it with
>less
>verbose names and more apt types.
+ bool is_varadic; /* This call is varadic */
+ bool has_varadic; /* Current function has a varadic call. */
Just curious what varadic is? Is that maybe somehow related to variadic?
TIA,
>
>I also noticed that nvptx_hard_regno_mode_ok wasn't being used, so
>that's deleted.
>
>nathan
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2015-12-17 22:59 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-12-16 13:53 [PTX] simplify calling struct Nathan Sidwell
2015-12-17 22:59 ` Bernhard Reutner-Fischer
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).