IPA ICF, part 4/5
[official-gcc.git] / gcc / ipa-icf.c
blob4e73849f1b01a43f8fca5ac6091ac53fd3783949
1 /* Interprocedural Identical Code Folding pass
2 Copyright (C) 2014 Free Software Foundation, Inc.
4 Contributed by Jan Hubicka <hubicka@ucw.cz> and Martin Liska <mliska@suse.cz>
6 This file is part of GCC.
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.
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.
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/>. */
22 /* Interprocedural Identical Code Folding for functions and
23 read-only variables.
25 The goal of this transformation is to discover functions and read-only
26 variables which do have exactly the same semantics.
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.
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.
54 #include "config.h"
55 #include "system.h"
56 #include "coretypes.h"
57 #include "tree.h"
58 #include "basic-block.h"
59 #include "tree-ssa-alias.h"
60 #include "internal-fn.h"
61 #include "gimple-expr.h"
62 #include "is-a.h"
63 #include "gimple.h"
64 #include "expr.h"
65 #include "gimple-iterator.h"
66 #include "gimple-ssa.h"
67 #include "tree-cfg.h"
68 #include "tree-phinodes.h"
69 #include "stringpool.h"
70 #include "tree-ssanames.h"
71 #include "tree-dfa.h"
72 #include "tree-pass.h"
73 #include "gimple-pretty-print.h"
74 #include "ipa-inline.h"
75 #include "cfgloop.h"
76 #include "except.h"
77 #include "hash-table.h"
78 #include "coverage.h"
79 #include "attribs.h"
80 #include "print-tree.h"
81 #include "lto-streamer.h"
82 #include "data-streamer.h"
83 #include "ipa-utils.h"
84 #include <list>
85 #include "ipa-icf-gimple.h"
86 #include "ipa-icf.h"
88 using namespace ipa_icf_gimple;
90 namespace ipa_icf {
91 /* Constructor for key value pair, where _ITEM is key and _INDEX is a target. */
93 sem_usage_pair::sem_usage_pair (sem_item *_item, unsigned int _index):
94 item (_item), index (_index)
98 /* Semantic item constructor for a node of _TYPE, where STACK is used
99 for bitmap memory allocation. */
101 sem_item::sem_item (sem_item_type _type,
102 bitmap_obstack *stack): type(_type), hash(0)
104 setup (stack);
107 /* Semantic item constructor for a node of _TYPE, where STACK is used
108 for bitmap memory allocation. The item is based on symtab node _NODE
109 with computed _HASH. */
111 sem_item::sem_item (sem_item_type _type, symtab_node *_node,
112 hashval_t _hash, bitmap_obstack *stack): type(_type),
113 node (_node), hash (_hash)
115 decl = node->decl;
116 setup (stack);
119 /* Add reference to a semantic TARGET. */
121 void
122 sem_item::add_reference (sem_item *target)
124 refs.safe_push (target);
125 unsigned index = refs.length ();
126 target->usages.safe_push (new sem_usage_pair(this, index));
127 bitmap_set_bit (target->usage_index_bitmap, index);
128 refs_set.add (target->node);
131 /* Initialize internal data structures. Bitmap STACK is used for
132 bitmap memory allocation process. */
134 void
135 sem_item::setup (bitmap_obstack *stack)
137 gcc_checking_assert (node);
139 refs.create (0);
140 tree_refs.create (0);
141 usages.create (0);
142 usage_index_bitmap = BITMAP_ALLOC (stack);
145 sem_item::~sem_item ()
147 for (unsigned i = 0; i < usages.length (); i++)
148 delete usages[i];
150 refs.release ();
151 tree_refs.release ();
152 usages.release ();
154 BITMAP_FREE (usage_index_bitmap);
157 /* Dump function for debugging purpose. */
159 DEBUG_FUNCTION void
160 sem_item::dump (void)
162 if (dump_file)
164 fprintf (dump_file, "[%s] %s (%u) (tree:%p)\n", type == FUNC ? "func" : "var",
165 name(), node->order, (void *) node->decl);
166 fprintf (dump_file, " hash: %u\n", get_hash ());
167 fprintf (dump_file, " references: ");
169 for (unsigned i = 0; i < refs.length (); i++)
170 fprintf (dump_file, "%s%s ", refs[i]->name (),
171 i < refs.length() - 1 ? "," : "");
173 fprintf (dump_file, "\n");
177 /* Semantic function constructor that uses STACK as bitmap memory stack. */
179 sem_function::sem_function (bitmap_obstack *stack): sem_item (FUNC, stack),
180 m_checker (NULL), m_compared_func (NULL)
182 arg_types.create (0);
183 bb_sizes.create (0);
184 bb_sorted.create (0);
187 /* Constructor based on callgraph node _NODE with computed hash _HASH.
188 Bitmap STACK is used for memory allocation. */
189 sem_function::sem_function (cgraph_node *node, hashval_t hash,
190 bitmap_obstack *stack):
191 sem_item (FUNC, node, hash, stack),
192 m_checker (NULL), m_compared_func (NULL)
194 arg_types.create (0);
195 bb_sizes.create (0);
196 bb_sorted.create (0);
199 sem_function::~sem_function ()
201 for (unsigned i = 0; i < bb_sorted.length (); i++)
202 free (bb_sorted[i]);
204 arg_types.release ();
205 bb_sizes.release ();
206 bb_sorted.release ();
209 /* Calculates hash value based on a BASIC_BLOCK. */
211 hashval_t
212 sem_function::get_bb_hash (const sem_bb *basic_block)
214 inchash::hash hstate;
216 hstate.add_int (basic_block->nondbg_stmt_count);
217 hstate.add_int (basic_block->edge_count);
219 return hstate.end ();
222 /* References independent hash function. */
224 hashval_t
225 sem_function::get_hash (void)
227 if(!hash)
229 inchash::hash hstate;
230 hstate.add_int (177454); /* Random number for function type. */
232 hstate.add_int (arg_count);
233 hstate.add_int (cfg_checksum);
234 hstate.add_int (gcode_hash);
236 for (unsigned i = 0; i < bb_sorted.length (); i++)
237 hstate.merge_hash (get_bb_hash (bb_sorted[i]));
239 for (unsigned i = 0; i < bb_sizes.length (); i++)
240 hstate.add_int (bb_sizes[i]);
242 hash = hstate.end ();
245 return hash;
248 /* For a given symbol table nodes N1 and N2, we check that FUNCTION_DECLs
249 point to a same function. Comparison can be skipped if IGNORED_NODES
250 contains these nodes. */
252 bool
253 sem_function::compare_cgraph_references (hash_map <symtab_node *, sem_item *>
254 &ignored_nodes,
255 symtab_node *n1, symtab_node *n2)
257 if (n1 == n2 || (ignored_nodes.get (n1) && ignored_nodes.get (n2)))
258 return true;
260 /* TODO: add more precise comparison for weakrefs, etc. */
262 return return_false_with_msg ("different references");
265 /* If cgraph edges E1 and E2 are indirect calls, verify that
266 ECF flags are the same. */
268 bool sem_function::compare_edge_flags (cgraph_edge *e1, cgraph_edge *e2)
270 if (e1->indirect_info && e2->indirect_info)
272 int e1_flags = e1->indirect_info->ecf_flags;
273 int e2_flags = e2->indirect_info->ecf_flags;
275 if (e1_flags != e2_flags)
276 return return_false_with_msg ("ICF flags are different");
278 else if (e1->indirect_info || e2->indirect_info)
279 return false;
281 return true;
284 /* Fast equality function based on knowledge known in WPA. */
286 bool
287 sem_function::equals_wpa (sem_item *item,
288 hash_map <symtab_node *, sem_item *> &ignored_nodes)
290 gcc_assert (item->type == FUNC);
292 m_compared_func = static_cast<sem_function *> (item);
294 if (arg_types.length () != m_compared_func->arg_types.length ())
295 return return_false_with_msg ("different number of arguments");
297 /* Checking types of arguments. */
298 for (unsigned i = 0; i < arg_types.length (); i++)
300 /* This guard is here for function pointer with attributes (pr59927.c). */
301 if (!arg_types[i] || !m_compared_func->arg_types[i])
302 return return_false_with_msg ("NULL argument type");
304 /* Polymorphic comparison is executed just for non-leaf functions. */
305 bool is_not_leaf = get_node ()->callees != NULL;
307 if (!func_checker::compatible_types_p (arg_types[i],
308 m_compared_func->arg_types[i],
309 is_not_leaf, i == 0))
310 return return_false_with_msg ("argument type is different");
313 /* Result type checking. */
314 if (!func_checker::compatible_types_p (result_type,
315 m_compared_func->result_type))
316 return return_false_with_msg ("result types are different");
318 if (node->num_references () != item->node->num_references ())
319 return return_false_with_msg ("different number of references");
321 ipa_ref *ref = NULL, *ref2 = NULL;
322 for (unsigned i = 0; node->iterate_reference (i, ref); i++)
324 item->node->iterate_reference (i, ref2);
326 if (!compare_cgraph_references (ignored_nodes, ref->referred, ref2->referred))
327 return false;
330 cgraph_edge *e1 = dyn_cast <cgraph_node *> (node)->callees;
331 cgraph_edge *e2 = dyn_cast <cgraph_node *> (item->node)->callees;
333 while (e1 && e2)
335 if (!compare_cgraph_references (ignored_nodes, e1->callee, e2->callee))
336 return false;
338 e1 = e1->next_callee;
339 e2 = e2->next_callee;
342 if (e1 || e2)
343 return return_false_with_msg ("different number of edges");
345 return true;
348 /* Returns true if the item equals to ITEM given as argument. */
350 bool
351 sem_function::equals (sem_item *item,
352 hash_map <symtab_node *, sem_item *> &ignored_nodes)
354 gcc_assert (item->type == FUNC);
355 bool eq = equals_private (item, ignored_nodes);
357 if (m_checker != NULL)
359 delete m_checker;
360 m_checker = NULL;
363 if (dump_file && (dump_flags & TDF_DETAILS))
364 fprintf (dump_file,
365 "Equals called for:%s:%s (%u:%u) (%s:%s) with result: %s\n\n",
366 name(), item->name (), node->order, item->node->order, asm_name (),
367 item->asm_name (), eq ? "true" : "false");
369 return eq;
372 /* Processes function equality comparison. */
374 bool
375 sem_function::equals_private (sem_item *item,
376 hash_map <symtab_node *, sem_item *> &ignored_nodes)
378 if (item->type != FUNC)
379 return false;
381 basic_block bb1, bb2;
382 edge e1, e2;
383 edge_iterator ei1, ei2;
384 int *bb_dict = NULL;
385 bool result = true;
386 tree arg1, arg2;
388 m_compared_func = static_cast<sem_function *> (item);
390 gcc_assert (decl != item->decl);
392 if (bb_sorted.length () != m_compared_func->bb_sorted.length ()
393 || edge_count != m_compared_func->edge_count
394 || cfg_checksum != m_compared_func->cfg_checksum)
395 return return_false ();
397 if (!equals_wpa (item, ignored_nodes))
398 return false;
400 /* Checking function arguments. */
401 tree decl1 = DECL_ATTRIBUTES (decl);
402 tree decl2 = DECL_ATTRIBUTES (m_compared_func->decl);
404 m_checker = new func_checker (decl, m_compared_func->decl,
405 compare_polymorphic_p (),
406 false,
407 &refs_set,
408 &m_compared_func->refs_set);
409 while (decl1)
411 if (decl2 == NULL)
412 return return_false ();
414 if (get_attribute_name (decl1) != get_attribute_name (decl2))
415 return return_false ();
417 tree attr_value1 = TREE_VALUE (decl1);
418 tree attr_value2 = TREE_VALUE (decl2);
420 if (attr_value1 && attr_value2)
422 bool ret = m_checker->compare_operand (TREE_VALUE (attr_value1),
423 TREE_VALUE (attr_value2));
424 if (!ret)
425 return return_false_with_msg ("attribute values are different");
427 else if (!attr_value1 && !attr_value2)
429 else
430 return return_false ();
432 decl1 = TREE_CHAIN (decl1);
433 decl2 = TREE_CHAIN (decl2);
436 if (decl1 != decl2)
437 return return_false();
440 for (arg1 = DECL_ARGUMENTS (decl),
441 arg2 = DECL_ARGUMENTS (m_compared_func->decl);
442 arg1; arg1 = DECL_CHAIN (arg1), arg2 = DECL_CHAIN (arg2))
443 if (!m_checker->compare_decl (arg1, arg2))
444 return return_false ();
446 /* Fill-up label dictionary. */
447 for (unsigned i = 0; i < bb_sorted.length (); ++i)
449 m_checker->parse_labels (bb_sorted[i]);
450 m_checker->parse_labels (m_compared_func->bb_sorted[i]);
453 /* Checking all basic blocks. */
454 for (unsigned i = 0; i < bb_sorted.length (); ++i)
455 if(!m_checker->compare_bb (bb_sorted[i], m_compared_func->bb_sorted[i]))
456 return return_false();
458 dump_message ("All BBs are equal\n");
460 /* Basic block edges check. */
461 for (unsigned i = 0; i < bb_sorted.length (); ++i)
463 bb_dict = XNEWVEC (int, bb_sorted.length () + 2);
464 memset (bb_dict, -1, (bb_sorted.length () + 2) * sizeof (int));
466 bb1 = bb_sorted[i]->bb;
467 bb2 = m_compared_func->bb_sorted[i]->bb;
469 ei2 = ei_start (bb2->preds);
471 for (ei1 = ei_start (bb1->preds); ei_cond (ei1, &e1); ei_next (&ei1))
473 ei_cond (ei2, &e2);
475 if (e1->flags != e2->flags)
476 return return_false_with_msg ("flags comparison returns false");
478 if (!bb_dict_test (bb_dict, e1->src->index, e2->src->index))
479 return return_false_with_msg ("edge comparison returns false");
481 if (!bb_dict_test (bb_dict, e1->dest->index, e2->dest->index))
482 return return_false_with_msg ("BB comparison returns false");
484 if (!m_checker->compare_edge (e1, e2))
485 return return_false_with_msg ("edge comparison returns false");
487 ei_next (&ei2);
491 /* Basic block PHI nodes comparison. */
492 for (unsigned i = 0; i < bb_sorted.length (); i++)
493 if (!compare_phi_node (bb_sorted[i]->bb, m_compared_func->bb_sorted[i]->bb))
494 return return_false_with_msg ("PHI node comparison returns false");
496 return result;
499 /* Merges instance with an ALIAS_ITEM, where alias, thunk or redirection can
500 be applied. */
501 bool
502 sem_function::merge (sem_item *alias_item)
504 gcc_assert (alias_item->type == FUNC);
506 sem_function *alias_func = static_cast<sem_function *> (alias_item);
508 cgraph_node *original = get_node ();
509 cgraph_node *local_original = original;
510 cgraph_node *alias = alias_func->get_node ();
511 bool original_address_matters;
512 bool alias_address_matters;
514 bool create_thunk = false;
515 bool create_alias = false;
516 bool redirect_callers = false;
517 bool original_discardable = false;
519 /* Do not attempt to mix functions from different user sections;
520 we do not know what user intends with those. */
521 if (((DECL_SECTION_NAME (original->decl) && !original->implicit_section)
522 || (DECL_SECTION_NAME (alias->decl) && !alias->implicit_section))
523 && DECL_SECTION_NAME (original->decl) != DECL_SECTION_NAME (alias->decl))
525 if (dump_file)
526 fprintf (dump_file,
527 "Not unifying; original and alias are in different sections.\n\n");
528 return false;
531 /* See if original is in a section that can be discarded if the main
532 symbol is not used. */
533 if (DECL_EXTERNAL (original->decl))
534 original_discardable = true;
535 if (original->resolution == LDPR_PREEMPTED_REG
536 || original->resolution == LDPR_PREEMPTED_IR)
537 original_discardable = true;
538 if (original->can_be_discarded_p ())
539 original_discardable = true;
541 /* See if original and/or alias address can be compared for equality. */
542 original_address_matters
543 = (!DECL_VIRTUAL_P (original->decl)
544 && (original->externally_visible
545 || original->address_taken_from_non_vtable_p ()));
546 alias_address_matters
547 = (!DECL_VIRTUAL_P (alias->decl)
548 && (alias->externally_visible
549 || alias->address_taken_from_non_vtable_p ()));
551 /* If alias and original can be compared for address equality, we need
552 to create a thunk. Also we can not create extra aliases into discardable
553 section (or we risk link failures when section is discarded). */
554 if ((original_address_matters
555 && alias_address_matters)
556 || original_discardable)
558 create_thunk = !stdarg_p (TREE_TYPE (alias->decl));
559 create_alias = false;
560 /* When both alias and original are not overwritable, we can save
561 the extra thunk wrapper for direct calls. */
562 redirect_callers
563 = (!original_discardable
564 && alias->get_availability () > AVAIL_INTERPOSABLE
565 && original->get_availability () > AVAIL_INTERPOSABLE);
567 else
569 create_alias = true;
570 create_thunk = false;
571 redirect_callers = false;
574 if (create_alias && DECL_COMDAT_GROUP (alias->decl))
576 create_alias = false;
577 create_thunk = true;
580 /* We want thunk to always jump to the local function body
581 unless the body is comdat and may be optimized out. */
582 if ((create_thunk || redirect_callers)
583 && (!original_discardable
584 || (DECL_COMDAT_GROUP (original->decl)
585 && (DECL_COMDAT_GROUP (original->decl)
586 == DECL_COMDAT_GROUP (alias->decl)))))
587 local_original
588 = dyn_cast <cgraph_node *> (original->noninterposable_alias ());
590 if (redirect_callers)
592 /* If alias is non-overwritable then
593 all direct calls are safe to be redirected to the original. */
594 bool redirected = false;
595 while (alias->callers)
597 cgraph_edge *e = alias->callers;
598 e->redirect_callee (local_original);
599 push_cfun (DECL_STRUCT_FUNCTION (e->caller->decl));
601 if (e->call_stmt)
602 e->redirect_call_stmt_to_callee ();
604 pop_cfun ();
605 redirected = true;
608 alias->icf_merged = true;
610 /* The alias function is removed if symbol address
611 does not matter. */
612 if (!alias_address_matters)
613 alias->remove ();
615 if (dump_file && redirected)
616 fprintf (dump_file, "Callgraph local calls have been redirected.\n\n");
618 /* If the condtion above is not met, we are lucky and can turn the
619 function into real alias. */
620 else if (create_alias)
622 alias->icf_merged = true;
624 /* Remove the function's body. */
625 ipa_merge_profiles (original, alias);
626 alias->release_body (true);
627 alias->reset ();
629 /* Create the alias. */
630 cgraph_node::create_alias (alias_func->decl, decl);
631 alias->resolve_alias (original);
633 if (dump_file)
634 fprintf (dump_file, "Callgraph alias has been created.\n\n");
636 else if (create_thunk)
638 if (DECL_COMDAT_GROUP (alias->decl))
640 if (dump_file)
641 fprintf (dump_file, "Callgraph thunk cannot be created because of COMDAT\n");
643 return 0;
646 alias->icf_merged = true;
647 ipa_merge_profiles (local_original, alias);
648 alias->create_wrapper (local_original);
650 if (dump_file)
651 fprintf (dump_file, "Callgraph thunk has been created.\n\n");
653 else if (dump_file)
654 fprintf (dump_file, "Callgraph merge operation cannot be performed.\n\n");
656 return true;
659 /* Semantic item initialization function. */
661 void
662 sem_function::init (void)
664 if (in_lto_p)
665 get_node ()->get_body ();
667 tree fndecl = node->decl;
668 function *func = DECL_STRUCT_FUNCTION (fndecl);
670 gcc_assert (func);
671 gcc_assert (SSANAMES (func));
673 ssa_names_size = SSANAMES (func)->length ();
674 node = node;
676 decl = fndecl;
677 region_tree = func->eh->region_tree;
679 /* iterating all function arguments. */
680 arg_count = count_formal_params (fndecl);
682 edge_count = n_edges_for_fn (func);
683 cfg_checksum = coverage_compute_cfg_checksum (func);
685 inchash::hash hstate;
687 basic_block bb;
688 FOR_EACH_BB_FN (bb, func)
690 unsigned nondbg_stmt_count = 0;
692 edge e;
693 for (edge_iterator ei = ei_start (bb->preds); ei_cond (ei, &e); ei_next (&ei))
694 cfg_checksum = iterative_hash_host_wide_int (e->flags,
695 cfg_checksum);
697 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
698 gsi_next (&gsi))
700 gimple stmt = gsi_stmt (gsi);
702 if (gimple_code (stmt) != GIMPLE_DEBUG)
704 hash_stmt (&hstate, stmt);
705 nondbg_stmt_count++;
709 gcode_hash = hstate.end ();
710 bb_sizes.safe_push (nondbg_stmt_count);
712 /* Inserting basic block to hash table. */
713 sem_bb *semantic_bb = new sem_bb (bb, nondbg_stmt_count,
714 EDGE_COUNT (bb->preds) + EDGE_COUNT (bb->succs));
716 bb_sorted.safe_push (semantic_bb);
719 parse_tree_args ();
722 /* Improve accumulated hash for HSTATE based on a gimple statement STMT. */
724 void
725 sem_function::hash_stmt (inchash::hash *hstate, gimple stmt)
727 enum gimple_code code = gimple_code (stmt);
729 hstate->add_int (code);
731 if (code == GIMPLE_CALL)
733 /* Checking of argument. */
734 for (unsigned i = 0; i < gimple_call_num_args (stmt); ++i)
736 tree argument = gimple_call_arg (stmt, i);
738 switch (TREE_CODE (argument))
740 case INTEGER_CST:
741 if (tree_fits_shwi_p (argument))
742 hstate->add_wide_int (tree_to_shwi (argument));
743 else if (tree_fits_uhwi_p (argument))
744 hstate->add_wide_int (tree_to_uhwi (argument));
745 break;
746 case REAL_CST:
747 REAL_VALUE_TYPE c;
748 HOST_WIDE_INT n;
750 c = TREE_REAL_CST (argument);
751 n = real_to_integer (&c);
753 hstate->add_wide_int (n);
754 break;
755 case ADDR_EXPR:
757 tree addr_operand = TREE_OPERAND (argument, 0);
759 if (TREE_CODE (addr_operand) == STRING_CST)
760 hstate->add (TREE_STRING_POINTER (addr_operand),
761 TREE_STRING_LENGTH (addr_operand));
762 break;
764 default:
765 break;
772 /* Return true if polymorphic comparison must be processed. */
774 bool
775 sem_function::compare_polymorphic_p (void)
777 return get_node ()->callees != NULL
778 || m_compared_func->get_node ()->callees != NULL;
781 /* For a given call graph NODE, the function constructs new
782 semantic function item. */
784 sem_function *
785 sem_function::parse (cgraph_node *node, bitmap_obstack *stack)
787 tree fndecl = node->decl;
788 function *func = DECL_STRUCT_FUNCTION (fndecl);
790 /* TODO: add support for thunks and aliases. */
792 if (!func || !node->has_gimple_body_p ())
793 return NULL;
795 if (lookup_attribute_by_prefix ("omp ", DECL_ATTRIBUTES (node->decl)) != NULL)
796 return NULL;
798 sem_function *f = new sem_function (node, 0, stack);
800 f->init ();
802 return f;
805 /* Parses function arguments and result type. */
807 void
808 sem_function::parse_tree_args (void)
810 tree result;
812 if (arg_types.exists ())
813 arg_types.release ();
815 arg_types.create (4);
816 tree fnargs = DECL_ARGUMENTS (decl);
818 for (tree parm = fnargs; parm; parm = DECL_CHAIN (parm))
819 arg_types.safe_push (DECL_ARG_TYPE (parm));
821 /* Function result type. */
822 result = DECL_RESULT (decl);
823 result_type = result ? TREE_TYPE (result) : NULL;
825 /* During WPA, we can get arguments by following method. */
826 if (!fnargs)
828 tree type = TYPE_ARG_TYPES (TREE_TYPE (decl));
829 for (tree parm = type; parm; parm = TREE_CHAIN (parm))
830 arg_types.safe_push (TYPE_CANONICAL (TREE_VALUE (parm)));
832 result_type = TREE_TYPE (TREE_TYPE (decl));
836 /* For given basic blocks BB1 and BB2 (from functions FUNC1 and FUNC),
837 return true if phi nodes are semantically equivalent in these blocks . */
839 bool
840 sem_function::compare_phi_node (basic_block bb1, basic_block bb2)
842 gimple_stmt_iterator si1, si2;
843 gimple phi1, phi2;
844 unsigned size1, size2, i;
845 tree t1, t2;
846 edge e1, e2;
848 gcc_assert (bb1 != NULL);
849 gcc_assert (bb2 != NULL);
851 si2 = gsi_start_phis (bb2);
852 for (si1 = gsi_start_phis (bb1); !gsi_end_p (si1);
853 gsi_next (&si1))
855 gsi_next_nonvirtual_phi (&si1);
856 gsi_next_nonvirtual_phi (&si2);
858 if (gsi_end_p (si1) && gsi_end_p (si2))
859 break;
861 if (gsi_end_p (si1) || gsi_end_p (si2))
862 return return_false();
864 phi1 = gsi_stmt (si1);
865 phi2 = gsi_stmt (si2);
867 size1 = gimple_phi_num_args (phi1);
868 size2 = gimple_phi_num_args (phi2);
870 if (size1 != size2)
871 return return_false ();
873 for (i = 0; i < size1; ++i)
875 t1 = gimple_phi_arg (phi1, i)->def;
876 t2 = gimple_phi_arg (phi2, i)->def;
878 if (!m_checker->compare_operand (t1, t2))
879 return return_false ();
881 e1 = gimple_phi_arg_edge (phi1, i);
882 e2 = gimple_phi_arg_edge (phi2, i);
884 if (!m_checker->compare_edge (e1, e2))
885 return return_false ();
888 gsi_next (&si2);
891 return true;
894 /* Returns true if tree T can be compared as a handled component. */
896 bool
897 sem_function::icf_handled_component_p (tree t)
899 tree_code tc = TREE_CODE (t);
901 return ((handled_component_p (t))
902 || tc == ADDR_EXPR || tc == MEM_REF || tc == REALPART_EXPR
903 || tc == IMAGPART_EXPR || tc == OBJ_TYPE_REF);
906 /* Basic blocks dictionary BB_DICT returns true if SOURCE index BB
907 corresponds to TARGET. */
909 bool
910 sem_function::bb_dict_test (int* bb_dict, int source, int target)
912 if (bb_dict[source] == -1)
914 bb_dict[source] = target;
915 return true;
917 else
918 return bb_dict[source] == target;
921 /* Iterates all tree types in T1 and T2 and returns true if all types
922 are compatible. If COMPARE_POLYMORPHIC is set to true,
923 more strict comparison is executed. */
925 bool
926 sem_function::compare_type_list (tree t1, tree t2, bool compare_polymorphic)
928 tree tv1, tv2;
929 tree_code tc1, tc2;
931 if (!t1 && !t2)
932 return true;
934 while (t1 != NULL && t2 != NULL)
936 tv1 = TREE_VALUE (t1);
937 tv2 = TREE_VALUE (t2);
939 tc1 = TREE_CODE (tv1);
940 tc2 = TREE_CODE (tv2);
942 if (tc1 == NOP_EXPR && tc2 == NOP_EXPR)
944 else if (tc1 == NOP_EXPR || tc2 == NOP_EXPR)
945 return false;
946 else if (!func_checker::compatible_types_p (tv1, tv2, compare_polymorphic))
947 return false;
949 t1 = TREE_CHAIN (t1);
950 t2 = TREE_CHAIN (t2);
953 return !(t1 || t2);
957 /* Semantic variable constructor that uses STACK as bitmap memory stack. */
959 sem_variable::sem_variable (bitmap_obstack *stack): sem_item (VAR, stack)
963 /* Constructor based on varpool node _NODE with computed hash _HASH.
964 Bitmap STACK is used for memory allocation. */
966 sem_variable::sem_variable (varpool_node *node, hashval_t _hash,
967 bitmap_obstack *stack): sem_item(VAR,
968 node, _hash, stack)
970 gcc_checking_assert (node);
971 gcc_checking_assert (get_node ());
974 /* Returns true if the item equals to ITEM given as argument. */
976 bool
977 sem_variable::equals (sem_item *item,
978 hash_map <symtab_node *, sem_item *> & ARG_UNUSED (ignored_nodes))
980 gcc_assert (item->type == VAR);
982 sem_variable *v = static_cast<sem_variable *>(item);
984 if (!ctor || !v->ctor)
985 return return_false_with_msg ("ctor is missing for semantic variable");
987 return sem_variable::equals (ctor, v->ctor);
990 /* Compares trees T1 and T2 for semantic equality. */
992 bool
993 sem_variable::equals (tree t1, tree t2)
995 tree_code tc1 = TREE_CODE (t1);
996 tree_code tc2 = TREE_CODE (t2);
998 if (tc1 != tc2)
999 return false;
1001 switch (tc1)
1003 case CONSTRUCTOR:
1005 unsigned len1 = vec_safe_length (CONSTRUCTOR_ELTS (t1));
1006 unsigned len2 = vec_safe_length (CONSTRUCTOR_ELTS (t2));
1008 if (len1 != len2)
1009 return false;
1011 for (unsigned i = 0; i < len1; i++)
1012 if (!sem_variable::equals (CONSTRUCTOR_ELT (t1, i)->value,
1013 CONSTRUCTOR_ELT (t2, i)->value)
1014 || CONSTRUCTOR_ELT (t1, i)->index != CONSTRUCTOR_ELT (t2, i)->index)
1015 return false;
1017 return true;
1019 case MEM_REF:
1021 tree x1 = TREE_OPERAND (t1, 0);
1022 tree x2 = TREE_OPERAND (t2, 0);
1023 tree y1 = TREE_OPERAND (t1, 1);
1024 tree y2 = TREE_OPERAND (t2, 1);
1026 if (!func_checker::compatible_types_p (TREE_TYPE (x1), TREE_TYPE (x2),
1027 true))
1028 return return_false ();
1030 /* Type of the offset on MEM_REF does not matter. */
1031 return sem_variable::equals (x1, x2)
1032 && wi::to_offset (y1) == wi::to_offset (y2);
1034 case NOP_EXPR:
1035 case ADDR_EXPR:
1037 tree op1 = TREE_OPERAND (t1, 0);
1038 tree op2 = TREE_OPERAND (t2, 0);
1039 return sem_variable::equals (op1, op2);
1041 case FUNCTION_DECL:
1042 case VAR_DECL:
1043 case FIELD_DECL:
1044 case LABEL_DECL:
1045 return t1 == t2;
1046 case INTEGER_CST:
1047 return func_checker::compatible_types_p (TREE_TYPE (t1), TREE_TYPE (t2),
1048 true)
1049 && wi::to_offset (t1) == wi::to_offset (t2);
1050 case STRING_CST:
1051 case REAL_CST:
1052 case COMPLEX_CST:
1053 return operand_equal_p (t1, t2, OEP_ONLY_CONST);
1054 case COMPONENT_REF:
1055 case ARRAY_REF:
1056 case POINTER_PLUS_EXPR:
1058 tree x1 = TREE_OPERAND (t1, 0);
1059 tree x2 = TREE_OPERAND (t2, 0);
1060 tree y1 = TREE_OPERAND (t1, 1);
1061 tree y2 = TREE_OPERAND (t2, 1);
1063 return sem_variable::equals (x1, x2) && sem_variable::equals (y1, y2);
1065 case ERROR_MARK:
1066 return return_false_with_msg ("ERROR_MARK");
1067 default:
1068 return return_false_with_msg ("Unknown TREE code reached");
1072 /* Parser function that visits a varpool NODE. */
1074 sem_variable *
1075 sem_variable::parse (varpool_node *node, bitmap_obstack *stack)
1077 tree decl = node->decl;
1079 bool readonly = TYPE_P (decl) ? TYPE_READONLY (decl) : TREE_READONLY (decl);
1080 bool can_handle = readonly && (DECL_VIRTUAL_P (decl)
1081 || !TREE_ADDRESSABLE (decl));
1083 if (!can_handle)
1084 return NULL;
1086 tree ctor = ctor_for_folding (decl);
1087 if (!ctor)
1088 return NULL;
1090 sem_variable *v = new sem_variable (node, 0, stack);
1092 v->init ();
1094 return v;
1097 /* References independent hash function. */
1099 hashval_t
1100 sem_variable::get_hash (void)
1102 if (hash)
1103 return hash;
1105 inchash::hash hstate;
1107 hstate.add_int (456346417);
1108 hstate.add_int (TREE_CODE (ctor));
1110 if (TREE_CODE (ctor) == CONSTRUCTOR)
1112 unsigned length = vec_safe_length (CONSTRUCTOR_ELTS (ctor));
1113 hstate.add_int (length);
1116 hash = hstate.end ();
1118 return hash;
1121 /* Merges instance with an ALIAS_ITEM, where alias, thunk or redirection can
1122 be applied. */
1124 bool
1125 sem_variable::merge (sem_item *alias_item)
1127 gcc_assert (alias_item->type == VAR);
1129 sem_variable *alias_var = static_cast<sem_variable *> (alias_item);
1131 varpool_node *original = get_node ();
1132 varpool_node *alias = alias_var->get_node ();
1133 bool original_discardable = false;
1135 /* See if original is in a section that can be discarded if the main
1136 symbol is not used. */
1137 if (DECL_EXTERNAL (original->decl))
1138 original_discardable = true;
1139 if (original->resolution == LDPR_PREEMPTED_REG
1140 || original->resolution == LDPR_PREEMPTED_IR)
1141 original_discardable = true;
1142 if (original->can_be_discarded_p ())
1143 original_discardable = true;
1145 gcc_assert (!TREE_ASM_WRITTEN (alias->decl));
1147 if (original_discardable || DECL_EXTERNAL (alias_var->decl) ||
1148 !compare_sections (alias_var))
1150 if (dump_file)
1151 fprintf (dump_file, "Varpool alias cannot be created\n\n");
1153 return false;
1155 else
1157 // alias cycle creation check
1158 varpool_node *n = original;
1160 while (n->alias)
1162 n = n->get_alias_target ();
1163 if (n == alias)
1165 if (dump_file)
1166 fprintf (dump_file, "Varpool alias cannot be created (alias cycle).\n\n");
1168 return false;
1172 alias->analyzed = false;
1174 DECL_INITIAL (alias->decl) = NULL;
1175 alias->remove_all_references ();
1177 varpool_node::create_alias (alias_var->decl, decl);
1178 alias->resolve_alias (original);
1180 if (dump_file)
1181 fprintf (dump_file, "Varpool alias has been created.\n\n");
1183 return true;
1187 bool
1188 sem_variable::compare_sections (sem_variable *alias)
1190 const char *source = node->get_section ();
1191 const char *target = alias->node->get_section();
1193 if (source == NULL && target == NULL)
1194 return true;
1195 else if(!source || !target)
1196 return false;
1197 else
1198 return strcmp (source, target) == 0;
1201 /* Dump symbol to FILE. */
1203 void
1204 sem_variable::dump_to_file (FILE *file)
1206 gcc_assert (file);
1208 print_node (file, "", decl, 0);
1209 fprintf (file, "\n\n");
1212 /* Iterates though a constructor and identifies tree references
1213 we are interested in semantic function equality. */
1215 void
1216 sem_variable::parse_tree_refs (tree t)
1218 switch (TREE_CODE (t))
1220 case CONSTRUCTOR:
1222 unsigned length = vec_safe_length (CONSTRUCTOR_ELTS (t));
1224 for (unsigned i = 0; i < length; i++)
1225 parse_tree_refs(CONSTRUCTOR_ELT (t, i)->value);
1227 break;
1229 case NOP_EXPR:
1230 case ADDR_EXPR:
1232 tree op = TREE_OPERAND (t, 0);
1233 parse_tree_refs (op);
1234 break;
1236 case FUNCTION_DECL:
1238 tree_refs.safe_push (t);
1239 break;
1241 default:
1242 break;
1246 unsigned int sem_item_optimizer::class_id = 0;
1248 sem_item_optimizer::sem_item_optimizer (): worklist (0), m_classes (0),
1249 m_classes_count (0), m_cgraph_node_hooks (NULL), m_varpool_node_hooks (NULL)
1251 m_items.create (0);
1252 bitmap_obstack_initialize (&m_bmstack);
1255 sem_item_optimizer::~sem_item_optimizer ()
1257 for (unsigned int i = 0; i < m_items.length (); i++)
1258 delete m_items[i];
1260 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
1261 it != m_classes.end (); ++it)
1263 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
1264 delete (*it)->classes[i];
1266 (*it)->classes.release ();
1269 m_items.release ();
1271 bitmap_obstack_release (&m_bmstack);
1274 /* Write IPA ICF summary for symbols. */
1276 void
1277 sem_item_optimizer::write_summary (void)
1279 unsigned int count = 0;
1281 output_block *ob = create_output_block (LTO_section_ipa_icf);
1282 lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
1283 ob->symbol = NULL;
1285 /* Calculate number of symbols to be serialized. */
1286 for (lto_symtab_encoder_iterator lsei = lsei_start_in_partition (encoder);
1287 !lsei_end_p (lsei);
1288 lsei_next_in_partition (&lsei))
1290 symtab_node *node = lsei_node (lsei);
1292 if (m_symtab_node_map.get (node))
1293 count++;
1296 streamer_write_uhwi (ob, count);
1298 /* Process all of the symbols. */
1299 for (lto_symtab_encoder_iterator lsei = lsei_start_in_partition (encoder);
1300 !lsei_end_p (lsei);
1301 lsei_next_in_partition (&lsei))
1303 symtab_node *node = lsei_node (lsei);
1305 sem_item **item = m_symtab_node_map.get (node);
1307 if (item && *item)
1309 int node_ref = lto_symtab_encoder_encode (encoder, node);
1310 streamer_write_uhwi_stream (ob->main_stream, node_ref);
1312 streamer_write_uhwi (ob, (*item)->get_hash ());
1316 streamer_write_char_stream (ob->main_stream, 0);
1317 produce_asm (ob, NULL);
1318 destroy_output_block (ob);
1321 /* Reads a section from LTO stream file FILE_DATA. Input block for DATA
1322 contains LEN bytes. */
1324 void
1325 sem_item_optimizer::read_section (lto_file_decl_data *file_data,
1326 const char *data, size_t len)
1328 const lto_function_header *header =
1329 (const lto_function_header *) data;
1330 const int cfg_offset = sizeof (lto_function_header);
1331 const int main_offset = cfg_offset + header->cfg_size;
1332 const int string_offset = main_offset + header->main_size;
1333 data_in *data_in;
1334 unsigned int i;
1335 unsigned int count;
1337 lto_input_block ib_main ((const char *) data + main_offset, 0,
1338 header->main_size);
1340 data_in =
1341 lto_data_in_create (file_data, (const char *) data + string_offset,
1342 header->string_size, vNULL);
1344 count = streamer_read_uhwi (&ib_main);
1346 for (i = 0; i < count; i++)
1348 unsigned int index;
1349 symtab_node *node;
1350 lto_symtab_encoder_t encoder;
1352 index = streamer_read_uhwi (&ib_main);
1353 encoder = file_data->symtab_node_encoder;
1354 node = lto_symtab_encoder_deref (encoder, index);
1356 hashval_t hash = streamer_read_uhwi (&ib_main);
1358 gcc_assert (node->definition);
1360 if (dump_file)
1361 fprintf (dump_file, "Symbol added:%s (tree: %p, uid:%u)\n", node->asm_name (),
1362 (void *) node->decl, node->order);
1364 if (is_a<cgraph_node *> (node))
1366 cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
1368 m_items.safe_push (new sem_function (cnode, hash, &m_bmstack));
1370 else
1372 varpool_node *vnode = dyn_cast <varpool_node *> (node);
1374 m_items.safe_push (new sem_variable (vnode, hash, &m_bmstack));
1378 lto_free_section_data (file_data, LTO_section_ipa_icf, NULL, data,
1379 len);
1380 lto_data_in_delete (data_in);
1383 /* Read IPA IPA ICF summary for symbols. */
1385 void
1386 sem_item_optimizer::read_summary (void)
1388 lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
1389 lto_file_decl_data *file_data;
1390 unsigned int j = 0;
1392 while ((file_data = file_data_vec[j++]))
1394 size_t len;
1395 const char *data = lto_get_section_data (file_data,
1396 LTO_section_ipa_icf, NULL, &len);
1398 if (data)
1399 read_section (file_data, data, len);
1403 /* Register callgraph and varpool hooks. */
1405 void
1406 sem_item_optimizer::register_hooks (void)
1408 m_cgraph_node_hooks = symtab->add_cgraph_removal_hook
1409 (&sem_item_optimizer::cgraph_removal_hook, this);
1411 m_varpool_node_hooks = symtab->add_varpool_removal_hook
1412 (&sem_item_optimizer::varpool_removal_hook, this);
1415 /* Unregister callgraph and varpool hooks. */
1417 void
1418 sem_item_optimizer::unregister_hooks (void)
1420 if (m_cgraph_node_hooks)
1421 symtab->remove_cgraph_removal_hook (m_cgraph_node_hooks);
1423 if (m_varpool_node_hooks)
1424 symtab->remove_varpool_removal_hook (m_varpool_node_hooks);
1427 /* Adds a CLS to hashtable associated by hash value. */
1429 void
1430 sem_item_optimizer::add_class (congruence_class *cls)
1432 gcc_assert (cls->members.length ());
1434 congruence_class_group *group = get_group_by_hash (
1435 cls->members[0]->get_hash (),
1436 cls->members[0]->type);
1437 group->classes.safe_push (cls);
1440 /* Gets a congruence class group based on given HASH value and TYPE. */
1442 congruence_class_group *
1443 sem_item_optimizer::get_group_by_hash (hashval_t hash, sem_item_type type)
1445 congruence_class_group *item = XNEW (congruence_class_group);
1446 item->hash = hash;
1447 item->type = type;
1449 congruence_class_group **slot = m_classes.find_slot (item, INSERT);
1451 if (*slot)
1452 free (item);
1453 else
1455 item->classes.create (1);
1456 *slot = item;
1459 return *slot;
1462 /* Callgraph removal hook called for a NODE with a custom DATA. */
1464 void
1465 sem_item_optimizer::cgraph_removal_hook (cgraph_node *node, void *data)
1467 sem_item_optimizer *optimizer = (sem_item_optimizer *) data;
1468 optimizer->remove_symtab_node (node);
1471 /* Varpool removal hook called for a NODE with a custom DATA. */
1473 void
1474 sem_item_optimizer::varpool_removal_hook (varpool_node *node, void *data)
1476 sem_item_optimizer *optimizer = (sem_item_optimizer *) data;
1477 optimizer->remove_symtab_node (node);
1480 /* Remove symtab NODE triggered by symtab removal hooks. */
1482 void
1483 sem_item_optimizer::remove_symtab_node (symtab_node *node)
1485 gcc_assert (!m_classes.elements());
1487 m_removed_items_set.add (node);
1490 void
1491 sem_item_optimizer::remove_item (sem_item *item)
1493 if (m_symtab_node_map.get (item->node))
1494 m_symtab_node_map.remove (item->node);
1495 delete item;
1498 /* Removes all callgraph and varpool nodes that are marked by symtab
1499 as deleted. */
1501 void
1502 sem_item_optimizer::filter_removed_items (void)
1504 auto_vec <sem_item *> filtered;
1506 for (unsigned int i = 0; i < m_items.length(); i++)
1508 sem_item *item = m_items[i];
1510 if (!flag_ipa_icf_functions && item->type == FUNC)
1512 remove_item (item);
1513 continue;
1516 if (!flag_ipa_icf_variables && item->type == VAR)
1518 remove_item (item);
1519 continue;
1522 bool no_body_function = false;
1524 if (item->type == FUNC)
1526 cgraph_node *cnode = static_cast <sem_function *>(item)->get_node ();
1528 no_body_function = in_lto_p && (cnode->alias || cnode->body_removed);
1531 if(!m_removed_items_set.contains (m_items[i]->node)
1532 && !no_body_function)
1534 if (item->type == VAR || (!DECL_CXX_CONSTRUCTOR_P (item->decl)
1535 && !DECL_CXX_DESTRUCTOR_P (item->decl)))
1537 filtered.safe_push (m_items[i]);
1538 continue;
1542 remove_item (item);
1545 /* Clean-up of released semantic items. */
1547 m_items.release ();
1548 for (unsigned int i = 0; i < filtered.length(); i++)
1549 m_items.safe_push (filtered[i]);
1552 /* Optimizer entry point. */
1554 void
1555 sem_item_optimizer::execute (void)
1557 filter_removed_items ();
1558 build_hash_based_classes ();
1560 if (dump_file)
1561 fprintf (dump_file, "Dump after hash based groups\n");
1562 dump_cong_classes ();
1564 for (unsigned int i = 0; i < m_items.length(); i++)
1565 m_items[i]->init_wpa ();
1567 build_graph ();
1569 subdivide_classes_by_equality (true);
1571 if (dump_file)
1572 fprintf (dump_file, "Dump after WPA based types groups\n");
1574 dump_cong_classes ();
1576 process_cong_reduction ();
1577 verify_classes ();
1579 if (dump_file)
1580 fprintf (dump_file, "Dump after callgraph-based congruence reduction\n");
1582 dump_cong_classes ();
1584 parse_nonsingleton_classes ();
1585 subdivide_classes_by_equality ();
1587 if (dump_file)
1588 fprintf (dump_file, "Dump after full equality comparison of groups\n");
1590 dump_cong_classes ();
1592 unsigned int prev_class_count = m_classes_count;
1594 process_cong_reduction ();
1595 dump_cong_classes ();
1596 verify_classes ();
1597 merge_classes (prev_class_count);
1599 if (dump_file && (dump_flags & TDF_DETAILS))
1600 symtab_node::dump_table (dump_file);
1603 /* Function responsible for visiting all potential functions and
1604 read-only variables that can be merged. */
1606 void
1607 sem_item_optimizer::parse_funcs_and_vars (void)
1609 cgraph_node *cnode;
1611 if (flag_ipa_icf_functions)
1612 FOR_EACH_DEFINED_FUNCTION (cnode)
1614 sem_function *f = sem_function::parse (cnode, &m_bmstack);
1615 if (f)
1617 m_items.safe_push (f);
1618 m_symtab_node_map.put (cnode, f);
1620 if (dump_file)
1621 fprintf (dump_file, "Parsed function:%s\n", f->asm_name ());
1623 if (dump_file && (dump_flags & TDF_DETAILS))
1624 f->dump_to_file (dump_file);
1626 else if (dump_file)
1627 fprintf (dump_file, "Not parsed function:%s\n", cnode->asm_name ());
1630 varpool_node *vnode;
1632 if (flag_ipa_icf_variables)
1633 FOR_EACH_DEFINED_VARIABLE (vnode)
1635 sem_variable *v = sem_variable::parse (vnode, &m_bmstack);
1637 if (v)
1639 m_items.safe_push (v);
1640 m_symtab_node_map.put (vnode, v);
1645 /* Makes pairing between a congruence class CLS and semantic ITEM. */
1647 void
1648 sem_item_optimizer::add_item_to_class (congruence_class *cls, sem_item *item)
1650 item->index_in_class = cls->members.length ();
1651 cls->members.safe_push (item);
1652 item->cls = cls;
1655 /* Congruence classes are built by hash value. */
1657 void
1658 sem_item_optimizer::build_hash_based_classes (void)
1660 for (unsigned i = 0; i < m_items.length (); i++)
1662 sem_item *item = m_items[i];
1664 congruence_class_group *group = get_group_by_hash (item->get_hash (),
1665 item->type);
1667 if (!group->classes.length ())
1669 m_classes_count++;
1670 group->classes.safe_push (new congruence_class (class_id++));
1673 add_item_to_class (group->classes[0], item);
1677 /* Build references according to call graph. */
1679 void
1680 sem_item_optimizer::build_graph (void)
1682 for (unsigned i = 0; i < m_items.length (); i++)
1684 sem_item *item = m_items[i];
1685 m_symtab_node_map.put (item->node, item);
1688 for (unsigned i = 0; i < m_items.length (); i++)
1690 sem_item *item = m_items[i];
1692 if (item->type == FUNC)
1694 cgraph_node *cnode = dyn_cast <cgraph_node *> (item->node);
1696 cgraph_edge *e = cnode->callees;
1697 while (e)
1699 sem_item **slot = m_symtab_node_map.get (e->callee);
1700 if (slot)
1701 item->add_reference (*slot);
1703 e = e->next_callee;
1707 ipa_ref *ref = NULL;
1708 for (unsigned i = 0; item->node->iterate_reference (i, ref); i++)
1710 sem_item **slot = m_symtab_node_map.get (ref->referred);
1711 if (slot)
1712 item->add_reference (*slot);
1717 /* Semantic items in classes having more than one element and initialized.
1718 In case of WPA, we load function body. */
1720 void
1721 sem_item_optimizer::parse_nonsingleton_classes (void)
1723 unsigned int init_called_count = 0;
1725 for (unsigned i = 0; i < m_items.length (); i++)
1726 if (m_items[i]->cls->members.length () > 1)
1728 m_items[i]->init ();
1729 init_called_count++;
1732 if (dump_file)
1733 fprintf (dump_file, "Init called for %u items (%.2f%%).\n", init_called_count,
1734 100.0f * init_called_count / m_items.length ());
1737 /* Equality function for semantic items is used to subdivide existing
1738 classes. If IN_WPA, fast equality function is invoked. */
1740 void
1741 sem_item_optimizer::subdivide_classes_by_equality (bool in_wpa)
1743 for (hash_table <congruence_class_group_hash>::iterator it = m_classes.begin ();
1744 it != m_classes.end (); ++it)
1746 unsigned int class_count = (*it)->classes.length ();
1748 for (unsigned i = 0; i < class_count; i++)
1750 congruence_class *c = (*it)->classes [i];
1752 if (c->members.length() > 1)
1754 auto_vec <sem_item *> new_vector;
1756 sem_item *first = c->members[0];
1757 new_vector.safe_push (first);
1759 unsigned class_split_first = (*it)->classes.length ();
1761 for (unsigned j = 1; j < c->members.length (); j++)
1763 sem_item *item = c->members[j];
1765 bool equals = in_wpa ? first->equals_wpa (item,
1766 m_symtab_node_map) : first->equals (item, m_symtab_node_map);
1768 if (equals)
1769 new_vector.safe_push (item);
1770 else
1772 bool integrated = false;
1774 for (unsigned k = class_split_first; k < (*it)->classes.length (); k++)
1776 sem_item *x = (*it)->classes[k]->members[0];
1777 bool equals = in_wpa ? x->equals_wpa (item,
1778 m_symtab_node_map) : x->equals (item, m_symtab_node_map);
1780 if (equals)
1782 integrated = true;
1783 add_item_to_class ((*it)->classes[k], item);
1785 break;
1789 if (!integrated)
1791 congruence_class *c = new congruence_class (class_id++);
1792 m_classes_count++;
1793 add_item_to_class (c, item);
1795 (*it)->classes.safe_push (c);
1800 // we replace newly created new_vector for the class we've just splitted
1801 c->members.release ();
1802 c->members.create (new_vector.length ());
1804 for (unsigned int j = 0; j < new_vector.length (); j++)
1805 add_item_to_class (c, new_vector[j]);
1810 verify_classes ();
1813 /* Verify congruence classes if checking is enabled. */
1815 void
1816 sem_item_optimizer::verify_classes (void)
1818 #if ENABLE_CHECKING
1819 for (hash_table <congruence_class_group_hash>::iterator it = m_classes.begin ();
1820 it != m_classes.end (); ++it)
1822 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
1824 congruence_class *cls = (*it)->classes[i];
1826 gcc_checking_assert (cls);
1827 gcc_checking_assert (cls->members.length () > 0);
1829 for (unsigned int j = 0; j < cls->members.length (); j++)
1831 sem_item *item = cls->members[j];
1833 gcc_checking_assert (item);
1834 gcc_checking_assert (item->cls == cls);
1836 for (unsigned k = 0; k < item->usages.length (); k++)
1838 sem_usage_pair *usage = item->usages[k];
1839 gcc_checking_assert (usage->item->index_in_class <
1840 usage->item->cls->members.length ());
1845 #endif
1848 /* Disposes split map traverse function. CLS_PTR is pointer to congruence
1849 class, BSLOT is bitmap slot we want to release. DATA is mandatory,
1850 but unused argument. */
1852 bool
1853 sem_item_optimizer::release_split_map (congruence_class * const &,
1854 bitmap const &b, traverse_split_pair *)
1856 bitmap bmp = b;
1858 BITMAP_FREE (bmp);
1860 return true;
1863 /* Process split operation for a class given as pointer CLS_PTR,
1864 where bitmap B splits congruence class members. DATA is used
1865 as argument of split pair. */
1867 bool
1868 sem_item_optimizer::traverse_congruence_split (congruence_class * const &cls,
1869 bitmap const &b, traverse_split_pair *pair)
1871 sem_item_optimizer *optimizer = pair->optimizer;
1872 const congruence_class *splitter_cls = pair->cls;
1874 /* If counted bits are greater than zero and less than the number of members
1875 a group will be splitted. */
1876 unsigned popcount = bitmap_count_bits (b);
1878 if (popcount > 0 && popcount < cls->members.length ())
1880 congruence_class* newclasses[2] = { new congruence_class (class_id++), new congruence_class (class_id++) };
1882 for (unsigned int i = 0; i < cls->members.length (); i++)
1884 int target = bitmap_bit_p (b, i);
1885 congruence_class *tc = newclasses[target];
1887 add_item_to_class (tc, cls->members[i]);
1890 #ifdef ENABLE_CHECKING
1891 for (unsigned int i = 0; i < 2; i++)
1892 gcc_checking_assert (newclasses[i]->members.length ());
1893 #endif
1895 if (splitter_cls == cls)
1896 optimizer->splitter_class_removed = true;
1898 /* Remove old class from worklist if presented. */
1899 bool in_worklist = cls->in_worklist;
1901 if (in_worklist)
1902 cls->in_worklist = false;
1904 congruence_class_group g;
1905 g.hash = cls->members[0]->get_hash ();
1906 g.type = cls->members[0]->type;
1908 congruence_class_group *slot = optimizer->m_classes.find(&g);
1910 for (unsigned int i = 0; i < slot->classes.length (); i++)
1911 if (slot->classes[i] == cls)
1913 slot->classes.ordered_remove (i);
1914 break;
1917 /* New class will be inserted and integrated to work list. */
1918 for (unsigned int i = 0; i < 2; i++)
1919 optimizer->add_class (newclasses[i]);
1921 /* Two classes replace one, so that increment just by one. */
1922 optimizer->m_classes_count++;
1924 /* If OLD class was presented in the worklist, we remove the class
1925 and replace it will both newly created classes. */
1926 if (in_worklist)
1927 for (unsigned int i = 0; i < 2; i++)
1928 optimizer->worklist_push (newclasses[i]);
1929 else /* Just smaller class is inserted. */
1931 unsigned int smaller_index = newclasses[0]->members.length () <
1932 newclasses[1]->members.length () ?
1933 0 : 1;
1934 optimizer->worklist_push (newclasses[smaller_index]);
1937 if (dump_file && (dump_flags & TDF_DETAILS))
1939 fprintf (dump_file, " congruence class splitted:\n");
1940 cls->dump (dump_file, 4);
1942 fprintf (dump_file, " newly created groups:\n");
1943 for (unsigned int i = 0; i < 2; i++)
1944 newclasses[i]->dump (dump_file, 4);
1947 /* Release class if not presented in work list. */
1948 if (!in_worklist)
1949 delete cls;
1953 return true;
1956 /* Tests if a class CLS used as INDEXth splits any congruence classes.
1957 Bitmap stack BMSTACK is used for bitmap allocation. */
1959 void
1960 sem_item_optimizer::do_congruence_step_for_index (congruence_class *cls,
1961 unsigned int index)
1963 hash_map <congruence_class *, bitmap> split_map;
1965 for (unsigned int i = 0; i < cls->members.length (); i++)
1967 sem_item *item = cls->members[i];
1969 /* Iterate all usages that have INDEX as usage of the item. */
1970 for (unsigned int j = 0; j < item->usages.length (); j++)
1972 sem_usage_pair *usage = item->usages[j];
1974 if (usage->index != index)
1975 continue;
1977 bitmap *slot = split_map.get (usage->item->cls);
1978 bitmap b;
1980 if(!slot)
1982 b = BITMAP_ALLOC (&m_bmstack);
1983 split_map.put (usage->item->cls, b);
1985 else
1986 b = *slot;
1988 #if ENABLE_CHECKING
1989 gcc_checking_assert (usage->item->cls);
1990 gcc_checking_assert (usage->item->index_in_class <
1991 usage->item->cls->members.length ());
1992 #endif
1994 bitmap_set_bit (b, usage->item->index_in_class);
1998 traverse_split_pair pair;
1999 pair.optimizer = this;
2000 pair.cls = cls;
2002 splitter_class_removed = false;
2003 split_map.traverse
2004 <traverse_split_pair *, sem_item_optimizer::traverse_congruence_split> (&pair);
2006 /* Bitmap clean-up. */
2007 split_map.traverse
2008 <traverse_split_pair *, sem_item_optimizer::release_split_map> (NULL);
2011 /* Every usage of a congruence class CLS is a candidate that can split the
2012 collection of classes. Bitmap stack BMSTACK is used for bitmap
2013 allocation. */
2015 void
2016 sem_item_optimizer::do_congruence_step (congruence_class *cls)
2018 bitmap_iterator bi;
2019 unsigned int i;
2021 bitmap usage = BITMAP_ALLOC (&m_bmstack);
2023 for (unsigned int i = 0; i < cls->members.length (); i++)
2024 bitmap_ior_into (usage, cls->members[i]->usage_index_bitmap);
2026 EXECUTE_IF_SET_IN_BITMAP (usage, 0, i, bi)
2028 if (dump_file && (dump_flags & TDF_DETAILS))
2029 fprintf (dump_file, " processing congruece step for class: %u, index: %u\n",
2030 cls->id, i);
2032 do_congruence_step_for_index (cls, i);
2034 if (splitter_class_removed)
2035 break;
2038 BITMAP_FREE (usage);
2041 /* Adds a newly created congruence class CLS to worklist. */
2043 void
2044 sem_item_optimizer::worklist_push (congruence_class *cls)
2046 /* Return if the class CLS is already presented in work list. */
2047 if (cls->in_worklist)
2048 return;
2050 cls->in_worklist = true;
2051 worklist.push_back (cls);
2054 /* Pops a class from worklist. */
2056 congruence_class *
2057 sem_item_optimizer::worklist_pop (void)
2059 congruence_class *cls;
2061 while (!worklist.empty ())
2063 cls = worklist.front ();
2064 worklist.pop_front ();
2065 if (cls->in_worklist)
2067 cls->in_worklist = false;
2069 return cls;
2071 else
2073 /* Work list item was already intended to be removed.
2074 The only reason for doing it is to split a class.
2075 Thus, the class CLS is deleted. */
2076 delete cls;
2080 return NULL;
2083 /* Iterative congruence reduction function. */
2085 void
2086 sem_item_optimizer::process_cong_reduction (void)
2088 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
2089 it != m_classes.end (); ++it)
2090 for (unsigned i = 0; i < (*it)->classes.length (); i++)
2091 if ((*it)->classes[i]->is_class_used ())
2092 worklist_push ((*it)->classes[i]);
2094 if (dump_file)
2095 fprintf (dump_file, "Worklist has been filled with: %lu\n",
2096 worklist.size ());
2098 if (dump_file && (dump_flags & TDF_DETAILS))
2099 fprintf (dump_file, "Congruence class reduction\n");
2101 congruence_class *cls;
2102 while ((cls = worklist_pop ()) != NULL)
2103 do_congruence_step (cls);
2106 /* Debug function prints all informations about congruence classes. */
2108 void
2109 sem_item_optimizer::dump_cong_classes (void)
2111 if (!dump_file)
2112 return;
2114 fprintf (dump_file,
2115 "Congruence classes: %u (unique hash values: %lu), with total: %u items\n",
2116 m_classes_count, m_classes.elements(), m_items.length ());
2118 /* Histogram calculation. */
2119 unsigned int max_index = 0;
2120 unsigned int* histogram = XCNEWVEC (unsigned int, m_items.length () + 1);
2122 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
2123 it != m_classes.end (); ++it)
2125 for (unsigned i = 0; i < (*it)->classes.length (); i++)
2127 unsigned int c = (*it)->classes[i]->members.length ();
2128 histogram[c]++;
2130 if (c > max_index)
2131 max_index = c;
2134 fprintf (dump_file,
2135 "Class size histogram [num of members]: number of classe number of classess\n");
2137 for (unsigned int i = 0; i <= max_index; i++)
2138 if (histogram[i])
2139 fprintf (dump_file, "[%u]: %u classes\n", i, histogram[i]);
2141 fprintf (dump_file, "\n\n");
2144 if (dump_flags & TDF_DETAILS)
2145 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
2146 it != m_classes.end (); ++it)
2148 fprintf (dump_file, " group: with %u classes:\n", (*it)->classes.length ());
2150 for (unsigned i = 0; i < (*it)->classes.length (); i++)
2152 (*it)->classes[i]->dump (dump_file, 4);
2154 if(i < (*it)->classes.length () - 1)
2155 fprintf (dump_file, " ");
2159 free (histogram);
2162 /* After reduction is done, we can declare all items in a group
2163 to be equal. PREV_CLASS_COUNT is start number of classes
2164 before reduction. */
2166 void
2167 sem_item_optimizer::merge_classes (unsigned int prev_class_count)
2169 unsigned int item_count = m_items.length ();
2170 unsigned int class_count = m_classes_count;
2171 unsigned int equal_items = item_count - class_count;
2173 unsigned int non_singular_classes_count = 0;
2174 unsigned int non_singular_classes_sum = 0;
2176 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
2177 it != m_classes.end (); ++it)
2178 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
2180 congruence_class *c = (*it)->classes[i];
2181 if (c->members.length () > 1)
2183 non_singular_classes_count++;
2184 non_singular_classes_sum += c->members.length ();
2188 if (dump_file)
2190 fprintf (dump_file, "\nItem count: %u\n", item_count);
2191 fprintf (dump_file, "Congruent classes before: %u, after: %u\n",
2192 prev_class_count, class_count);
2193 fprintf (dump_file, "Average class size before: %.2f, after: %.2f\n",
2194 1.0f * item_count / prev_class_count,
2195 1.0f * item_count / class_count);
2196 fprintf (dump_file, "Average non-singular class size: %.2f, count: %u\n",
2197 1.0f * non_singular_classes_sum / non_singular_classes_count,
2198 non_singular_classes_count);
2199 fprintf (dump_file, "Equal symbols: %u\n", equal_items);
2200 fprintf (dump_file, "Fraction of visited symbols: %.2f%%\n\n",
2201 100.0f * equal_items / item_count);
2204 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
2205 it != m_classes.end (); ++it)
2206 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
2208 congruence_class *c = (*it)->classes[i];
2210 if (c->members.length () == 1)
2211 continue;
2213 gcc_assert (c->members.length ());
2215 sem_item *source = c->members[0];
2217 for (unsigned int j = 1; j < c->members.length (); j++)
2219 sem_item *alias = c->members[j];
2220 source->equals (alias, m_symtab_node_map);
2222 if (dump_file)
2224 fprintf (dump_file, "Semantic equality hit:%s->%s\n",
2225 source->name (), alias->name ());
2226 fprintf (dump_file, "Assembler symbol names:%s->%s\n",
2227 source->asm_name (), alias->asm_name ());
2230 if (dump_file && (dump_flags & TDF_DETAILS))
2232 source->dump_to_file (dump_file);
2233 alias->dump_to_file (dump_file);
2236 source->merge (alias);
2241 /* Dump function prints all class members to a FILE with an INDENT. */
2243 void
2244 congruence_class::dump (FILE *file, unsigned int indent) const
2246 FPRINTF_SPACES (file, indent, "class with id: %u, hash: %u, items: %u\n",
2247 id, members[0]->get_hash (), members.length ());
2249 FPUTS_SPACES (file, indent + 2, "");
2250 for (unsigned i = 0; i < members.length (); i++)
2251 fprintf (file, "%s(%p/%u) ", members[i]->asm_name (), (void *) members[i]->decl,
2252 members[i]->node->order);
2254 fprintf (file, "\n");
2257 /* Returns true if there's a member that is used from another group. */
2259 bool
2260 congruence_class::is_class_used (void)
2262 for (unsigned int i = 0; i < members.length (); i++)
2263 if (members[i]->usages.length ())
2264 return true;
2266 return false;
2269 /* Initialization and computation of symtab node hash, there data
2270 are propagated later on. */
2272 static sem_item_optimizer *optimizer = NULL;
2274 /* Generate pass summary for IPA ICF pass. */
2276 static void
2277 ipa_icf_generate_summary (void)
2279 if (!optimizer)
2280 optimizer = new sem_item_optimizer ();
2282 optimizer->parse_funcs_and_vars ();
2285 /* Write pass summary for IPA ICF pass. */
2287 static void
2288 ipa_icf_write_summary (void)
2290 gcc_assert (optimizer);
2292 optimizer->write_summary ();
2295 /* Read pass summary for IPA ICF pass. */
2297 static void
2298 ipa_icf_read_summary (void)
2300 if (!optimizer)
2301 optimizer = new sem_item_optimizer ();
2303 optimizer->read_summary ();
2304 optimizer->register_hooks ();
2307 /* Semantic equality exection function. */
2309 static unsigned int
2310 ipa_icf_driver (void)
2312 gcc_assert (optimizer);
2314 optimizer->execute ();
2315 optimizer->unregister_hooks ();
2317 delete optimizer;
2319 return 0;
2322 const pass_data pass_data_ipa_icf =
2324 IPA_PASS, /* type */
2325 "icf", /* name */
2326 OPTGROUP_IPA, /* optinfo_flags */
2327 TV_IPA_ICF, /* tv_id */
2328 0, /* properties_required */
2329 0, /* properties_provided */
2330 0, /* properties_destroyed */
2331 0, /* todo_flags_start */
2332 0, /* todo_flags_finish */
2335 class pass_ipa_icf : public ipa_opt_pass_d
2337 public:
2338 pass_ipa_icf (gcc::context *ctxt)
2339 : ipa_opt_pass_d (pass_data_ipa_icf, ctxt,
2340 ipa_icf_generate_summary, /* generate_summary */
2341 ipa_icf_write_summary, /* write_summary */
2342 ipa_icf_read_summary, /* read_summary */
2343 NULL, /*
2344 write_optimization_summary */
2345 NULL, /*
2346 read_optimization_summary */
2347 NULL, /* stmt_fixup */
2348 0, /* function_transform_todo_flags_start */
2349 NULL, /* function_transform */
2350 NULL) /* variable_transform */
2353 /* opt_pass methods: */
2354 virtual bool gate (function *)
2356 return flag_ipa_icf_variables || flag_ipa_icf_functions;
2359 virtual unsigned int execute (function *)
2361 return ipa_icf_driver();
2363 }; // class pass_ipa_icf
2365 } // ipa_icf namespace
2367 ipa_opt_pass_d *
2368 make_pass_ipa_icf (gcc::context *ctxt)
2370 return new ipa_icf::pass_ipa_icf (ctxt);