annotate gcc/analyzer/state-purge.cc @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 /* Classes for purging state at function_points.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 Copyright (C) 2019-2020 Free Software Foundation, Inc.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 Contributed by David Malcolm <dmalcolm@redhat.com>.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 This file is part of GCC.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 GCC is free software; you can redistribute it and/or modify it
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 under the terms of the GNU General Public License as published by
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 the Free Software Foundation; either version 3, or (at your option)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 any later version.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 GCC is distributed in the hope that it will be useful, but
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 WITHOUT ANY WARRANTY; without even the implied warranty of
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 General Public License for more details.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 along with GCC; see the file COPYING3. If not see
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 <http://www.gnu.org/licenses/>. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 #include "config.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 #include "system.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 #include "coretypes.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 #include "tree.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 #include "timevar.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 #include "tree-ssa-alias.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 #include "function.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 #include "basic-block.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 #include "gimple.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 #include "stringpool.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 #include "tree-vrp.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 #include "gimple-ssa.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 #include "tree-ssanames.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 #include "tree-phinodes.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 #include "options.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 #include "ssa-iterators.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 #include "diagnostic-core.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 #include "gimple-pretty-print.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 #include "function.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 #include "analyzer/analyzer.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 #include "analyzer/call-string.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 #include "digraph.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 #include "ordered-hash-map.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 #include "cfg.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 #include "gimple-iterator.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 #include "cgraph.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 #include "analyzer/supergraph.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 #include "analyzer/program-point.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 #include "analyzer/analyzer-logging.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 #include "analyzer/state-purge.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 #if ENABLE_ANALYZER
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 /* state_purge_map's ctor. Walk all SSA names in all functions, building
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 a state_purge_per_ssa_name instance for each. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 state_purge_map::state_purge_map (const supergraph &sg,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 logger *logger)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 : log_user (logger), m_sg (sg)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 LOG_FUNC (logger);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 auto_timevar tv (TV_ANALYZER_STATE_PURGE);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 cgraph_node *node;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 FOR_EACH_FUNCTION_WITH_GIMPLE_BODY (node)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 function *fun = node->get_fun ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 if (logger)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70 log ("function: %s", function_name (fun));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 tree name;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 unsigned int i;;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 FOR_EACH_SSA_NAME (i, name, fun)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 /* For now, don't bother tracking the .MEM SSA names. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 if (tree var = SSA_NAME_VAR (name))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 if (TREE_CODE (var) == VAR_DECL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 if (VAR_DECL_IS_VIRTUAL_OPERAND (var))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 m_map.put (name, new state_purge_per_ssa_name (*this, name, fun));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 /* state_purge_map's dtor. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 state_purge_map::~state_purge_map ()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 for (iterator iter = m_map.begin (); iter != m_map.end (); ++iter)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90 delete (*iter).second;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 /* state_purge_per_ssa_name's ctor.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95 Locate all uses of VAR within FUN.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 Walk backwards from each use, marking program points, until
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97 we reach the def stmt, populating m_points_needing_var.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99 We have to track program points rather than
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100 just stmts since there could be empty basic blocks on the way. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 state_purge_per_ssa_name::state_purge_per_ssa_name (const state_purge_map &map,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103 tree name,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104 function *fun)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 : m_points_needing_name (), m_name (name), m_fun (fun)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107 LOG_FUNC (map.get_logger ());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109 if (map.get_logger ())
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111 map.log ("SSA name: %qE within %qD", name, fun->decl);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113 /* Show def stmt. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 const gimple *def_stmt = SSA_NAME_DEF_STMT (name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115 pretty_printer pp;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116 pp_gimple_stmt_1 (&pp, def_stmt, 0, (dump_flags_t)0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117 map.log ("def stmt: %s", pp_formatted_text (&pp));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120 auto_vec<function_point> worklist;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122 /* Add all immediate uses of name to the worklist.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123 Compare with debug_immediate_uses. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124 imm_use_iterator iter;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 use_operand_p use_p;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126 FOR_EACH_IMM_USE_FAST (use_p, iter, name)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128 if (USE_STMT (use_p))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
130 const gimple *use_stmt = USE_STMT (use_p);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
131 if (map.get_logger ())
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
132 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
133 pretty_printer pp;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
134 pp_gimple_stmt_1 (&pp, use_stmt, 0, (dump_flags_t)0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
135 map.log ("used by stmt: %s", pp_formatted_text (&pp));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
136 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
137
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
138 const supernode *snode
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
139 = map.get_sg ().get_supernode_for_stmt (use_stmt);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
140
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
141 /* If it's a use within a phi node, then we care about
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
142 which in-edge we came from. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
143 if (use_stmt->code == GIMPLE_PHI)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
144 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
145 for (gphi_iterator gpi
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
146 = const_cast<supernode *> (snode)->start_phis ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
147 !gsi_end_p (gpi); gsi_next (&gpi))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
148 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
149 gphi *phi = gpi.phi ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
150 if (phi == use_stmt)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
151 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
152 /* Find arguments (and thus in-edges) which use NAME. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
153 for (unsigned arg_idx = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
154 arg_idx < gimple_phi_num_args (phi);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
155 ++arg_idx)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
156 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
157 if (name == gimple_phi_arg (phi, arg_idx)->def)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
158 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
159 edge in_edge = gimple_phi_arg_edge (phi, arg_idx);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
160 const superedge *in_sedge
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
161 = map.get_sg ().get_edge_for_cfg_edge (in_edge);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
162 function_point point
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
163 = function_point::before_supernode
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
164 (snode, in_sedge);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
165 add_to_worklist (point, &worklist,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
166 map.get_logger ());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
167 m_points_needing_name.add (point);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
168 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
169 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
170 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
171 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
172 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
173 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
174 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
175 function_point point = before_use_stmt (map, use_stmt);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
176 add_to_worklist (point, &worklist, map.get_logger ());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
177 m_points_needing_name.add (point);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
178
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
179 /* We also need to add uses for conditionals and switches,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
180 where the stmt "happens" at the after_supernode, for filtering
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
181 the out-edges. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
182 if (use_stmt == snode->get_last_stmt ())
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
183 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
184 if (map.get_logger ())
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
185 map.log ("last stmt in BB");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
186 function_point point
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
187 = function_point::after_supernode (snode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
188 add_to_worklist (point, &worklist, map.get_logger ());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
189 m_points_needing_name.add (point);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
190 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
191 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
192 if (map.get_logger ())
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
193 map.log ("not last stmt in BB");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
194 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
195 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
196 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
197
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
198 /* Process worklist by walking backwards until we reach the def stmt. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
199 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
200 log_scope s (map.get_logger (), "processing worklist");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
201 while (worklist.length () > 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
202 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
203 function_point point = worklist.pop ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
204 process_point (point, &worklist, map);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
205 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
206 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
207
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
208 if (map.get_logger ())
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
209 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
210 map.log ("%qE in %qD is needed to process:", name, fun->decl);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
211 for (point_set_t::iterator iter = m_points_needing_name.begin ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
212 iter != m_points_needing_name.end ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
213 ++iter)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
214 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
215 map.start_log_line ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
216 map.get_logger ()->log_partial (" point: ");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
217 (*iter).print (map.get_logger ()->get_printer (), format (false));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
218 map.end_log_line ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
219 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
220 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
221 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
222
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
223 /* Return true if the SSA name is needed at POINT. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
224
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
225 bool
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
226 state_purge_per_ssa_name::needed_at_point_p (const function_point &point) const
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
227 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
228 return const_cast <point_set_t &> (m_points_needing_name).contains (point);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
229 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
230
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
231 /* Get the function_point representing immediately before USE_STMT.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
232 Subroutine of ctor. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
233
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
234 function_point
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
235 state_purge_per_ssa_name::before_use_stmt (const state_purge_map &map,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
236 const gimple *use_stmt)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
237 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
238 gcc_assert (use_stmt->code != GIMPLE_PHI);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
239
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
240 const supernode *supernode
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
241 = map.get_sg ().get_supernode_for_stmt (use_stmt);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
242 unsigned int stmt_idx = supernode->get_stmt_index (use_stmt);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
243 return function_point::before_stmt (supernode, stmt_idx);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
244 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
245
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
246 /* Add POINT to *WORKLIST if the point has not already been seen.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
247 Subroutine of ctor. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
248
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
249 void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
250 state_purge_per_ssa_name::add_to_worklist (const function_point &point,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
251 auto_vec<function_point> *worklist,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
252 logger *logger)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
253 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
254 LOG_FUNC (logger);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
255 if (logger)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
256 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
257 logger->start_log_line ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
258 logger->log_partial ("point: '");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
259 point.print (logger->get_printer (), format (false));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
260 logger->log_partial ("' for worklist for %qE", m_name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
261 logger->end_log_line ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
262 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
263
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
264 gcc_assert (point.get_function () == m_fun);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
265 if (point.get_from_edge ())
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
266 gcc_assert (point.get_from_edge ()->get_kind () == SUPEREDGE_CFG_EDGE);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
267
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
268 if (m_points_needing_name.contains (point))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
269 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
270 if (logger)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
271 logger->log ("already seen for %qE", m_name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
272 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
273 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
274 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
275 if (logger)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
276 logger->log ("not seen; adding to worklist for %qE", m_name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
277 m_points_needing_name.add (point);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
278 worklist->safe_push (point);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
279 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
280 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
281
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
282 /* Process POINT, popped from WORKLIST.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
283 Iterate over predecessors of POINT, adding to WORKLIST. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
284
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
285 void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
286 state_purge_per_ssa_name::process_point (const function_point &point,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
287 auto_vec<function_point> *worklist,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
288 const state_purge_map &map)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
289 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
290 logger *logger = map.get_logger ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
291 LOG_FUNC (logger);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
292 if (logger)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
293 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
294 logger->start_log_line ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
295 logger->log_partial ("considering point: '");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
296 point.print (logger->get_printer (), format (false));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
297 logger->log_partial ("' for %qE", m_name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
298 logger->end_log_line ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
299 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
300
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
301 gimple *def_stmt = SSA_NAME_DEF_STMT (m_name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
302
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
303 const supernode *snode = point.get_supernode ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
304
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
305 switch (point.get_kind ())
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
306 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
307 default:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
308 gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
309
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
310 case PK_ORIGIN:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
311 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
312
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
313 case PK_BEFORE_SUPERNODE:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
314 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
315 for (gphi_iterator gpi
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
316 = const_cast<supernode *> (snode)->start_phis ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
317 !gsi_end_p (gpi); gsi_next (&gpi))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
318 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
319 gphi *phi = gpi.phi ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
320 if (phi == def_stmt)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
321 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
322 if (logger)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
323 logger->log ("def stmt within phis; terminating");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
324 return;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
325 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
326 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
327
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
328 /* Add given pred to worklist. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
329 if (point.get_from_edge ())
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
330 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
331 gcc_assert (point.get_from_edge ()->m_src);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
332 add_to_worklist
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
333 (function_point::after_supernode (point.get_from_edge ()->m_src),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
334 worklist, logger);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
335 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
336 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
337 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
338 /* Add any intraprocedually edge for a call. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
339 if (snode->m_returning_call)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
340 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
341 cgraph_edge *cedge
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
342 = supergraph_call_edge (snode->m_fun,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
343 snode->m_returning_call);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
344 gcc_assert (cedge);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
345 superedge *sedge
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
346 = map.get_sg ().get_intraprocedural_edge_for_call (cedge);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
347 gcc_assert (sedge);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
348 add_to_worklist
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
349 (function_point::after_supernode (sedge->m_src),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
350 worklist, logger);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
351 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
352 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
353 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
354 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
355
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
356 case PK_BEFORE_STMT:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
357 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
358 if (def_stmt == point.get_stmt ())
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
359 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
360 if (logger)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
361 logger->log ("def stmt; terminating");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
362 return;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
363 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
364 if (point.get_stmt_idx () > 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
365 add_to_worklist (function_point::before_stmt
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
366 (snode, point.get_stmt_idx () - 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
367 worklist, logger);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
368 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
369 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
370 /* Add before_supernode to worklist. This captures the in-edge,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
371 so we have to do it once per in-edge. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
372 unsigned i;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
373 superedge *pred;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
374 FOR_EACH_VEC_ELT (snode->m_preds, i, pred)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
375 add_to_worklist (function_point::before_supernode (snode,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
376 pred),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
377 worklist, logger);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
378 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
379 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
380 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
381
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
382 case PK_AFTER_SUPERNODE:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
383 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
384 if (snode->m_stmts.length ())
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
385 add_to_worklist
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
386 (function_point::before_stmt (snode,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
387 snode->m_stmts.length () - 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
388 worklist, logger);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
389 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
390 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
391 /* Add before_supernode to worklist. This captures the in-edge,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
392 so we have to do it once per in-edge. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
393 unsigned i;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
394 superedge *pred;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
395 FOR_EACH_VEC_ELT (snode->m_preds, i, pred)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
396 add_to_worklist (function_point::before_supernode (snode,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
397 pred),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
398 worklist, logger);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
399 /* If it's the initial BB, add it, to ensure that we
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
400 have "before supernode" for the initial ENTRY block, and don't
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
401 erroneously purge SSA names for initial values of parameters. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
402 if (snode->entry_p ())
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
403 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
404 add_to_worklist
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
405 (function_point::before_supernode (snode, NULL),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
406 worklist, logger);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
407 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
408 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
409 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
410 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
411 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
412 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
413
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
414 /* class state_purge_annotator : public dot_annotator. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
415
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
416 /* Implementation of dot_annotator::add_node_annotations vfunc for
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
417 state_purge_annotator.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
418
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
419 Add an additional record showing which names are purged on entry
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
420 to the supernode N. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
421
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
422 void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
423 state_purge_annotator::add_node_annotations (graphviz_out *gv,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
424 const supernode &n) const
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
425 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
426 if (m_map == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
427 return;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
428
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
429 pretty_printer *pp = gv->get_pp ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
430
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
431 pp_printf (pp, "annotation_for_node_%i", n.m_index);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
432 pp_printf (pp, " [shape=none,margin=0,style=filled,fillcolor=%s,label=\"",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
433 "lightblue");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
434 pp_write_text_to_stream (pp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
435
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
436 // FIXME: passing in a NULL in-edge means we get no hits
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
437 function_point before_supernode
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
438 (function_point::before_supernode (&n, NULL));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
439
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
440 for (state_purge_map::iterator iter = m_map->begin ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
441 iter != m_map->end ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
442 ++iter)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
443 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
444 tree name = (*iter).first;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
445 state_purge_per_ssa_name *per_name_data = (*iter).second;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
446 if (per_name_data->get_function () == n.m_fun)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
447 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
448 if (per_name_data->needed_at_point_p (before_supernode))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
449 pp_printf (pp, "%qE needed here", name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
450 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
451 pp_printf (pp, "%qE not needed here", name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
452 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
453 pp_newline (pp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
454 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
455
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
456 pp_string (pp, "\"];\n\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
457 pp_flush (pp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
458 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
459
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
460 /* Print V to GV as a comma-separated list in braces within a <TR>,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
461 titling it with TITLE.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
462
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
463 Subroutine of state_purge_annotator::add_stmt_annotations. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
464
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
465 static void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
466 print_vec_of_names (graphviz_out *gv, const char *title,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
467 const auto_vec<tree> &v)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
468 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
469 pretty_printer *pp = gv->get_pp ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
470 tree name;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
471 unsigned i;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
472 gv->begin_tr ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
473 pp_printf (pp, "%s: {", title);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
474 FOR_EACH_VEC_ELT (v, i, name)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
475 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
476 if (i > 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
477 pp_string (pp, ", ");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
478 pp_printf (pp, "%qE", name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
479 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
480 pp_printf (pp, "}");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
481 pp_write_text_as_html_like_dot_to_stream (pp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
482 gv->end_tr ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
483 pp_newline (pp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
484 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
485
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
486 /* Implementation of dot_annotator::add_stmt_annotations for
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
487 state_purge_annotator.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
488
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
489 Add text showing which names are purged at STMT. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
490
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
491 void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
492 state_purge_annotator::add_stmt_annotations (graphviz_out *gv,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
493 const gimple *stmt) const
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
494 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
495 if (m_map == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
496 return;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
497
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
498 if (stmt->code == GIMPLE_PHI)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
499 return;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
500
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
501 pretty_printer *pp = gv->get_pp ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
502
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
503 pp_newline (pp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
504
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
505 const supernode *supernode = m_map->get_sg ().get_supernode_for_stmt (stmt);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
506 unsigned int stmt_idx = supernode->get_stmt_index (stmt);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
507 function_point before_stmt
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
508 (function_point::before_stmt (supernode, stmt_idx));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
509
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
510 auto_vec<tree> needed;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
511 auto_vec<tree> not_needed;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
512 for (state_purge_map::iterator iter = m_map->begin ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
513 iter != m_map->end ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
514 ++iter)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
515 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
516 tree name = (*iter).first;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
517 state_purge_per_ssa_name *per_name_data = (*iter).second;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
518 if (per_name_data->get_function () == supernode->m_fun)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
519 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
520 if (per_name_data->needed_at_point_p (before_stmt))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
521 needed.safe_push (name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
522 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
523 not_needed.safe_push (name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
524 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
525 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
526
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
527 print_vec_of_names (gv, "needed here", needed);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
528 print_vec_of_names (gv, "not needed here", not_needed);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
529 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
530
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
531 #endif /* #if ENABLE_ANALYZER */