aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/resolve.c
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2021-11-07 09:35:16 +0100
committerJan Hubicka <hubicka@ucw.cz>2021-11-07 09:35:16 +0100
commit4898e958a92d45dbf23c0f28bc7552689ba16ecc (patch)
treee248250b2eac942ca4aa44afc5564d0caa0a3bd1 /gcc/fortran/resolve.c
parent9defce622893f87d954e0089e0ea79e1e388a480 (diff)
downloadgcc-4898e958a92d45dbf23c0f28bc7552689ba16ecc.zip
gcc-4898e958a92d45dbf23c0f28bc7552689ba16ecc.tar.gz
gcc-4898e958a92d45dbf23c0f28bc7552689ba16ecc.tar.bz2
Implement intra-procedural dataflow in ipa-modref flags propagation.
implement the (long promised) intraprocedural dataflow for propagating eaf flags, so we can handle parameters that participate in loops in SSA graphs. Typical example are acessors that walk linked lists, for example. I implemented dataflow using the standard iteration over BBs in RPO some time ago, but did not like it becuase it had measurable compile time impact with very small code quality effect. This is why I kept mainline to do the DFS walk instead. The reason is that we care about flags of SSA names that corresponds to parameters and those can be often determined from a small fraction of the SSA graph so solving dataflow for all SSA names in a function is a waste. This patch implements dataflow more carefully. The DFS walk is kept in place to solve acyclic cases and discover the relevat part of SSA graph into new graph (which is similar to one used for inter-procedrual dataflow - we only need to know the edges and if the access is direct or derefernced). The RPO iterative dataflow then works on this simplified graph. This seems to be fast in practice. For GCC linktime we do dataflow for 4881 functions. Out of that 4726 finishes in one iteration, 144 in two and 10 in 3. Overall 31979 functions are analysed, so we do dataflow only for bit over of 10% of cases. 131123 edges are visited by the solver. I measured no compile time impact of this. gcc/ChangeLog: * ipa-modref.c (modref_lattice): Add do_dataflow, changed and propagate_to fields. (modref_lattice::release): Free propagate_to (modref_lattice::merge): Do not give up early on unknown lattice values. (modref_lattice::merge_deref): Likewise. (modref_eaf_analysis): Update toplevel comment. (modref_eaf_analysis::analyze_ssa_name): Record postponned ssa names; do optimistic dataflow initialization. (modref_eaf_analysis::merge_with_ssa_name): Build dataflow graph. (modref_eaf_analysis::propagate): New member function. (analyze_parms): Update to new API of modref_eaf_analysis.
Diffstat (limited to 'gcc/fortran/resolve.c')
0 files changed, 0 insertions, 0 deletions