Fix gamess miscompare
Richard Biener
richard.guenther@gmail.com
Thu Nov 18 14:16:30 GMT 2021
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 <hubicka@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++)
> {
More information about the Gcc-patches
mailing list