PR jit/63854: Fix leak in ipa-icf.c
[gcc.git] / gcc / ipa-icf.c
1 /* Interprocedural Identical Code Folding pass
2 Copyright (C) 2014 Free Software Foundation, Inc.
3
4 Contributed by Jan Hubicka <hubicka@ucw.cz> and Martin Liska <mliska@suse.cz>
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
21
22 /* Interprocedural Identical Code Folding for functions and
23 read-only variables.
24
25 The goal of this transformation is to discover functions and read-only
26 variables which do have exactly the same semantics.
27
28 In case of functions,
29 we could either create a virtual clone or do a simple function wrapper
30 that will call equivalent function. If the function is just locally visible,
31 all function calls can be redirected. For read-only variables, we create
32 aliases if possible.
33
34 Optimization pass arranges as follows:
35 1) All functions and read-only variables are visited and internal
36 data structure, either sem_function or sem_variables is created.
37 2) For every symbol from the previous step, VAR_DECL and FUNCTION_DECL are
38 saved and matched to corresponding sem_items.
39 3) These declaration are ignored for equality check and are solved
40 by Value Numbering algorithm published by Alpert, Zadeck in 1992.
41 4) We compute hash value for each symbol.
42 5) Congruence classes are created based on hash value. If hash value are
43 equal, equals function is called and symbols are deeply compared.
44 We must prove that all SSA names, declarations and other items
45 correspond.
46 6) Value Numbering is executed for these classes. At the end of the process
47 all symbol members in remaining classes can be merged.
48 7) Merge operation creates alias in case of read-only variables. For
49 callgraph node, we must decide if we can redirect local calls,
50 create an alias or a thunk.
51
52 */
53
54 #include "config.h"
55 #include "system.h"
56 #include "coretypes.h"
57 #include "tree.h"
58 #include "predict.h"
59 #include "vec.h"
60 #include "hashtab.h"
61 #include "hash-set.h"
62 #include "machmode.h"
63 #include "tm.h"
64 #include "hard-reg-set.h"
65 #include "input.h"
66 #include "function.h"
67 #include "dominance.h"
68 #include "cfg.h"
69 #include "basic-block.h"
70 #include "tree-ssa-alias.h"
71 #include "internal-fn.h"
72 #include "gimple-expr.h"
73 #include "is-a.h"
74 #include "gimple.h"
75 #include "expr.h"
76 #include "gimple-iterator.h"
77 #include "gimple-ssa.h"
78 #include "tree-cfg.h"
79 #include "tree-phinodes.h"
80 #include "stringpool.h"
81 #include "tree-ssanames.h"
82 #include "tree-dfa.h"
83 #include "tree-pass.h"
84 #include "gimple-pretty-print.h"
85 #include "hash-map.h"
86 #include "plugin-api.h"
87 #include "ipa-ref.h"
88 #include "cgraph.h"
89 #include "alloc-pool.h"
90 #include "ipa-prop.h"
91 #include "ipa-inline.h"
92 #include "cfgloop.h"
93 #include "except.h"
94 #include "hash-table.h"
95 #include "coverage.h"
96 #include "attribs.h"
97 #include "print-tree.h"
98 #include "lto-streamer.h"
99 #include "data-streamer.h"
100 #include "ipa-utils.h"
101 #include <list>
102 #include "ipa-icf-gimple.h"
103 #include "ipa-icf.h"
104
105 using namespace ipa_icf_gimple;
106
107 namespace ipa_icf {
108 /* Constructor for key value pair, where _ITEM is key and _INDEX is a target. */
109
110 sem_usage_pair::sem_usage_pair (sem_item *_item, unsigned int _index):
111 item (_item), index (_index)
112 {
113 }
114
115 /* Semantic item constructor for a node of _TYPE, where STACK is used
116 for bitmap memory allocation. */
117
118 sem_item::sem_item (sem_item_type _type,
119 bitmap_obstack *stack): type(_type), hash(0)
120 {
121 setup (stack);
122 }
123
124 /* Semantic item constructor for a node of _TYPE, where STACK is used
125 for bitmap memory allocation. The item is based on symtab node _NODE
126 with computed _HASH. */
127
128 sem_item::sem_item (sem_item_type _type, symtab_node *_node,
129 hashval_t _hash, bitmap_obstack *stack): type(_type),
130 node (_node), hash (_hash)
131 {
132 decl = node->decl;
133 setup (stack);
134 }
135
136 /* Add reference to a semantic TARGET. */
137
138 void
139 sem_item::add_reference (sem_item *target)
140 {
141 refs.safe_push (target);
142 unsigned index = refs.length ();
143 target->usages.safe_push (new sem_usage_pair(this, index));
144 bitmap_set_bit (target->usage_index_bitmap, index);
145 refs_set.add (target->node);
146 }
147
148 /* Initialize internal data structures. Bitmap STACK is used for
149 bitmap memory allocation process. */
150
151 void
152 sem_item::setup (bitmap_obstack *stack)
153 {
154 gcc_checking_assert (node);
155
156 refs.create (0);
157 tree_refs.create (0);
158 usages.create (0);
159 usage_index_bitmap = BITMAP_ALLOC (stack);
160 }
161
162 sem_item::~sem_item ()
163 {
164 for (unsigned i = 0; i < usages.length (); i++)
165 delete usages[i];
166
167 refs.release ();
168 tree_refs.release ();
169 usages.release ();
170
171 BITMAP_FREE (usage_index_bitmap);
172 }
173
174 /* Dump function for debugging purpose. */
175
176 DEBUG_FUNCTION void
177 sem_item::dump (void)
178 {
179 if (dump_file)
180 {
181 fprintf (dump_file, "[%s] %s (%u) (tree:%p)\n", type == FUNC ? "func" : "var",
182 name(), node->order, (void *) node->decl);
183 fprintf (dump_file, " hash: %u\n", get_hash ());
184 fprintf (dump_file, " references: ");
185
186 for (unsigned i = 0; i < refs.length (); i++)
187 fprintf (dump_file, "%s%s ", refs[i]->name (),
188 i < refs.length() - 1 ? "," : "");
189
190 fprintf (dump_file, "\n");
191 }
192 }
193
194 /* Return true if target supports alias symbols. */
195
196 bool
197 sem_item::target_supports_symbol_aliases_p (void)
198 {
199 #if !defined (ASM_OUTPUT_DEF) || (!defined(ASM_OUTPUT_WEAK_ALIAS) && !defined (ASM_WEAKEN_DECL))
200 return false;
201 #else
202 return true;
203 #endif
204 }
205
206 /* Semantic function constructor that uses STACK as bitmap memory stack. */
207
208 sem_function::sem_function (bitmap_obstack *stack): sem_item (FUNC, stack),
209 m_checker (NULL), m_compared_func (NULL)
210 {
211 arg_types.create (0);
212 bb_sizes.create (0);
213 bb_sorted.create (0);
214 }
215
216 /* Constructor based on callgraph node _NODE with computed hash _HASH.
217 Bitmap STACK is used for memory allocation. */
218 sem_function::sem_function (cgraph_node *node, hashval_t hash,
219 bitmap_obstack *stack):
220 sem_item (FUNC, node, hash, stack),
221 m_checker (NULL), m_compared_func (NULL)
222 {
223 arg_types.create (0);
224 bb_sizes.create (0);
225 bb_sorted.create (0);
226 }
227
228 sem_function::~sem_function ()
229 {
230 for (unsigned i = 0; i < bb_sorted.length (); i++)
231 delete (bb_sorted[i]);
232
233 arg_types.release ();
234 bb_sizes.release ();
235 bb_sorted.release ();
236 }
237
238 /* Calculates hash value based on a BASIC_BLOCK. */
239
240 hashval_t
241 sem_function::get_bb_hash (const sem_bb *basic_block)
242 {
243 inchash::hash hstate;
244
245 hstate.add_int (basic_block->nondbg_stmt_count);
246 hstate.add_int (basic_block->edge_count);
247
248 return hstate.end ();
249 }
250
251 /* References independent hash function. */
252
253 hashval_t
254 sem_function::get_hash (void)
255 {
256 if(!hash)
257 {
258 inchash::hash hstate;
259 hstate.add_int (177454); /* Random number for function type. */
260
261 hstate.add_int (arg_count);
262 hstate.add_int (cfg_checksum);
263 hstate.add_int (gcode_hash);
264
265 for (unsigned i = 0; i < bb_sorted.length (); i++)
266 hstate.merge_hash (get_bb_hash (bb_sorted[i]));
267
268 for (unsigned i = 0; i < bb_sizes.length (); i++)
269 hstate.add_int (bb_sizes[i]);
270
271 hash = hstate.end ();
272 }
273
274 return hash;
275 }
276
277 /* For a given symbol table nodes N1 and N2, we check that FUNCTION_DECLs
278 point to a same function. Comparison can be skipped if IGNORED_NODES
279 contains these nodes. */
280
281 bool
282 sem_function::compare_cgraph_references (hash_map <symtab_node *, sem_item *>
283 &ignored_nodes,
284 symtab_node *n1, symtab_node *n2)
285 {
286 if (n1 == n2 || (ignored_nodes.get (n1) && ignored_nodes.get (n2)))
287 return true;
288
289 /* TODO: add more precise comparison for weakrefs, etc. */
290
291 return return_false_with_msg ("different references");
292 }
293
294 /* If cgraph edges E1 and E2 are indirect calls, verify that
295 ECF flags are the same. */
296
297 bool sem_function::compare_edge_flags (cgraph_edge *e1, cgraph_edge *e2)
298 {
299 if (e1->indirect_info && e2->indirect_info)
300 {
301 int e1_flags = e1->indirect_info->ecf_flags;
302 int e2_flags = e2->indirect_info->ecf_flags;
303
304 if (e1_flags != e2_flags)
305 return return_false_with_msg ("ICF flags are different");
306 }
307 else if (e1->indirect_info || e2->indirect_info)
308 return false;
309
310 return true;
311 }
312
313 /* Fast equality function based on knowledge known in WPA. */
314
315 bool
316 sem_function::equals_wpa (sem_item *item,
317 hash_map <symtab_node *, sem_item *> &ignored_nodes)
318 {
319 gcc_assert (item->type == FUNC);
320
321 m_compared_func = static_cast<sem_function *> (item);
322
323 if (arg_types.length () != m_compared_func->arg_types.length ())
324 return return_false_with_msg ("different number of arguments");
325
326 /* Checking types of arguments. */
327 for (unsigned i = 0; i < arg_types.length (); i++)
328 {
329 /* This guard is here for function pointer with attributes (pr59927.c). */
330 if (!arg_types[i] || !m_compared_func->arg_types[i])
331 return return_false_with_msg ("NULL argument type");
332
333 /* Polymorphic comparison is executed just for non-leaf functions. */
334 bool is_not_leaf = get_node ()->callees != NULL;
335
336 if (!func_checker::compatible_types_p (arg_types[i],
337 m_compared_func->arg_types[i],
338 is_not_leaf, i == 0))
339 return return_false_with_msg ("argument type is different");
340 }
341
342 /* Result type checking. */
343 if (!func_checker::compatible_types_p (result_type,
344 m_compared_func->result_type))
345 return return_false_with_msg ("result types are different");
346
347 if (node->num_references () != item->node->num_references ())
348 return return_false_with_msg ("different number of references");
349
350 ipa_ref *ref = NULL, *ref2 = NULL;
351 for (unsigned i = 0; node->iterate_reference (i, ref); i++)
352 {
353 item->node->iterate_reference (i, ref2);
354
355 if (!compare_cgraph_references (ignored_nodes, ref->referred, ref2->referred))
356 return false;
357 }
358
359 cgraph_edge *e1 = dyn_cast <cgraph_node *> (node)->callees;
360 cgraph_edge *e2 = dyn_cast <cgraph_node *> (item->node)->callees;
361
362 while (e1 && e2)
363 {
364 if (!compare_cgraph_references (ignored_nodes, e1->callee, e2->callee))
365 return false;
366
367 e1 = e1->next_callee;
368 e2 = e2->next_callee;
369 }
370
371 if (e1 || e2)
372 return return_false_with_msg ("different number of edges");
373
374 return true;
375 }
376
377 /* Returns true if the item equals to ITEM given as argument. */
378
379 bool
380 sem_function::equals (sem_item *item,
381 hash_map <symtab_node *, sem_item *> &ignored_nodes)
382 {
383 gcc_assert (item->type == FUNC);
384 bool eq = equals_private (item, ignored_nodes);
385
386 if (m_checker != NULL)
387 {
388 delete m_checker;
389 m_checker = NULL;
390 }
391
392 if (dump_file && (dump_flags & TDF_DETAILS))
393 fprintf (dump_file,
394 "Equals called for:%s:%s (%u:%u) (%s:%s) with result: %s\n\n",
395 name(), item->name (), node->order, item->node->order, asm_name (),
396 item->asm_name (), eq ? "true" : "false");
397
398 return eq;
399 }
400
401 /* Processes function equality comparison. */
402
403 bool
404 sem_function::equals_private (sem_item *item,
405 hash_map <symtab_node *, sem_item *> &ignored_nodes)
406 {
407 if (item->type != FUNC)
408 return false;
409
410 basic_block bb1, bb2;
411 edge e1, e2;
412 edge_iterator ei1, ei2;
413 int *bb_dict = NULL;
414 bool result = true;
415 tree arg1, arg2;
416
417 m_compared_func = static_cast<sem_function *> (item);
418
419 gcc_assert (decl != item->decl);
420
421 if (bb_sorted.length () != m_compared_func->bb_sorted.length ()
422 || edge_count != m_compared_func->edge_count
423 || cfg_checksum != m_compared_func->cfg_checksum)
424 return return_false ();
425
426 if (!equals_wpa (item, ignored_nodes))
427 return false;
428
429 /* Checking function arguments. */
430 tree decl1 = DECL_ATTRIBUTES (decl);
431 tree decl2 = DECL_ATTRIBUTES (m_compared_func->decl);
432
433 m_checker = new func_checker (decl, m_compared_func->decl,
434 compare_polymorphic_p (),
435 false,
436 &refs_set,
437 &m_compared_func->refs_set);
438 while (decl1)
439 {
440 if (decl2 == NULL)
441 return return_false ();
442
443 if (get_attribute_name (decl1) != get_attribute_name (decl2))
444 return return_false ();
445
446 tree attr_value1 = TREE_VALUE (decl1);
447 tree attr_value2 = TREE_VALUE (decl2);
448
449 if (attr_value1 && attr_value2)
450 {
451 bool ret = m_checker->compare_operand (TREE_VALUE (attr_value1),
452 TREE_VALUE (attr_value2));
453 if (!ret)
454 return return_false_with_msg ("attribute values are different");
455 }
456 else if (!attr_value1 && !attr_value2)
457 {}
458 else
459 return return_false ();
460
461 decl1 = TREE_CHAIN (decl1);
462 decl2 = TREE_CHAIN (decl2);
463 }
464
465 if (decl1 != decl2)
466 return return_false();
467
468
469 for (arg1 = DECL_ARGUMENTS (decl),
470 arg2 = DECL_ARGUMENTS (m_compared_func->decl);
471 arg1; arg1 = DECL_CHAIN (arg1), arg2 = DECL_CHAIN (arg2))
472 if (!m_checker->compare_decl (arg1, arg2))
473 return return_false ();
474
475 /* Fill-up label dictionary. */
476 for (unsigned i = 0; i < bb_sorted.length (); ++i)
477 {
478 m_checker->parse_labels (bb_sorted[i]);
479 m_checker->parse_labels (m_compared_func->bb_sorted[i]);
480 }
481
482 /* Checking all basic blocks. */
483 for (unsigned i = 0; i < bb_sorted.length (); ++i)
484 if(!m_checker->compare_bb (bb_sorted[i], m_compared_func->bb_sorted[i]))
485 return return_false();
486
487 dump_message ("All BBs are equal\n");
488
489 /* Basic block edges check. */
490 for (unsigned i = 0; i < bb_sorted.length (); ++i)
491 {
492 bb_dict = XNEWVEC (int, bb_sorted.length () + 2);
493 memset (bb_dict, -1, (bb_sorted.length () + 2) * sizeof (int));
494
495 bb1 = bb_sorted[i]->bb;
496 bb2 = m_compared_func->bb_sorted[i]->bb;
497
498 ei2 = ei_start (bb2->preds);
499
500 for (ei1 = ei_start (bb1->preds); ei_cond (ei1, &e1); ei_next (&ei1))
501 {
502 ei_cond (ei2, &e2);
503
504 if (e1->flags != e2->flags)
505 return return_false_with_msg ("flags comparison returns false");
506
507 if (!bb_dict_test (bb_dict, e1->src->index, e2->src->index))
508 return return_false_with_msg ("edge comparison returns false");
509
510 if (!bb_dict_test (bb_dict, e1->dest->index, e2->dest->index))
511 return return_false_with_msg ("BB comparison returns false");
512
513 if (!m_checker->compare_edge (e1, e2))
514 return return_false_with_msg ("edge comparison returns false");
515
516 ei_next (&ei2);
517 }
518 }
519
520 /* Basic block PHI nodes comparison. */
521 for (unsigned i = 0; i < bb_sorted.length (); i++)
522 if (!compare_phi_node (bb_sorted[i]->bb, m_compared_func->bb_sorted[i]->bb))
523 return return_false_with_msg ("PHI node comparison returns false");
524
525 return result;
526 }
527
528 /* Merges instance with an ALIAS_ITEM, where alias, thunk or redirection can
529 be applied. */
530 bool
531 sem_function::merge (sem_item *alias_item)
532 {
533 gcc_assert (alias_item->type == FUNC);
534
535 sem_function *alias_func = static_cast<sem_function *> (alias_item);
536
537 cgraph_node *original = get_node ();
538 cgraph_node *local_original = original;
539 cgraph_node *alias = alias_func->get_node ();
540 bool original_address_matters;
541 bool alias_address_matters;
542
543 bool create_thunk = false;
544 bool create_alias = false;
545 bool redirect_callers = false;
546 bool original_discardable = false;
547
548 /* Do not attempt to mix functions from different user sections;
549 we do not know what user intends with those. */
550 if (((DECL_SECTION_NAME (original->decl) && !original->implicit_section)
551 || (DECL_SECTION_NAME (alias->decl) && !alias->implicit_section))
552 && DECL_SECTION_NAME (original->decl) != DECL_SECTION_NAME (alias->decl))
553 {
554 if (dump_file)
555 fprintf (dump_file,
556 "Not unifying; original and alias are in different sections.\n\n");
557 return false;
558 }
559
560 /* See if original is in a section that can be discarded if the main
561 symbol is not used. */
562 if (DECL_EXTERNAL (original->decl))
563 original_discardable = true;
564 if (original->resolution == LDPR_PREEMPTED_REG
565 || original->resolution == LDPR_PREEMPTED_IR)
566 original_discardable = true;
567 if (original->can_be_discarded_p ())
568 original_discardable = true;
569
570 /* See if original and/or alias address can be compared for equality. */
571 original_address_matters
572 = (!DECL_VIRTUAL_P (original->decl)
573 && (original->externally_visible
574 || original->address_taken_from_non_vtable_p ()));
575 alias_address_matters
576 = (!DECL_VIRTUAL_P (alias->decl)
577 && (alias->externally_visible
578 || alias->address_taken_from_non_vtable_p ()));
579
580 /* If alias and original can be compared for address equality, we need
581 to create a thunk. Also we can not create extra aliases into discardable
582 section (or we risk link failures when section is discarded). */
583 if ((original_address_matters
584 && alias_address_matters)
585 || original_discardable)
586 {
587 create_thunk = !stdarg_p (TREE_TYPE (alias->decl));
588 create_alias = false;
589 /* When both alias and original are not overwritable, we can save
590 the extra thunk wrapper for direct calls. */
591 redirect_callers
592 = (!original_discardable
593 && alias->get_availability () > AVAIL_INTERPOSABLE
594 && original->get_availability () > AVAIL_INTERPOSABLE
595 && !alias->instrumented_version);
596 }
597 else
598 {
599 create_alias = true;
600 create_thunk = false;
601 redirect_callers = false;
602 }
603
604 if (create_alias && (DECL_COMDAT_GROUP (alias->decl)
605 || !sem_item::target_supports_symbol_aliases_p ()))
606 {
607 create_alias = false;
608 create_thunk = true;
609 }
610
611 /* We want thunk to always jump to the local function body
612 unless the body is comdat and may be optimized out. */
613 if ((create_thunk || redirect_callers)
614 && (!original_discardable
615 || (DECL_COMDAT_GROUP (original->decl)
616 && (DECL_COMDAT_GROUP (original->decl)
617 == DECL_COMDAT_GROUP (alias->decl)))))
618 local_original
619 = dyn_cast <cgraph_node *> (original->noninterposable_alias ());
620
621 if (!local_original)
622 {
623 if (dump_file)
624 fprintf (dump_file, "Noninterposable alias cannot be created.\n\n");
625
626 return false;
627 }
628
629 if (redirect_callers)
630 {
631 /* If alias is non-overwritable then
632 all direct calls are safe to be redirected to the original. */
633 bool redirected = false;
634 while (alias->callers)
635 {
636 cgraph_edge *e = alias->callers;
637 e->redirect_callee (local_original);
638 push_cfun (DECL_STRUCT_FUNCTION (e->caller->decl));
639
640 if (e->call_stmt)
641 e->redirect_call_stmt_to_callee ();
642
643 pop_cfun ();
644 redirected = true;
645 }
646
647 alias->icf_merged = true;
648
649 /* The alias function is removed if symbol address
650 does not matter. */
651 if (!alias_address_matters)
652 alias->remove ();
653
654 if (dump_file && redirected)
655 fprintf (dump_file, "Callgraph local calls have been redirected.\n\n");
656 }
657 /* If the condtion above is not met, we are lucky and can turn the
658 function into real alias. */
659 else if (create_alias)
660 {
661 alias->icf_merged = true;
662
663 /* Remove the function's body. */
664 ipa_merge_profiles (original, alias);
665 alias->release_body (true);
666 alias->reset ();
667
668 /* Create the alias. */
669 cgraph_node::create_alias (alias_func->decl, decl);
670 alias->resolve_alias (original);
671
672 /* Workaround for PR63566 that forces equal calling convention
673 to be used. */
674 alias->local.local = false;
675 original->local.local = false;
676
677 if (dump_file)
678 fprintf (dump_file, "Callgraph alias has been created.\n\n");
679 }
680 else if (create_thunk)
681 {
682 if (DECL_COMDAT_GROUP (alias->decl))
683 {
684 if (dump_file)
685 fprintf (dump_file, "Callgraph thunk cannot be created because of COMDAT\n");
686
687 return 0;
688 }
689
690 alias->icf_merged = true;
691 ipa_merge_profiles (local_original, alias);
692 alias->create_wrapper (local_original);
693
694 if (dump_file)
695 fprintf (dump_file, "Callgraph thunk has been created.\n\n");
696 }
697 else if (dump_file)
698 fprintf (dump_file, "Callgraph merge operation cannot be performed.\n\n");
699
700 return true;
701 }
702
703 /* Semantic item initialization function. */
704
705 void
706 sem_function::init (void)
707 {
708 if (in_lto_p)
709 get_node ()->get_untransformed_body ();
710
711 tree fndecl = node->decl;
712 function *func = DECL_STRUCT_FUNCTION (fndecl);
713
714 gcc_assert (func);
715 gcc_assert (SSANAMES (func));
716
717 ssa_names_size = SSANAMES (func)->length ();
718 node = node;
719
720 decl = fndecl;
721 region_tree = func->eh->region_tree;
722
723 /* iterating all function arguments. */
724 arg_count = count_formal_params (fndecl);
725
726 edge_count = n_edges_for_fn (func);
727 cfg_checksum = coverage_compute_cfg_checksum (func);
728
729 inchash::hash hstate;
730
731 basic_block bb;
732 FOR_EACH_BB_FN (bb, func)
733 {
734 unsigned nondbg_stmt_count = 0;
735
736 edge e;
737 for (edge_iterator ei = ei_start (bb->preds); ei_cond (ei, &e); ei_next (&ei))
738 cfg_checksum = iterative_hash_host_wide_int (e->flags,
739 cfg_checksum);
740
741 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
742 gsi_next (&gsi))
743 {
744 gimple stmt = gsi_stmt (gsi);
745
746 if (gimple_code (stmt) != GIMPLE_DEBUG)
747 {
748 hash_stmt (&hstate, stmt);
749 nondbg_stmt_count++;
750 }
751 }
752
753 gcode_hash = hstate.end ();
754 bb_sizes.safe_push (nondbg_stmt_count);
755
756 /* Inserting basic block to hash table. */
757 sem_bb *semantic_bb = new sem_bb (bb, nondbg_stmt_count,
758 EDGE_COUNT (bb->preds) + EDGE_COUNT (bb->succs));
759
760 bb_sorted.safe_push (semantic_bb);
761 }
762
763 parse_tree_args ();
764 }
765
766 /* Improve accumulated hash for HSTATE based on a gimple statement STMT. */
767
768 void
769 sem_function::hash_stmt (inchash::hash *hstate, gimple stmt)
770 {
771 enum gimple_code code = gimple_code (stmt);
772
773 hstate->add_int (code);
774
775 if (code == GIMPLE_CALL)
776 {
777 /* Checking of argument. */
778 for (unsigned i = 0; i < gimple_call_num_args (stmt); ++i)
779 {
780 tree argument = gimple_call_arg (stmt, i);
781
782 switch (TREE_CODE (argument))
783 {
784 case INTEGER_CST:
785 if (tree_fits_shwi_p (argument))
786 hstate->add_wide_int (tree_to_shwi (argument));
787 else if (tree_fits_uhwi_p (argument))
788 hstate->add_wide_int (tree_to_uhwi (argument));
789 break;
790 case REAL_CST:
791 REAL_VALUE_TYPE c;
792 HOST_WIDE_INT n;
793
794 c = TREE_REAL_CST (argument);
795 n = real_to_integer (&c);
796
797 hstate->add_wide_int (n);
798 break;
799 case ADDR_EXPR:
800 {
801 tree addr_operand = TREE_OPERAND (argument, 0);
802
803 if (TREE_CODE (addr_operand) == STRING_CST)
804 hstate->add (TREE_STRING_POINTER (addr_operand),
805 TREE_STRING_LENGTH (addr_operand));
806 break;
807 }
808 default:
809 break;
810 }
811 }
812 }
813 }
814
815
816 /* Return true if polymorphic comparison must be processed. */
817
818 bool
819 sem_function::compare_polymorphic_p (void)
820 {
821 return get_node ()->callees != NULL
822 || m_compared_func->get_node ()->callees != NULL;
823 }
824
825 /* For a given call graph NODE, the function constructs new
826 semantic function item. */
827
828 sem_function *
829 sem_function::parse (cgraph_node *node, bitmap_obstack *stack)
830 {
831 tree fndecl = node->decl;
832 function *func = DECL_STRUCT_FUNCTION (fndecl);
833
834 /* TODO: add support for thunks and aliases. */
835
836 if (!func || !node->has_gimple_body_p ())
837 return NULL;
838
839 if (lookup_attribute_by_prefix ("omp ", DECL_ATTRIBUTES (node->decl)) != NULL)
840 return NULL;
841
842 sem_function *f = new sem_function (node, 0, stack);
843
844 f->init ();
845
846 return f;
847 }
848
849 /* Parses function arguments and result type. */
850
851 void
852 sem_function::parse_tree_args (void)
853 {
854 tree result;
855
856 if (arg_types.exists ())
857 arg_types.release ();
858
859 arg_types.create (4);
860 tree fnargs = DECL_ARGUMENTS (decl);
861
862 for (tree parm = fnargs; parm; parm = DECL_CHAIN (parm))
863 arg_types.safe_push (DECL_ARG_TYPE (parm));
864
865 /* Function result type. */
866 result = DECL_RESULT (decl);
867 result_type = result ? TREE_TYPE (result) : NULL;
868
869 /* During WPA, we can get arguments by following method. */
870 if (!fnargs)
871 {
872 tree type = TYPE_ARG_TYPES (TREE_TYPE (decl));
873 for (tree parm = type; parm; parm = TREE_CHAIN (parm))
874 arg_types.safe_push (TYPE_CANONICAL (TREE_VALUE (parm)));
875
876 result_type = TREE_TYPE (TREE_TYPE (decl));
877 }
878 }
879
880 /* For given basic blocks BB1 and BB2 (from functions FUNC1 and FUNC),
881 return true if phi nodes are semantically equivalent in these blocks . */
882
883 bool
884 sem_function::compare_phi_node (basic_block bb1, basic_block bb2)
885 {
886 gphi_iterator si1, si2;
887 gphi *phi1, *phi2;
888 unsigned size1, size2, i;
889 tree t1, t2;
890 edge e1, e2;
891
892 gcc_assert (bb1 != NULL);
893 gcc_assert (bb2 != NULL);
894
895 si2 = gsi_start_phis (bb2);
896 for (si1 = gsi_start_phis (bb1); !gsi_end_p (si1);
897 gsi_next (&si1))
898 {
899 gsi_next_nonvirtual_phi (&si1);
900 gsi_next_nonvirtual_phi (&si2);
901
902 if (gsi_end_p (si1) && gsi_end_p (si2))
903 break;
904
905 if (gsi_end_p (si1) || gsi_end_p (si2))
906 return return_false();
907
908 phi1 = si1.phi ();
909 phi2 = si2.phi ();
910
911 tree phi_result1 = gimple_phi_result (phi1);
912 tree phi_result2 = gimple_phi_result (phi2);
913
914 if (!m_checker->compare_operand (phi_result1, phi_result2))
915 return return_false_with_msg ("PHI results are different");
916
917 size1 = gimple_phi_num_args (phi1);
918 size2 = gimple_phi_num_args (phi2);
919
920 if (size1 != size2)
921 return return_false ();
922
923 for (i = 0; i < size1; ++i)
924 {
925 t1 = gimple_phi_arg (phi1, i)->def;
926 t2 = gimple_phi_arg (phi2, i)->def;
927
928 if (!m_checker->compare_operand (t1, t2))
929 return return_false ();
930
931 e1 = gimple_phi_arg_edge (phi1, i);
932 e2 = gimple_phi_arg_edge (phi2, i);
933
934 if (!m_checker->compare_edge (e1, e2))
935 return return_false ();
936 }
937
938 gsi_next (&si2);
939 }
940
941 return true;
942 }
943
944 /* Returns true if tree T can be compared as a handled component. */
945
946 bool
947 sem_function::icf_handled_component_p (tree t)
948 {
949 tree_code tc = TREE_CODE (t);
950
951 return ((handled_component_p (t))
952 || tc == ADDR_EXPR || tc == MEM_REF || tc == REALPART_EXPR
953 || tc == IMAGPART_EXPR || tc == OBJ_TYPE_REF);
954 }
955
956 /* Basic blocks dictionary BB_DICT returns true if SOURCE index BB
957 corresponds to TARGET. */
958
959 bool
960 sem_function::bb_dict_test (int* bb_dict, int source, int target)
961 {
962 if (bb_dict[source] == -1)
963 {
964 bb_dict[source] = target;
965 return true;
966 }
967 else
968 return bb_dict[source] == target;
969 }
970
971 /* Iterates all tree types in T1 and T2 and returns true if all types
972 are compatible. If COMPARE_POLYMORPHIC is set to true,
973 more strict comparison is executed. */
974
975 bool
976 sem_function::compare_type_list (tree t1, tree t2, bool compare_polymorphic)
977 {
978 tree tv1, tv2;
979 tree_code tc1, tc2;
980
981 if (!t1 && !t2)
982 return true;
983
984 while (t1 != NULL && t2 != NULL)
985 {
986 tv1 = TREE_VALUE (t1);
987 tv2 = TREE_VALUE (t2);
988
989 tc1 = TREE_CODE (tv1);
990 tc2 = TREE_CODE (tv2);
991
992 if (tc1 == NOP_EXPR && tc2 == NOP_EXPR)
993 {}
994 else if (tc1 == NOP_EXPR || tc2 == NOP_EXPR)
995 return false;
996 else if (!func_checker::compatible_types_p (tv1, tv2, compare_polymorphic))
997 return false;
998
999 t1 = TREE_CHAIN (t1);
1000 t2 = TREE_CHAIN (t2);
1001 }
1002
1003 return !(t1 || t2);
1004 }
1005
1006
1007 /* Semantic variable constructor that uses STACK as bitmap memory stack. */
1008
1009 sem_variable::sem_variable (bitmap_obstack *stack): sem_item (VAR, stack)
1010 {
1011 }
1012
1013 /* Constructor based on varpool node _NODE with computed hash _HASH.
1014 Bitmap STACK is used for memory allocation. */
1015
1016 sem_variable::sem_variable (varpool_node *node, hashval_t _hash,
1017 bitmap_obstack *stack): sem_item(VAR,
1018 node, _hash, stack)
1019 {
1020 gcc_checking_assert (node);
1021 gcc_checking_assert (get_node ());
1022 }
1023
1024 /* Returns true if the item equals to ITEM given as argument. */
1025
1026 bool
1027 sem_variable::equals (sem_item *item,
1028 hash_map <symtab_node *, sem_item *> & ARG_UNUSED (ignored_nodes))
1029 {
1030 gcc_assert (item->type == VAR);
1031
1032 sem_variable *v = static_cast<sem_variable *>(item);
1033
1034 if (!ctor || !v->ctor)
1035 return return_false_with_msg ("ctor is missing for semantic variable");
1036
1037 return sem_variable::equals (ctor, v->ctor);
1038 }
1039
1040 /* Compares trees T1 and T2 for semantic equality. */
1041
1042 bool
1043 sem_variable::equals (tree t1, tree t2)
1044 {
1045 tree_code tc1 = TREE_CODE (t1);
1046 tree_code tc2 = TREE_CODE (t2);
1047
1048 if (tc1 != tc2)
1049 return false;
1050
1051 switch (tc1)
1052 {
1053 case CONSTRUCTOR:
1054 {
1055 unsigned len1 = vec_safe_length (CONSTRUCTOR_ELTS (t1));
1056 unsigned len2 = vec_safe_length (CONSTRUCTOR_ELTS (t2));
1057
1058 if (len1 != len2)
1059 return false;
1060
1061 for (unsigned i = 0; i < len1; i++)
1062 if (!sem_variable::equals (CONSTRUCTOR_ELT (t1, i)->value,
1063 CONSTRUCTOR_ELT (t2, i)->value)
1064 || CONSTRUCTOR_ELT (t1, i)->index != CONSTRUCTOR_ELT (t2, i)->index)
1065 return false;
1066
1067 return true;
1068 }
1069 case MEM_REF:
1070 {
1071 tree x1 = TREE_OPERAND (t1, 0);
1072 tree x2 = TREE_OPERAND (t2, 0);
1073 tree y1 = TREE_OPERAND (t1, 1);
1074 tree y2 = TREE_OPERAND (t2, 1);
1075
1076 if (!func_checker::compatible_types_p (TREE_TYPE (x1), TREE_TYPE (x2),
1077 true))
1078 return return_false ();
1079
1080 /* Type of the offset on MEM_REF does not matter. */
1081 return sem_variable::equals (x1, x2)
1082 && wi::to_offset (y1) == wi::to_offset (y2);
1083 }
1084 case NOP_EXPR:
1085 case ADDR_EXPR:
1086 {
1087 tree op1 = TREE_OPERAND (t1, 0);
1088 tree op2 = TREE_OPERAND (t2, 0);
1089 return sem_variable::equals (op1, op2);
1090 }
1091 case FUNCTION_DECL:
1092 case VAR_DECL:
1093 case FIELD_DECL:
1094 case LABEL_DECL:
1095 return t1 == t2;
1096 case INTEGER_CST:
1097 return func_checker::compatible_types_p (TREE_TYPE (t1), TREE_TYPE (t2),
1098 true)
1099 && wi::to_offset (t1) == wi::to_offset (t2);
1100 case STRING_CST:
1101 case REAL_CST:
1102 case COMPLEX_CST:
1103 return operand_equal_p (t1, t2, OEP_ONLY_CONST);
1104 case COMPONENT_REF:
1105 case ARRAY_REF:
1106 case POINTER_PLUS_EXPR:
1107 {
1108 tree x1 = TREE_OPERAND (t1, 0);
1109 tree x2 = TREE_OPERAND (t2, 0);
1110 tree y1 = TREE_OPERAND (t1, 1);
1111 tree y2 = TREE_OPERAND (t2, 1);
1112
1113 return sem_variable::equals (x1, x2) && sem_variable::equals (y1, y2);
1114 }
1115 case ERROR_MARK:
1116 return return_false_with_msg ("ERROR_MARK");
1117 default:
1118 return return_false_with_msg ("Unknown TREE code reached");
1119 }
1120 }
1121
1122 /* Parser function that visits a varpool NODE. */
1123
1124 sem_variable *
1125 sem_variable::parse (varpool_node *node, bitmap_obstack *stack)
1126 {
1127 tree decl = node->decl;
1128
1129 bool readonly = TYPE_P (decl) ? TYPE_READONLY (decl) : TREE_READONLY (decl);
1130 bool can_handle = readonly && (DECL_VIRTUAL_P (decl)
1131 || !TREE_ADDRESSABLE (decl));
1132
1133 if (!can_handle)
1134 return NULL;
1135
1136 tree ctor = ctor_for_folding (decl);
1137 if (!ctor)
1138 return NULL;
1139
1140 sem_variable *v = new sem_variable (node, 0, stack);
1141
1142 v->init ();
1143
1144 return v;
1145 }
1146
1147 /* References independent hash function. */
1148
1149 hashval_t
1150 sem_variable::get_hash (void)
1151 {
1152 if (hash)
1153 return hash;
1154
1155 inchash::hash hstate;
1156
1157 hstate.add_int (456346417);
1158 hstate.add_int (TREE_CODE (ctor));
1159
1160 if (TREE_CODE (ctor) == CONSTRUCTOR)
1161 {
1162 unsigned length = vec_safe_length (CONSTRUCTOR_ELTS (ctor));
1163 hstate.add_int (length);
1164 }
1165
1166 hash = hstate.end ();
1167
1168 return hash;
1169 }
1170
1171 /* Merges instance with an ALIAS_ITEM, where alias, thunk or redirection can
1172 be applied. */
1173
1174 bool
1175 sem_variable::merge (sem_item *alias_item)
1176 {
1177 gcc_assert (alias_item->type == VAR);
1178
1179 if (!sem_item::target_supports_symbol_aliases_p ())
1180 {
1181 if (dump_file)
1182 fprintf (dump_file, "Symbol aliases are not supported by target\n\n");
1183 return false;
1184 }
1185
1186 sem_variable *alias_var = static_cast<sem_variable *> (alias_item);
1187
1188 varpool_node *original = get_node ();
1189 varpool_node *alias = alias_var->get_node ();
1190 bool original_discardable = false;
1191
1192 /* See if original is in a section that can be discarded if the main
1193 symbol is not used. */
1194 if (DECL_EXTERNAL (original->decl))
1195 original_discardable = true;
1196 if (original->resolution == LDPR_PREEMPTED_REG
1197 || original->resolution == LDPR_PREEMPTED_IR)
1198 original_discardable = true;
1199 if (original->can_be_discarded_p ())
1200 original_discardable = true;
1201
1202 gcc_assert (!TREE_ASM_WRITTEN (alias->decl));
1203
1204 if (original_discardable || DECL_EXTERNAL (alias_var->decl) ||
1205 !compare_sections (alias_var))
1206 {
1207 if (dump_file)
1208 fprintf (dump_file, "Varpool alias cannot be created\n\n");
1209
1210 return false;
1211 }
1212 else
1213 {
1214 // alias cycle creation check
1215 varpool_node *n = original;
1216
1217 while (n->alias)
1218 {
1219 n = n->get_alias_target ();
1220 if (n == alias)
1221 {
1222 if (dump_file)
1223 fprintf (dump_file, "Varpool alias cannot be created (alias cycle).\n\n");
1224
1225 return false;
1226 }
1227 }
1228
1229 alias->analyzed = false;
1230
1231 DECL_INITIAL (alias->decl) = NULL;
1232 alias->need_bounds_init = false;
1233 alias->remove_all_references ();
1234
1235 varpool_node::create_alias (alias_var->decl, decl);
1236 alias->resolve_alias (original);
1237
1238 if (dump_file)
1239 fprintf (dump_file, "Varpool alias has been created.\n\n");
1240
1241 return true;
1242 }
1243 }
1244
1245 bool
1246 sem_variable::compare_sections (sem_variable *alias)
1247 {
1248 const char *source = node->get_section ();
1249 const char *target = alias->node->get_section();
1250
1251 if (source == NULL && target == NULL)
1252 return true;
1253 else if(!source || !target)
1254 return false;
1255 else
1256 return strcmp (source, target) == 0;
1257 }
1258
1259 /* Dump symbol to FILE. */
1260
1261 void
1262 sem_variable::dump_to_file (FILE *file)
1263 {
1264 gcc_assert (file);
1265
1266 print_node (file, "", decl, 0);
1267 fprintf (file, "\n\n");
1268 }
1269
1270 /* Iterates though a constructor and identifies tree references
1271 we are interested in semantic function equality. */
1272
1273 void
1274 sem_variable::parse_tree_refs (tree t)
1275 {
1276 switch (TREE_CODE (t))
1277 {
1278 case CONSTRUCTOR:
1279 {
1280 unsigned length = vec_safe_length (CONSTRUCTOR_ELTS (t));
1281
1282 for (unsigned i = 0; i < length; i++)
1283 parse_tree_refs(CONSTRUCTOR_ELT (t, i)->value);
1284
1285 break;
1286 }
1287 case NOP_EXPR:
1288 case ADDR_EXPR:
1289 {
1290 tree op = TREE_OPERAND (t, 0);
1291 parse_tree_refs (op);
1292 break;
1293 }
1294 case FUNCTION_DECL:
1295 {
1296 tree_refs.safe_push (t);
1297 break;
1298 }
1299 default:
1300 break;
1301 }
1302 }
1303
1304 unsigned int sem_item_optimizer::class_id = 0;
1305
1306 sem_item_optimizer::sem_item_optimizer (): worklist (0), m_classes (0),
1307 m_classes_count (0), m_cgraph_node_hooks (NULL), m_varpool_node_hooks (NULL)
1308 {
1309 m_items.create (0);
1310 bitmap_obstack_initialize (&m_bmstack);
1311 }
1312
1313 sem_item_optimizer::~sem_item_optimizer ()
1314 {
1315 for (unsigned int i = 0; i < m_items.length (); i++)
1316 delete m_items[i];
1317
1318 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
1319 it != m_classes.end (); ++it)
1320 {
1321 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
1322 delete (*it)->classes[i];
1323
1324 (*it)->classes.release ();
1325 free (*it);
1326 }
1327
1328 m_items.release ();
1329
1330 bitmap_obstack_release (&m_bmstack);
1331 }
1332
1333 /* Write IPA ICF summary for symbols. */
1334
1335 void
1336 sem_item_optimizer::write_summary (void)
1337 {
1338 unsigned int count = 0;
1339
1340 output_block *ob = create_output_block (LTO_section_ipa_icf);
1341 lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
1342 ob->symbol = NULL;
1343
1344 /* Calculate number of symbols to be serialized. */
1345 for (lto_symtab_encoder_iterator lsei = lsei_start_in_partition (encoder);
1346 !lsei_end_p (lsei);
1347 lsei_next_in_partition (&lsei))
1348 {
1349 symtab_node *node = lsei_node (lsei);
1350
1351 if (m_symtab_node_map.get (node))
1352 count++;
1353 }
1354
1355 streamer_write_uhwi (ob, count);
1356
1357 /* Process all of the symbols. */
1358 for (lto_symtab_encoder_iterator lsei = lsei_start_in_partition (encoder);
1359 !lsei_end_p (lsei);
1360 lsei_next_in_partition (&lsei))
1361 {
1362 symtab_node *node = lsei_node (lsei);
1363
1364 sem_item **item = m_symtab_node_map.get (node);
1365
1366 if (item && *item)
1367 {
1368 int node_ref = lto_symtab_encoder_encode (encoder, node);
1369 streamer_write_uhwi_stream (ob->main_stream, node_ref);
1370
1371 streamer_write_uhwi (ob, (*item)->get_hash ());
1372 }
1373 }
1374
1375 streamer_write_char_stream (ob->main_stream, 0);
1376 produce_asm (ob, NULL);
1377 destroy_output_block (ob);
1378 }
1379
1380 /* Reads a section from LTO stream file FILE_DATA. Input block for DATA
1381 contains LEN bytes. */
1382
1383 void
1384 sem_item_optimizer::read_section (lto_file_decl_data *file_data,
1385 const char *data, size_t len)
1386 {
1387 const lto_function_header *header =
1388 (const lto_function_header *) data;
1389 const int cfg_offset = sizeof (lto_function_header);
1390 const int main_offset = cfg_offset + header->cfg_size;
1391 const int string_offset = main_offset + header->main_size;
1392 data_in *data_in;
1393 unsigned int i;
1394 unsigned int count;
1395
1396 lto_input_block ib_main ((const char *) data + main_offset, 0,
1397 header->main_size);
1398
1399 data_in =
1400 lto_data_in_create (file_data, (const char *) data + string_offset,
1401 header->string_size, vNULL);
1402
1403 count = streamer_read_uhwi (&ib_main);
1404
1405 for (i = 0; i < count; i++)
1406 {
1407 unsigned int index;
1408 symtab_node *node;
1409 lto_symtab_encoder_t encoder;
1410
1411 index = streamer_read_uhwi (&ib_main);
1412 encoder = file_data->symtab_node_encoder;
1413 node = lto_symtab_encoder_deref (encoder, index);
1414
1415 hashval_t hash = streamer_read_uhwi (&ib_main);
1416
1417 gcc_assert (node->definition);
1418
1419 if (dump_file)
1420 fprintf (dump_file, "Symbol added:%s (tree: %p, uid:%u)\n", node->asm_name (),
1421 (void *) node->decl, node->order);
1422
1423 if (is_a<cgraph_node *> (node))
1424 {
1425 cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
1426
1427 m_items.safe_push (new sem_function (cnode, hash, &m_bmstack));
1428 }
1429 else
1430 {
1431 varpool_node *vnode = dyn_cast <varpool_node *> (node);
1432
1433 m_items.safe_push (new sem_variable (vnode, hash, &m_bmstack));
1434 }
1435 }
1436
1437 lto_free_section_data (file_data, LTO_section_ipa_icf, NULL, data,
1438 len);
1439 lto_data_in_delete (data_in);
1440 }
1441
1442 /* Read IPA IPA ICF summary for symbols. */
1443
1444 void
1445 sem_item_optimizer::read_summary (void)
1446 {
1447 lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
1448 lto_file_decl_data *file_data;
1449 unsigned int j = 0;
1450
1451 while ((file_data = file_data_vec[j++]))
1452 {
1453 size_t len;
1454 const char *data = lto_get_section_data (file_data,
1455 LTO_section_ipa_icf, NULL, &len);
1456
1457 if (data)
1458 read_section (file_data, data, len);
1459 }
1460 }
1461
1462 /* Register callgraph and varpool hooks. */
1463
1464 void
1465 sem_item_optimizer::register_hooks (void)
1466 {
1467 m_cgraph_node_hooks = symtab->add_cgraph_removal_hook
1468 (&sem_item_optimizer::cgraph_removal_hook, this);
1469
1470 m_varpool_node_hooks = symtab->add_varpool_removal_hook
1471 (&sem_item_optimizer::varpool_removal_hook, this);
1472 }
1473
1474 /* Unregister callgraph and varpool hooks. */
1475
1476 void
1477 sem_item_optimizer::unregister_hooks (void)
1478 {
1479 if (m_cgraph_node_hooks)
1480 symtab->remove_cgraph_removal_hook (m_cgraph_node_hooks);
1481
1482 if (m_varpool_node_hooks)
1483 symtab->remove_varpool_removal_hook (m_varpool_node_hooks);
1484 }
1485
1486 /* Adds a CLS to hashtable associated by hash value. */
1487
1488 void
1489 sem_item_optimizer::add_class (congruence_class *cls)
1490 {
1491 gcc_assert (cls->members.length ());
1492
1493 congruence_class_group *group = get_group_by_hash (
1494 cls->members[0]->get_hash (),
1495 cls->members[0]->type);
1496 group->classes.safe_push (cls);
1497 }
1498
1499 /* Gets a congruence class group based on given HASH value and TYPE. */
1500
1501 congruence_class_group *
1502 sem_item_optimizer::get_group_by_hash (hashval_t hash, sem_item_type type)
1503 {
1504 congruence_class_group *item = XNEW (congruence_class_group);
1505 item->hash = hash;
1506 item->type = type;
1507
1508 congruence_class_group **slot = m_classes.find_slot (item, INSERT);
1509
1510 if (*slot)
1511 free (item);
1512 else
1513 {
1514 item->classes.create (1);
1515 *slot = item;
1516 }
1517
1518 return *slot;
1519 }
1520
1521 /* Callgraph removal hook called for a NODE with a custom DATA. */
1522
1523 void
1524 sem_item_optimizer::cgraph_removal_hook (cgraph_node *node, void *data)
1525 {
1526 sem_item_optimizer *optimizer = (sem_item_optimizer *) data;
1527 optimizer->remove_symtab_node (node);
1528 }
1529
1530 /* Varpool removal hook called for a NODE with a custom DATA. */
1531
1532 void
1533 sem_item_optimizer::varpool_removal_hook (varpool_node *node, void *data)
1534 {
1535 sem_item_optimizer *optimizer = (sem_item_optimizer *) data;
1536 optimizer->remove_symtab_node (node);
1537 }
1538
1539 /* Remove symtab NODE triggered by symtab removal hooks. */
1540
1541 void
1542 sem_item_optimizer::remove_symtab_node (symtab_node *node)
1543 {
1544 gcc_assert (!m_classes.elements());
1545
1546 m_removed_items_set.add (node);
1547 }
1548
1549 void
1550 sem_item_optimizer::remove_item (sem_item *item)
1551 {
1552 if (m_symtab_node_map.get (item->node))
1553 m_symtab_node_map.remove (item->node);
1554 delete item;
1555 }
1556
1557 /* Removes all callgraph and varpool nodes that are marked by symtab
1558 as deleted. */
1559
1560 void
1561 sem_item_optimizer::filter_removed_items (void)
1562 {
1563 auto_vec <sem_item *> filtered;
1564
1565 for (unsigned int i = 0; i < m_items.length(); i++)
1566 {
1567 sem_item *item = m_items[i];
1568
1569 if (!flag_ipa_icf_functions && item->type == FUNC)
1570 {
1571 remove_item (item);
1572 continue;
1573 }
1574
1575 if (!flag_ipa_icf_variables && item->type == VAR)
1576 {
1577 remove_item (item);
1578 continue;
1579 }
1580
1581 bool no_body_function = false;
1582
1583 if (item->type == FUNC)
1584 {
1585 cgraph_node *cnode = static_cast <sem_function *>(item)->get_node ();
1586
1587 no_body_function = in_lto_p && (cnode->alias || cnode->body_removed);
1588 }
1589
1590 if(!m_removed_items_set.contains (m_items[i]->node)
1591 && !no_body_function)
1592 {
1593 if (item->type == VAR || (!DECL_CXX_CONSTRUCTOR_P (item->decl)
1594 && !DECL_CXX_DESTRUCTOR_P (item->decl)))
1595 {
1596 filtered.safe_push (m_items[i]);
1597 continue;
1598 }
1599 }
1600
1601 remove_item (item);
1602 }
1603
1604 /* Clean-up of released semantic items. */
1605
1606 m_items.release ();
1607 for (unsigned int i = 0; i < filtered.length(); i++)
1608 m_items.safe_push (filtered[i]);
1609 }
1610
1611 /* Optimizer entry point. */
1612
1613 void
1614 sem_item_optimizer::execute (void)
1615 {
1616 filter_removed_items ();
1617 build_hash_based_classes ();
1618
1619 if (dump_file)
1620 fprintf (dump_file, "Dump after hash based groups\n");
1621 dump_cong_classes ();
1622
1623 for (unsigned int i = 0; i < m_items.length(); i++)
1624 m_items[i]->init_wpa ();
1625
1626 build_graph ();
1627
1628 subdivide_classes_by_equality (true);
1629
1630 if (dump_file)
1631 fprintf (dump_file, "Dump after WPA based types groups\n");
1632
1633 dump_cong_classes ();
1634
1635 process_cong_reduction ();
1636 verify_classes ();
1637
1638 if (dump_file)
1639 fprintf (dump_file, "Dump after callgraph-based congruence reduction\n");
1640
1641 dump_cong_classes ();
1642
1643 parse_nonsingleton_classes ();
1644 subdivide_classes_by_equality ();
1645
1646 if (dump_file)
1647 fprintf (dump_file, "Dump after full equality comparison of groups\n");
1648
1649 dump_cong_classes ();
1650
1651 unsigned int prev_class_count = m_classes_count;
1652
1653 process_cong_reduction ();
1654 dump_cong_classes ();
1655 verify_classes ();
1656 merge_classes (prev_class_count);
1657
1658 if (dump_file && (dump_flags & TDF_DETAILS))
1659 symtab_node::dump_table (dump_file);
1660 }
1661
1662 /* Function responsible for visiting all potential functions and
1663 read-only variables that can be merged. */
1664
1665 void
1666 sem_item_optimizer::parse_funcs_and_vars (void)
1667 {
1668 cgraph_node *cnode;
1669
1670 if (flag_ipa_icf_functions)
1671 FOR_EACH_DEFINED_FUNCTION (cnode)
1672 {
1673 sem_function *f = sem_function::parse (cnode, &m_bmstack);
1674 if (f)
1675 {
1676 m_items.safe_push (f);
1677 m_symtab_node_map.put (cnode, f);
1678
1679 if (dump_file)
1680 fprintf (dump_file, "Parsed function:%s\n", f->asm_name ());
1681
1682 if (dump_file && (dump_flags & TDF_DETAILS))
1683 f->dump_to_file (dump_file);
1684 }
1685 else if (dump_file)
1686 fprintf (dump_file, "Not parsed function:%s\n", cnode->asm_name ());
1687 }
1688
1689 varpool_node *vnode;
1690
1691 if (flag_ipa_icf_variables)
1692 FOR_EACH_DEFINED_VARIABLE (vnode)
1693 {
1694 sem_variable *v = sem_variable::parse (vnode, &m_bmstack);
1695
1696 if (v)
1697 {
1698 m_items.safe_push (v);
1699 m_symtab_node_map.put (vnode, v);
1700 }
1701 }
1702 }
1703
1704 /* Makes pairing between a congruence class CLS and semantic ITEM. */
1705
1706 void
1707 sem_item_optimizer::add_item_to_class (congruence_class *cls, sem_item *item)
1708 {
1709 item->index_in_class = cls->members.length ();
1710 cls->members.safe_push (item);
1711 item->cls = cls;
1712 }
1713
1714 /* Congruence classes are built by hash value. */
1715
1716 void
1717 sem_item_optimizer::build_hash_based_classes (void)
1718 {
1719 for (unsigned i = 0; i < m_items.length (); i++)
1720 {
1721 sem_item *item = m_items[i];
1722
1723 congruence_class_group *group = get_group_by_hash (item->get_hash (),
1724 item->type);
1725
1726 if (!group->classes.length ())
1727 {
1728 m_classes_count++;
1729 group->classes.safe_push (new congruence_class (class_id++));
1730 }
1731
1732 add_item_to_class (group->classes[0], item);
1733 }
1734 }
1735
1736 /* Build references according to call graph. */
1737
1738 void
1739 sem_item_optimizer::build_graph (void)
1740 {
1741 for (unsigned i = 0; i < m_items.length (); i++)
1742 {
1743 sem_item *item = m_items[i];
1744 m_symtab_node_map.put (item->node, item);
1745 }
1746
1747 for (unsigned i = 0; i < m_items.length (); i++)
1748 {
1749 sem_item *item = m_items[i];
1750
1751 if (item->type == FUNC)
1752 {
1753 cgraph_node *cnode = dyn_cast <cgraph_node *> (item->node);
1754
1755 cgraph_edge *e = cnode->callees;
1756 while (e)
1757 {
1758 sem_item **slot = m_symtab_node_map.get (e->callee);
1759 if (slot)
1760 item->add_reference (*slot);
1761
1762 e = e->next_callee;
1763 }
1764 }
1765
1766 ipa_ref *ref = NULL;
1767 for (unsigned i = 0; item->node->iterate_reference (i, ref); i++)
1768 {
1769 sem_item **slot = m_symtab_node_map.get (ref->referred);
1770 if (slot)
1771 item->add_reference (*slot);
1772 }
1773 }
1774 }
1775
1776 /* Semantic items in classes having more than one element and initialized.
1777 In case of WPA, we load function body. */
1778
1779 void
1780 sem_item_optimizer::parse_nonsingleton_classes (void)
1781 {
1782 unsigned int init_called_count = 0;
1783
1784 for (unsigned i = 0; i < m_items.length (); i++)
1785 if (m_items[i]->cls->members.length () > 1)
1786 {
1787 m_items[i]->init ();
1788 init_called_count++;
1789 }
1790
1791 if (dump_file)
1792 fprintf (dump_file, "Init called for %u items (%.2f%%).\n", init_called_count,
1793 m_items.length () ? 100.0f * init_called_count / m_items.length (): 0.0f);
1794 }
1795
1796 /* Equality function for semantic items is used to subdivide existing
1797 classes. If IN_WPA, fast equality function is invoked. */
1798
1799 void
1800 sem_item_optimizer::subdivide_classes_by_equality (bool in_wpa)
1801 {
1802 for (hash_table <congruence_class_group_hash>::iterator it = m_classes.begin ();
1803 it != m_classes.end (); ++it)
1804 {
1805 unsigned int class_count = (*it)->classes.length ();
1806
1807 for (unsigned i = 0; i < class_count; i++)
1808 {
1809 congruence_class *c = (*it)->classes [i];
1810
1811 if (c->members.length() > 1)
1812 {
1813 auto_vec <sem_item *> new_vector;
1814
1815 sem_item *first = c->members[0];
1816 new_vector.safe_push (first);
1817
1818 unsigned class_split_first = (*it)->classes.length ();
1819
1820 for (unsigned j = 1; j < c->members.length (); j++)
1821 {
1822 sem_item *item = c->members[j];
1823
1824 bool equals = in_wpa ? first->equals_wpa (item,
1825 m_symtab_node_map) : first->equals (item, m_symtab_node_map);
1826
1827 if (equals)
1828 new_vector.safe_push (item);
1829 else
1830 {
1831 bool integrated = false;
1832
1833 for (unsigned k = class_split_first; k < (*it)->classes.length (); k++)
1834 {
1835 sem_item *x = (*it)->classes[k]->members[0];
1836 bool equals = in_wpa ? x->equals_wpa (item,
1837 m_symtab_node_map) : x->equals (item, m_symtab_node_map);
1838
1839 if (equals)
1840 {
1841 integrated = true;
1842 add_item_to_class ((*it)->classes[k], item);
1843
1844 break;
1845 }
1846 }
1847
1848 if (!integrated)
1849 {
1850 congruence_class *c = new congruence_class (class_id++);
1851 m_classes_count++;
1852 add_item_to_class (c, item);
1853
1854 (*it)->classes.safe_push (c);
1855 }
1856 }
1857 }
1858
1859 // we replace newly created new_vector for the class we've just splitted
1860 c->members.release ();
1861 c->members.create (new_vector.length ());
1862
1863 for (unsigned int j = 0; j < new_vector.length (); j++)
1864 add_item_to_class (c, new_vector[j]);
1865 }
1866 }
1867 }
1868
1869 verify_classes ();
1870 }
1871
1872 /* Verify congruence classes if checking is enabled. */
1873
1874 void
1875 sem_item_optimizer::verify_classes (void)
1876 {
1877 #if ENABLE_CHECKING
1878 for (hash_table <congruence_class_group_hash>::iterator it = m_classes.begin ();
1879 it != m_classes.end (); ++it)
1880 {
1881 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
1882 {
1883 congruence_class *cls = (*it)->classes[i];
1884
1885 gcc_checking_assert (cls);
1886 gcc_checking_assert (cls->members.length () > 0);
1887
1888 for (unsigned int j = 0; j < cls->members.length (); j++)
1889 {
1890 sem_item *item = cls->members[j];
1891
1892 gcc_checking_assert (item);
1893 gcc_checking_assert (item->cls == cls);
1894
1895 for (unsigned k = 0; k < item->usages.length (); k++)
1896 {
1897 sem_usage_pair *usage = item->usages[k];
1898 gcc_checking_assert (usage->item->index_in_class <
1899 usage->item->cls->members.length ());
1900 }
1901 }
1902 }
1903 }
1904 #endif
1905 }
1906
1907 /* Disposes split map traverse function. CLS_PTR is pointer to congruence
1908 class, BSLOT is bitmap slot we want to release. DATA is mandatory,
1909 but unused argument. */
1910
1911 bool
1912 sem_item_optimizer::release_split_map (congruence_class * const &,
1913 bitmap const &b, traverse_split_pair *)
1914 {
1915 bitmap bmp = b;
1916
1917 BITMAP_FREE (bmp);
1918
1919 return true;
1920 }
1921
1922 /* Process split operation for a class given as pointer CLS_PTR,
1923 where bitmap B splits congruence class members. DATA is used
1924 as argument of split pair. */
1925
1926 bool
1927 sem_item_optimizer::traverse_congruence_split (congruence_class * const &cls,
1928 bitmap const &b, traverse_split_pair *pair)
1929 {
1930 sem_item_optimizer *optimizer = pair->optimizer;
1931 const congruence_class *splitter_cls = pair->cls;
1932
1933 /* If counted bits are greater than zero and less than the number of members
1934 a group will be splitted. */
1935 unsigned popcount = bitmap_count_bits (b);
1936
1937 if (popcount > 0 && popcount < cls->members.length ())
1938 {
1939 congruence_class* newclasses[2] = { new congruence_class (class_id++), new congruence_class (class_id++) };
1940
1941 for (unsigned int i = 0; i < cls->members.length (); i++)
1942 {
1943 int target = bitmap_bit_p (b, i);
1944 congruence_class *tc = newclasses[target];
1945
1946 add_item_to_class (tc, cls->members[i]);
1947 }
1948
1949 #ifdef ENABLE_CHECKING
1950 for (unsigned int i = 0; i < 2; i++)
1951 gcc_checking_assert (newclasses[i]->members.length ());
1952 #endif
1953
1954 if (splitter_cls == cls)
1955 optimizer->splitter_class_removed = true;
1956
1957 /* Remove old class from worklist if presented. */
1958 bool in_worklist = cls->in_worklist;
1959
1960 if (in_worklist)
1961 cls->in_worklist = false;
1962
1963 congruence_class_group g;
1964 g.hash = cls->members[0]->get_hash ();
1965 g.type = cls->members[0]->type;
1966
1967 congruence_class_group *slot = optimizer->m_classes.find(&g);
1968
1969 for (unsigned int i = 0; i < slot->classes.length (); i++)
1970 if (slot->classes[i] == cls)
1971 {
1972 slot->classes.ordered_remove (i);
1973 break;
1974 }
1975
1976 /* New class will be inserted and integrated to work list. */
1977 for (unsigned int i = 0; i < 2; i++)
1978 optimizer->add_class (newclasses[i]);
1979
1980 /* Two classes replace one, so that increment just by one. */
1981 optimizer->m_classes_count++;
1982
1983 /* If OLD class was presented in the worklist, we remove the class
1984 and replace it will both newly created classes. */
1985 if (in_worklist)
1986 for (unsigned int i = 0; i < 2; i++)
1987 optimizer->worklist_push (newclasses[i]);
1988 else /* Just smaller class is inserted. */
1989 {
1990 unsigned int smaller_index = newclasses[0]->members.length () <
1991 newclasses[1]->members.length () ?
1992 0 : 1;
1993 optimizer->worklist_push (newclasses[smaller_index]);
1994 }
1995
1996 if (dump_file && (dump_flags & TDF_DETAILS))
1997 {
1998 fprintf (dump_file, " congruence class splitted:\n");
1999 cls->dump (dump_file, 4);
2000
2001 fprintf (dump_file, " newly created groups:\n");
2002 for (unsigned int i = 0; i < 2; i++)
2003 newclasses[i]->dump (dump_file, 4);
2004 }
2005
2006 /* Release class if not presented in work list. */
2007 if (!in_worklist)
2008 delete cls;
2009 }
2010
2011
2012 return true;
2013 }
2014
2015 /* Tests if a class CLS used as INDEXth splits any congruence classes.
2016 Bitmap stack BMSTACK is used for bitmap allocation. */
2017
2018 void
2019 sem_item_optimizer::do_congruence_step_for_index (congruence_class *cls,
2020 unsigned int index)
2021 {
2022 hash_map <congruence_class *, bitmap> split_map;
2023
2024 for (unsigned int i = 0; i < cls->members.length (); i++)
2025 {
2026 sem_item *item = cls->members[i];
2027
2028 /* Iterate all usages that have INDEX as usage of the item. */
2029 for (unsigned int j = 0; j < item->usages.length (); j++)
2030 {
2031 sem_usage_pair *usage = item->usages[j];
2032
2033 if (usage->index != index)
2034 continue;
2035
2036 bitmap *slot = split_map.get (usage->item->cls);
2037 bitmap b;
2038
2039 if(!slot)
2040 {
2041 b = BITMAP_ALLOC (&m_bmstack);
2042 split_map.put (usage->item->cls, b);
2043 }
2044 else
2045 b = *slot;
2046
2047 #if ENABLE_CHECKING
2048 gcc_checking_assert (usage->item->cls);
2049 gcc_checking_assert (usage->item->index_in_class <
2050 usage->item->cls->members.length ());
2051 #endif
2052
2053 bitmap_set_bit (b, usage->item->index_in_class);
2054 }
2055 }
2056
2057 traverse_split_pair pair;
2058 pair.optimizer = this;
2059 pair.cls = cls;
2060
2061 splitter_class_removed = false;
2062 split_map.traverse
2063 <traverse_split_pair *, sem_item_optimizer::traverse_congruence_split> (&pair);
2064
2065 /* Bitmap clean-up. */
2066 split_map.traverse
2067 <traverse_split_pair *, sem_item_optimizer::release_split_map> (NULL);
2068 }
2069
2070 /* Every usage of a congruence class CLS is a candidate that can split the
2071 collection of classes. Bitmap stack BMSTACK is used for bitmap
2072 allocation. */
2073
2074 void
2075 sem_item_optimizer::do_congruence_step (congruence_class *cls)
2076 {
2077 bitmap_iterator bi;
2078 unsigned int i;
2079
2080 bitmap usage = BITMAP_ALLOC (&m_bmstack);
2081
2082 for (unsigned int i = 0; i < cls->members.length (); i++)
2083 bitmap_ior_into (usage, cls->members[i]->usage_index_bitmap);
2084
2085 EXECUTE_IF_SET_IN_BITMAP (usage, 0, i, bi)
2086 {
2087 if (dump_file && (dump_flags & TDF_DETAILS))
2088 fprintf (dump_file, " processing congruece step for class: %u, index: %u\n",
2089 cls->id, i);
2090
2091 do_congruence_step_for_index (cls, i);
2092
2093 if (splitter_class_removed)
2094 break;
2095 }
2096
2097 BITMAP_FREE (usage);
2098 }
2099
2100 /* Adds a newly created congruence class CLS to worklist. */
2101
2102 void
2103 sem_item_optimizer::worklist_push (congruence_class *cls)
2104 {
2105 /* Return if the class CLS is already presented in work list. */
2106 if (cls->in_worklist)
2107 return;
2108
2109 cls->in_worklist = true;
2110 worklist.push_back (cls);
2111 }
2112
2113 /* Pops a class from worklist. */
2114
2115 congruence_class *
2116 sem_item_optimizer::worklist_pop (void)
2117 {
2118 congruence_class *cls;
2119
2120 while (!worklist.empty ())
2121 {
2122 cls = worklist.front ();
2123 worklist.pop_front ();
2124 if (cls->in_worklist)
2125 {
2126 cls->in_worklist = false;
2127
2128 return cls;
2129 }
2130 else
2131 {
2132 /* Work list item was already intended to be removed.
2133 The only reason for doing it is to split a class.
2134 Thus, the class CLS is deleted. */
2135 delete cls;
2136 }
2137 }
2138
2139 return NULL;
2140 }
2141
2142 /* Iterative congruence reduction function. */
2143
2144 void
2145 sem_item_optimizer::process_cong_reduction (void)
2146 {
2147 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
2148 it != m_classes.end (); ++it)
2149 for (unsigned i = 0; i < (*it)->classes.length (); i++)
2150 if ((*it)->classes[i]->is_class_used ())
2151 worklist_push ((*it)->classes[i]);
2152
2153 if (dump_file)
2154 fprintf (dump_file, "Worklist has been filled with: %lu\n",
2155 (unsigned long) worklist.size ());
2156
2157 if (dump_file && (dump_flags & TDF_DETAILS))
2158 fprintf (dump_file, "Congruence class reduction\n");
2159
2160 congruence_class *cls;
2161 while ((cls = worklist_pop ()) != NULL)
2162 do_congruence_step (cls);
2163 }
2164
2165 /* Debug function prints all informations about congruence classes. */
2166
2167 void
2168 sem_item_optimizer::dump_cong_classes (void)
2169 {
2170 if (!dump_file)
2171 return;
2172
2173 fprintf (dump_file,
2174 "Congruence classes: %u (unique hash values: %lu), with total: %u items\n",
2175 m_classes_count, (unsigned long) m_classes.elements(), m_items.length ());
2176
2177 /* Histogram calculation. */
2178 unsigned int max_index = 0;
2179 unsigned int* histogram = XCNEWVEC (unsigned int, m_items.length () + 1);
2180
2181 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
2182 it != m_classes.end (); ++it)
2183
2184 for (unsigned i = 0; i < (*it)->classes.length (); i++)
2185 {
2186 unsigned int c = (*it)->classes[i]->members.length ();
2187 histogram[c]++;
2188
2189 if (c > max_index)
2190 max_index = c;
2191 }
2192
2193 fprintf (dump_file,
2194 "Class size histogram [num of members]: number of classe number of classess\n");
2195
2196 for (unsigned int i = 0; i <= max_index; i++)
2197 if (histogram[i])
2198 fprintf (dump_file, "[%u]: %u classes\n", i, histogram[i]);
2199
2200 fprintf (dump_file, "\n\n");
2201
2202
2203 if (dump_flags & TDF_DETAILS)
2204 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
2205 it != m_classes.end (); ++it)
2206 {
2207 fprintf (dump_file, " group: with %u classes:\n", (*it)->classes.length ());
2208
2209 for (unsigned i = 0; i < (*it)->classes.length (); i++)
2210 {
2211 (*it)->classes[i]->dump (dump_file, 4);
2212
2213 if(i < (*it)->classes.length () - 1)
2214 fprintf (dump_file, " ");
2215 }
2216 }
2217
2218 free (histogram);
2219 }
2220
2221 /* After reduction is done, we can declare all items in a group
2222 to be equal. PREV_CLASS_COUNT is start number of classes
2223 before reduction. */
2224
2225 void
2226 sem_item_optimizer::merge_classes (unsigned int prev_class_count)
2227 {
2228 unsigned int item_count = m_items.length ();
2229 unsigned int class_count = m_classes_count;
2230 unsigned int equal_items = item_count - class_count;
2231
2232 unsigned int non_singular_classes_count = 0;
2233 unsigned int non_singular_classes_sum = 0;
2234
2235 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
2236 it != m_classes.end (); ++it)
2237 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
2238 {
2239 congruence_class *c = (*it)->classes[i];
2240 if (c->members.length () > 1)
2241 {
2242 non_singular_classes_count++;
2243 non_singular_classes_sum += c->members.length ();
2244 }
2245 }
2246
2247 if (dump_file)
2248 {
2249 fprintf (dump_file, "\nItem count: %u\n", item_count);
2250 fprintf (dump_file, "Congruent classes before: %u, after: %u\n",
2251 prev_class_count, class_count);
2252 fprintf (dump_file, "Average class size before: %.2f, after: %.2f\n",
2253 prev_class_count ? 1.0f * item_count / prev_class_count : 0.0f,
2254 class_count ? 1.0f * item_count / class_count : 0.0f);
2255 fprintf (dump_file, "Average non-singular class size: %.2f, count: %u\n",
2256 non_singular_classes_count ? 1.0f * non_singular_classes_sum /
2257 non_singular_classes_count : 0.0f,
2258 non_singular_classes_count);
2259 fprintf (dump_file, "Equal symbols: %u\n", equal_items);
2260 fprintf (dump_file, "Fraction of visited symbols: %.2f%%\n\n",
2261 item_count ? 100.0f * equal_items / item_count : 0.0f);
2262 }
2263
2264 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
2265 it != m_classes.end (); ++it)
2266 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
2267 {
2268 congruence_class *c = (*it)->classes[i];
2269
2270 if (c->members.length () == 1)
2271 continue;
2272
2273 gcc_assert (c->members.length ());
2274
2275 sem_item *source = c->members[0];
2276
2277 for (unsigned int j = 1; j < c->members.length (); j++)
2278 {
2279 sem_item *alias = c->members[j];
2280 source->equals (alias, m_symtab_node_map);
2281
2282 if (dump_file)
2283 {
2284 fprintf (dump_file, "Semantic equality hit:%s->%s\n",
2285 source->name (), alias->name ());
2286 fprintf (dump_file, "Assembler symbol names:%s->%s\n",
2287 source->asm_name (), alias->asm_name ());
2288 }
2289
2290 if (dump_file && (dump_flags & TDF_DETAILS))
2291 {
2292 source->dump_to_file (dump_file);
2293 alias->dump_to_file (dump_file);
2294 }
2295
2296 source->merge (alias);
2297 }
2298 }
2299 }
2300
2301 /* Dump function prints all class members to a FILE with an INDENT. */
2302
2303 void
2304 congruence_class::dump (FILE *file, unsigned int indent) const
2305 {
2306 FPRINTF_SPACES (file, indent, "class with id: %u, hash: %u, items: %u\n",
2307 id, members[0]->get_hash (), members.length ());
2308
2309 FPUTS_SPACES (file, indent + 2, "");
2310 for (unsigned i = 0; i < members.length (); i++)
2311 fprintf (file, "%s(%p/%u) ", members[i]->asm_name (), (void *) members[i]->decl,
2312 members[i]->node->order);
2313
2314 fprintf (file, "\n");
2315 }
2316
2317 /* Returns true if there's a member that is used from another group. */
2318
2319 bool
2320 congruence_class::is_class_used (void)
2321 {
2322 for (unsigned int i = 0; i < members.length (); i++)
2323 if (members[i]->usages.length ())
2324 return true;
2325
2326 return false;
2327 }
2328
2329 /* Initialization and computation of symtab node hash, there data
2330 are propagated later on. */
2331
2332 static sem_item_optimizer *optimizer = NULL;
2333
2334 /* Generate pass summary for IPA ICF pass. */
2335
2336 static void
2337 ipa_icf_generate_summary (void)
2338 {
2339 if (!optimizer)
2340 optimizer = new sem_item_optimizer ();
2341
2342 optimizer->parse_funcs_and_vars ();
2343 }
2344
2345 /* Write pass summary for IPA ICF pass. */
2346
2347 static void
2348 ipa_icf_write_summary (void)
2349 {
2350 gcc_assert (optimizer);
2351
2352 optimizer->write_summary ();
2353 }
2354
2355 /* Read pass summary for IPA ICF pass. */
2356
2357 static void
2358 ipa_icf_read_summary (void)
2359 {
2360 if (!optimizer)
2361 optimizer = new sem_item_optimizer ();
2362
2363 optimizer->read_summary ();
2364 optimizer->register_hooks ();
2365 }
2366
2367 /* Semantic equality exection function. */
2368
2369 static unsigned int
2370 ipa_icf_driver (void)
2371 {
2372 gcc_assert (optimizer);
2373
2374 optimizer->execute ();
2375 optimizer->unregister_hooks ();
2376
2377 delete optimizer;
2378 optimizer = NULL;
2379
2380 return 0;
2381 }
2382
2383 const pass_data pass_data_ipa_icf =
2384 {
2385 IPA_PASS, /* type */
2386 "icf", /* name */
2387 OPTGROUP_IPA, /* optinfo_flags */
2388 TV_IPA_ICF, /* tv_id */
2389 0, /* properties_required */
2390 0, /* properties_provided */
2391 0, /* properties_destroyed */
2392 0, /* todo_flags_start */
2393 0, /* todo_flags_finish */
2394 };
2395
2396 class pass_ipa_icf : public ipa_opt_pass_d
2397 {
2398 public:
2399 pass_ipa_icf (gcc::context *ctxt)
2400 : ipa_opt_pass_d (pass_data_ipa_icf, ctxt,
2401 ipa_icf_generate_summary, /* generate_summary */
2402 ipa_icf_write_summary, /* write_summary */
2403 ipa_icf_read_summary, /* read_summary */
2404 NULL, /*
2405 write_optimization_summary */
2406 NULL, /*
2407 read_optimization_summary */
2408 NULL, /* stmt_fixup */
2409 0, /* function_transform_todo_flags_start */
2410 NULL, /* function_transform */
2411 NULL) /* variable_transform */
2412 {}
2413
2414 /* opt_pass methods: */
2415 virtual bool gate (function *)
2416 {
2417 return flag_ipa_icf_variables || flag_ipa_icf_functions;
2418 }
2419
2420 virtual unsigned int execute (function *)
2421 {
2422 return ipa_icf_driver();
2423 }
2424 }; // class pass_ipa_icf
2425
2426 } // ipa_icf namespace
2427
2428 ipa_opt_pass_d *
2429 make_pass_ipa_icf (gcc::context *ctxt)
2430 {
2431 return new ipa_icf::pass_ipa_icf (ctxt);
2432 }