aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2021-11-17 22:04:26 +0100
committerJan Hubicka <jh@suse.cz>2021-11-17 22:04:26 +0100
commit425369bf3068a9f840d1c2f04a4d4c38e924d4dc (patch)
treea5dcb79130425eae75cf594b5a331189c3a56268 /gcc
parent69a5b3ca5c8fdd074fbb26fec926fa25fbec77c1 (diff)
downloadgcc-425369bf3068a9f840d1c2f04a4d4c38e924d4dc.zip
gcc-425369bf3068a9f840d1c2f04a4d4c38e924d4dc.tar.gz
gcc-425369bf3068a9f840d1c2f04a4d4c38e924d4dc.tar.bz2
Fix modref summary streaming
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. 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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ipa-modref.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/gcc/ipa-modref.c b/gcc/ipa-modref.c
index 9ceecdd..c94f058 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++)
{