On Wed, Nov 17, 2021 at 10:09 PM Jan Hubicka via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> Hi,
> this patch fixes bug in streaming in modref access tree that now cause a 
> failure
> of gamess benchmark.  The bug is quite old (present in GCC11 release) but it
> needs quite interesting series of events to manifest. In particular
>  1) At lto time ISRA turns some parameters passed by reference to scalar
>  2) At lto time modref computes summaries for old parameters and then updates
>     them but does so quite stupidly believing that the load from parameters
>     are now unkonwn loads (rather than optimized out).
>     This renders summary not very useful since it thinks every memory aliasing
>     int is now accssed (as opposed as parameter dereference)
>  3) At stream in we notice too early that summary is useless, set every_access
>     flag and drop the list.  However while reading rest of the summary we
>     overwrite the flag back to 0 which makes us to lose part of summary.
>  4) right selection of partitions needs to be done to avoid late modref from
>     recalculating and thus fixing the summary.
>
> This patch fixes the stream in bug, however we also should fix updating of
> summaries.  Martin, would be possible to extend get_original_index by "deref"
> parameter that would be set to true when refernce was turned to scalar?
>
> Bootstrapped/regtested x86_64-linux. Comitted.

Please remember to backport as well.

Richard.

> gcc/ChangeLog:
>
> 2021-11-17  Jan Hubicka  <hubi...@ucw.cz>
>
>         PR ipa/103246
>         * ipa-modref.c (read_modref_records): Fix streaminig in of 
> every_access
>         flag.
>
> diff --git a/gcc/ipa-modref.c b/gcc/ipa-modref.c
> index 9ceecdd479f..c94f0589d44 100644
> --- a/gcc/ipa-modref.c
> +++ b/gcc/ipa-modref.c
> @@ -3460,10 +3460,10 @@ read_modref_records (lto_input_block *ib, struct 
> data_in *data_in,
>           size_t every_access = streamer_read_uhwi (ib);
>           size_t naccesses = streamer_read_uhwi (ib);
>
> -         if (nolto_ref_node)
> -           nolto_ref_node->every_access = every_access;
> -         if (lto_ref_node)
> -           lto_ref_node->every_access = every_access;
> +         if (nolto_ref_node && every_access)
> +           nolto_ref_node->collapse ();
> +         if (lto_ref_node && every_access)
> +           lto_ref_node->collapse ();
>
>           for (size_t k = 0; k < naccesses; k++)
>             {
  • Fix gamess miscompare Jan Hubicka via Gcc-patches
    • Re: Fix gamess miscompare Richard Biener via Gcc-patches

Reply via email to