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