annotate gcc/ipa-icf.h @ 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
111
kono
parents:
diff changeset
1 /* Interprocedural semantic function equality pass
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2 Copyright (C) 2014-2020 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 Contributed by Jan Hubicka <hubicka@ucw.cz> and Martin Liska <mliska@suse.cz>
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 This file is part of GCC.
kono
parents:
diff changeset
7
kono
parents:
diff changeset
8 GCC is free software; you can redistribute it and/or modify it under
kono
parents:
diff changeset
9 the terms of the GNU General Public License as published by the Free
kono
parents:
diff changeset
10 Software Foundation; either version 3, or (at your option) any later
kono
parents:
diff changeset
11 version.
kono
parents:
diff changeset
12
kono
parents:
diff changeset
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
kono
parents:
diff changeset
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
kono
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
kono
parents:
diff changeset
16 for more details.
kono
parents:
diff changeset
17
kono
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
kono
parents:
diff changeset
19 along with GCC; see the file COPYING3. If not see
kono
parents:
diff changeset
20 <http://www.gnu.org/licenses/>. */
kono
parents:
diff changeset
21
kono
parents:
diff changeset
22 namespace ipa_icf {
kono
parents:
diff changeset
23 class sem_item;
kono
parents:
diff changeset
24
kono
parents:
diff changeset
25 /* Congruence class encompasses a collection of either functions or
kono
parents:
diff changeset
26 read-only variables. These items are considered to be equivalent
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
27 if not proved the opposite. */
111
kono
parents:
diff changeset
28 class congruence_class
kono
parents:
diff changeset
29 {
kono
parents:
diff changeset
30 public:
kono
parents:
diff changeset
31 /* Congruence class constructor for a new class with _ID. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
32 congruence_class (unsigned int _id): in_worklist (false), id (_id),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
33 referenced_by_count (0)
111
kono
parents:
diff changeset
34 {
kono
parents:
diff changeset
35 }
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 /* Destructor. */
kono
parents:
diff changeset
38 ~congruence_class ()
kono
parents:
diff changeset
39 {
kono
parents:
diff changeset
40 }
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 /* Dump function prints all class members to a FILE with an INDENT. */
kono
parents:
diff changeset
43 void dump (FILE *file, unsigned int indent = 0) const;
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 /* Returns true if there's a member that is used from another group. */
kono
parents:
diff changeset
46 bool is_class_used (void);
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 /* Flag is used in case we want to remove a class from worklist and
kono
parents:
diff changeset
49 delete operation is quite expensive for
kono
parents:
diff changeset
50 the data structure (linked list). */
kono
parents:
diff changeset
51 bool in_worklist;
kono
parents:
diff changeset
52
kono
parents:
diff changeset
53 /* Vector of all group members. */
kono
parents:
diff changeset
54 auto_vec <sem_item *> members;
kono
parents:
diff changeset
55
kono
parents:
diff changeset
56 /* Global unique class identifier. */
kono
parents:
diff changeset
57 unsigned int id;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
58
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
59 /* Total number of references to items of this class. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
60 unsigned referenced_by_count;
111
kono
parents:
diff changeset
61 };
kono
parents:
diff changeset
62
kono
parents:
diff changeset
63 /* Semantic item type enum. */
kono
parents:
diff changeset
64 enum sem_item_type
kono
parents:
diff changeset
65 {
kono
parents:
diff changeset
66 FUNC,
kono
parents:
diff changeset
67 VAR
kono
parents:
diff changeset
68 };
kono
parents:
diff changeset
69
kono
parents:
diff changeset
70 /* Class is container for address references for a symtab_node. */
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 class symbol_compare_collection
kono
parents:
diff changeset
73 {
kono
parents:
diff changeset
74 public:
kono
parents:
diff changeset
75 /* Constructor. */
kono
parents:
diff changeset
76 symbol_compare_collection (symtab_node *node);
kono
parents:
diff changeset
77
kono
parents:
diff changeset
78 /* Destructor. */
kono
parents:
diff changeset
79 ~symbol_compare_collection ()
kono
parents:
diff changeset
80 {
kono
parents:
diff changeset
81 m_references.release ();
kono
parents:
diff changeset
82 m_interposables.release ();
kono
parents:
diff changeset
83 }
kono
parents:
diff changeset
84
kono
parents:
diff changeset
85 /* Vector of address references. */
kono
parents:
diff changeset
86 vec<symtab_node *> m_references;
kono
parents:
diff changeset
87
kono
parents:
diff changeset
88 /* Vector of interposable references. */
kono
parents:
diff changeset
89 vec<symtab_node *> m_interposables;
kono
parents:
diff changeset
90 };
kono
parents:
diff changeset
91
kono
parents:
diff changeset
92 /* Hash traits for symbol_compare_collection map. */
kono
parents:
diff changeset
93
kono
parents:
diff changeset
94 struct symbol_compare_hash : nofree_ptr_hash <symbol_compare_collection>
kono
parents:
diff changeset
95 {
kono
parents:
diff changeset
96 static hashval_t
kono
parents:
diff changeset
97 hash (value_type v)
kono
parents:
diff changeset
98 {
kono
parents:
diff changeset
99 inchash::hash hstate;
kono
parents:
diff changeset
100 hstate.add_int (v->m_references.length ());
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 for (unsigned i = 0; i < v->m_references.length (); i++)
kono
parents:
diff changeset
103 hstate.add_int (v->m_references[i]->ultimate_alias_target ()->order);
kono
parents:
diff changeset
104
kono
parents:
diff changeset
105 hstate.add_int (v->m_interposables.length ());
kono
parents:
diff changeset
106
kono
parents:
diff changeset
107 for (unsigned i = 0; i < v->m_interposables.length (); i++)
kono
parents:
diff changeset
108 hstate.add_int (v->m_interposables[i]->ultimate_alias_target ()->order);
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 return hstate.end ();
kono
parents:
diff changeset
111 }
kono
parents:
diff changeset
112
kono
parents:
diff changeset
113 static bool
kono
parents:
diff changeset
114 equal (value_type a, value_type b)
kono
parents:
diff changeset
115 {
kono
parents:
diff changeset
116 if (a->m_references.length () != b->m_references.length ()
kono
parents:
diff changeset
117 || a->m_interposables.length () != b->m_interposables.length ())
kono
parents:
diff changeset
118 return false;
kono
parents:
diff changeset
119
kono
parents:
diff changeset
120 for (unsigned i = 0; i < a->m_references.length (); i++)
kono
parents:
diff changeset
121 if (a->m_references[i]->equal_address_to (b->m_references[i]) != 1)
kono
parents:
diff changeset
122 return false;
kono
parents:
diff changeset
123
kono
parents:
diff changeset
124 for (unsigned i = 0; i < a->m_interposables.length (); i++)
kono
parents:
diff changeset
125 if (!a->m_interposables[i]->semantically_equivalent_p
kono
parents:
diff changeset
126 (b->m_interposables[i]))
kono
parents:
diff changeset
127 return false;
kono
parents:
diff changeset
128
kono
parents:
diff changeset
129 return true;
kono
parents:
diff changeset
130 }
kono
parents:
diff changeset
131 };
kono
parents:
diff changeset
132
kono
parents:
diff changeset
133 /* Semantic item usage pair. */
kono
parents:
diff changeset
134 class sem_usage_pair
kono
parents:
diff changeset
135 {
kono
parents:
diff changeset
136 public:
kono
parents:
diff changeset
137 /* Constructor for key value pair, where _ITEM is key and _INDEX is a target. */
kono
parents:
diff changeset
138 sem_usage_pair (sem_item *_item, unsigned int _index);
kono
parents:
diff changeset
139
kono
parents:
diff changeset
140 /* Target semantic item where an item is used. */
kono
parents:
diff changeset
141 sem_item *item;
kono
parents:
diff changeset
142
kono
parents:
diff changeset
143 /* Index of usage of such an item. */
kono
parents:
diff changeset
144 unsigned int index;
kono
parents:
diff changeset
145 };
kono
parents:
diff changeset
146
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
147 struct sem_usage_pair_hash : pointer_hash <sem_usage_pair>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
148 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
149 static inline hashval_t hash (sem_usage_pair *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
150 static inline bool equal (sem_usage_pair *, sem_usage_pair *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
151 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
152
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
153 inline hashval_t
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
154 sem_usage_pair_hash::hash (sem_usage_pair *pair)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
155 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
156 inchash::hash hstate;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
157
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
158 hstate.add_ptr (pair->item);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
159 hstate.add_int (pair->index);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
160
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
161 return hstate.end ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
162 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
163
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
164 inline bool
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
165 sem_usage_pair_hash::equal (sem_usage_pair *p1, sem_usage_pair *p2)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
166 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
167 return p1->item == p2->item && p1->index == p2->index;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
168 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
169
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
170 struct sem_usage_hash : sem_usage_pair_hash, typed_delete_remove <sem_usage_pair> {};
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
171 typedef hash_map<sem_usage_hash, auto_vec<sem_item *> > ref_map;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
172
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
173 typedef std::pair<symtab_node *, symtab_node *> symtab_pair;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
174
111
kono
parents:
diff changeset
175 /* Semantic item is a base class that encapsulates all shared functionality
kono
parents:
diff changeset
176 for both semantic function and variable items. */
kono
parents:
diff changeset
177 class sem_item
kono
parents:
diff changeset
178 {
kono
parents:
diff changeset
179 public:
kono
parents:
diff changeset
180 /* Semantic item constructor for a node of _TYPE, where STACK is used
kono
parents:
diff changeset
181 for bitmap memory allocation. */
kono
parents:
diff changeset
182 sem_item (sem_item_type _type, bitmap_obstack *stack);
kono
parents:
diff changeset
183
kono
parents:
diff changeset
184 /* Semantic item constructor for a node of _TYPE, where STACK is used
kono
parents:
diff changeset
185 for bitmap memory allocation. The item is based on symtab node _NODE. */
kono
parents:
diff changeset
186 sem_item (sem_item_type _type, symtab_node *_node, bitmap_obstack *stack);
kono
parents:
diff changeset
187
kono
parents:
diff changeset
188 virtual ~sem_item ();
kono
parents:
diff changeset
189
kono
parents:
diff changeset
190 /* Dump function for debugging purpose. */
kono
parents:
diff changeset
191 DEBUG_FUNCTION void dump (void);
kono
parents:
diff changeset
192
kono
parents:
diff changeset
193 /* Semantic item initialization function. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
194 virtual void init (ipa_icf_gimple::func_checker *) = 0;
111
kono
parents:
diff changeset
195
kono
parents:
diff changeset
196 /* Add reference to a semantic TARGET. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
197 void add_reference (ref_map *map, sem_item *target);
111
kono
parents:
diff changeset
198
kono
parents:
diff changeset
199 /* Fast equality function based on knowledge known in WPA. */
kono
parents:
diff changeset
200 virtual bool equals_wpa (sem_item *item,
kono
parents:
diff changeset
201 hash_map <symtab_node *, sem_item *> &ignored_nodes) = 0;
kono
parents:
diff changeset
202
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
203 /* Returns true if the item equals to ITEM given as argument. */
111
kono
parents:
diff changeset
204 virtual bool equals (sem_item *item,
kono
parents:
diff changeset
205 hash_map <symtab_node *, sem_item *> &ignored_nodes) = 0;
kono
parents:
diff changeset
206
kono
parents:
diff changeset
207 /* References independent hash function. */
kono
parents:
diff changeset
208 virtual hashval_t get_hash (void) = 0;
kono
parents:
diff changeset
209
kono
parents:
diff changeset
210 /* Set new hash value of the item. */
kono
parents:
diff changeset
211 void set_hash (hashval_t hash);
kono
parents:
diff changeset
212
kono
parents:
diff changeset
213 /* Merges instance with an ALIAS_ITEM, where alias, thunk or redirection can
kono
parents:
diff changeset
214 be applied. */
kono
parents:
diff changeset
215 virtual bool merge (sem_item *alias_item) = 0;
kono
parents:
diff changeset
216
kono
parents:
diff changeset
217 /* Dump symbol to FILE. */
kono
parents:
diff changeset
218 virtual void dump_to_file (FILE *file) = 0;
kono
parents:
diff changeset
219
kono
parents:
diff changeset
220 /* Update hash by address sensitive references. */
kono
parents:
diff changeset
221 void update_hash_by_addr_refs (hash_map <symtab_node *,
kono
parents:
diff changeset
222 sem_item *> &m_symtab_node_map);
kono
parents:
diff changeset
223
kono
parents:
diff changeset
224 /* Update hash by computed local hash values taken from different
kono
parents:
diff changeset
225 semantic items. */
kono
parents:
diff changeset
226 void update_hash_by_local_refs (hash_map <symtab_node *,
kono
parents:
diff changeset
227 sem_item *> &m_symtab_node_map);
kono
parents:
diff changeset
228
kono
parents:
diff changeset
229 /* Return base tree that can be used for compatible_types_p and
kono
parents:
diff changeset
230 contains_polymorphic_type_p comparison. */
kono
parents:
diff changeset
231 static bool get_base_types (tree *t1, tree *t2);
kono
parents:
diff changeset
232
kono
parents:
diff changeset
233 /* Return true if target supports alias symbols. */
kono
parents:
diff changeset
234 bool target_supports_symbol_aliases_p (void);
kono
parents:
diff changeset
235
kono
parents:
diff changeset
236 /* Item type. */
kono
parents:
diff changeset
237 sem_item_type type;
kono
parents:
diff changeset
238
kono
parents:
diff changeset
239 /* Symtab node. */
kono
parents:
diff changeset
240 symtab_node *node;
kono
parents:
diff changeset
241
kono
parents:
diff changeset
242 /* Declaration tree node. */
kono
parents:
diff changeset
243 tree decl;
kono
parents:
diff changeset
244
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
245 /* Number of references to a semantic symbols (function calls,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
246 variable references). */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
247 unsigned reference_count;
111
kono
parents:
diff changeset
248
kono
parents:
diff changeset
249 /* Pointer to a congruence class the item belongs to. */
kono
parents:
diff changeset
250 congruence_class *cls;
kono
parents:
diff changeset
251
kono
parents:
diff changeset
252 /* Index of the item in a class belonging to. */
kono
parents:
diff changeset
253 unsigned int index_in_class;
kono
parents:
diff changeset
254
kono
parents:
diff changeset
255 /* A bitmap with indices of all classes referencing this item. */
kono
parents:
diff changeset
256 bitmap usage_index_bitmap;
kono
parents:
diff changeset
257
kono
parents:
diff changeset
258 /* List of tree references (either FUNC_DECL or VAR_DECL). */
kono
parents:
diff changeset
259 vec <tree> tree_refs;
kono
parents:
diff changeset
260
kono
parents:
diff changeset
261 /* A set with symbol table references. */
kono
parents:
diff changeset
262 hash_set <symtab_node *> refs_set;
kono
parents:
diff changeset
263
kono
parents:
diff changeset
264 /* Temporary hash used where hash values of references are added. */
kono
parents:
diff changeset
265 hashval_t global_hash;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
266
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
267 /* Number of references to this symbol. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
268 unsigned referenced_by_count;
111
kono
parents:
diff changeset
269 protected:
kono
parents:
diff changeset
270 /* Cached, once calculated hash for the item. */
kono
parents:
diff changeset
271
kono
parents:
diff changeset
272 /* Compare properties of symbol that does not affect semantics of symbol
kono
parents:
diff changeset
273 itself but affects semantics of its references.
kono
parents:
diff changeset
274 If ADDRESS is true, do extra checking needed for IPA_REF_ADDR. */
kono
parents:
diff changeset
275 static bool compare_referenced_symbol_properties (symtab_node *used_by,
kono
parents:
diff changeset
276 symtab_node *n1,
kono
parents:
diff changeset
277 symtab_node *n2,
kono
parents:
diff changeset
278 bool address);
kono
parents:
diff changeset
279
kono
parents:
diff changeset
280 /* Hash properties compared by compare_referenced_symbol_properties. */
kono
parents:
diff changeset
281 void hash_referenced_symbol_properties (symtab_node *ref,
kono
parents:
diff changeset
282 inchash::hash &hstate,
kono
parents:
diff changeset
283 bool address);
kono
parents:
diff changeset
284
kono
parents:
diff changeset
285 /* For a given symbol table nodes N1 and N2, we check that FUNCTION_DECLs
kono
parents:
diff changeset
286 point to a same function. Comparison can be skipped if IGNORED_NODES
kono
parents:
diff changeset
287 contains these nodes. ADDRESS indicate if address is taken. */
kono
parents:
diff changeset
288 bool compare_symbol_references (hash_map <symtab_node *, sem_item *>
kono
parents:
diff changeset
289 &ignored_nodes,
kono
parents:
diff changeset
290 symtab_node *n1, symtab_node *n2,
kono
parents:
diff changeset
291 bool address);
kono
parents:
diff changeset
292 protected:
kono
parents:
diff changeset
293 /* Hash of item. */
kono
parents:
diff changeset
294 hashval_t m_hash;
kono
parents:
diff changeset
295
kono
parents:
diff changeset
296 /* Indicated whether a hash value has been set or not. */
kono
parents:
diff changeset
297 bool m_hash_set;
kono
parents:
diff changeset
298
kono
parents:
diff changeset
299 private:
kono
parents:
diff changeset
300 /* Initialize internal data structures. Bitmap STACK is used for
kono
parents:
diff changeset
301 bitmap memory allocation process. */
kono
parents:
diff changeset
302 void setup (bitmap_obstack *stack);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
303
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
304 /* Because types can be arbitrarily large, avoid quadratic bottleneck. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
305 static hash_map<const_tree, hashval_t> m_type_hash_cache;
111
kono
parents:
diff changeset
306 }; // class sem_item
kono
parents:
diff changeset
307
kono
parents:
diff changeset
308 class sem_function: public sem_item
kono
parents:
diff changeset
309 {
kono
parents:
diff changeset
310 public:
kono
parents:
diff changeset
311 /* Semantic function constructor that uses STACK as bitmap memory stack. */
kono
parents:
diff changeset
312 sem_function (bitmap_obstack *stack);
kono
parents:
diff changeset
313
kono
parents:
diff changeset
314 /* Constructor based on callgraph node _NODE.
kono
parents:
diff changeset
315 Bitmap STACK is used for memory allocation. */
kono
parents:
diff changeset
316 sem_function (cgraph_node *_node, bitmap_obstack *stack);
kono
parents:
diff changeset
317
kono
parents:
diff changeset
318 ~sem_function ();
kono
parents:
diff changeset
319
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
320 virtual void init (ipa_icf_gimple::func_checker *);
111
kono
parents:
diff changeset
321 virtual bool equals_wpa (sem_item *item,
kono
parents:
diff changeset
322 hash_map <symtab_node *, sem_item *> &ignored_nodes);
kono
parents:
diff changeset
323 virtual hashval_t get_hash (void);
kono
parents:
diff changeset
324 virtual bool equals (sem_item *item,
kono
parents:
diff changeset
325 hash_map <symtab_node *, sem_item *> &ignored_nodes);
kono
parents:
diff changeset
326 virtual bool merge (sem_item *alias_item);
kono
parents:
diff changeset
327
kono
parents:
diff changeset
328 /* Dump symbol to FILE. */
kono
parents:
diff changeset
329 virtual void dump_to_file (FILE *file)
kono
parents:
diff changeset
330 {
kono
parents:
diff changeset
331 gcc_assert (file);
kono
parents:
diff changeset
332 dump_function_to_file (decl, file, TDF_DETAILS);
kono
parents:
diff changeset
333 }
kono
parents:
diff changeset
334
kono
parents:
diff changeset
335 /* Returns cgraph_node. */
kono
parents:
diff changeset
336 inline cgraph_node *get_node (void)
kono
parents:
diff changeset
337 {
kono
parents:
diff changeset
338 return dyn_cast <cgraph_node *> (node);
kono
parents:
diff changeset
339 }
kono
parents:
diff changeset
340
kono
parents:
diff changeset
341 /* Improve accumulated hash for HSTATE based on a gimple statement STMT. */
kono
parents:
diff changeset
342 void hash_stmt (gimple *stmt, inchash::hash &inchash);
kono
parents:
diff changeset
343
kono
parents:
diff changeset
344 /* Return true if polymorphic comparison must be processed. */
kono
parents:
diff changeset
345 bool compare_polymorphic_p (void);
kono
parents:
diff changeset
346
kono
parents:
diff changeset
347 /* For a given call graph NODE, the function constructs new
kono
parents:
diff changeset
348 semantic function item. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
349 static sem_function *parse (cgraph_node *node, bitmap_obstack *stack,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
350 ipa_icf_gimple::func_checker *checker);
111
kono
parents:
diff changeset
351
kono
parents:
diff changeset
352 /* Perform additional checks needed to match types of used function
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
353 parameters. */
111
kono
parents:
diff changeset
354 bool compatible_parm_types_p (tree, tree);
kono
parents:
diff changeset
355
kono
parents:
diff changeset
356 /* Exception handling region tree. */
kono
parents:
diff changeset
357 eh_region region_tree;
kono
parents:
diff changeset
358
kono
parents:
diff changeset
359 /* Number of function arguments. */
kono
parents:
diff changeset
360 unsigned int arg_count;
kono
parents:
diff changeset
361
kono
parents:
diff changeset
362 /* Total amount of edges in the function. */
kono
parents:
diff changeset
363 unsigned int edge_count;
kono
parents:
diff changeset
364
kono
parents:
diff changeset
365 /* Vector of sizes of all basic blocks. */
kono
parents:
diff changeset
366 vec <unsigned int> bb_sizes;
kono
parents:
diff changeset
367
kono
parents:
diff changeset
368 /* Control flow graph checksum. */
kono
parents:
diff changeset
369 hashval_t cfg_checksum;
kono
parents:
diff changeset
370
kono
parents:
diff changeset
371 /* GIMPLE codes hash value. */
kono
parents:
diff changeset
372 hashval_t gcode_hash;
kono
parents:
diff changeset
373
kono
parents:
diff changeset
374 /* Total number of SSA names used in the function. */
kono
parents:
diff changeset
375 unsigned ssa_names_size;
kono
parents:
diff changeset
376
kono
parents:
diff changeset
377 /* Array of structures for all basic blocks. */
kono
parents:
diff changeset
378 vec <ipa_icf_gimple::sem_bb *> bb_sorted;
kono
parents:
diff changeset
379
kono
parents:
diff changeset
380 /* Return true if parameter I may be used. */
kono
parents:
diff changeset
381 bool param_used_p (unsigned int i);
kono
parents:
diff changeset
382
kono
parents:
diff changeset
383 private:
kono
parents:
diff changeset
384 /* Calculates hash value based on a BASIC_BLOCK. */
kono
parents:
diff changeset
385 hashval_t get_bb_hash (const ipa_icf_gimple::sem_bb *basic_block);
kono
parents:
diff changeset
386
kono
parents:
diff changeset
387 /* For given basic blocks BB1 and BB2 (from functions FUNC1 and FUNC),
kono
parents:
diff changeset
388 true value is returned if phi nodes are semantically
kono
parents:
diff changeset
389 equivalent in these blocks . */
kono
parents:
diff changeset
390 bool compare_phi_node (basic_block bb1, basic_block bb2);
kono
parents:
diff changeset
391
kono
parents:
diff changeset
392 /* Basic blocks dictionary BB_DICT returns true if SOURCE index BB
kono
parents:
diff changeset
393 corresponds to TARGET. */
kono
parents:
diff changeset
394 bool bb_dict_test (vec<int> *bb_dict, int source, int target);
kono
parents:
diff changeset
395
kono
parents:
diff changeset
396 /* If cgraph edges E1 and E2 are indirect calls, verify that
kono
parents:
diff changeset
397 ICF flags are the same. */
kono
parents:
diff changeset
398 bool compare_edge_flags (cgraph_edge *e1, cgraph_edge *e2);
kono
parents:
diff changeset
399
kono
parents:
diff changeset
400 /* Processes function equality comparison. */
kono
parents:
diff changeset
401 bool equals_private (sem_item *item);
kono
parents:
diff changeset
402
kono
parents:
diff changeset
403 /* Function checker stores binding between functions. */
kono
parents:
diff changeset
404 ipa_icf_gimple::func_checker *m_checker;
kono
parents:
diff changeset
405
kono
parents:
diff changeset
406 /* COMPARED_FUNC is a function that we compare to. */
kono
parents:
diff changeset
407 sem_function *m_compared_func;
kono
parents:
diff changeset
408 }; // class sem_function
kono
parents:
diff changeset
409
kono
parents:
diff changeset
410 class sem_variable: public sem_item
kono
parents:
diff changeset
411 {
kono
parents:
diff changeset
412 public:
kono
parents:
diff changeset
413 /* Semantic variable constructor that uses STACK as bitmap memory stack. */
kono
parents:
diff changeset
414 sem_variable (bitmap_obstack *stack);
kono
parents:
diff changeset
415
kono
parents:
diff changeset
416 /* Constructor based on callgraph node _NODE.
kono
parents:
diff changeset
417 Bitmap STACK is used for memory allocation. */
kono
parents:
diff changeset
418
kono
parents:
diff changeset
419 sem_variable (varpool_node *_node, bitmap_obstack *stack);
kono
parents:
diff changeset
420
kono
parents:
diff changeset
421 /* Semantic variable initialization function. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
422 virtual void init (ipa_icf_gimple::func_checker *);
111
kono
parents:
diff changeset
423
kono
parents:
diff changeset
424 virtual hashval_t get_hash (void);
kono
parents:
diff changeset
425 virtual bool merge (sem_item *alias_item);
kono
parents:
diff changeset
426 virtual void dump_to_file (FILE *file);
kono
parents:
diff changeset
427 virtual bool equals (sem_item *item,
kono
parents:
diff changeset
428 hash_map <symtab_node *, sem_item *> &ignored_nodes);
kono
parents:
diff changeset
429
kono
parents:
diff changeset
430 /* Fast equality variable based on knowledge known in WPA. */
kono
parents:
diff changeset
431 virtual bool equals_wpa (sem_item *item,
kono
parents:
diff changeset
432 hash_map <symtab_node *, sem_item *> &ignored_nodes);
kono
parents:
diff changeset
433
kono
parents:
diff changeset
434 /* Returns varpool_node. */
kono
parents:
diff changeset
435 inline varpool_node *get_node (void)
kono
parents:
diff changeset
436 {
kono
parents:
diff changeset
437 return dyn_cast <varpool_node *> (node);
kono
parents:
diff changeset
438 }
kono
parents:
diff changeset
439
kono
parents:
diff changeset
440 /* Parser function that visits a varpool NODE. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
441 static sem_variable *parse (varpool_node *node, bitmap_obstack *stack,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
442 ipa_icf_gimple::func_checker *checker);
111
kono
parents:
diff changeset
443
kono
parents:
diff changeset
444 private:
kono
parents:
diff changeset
445 /* Compares trees T1 and T2 for semantic equality. */
kono
parents:
diff changeset
446 static bool equals (tree t1, tree t2);
kono
parents:
diff changeset
447 }; // class sem_variable
kono
parents:
diff changeset
448
kono
parents:
diff changeset
449 class sem_item_optimizer;
kono
parents:
diff changeset
450
kono
parents:
diff changeset
451 struct congruence_class_group
kono
parents:
diff changeset
452 {
kono
parents:
diff changeset
453 hashval_t hash;
kono
parents:
diff changeset
454 sem_item_type type;
kono
parents:
diff changeset
455 vec <congruence_class *> classes;
kono
parents:
diff changeset
456 };
kono
parents:
diff changeset
457
kono
parents:
diff changeset
458 /* Congruence class set structure. */
kono
parents:
diff changeset
459 struct congruence_class_hash : nofree_ptr_hash <congruence_class_group>
kono
parents:
diff changeset
460 {
kono
parents:
diff changeset
461 static inline hashval_t hash (const congruence_class_group *item)
kono
parents:
diff changeset
462 {
kono
parents:
diff changeset
463 return item->hash;
kono
parents:
diff changeset
464 }
kono
parents:
diff changeset
465
kono
parents:
diff changeset
466 static inline int equal (const congruence_class_group *item1,
kono
parents:
diff changeset
467 const congruence_class_group *item2)
kono
parents:
diff changeset
468 {
kono
parents:
diff changeset
469 return item1->hash == item2->hash && item1->type == item2->type;
kono
parents:
diff changeset
470 }
kono
parents:
diff changeset
471 };
kono
parents:
diff changeset
472
kono
parents:
diff changeset
473 struct traverse_split_pair
kono
parents:
diff changeset
474 {
kono
parents:
diff changeset
475 sem_item_optimizer *optimizer;
kono
parents:
diff changeset
476 class congruence_class *cls;
kono
parents:
diff changeset
477 };
kono
parents:
diff changeset
478
kono
parents:
diff changeset
479 /* Semantic item optimizer includes all top-level logic
kono
parents:
diff changeset
480 related to semantic equality comparison. */
kono
parents:
diff changeset
481 class sem_item_optimizer
kono
parents:
diff changeset
482 {
kono
parents:
diff changeset
483 public:
kono
parents:
diff changeset
484 sem_item_optimizer ();
kono
parents:
diff changeset
485 ~sem_item_optimizer ();
kono
parents:
diff changeset
486
kono
parents:
diff changeset
487 /* Function responsible for visiting all potential functions and
kono
parents:
diff changeset
488 read-only variables that can be merged. */
kono
parents:
diff changeset
489 void parse_funcs_and_vars (void);
kono
parents:
diff changeset
490
kono
parents:
diff changeset
491 /* Optimizer entry point which returns true in case it processes
kono
parents:
diff changeset
492 a merge operation. True is returned if there's a merge operation
kono
parents:
diff changeset
493 processed. */
kono
parents:
diff changeset
494 bool execute (void);
kono
parents:
diff changeset
495
kono
parents:
diff changeset
496 /* Dump function. */
kono
parents:
diff changeset
497 void dump (void);
kono
parents:
diff changeset
498
kono
parents:
diff changeset
499 /* Verify congruence classes if checking is enabled. */
kono
parents:
diff changeset
500 void checking_verify_classes (void);
kono
parents:
diff changeset
501
kono
parents:
diff changeset
502 /* Verify congruence classes. */
kono
parents:
diff changeset
503 void verify_classes (void);
kono
parents:
diff changeset
504
kono
parents:
diff changeset
505 /* Write IPA ICF summary for symbols. */
kono
parents:
diff changeset
506 void write_summary (void);
kono
parents:
diff changeset
507
kono
parents:
diff changeset
508 /* Read IPA ICF summary for symbols. */
kono
parents:
diff changeset
509 void read_summary (void);
kono
parents:
diff changeset
510
kono
parents:
diff changeset
511 /* Callgraph removal hook called for a NODE with a custom DATA. */
kono
parents:
diff changeset
512 static void cgraph_removal_hook (cgraph_node *node, void *data);
kono
parents:
diff changeset
513
kono
parents:
diff changeset
514 /* Varpool removal hook called for a NODE with a custom DATA. */
kono
parents:
diff changeset
515 static void varpool_removal_hook (varpool_node *node, void *data);
kono
parents:
diff changeset
516
kono
parents:
diff changeset
517 /* Worklist of congruence classes that can potentially
kono
parents:
diff changeset
518 refine classes of congruence. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
519 fibonacci_heap<unsigned, congruence_class> worklist;
111
kono
parents:
diff changeset
520
kono
parents:
diff changeset
521 /* Remove semantic ITEM and release memory. */
kono
parents:
diff changeset
522 void remove_item (sem_item *item);
kono
parents:
diff changeset
523
kono
parents:
diff changeset
524 /* Remove symtab NODE triggered by symtab removal hooks. */
kono
parents:
diff changeset
525 void remove_symtab_node (symtab_node *node);
kono
parents:
diff changeset
526
kono
parents:
diff changeset
527 /* Register callgraph and varpool hooks. */
kono
parents:
diff changeset
528 void register_hooks (void);
kono
parents:
diff changeset
529
kono
parents:
diff changeset
530 /* Unregister callgraph and varpool hooks. */
kono
parents:
diff changeset
531 void unregister_hooks (void);
kono
parents:
diff changeset
532
kono
parents:
diff changeset
533 /* Adds a CLS to hashtable associated by hash value. */
kono
parents:
diff changeset
534 void add_class (congruence_class *cls);
kono
parents:
diff changeset
535
kono
parents:
diff changeset
536 /* Gets a congruence class group based on given HASH value and TYPE. */
kono
parents:
diff changeset
537 congruence_class_group *get_group_by_hash (hashval_t hash,
kono
parents:
diff changeset
538 sem_item_type type);
kono
parents:
diff changeset
539 private:
kono
parents:
diff changeset
540
kono
parents:
diff changeset
541 /* For each semantic item, append hash values of references. */
kono
parents:
diff changeset
542 void update_hash_by_addr_refs ();
kono
parents:
diff changeset
543
kono
parents:
diff changeset
544 /* Congruence classes are built by hash value. */
kono
parents:
diff changeset
545 void build_hash_based_classes (void);
kono
parents:
diff changeset
546
kono
parents:
diff changeset
547 /* Semantic items in classes having more than one element and initialized.
kono
parents:
diff changeset
548 In case of WPA, we load function body. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
549 unsigned int parse_nonsingleton_classes (void);
111
kono
parents:
diff changeset
550
kono
parents:
diff changeset
551 /* Equality function for semantic items is used to subdivide existing
kono
parents:
diff changeset
552 classes. If IN_WPA, fast equality function is invoked. */
kono
parents:
diff changeset
553 void subdivide_classes_by_equality (bool in_wpa = false);
kono
parents:
diff changeset
554
kono
parents:
diff changeset
555 /* Subdivide classes by address and interposable references
kono
parents:
diff changeset
556 that members of the class reference.
kono
parents:
diff changeset
557 Example can be a pair of functions that have an address
kono
parents:
diff changeset
558 taken from a function. If these addresses are different the class
kono
parents:
diff changeset
559 is split. */
kono
parents:
diff changeset
560 unsigned subdivide_classes_by_sensitive_refs();
kono
parents:
diff changeset
561
kono
parents:
diff changeset
562 /* Debug function prints all informations about congruence classes. */
kono
parents:
diff changeset
563 void dump_cong_classes (void);
kono
parents:
diff changeset
564
kono
parents:
diff changeset
565 /* Build references according to call graph. */
kono
parents:
diff changeset
566 void build_graph (void);
kono
parents:
diff changeset
567
kono
parents:
diff changeset
568 /* Iterative congruence reduction function. */
kono
parents:
diff changeset
569 void process_cong_reduction (void);
kono
parents:
diff changeset
570
kono
parents:
diff changeset
571 /* After reduction is done, we can declare all items in a group
kono
parents:
diff changeset
572 to be equal. PREV_CLASS_COUNT is start number of classes
kono
parents:
diff changeset
573 before reduction. True is returned if there's a merge operation
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
574 processed. LOADED_SYMBOLS is number of symbols that were loaded
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
575 in WPA. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
576 bool merge_classes (unsigned int prev_class_count,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
577 unsigned int loaded_symbols);
111
kono
parents:
diff changeset
578
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
579 /* Fixup points to analysis info. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
580 void fixup_points_to_sets (void);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
581
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
582 /* Fixup points to set PT. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
583 void fixup_pt_set (struct pt_solution *pt);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
584
111
kono
parents:
diff changeset
585 /* Adds a newly created congruence class CLS to worklist. */
kono
parents:
diff changeset
586 void worklist_push (congruence_class *cls);
kono
parents:
diff changeset
587
kono
parents:
diff changeset
588 /* Pops a class from worklist. */
kono
parents:
diff changeset
589 congruence_class *worklist_pop ();
kono
parents:
diff changeset
590
kono
parents:
diff changeset
591 /* Every usage of a congruence class CLS is a candidate that can split the
kono
parents:
diff changeset
592 collection of classes. Bitmap stack BMSTACK is used for bitmap
kono
parents:
diff changeset
593 allocation. */
kono
parents:
diff changeset
594 void do_congruence_step (congruence_class *cls);
kono
parents:
diff changeset
595
kono
parents:
diff changeset
596 /* Tests if a class CLS used as INDEXth splits any congruence classes.
kono
parents:
diff changeset
597 Bitmap stack BMSTACK is used for bitmap allocation. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
598 bool do_congruence_step_for_index (congruence_class *cls, unsigned int index);
111
kono
parents:
diff changeset
599
kono
parents:
diff changeset
600 /* Makes pairing between a congruence class CLS and semantic ITEM. */
kono
parents:
diff changeset
601 static void add_item_to_class (congruence_class *cls, sem_item *item);
kono
parents:
diff changeset
602
kono
parents:
diff changeset
603 /* Disposes split map traverse function. CLS is congruence
kono
parents:
diff changeset
604 class, BSLOT is bitmap slot we want to release. DATA is mandatory,
kono
parents:
diff changeset
605 but unused argument. */
kono
parents:
diff changeset
606 static bool release_split_map (congruence_class * const &cls, bitmap const &b,
kono
parents:
diff changeset
607 traverse_split_pair *pair);
kono
parents:
diff changeset
608
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
609 /* Process split operation for a congruence class CLS,
111
kono
parents:
diff changeset
610 where bitmap B splits congruence class members. DATA is used
kono
parents:
diff changeset
611 as argument of split pair. */
kono
parents:
diff changeset
612 static bool traverse_congruence_split (congruence_class * const &cls,
kono
parents:
diff changeset
613 bitmap const &b,
kono
parents:
diff changeset
614 traverse_split_pair *pair);
kono
parents:
diff changeset
615
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
616 /* Compare function for sorting pairs in do_congruence_step_f. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
617 static int sort_congruence_split (const void *, const void *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
618
111
kono
parents:
diff changeset
619 /* Reads a section from LTO stream file FILE_DATA. Input block for DATA
kono
parents:
diff changeset
620 contains LEN bytes. */
kono
parents:
diff changeset
621 void read_section (lto_file_decl_data *file_data, const char *data,
kono
parents:
diff changeset
622 size_t len);
kono
parents:
diff changeset
623
kono
parents:
diff changeset
624 /* Removes all callgraph and varpool nodes that are marked by symtab
kono
parents:
diff changeset
625 as deleted. */
kono
parents:
diff changeset
626 void filter_removed_items (void);
kono
parents:
diff changeset
627
kono
parents:
diff changeset
628 /* Vector of semantic items. */
kono
parents:
diff changeset
629 vec <sem_item *> m_items;
kono
parents:
diff changeset
630
kono
parents:
diff changeset
631 /* A set containing all items removed by hooks. */
kono
parents:
diff changeset
632 hash_set <symtab_node *> m_removed_items_set;
kono
parents:
diff changeset
633
kono
parents:
diff changeset
634 /* Hashtable of congruence classes. */
kono
parents:
diff changeset
635 hash_table <congruence_class_hash> m_classes;
kono
parents:
diff changeset
636
kono
parents:
diff changeset
637 /* Count of congruence classes. */
kono
parents:
diff changeset
638 unsigned int m_classes_count;
kono
parents:
diff changeset
639
kono
parents:
diff changeset
640 /* Map data structure maps symtab nodes to semantic items. */
kono
parents:
diff changeset
641 hash_map <symtab_node *, sem_item *> m_symtab_node_map;
kono
parents:
diff changeset
642
kono
parents:
diff changeset
643 /* Set to true if a splitter class is removed. */
kono
parents:
diff changeset
644 bool splitter_class_removed;
kono
parents:
diff changeset
645
kono
parents:
diff changeset
646 /* Global unique class id counter. */
kono
parents:
diff changeset
647 static unsigned int class_id;
kono
parents:
diff changeset
648
kono
parents:
diff changeset
649 /* Callgraph node removal hook holder. */
kono
parents:
diff changeset
650 cgraph_node_hook_list *m_cgraph_node_hooks;
kono
parents:
diff changeset
651
kono
parents:
diff changeset
652 /* Varpool node removal hook holder. */
kono
parents:
diff changeset
653 varpool_node_hook_list *m_varpool_node_hooks;
kono
parents:
diff changeset
654
kono
parents:
diff changeset
655 /* Bitmap stack. */
kono
parents:
diff changeset
656 bitmap_obstack m_bmstack;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
657
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
658 /* Vector of merged variables. Needed for fixup of points-to-analysis
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
659 info. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
660 vec <symtab_pair> m_merged_variables;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
661
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
662 /* Hash map will all references. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
663 ref_map m_references;
111
kono
parents:
diff changeset
664 }; // class sem_item_optimizer
kono
parents:
diff changeset
665
kono
parents:
diff changeset
666 } // ipa_icf namespace