Ilya Leoshkevich <[email protected]> writes:
> One of the next patches in series needs to frequently pass short-lived
> fake rtxes to the back-end in order to test its capabilities. In order
> to reduce the load on GC, it is beneficial to allocate these rtxes on
> stack.
>
> Provide the macro counterparts of gen_* functions required by the next
> patch in series.
>
> gcc/ChangeLog:
>
> 2019-08-27 Ilya Leoshkevich <[email protected]>
>
> PR target/77918
> * emit-rtl.c (gen_raw_REG): Use init_raw_REG.
> (init_raw_REG): New function.
> * gengenrtl.c (gendef): Emit init_* functions and alloca_*
> macros.
> * rtl.c (rtx_alloc_stat_v): Use rtx_init.
> * rtl.h (rtx_init): New function.
> (rtx_alloca): New function.
> (init_raw_REG): New function.
> (alloca_raw_REG): New macro.
> ---
> gcc/emit-rtl.c | 15 +++++++++---
> gcc/gengenrtl.c | 64 +++++++++++++++++++++++++++++++++++++------------
> gcc/rtl.c | 7 +-----
> gcc/rtl.h | 12 ++++++++++
> 4 files changed, 74 insertions(+), 24 deletions(-)
>
> diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
> index a667cdab94e..ecfa3735bba 100644
> --- a/gcc/emit-rtl.c
> +++ b/gcc/emit-rtl.c
> @@ -466,20 +466,29 @@ set_mode_and_regno (rtx x, machine_mode mode, unsigned
> int regno)
> set_regno_raw (x, regno, nregs);
> }
>
> -/* Generate a new REG rtx. Make sure ORIGINAL_REGNO is set properly, and
> +/* Initialize a REG rtx. Make sure ORIGINAL_REGNO is set properly, and
> don't attempt to share with the various global pieces of rtl (such as
> frame_pointer_rtx). */
>
> rtx
> -gen_raw_REG (machine_mode mode, unsigned int regno)
> +init_raw_REG (rtx x, machine_mode mode, unsigned int regno)
> {
> - rtx x = rtx_alloc (REG MEM_STAT_INFO);
> set_mode_and_regno (x, mode, regno);
> REG_ATTRS (x) = NULL;
> ORIGINAL_REGNO (x) = regno;
> return x;
> }
>
> +/* Generate a new REG rtx. */
> +
> +rtx
> +gen_raw_REG (machine_mode mode, unsigned int regno)
> +{
> + rtx x = rtx_alloc (REG MEM_STAT_INFO);
> + init_raw_REG (x, mode, regno);
> + return x;
> +}
> +
I think we should keep the gen_raw_REG comment the same (including
the "Make sure..." bit). The point is to contrast gen_raw_REG with
gen_rtx_REG, which does various bits of sharing.
Maybe the comment above init_raw_REG can instead be just:
/* Initialize a fresh REG rtx with mode MODE and register REGNO. */
> [...]
> @@ -266,16 +261,55 @@ gendef (const char *format)
> else
> printf (" %s (rt, %d) = arg%d;\n", accessor_from_format (*p), i, j++);
>
> - puts ("\n return rt;\n}\n");
> + puts (" return rt;\n}\n");
> +
> + /* Write the definition of the gen function name and the types
> + of the arguments. */
> +
> + puts ("static inline rtx");
> + printf ("gen_rtx_fmt_%s_stat (RTX_CODE code, machine_mode mode", format);
> + for (p = format, i = 0; *p != 0; p++)
> + if (*p != '0')
> + printf (",\n\t%sarg%d", type_from_format (*p), i++);
> + puts (" MEM_STAT_DECL)");
> +
> + /* Now write out the body of the function itself, which allocates
> + the memory and initializes it. */
> + puts ("{");
> + puts (" rtx rt;\n");
> +
> + puts (" rt = rtx_alloc (code PASS_MEM_STAT);");
> + printf (" init_rtx_fmt_%s (rt, mode", format);
> + for (p = format, i = 0; *p != 0; p++)
> + if (*p != '0')
> + printf (", arg%d", i++);
> + puts (");\n");
> +
> + puts (" return rt;\n}\n");
Might as well make it:
printf (" return init_rtx_fmt_%s (rt, mode", format);
and drop the separate return, for consistency with the new
alloca code.
OK with those changes, thanks.
Richard