re PR ipa/64872 (ICE: Segmentation fault during Chromium PGO build)
[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
715 /* The alias function is removed if symbol address
716 does not matter. */
717 if (!alias_address_matters)
718 alias->remove ();
719
720 if (dump_file && redirected)
721 fprintf (dump_file, "Callgraph local calls have been redirected.\n\n");
722 }
723 /* If the condtion above is not met, we are lucky and can turn the
724 function into real alias. */
725 else if (create_alias)
726 {
727 alias->icf_merged = true;
728
729 /* Remove the function's body. */
730 ipa_merge_profiles (original, alias);
731 alias->release_body (true);
732 alias->reset ();
733
734 /* Create the alias. */
735 cgraph_node::create_alias (alias_func->decl, decl);
736 alias->resolve_alias (original);
737
738 /* Workaround for PR63566 that forces equal calling convention
739 to be used. */
740 alias->local.local = false;
741 original->local.local = false;
742
743 if (dump_file)
744 fprintf (dump_file, "Callgraph alias has been created.\n\n");
745 }
746 else if (create_thunk)
747 {
748 if (DECL_COMDAT_GROUP (alias->decl))
749 {
750 if (dump_file)
751 fprintf (dump_file, "Callgraph thunk cannot be created because of COMDAT\n");
752
753 return 0;
754 }
755
756 if (DECL_STATIC_CHAIN (alias->decl))
757 {
758 if (dump_file)
759 fprintf (dump_file, "Thunk creation is risky for static-chain functions.\n\n");
760
761 return 0;
762 }
763
764 alias->icf_merged = true;
765 ipa_merge_profiles (local_original, alias, true);
766 alias->create_wrapper (local_original);
767
768 if (dump_file)
769 fprintf (dump_file, "Callgraph thunk has been created.\n\n");
770 }
771 else if (dump_file)
772 fprintf (dump_file, "Callgraph merge operation cannot be performed.\n\n");
773
774 return true;
775 }
776
777 /* Semantic item initialization function. */
778
779 void
780 sem_function::init (void)
781 {
782 if (in_lto_p)
783 get_node ()->get_untransformed_body ();
784
785 tree fndecl = node->decl;
786 function *func = DECL_STRUCT_FUNCTION (fndecl);
787
788 gcc_assert (func);
789 gcc_assert (SSANAMES (func));
790
791 ssa_names_size = SSANAMES (func)->length ();
792 node = node;
793
794 decl = fndecl;
795 region_tree = func->eh->region_tree;
796
797 /* iterating all function arguments. */
798 arg_count = count_formal_params (fndecl);
799
800 edge_count = n_edges_for_fn (func);
801 cfg_checksum = coverage_compute_cfg_checksum (func);
802
803 inchash::hash hstate;
804
805 basic_block bb;
806 FOR_EACH_BB_FN (bb, func)
807 {
808 unsigned nondbg_stmt_count = 0;
809
810 edge e;
811 for (edge_iterator ei = ei_start (bb->preds); ei_cond (ei, &e); ei_next (&ei))
812 cfg_checksum = iterative_hash_host_wide_int (e->flags,
813 cfg_checksum);
814
815 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
816 gsi_next (&gsi))
817 {
818 gimple stmt = gsi_stmt (gsi);
819
820 if (gimple_code (stmt) != GIMPLE_DEBUG)
821 {
822 hash_stmt (&hstate, stmt);
823 nondbg_stmt_count++;
824 }
825 }
826
827 gcode_hash = hstate.end ();
828 bb_sizes.safe_push (nondbg_stmt_count);
829
830 /* Inserting basic block to hash table. */
831 sem_bb *semantic_bb = new sem_bb (bb, nondbg_stmt_count,
832 EDGE_COUNT (bb->preds) + EDGE_COUNT (bb->succs));
833
834 bb_sorted.safe_push (semantic_bb);
835 }
836
837 parse_tree_args ();
838 }
839
840 /* Improve accumulated hash for HSTATE based on a gimple statement STMT. */
841
842 void
843 sem_function::hash_stmt (inchash::hash *hstate, gimple stmt)
844 {
845 enum gimple_code code = gimple_code (stmt);
846
847 hstate->add_int (code);
848
849 if (code == GIMPLE_CALL)
850 {
851 /* Checking of argument. */
852 for (unsigned i = 0; i < gimple_call_num_args (stmt); ++i)
853 {
854 tree argument = gimple_call_arg (stmt, i);
855
856 switch (TREE_CODE (argument))
857 {
858 case INTEGER_CST:
859 if (tree_fits_shwi_p (argument))
860 hstate->add_wide_int (tree_to_shwi (argument));
861 else if (tree_fits_uhwi_p (argument))
862 hstate->add_wide_int (tree_to_uhwi (argument));
863 break;
864 case REAL_CST:
865 REAL_VALUE_TYPE c;
866 HOST_WIDE_INT n;
867
868 c = TREE_REAL_CST (argument);
869 n = real_to_integer (&c);
870
871 hstate->add_wide_int (n);
872 break;
873 case ADDR_EXPR:
874 {
875 tree addr_operand = TREE_OPERAND (argument, 0);
876
877 if (TREE_CODE (addr_operand) == STRING_CST)
878 hstate->add (TREE_STRING_POINTER (addr_operand),
879 TREE_STRING_LENGTH (addr_operand));
880 break;
881 }
882 default:
883 break;
884 }
885 }
886 }
887 }
888
889
890 /* Return true if polymorphic comparison must be processed. */
891
892 bool
893 sem_function::compare_polymorphic_p (void)
894 {
895 return get_node ()->callees != NULL
896 || get_node ()->indirect_calls != NULL
897 || m_compared_func->get_node ()->callees != NULL
898 || m_compared_func->get_node ()->indirect_calls != NULL;
899 }
900
901 /* For a given call graph NODE, the function constructs new
902 semantic function item. */
903
904 sem_function *
905 sem_function::parse (cgraph_node *node, bitmap_obstack *stack)
906 {
907 tree fndecl = node->decl;
908 function *func = DECL_STRUCT_FUNCTION (fndecl);
909
910 /* TODO: add support for thunks and aliases. */
911
912 if (!func || !node->has_gimple_body_p ())
913 return NULL;
914
915 if (lookup_attribute_by_prefix ("omp ", DECL_ATTRIBUTES (node->decl)) != NULL)
916 return NULL;
917
918 sem_function *f = new sem_function (node, 0, stack);
919
920 f->init ();
921
922 return f;
923 }
924
925 /* Parses function arguments and result type. */
926
927 void
928 sem_function::parse_tree_args (void)
929 {
930 tree result;
931
932 if (arg_types.exists ())
933 arg_types.release ();
934
935 arg_types.create (4);
936 tree fnargs = DECL_ARGUMENTS (decl);
937
938 for (tree parm = fnargs; parm; parm = DECL_CHAIN (parm))
939 arg_types.safe_push (DECL_ARG_TYPE (parm));
940
941 /* Function result type. */
942 result = DECL_RESULT (decl);
943 result_type = result ? TREE_TYPE (result) : NULL;
944
945 /* During WPA, we can get arguments by following method. */
946 if (!fnargs)
947 {
948 tree type = TYPE_ARG_TYPES (TREE_TYPE (decl));
949 for (tree parm = type; parm; parm = TREE_CHAIN (parm))
950 arg_types.safe_push (TYPE_CANONICAL (TREE_VALUE (parm)));
951
952 result_type = TREE_TYPE (TREE_TYPE (decl));
953 }
954 }
955
956 /* For given basic blocks BB1 and BB2 (from functions FUNC1 and FUNC),
957 return true if phi nodes are semantically equivalent in these blocks . */
958
959 bool
960 sem_function::compare_phi_node (basic_block bb1, basic_block bb2)
961 {
962 gphi_iterator si1, si2;
963 gphi *phi1, *phi2;
964 unsigned size1, size2, i;
965 tree t1, t2;
966 edge e1, e2;
967
968 gcc_assert (bb1 != NULL);
969 gcc_assert (bb2 != NULL);
970
971 si2 = gsi_start_phis (bb2);
972 for (si1 = gsi_start_phis (bb1); !gsi_end_p (si1);
973 gsi_next (&si1))
974 {
975 gsi_next_nonvirtual_phi (&si1);
976 gsi_next_nonvirtual_phi (&si2);
977
978 if (gsi_end_p (si1) && gsi_end_p (si2))
979 break;
980
981 if (gsi_end_p (si1) || gsi_end_p (si2))
982 return return_false();
983
984 phi1 = si1.phi ();
985 phi2 = si2.phi ();
986
987 tree phi_result1 = gimple_phi_result (phi1);
988 tree phi_result2 = gimple_phi_result (phi2);
989
990 if (!m_checker->compare_operand (phi_result1, phi_result2))
991 return return_false_with_msg ("PHI results are different");
992
993 size1 = gimple_phi_num_args (phi1);
994 size2 = gimple_phi_num_args (phi2);
995
996 if (size1 != size2)
997 return return_false ();
998
999 for (i = 0; i < size1; ++i)
1000 {
1001 t1 = gimple_phi_arg (phi1, i)->def;
1002 t2 = gimple_phi_arg (phi2, i)->def;
1003
1004 if (!m_checker->compare_operand (t1, t2))
1005 return return_false ();
1006
1007 e1 = gimple_phi_arg_edge (phi1, i);
1008 e2 = gimple_phi_arg_edge (phi2, i);
1009
1010 if (!m_checker->compare_edge (e1, e2))
1011 return return_false ();
1012 }
1013
1014 gsi_next (&si2);
1015 }
1016
1017 return true;
1018 }
1019
1020 /* Returns true if tree T can be compared as a handled component. */
1021
1022 bool
1023 sem_function::icf_handled_component_p (tree t)
1024 {
1025 tree_code tc = TREE_CODE (t);
1026
1027 return ((handled_component_p (t))
1028 || tc == ADDR_EXPR || tc == MEM_REF || tc == REALPART_EXPR
1029 || tc == IMAGPART_EXPR || tc == OBJ_TYPE_REF);
1030 }
1031
1032 /* Basic blocks dictionary BB_DICT returns true if SOURCE index BB
1033 corresponds to TARGET. */
1034
1035 bool
1036 sem_function::bb_dict_test (auto_vec<int> bb_dict, int source, int target)
1037 {
1038 source++;
1039 target++;
1040
1041 if (bb_dict.length () <= (unsigned)source)
1042 bb_dict.safe_grow_cleared (source + 1);
1043
1044 if (bb_dict[source] == 0)
1045 {
1046 bb_dict[source] = target;
1047 return true;
1048 }
1049 else
1050 return bb_dict[source] == target;
1051 }
1052
1053 /* Iterates all tree types in T1 and T2 and returns true if all types
1054 are compatible. If COMPARE_POLYMORPHIC is set to true,
1055 more strict comparison is executed. */
1056
1057 bool
1058 sem_function::compare_type_list (tree t1, tree t2, bool compare_polymorphic)
1059 {
1060 tree tv1, tv2;
1061 tree_code tc1, tc2;
1062
1063 if (!t1 && !t2)
1064 return true;
1065
1066 while (t1 != NULL && t2 != NULL)
1067 {
1068 tv1 = TREE_VALUE (t1);
1069 tv2 = TREE_VALUE (t2);
1070
1071 tc1 = TREE_CODE (tv1);
1072 tc2 = TREE_CODE (tv2);
1073
1074 if (tc1 == NOP_EXPR && tc2 == NOP_EXPR)
1075 {}
1076 else if (tc1 == NOP_EXPR || tc2 == NOP_EXPR)
1077 return false;
1078 else if (!func_checker::compatible_types_p (tv1, tv2, compare_polymorphic))
1079 return false;
1080
1081 t1 = TREE_CHAIN (t1);
1082 t2 = TREE_CHAIN (t2);
1083 }
1084
1085 return !(t1 || t2);
1086 }
1087
1088
1089 /* Semantic variable constructor that uses STACK as bitmap memory stack. */
1090
1091 sem_variable::sem_variable (bitmap_obstack *stack): sem_item (VAR, stack)
1092 {
1093 }
1094
1095 /* Constructor based on varpool node _NODE with computed hash _HASH.
1096 Bitmap STACK is used for memory allocation. */
1097
1098 sem_variable::sem_variable (varpool_node *node, hashval_t _hash,
1099 bitmap_obstack *stack): sem_item(VAR,
1100 node, _hash, stack)
1101 {
1102 gcc_checking_assert (node);
1103 gcc_checking_assert (get_node ());
1104 }
1105
1106 /* Returns true if the item equals to ITEM given as argument. */
1107
1108 bool
1109 sem_variable::equals (sem_item *item,
1110 hash_map <symtab_node *, sem_item *> & ARG_UNUSED (ignored_nodes))
1111 {
1112 gcc_assert (item->type == VAR);
1113
1114 sem_variable *v = static_cast<sem_variable *>(item);
1115
1116 if (!ctor || !v->ctor)
1117 return return_false_with_msg ("ctor is missing for semantic variable");
1118
1119 return sem_variable::equals (ctor, v->ctor);
1120 }
1121
1122 /* Compares trees T1 and T2 for semantic equality. */
1123
1124 bool
1125 sem_variable::equals (tree t1, tree t2)
1126 {
1127 tree_code tc1 = TREE_CODE (t1);
1128 tree_code tc2 = TREE_CODE (t2);
1129
1130 if (tc1 != tc2)
1131 return false;
1132
1133 switch (tc1)
1134 {
1135 case CONSTRUCTOR:
1136 {
1137 unsigned len1 = vec_safe_length (CONSTRUCTOR_ELTS (t1));
1138 unsigned len2 = vec_safe_length (CONSTRUCTOR_ELTS (t2));
1139
1140 if (len1 != len2)
1141 return false;
1142
1143 for (unsigned i = 0; i < len1; i++)
1144 if (!sem_variable::equals (CONSTRUCTOR_ELT (t1, i)->value,
1145 CONSTRUCTOR_ELT (t2, i)->value)
1146 || CONSTRUCTOR_ELT (t1, i)->index != CONSTRUCTOR_ELT (t2, i)->index)
1147 return false;
1148
1149 return true;
1150 }
1151 case MEM_REF:
1152 {
1153 tree x1 = TREE_OPERAND (t1, 0);
1154 tree x2 = TREE_OPERAND (t2, 0);
1155 tree y1 = TREE_OPERAND (t1, 1);
1156 tree y2 = TREE_OPERAND (t2, 1);
1157
1158 if (!func_checker::compatible_types_p (TREE_TYPE (x1), TREE_TYPE (x2),
1159 true))
1160 return return_false ();
1161
1162 /* Type of the offset on MEM_REF does not matter. */
1163 return sem_variable::equals (x1, x2)
1164 && wi::to_offset (y1) == wi::to_offset (y2);
1165 }
1166 case NOP_EXPR:
1167 case ADDR_EXPR:
1168 {
1169 tree op1 = TREE_OPERAND (t1, 0);
1170 tree op2 = TREE_OPERAND (t2, 0);
1171 return sem_variable::equals (op1, op2);
1172 }
1173 case FUNCTION_DECL:
1174 case VAR_DECL:
1175 case FIELD_DECL:
1176 case LABEL_DECL:
1177 return t1 == t2;
1178 case INTEGER_CST:
1179 return func_checker::compatible_types_p (TREE_TYPE (t1), TREE_TYPE (t2),
1180 true)
1181 && wi::to_offset (t1) == wi::to_offset (t2);
1182 case STRING_CST:
1183 case REAL_CST:
1184 case COMPLEX_CST:
1185 return operand_equal_p (t1, t2, OEP_ONLY_CONST);
1186 case COMPONENT_REF:
1187 case ARRAY_REF:
1188 case POINTER_PLUS_EXPR:
1189 {
1190 tree x1 = TREE_OPERAND (t1, 0);
1191 tree x2 = TREE_OPERAND (t2, 0);
1192 tree y1 = TREE_OPERAND (t1, 1);
1193 tree y2 = TREE_OPERAND (t2, 1);
1194
1195 return sem_variable::equals (x1, x2) && sem_variable::equals (y1, y2);
1196 }
1197 case ERROR_MARK:
1198 return return_false_with_msg ("ERROR_MARK");
1199 default:
1200 return return_false_with_msg ("Unknown TREE code reached");
1201 }
1202 }
1203
1204 /* Parser function that visits a varpool NODE. */
1205
1206 sem_variable *
1207 sem_variable::parse (varpool_node *node, bitmap_obstack *stack)
1208 {
1209 tree decl = node->decl;
1210
1211 bool readonly = TYPE_P (decl) ? TYPE_READONLY (decl) : TREE_READONLY (decl);
1212 if (!readonly)
1213 return NULL;
1214
1215 bool can_handle = DECL_VIRTUAL_P (decl)
1216 || flag_merge_constants >= 2
1217 || (!TREE_ADDRESSABLE (decl) && !node->externally_visible);
1218
1219 if (!can_handle || DECL_EXTERNAL (decl))
1220 return NULL;
1221
1222 tree ctor = ctor_for_folding (decl);
1223 if (!ctor)
1224 return NULL;
1225
1226 sem_variable *v = new sem_variable (node, 0, stack);
1227
1228 v->init ();
1229
1230 return v;
1231 }
1232
1233 /* References independent hash function. */
1234
1235 hashval_t
1236 sem_variable::get_hash (void)
1237 {
1238 if (hash)
1239 return hash;
1240
1241 inchash::hash hstate;
1242
1243 hstate.add_int (456346417);
1244 hstate.add_int (TREE_CODE (ctor));
1245
1246 if (TREE_CODE (ctor) == CONSTRUCTOR)
1247 {
1248 unsigned length = vec_safe_length (CONSTRUCTOR_ELTS (ctor));
1249 hstate.add_int (length);
1250 }
1251
1252 hash = hstate.end ();
1253
1254 return hash;
1255 }
1256
1257 /* Merges instance with an ALIAS_ITEM, where alias, thunk or redirection can
1258 be applied. */
1259
1260 bool
1261 sem_variable::merge (sem_item *alias_item)
1262 {
1263 gcc_assert (alias_item->type == VAR);
1264
1265 if (!sem_item::target_supports_symbol_aliases_p ())
1266 {
1267 if (dump_file)
1268 fprintf (dump_file, "Symbol aliases are not supported by target\n\n");
1269 return false;
1270 }
1271
1272 sem_variable *alias_var = static_cast<sem_variable *> (alias_item);
1273
1274 varpool_node *original = get_node ();
1275 varpool_node *alias = alias_var->get_node ();
1276 bool original_discardable = false;
1277
1278 /* See if original is in a section that can be discarded if the main
1279 symbol is not used. */
1280 if (DECL_EXTERNAL (original->decl))
1281 original_discardable = true;
1282 if (original->resolution == LDPR_PREEMPTED_REG
1283 || original->resolution == LDPR_PREEMPTED_IR)
1284 original_discardable = true;
1285 if (original->can_be_discarded_p ())
1286 original_discardable = true;
1287
1288 gcc_assert (!TREE_ASM_WRITTEN (alias->decl));
1289
1290 if (original_discardable || DECL_EXTERNAL (alias_var->decl) ||
1291 !compare_sections (alias_var))
1292 {
1293 if (dump_file)
1294 fprintf (dump_file, "Varpool alias cannot be created\n\n");
1295
1296 return false;
1297 }
1298 else
1299 {
1300 // alias cycle creation check
1301 varpool_node *n = original;
1302
1303 while (n->alias)
1304 {
1305 n = n->get_alias_target ();
1306 if (n == alias)
1307 {
1308 if (dump_file)
1309 fprintf (dump_file, "Varpool alias cannot be created (alias cycle).\n\n");
1310
1311 return false;
1312 }
1313 }
1314
1315 alias->analyzed = false;
1316
1317 DECL_INITIAL (alias->decl) = NULL;
1318 alias->need_bounds_init = false;
1319 alias->remove_all_references ();
1320
1321 varpool_node::create_alias (alias_var->decl, decl);
1322 alias->resolve_alias (original);
1323
1324 if (dump_file)
1325 fprintf (dump_file, "Varpool alias has been created.\n\n");
1326
1327 return true;
1328 }
1329 }
1330
1331 bool
1332 sem_variable::compare_sections (sem_variable *alias)
1333 {
1334 const char *source = node->get_section ();
1335 const char *target = alias->node->get_section();
1336
1337 if (source == NULL && target == NULL)
1338 return true;
1339 else if(!source || !target)
1340 return false;
1341 else
1342 return strcmp (source, target) == 0;
1343 }
1344
1345 /* Dump symbol to FILE. */
1346
1347 void
1348 sem_variable::dump_to_file (FILE *file)
1349 {
1350 gcc_assert (file);
1351
1352 print_node (file, "", decl, 0);
1353 fprintf (file, "\n\n");
1354 }
1355
1356 /* Iterates though a constructor and identifies tree references
1357 we are interested in semantic function equality. */
1358
1359 void
1360 sem_variable::parse_tree_refs (tree t)
1361 {
1362 switch (TREE_CODE (t))
1363 {
1364 case CONSTRUCTOR:
1365 {
1366 unsigned length = vec_safe_length (CONSTRUCTOR_ELTS (t));
1367
1368 for (unsigned i = 0; i < length; i++)
1369 parse_tree_refs(CONSTRUCTOR_ELT (t, i)->value);
1370
1371 break;
1372 }
1373 case NOP_EXPR:
1374 case ADDR_EXPR:
1375 {
1376 tree op = TREE_OPERAND (t, 0);
1377 parse_tree_refs (op);
1378 break;
1379 }
1380 case FUNCTION_DECL:
1381 {
1382 tree_refs.safe_push (t);
1383 break;
1384 }
1385 default:
1386 break;
1387 }
1388 }
1389
1390 unsigned int sem_item_optimizer::class_id = 0;
1391
1392 sem_item_optimizer::sem_item_optimizer (): worklist (0), m_classes (0),
1393 m_classes_count (0), m_cgraph_node_hooks (NULL), m_varpool_node_hooks (NULL)
1394 {
1395 m_items.create (0);
1396 bitmap_obstack_initialize (&m_bmstack);
1397 }
1398
1399 sem_item_optimizer::~sem_item_optimizer ()
1400 {
1401 for (unsigned int i = 0; i < m_items.length (); i++)
1402 delete m_items[i];
1403
1404 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
1405 it != m_classes.end (); ++it)
1406 {
1407 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
1408 delete (*it)->classes[i];
1409
1410 (*it)->classes.release ();
1411 free (*it);
1412 }
1413
1414 m_items.release ();
1415
1416 bitmap_obstack_release (&m_bmstack);
1417 }
1418
1419 /* Write IPA ICF summary for symbols. */
1420
1421 void
1422 sem_item_optimizer::write_summary (void)
1423 {
1424 unsigned int count = 0;
1425
1426 output_block *ob = create_output_block (LTO_section_ipa_icf);
1427 lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
1428 ob->symbol = NULL;
1429
1430 /* Calculate number of symbols to be serialized. */
1431 for (lto_symtab_encoder_iterator lsei = lsei_start_in_partition (encoder);
1432 !lsei_end_p (lsei);
1433 lsei_next_in_partition (&lsei))
1434 {
1435 symtab_node *node = lsei_node (lsei);
1436
1437 if (m_symtab_node_map.get (node))
1438 count++;
1439 }
1440
1441 streamer_write_uhwi (ob, count);
1442
1443 /* Process all of the symbols. */
1444 for (lto_symtab_encoder_iterator lsei = lsei_start_in_partition (encoder);
1445 !lsei_end_p (lsei);
1446 lsei_next_in_partition (&lsei))
1447 {
1448 symtab_node *node = lsei_node (lsei);
1449
1450 sem_item **item = m_symtab_node_map.get (node);
1451
1452 if (item && *item)
1453 {
1454 int node_ref = lto_symtab_encoder_encode (encoder, node);
1455 streamer_write_uhwi_stream (ob->main_stream, node_ref);
1456
1457 streamer_write_uhwi (ob, (*item)->get_hash ());
1458 }
1459 }
1460
1461 streamer_write_char_stream (ob->main_stream, 0);
1462 produce_asm (ob, NULL);
1463 destroy_output_block (ob);
1464 }
1465
1466 /* Reads a section from LTO stream file FILE_DATA. Input block for DATA
1467 contains LEN bytes. */
1468
1469 void
1470 sem_item_optimizer::read_section (lto_file_decl_data *file_data,
1471 const char *data, size_t len)
1472 {
1473 const lto_function_header *header =
1474 (const lto_function_header *) data;
1475 const int cfg_offset = sizeof (lto_function_header);
1476 const int main_offset = cfg_offset + header->cfg_size;
1477 const int string_offset = main_offset + header->main_size;
1478 data_in *data_in;
1479 unsigned int i;
1480 unsigned int count;
1481
1482 lto_input_block ib_main ((const char *) data + main_offset, 0,
1483 header->main_size);
1484
1485 data_in =
1486 lto_data_in_create (file_data, (const char *) data + string_offset,
1487 header->string_size, vNULL);
1488
1489 count = streamer_read_uhwi (&ib_main);
1490
1491 for (i = 0; i < count; i++)
1492 {
1493 unsigned int index;
1494 symtab_node *node;
1495 lto_symtab_encoder_t encoder;
1496
1497 index = streamer_read_uhwi (&ib_main);
1498 encoder = file_data->symtab_node_encoder;
1499 node = lto_symtab_encoder_deref (encoder, index);
1500
1501 hashval_t hash = streamer_read_uhwi (&ib_main);
1502
1503 gcc_assert (node->definition);
1504
1505 if (dump_file)
1506 fprintf (dump_file, "Symbol added:%s (tree: %p, uid:%u)\n", node->asm_name (),
1507 (void *) node->decl, node->order);
1508
1509 if (is_a<cgraph_node *> (node))
1510 {
1511 cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
1512
1513 m_items.safe_push (new sem_function (cnode, hash, &m_bmstack));
1514 }
1515 else
1516 {
1517 varpool_node *vnode = dyn_cast <varpool_node *> (node);
1518
1519 m_items.safe_push (new sem_variable (vnode, hash, &m_bmstack));
1520 }
1521 }
1522
1523 lto_free_section_data (file_data, LTO_section_ipa_icf, NULL, data,
1524 len);
1525 lto_data_in_delete (data_in);
1526 }
1527
1528 /* Read IPA IPA ICF summary for symbols. */
1529
1530 void
1531 sem_item_optimizer::read_summary (void)
1532 {
1533 lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
1534 lto_file_decl_data *file_data;
1535 unsigned int j = 0;
1536
1537 while ((file_data = file_data_vec[j++]))
1538 {
1539 size_t len;
1540 const char *data = lto_get_section_data (file_data,
1541 LTO_section_ipa_icf, NULL, &len);
1542
1543 if (data)
1544 read_section (file_data, data, len);
1545 }
1546 }
1547
1548 /* Register callgraph and varpool hooks. */
1549
1550 void
1551 sem_item_optimizer::register_hooks (void)
1552 {
1553 m_cgraph_node_hooks = symtab->add_cgraph_removal_hook
1554 (&sem_item_optimizer::cgraph_removal_hook, this);
1555
1556 m_varpool_node_hooks = symtab->add_varpool_removal_hook
1557 (&sem_item_optimizer::varpool_removal_hook, this);
1558 }
1559
1560 /* Unregister callgraph and varpool hooks. */
1561
1562 void
1563 sem_item_optimizer::unregister_hooks (void)
1564 {
1565 if (m_cgraph_node_hooks)
1566 symtab->remove_cgraph_removal_hook (m_cgraph_node_hooks);
1567
1568 if (m_varpool_node_hooks)
1569 symtab->remove_varpool_removal_hook (m_varpool_node_hooks);
1570 }
1571
1572 /* Adds a CLS to hashtable associated by hash value. */
1573
1574 void
1575 sem_item_optimizer::add_class (congruence_class *cls)
1576 {
1577 gcc_assert (cls->members.length ());
1578
1579 congruence_class_group *group = get_group_by_hash (
1580 cls->members[0]->get_hash (),
1581 cls->members[0]->type);
1582 group->classes.safe_push (cls);
1583 }
1584
1585 /* Gets a congruence class group based on given HASH value and TYPE. */
1586
1587 congruence_class_group *
1588 sem_item_optimizer::get_group_by_hash (hashval_t hash, sem_item_type type)
1589 {
1590 congruence_class_group *item = XNEW (congruence_class_group);
1591 item->hash = hash;
1592 item->type = type;
1593
1594 congruence_class_group **slot = m_classes.find_slot (item, INSERT);
1595
1596 if (*slot)
1597 free (item);
1598 else
1599 {
1600 item->classes.create (1);
1601 *slot = item;
1602 }
1603
1604 return *slot;
1605 }
1606
1607 /* Callgraph removal hook called for a NODE with a custom DATA. */
1608
1609 void
1610 sem_item_optimizer::cgraph_removal_hook (cgraph_node *node, void *data)
1611 {
1612 sem_item_optimizer *optimizer = (sem_item_optimizer *) data;
1613 optimizer->remove_symtab_node (node);
1614 }
1615
1616 /* Varpool removal hook called for a NODE with a custom DATA. */
1617
1618 void
1619 sem_item_optimizer::varpool_removal_hook (varpool_node *node, void *data)
1620 {
1621 sem_item_optimizer *optimizer = (sem_item_optimizer *) data;
1622 optimizer->remove_symtab_node (node);
1623 }
1624
1625 /* Remove symtab NODE triggered by symtab removal hooks. */
1626
1627 void
1628 sem_item_optimizer::remove_symtab_node (symtab_node *node)
1629 {
1630 gcc_assert (!m_classes.elements());
1631
1632 m_removed_items_set.add (node);
1633 }
1634
1635 void
1636 sem_item_optimizer::remove_item (sem_item *item)
1637 {
1638 if (m_symtab_node_map.get (item->node))
1639 m_symtab_node_map.remove (item->node);
1640 delete item;
1641 }
1642
1643 /* Removes all callgraph and varpool nodes that are marked by symtab
1644 as deleted. */
1645
1646 void
1647 sem_item_optimizer::filter_removed_items (void)
1648 {
1649 auto_vec <sem_item *> filtered;
1650
1651 for (unsigned int i = 0; i < m_items.length(); i++)
1652 {
1653 sem_item *item = m_items[i];
1654
1655 if (m_removed_items_set.contains (item->node))
1656 {
1657 remove_item (item);
1658 continue;
1659 }
1660
1661 if (item->type == FUNC)
1662 {
1663 cgraph_node *cnode = static_cast <sem_function *>(item)->get_node ();
1664
1665 bool no_body_function = in_lto_p && (cnode->alias || cnode->body_removed);
1666 if (no_body_function || !opt_for_fn (item->decl, flag_ipa_icf_functions)
1667 || DECL_CXX_CONSTRUCTOR_P (item->decl)
1668 || DECL_CXX_DESTRUCTOR_P (item->decl))
1669 remove_item (item);
1670 else
1671 filtered.safe_push (item);
1672 }
1673 else /* VAR. */
1674 {
1675 if (!flag_ipa_icf_variables)
1676 remove_item (item);
1677 else
1678 filtered.safe_push (item);
1679 }
1680 }
1681
1682 /* Clean-up of released semantic items. */
1683
1684 m_items.release ();
1685 for (unsigned int i = 0; i < filtered.length(); i++)
1686 m_items.safe_push (filtered[i]);
1687 }
1688
1689 /* Optimizer entry point. */
1690
1691 void
1692 sem_item_optimizer::execute (void)
1693 {
1694 filter_removed_items ();
1695 build_hash_based_classes ();
1696
1697 if (dump_file)
1698 fprintf (dump_file, "Dump after hash based groups\n");
1699 dump_cong_classes ();
1700
1701 for (unsigned int i = 0; i < m_items.length(); i++)
1702 m_items[i]->init_wpa ();
1703
1704 build_graph ();
1705
1706 subdivide_classes_by_equality (true);
1707
1708 if (dump_file)
1709 fprintf (dump_file, "Dump after WPA based types groups\n");
1710
1711 dump_cong_classes ();
1712
1713 process_cong_reduction ();
1714 verify_classes ();
1715
1716 if (dump_file)
1717 fprintf (dump_file, "Dump after callgraph-based congruence reduction\n");
1718
1719 dump_cong_classes ();
1720
1721 parse_nonsingleton_classes ();
1722 subdivide_classes_by_equality ();
1723
1724 if (dump_file)
1725 fprintf (dump_file, "Dump after full equality comparison of groups\n");
1726
1727 dump_cong_classes ();
1728
1729 unsigned int prev_class_count = m_classes_count;
1730
1731 process_cong_reduction ();
1732 dump_cong_classes ();
1733 verify_classes ();
1734 merge_classes (prev_class_count);
1735
1736 if (dump_file && (dump_flags & TDF_DETAILS))
1737 symtab_node::dump_table (dump_file);
1738 }
1739
1740 /* Function responsible for visiting all potential functions and
1741 read-only variables that can be merged. */
1742
1743 void
1744 sem_item_optimizer::parse_funcs_and_vars (void)
1745 {
1746 cgraph_node *cnode;
1747
1748 if (flag_ipa_icf_functions)
1749 FOR_EACH_DEFINED_FUNCTION (cnode)
1750 {
1751 sem_function *f = sem_function::parse (cnode, &m_bmstack);
1752 if (f)
1753 {
1754 m_items.safe_push (f);
1755 m_symtab_node_map.put (cnode, f);
1756
1757 if (dump_file)
1758 fprintf (dump_file, "Parsed function:%s\n", f->asm_name ());
1759
1760 if (dump_file && (dump_flags & TDF_DETAILS))
1761 f->dump_to_file (dump_file);
1762 }
1763 else if (dump_file)
1764 fprintf (dump_file, "Not parsed function:%s\n", cnode->asm_name ());
1765 }
1766
1767 varpool_node *vnode;
1768
1769 if (flag_ipa_icf_variables)
1770 FOR_EACH_DEFINED_VARIABLE (vnode)
1771 {
1772 sem_variable *v = sem_variable::parse (vnode, &m_bmstack);
1773
1774 if (v)
1775 {
1776 m_items.safe_push (v);
1777 m_symtab_node_map.put (vnode, v);
1778 }
1779 }
1780 }
1781
1782 /* Makes pairing between a congruence class CLS and semantic ITEM. */
1783
1784 void
1785 sem_item_optimizer::add_item_to_class (congruence_class *cls, sem_item *item)
1786 {
1787 item->index_in_class = cls->members.length ();
1788 cls->members.safe_push (item);
1789 item->cls = cls;
1790 }
1791
1792 /* Congruence classes are built by hash value. */
1793
1794 void
1795 sem_item_optimizer::build_hash_based_classes (void)
1796 {
1797 for (unsigned i = 0; i < m_items.length (); i++)
1798 {
1799 sem_item *item = m_items[i];
1800
1801 congruence_class_group *group = get_group_by_hash (item->get_hash (),
1802 item->type);
1803
1804 if (!group->classes.length ())
1805 {
1806 m_classes_count++;
1807 group->classes.safe_push (new congruence_class (class_id++));
1808 }
1809
1810 add_item_to_class (group->classes[0], item);
1811 }
1812 }
1813
1814 /* Build references according to call graph. */
1815
1816 void
1817 sem_item_optimizer::build_graph (void)
1818 {
1819 for (unsigned i = 0; i < m_items.length (); i++)
1820 {
1821 sem_item *item = m_items[i];
1822 m_symtab_node_map.put (item->node, item);
1823 }
1824
1825 for (unsigned i = 0; i < m_items.length (); i++)
1826 {
1827 sem_item *item = m_items[i];
1828
1829 if (item->type == FUNC)
1830 {
1831 cgraph_node *cnode = dyn_cast <cgraph_node *> (item->node);
1832
1833 cgraph_edge *e = cnode->callees;
1834 while (e)
1835 {
1836 sem_item **slot = m_symtab_node_map.get (e->callee);
1837 if (slot)
1838 item->add_reference (*slot);
1839
1840 e = e->next_callee;
1841 }
1842 }
1843
1844 ipa_ref *ref = NULL;
1845 for (unsigned i = 0; item->node->iterate_reference (i, ref); i++)
1846 {
1847 sem_item **slot = m_symtab_node_map.get (ref->referred);
1848 if (slot)
1849 item->add_reference (*slot);
1850 }
1851 }
1852 }
1853
1854 /* Semantic items in classes having more than one element and initialized.
1855 In case of WPA, we load function body. */
1856
1857 void
1858 sem_item_optimizer::parse_nonsingleton_classes (void)
1859 {
1860 unsigned int init_called_count = 0;
1861
1862 for (unsigned i = 0; i < m_items.length (); i++)
1863 if (m_items[i]->cls->members.length () > 1)
1864 {
1865 m_items[i]->init ();
1866 init_called_count++;
1867 }
1868
1869 if (dump_file)
1870 fprintf (dump_file, "Init called for %u items (%.2f%%).\n", init_called_count,
1871 m_items.length () ? 100.0f * init_called_count / m_items.length (): 0.0f);
1872 }
1873
1874 /* Equality function for semantic items is used to subdivide existing
1875 classes. If IN_WPA, fast equality function is invoked. */
1876
1877 void
1878 sem_item_optimizer::subdivide_classes_by_equality (bool in_wpa)
1879 {
1880 for (hash_table <congruence_class_group_hash>::iterator it = m_classes.begin ();
1881 it != m_classes.end (); ++it)
1882 {
1883 unsigned int class_count = (*it)->classes.length ();
1884
1885 for (unsigned i = 0; i < class_count; i++)
1886 {
1887 congruence_class *c = (*it)->classes [i];
1888
1889 if (c->members.length() > 1)
1890 {
1891 auto_vec <sem_item *> new_vector;
1892
1893 sem_item *first = c->members[0];
1894 new_vector.safe_push (first);
1895
1896 unsigned class_split_first = (*it)->classes.length ();
1897
1898 for (unsigned j = 1; j < c->members.length (); j++)
1899 {
1900 sem_item *item = c->members[j];
1901
1902 bool equals = in_wpa ? first->equals_wpa (item,
1903 m_symtab_node_map) : first->equals (item, m_symtab_node_map);
1904
1905 if (equals)
1906 new_vector.safe_push (item);
1907 else
1908 {
1909 bool integrated = false;
1910
1911 for (unsigned k = class_split_first; k < (*it)->classes.length (); k++)
1912 {
1913 sem_item *x = (*it)->classes[k]->members[0];
1914 bool equals = in_wpa ? x->equals_wpa (item,
1915 m_symtab_node_map) : x->equals (item, m_symtab_node_map);
1916
1917 if (equals)
1918 {
1919 integrated = true;
1920 add_item_to_class ((*it)->classes[k], item);
1921
1922 break;
1923 }
1924 }
1925
1926 if (!integrated)
1927 {
1928 congruence_class *c = new congruence_class (class_id++);
1929 m_classes_count++;
1930 add_item_to_class (c, item);
1931
1932 (*it)->classes.safe_push (c);
1933 }
1934 }
1935 }
1936
1937 // we replace newly created new_vector for the class we've just splitted
1938 c->members.release ();
1939 c->members.create (new_vector.length ());
1940
1941 for (unsigned int j = 0; j < new_vector.length (); j++)
1942 add_item_to_class (c, new_vector[j]);
1943 }
1944 }
1945 }
1946
1947 verify_classes ();
1948 }
1949
1950 /* Verify congruence classes if checking is enabled. */
1951
1952 void
1953 sem_item_optimizer::verify_classes (void)
1954 {
1955 #if ENABLE_CHECKING
1956 for (hash_table <congruence_class_group_hash>::iterator it = m_classes.begin ();
1957 it != m_classes.end (); ++it)
1958 {
1959 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
1960 {
1961 congruence_class *cls = (*it)->classes[i];
1962
1963 gcc_checking_assert (cls);
1964 gcc_checking_assert (cls->members.length () > 0);
1965
1966 for (unsigned int j = 0; j < cls->members.length (); j++)
1967 {
1968 sem_item *item = cls->members[j];
1969
1970 gcc_checking_assert (item);
1971 gcc_checking_assert (item->cls == cls);
1972
1973 for (unsigned k = 0; k < item->usages.length (); k++)
1974 {
1975 sem_usage_pair *usage = item->usages[k];
1976 gcc_checking_assert (usage->item->index_in_class <
1977 usage->item->cls->members.length ());
1978 }
1979 }
1980 }
1981 }
1982 #endif
1983 }
1984
1985 /* Disposes split map traverse function. CLS_PTR is pointer to congruence
1986 class, BSLOT is bitmap slot we want to release. DATA is mandatory,
1987 but unused argument. */
1988
1989 bool
1990 sem_item_optimizer::release_split_map (congruence_class * const &,
1991 bitmap const &b, traverse_split_pair *)
1992 {
1993 bitmap bmp = b;
1994
1995 BITMAP_FREE (bmp);
1996
1997 return true;
1998 }
1999
2000 /* Process split operation for a class given as pointer CLS_PTR,
2001 where bitmap B splits congruence class members. DATA is used
2002 as argument of split pair. */
2003
2004 bool
2005 sem_item_optimizer::traverse_congruence_split (congruence_class * const &cls,
2006 bitmap const &b, traverse_split_pair *pair)
2007 {
2008 sem_item_optimizer *optimizer = pair->optimizer;
2009 const congruence_class *splitter_cls = pair->cls;
2010
2011 /* If counted bits are greater than zero and less than the number of members
2012 a group will be splitted. */
2013 unsigned popcount = bitmap_count_bits (b);
2014
2015 if (popcount > 0 && popcount < cls->members.length ())
2016 {
2017 congruence_class* newclasses[2] = { new congruence_class (class_id++), new congruence_class (class_id++) };
2018
2019 for (unsigned int i = 0; i < cls->members.length (); i++)
2020 {
2021 int target = bitmap_bit_p (b, i);
2022 congruence_class *tc = newclasses[target];
2023
2024 add_item_to_class (tc, cls->members[i]);
2025 }
2026
2027 #ifdef ENABLE_CHECKING
2028 for (unsigned int i = 0; i < 2; i++)
2029 gcc_checking_assert (newclasses[i]->members.length ());
2030 #endif
2031
2032 if (splitter_cls == cls)
2033 optimizer->splitter_class_removed = true;
2034
2035 /* Remove old class from worklist if presented. */
2036 bool in_worklist = cls->in_worklist;
2037
2038 if (in_worklist)
2039 cls->in_worklist = false;
2040
2041 congruence_class_group g;
2042 g.hash = cls->members[0]->get_hash ();
2043 g.type = cls->members[0]->type;
2044
2045 congruence_class_group *slot = optimizer->m_classes.find(&g);
2046
2047 for (unsigned int i = 0; i < slot->classes.length (); i++)
2048 if (slot->classes[i] == cls)
2049 {
2050 slot->classes.ordered_remove (i);
2051 break;
2052 }
2053
2054 /* New class will be inserted and integrated to work list. */
2055 for (unsigned int i = 0; i < 2; i++)
2056 optimizer->add_class (newclasses[i]);
2057
2058 /* Two classes replace one, so that increment just by one. */
2059 optimizer->m_classes_count++;
2060
2061 /* If OLD class was presented in the worklist, we remove the class
2062 and replace it will both newly created classes. */
2063 if (in_worklist)
2064 for (unsigned int i = 0; i < 2; i++)
2065 optimizer->worklist_push (newclasses[i]);
2066 else /* Just smaller class is inserted. */
2067 {
2068 unsigned int smaller_index = newclasses[0]->members.length () <
2069 newclasses[1]->members.length () ?
2070 0 : 1;
2071 optimizer->worklist_push (newclasses[smaller_index]);
2072 }
2073
2074 if (dump_file && (dump_flags & TDF_DETAILS))
2075 {
2076 fprintf (dump_file, " congruence class splitted:\n");
2077 cls->dump (dump_file, 4);
2078
2079 fprintf (dump_file, " newly created groups:\n");
2080 for (unsigned int i = 0; i < 2; i++)
2081 newclasses[i]->dump (dump_file, 4);
2082 }
2083
2084 /* Release class if not presented in work list. */
2085 if (!in_worklist)
2086 delete cls;
2087 }
2088
2089
2090 return true;
2091 }
2092
2093 /* Tests if a class CLS used as INDEXth splits any congruence classes.
2094 Bitmap stack BMSTACK is used for bitmap allocation. */
2095
2096 void
2097 sem_item_optimizer::do_congruence_step_for_index (congruence_class *cls,
2098 unsigned int index)
2099 {
2100 hash_map <congruence_class *, bitmap> split_map;
2101
2102 for (unsigned int i = 0; i < cls->members.length (); i++)
2103 {
2104 sem_item *item = cls->members[i];
2105
2106 /* Iterate all usages that have INDEX as usage of the item. */
2107 for (unsigned int j = 0; j < item->usages.length (); j++)
2108 {
2109 sem_usage_pair *usage = item->usages[j];
2110
2111 if (usage->index != index)
2112 continue;
2113
2114 bitmap *slot = split_map.get (usage->item->cls);
2115 bitmap b;
2116
2117 if(!slot)
2118 {
2119 b = BITMAP_ALLOC (&m_bmstack);
2120 split_map.put (usage->item->cls, b);
2121 }
2122 else
2123 b = *slot;
2124
2125 #if ENABLE_CHECKING
2126 gcc_checking_assert (usage->item->cls);
2127 gcc_checking_assert (usage->item->index_in_class <
2128 usage->item->cls->members.length ());
2129 #endif
2130
2131 bitmap_set_bit (b, usage->item->index_in_class);
2132 }
2133 }
2134
2135 traverse_split_pair pair;
2136 pair.optimizer = this;
2137 pair.cls = cls;
2138
2139 splitter_class_removed = false;
2140 split_map.traverse
2141 <traverse_split_pair *, sem_item_optimizer::traverse_congruence_split> (&pair);
2142
2143 /* Bitmap clean-up. */
2144 split_map.traverse
2145 <traverse_split_pair *, sem_item_optimizer::release_split_map> (NULL);
2146 }
2147
2148 /* Every usage of a congruence class CLS is a candidate that can split the
2149 collection of classes. Bitmap stack BMSTACK is used for bitmap
2150 allocation. */
2151
2152 void
2153 sem_item_optimizer::do_congruence_step (congruence_class *cls)
2154 {
2155 bitmap_iterator bi;
2156 unsigned int i;
2157
2158 bitmap usage = BITMAP_ALLOC (&m_bmstack);
2159
2160 for (unsigned int i = 0; i < cls->members.length (); i++)
2161 bitmap_ior_into (usage, cls->members[i]->usage_index_bitmap);
2162
2163 EXECUTE_IF_SET_IN_BITMAP (usage, 0, i, bi)
2164 {
2165 if (dump_file && (dump_flags & TDF_DETAILS))
2166 fprintf (dump_file, " processing congruece step for class: %u, index: %u\n",
2167 cls->id, i);
2168
2169 do_congruence_step_for_index (cls, i);
2170
2171 if (splitter_class_removed)
2172 break;
2173 }
2174
2175 BITMAP_FREE (usage);
2176 }
2177
2178 /* Adds a newly created congruence class CLS to worklist. */
2179
2180 void
2181 sem_item_optimizer::worklist_push (congruence_class *cls)
2182 {
2183 /* Return if the class CLS is already presented in work list. */
2184 if (cls->in_worklist)
2185 return;
2186
2187 cls->in_worklist = true;
2188 worklist.push_back (cls);
2189 }
2190
2191 /* Pops a class from worklist. */
2192
2193 congruence_class *
2194 sem_item_optimizer::worklist_pop (void)
2195 {
2196 congruence_class *cls;
2197
2198 while (!worklist.empty ())
2199 {
2200 cls = worklist.front ();
2201 worklist.pop_front ();
2202 if (cls->in_worklist)
2203 {
2204 cls->in_worklist = false;
2205
2206 return cls;
2207 }
2208 else
2209 {
2210 /* Work list item was already intended to be removed.
2211 The only reason for doing it is to split a class.
2212 Thus, the class CLS is deleted. */
2213 delete cls;
2214 }
2215 }
2216
2217 return NULL;
2218 }
2219
2220 /* Iterative congruence reduction function. */
2221
2222 void
2223 sem_item_optimizer::process_cong_reduction (void)
2224 {
2225 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
2226 it != m_classes.end (); ++it)
2227 for (unsigned i = 0; i < (*it)->classes.length (); i++)
2228 if ((*it)->classes[i]->is_class_used ())
2229 worklist_push ((*it)->classes[i]);
2230
2231 if (dump_file)
2232 fprintf (dump_file, "Worklist has been filled with: %lu\n",
2233 (unsigned long) worklist.size ());
2234
2235 if (dump_file && (dump_flags & TDF_DETAILS))
2236 fprintf (dump_file, "Congruence class reduction\n");
2237
2238 congruence_class *cls;
2239 while ((cls = worklist_pop ()) != NULL)
2240 do_congruence_step (cls);
2241 }
2242
2243 /* Debug function prints all informations about congruence classes. */
2244
2245 void
2246 sem_item_optimizer::dump_cong_classes (void)
2247 {
2248 if (!dump_file)
2249 return;
2250
2251 fprintf (dump_file,
2252 "Congruence classes: %u (unique hash values: %lu), with total: %u items\n",
2253 m_classes_count, (unsigned long) m_classes.elements(), m_items.length ());
2254
2255 /* Histogram calculation. */
2256 unsigned int max_index = 0;
2257 unsigned int* histogram = XCNEWVEC (unsigned int, m_items.length () + 1);
2258
2259 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
2260 it != m_classes.end (); ++it)
2261
2262 for (unsigned i = 0; i < (*it)->classes.length (); i++)
2263 {
2264 unsigned int c = (*it)->classes[i]->members.length ();
2265 histogram[c]++;
2266
2267 if (c > max_index)
2268 max_index = c;
2269 }
2270
2271 fprintf (dump_file,
2272 "Class size histogram [num of members]: number of classe number of classess\n");
2273
2274 for (unsigned int i = 0; i <= max_index; i++)
2275 if (histogram[i])
2276 fprintf (dump_file, "[%u]: %u classes\n", i, histogram[i]);
2277
2278 fprintf (dump_file, "\n\n");
2279
2280
2281 if (dump_flags & TDF_DETAILS)
2282 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
2283 it != m_classes.end (); ++it)
2284 {
2285 fprintf (dump_file, " group: with %u classes:\n", (*it)->classes.length ());
2286
2287 for (unsigned i = 0; i < (*it)->classes.length (); i++)
2288 {
2289 (*it)->classes[i]->dump (dump_file, 4);
2290
2291 if(i < (*it)->classes.length () - 1)
2292 fprintf (dump_file, " ");
2293 }
2294 }
2295
2296 free (histogram);
2297 }
2298
2299 /* After reduction is done, we can declare all items in a group
2300 to be equal. PREV_CLASS_COUNT is start number of classes
2301 before reduction. */
2302
2303 void
2304 sem_item_optimizer::merge_classes (unsigned int prev_class_count)
2305 {
2306 unsigned int item_count = m_items.length ();
2307 unsigned int class_count = m_classes_count;
2308 unsigned int equal_items = item_count - class_count;
2309
2310 unsigned int non_singular_classes_count = 0;
2311 unsigned int non_singular_classes_sum = 0;
2312
2313 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
2314 it != m_classes.end (); ++it)
2315 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
2316 {
2317 congruence_class *c = (*it)->classes[i];
2318 if (c->members.length () > 1)
2319 {
2320 non_singular_classes_count++;
2321 non_singular_classes_sum += c->members.length ();
2322 }
2323 }
2324
2325 if (dump_file)
2326 {
2327 fprintf (dump_file, "\nItem count: %u\n", item_count);
2328 fprintf (dump_file, "Congruent classes before: %u, after: %u\n",
2329 prev_class_count, class_count);
2330 fprintf (dump_file, "Average class size before: %.2f, after: %.2f\n",
2331 prev_class_count ? 1.0f * item_count / prev_class_count : 0.0f,
2332 class_count ? 1.0f * item_count / class_count : 0.0f);
2333 fprintf (dump_file, "Average non-singular class size: %.2f, count: %u\n",
2334 non_singular_classes_count ? 1.0f * non_singular_classes_sum /
2335 non_singular_classes_count : 0.0f,
2336 non_singular_classes_count);
2337 fprintf (dump_file, "Equal symbols: %u\n", equal_items);
2338 fprintf (dump_file, "Fraction of visited symbols: %.2f%%\n\n",
2339 item_count ? 100.0f * equal_items / item_count : 0.0f);
2340 }
2341
2342 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
2343 it != m_classes.end (); ++it)
2344 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
2345 {
2346 congruence_class *c = (*it)->classes[i];
2347
2348 if (c->members.length () == 1)
2349 continue;
2350
2351 gcc_assert (c->members.length ());
2352
2353 sem_item *source = c->members[0];
2354
2355 for (unsigned int j = 1; j < c->members.length (); j++)
2356 {
2357 sem_item *alias = c->members[j];
2358
2359 if (dump_file)
2360 {
2361 fprintf (dump_file, "Semantic equality hit:%s->%s\n",
2362 source->name (), alias->name ());
2363 fprintf (dump_file, "Assembler symbol names:%s->%s\n",
2364 source->asm_name (), alias->asm_name ());
2365 }
2366
2367 if (lookup_attribute ("no_icf", DECL_ATTRIBUTES (alias->decl)))
2368 {
2369 if (dump_file)
2370 fprintf (dump_file,
2371 "Merge operation is skipped due to no_icf "
2372 "attribute.\n\n");
2373
2374 continue;
2375 }
2376
2377 if (dump_file && (dump_flags & TDF_DETAILS))
2378 {
2379 source->dump_to_file (dump_file);
2380 alias->dump_to_file (dump_file);
2381 }
2382
2383 source->merge (alias);
2384 }
2385 }
2386 }
2387
2388 /* Dump function prints all class members to a FILE with an INDENT. */
2389
2390 void
2391 congruence_class::dump (FILE *file, unsigned int indent) const
2392 {
2393 FPRINTF_SPACES (file, indent, "class with id: %u, hash: %u, items: %u\n",
2394 id, members[0]->get_hash (), members.length ());
2395
2396 FPUTS_SPACES (file, indent + 2, "");
2397 for (unsigned i = 0; i < members.length (); i++)
2398 fprintf (file, "%s(%p/%u) ", members[i]->asm_name (), (void *) members[i]->decl,
2399 members[i]->node->order);
2400
2401 fprintf (file, "\n");
2402 }
2403
2404 /* Returns true if there's a member that is used from another group. */
2405
2406 bool
2407 congruence_class::is_class_used (void)
2408 {
2409 for (unsigned int i = 0; i < members.length (); i++)
2410 if (members[i]->usages.length ())
2411 return true;
2412
2413 return false;
2414 }
2415
2416 /* Initialization and computation of symtab node hash, there data
2417 are propagated later on. */
2418
2419 static sem_item_optimizer *optimizer = NULL;
2420
2421 /* Generate pass summary for IPA ICF pass. */
2422
2423 static void
2424 ipa_icf_generate_summary (void)
2425 {
2426 if (!optimizer)
2427 optimizer = new sem_item_optimizer ();
2428
2429 optimizer->parse_funcs_and_vars ();
2430 }
2431
2432 /* Write pass summary for IPA ICF pass. */
2433
2434 static void
2435 ipa_icf_write_summary (void)
2436 {
2437 gcc_assert (optimizer);
2438
2439 optimizer->write_summary ();
2440 }
2441
2442 /* Read pass summary for IPA ICF pass. */
2443
2444 static void
2445 ipa_icf_read_summary (void)
2446 {
2447 if (!optimizer)
2448 optimizer = new sem_item_optimizer ();
2449
2450 optimizer->read_summary ();
2451 optimizer->register_hooks ();
2452 }
2453
2454 /* Semantic equality exection function. */
2455
2456 static unsigned int
2457 ipa_icf_driver (void)
2458 {
2459 gcc_assert (optimizer);
2460
2461 optimizer->execute ();
2462 optimizer->unregister_hooks ();
2463
2464 delete optimizer;
2465 optimizer = NULL;
2466
2467 return 0;
2468 }
2469
2470 const pass_data pass_data_ipa_icf =
2471 {
2472 IPA_PASS, /* type */
2473 "icf", /* name */
2474 OPTGROUP_IPA, /* optinfo_flags */
2475 TV_IPA_ICF, /* tv_id */
2476 0, /* properties_required */
2477 0, /* properties_provided */
2478 0, /* properties_destroyed */
2479 0, /* todo_flags_start */
2480 0, /* todo_flags_finish */
2481 };
2482
2483 class pass_ipa_icf : public ipa_opt_pass_d
2484 {
2485 public:
2486 pass_ipa_icf (gcc::context *ctxt)
2487 : ipa_opt_pass_d (pass_data_ipa_icf, ctxt,
2488 ipa_icf_generate_summary, /* generate_summary */
2489 ipa_icf_write_summary, /* write_summary */
2490 ipa_icf_read_summary, /* read_summary */
2491 NULL, /*
2492 write_optimization_summary */
2493 NULL, /*
2494 read_optimization_summary */
2495 NULL, /* stmt_fixup */
2496 0, /* function_transform_todo_flags_start */
2497 NULL, /* function_transform */
2498 NULL) /* variable_transform */
2499 {}
2500
2501 /* opt_pass methods: */
2502 virtual bool gate (function *)
2503 {
2504 return in_lto_p || flag_ipa_icf_variables || flag_ipa_icf_functions;
2505 }
2506
2507 virtual unsigned int execute (function *)
2508 {
2509 return ipa_icf_driver();
2510 }
2511 }; // class pass_ipa_icf
2512
2513 } // ipa_icf namespace
2514
2515 ipa_opt_pass_d *
2516 make_pass_ipa_icf (gcc::context *ctxt)
2517 {
2518 return new ipa_icf::pass_ipa_icf (ctxt);
2519 }