From 6180f5c8d6d1dc7b6634c41a46f0f8f5ca2e5b9d Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 24 Nov 2021 09:08:44 +0100 Subject: tree-optimization/103168 - Improve VN of pure function calls This improves value-numbering of calls that read memory, calls to const functions with aggregate arguments and calls to pure functions where the latter include const functions we demoted to pure for the fear of interposing with a less optimized version. Note that for pure functions we do not handle functions that access global memory. 2021-11-24 Richard Biener Jan Hubicka PR tree-optimization/103168 * ipa-modref.h (struct modref_summary): Add load_accesses. * ipa-modref.c (modref_summary::finalize): Initialize load_accesses. * tree-ssa-sccvn.c (visit_reference_op_call): Use modref info to walk the virtual use->def chain to CSE const/pure function calls possibly reading from memory. * g++.dg/tree-ssa/pr103168.C: New testcase. --- gcc/ipa-modref.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'gcc/ipa-modref.c') diff --git a/gcc/ipa-modref.c b/gcc/ipa-modref.c index 79d7d77..923ae6c 100644 --- a/gcc/ipa-modref.c +++ b/gcc/ipa-modref.c @@ -721,6 +721,23 @@ modref_summary::finalize (tree fun) break; } } + if (loads->every_base) + load_accesses = 1; + else + { + load_accesses = 0; + for (auto base_node : loads->bases) + { + if (base_node->every_ref) + load_accesses++; + else + for (auto ref_node : base_node->refs) + if (ref_node->every_access) + load_accesses++; + else + load_accesses += ref_node->accesses->length (); + } + } } /* Get function summary for FUNC if it exists, return NULL otherwise. */ -- cgit v1.1