On Mon, May 3, 2021 at 11:02 AM Eric Botcazou <botca...@adacore.com> wrote:
>
> Hi,
>
> when a call to a function is inlined and takes a parameter whose type is not
> gimple_reg, a variable is created in the caller to hold a copy of the argument
> passed in the call with the following comment:
>
>       /* We may produce non-gimple trees by adding NOPs or introduce
>          invalid sharing when operand is not really constant.
>          It is not big deal to prohibit constant propagation here as
>          we will constant propagate in DOM1 pass anyway.  *
>
> Of course the second sentence of the comment does not apply to non-gimple_reg
> values, unless they get SRAed later, because we do not do constant propagation
> for them.  This for example prevents two identical calls to a pure function
> from being merged in the attached Ada testcase.
>
> Therefore the attached patch attempts to reuse a read-only or non-addressable
> local DECL of the caller, the hitch being that expand_call_inline needs to be
> prevented from creating a CLOBBER for the cases where it ends uo being reused.
>
> Tested on x86-64/Linux, OK for the mainline?

Hmm, instead of (ab-)using debug_map can we instead use sth like setting
TREE_VISITED on the argument decl (not the value - it might be passed
multiple tiimes)?  IIRC TREE_VISITED state is undetermined thus we can
clear it at the start of setup_one_parameter and set it when we want to avoid
the clobber and then test for this later?

In the end I'd even find using a new bitmap to record parameter decl UIDs
cleaner ... (I'm not sure if we not end up doing tree walks that might clobber
TREE_VISITED here).

Otherwise looks OK.

Thanks,
Richard.

>
> 2021-05-03  Eric Botcazou  <ebotca...@adacore.com>
>
>         * tree-inline.c (setup_one_parameter): Do not create a variable if the
>         value is either a read-only DECL or a non-addressable local variable.
>         Register the variable thus reused instead of creating a new one.
>         (expand_call_inline): Do not generate a CLOBBER for these variables.
>
>
> 2021-05-03  Eric Botcazou  <ebotca...@adacore.com>
>
>         * gnat.dg/opt94.adb: New test.
>         * gnat.dg/opt94_pkg.ads, opt94.adb: New helper.
>
> --
> Eric Botcazou

Reply via email to