On Thu, Jun 11, 2020 at 1:52 PM Eric Botcazou <botca...@adacore.com> wrote:
>
> Hi,
>
> gimplify_modify_expr_rhs has an optimization whereby the assignment to an
> aggregate variable from a read-only object with a DECL_INITIAL is optimized
> into the direct assignment of the DECL_INITIAL, provided that no temporary is
> created in the process.
>
> The optimization is blocked if the read-only object is volatile, which is OK
> as per the semantics of volatile, but also if the target variable is volatile,
> on the grounds that the modified assignment might end up being done on a per
> field basis, which is also OK.  But this latter restriction is enforced a
> priori and there are cases where the modified assignment would be OK, for
> example if there is only one field or the DECL_INITIAL is equivalent to the
> empty CONSTRUCTOR, i.e. all zeros.
>
> So, in the latter case, the patch changes gimplify_modify_expr_rhs to ask
> gimplify_init_constructor whether the assignment would be done as a block,
> which is easy because gimplify_init_constructor knows that it must create a
> temporary if the LHS is volatile and this would not be the case, so it's just
> a matter of completing the NOTIFY_TEMP_CREATION mechanism for this case.
>
> Tested on x86-64/Linux, OK for the mainline?

OK.

Richard.

>
> 2020-06-11  Eric Botcazou  <ebotca...@adacore.com>
>
>         * gimplify.c (gimplify_init_constructor) <AGGREGATE_TYPE>: Declare new
>         ENSURE_SINGLE_ACCESS constant and move variables down.  If it is true
>         and all elements are zero, then always clear.  Return GS_ERROR if a
>         temporary would be created for it and NOTIFY_TEMP_CREATION is set.
>         (gimplify_modify_expr_rhs) <VAR_DECL>: If the target is volatile but
>         the type is aggregate non-addressable, ask gimplify_init_constructor
>         whether it can generate a single access to the target.
>
>
> 2020-06-11  Eric Botcazou  <ebotca...@adacore.com>
>
>         * gnat.dg/aggr30.adb[sb]: New test.
>
> --
> Eric Botcazou

Reply via email to