if_iwm - Factor out firmware station handling into if_iwm_sta.c.
[dragonfly.git] / contrib / gcc-5.0 / gcc / ipa-icf.c
blob729bc068153224d8b6e0733ecef2edf7b8df0ae8
1 /* Interprocedural Identical Code Folding pass
2 Copyright (C) 2014-2015 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 <list>
57 #include "coretypes.h"
58 #include "hash-set.h"
59 #include "machmode.h"
60 #include "vec.h"
61 #include "double-int.h"
62 #include "input.h"
63 #include "alias.h"
64 #include "symtab.h"
65 #include "options.h"
66 #include "wide-int.h"
67 #include "inchash.h"
68 #include "tree.h"
69 #include "fold-const.h"
70 #include "predict.h"
71 #include "tm.h"
72 #include "hard-reg-set.h"
73 #include "function.h"
74 #include "dominance.h"
75 #include "cfg.h"
76 #include "basic-block.h"
77 #include "tree-ssa-alias.h"
78 #include "internal-fn.h"
79 #include "gimple-expr.h"
80 #include "is-a.h"
81 #include "gimple.h"
82 #include "hashtab.h"
83 #include "rtl.h"
84 #include "flags.h"
85 #include "statistics.h"
86 #include "real.h"
87 #include "fixed-value.h"
88 #include "insn-config.h"
89 #include "expmed.h"
90 #include "dojump.h"
91 #include "explow.h"
92 #include "calls.h"
93 #include "emit-rtl.h"
94 #include "varasm.h"
95 #include "stmt.h"
96 #include "expr.h"
97 #include "gimple-iterator.h"
98 #include "gimple-ssa.h"
99 #include "tree-cfg.h"
100 #include "tree-phinodes.h"
101 #include "stringpool.h"
102 #include "tree-ssanames.h"
103 #include "tree-dfa.h"
104 #include "tree-pass.h"
105 #include "gimple-pretty-print.h"
106 #include "hash-map.h"
107 #include "plugin-api.h"
108 #include "ipa-ref.h"
109 #include "cgraph.h"
110 #include "alloc-pool.h"
111 #include "symbol-summary.h"
112 #include "ipa-prop.h"
113 #include "ipa-inline.h"
114 #include "cfgloop.h"
115 #include "except.h"
116 #include "hash-table.h"
117 #include "coverage.h"
118 #include "attribs.h"
119 #include "print-tree.h"
120 #include "lto-streamer.h"
121 #include "data-streamer.h"
122 #include "ipa-utils.h"
123 #include "ipa-icf-gimple.h"
124 #include "ipa-icf.h"
125 #include "stor-layout.h"
127 using namespace ipa_icf_gimple;
129 namespace ipa_icf {
131 /* Initialization and computation of symtab node hash, there data
132 are propagated later on. */
134 static sem_item_optimizer *optimizer = NULL;
136 /* Constructor. */
138 symbol_compare_collection::symbol_compare_collection (symtab_node *node)
140 m_references.create (0);
141 m_interposables.create (0);
143 ipa_ref *ref;
145 if (is_a <varpool_node *> (node) && DECL_VIRTUAL_P (node->decl))
146 return;
148 for (unsigned i = 0; i < node->num_references (); i++)
150 ref = node->iterate_reference (i, ref);
151 if (ref->address_matters_p ())
152 m_references.safe_push (ref->referred);
154 if (ref->referred->get_availability () <= AVAIL_INTERPOSABLE)
156 if (ref->address_matters_p ())
157 m_references.safe_push (ref->referred);
158 else
159 m_interposables.safe_push (ref->referred);
163 if (is_a <cgraph_node *> (node))
165 cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
167 for (cgraph_edge *e = cnode->callees; e; e = e->next_callee)
168 if (e->callee->get_availability () <= AVAIL_INTERPOSABLE)
169 m_interposables.safe_push (e->callee);
173 /* Constructor for key value pair, where _ITEM is key and _INDEX is a target. */
175 sem_usage_pair::sem_usage_pair (sem_item *_item, unsigned int _index):
176 item (_item), index (_index)
180 /* Semantic item constructor for a node of _TYPE, where STACK is used
181 for bitmap memory allocation. */
183 sem_item::sem_item (sem_item_type _type,
184 bitmap_obstack *stack): type(_type), hash(0)
186 setup (stack);
189 /* Semantic item constructor for a node of _TYPE, where STACK is used
190 for bitmap memory allocation. The item is based on symtab node _NODE
191 with computed _HASH. */
193 sem_item::sem_item (sem_item_type _type, symtab_node *_node,
194 hashval_t _hash, bitmap_obstack *stack): type(_type),
195 node (_node), hash (_hash)
197 decl = node->decl;
198 setup (stack);
201 /* Add reference to a semantic TARGET. */
203 void
204 sem_item::add_reference (sem_item *target)
206 refs.safe_push (target);
207 unsigned index = refs.length ();
208 target->usages.safe_push (new sem_usage_pair(this, index));
209 bitmap_set_bit (target->usage_index_bitmap, index);
210 refs_set.add (target->node);
213 /* Initialize internal data structures. Bitmap STACK is used for
214 bitmap memory allocation process. */
216 void
217 sem_item::setup (bitmap_obstack *stack)
219 gcc_checking_assert (node);
221 refs.create (0);
222 tree_refs.create (0);
223 usages.create (0);
224 usage_index_bitmap = BITMAP_ALLOC (stack);
227 sem_item::~sem_item ()
229 for (unsigned i = 0; i < usages.length (); i++)
230 delete usages[i];
232 refs.release ();
233 tree_refs.release ();
234 usages.release ();
236 BITMAP_FREE (usage_index_bitmap);
239 /* Dump function for debugging purpose. */
241 DEBUG_FUNCTION void
242 sem_item::dump (void)
244 if (dump_file)
246 fprintf (dump_file, "[%s] %s (%u) (tree:%p)\n", type == FUNC ? "func" : "var",
247 node->name(), node->order, (void *) node->decl);
248 fprintf (dump_file, " hash: %u\n", get_hash ());
249 fprintf (dump_file, " references: ");
251 for (unsigned i = 0; i < refs.length (); i++)
252 fprintf (dump_file, "%s%s ", refs[i]->node->name (),
253 i < refs.length() - 1 ? "," : "");
255 fprintf (dump_file, "\n");
259 /* Return true if target supports alias symbols. */
261 bool
262 sem_item::target_supports_symbol_aliases_p (void)
264 #if !defined (ASM_OUTPUT_DEF) || (!defined(ASM_OUTPUT_WEAK_ALIAS) && !defined (ASM_WEAKEN_DECL))
265 return false;
266 #else
267 return true;
268 #endif
271 /* Semantic function constructor that uses STACK as bitmap memory stack. */
273 sem_function::sem_function (bitmap_obstack *stack): sem_item (FUNC, stack),
274 m_checker (NULL), m_compared_func (NULL)
276 bb_sizes.create (0);
277 bb_sorted.create (0);
280 /* Constructor based on callgraph node _NODE with computed hash _HASH.
281 Bitmap STACK is used for memory allocation. */
282 sem_function::sem_function (cgraph_node *node, hashval_t hash,
283 bitmap_obstack *stack):
284 sem_item (FUNC, node, hash, stack),
285 m_checker (NULL), m_compared_func (NULL)
287 bb_sizes.create (0);
288 bb_sorted.create (0);
291 sem_function::~sem_function ()
293 for (unsigned i = 0; i < bb_sorted.length (); i++)
294 delete (bb_sorted[i]);
296 bb_sizes.release ();
297 bb_sorted.release ();
300 /* Calculates hash value based on a BASIC_BLOCK. */
302 hashval_t
303 sem_function::get_bb_hash (const sem_bb *basic_block)
305 inchash::hash hstate;
307 hstate.add_int (basic_block->nondbg_stmt_count);
308 hstate.add_int (basic_block->edge_count);
310 return hstate.end ();
313 /* References independent hash function. */
315 hashval_t
316 sem_function::get_hash (void)
318 if(!hash)
320 inchash::hash hstate;
321 hstate.add_int (177454); /* Random number for function type. */
323 hstate.add_int (arg_count);
324 hstate.add_int (cfg_checksum);
325 hstate.add_int (gcode_hash);
327 for (unsigned i = 0; i < bb_sorted.length (); i++)
328 hstate.merge_hash (get_bb_hash (bb_sorted[i]));
330 for (unsigned i = 0; i < bb_sizes.length (); i++)
331 hstate.add_int (bb_sizes[i]);
334 /* Add common features of declaration itself. */
335 if (DECL_FUNCTION_SPECIFIC_TARGET (decl))
336 hstate.add_wide_int
337 (cl_target_option_hash
338 (TREE_TARGET_OPTION (DECL_FUNCTION_SPECIFIC_TARGET (decl))));
339 if (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (decl))
340 (cl_optimization_hash
341 (TREE_OPTIMIZATION (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (decl))));
342 hstate.add_flag (DECL_DISREGARD_INLINE_LIMITS (decl));
343 hstate.add_flag (DECL_DECLARED_INLINE_P (decl));
344 hstate.add_flag (DECL_IS_OPERATOR_NEW (decl));
345 hstate.add_flag (DECL_CXX_CONSTRUCTOR_P (decl));
346 hstate.add_flag (DECL_CXX_DESTRUCTOR_P (decl));
348 hash = hstate.end ();
351 return hash;
354 /* For a given symbol table nodes N1 and N2, we check that FUNCTION_DECLs
355 point to a same function. Comparison can be skipped if IGNORED_NODES
356 contains these nodes. ADDRESS indicate if address is taken. */
358 bool
359 sem_item::compare_cgraph_references (
360 hash_map <symtab_node *, sem_item *> &ignored_nodes,
361 symtab_node *n1, symtab_node *n2, bool address)
363 enum availability avail1, avail2;
365 if (n1 == n2)
366 return true;
368 /* Never match variable and function. */
369 if (is_a <varpool_node *> (n1) != is_a <varpool_node *> (n2))
370 return false;
372 /* Merging two definitions with a reference to equivalent vtables, but
373 belonging to a different type may result in ipa-polymorphic-call analysis
374 giving a wrong answer about the dynamic type of instance. */
375 if (is_a <varpool_node *> (n1)
376 && (DECL_VIRTUAL_P (n1->decl) || DECL_VIRTUAL_P (n2->decl))
377 && (DECL_VIRTUAL_P (n1->decl) != DECL_VIRTUAL_P (n2->decl)
378 || !types_must_be_same_for_odr (DECL_CONTEXT (n1->decl),
379 DECL_CONTEXT (n2->decl))))
380 return return_false_with_msg
381 ("references to virtual tables can not be merged");
383 if (address && n1->equal_address_to (n2) == 1)
384 return true;
385 if (!address && n1->semantically_equivalent_p (n2))
386 return true;
388 n1 = n1->ultimate_alias_target (&avail1);
389 n2 = n2->ultimate_alias_target (&avail2);
391 if (avail1 >= AVAIL_INTERPOSABLE && ignored_nodes.get (n1)
392 && avail2 >= AVAIL_INTERPOSABLE && ignored_nodes.get (n2))
393 return true;
395 return return_false_with_msg ("different references");
398 /* If cgraph edges E1 and E2 are indirect calls, verify that
399 ECF flags are the same. */
401 bool sem_function::compare_edge_flags (cgraph_edge *e1, cgraph_edge *e2)
403 if (e1->indirect_info && e2->indirect_info)
405 int e1_flags = e1->indirect_info->ecf_flags;
406 int e2_flags = e2->indirect_info->ecf_flags;
408 if (e1_flags != e2_flags)
409 return return_false_with_msg ("ICF flags are different");
411 else if (e1->indirect_info || e2->indirect_info)
412 return false;
414 return true;
417 /* Perform additional check needed to match types function parameters that are
418 used. Unlike for normal decls it matters if type is TYPE_RESTRICT and we
419 make an assumption that REFERENCE_TYPE parameters are always non-NULL. */
421 bool
422 sem_function::compatible_parm_types_p (tree parm1, tree parm2)
424 /* Be sure that parameters are TBAA compatible. */
425 if (!func_checker::compatible_types_p (parm1, parm2))
426 return return_false_with_msg ("parameter type is not compatible");
428 if (POINTER_TYPE_P (parm1)
429 && (TYPE_RESTRICT (parm1) != TYPE_RESTRICT (parm2)))
430 return return_false_with_msg ("argument restrict flag mismatch");
432 /* nonnull_arg_p implies non-zero range to REFERENCE types. */
433 if (POINTER_TYPE_P (parm1)
434 && TREE_CODE (parm1) != TREE_CODE (parm2)
435 && opt_for_fn (decl, flag_delete_null_pointer_checks))
436 return return_false_with_msg ("pointer wrt reference mismatch");
438 return true;
441 /* Return true if parameter I may be used. */
443 bool
444 sem_function::param_used_p (unsigned int i)
446 if (ipa_node_params_sum == NULL)
447 return true;
449 struct ipa_node_params *parms_info = IPA_NODE_REF (get_node ());
451 if (parms_info->descriptors.is_empty ()
452 || parms_info->descriptors.length () <= i)
453 return true;
455 return ipa_is_param_used (IPA_NODE_REF (get_node ()), i);
458 /* Fast equality function based on knowledge known in WPA. */
460 bool
461 sem_function::equals_wpa (sem_item *item,
462 hash_map <symtab_node *, sem_item *> &ignored_nodes)
464 gcc_assert (item->type == FUNC);
466 m_compared_func = static_cast<sem_function *> (item);
468 /* Compare special function DECL attributes. */
469 if (DECL_FUNCTION_PERSONALITY (decl)
470 != DECL_FUNCTION_PERSONALITY (item->decl))
471 return return_false_with_msg ("function personalities are different");
473 if (DECL_DISREGARD_INLINE_LIMITS (decl)
474 != DECL_DISREGARD_INLINE_LIMITS (item->decl))
475 return return_false_with_msg ("DECL_DISREGARD_INLINE_LIMITS are different");
477 if (DECL_DECLARED_INLINE_P (decl) != DECL_DECLARED_INLINE_P (item->decl))
478 return return_false_with_msg ("inline attributes are different");
480 if (DECL_IS_OPERATOR_NEW (decl) != DECL_IS_OPERATOR_NEW (item->decl))
481 return return_false_with_msg ("operator new flags are different");
483 if (DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl)
484 != DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (item->decl))
485 return return_false_with_msg ("intrument function entry exit "
486 "attributes are different");
488 if (DECL_NO_LIMIT_STACK (decl) != DECL_NO_LIMIT_STACK (item->decl))
489 return return_false_with_msg ("no stack limit attributes are different");
491 if (DECL_CXX_CONSTRUCTOR_P (decl) != DECL_CXX_CONSTRUCTOR_P (item->decl))
492 return return_false_with_msg ("DECL_CXX_CONSTRUCTOR mismatch");
494 if (DECL_CXX_DESTRUCTOR_P (decl) != DECL_CXX_DESTRUCTOR_P (item->decl))
495 return return_false_with_msg ("DECL_CXX_DESTRUCTOR mismatch");
497 if (flags_from_decl_or_type (decl) != flags_from_decl_or_type (item->decl))
498 return return_false_with_msg ("decl_or_type flags are different");
500 /* Do not match polymorphic constructors of different types. They calls
501 type memory location for ipa-polymorphic-call and we do not want
502 it to get confused by wrong type. */
503 if (DECL_CXX_CONSTRUCTOR_P (decl)
504 && TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE)
506 if (TREE_CODE (TREE_TYPE (item->decl)) != METHOD_TYPE)
507 return return_false_with_msg ("DECL_CXX_CONSTURCTOR type mismatch");
508 else if (!func_checker::compatible_polymorphic_types_p
509 (method_class_type (TREE_TYPE (decl)),
510 method_class_type (TREE_TYPE (item->decl)), false))
511 return return_false_with_msg ("ctor polymorphic type mismatch");
514 /* Checking function TARGET and OPTIMIZATION flags. */
515 cl_target_option *tar1 = target_opts_for_fn (decl);
516 cl_target_option *tar2 = target_opts_for_fn (item->decl);
518 if (tar1 != tar2 && !cl_target_option_eq (tar1, tar2))
520 if (dump_file && (dump_flags & TDF_DETAILS))
522 fprintf (dump_file, "target flags difference");
523 cl_target_option_print_diff (dump_file, 2, tar1, tar2);
526 return return_false_with_msg ("Target flags are different");
529 cl_optimization *opt1 = opts_for_fn (decl);
530 cl_optimization *opt2 = opts_for_fn (item->decl);
532 if (opt1 != opt2 && memcmp (opt1, opt2, sizeof(cl_optimization)))
534 if (dump_file && (dump_flags & TDF_DETAILS))
536 fprintf (dump_file, "optimization flags difference");
537 cl_optimization_print_diff (dump_file, 2, opt1, opt2);
540 return return_false_with_msg ("optimization flags are different");
543 /* Result type checking. */
544 if (!func_checker::compatible_types_p
545 (TREE_TYPE (TREE_TYPE (decl)),
546 TREE_TYPE (TREE_TYPE (m_compared_func->decl))))
547 return return_false_with_msg ("result types are different");
549 /* Checking types of arguments. */
550 tree list1 = TYPE_ARG_TYPES (TREE_TYPE (decl)),
551 list2 = TYPE_ARG_TYPES (TREE_TYPE (m_compared_func->decl));
552 for (unsigned i = 0; list1 && list2;
553 list1 = TREE_CHAIN (list1), list2 = TREE_CHAIN (list2), i++)
555 tree parm1 = TREE_VALUE (list1);
556 tree parm2 = TREE_VALUE (list2);
558 /* This guard is here for function pointer with attributes (pr59927.c). */
559 if (!parm1 || !parm2)
560 return return_false_with_msg ("NULL argument type");
562 /* Verify that types are compatible to ensure that both functions
563 have same calling conventions. */
564 if (!types_compatible_p (parm1, parm2))
565 return return_false_with_msg ("parameter types are not compatible");
567 if (!param_used_p (i))
568 continue;
570 /* Perform additional checks for used parameters. */
571 if (!compatible_parm_types_p (parm1, parm2))
572 return false;
575 if (list1 || list2)
576 return return_false_with_msg ("Mismatched number of parameters");
578 if (node->num_references () != item->node->num_references ())
579 return return_false_with_msg ("different number of references");
581 if (comp_type_attributes (TREE_TYPE (decl),
582 TREE_TYPE (item->decl)) != 1)
583 return return_false_with_msg ("different type attributes");
585 /* The type of THIS pointer type memory location for
586 ipa-polymorphic-call-analysis. */
587 if (opt_for_fn (decl, flag_devirtualize)
588 && (TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE
589 || TREE_CODE (TREE_TYPE (item->decl)) == METHOD_TYPE)
590 && (ipa_node_params_sum == NULL
591 || IPA_NODE_REF (get_node ())->descriptors.is_empty ()
592 || ipa_is_param_used (IPA_NODE_REF (get_node ()),
594 && compare_polymorphic_p ())
596 if (TREE_CODE (TREE_TYPE (decl)) != TREE_CODE (TREE_TYPE (item->decl)))
597 return return_false_with_msg ("METHOD_TYPE and FUNCTION_TYPE mismatch");
598 if (!func_checker::compatible_polymorphic_types_p
599 (method_class_type (TREE_TYPE (decl)),
600 method_class_type (TREE_TYPE (item->decl)), false))
601 return return_false_with_msg ("THIS pointer ODR type mismatch");
604 ipa_ref *ref = NULL, *ref2 = NULL;
605 for (unsigned i = 0; node->iterate_reference (i, ref); i++)
607 item->node->iterate_reference (i, ref2);
609 if (!compare_cgraph_references (ignored_nodes, ref->referred,
610 ref2->referred,
611 ref->address_matters_p ()))
612 return false;
615 cgraph_edge *e1 = dyn_cast <cgraph_node *> (node)->callees;
616 cgraph_edge *e2 = dyn_cast <cgraph_node *> (item->node)->callees;
618 while (e1 && e2)
620 if (!compare_cgraph_references (ignored_nodes, e1->callee,
621 e2->callee, false))
622 return false;
624 e1 = e1->next_callee;
625 e2 = e2->next_callee;
628 if (e1 || e2)
629 return return_false_with_msg ("different number of edges");
631 return true;
634 /* Update hash by address sensitive references. We iterate over all
635 sensitive references (address_matters_p) and we hash ultime alias
636 target of these nodes, which can improve a semantic item hash.
637 TODO: stronger SCC based hashing would be desirable here. */
639 void
640 sem_item::update_hash_by_addr_refs (hash_map <symtab_node *,
641 sem_item *> &m_symtab_node_map)
643 ipa_ref* ref;
644 inchash::hash hstate (hash);
645 for (unsigned i = 0; i < node->num_references (); i++)
647 ref = node->iterate_reference (i, ref);
648 if (ref->address_matters_p () || !m_symtab_node_map.get (ref->referred))
649 hstate.add_int (ref->referred->ultimate_alias_target ()->order);
652 if (is_a <cgraph_node *> (node))
654 for (cgraph_edge *e = dyn_cast <cgraph_node *> (node)->callers; e;
655 e = e->next_caller)
657 sem_item **result = m_symtab_node_map.get (e->callee);
658 if (!result)
659 hstate.add_int (e->callee->ultimate_alias_target ()->order);
663 hash = hstate.end ();
666 /* Update hash by computed local hash values taken from different
667 semantic items. */
669 void
670 sem_item::update_hash_by_local_refs (hash_map <symtab_node *,
671 sem_item *> &m_symtab_node_map)
673 inchash::hash state (hash);
674 for (unsigned j = 0; j < node->num_references (); j++)
676 ipa_ref *ref;
677 ref = node->iterate_reference (j, ref);
678 sem_item **result = m_symtab_node_map.get (ref->referring);
679 if (result)
680 state.merge_hash ((*result)->hash);
683 if (type == FUNC)
685 for (cgraph_edge *e = dyn_cast <cgraph_node *> (node)->callees; e;
686 e = e->next_callee)
688 sem_item **result = m_symtab_node_map.get (e->caller);
689 if (result)
690 state.merge_hash ((*result)->hash);
694 global_hash = state.end ();
697 /* Returns true if the item equals to ITEM given as argument. */
699 bool
700 sem_function::equals (sem_item *item,
701 hash_map <symtab_node *, sem_item *> &ignored_nodes)
703 gcc_assert (item->type == FUNC);
704 bool eq = equals_private (item, ignored_nodes);
706 if (m_checker != NULL)
708 delete m_checker;
709 m_checker = NULL;
712 if (dump_file && (dump_flags & TDF_DETAILS))
713 fprintf (dump_file,
714 "Equals called for:%s:%s (%u:%u) (%s:%s) with result: %s\n\n",
715 xstrdup_for_dump (node->name()),
716 xstrdup_for_dump (item->node->name ()),
717 node->order,
718 item->node->order,
719 xstrdup_for_dump (node->asm_name ()),
720 xstrdup_for_dump (item->node->asm_name ()),
721 eq ? "true" : "false");
723 return eq;
726 /* Processes function equality comparison. */
728 bool
729 sem_function::equals_private (sem_item *item,
730 hash_map <symtab_node *, sem_item *> &ignored_nodes)
732 if (item->type != FUNC)
733 return false;
735 basic_block bb1, bb2;
736 edge e1, e2;
737 edge_iterator ei1, ei2;
738 bool result = true;
739 tree arg1, arg2;
741 m_compared_func = static_cast<sem_function *> (item);
743 gcc_assert (decl != item->decl);
745 if (bb_sorted.length () != m_compared_func->bb_sorted.length ()
746 || edge_count != m_compared_func->edge_count
747 || cfg_checksum != m_compared_func->cfg_checksum)
748 return return_false ();
750 if (!equals_wpa (item, ignored_nodes))
751 return false;
753 /* Checking function arguments. */
754 tree decl1 = DECL_ATTRIBUTES (decl);
755 tree decl2 = DECL_ATTRIBUTES (m_compared_func->decl);
757 m_checker = new func_checker (decl, m_compared_func->decl,
758 compare_polymorphic_p (),
759 false,
760 &refs_set,
761 &m_compared_func->refs_set);
762 while (decl1)
764 if (decl2 == NULL)
765 return return_false ();
767 if (get_attribute_name (decl1) != get_attribute_name (decl2))
768 return return_false ();
770 tree attr_value1 = TREE_VALUE (decl1);
771 tree attr_value2 = TREE_VALUE (decl2);
773 if (attr_value1 && attr_value2)
775 bool ret = m_checker->compare_operand (TREE_VALUE (attr_value1),
776 TREE_VALUE (attr_value2));
777 if (!ret)
778 return return_false_with_msg ("attribute values are different");
780 else if (!attr_value1 && !attr_value2)
782 else
783 return return_false ();
785 decl1 = TREE_CHAIN (decl1);
786 decl2 = TREE_CHAIN (decl2);
789 if (decl1 != decl2)
790 return return_false();
792 arg1 = DECL_ARGUMENTS (decl);
793 arg2 = DECL_ARGUMENTS (m_compared_func->decl);
794 for (unsigned i = 0;
795 arg1 && arg2; arg1 = DECL_CHAIN (arg1), arg2 = DECL_CHAIN (arg2), i++)
797 if (!types_compatible_p (TREE_TYPE (arg1), TREE_TYPE (arg2)))
798 return return_false_with_msg ("argument types are not compatible");
799 if (!param_used_p (i))
800 continue;
801 /* Perform additional checks for used parameters. */
802 if (!compatible_parm_types_p (TREE_TYPE (arg1), TREE_TYPE (arg2)))
803 return false;
804 if (!m_checker->compare_decl (arg1, arg2))
805 return return_false ();
807 if (arg1 || arg2)
808 return return_false_with_msg ("Mismatched number of arguments");
810 /* Fill-up label dictionary. */
811 for (unsigned i = 0; i < bb_sorted.length (); ++i)
813 m_checker->parse_labels (bb_sorted[i]);
814 m_checker->parse_labels (m_compared_func->bb_sorted[i]);
817 /* Checking all basic blocks. */
818 for (unsigned i = 0; i < bb_sorted.length (); ++i)
819 if(!m_checker->compare_bb (bb_sorted[i], m_compared_func->bb_sorted[i]))
820 return return_false();
822 dump_message ("All BBs are equal\n");
824 auto_vec <int> bb_dict;
826 /* Basic block edges check. */
827 for (unsigned i = 0; i < bb_sorted.length (); ++i)
829 bb1 = bb_sorted[i]->bb;
830 bb2 = m_compared_func->bb_sorted[i]->bb;
832 ei2 = ei_start (bb2->preds);
834 for (ei1 = ei_start (bb1->preds); ei_cond (ei1, &e1); ei_next (&ei1))
836 ei_cond (ei2, &e2);
838 if (e1->flags != e2->flags)
839 return return_false_with_msg ("flags comparison returns false");
841 if (!bb_dict_test (&bb_dict, e1->src->index, e2->src->index))
842 return return_false_with_msg ("edge comparison returns false");
844 if (!bb_dict_test (&bb_dict, e1->dest->index, e2->dest->index))
845 return return_false_with_msg ("BB comparison returns false");
847 if (!m_checker->compare_edge (e1, e2))
848 return return_false_with_msg ("edge comparison returns false");
850 ei_next (&ei2);
854 /* Basic block PHI nodes comparison. */
855 for (unsigned i = 0; i < bb_sorted.length (); i++)
856 if (!compare_phi_node (bb_sorted[i]->bb, m_compared_func->bb_sorted[i]->bb))
857 return return_false_with_msg ("PHI node comparison returns false");
859 return result;
862 /* Set LOCAL_P of NODE to true if DATA is non-NULL.
863 Helper for call_for_symbol_thunks_and_aliases. */
865 static bool
866 set_local (cgraph_node *node, void *data)
868 node->local.local = data != NULL;
869 return false;
872 /* TREE_ADDRESSABLE of NODE to true.
873 Helper for call_for_symbol_thunks_and_aliases. */
875 static bool
876 set_addressable (varpool_node *node, void *)
878 TREE_ADDRESSABLE (node->decl) = 1;
879 return false;
882 /* Clear DECL_RTL of NODE.
883 Helper for call_for_symbol_thunks_and_aliases. */
885 static bool
886 clear_decl_rtl (symtab_node *node, void *)
888 SET_DECL_RTL (node->decl, NULL);
889 return false;
892 /* Redirect all callers of N and its aliases to TO. Remove aliases if
893 possible. Return number of redirections made. */
895 static int
896 redirect_all_callers (cgraph_node *n, cgraph_node *to)
898 int nredirected = 0;
899 ipa_ref *ref;
900 cgraph_edge *e = n->callers;
902 while (e)
904 /* Redirecting thunks to interposable symbols or symbols in other sections
905 may not be supported by target output code. Play safe for now and
906 punt on redirection. */
907 if (!e->caller->thunk.thunk_p)
909 struct cgraph_edge *nexte = e->next_caller;
910 e->redirect_callee (to);
911 e = nexte;
912 nredirected++;
914 else
915 e = e->next_callee;
917 for (unsigned i = 0; n->iterate_direct_aliases (i, ref);)
919 bool removed = false;
920 cgraph_node *n_alias = dyn_cast <cgraph_node *> (ref->referring);
922 if ((DECL_COMDAT_GROUP (n->decl)
923 && (DECL_COMDAT_GROUP (n->decl)
924 == DECL_COMDAT_GROUP (n_alias->decl)))
925 || (n_alias->get_availability () > AVAIL_INTERPOSABLE
926 && n->get_availability () > AVAIL_INTERPOSABLE))
928 nredirected += redirect_all_callers (n_alias, to);
929 if (n_alias->can_remove_if_no_direct_calls_p ()
930 && !n_alias->call_for_symbol_and_aliases (cgraph_node::has_thunk_p,
931 NULL, true)
932 && !n_alias->has_aliases_p ())
933 n_alias->remove ();
935 if (!removed)
936 i++;
938 return nredirected;
941 /* Merges instance with an ALIAS_ITEM, where alias, thunk or redirection can
942 be applied. */
944 bool
945 sem_function::merge (sem_item *alias_item)
947 gcc_assert (alias_item->type == FUNC);
949 sem_function *alias_func = static_cast<sem_function *> (alias_item);
951 cgraph_node *original = get_node ();
952 cgraph_node *local_original = NULL;
953 cgraph_node *alias = alias_func->get_node ();
955 bool create_wrapper = false;
956 bool create_alias = false;
957 bool redirect_callers = false;
958 bool remove = false;
960 bool original_discardable = false;
961 bool original_discarded = false;
963 bool original_address_matters = original->address_matters_p ();
964 bool alias_address_matters = alias->address_matters_p ();
966 if (DECL_EXTERNAL (alias->decl))
968 if (dump_file)
969 fprintf (dump_file, "Not unifying; alias is external.\n\n");
970 return false;
973 if (DECL_NO_INLINE_WARNING_P (original->decl)
974 != DECL_NO_INLINE_WARNING_P (alias->decl))
976 if (dump_file)
977 fprintf (dump_file,
978 "Not unifying; "
979 "DECL_NO_INLINE_WARNING mismatch.\n\n");
980 return false;
983 /* Do not attempt to mix functions from different user sections;
984 we do not know what user intends with those. */
985 if (((DECL_SECTION_NAME (original->decl) && !original->implicit_section)
986 || (DECL_SECTION_NAME (alias->decl) && !alias->implicit_section))
987 && DECL_SECTION_NAME (original->decl) != DECL_SECTION_NAME (alias->decl))
989 if (dump_file)
990 fprintf (dump_file,
991 "Not unifying; "
992 "original and alias are in different sections.\n\n");
993 return false;
996 /* See if original is in a section that can be discarded if the main
997 symbol is not used. */
999 if (original->can_be_discarded_p ())
1000 original_discardable = true;
1001 /* Also consider case where we have resolution info and we know that
1002 original's definition is not going to be used. In this case we can not
1003 create alias to original. */
1004 if (node->resolution != LDPR_UNKNOWN
1005 && !decl_binds_to_current_def_p (node->decl))
1006 original_discardable = original_discarded = true;
1008 /* Creating a symtab alias is the optimal way to merge.
1009 It however can not be used in the following cases:
1011 1) if ORIGINAL and ALIAS may be possibly compared for address equality.
1012 2) if ORIGINAL is in a section that may be discarded by linker or if
1013 it is an external functions where we can not create an alias
1014 (ORIGINAL_DISCARDABLE)
1015 3) if target do not support symbol aliases.
1016 4) original and alias lie in different comdat groups.
1018 If we can not produce alias, we will turn ALIAS into WRAPPER of ORIGINAL
1019 and/or redirect all callers from ALIAS to ORIGINAL. */
1020 if ((original_address_matters && alias_address_matters)
1021 || (original_discardable
1022 && (!DECL_COMDAT_GROUP (alias->decl)
1023 || (DECL_COMDAT_GROUP (alias->decl)
1024 != DECL_COMDAT_GROUP (original->decl))))
1025 || original_discarded
1026 || !sem_item::target_supports_symbol_aliases_p ()
1027 || DECL_COMDAT_GROUP (alias->decl) != DECL_COMDAT_GROUP (original->decl))
1029 /* First see if we can produce wrapper. */
1031 /* Do not turn function in one comdat group into wrapper to another
1032 comdat group. Other compiler producing the body of the
1033 another comdat group may make opossite decision and with unfortunate
1034 linker choices this may close a loop. */
1035 if (DECL_COMDAT_GROUP (original->decl) && DECL_COMDAT_GROUP (alias->decl)
1036 && (DECL_COMDAT_GROUP (alias->decl)
1037 != DECL_COMDAT_GROUP (original->decl)))
1039 if (dump_file)
1040 fprintf (dump_file,
1041 "Wrapper cannot be created because of COMDAT\n");
1043 else if (DECL_STATIC_CHAIN (alias->decl))
1045 if (dump_file)
1046 fprintf (dump_file,
1047 "Can not create wrapper of nested functions.\n");
1049 /* TODO: We can also deal with variadic functions never calling
1050 VA_START. */
1051 else if (stdarg_p (TREE_TYPE (alias->decl)))
1053 if (dump_file)
1054 fprintf (dump_file,
1055 "can not create wrapper of stdarg function.\n");
1057 else if (inline_summaries
1058 && inline_summaries->get (alias)->self_size <= 2)
1060 if (dump_file)
1061 fprintf (dump_file, "Wrapper creation is not "
1062 "profitable (function is too small).\n");
1064 /* If user paid attention to mark function noinline, assume it is
1065 somewhat special and do not try to turn it into a wrapper that can
1066 not be undone by inliner. */
1067 else if (lookup_attribute ("noinline", DECL_ATTRIBUTES (alias->decl)))
1069 if (dump_file)
1070 fprintf (dump_file, "Wrappers are not created for noinline.\n");
1072 else
1073 create_wrapper = true;
1075 /* We can redirect local calls in the case both alias and orignal
1076 are not interposable. */
1077 redirect_callers
1078 = alias->get_availability () > AVAIL_INTERPOSABLE
1079 && original->get_availability () > AVAIL_INTERPOSABLE
1080 && !alias->instrumented_version;
1082 if (!redirect_callers && !create_wrapper)
1084 if (dump_file)
1085 fprintf (dump_file, "Not unifying; can not redirect callers nor "
1086 "produce wrapper\n\n");
1087 return false;
1090 /* Work out the symbol the wrapper should call.
1091 If ORIGINAL is interposable, we need to call a local alias.
1092 Also produce local alias (if possible) as an optimization.
1094 Local aliases can not be created inside comdat groups because that
1095 prevents inlining. */
1096 if (!original_discardable && !original->get_comdat_group ())
1098 local_original
1099 = dyn_cast <cgraph_node *> (original->noninterposable_alias ());
1100 if (!local_original
1101 && original->get_availability () > AVAIL_INTERPOSABLE)
1102 local_original = original;
1104 /* If we can not use local alias, fallback to the original
1105 when possible. */
1106 else if (original->get_availability () > AVAIL_INTERPOSABLE)
1107 local_original = original;
1109 /* If original is COMDAT local, we can not really redirect calls outside
1110 of its comdat group to it. */
1111 if (original->comdat_local_p ())
1112 redirect_callers = false;
1113 if (!local_original)
1115 if (dump_file)
1116 fprintf (dump_file, "Not unifying; "
1117 "can not produce local alias.\n\n");
1118 return false;
1121 if (!redirect_callers && !create_wrapper)
1123 if (dump_file)
1124 fprintf (dump_file, "Not unifying; "
1125 "can not redirect callers nor produce a wrapper\n\n");
1126 return false;
1128 if (!create_wrapper
1129 && !alias->call_for_symbol_and_aliases (cgraph_node::has_thunk_p,
1130 NULL, true)
1131 && !alias->can_remove_if_no_direct_calls_p ())
1133 if (dump_file)
1134 fprintf (dump_file, "Not unifying; can not make wrapper and "
1135 "function has other uses than direct calls\n\n");
1136 return false;
1139 else
1140 create_alias = true;
1142 if (redirect_callers)
1144 int nredirected = redirect_all_callers (alias, local_original);
1146 if (nredirected)
1148 alias->icf_merged = true;
1149 local_original->icf_merged = true;
1151 if (dump_file && nredirected)
1152 fprintf (dump_file, "%i local calls have been "
1153 "redirected.\n", nredirected);
1156 /* If all callers was redirected, do not produce wrapper. */
1157 if (alias->can_remove_if_no_direct_calls_p ()
1158 && !alias->has_aliases_p ())
1160 create_wrapper = false;
1161 remove = true;
1163 gcc_assert (!create_alias);
1165 else if (create_alias)
1167 alias->icf_merged = true;
1169 /* Remove the function's body. */
1170 ipa_merge_profiles (original, alias);
1171 alias->release_body (true);
1172 alias->reset ();
1173 /* Notice global symbol possibly produced RTL. */
1174 ((symtab_node *)alias)->call_for_symbol_and_aliases (clear_decl_rtl,
1175 NULL, true);
1177 /* Create the alias. */
1178 cgraph_node::create_alias (alias_func->decl, decl);
1179 alias->resolve_alias (original);
1181 original->call_for_symbol_thunks_and_aliases
1182 (set_local, (void *)(size_t) original->local_p (), true);
1184 if (dump_file)
1185 fprintf (dump_file, "Unified; Function alias has been created.\n\n");
1187 if (create_wrapper)
1189 gcc_assert (!create_alias);
1190 alias->icf_merged = true;
1191 local_original->icf_merged = true;
1193 ipa_merge_profiles (local_original, alias, true);
1194 alias->create_wrapper (local_original);
1196 if (dump_file)
1197 fprintf (dump_file, "Unified; Wrapper has been created.\n\n");
1200 /* It's possible that redirection can hit thunks that block
1201 redirection opportunities. */
1202 gcc_assert (alias->icf_merged || remove || redirect_callers);
1203 original->icf_merged = true;
1205 /* Inform the inliner about cross-module merging. */
1206 if ((original->lto_file_data || alias->lto_file_data)
1207 && original->lto_file_data != alias->lto_file_data)
1208 local_original->merged = original->merged = true;
1210 if (remove)
1212 ipa_merge_profiles (original, alias);
1213 alias->release_body ();
1214 alias->reset ();
1215 alias->body_removed = true;
1216 alias->icf_merged = true;
1217 if (dump_file)
1218 fprintf (dump_file, "Unified; Function body was removed.\n");
1221 return true;
1224 /* Semantic item initialization function. */
1226 void
1227 sem_function::init (void)
1229 if (in_lto_p)
1230 get_node ()->get_untransformed_body ();
1232 tree fndecl = node->decl;
1233 function *func = DECL_STRUCT_FUNCTION (fndecl);
1235 gcc_assert (func);
1236 gcc_assert (SSANAMES (func));
1238 ssa_names_size = SSANAMES (func)->length ();
1239 node = node;
1241 decl = fndecl;
1242 region_tree = func->eh->region_tree;
1244 /* iterating all function arguments. */
1245 arg_count = count_formal_params (fndecl);
1247 edge_count = n_edges_for_fn (func);
1248 cfg_checksum = coverage_compute_cfg_checksum (func);
1250 inchash::hash hstate;
1252 basic_block bb;
1253 FOR_EACH_BB_FN (bb, func)
1255 unsigned nondbg_stmt_count = 0;
1257 edge e;
1258 for (edge_iterator ei = ei_start (bb->preds); ei_cond (ei, &e);
1259 ei_next (&ei))
1260 cfg_checksum = iterative_hash_host_wide_int (e->flags,
1261 cfg_checksum);
1263 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
1264 gsi_next (&gsi))
1266 gimple stmt = gsi_stmt (gsi);
1268 if (gimple_code (stmt) != GIMPLE_DEBUG
1269 && gimple_code (stmt) != GIMPLE_PREDICT)
1271 hash_stmt (stmt, hstate);
1272 nondbg_stmt_count++;
1276 gcode_hash = hstate.end ();
1277 bb_sizes.safe_push (nondbg_stmt_count);
1279 /* Inserting basic block to hash table. */
1280 sem_bb *semantic_bb = new sem_bb (bb, nondbg_stmt_count,
1281 EDGE_COUNT (bb->preds)
1282 + EDGE_COUNT (bb->succs));
1284 bb_sorted.safe_push (semantic_bb);
1288 /* Accumulate to HSTATE a hash of expression EXP.
1289 Identical to inchash::add_expr, but guaranteed to be stable across LTO
1290 and DECL equality classes. */
1292 void
1293 sem_item::add_expr (const_tree exp, inchash::hash &hstate)
1295 if (exp == NULL_TREE)
1297 hstate.merge_hash (0);
1298 return;
1301 /* Handled component can be matched in a cureful way proving equivalence
1302 even if they syntactically differ. Just skip them. */
1303 STRIP_NOPS (exp);
1304 while (handled_component_p (exp))
1305 exp = TREE_OPERAND (exp, 0);
1307 enum tree_code code = TREE_CODE (exp);
1308 hstate.add_int (code);
1310 switch (code)
1312 /* Use inchash::add_expr for everything that is LTO stable. */
1313 case VOID_CST:
1314 case INTEGER_CST:
1315 case REAL_CST:
1316 case FIXED_CST:
1317 case STRING_CST:
1318 case COMPLEX_CST:
1319 case VECTOR_CST:
1320 inchash::add_expr (exp, hstate);
1321 break;
1322 case CONSTRUCTOR:
1324 unsigned HOST_WIDE_INT idx;
1325 tree value;
1327 hstate.add_wide_int (int_size_in_bytes (TREE_TYPE (exp)));
1329 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, value)
1330 if (value)
1331 add_expr (value, hstate);
1332 break;
1334 case ADDR_EXPR:
1335 case FDESC_EXPR:
1336 add_expr (get_base_address (TREE_OPERAND (exp, 0)), hstate);
1337 break;
1338 case SSA_NAME:
1339 case VAR_DECL:
1340 case CONST_DECL:
1341 case PARM_DECL:
1342 hstate.add_wide_int (int_size_in_bytes (TREE_TYPE (exp)));
1343 break;
1344 case MEM_REF:
1345 case POINTER_PLUS_EXPR:
1346 case MINUS_EXPR:
1347 case RANGE_EXPR:
1348 add_expr (TREE_OPERAND (exp, 0), hstate);
1349 add_expr (TREE_OPERAND (exp, 1), hstate);
1350 break;
1351 case PLUS_EXPR:
1353 inchash::hash one, two;
1354 add_expr (TREE_OPERAND (exp, 0), one);
1355 add_expr (TREE_OPERAND (exp, 1), two);
1356 hstate.add_commutative (one, two);
1358 break;
1359 CASE_CONVERT:
1360 hstate.add_wide_int (int_size_in_bytes (TREE_TYPE (exp)));
1361 return add_expr (TREE_OPERAND (exp, 0), hstate);
1362 default:
1363 break;
1367 /* Accumulate to HSTATE a hash of type t.
1368 TYpes that may end up being compatible after LTO type merging needs to have
1369 the same hash. */
1371 void
1372 sem_item::add_type (const_tree type, inchash::hash &hstate)
1374 if (type == NULL_TREE)
1376 hstate.merge_hash (0);
1377 return;
1380 type = TYPE_MAIN_VARIANT (type);
1381 if (TYPE_CANONICAL (type))
1382 type = TYPE_CANONICAL (type);
1384 if (!AGGREGATE_TYPE_P (type))
1385 hstate.add_int (TYPE_MODE (type));
1387 if (TREE_CODE (type) == COMPLEX_TYPE)
1389 hstate.add_int (COMPLEX_TYPE);
1390 sem_item::add_type (TREE_TYPE (type), hstate);
1392 else if (INTEGRAL_TYPE_P (type))
1394 hstate.add_int (INTEGER_TYPE);
1395 hstate.add_flag (TYPE_UNSIGNED (type));
1396 hstate.add_int (TYPE_PRECISION (type));
1398 else if (VECTOR_TYPE_P (type))
1400 hstate.add_int (VECTOR_TYPE);
1401 hstate.add_int (TYPE_PRECISION (type));
1402 sem_item::add_type (TREE_TYPE (type), hstate);
1404 else if (TREE_CODE (type) == ARRAY_TYPE)
1406 hstate.add_int (ARRAY_TYPE);
1407 /* Do not hash size, so complete and incomplete types can match. */
1408 sem_item::add_type (TREE_TYPE (type), hstate);
1410 else if (RECORD_OR_UNION_TYPE_P (type))
1412 hashval_t *val = optimizer->m_type_hash_cache.get (type);
1414 if (!val)
1416 inchash::hash hstate2;
1417 unsigned nf;
1418 tree f;
1419 hashval_t hash;
1421 hstate2.add_int (RECORD_TYPE);
1422 gcc_assert (COMPLETE_TYPE_P (type));
1424 for (f = TYPE_FIELDS (type), nf = 0; f; f = TREE_CHAIN (f))
1425 if (TREE_CODE (f) == FIELD_DECL)
1427 add_type (TREE_TYPE (f), hstate2);
1428 nf++;
1431 hstate2.add_int (nf);
1432 hash = hstate2.end ();
1433 hstate.add_wide_int (hash);
1434 optimizer->m_type_hash_cache.put (type, hash);
1436 else
1437 hstate.add_wide_int (*val);
1441 /* Improve accumulated hash for HSTATE based on a gimple statement STMT. */
1443 void
1444 sem_function::hash_stmt (gimple stmt, inchash::hash &hstate)
1446 enum gimple_code code = gimple_code (stmt);
1448 hstate.add_int (code);
1450 switch (code)
1452 case GIMPLE_SWITCH:
1453 add_expr (gimple_switch_index (as_a <gswitch *> (stmt)), hstate);
1454 break;
1455 case GIMPLE_ASSIGN:
1456 hstate.add_int (gimple_assign_rhs_code (stmt));
1457 if (commutative_tree_code (gimple_assign_rhs_code (stmt))
1458 || commutative_ternary_tree_code (gimple_assign_rhs_code (stmt)))
1460 inchash::hash one, two;
1462 add_expr (gimple_assign_rhs1 (stmt), one);
1463 add_type (TREE_TYPE (gimple_assign_rhs1 (stmt)), one);
1464 add_expr (gimple_assign_rhs2 (stmt), two);
1465 hstate.add_commutative (one, two);
1466 if (commutative_ternary_tree_code (gimple_assign_rhs_code (stmt)))
1468 add_expr (gimple_assign_rhs3 (stmt), hstate);
1469 add_type (TREE_TYPE (gimple_assign_rhs3 (stmt)), hstate);
1471 add_expr (gimple_assign_lhs (stmt), hstate);
1472 add_type (TREE_TYPE (gimple_assign_lhs (stmt)), two);
1473 break;
1475 /* ... fall through ... */
1476 case GIMPLE_CALL:
1477 case GIMPLE_ASM:
1478 case GIMPLE_COND:
1479 case GIMPLE_GOTO:
1480 case GIMPLE_RETURN:
1481 /* All these statements are equivalent if their operands are. */
1482 for (unsigned i = 0; i < gimple_num_ops (stmt); ++i)
1484 add_expr (gimple_op (stmt, i), hstate);
1485 if (gimple_op (stmt, i))
1486 add_type (TREE_TYPE (gimple_op (stmt, i)), hstate);
1488 default:
1489 break;
1494 /* Return true if polymorphic comparison must be processed. */
1496 bool
1497 sem_function::compare_polymorphic_p (void)
1499 struct cgraph_edge *e;
1501 if (!opt_for_fn (get_node ()->decl, flag_devirtualize))
1502 return false;
1503 if (get_node ()->indirect_calls != NULL)
1504 return true;
1505 /* TODO: We can do simple propagation determining what calls may lead to
1506 a polymorphic call. */
1507 for (e = get_node ()->callees; e; e = e->next_callee)
1508 if (e->callee->definition
1509 && opt_for_fn (e->callee->decl, flag_devirtualize))
1510 return true;
1511 return false;
1514 /* For a given call graph NODE, the function constructs new
1515 semantic function item. */
1517 sem_function *
1518 sem_function::parse (cgraph_node *node, bitmap_obstack *stack)
1520 tree fndecl = node->decl;
1521 function *func = DECL_STRUCT_FUNCTION (fndecl);
1523 /* TODO: add support for thunks. */
1525 if (!func || !node->has_gimple_body_p ())
1526 return NULL;
1528 if (lookup_attribute_by_prefix ("omp ", DECL_ATTRIBUTES (node->decl)) != NULL)
1529 return NULL;
1531 /* PR ipa/70306. */
1532 if (DECL_STATIC_CONSTRUCTOR (node->decl)
1533 || DECL_STATIC_DESTRUCTOR (node->decl))
1534 return NULL;
1536 sem_function *f = new sem_function (node, 0, stack);
1538 f->init ();
1540 return f;
1543 /* For given basic blocks BB1 and BB2 (from functions FUNC1 and FUNC),
1544 return true if phi nodes are semantically equivalent in these blocks . */
1546 bool
1547 sem_function::compare_phi_node (basic_block bb1, basic_block bb2)
1549 gphi_iterator si1, si2;
1550 gphi *phi1, *phi2;
1551 unsigned size1, size2, i;
1552 tree t1, t2;
1553 edge e1, e2;
1555 gcc_assert (bb1 != NULL);
1556 gcc_assert (bb2 != NULL);
1558 si2 = gsi_start_phis (bb2);
1559 for (si1 = gsi_start_phis (bb1); !gsi_end_p (si1);
1560 gsi_next (&si1))
1562 gsi_next_nonvirtual_phi (&si1);
1563 gsi_next_nonvirtual_phi (&si2);
1565 if (gsi_end_p (si1) && gsi_end_p (si2))
1566 break;
1568 if (gsi_end_p (si1) || gsi_end_p (si2))
1569 return return_false();
1571 phi1 = si1.phi ();
1572 phi2 = si2.phi ();
1574 tree phi_result1 = gimple_phi_result (phi1);
1575 tree phi_result2 = gimple_phi_result (phi2);
1577 if (!m_checker->compare_operand (phi_result1, phi_result2))
1578 return return_false_with_msg ("PHI results are different");
1580 size1 = gimple_phi_num_args (phi1);
1581 size2 = gimple_phi_num_args (phi2);
1583 if (size1 != size2)
1584 return return_false ();
1586 for (i = 0; i < size1; ++i)
1588 t1 = gimple_phi_arg (phi1, i)->def;
1589 t2 = gimple_phi_arg (phi2, i)->def;
1591 if (!m_checker->compare_operand (t1, t2))
1592 return return_false ();
1594 e1 = gimple_phi_arg_edge (phi1, i);
1595 e2 = gimple_phi_arg_edge (phi2, i);
1597 if (!m_checker->compare_edge (e1, e2))
1598 return return_false ();
1601 gsi_next (&si2);
1604 return true;
1607 /* Returns true if tree T can be compared as a handled component. */
1609 bool
1610 sem_function::icf_handled_component_p (tree t)
1612 tree_code tc = TREE_CODE (t);
1614 return ((handled_component_p (t))
1615 || tc == ADDR_EXPR || tc == MEM_REF || tc == REALPART_EXPR
1616 || tc == IMAGPART_EXPR || tc == OBJ_TYPE_REF);
1619 /* Basic blocks dictionary BB_DICT returns true if SOURCE index BB
1620 corresponds to TARGET. */
1622 bool
1623 sem_function::bb_dict_test (vec<int> *bb_dict, int source, int target)
1625 source++;
1626 target++;
1628 if (bb_dict->length () <= (unsigned)source)
1629 bb_dict->safe_grow_cleared (source + 1);
1631 if ((*bb_dict)[source] == 0)
1633 (*bb_dict)[source] = target;
1634 return true;
1636 else
1637 return (*bb_dict)[source] == target;
1641 /* Semantic variable constructor that uses STACK as bitmap memory stack. */
1643 sem_variable::sem_variable (bitmap_obstack *stack): sem_item (VAR, stack)
1647 /* Constructor based on varpool node _NODE with computed hash _HASH.
1648 Bitmap STACK is used for memory allocation. */
1650 sem_variable::sem_variable (varpool_node *node, hashval_t _hash,
1651 bitmap_obstack *stack): sem_item(VAR,
1652 node, _hash, stack)
1654 gcc_checking_assert (node);
1655 gcc_checking_assert (get_node ());
1658 /* Fast equality function based on knowledge known in WPA. */
1660 bool
1661 sem_variable::equals_wpa (sem_item *item,
1662 hash_map <symtab_node *, sem_item *> &ignored_nodes)
1664 gcc_assert (item->type == VAR);
1666 if (node->num_references () != item->node->num_references ())
1667 return return_false_with_msg ("different number of references");
1669 if (DECL_TLS_MODEL (decl) || DECL_TLS_MODEL (item->decl))
1670 return return_false_with_msg ("TLS model");
1672 if (DECL_ALIGN (decl) != DECL_ALIGN (item->decl))
1673 return return_false_with_msg ("alignment mismatch");
1675 if (DECL_VIRTUAL_P (decl) != DECL_VIRTUAL_P (item->decl))
1676 return return_false_with_msg ("Virtual flag mismatch");
1678 if (DECL_SIZE (decl) != DECL_SIZE (item->decl)
1679 && ((!DECL_SIZE (decl) || !DECL_SIZE (item->decl))
1680 || !operand_equal_p (DECL_SIZE (decl),
1681 DECL_SIZE (item->decl), OEP_ONLY_CONST)))
1682 return return_false_with_msg ("size mismatch");
1684 /* Do not attempt to mix data from different user sections;
1685 we do not know what user intends with those. */
1686 if (((DECL_SECTION_NAME (decl) && !node->implicit_section)
1687 || (DECL_SECTION_NAME (item->decl) && !item->node->implicit_section))
1688 && DECL_SECTION_NAME (decl) != DECL_SECTION_NAME (item->decl))
1689 return return_false_with_msg ("user section mismatch");
1691 if (DECL_IN_TEXT_SECTION (decl) != DECL_IN_TEXT_SECTION (item->decl))
1692 return return_false_with_msg ("text section");
1694 ipa_ref *ref = NULL, *ref2 = NULL;
1695 for (unsigned i = 0; node->iterate_reference (i, ref); i++)
1697 item->node->iterate_reference (i, ref2);
1699 if (!compare_cgraph_references (ignored_nodes,
1700 ref->referred, ref2->referred,
1701 ref->address_matters_p ()))
1702 return false;
1704 /* When matching virtual tables, be sure to also match information
1705 relevant for polymorphic call analysis. */
1706 if (DECL_VIRTUAL_P (decl) || DECL_VIRTUAL_P (item->decl))
1708 if (DECL_VIRTUAL_P (ref->referred->decl)
1709 != DECL_VIRTUAL_P (ref2->referred->decl))
1710 return return_false_with_msg ("virtual flag mismatch");
1711 if (DECL_VIRTUAL_P (ref->referred->decl)
1712 && is_a <cgraph_node *> (ref->referred)
1713 && (DECL_FINAL_P (ref->referred->decl)
1714 != DECL_FINAL_P (ref2->referred->decl)))
1715 return return_false_with_msg ("final flag mismatch");
1719 return true;
1722 /* Returns true if the item equals to ITEM given as argument. */
1724 /* Returns true if the item equals to ITEM given as argument. */
1726 bool
1727 sem_variable::equals (sem_item *item,
1728 hash_map <symtab_node *, sem_item *> &)
1730 gcc_assert (item->type == VAR);
1731 bool ret;
1733 if (DECL_INITIAL (decl) == error_mark_node && in_lto_p)
1734 dyn_cast <varpool_node *>(node)->get_constructor ();
1735 if (DECL_INITIAL (item->decl) == error_mark_node && in_lto_p)
1736 dyn_cast <varpool_node *>(item->node)->get_constructor ();
1738 /* As seen in PR ipa/65303 we have to compare variables types. */
1739 if (!func_checker::compatible_types_p (TREE_TYPE (decl),
1740 TREE_TYPE (item->decl)))
1741 return return_false_with_msg ("variables types are different");
1743 ret = sem_variable::equals (DECL_INITIAL (decl),
1744 DECL_INITIAL (item->node->decl));
1745 if (dump_file && (dump_flags & TDF_DETAILS))
1746 fprintf (dump_file,
1747 "Equals called for vars:%s:%s (%u:%u) (%s:%s) with result: %s\n\n",
1748 xstrdup_for_dump (node->name()),
1749 xstrdup_for_dump (item->node->name ()),
1750 node->order, item->node->order,
1751 xstrdup_for_dump (node->asm_name ()),
1752 xstrdup_for_dump (item->node->asm_name ()), ret ? "true" : "false");
1754 return ret;
1757 /* Compares trees T1 and T2 for semantic equality. */
1759 bool
1760 sem_variable::equals (tree t1, tree t2)
1762 if (!t1 || !t2)
1763 return return_with_debug (t1 == t2);
1764 if (t1 == t2)
1765 return true;
1766 tree_code tc1 = TREE_CODE (t1);
1767 tree_code tc2 = TREE_CODE (t2);
1769 if (tc1 != tc2)
1770 return return_false_with_msg ("TREE_CODE mismatch");
1772 switch (tc1)
1774 case CONSTRUCTOR:
1776 vec<constructor_elt, va_gc> *v1, *v2;
1777 unsigned HOST_WIDE_INT idx;
1779 enum tree_code typecode = TREE_CODE (TREE_TYPE (t1));
1780 if (typecode != TREE_CODE (TREE_TYPE (t2)))
1781 return return_false_with_msg ("constructor type mismatch");
1783 if (typecode == ARRAY_TYPE)
1785 HOST_WIDE_INT size_1 = int_size_in_bytes (TREE_TYPE (t1));
1786 /* For arrays, check that the sizes all match. */
1787 if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2))
1788 || size_1 == -1
1789 || size_1 != int_size_in_bytes (TREE_TYPE (t2)))
1790 return return_false_with_msg ("constructor array size mismatch");
1792 else if (!func_checker::compatible_types_p (TREE_TYPE (t1),
1793 TREE_TYPE (t2)))
1794 return return_false_with_msg ("constructor type incompatible");
1796 v1 = CONSTRUCTOR_ELTS (t1);
1797 v2 = CONSTRUCTOR_ELTS (t2);
1798 if (vec_safe_length (v1) != vec_safe_length (v2))
1799 return return_false_with_msg ("constructor number of elts mismatch");
1801 for (idx = 0; idx < vec_safe_length (v1); ++idx)
1803 constructor_elt *c1 = &(*v1)[idx];
1804 constructor_elt *c2 = &(*v2)[idx];
1806 /* Check that each value is the same... */
1807 if (!sem_variable::equals (c1->value, c2->value))
1808 return false;
1809 /* ... and that they apply to the same fields! */
1810 if (!sem_variable::equals (c1->index, c2->index))
1811 return false;
1813 return true;
1815 case MEM_REF:
1817 tree x1 = TREE_OPERAND (t1, 0);
1818 tree x2 = TREE_OPERAND (t2, 0);
1819 tree y1 = TREE_OPERAND (t1, 1);
1820 tree y2 = TREE_OPERAND (t2, 1);
1822 if (!func_checker::compatible_types_p (TREE_TYPE (x1), TREE_TYPE (x2)))
1823 return return_false ();
1825 /* Type of the offset on MEM_REF does not matter. */
1826 return return_with_debug (sem_variable::equals (x1, x2)
1827 && wi::to_offset (y1)
1828 == wi::to_offset (y2));
1830 case ADDR_EXPR:
1831 case FDESC_EXPR:
1833 tree op1 = TREE_OPERAND (t1, 0);
1834 tree op2 = TREE_OPERAND (t2, 0);
1835 return sem_variable::equals (op1, op2);
1837 /* References to other vars/decls are compared using ipa-ref. */
1838 case FUNCTION_DECL:
1839 case VAR_DECL:
1840 if (decl_in_symtab_p (t1) && decl_in_symtab_p (t2))
1841 return true;
1842 return return_false_with_msg ("Declaration mismatch");
1843 case CONST_DECL:
1844 /* TODO: We can check CONST_DECL by its DECL_INITIAL, but for that we
1845 need to process its VAR/FUNCTION references without relying on ipa-ref
1846 compare. */
1847 case FIELD_DECL:
1848 case LABEL_DECL:
1849 return return_false_with_msg ("Declaration mismatch");
1850 case INTEGER_CST:
1851 /* Integer constants are the same only if the same width of type. */
1852 if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
1853 return return_false_with_msg ("INTEGER_CST precision mismatch");
1854 if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2)))
1855 return return_false_with_msg ("INTEGER_CST mode mismatch");
1856 return return_with_debug (tree_int_cst_equal (t1, t2));
1857 case STRING_CST:
1858 if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2)))
1859 return return_false_with_msg ("STRING_CST mode mismatch");
1860 if (TREE_STRING_LENGTH (t1) != TREE_STRING_LENGTH (t2))
1861 return return_false_with_msg ("STRING_CST length mismatch");
1862 if (memcmp (TREE_STRING_POINTER (t1), TREE_STRING_POINTER (t2),
1863 TREE_STRING_LENGTH (t1)))
1864 return return_false_with_msg ("STRING_CST mismatch");
1865 return true;
1866 case FIXED_CST:
1867 /* Fixed constants are the same only if the same width of type. */
1868 if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
1869 return return_false_with_msg ("FIXED_CST precision mismatch");
1871 return return_with_debug (FIXED_VALUES_IDENTICAL (TREE_FIXED_CST (t1),
1872 TREE_FIXED_CST (t2)));
1873 case COMPLEX_CST:
1874 return (sem_variable::equals (TREE_REALPART (t1), TREE_REALPART (t2))
1875 && sem_variable::equals (TREE_IMAGPART (t1), TREE_IMAGPART (t2)));
1876 case REAL_CST:
1877 /* Real constants are the same only if the same width of type. */
1878 if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
1879 return return_false_with_msg ("REAL_CST precision mismatch");
1880 return return_with_debug (REAL_VALUES_IDENTICAL (TREE_REAL_CST (t1),
1881 TREE_REAL_CST (t2)));
1882 case VECTOR_CST:
1884 unsigned i;
1886 if (VECTOR_CST_NELTS (t1) != VECTOR_CST_NELTS (t2))
1887 return return_false_with_msg ("VECTOR_CST nelts mismatch");
1889 for (i = 0; i < VECTOR_CST_NELTS (t1); ++i)
1890 if (!sem_variable::equals (VECTOR_CST_ELT (t1, i),
1891 VECTOR_CST_ELT (t2, i)))
1892 return 0;
1894 return 1;
1896 case ARRAY_REF:
1897 case ARRAY_RANGE_REF:
1899 tree x1 = TREE_OPERAND (t1, 0);
1900 tree x2 = TREE_OPERAND (t2, 0);
1901 tree y1 = TREE_OPERAND (t1, 1);
1902 tree y2 = TREE_OPERAND (t2, 1);
1904 if (!sem_variable::equals (x1, x2) || !sem_variable::equals (y1, y2))
1905 return false;
1906 if (!sem_variable::equals (array_ref_low_bound (t1),
1907 array_ref_low_bound (t2)))
1908 return false;
1909 if (!sem_variable::equals (array_ref_element_size (t1),
1910 array_ref_element_size (t2)))
1911 return false;
1912 return true;
1915 case COMPONENT_REF:
1916 case POINTER_PLUS_EXPR:
1917 case PLUS_EXPR:
1918 case MINUS_EXPR:
1919 case RANGE_EXPR:
1921 tree x1 = TREE_OPERAND (t1, 0);
1922 tree x2 = TREE_OPERAND (t2, 0);
1923 tree y1 = TREE_OPERAND (t1, 1);
1924 tree y2 = TREE_OPERAND (t2, 1);
1926 return sem_variable::equals (x1, x2) && sem_variable::equals (y1, y2);
1929 CASE_CONVERT:
1930 case VIEW_CONVERT_EXPR:
1931 if (!func_checker::compatible_types_p (TREE_TYPE (t1), TREE_TYPE (t2)))
1932 return return_false ();
1933 return sem_variable::equals (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
1934 case ERROR_MARK:
1935 return return_false_with_msg ("ERROR_MARK");
1936 default:
1937 return return_false_with_msg ("Unknown TREE code reached");
1941 /* Parser function that visits a varpool NODE. */
1943 sem_variable *
1944 sem_variable::parse (varpool_node *node, bitmap_obstack *stack)
1946 if (TREE_THIS_VOLATILE (node->decl) || DECL_HARD_REGISTER (node->decl)
1947 || node->alias)
1948 return NULL;
1950 sem_variable *v = new sem_variable (node, 0, stack);
1952 v->init ();
1954 return v;
1957 /* References independent hash function. */
1959 hashval_t
1960 sem_variable::get_hash (void)
1962 if (hash)
1963 return hash;
1965 /* All WPA streamed in symbols should have their hashes computed at compile
1966 time. At this point, the constructor may not be in memory at all.
1967 DECL_INITIAL (decl) would be error_mark_node in that case. */
1968 gcc_assert (!node->lto_file_data);
1969 tree ctor = DECL_INITIAL (decl);
1970 inchash::hash hstate;
1972 hstate.add_int (456346417);
1973 if (DECL_SIZE (decl) && tree_fits_shwi_p (DECL_SIZE (decl)))
1974 hstate.add_wide_int (tree_to_shwi (DECL_SIZE (decl)));
1975 add_expr (ctor, hstate);
1976 hash = hstate.end ();
1978 return hash;
1981 /* Merges instance with an ALIAS_ITEM, where alias, thunk or redirection can
1982 be applied. */
1984 bool
1985 sem_variable::merge (sem_item *alias_item)
1987 gcc_assert (alias_item->type == VAR);
1989 if (!sem_item::target_supports_symbol_aliases_p ())
1991 if (dump_file)
1992 fprintf (dump_file, "Not unifying; "
1993 "Symbol aliases are not supported by target\n\n");
1994 return false;
1997 if (DECL_EXTERNAL (alias_item->decl))
1999 if (dump_file)
2000 fprintf (dump_file, "Not unifying; alias is external.\n\n");
2001 return false;
2004 sem_variable *alias_var = static_cast<sem_variable *> (alias_item);
2006 varpool_node *original = get_node ();
2007 varpool_node *alias = alias_var->get_node ();
2008 bool original_discardable = false;
2010 bool original_address_matters = original->address_matters_p ();
2011 bool alias_address_matters = alias->address_matters_p ();
2013 /* See if original is in a section that can be discarded if the main
2014 symbol is not used.
2015 Also consider case where we have resolution info and we know that
2016 original's definition is not going to be used. In this case we can not
2017 create alias to original. */
2018 if (original->can_be_discarded_p ()
2019 || (node->resolution != LDPR_UNKNOWN
2020 && !decl_binds_to_current_def_p (node->decl)))
2021 original_discardable = true;
2023 gcc_assert (!TREE_ASM_WRITTEN (alias->decl));
2025 /* Constant pool machinery is not quite ready for aliases.
2026 TODO: varasm code contains logic for merging DECL_IN_CONSTANT_POOL.
2027 For LTO merging does not happen that is an important missing feature.
2028 We can enable merging with LTO if the DECL_IN_CONSTANT_POOL
2029 flag is dropped and non-local symbol name is assigned. */
2030 if (DECL_IN_CONSTANT_POOL (alias->decl)
2031 || DECL_IN_CONSTANT_POOL (original->decl))
2033 if (dump_file)
2034 fprintf (dump_file,
2035 "Not unifying; constant pool variables.\n\n");
2036 return false;
2039 /* Do not attempt to mix functions from different user sections;
2040 we do not know what user intends with those. */
2041 if (((DECL_SECTION_NAME (original->decl) && !original->implicit_section)
2042 || (DECL_SECTION_NAME (alias->decl) && !alias->implicit_section))
2043 && DECL_SECTION_NAME (original->decl) != DECL_SECTION_NAME (alias->decl))
2045 if (dump_file)
2046 fprintf (dump_file,
2047 "Not unifying; "
2048 "original and alias are in different sections.\n\n");
2049 return false;
2052 /* We can not merge if address comparsion metters. */
2053 if (original_address_matters && alias_address_matters
2054 && flag_merge_constants < 2)
2056 if (dump_file)
2057 fprintf (dump_file,
2058 "Not unifying; "
2059 "adress of original and alias may be compared.\n\n");
2060 return false;
2062 if (DECL_COMDAT_GROUP (original->decl) != DECL_COMDAT_GROUP (alias->decl))
2064 if (dump_file)
2065 fprintf (dump_file, "Not unifying; alias cannot be created; "
2066 "across comdat group boundary\n\n");
2068 return false;
2071 if (original_discardable)
2073 if (dump_file)
2074 fprintf (dump_file, "Not unifying; alias cannot be created; "
2075 "target is discardable\n\n");
2077 return false;
2079 else
2081 gcc_assert (!original->alias);
2082 gcc_assert (!alias->alias);
2084 alias->analyzed = false;
2086 DECL_INITIAL (alias->decl) = NULL;
2087 ((symtab_node *)alias)->call_for_symbol_and_aliases (clear_decl_rtl,
2088 NULL, true);
2089 alias->need_bounds_init = false;
2090 alias->remove_all_references ();
2091 if (TREE_ADDRESSABLE (alias->decl))
2092 original->call_for_symbol_and_aliases (set_addressable, NULL, true);
2094 varpool_node::create_alias (alias_var->decl, decl);
2095 alias->resolve_alias (original);
2097 if (dump_file)
2098 fprintf (dump_file, "Unified; Variable alias has been created.\n\n");
2100 return true;
2104 /* Dump symbol to FILE. */
2106 void
2107 sem_variable::dump_to_file (FILE *file)
2109 gcc_assert (file);
2111 print_node (file, "", decl, 0);
2112 fprintf (file, "\n\n");
2115 unsigned int sem_item_optimizer::class_id = 0;
2117 sem_item_optimizer::sem_item_optimizer (): worklist (0), m_classes (0),
2118 m_classes_count (0), m_cgraph_node_hooks (NULL), m_varpool_node_hooks (NULL)
2120 m_items.create (0);
2121 bitmap_obstack_initialize (&m_bmstack);
2124 sem_item_optimizer::~sem_item_optimizer ()
2126 for (unsigned int i = 0; i < m_items.length (); i++)
2127 delete m_items[i];
2129 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
2130 it != m_classes.end (); ++it)
2132 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
2133 delete (*it)->classes[i];
2135 (*it)->classes.release ();
2136 free (*it);
2139 m_items.release ();
2141 bitmap_obstack_release (&m_bmstack);
2144 /* Write IPA ICF summary for symbols. */
2146 void
2147 sem_item_optimizer::write_summary (void)
2149 unsigned int count = 0;
2151 output_block *ob = create_output_block (LTO_section_ipa_icf);
2152 lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
2153 ob->symbol = NULL;
2155 /* Calculate number of symbols to be serialized. */
2156 for (lto_symtab_encoder_iterator lsei = lsei_start_in_partition (encoder);
2157 !lsei_end_p (lsei);
2158 lsei_next_in_partition (&lsei))
2160 symtab_node *node = lsei_node (lsei);
2162 if (m_symtab_node_map.get (node))
2163 count++;
2166 streamer_write_uhwi (ob, count);
2168 /* Process all of the symbols. */
2169 for (lto_symtab_encoder_iterator lsei = lsei_start_in_partition (encoder);
2170 !lsei_end_p (lsei);
2171 lsei_next_in_partition (&lsei))
2173 symtab_node *node = lsei_node (lsei);
2175 sem_item **item = m_symtab_node_map.get (node);
2177 if (item && *item)
2179 int node_ref = lto_symtab_encoder_encode (encoder, node);
2180 streamer_write_uhwi_stream (ob->main_stream, node_ref);
2182 streamer_write_uhwi (ob, (*item)->get_hash ());
2186 streamer_write_char_stream (ob->main_stream, 0);
2187 produce_asm (ob, NULL);
2188 destroy_output_block (ob);
2191 /* Reads a section from LTO stream file FILE_DATA. Input block for DATA
2192 contains LEN bytes. */
2194 void
2195 sem_item_optimizer::read_section (lto_file_decl_data *file_data,
2196 const char *data, size_t len)
2198 const lto_function_header *header =
2199 (const lto_function_header *) data;
2200 const int cfg_offset = sizeof (lto_function_header);
2201 const int main_offset = cfg_offset + header->cfg_size;
2202 const int string_offset = main_offset + header->main_size;
2203 data_in *data_in;
2204 unsigned int i;
2205 unsigned int count;
2207 lto_input_block ib_main ((const char *) data + main_offset, 0,
2208 header->main_size, file_data->mode_table);
2210 data_in =
2211 lto_data_in_create (file_data, (const char *) data + string_offset,
2212 header->string_size, vNULL);
2214 count = streamer_read_uhwi (&ib_main);
2216 for (i = 0; i < count; i++)
2218 unsigned int index;
2219 symtab_node *node;
2220 lto_symtab_encoder_t encoder;
2222 index = streamer_read_uhwi (&ib_main);
2223 encoder = file_data->symtab_node_encoder;
2224 node = lto_symtab_encoder_deref (encoder, index);
2226 hashval_t hash = streamer_read_uhwi (&ib_main);
2228 gcc_assert (node->definition);
2230 if (dump_file)
2231 fprintf (dump_file, "Symbol added:%s (tree: %p, uid:%u)\n",
2232 node->asm_name (), (void *) node->decl, node->order);
2234 if (is_a<cgraph_node *> (node))
2236 cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
2238 m_items.safe_push (new sem_function (cnode, hash, &m_bmstack));
2240 else
2242 varpool_node *vnode = dyn_cast <varpool_node *> (node);
2244 m_items.safe_push (new sem_variable (vnode, hash, &m_bmstack));
2248 lto_free_section_data (file_data, LTO_section_ipa_icf, NULL, data,
2249 len);
2250 lto_data_in_delete (data_in);
2253 /* Read IPA IPA ICF summary for symbols. */
2255 void
2256 sem_item_optimizer::read_summary (void)
2258 lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
2259 lto_file_decl_data *file_data;
2260 unsigned int j = 0;
2262 while ((file_data = file_data_vec[j++]))
2264 size_t len;
2265 const char *data = lto_get_section_data (file_data,
2266 LTO_section_ipa_icf, NULL, &len);
2268 if (data)
2269 read_section (file_data, data, len);
2273 /* Register callgraph and varpool hooks. */
2275 void
2276 sem_item_optimizer::register_hooks (void)
2278 if (!m_cgraph_node_hooks)
2279 m_cgraph_node_hooks = symtab->add_cgraph_removal_hook
2280 (&sem_item_optimizer::cgraph_removal_hook, this);
2282 if (!m_varpool_node_hooks)
2283 m_varpool_node_hooks = symtab->add_varpool_removal_hook
2284 (&sem_item_optimizer::varpool_removal_hook, this);
2287 /* Unregister callgraph and varpool hooks. */
2289 void
2290 sem_item_optimizer::unregister_hooks (void)
2292 if (m_cgraph_node_hooks)
2293 symtab->remove_cgraph_removal_hook (m_cgraph_node_hooks);
2295 if (m_varpool_node_hooks)
2296 symtab->remove_varpool_removal_hook (m_varpool_node_hooks);
2299 /* Adds a CLS to hashtable associated by hash value. */
2301 void
2302 sem_item_optimizer::add_class (congruence_class *cls)
2304 gcc_assert (cls->members.length ());
2306 congruence_class_group *group = get_group_by_hash (
2307 cls->members[0]->get_hash (),
2308 cls->members[0]->type);
2309 group->classes.safe_push (cls);
2312 /* Gets a congruence class group based on given HASH value and TYPE. */
2314 congruence_class_group *
2315 sem_item_optimizer::get_group_by_hash (hashval_t hash, sem_item_type type)
2317 congruence_class_group *item = XNEW (congruence_class_group);
2318 item->hash = hash;
2319 item->type = type;
2321 congruence_class_group **slot = m_classes.find_slot (item, INSERT);
2323 if (*slot)
2324 free (item);
2325 else
2327 item->classes.create (1);
2328 *slot = item;
2331 return *slot;
2334 /* Callgraph removal hook called for a NODE with a custom DATA. */
2336 void
2337 sem_item_optimizer::cgraph_removal_hook (cgraph_node *node, void *data)
2339 sem_item_optimizer *optimizer = (sem_item_optimizer *) data;
2340 optimizer->remove_symtab_node (node);
2343 /* Varpool removal hook called for a NODE with a custom DATA. */
2345 void
2346 sem_item_optimizer::varpool_removal_hook (varpool_node *node, void *data)
2348 sem_item_optimizer *optimizer = (sem_item_optimizer *) data;
2349 optimizer->remove_symtab_node (node);
2352 /* Remove symtab NODE triggered by symtab removal hooks. */
2354 void
2355 sem_item_optimizer::remove_symtab_node (symtab_node *node)
2357 gcc_assert (!m_classes.elements());
2359 m_removed_items_set.add (node);
2362 void
2363 sem_item_optimizer::remove_item (sem_item *item)
2365 if (m_symtab_node_map.get (item->node))
2366 m_symtab_node_map.remove (item->node);
2367 delete item;
2370 /* Removes all callgraph and varpool nodes that are marked by symtab
2371 as deleted. */
2373 void
2374 sem_item_optimizer::filter_removed_items (void)
2376 auto_vec <sem_item *> filtered;
2378 for (unsigned int i = 0; i < m_items.length(); i++)
2380 sem_item *item = m_items[i];
2382 if (m_removed_items_set.contains (item->node))
2384 remove_item (item);
2385 continue;
2388 if (item->type == FUNC)
2390 cgraph_node *cnode = static_cast <sem_function *>(item)->get_node ();
2392 if (in_lto_p && (cnode->alias || cnode->body_removed))
2393 remove_item (item);
2394 else
2395 filtered.safe_push (item);
2397 else /* VAR. */
2399 if (!flag_ipa_icf_variables)
2400 remove_item (item);
2401 else
2403 /* Filter out non-readonly variables. */
2404 tree decl = item->decl;
2405 if (TREE_READONLY (decl))
2406 filtered.safe_push (item);
2407 else
2408 remove_item (item);
2413 /* Clean-up of released semantic items. */
2415 m_items.release ();
2416 for (unsigned int i = 0; i < filtered.length(); i++)
2417 m_items.safe_push (filtered[i]);
2420 /* Optimizer entry point which returns true in case it processes
2421 a merge operation. True is returned if there's a merge operation
2422 processed. */
2424 bool
2425 sem_item_optimizer::execute (void)
2427 filter_removed_items ();
2428 unregister_hooks ();
2430 build_graph ();
2431 update_hash_by_addr_refs ();
2432 build_hash_based_classes ();
2434 if (dump_file)
2435 fprintf (dump_file, "Dump after hash based groups\n");
2436 dump_cong_classes ();
2438 for (unsigned int i = 0; i < m_items.length(); i++)
2439 m_items[i]->init_wpa ();
2441 subdivide_classes_by_equality (true);
2443 if (dump_file)
2444 fprintf (dump_file, "Dump after WPA based types groups\n");
2446 dump_cong_classes ();
2448 process_cong_reduction ();
2449 verify_classes ();
2451 if (dump_file)
2452 fprintf (dump_file, "Dump after callgraph-based congruence reduction\n");
2454 dump_cong_classes ();
2456 parse_nonsingleton_classes ();
2457 subdivide_classes_by_equality ();
2459 if (dump_file)
2460 fprintf (dump_file, "Dump after full equality comparison of groups\n");
2462 dump_cong_classes ();
2464 unsigned int prev_class_count = m_classes_count;
2466 process_cong_reduction ();
2467 dump_cong_classes ();
2468 verify_classes ();
2469 bool merged_p = merge_classes (prev_class_count);
2471 if (dump_file && (dump_flags & TDF_DETAILS))
2472 symtab_node::dump_table (dump_file);
2474 return merged_p;
2477 /* Function responsible for visiting all potential functions and
2478 read-only variables that can be merged. */
2480 void
2481 sem_item_optimizer::parse_funcs_and_vars (void)
2483 cgraph_node *cnode;
2485 if (flag_ipa_icf_functions)
2486 FOR_EACH_DEFINED_FUNCTION (cnode)
2488 sem_function *f = sem_function::parse (cnode, &m_bmstack);
2489 if (f)
2491 m_items.safe_push (f);
2492 m_symtab_node_map.put (cnode, f);
2494 if (dump_file)
2495 fprintf (dump_file, "Parsed function:%s\n", f->node->asm_name ());
2497 if (dump_file && (dump_flags & TDF_DETAILS))
2498 f->dump_to_file (dump_file);
2500 else if (dump_file)
2501 fprintf (dump_file, "Not parsed function:%s\n", cnode->asm_name ());
2504 varpool_node *vnode;
2506 if (flag_ipa_icf_variables)
2507 FOR_EACH_DEFINED_VARIABLE (vnode)
2509 sem_variable *v = sem_variable::parse (vnode, &m_bmstack);
2511 if (v)
2513 m_items.safe_push (v);
2514 m_symtab_node_map.put (vnode, v);
2519 /* Makes pairing between a congruence class CLS and semantic ITEM. */
2521 void
2522 sem_item_optimizer::add_item_to_class (congruence_class *cls, sem_item *item)
2524 item->index_in_class = cls->members.length ();
2525 cls->members.safe_push (item);
2526 item->cls = cls;
2529 /* For each semantic item, append hash values of references. */
2531 void
2532 sem_item_optimizer::update_hash_by_addr_refs ()
2534 /* First, append to hash sensitive references and class type if it need to
2535 be matched for ODR. */
2536 for (unsigned i = 0; i < m_items.length (); i++)
2538 m_items[i]->update_hash_by_addr_refs (m_symtab_node_map);
2539 if (m_items[i]->type == FUNC)
2541 cgraph_node *cnode = dyn_cast <cgraph_node *> (m_items[i]->node);
2543 if (TREE_CODE (TREE_TYPE (m_items[i]->decl)) == METHOD_TYPE
2544 && contains_polymorphic_type_p
2545 (method_class_type (TREE_TYPE (m_items[i]->decl)))
2546 && (DECL_CXX_CONSTRUCTOR_P (m_items[i]->decl)
2547 || ((ipa_node_params_sum == NULL
2548 || IPA_NODE_REF (cnode)->descriptors.is_empty ()
2549 || ipa_is_param_used (IPA_NODE_REF (cnode), 0))
2550 && static_cast<sem_function *> (m_items[i])
2551 ->compare_polymorphic_p ())))
2553 tree class_type
2554 = method_class_type (TREE_TYPE (m_items[i]->decl));
2555 inchash::hash hstate (m_items[i]->hash);
2557 if (TYPE_NAME (class_type)
2558 && DECL_ASSEMBLER_NAME_SET_P (TYPE_NAME (class_type)))
2559 hstate.add_wide_int
2560 (IDENTIFIER_HASH_VALUE
2561 (DECL_ASSEMBLER_NAME (TYPE_NAME (class_type))));
2563 m_items[i]->hash = hstate.end ();
2568 /* Once all symbols have enhanced hash value, we can append
2569 hash values of symbols that are seen by IPA ICF and are
2570 references by a semantic item. Newly computed values
2571 are saved to global_hash member variable. */
2572 for (unsigned i = 0; i < m_items.length (); i++)
2573 m_items[i]->update_hash_by_local_refs (m_symtab_node_map);
2575 /* Global hash value replace current hash values. */
2576 for (unsigned i = 0; i < m_items.length (); i++)
2577 m_items[i]->hash = m_items[i]->global_hash;
2580 /* Congruence classes are built by hash value. */
2582 void
2583 sem_item_optimizer::build_hash_based_classes (void)
2585 for (unsigned i = 0; i < m_items.length (); i++)
2587 sem_item *item = m_items[i];
2589 congruence_class_group *group = get_group_by_hash (item->hash,
2590 item->type);
2592 if (!group->classes.length ())
2594 m_classes_count++;
2595 group->classes.safe_push (new congruence_class (class_id++));
2598 add_item_to_class (group->classes[0], item);
2602 /* Build references according to call graph. */
2604 void
2605 sem_item_optimizer::build_graph (void)
2607 for (unsigned i = 0; i < m_items.length (); i++)
2609 sem_item *item = m_items[i];
2610 m_symtab_node_map.put (item->node, item);
2613 for (unsigned i = 0; i < m_items.length (); i++)
2615 sem_item *item = m_items[i];
2617 if (item->type == FUNC)
2619 cgraph_node *cnode = dyn_cast <cgraph_node *> (item->node);
2621 cgraph_edge *e = cnode->callees;
2622 while (e)
2624 sem_item **slot = m_symtab_node_map.get
2625 (e->callee->ultimate_alias_target ());
2626 if (slot)
2627 item->add_reference (*slot);
2629 e = e->next_callee;
2633 ipa_ref *ref = NULL;
2634 for (unsigned i = 0; item->node->iterate_reference (i, ref); i++)
2636 sem_item **slot = m_symtab_node_map.get
2637 (ref->referred->ultimate_alias_target ());
2638 if (slot)
2639 item->add_reference (*slot);
2644 /* Semantic items in classes having more than one element and initialized.
2645 In case of WPA, we load function body. */
2647 void
2648 sem_item_optimizer::parse_nonsingleton_classes (void)
2650 unsigned int init_called_count = 0;
2652 for (unsigned i = 0; i < m_items.length (); i++)
2653 if (m_items[i]->cls->members.length () > 1)
2655 m_items[i]->init ();
2656 init_called_count++;
2659 if (dump_file)
2660 fprintf (dump_file, "Init called for %u items (%.2f%%).\n", init_called_count,
2661 m_items.length () ? 100.0f * init_called_count / m_items.length (): 0.0f);
2664 /* Equality function for semantic items is used to subdivide existing
2665 classes. If IN_WPA, fast equality function is invoked. */
2667 void
2668 sem_item_optimizer::subdivide_classes_by_equality (bool in_wpa)
2670 for (hash_table <congruence_class_group_hash>::iterator it = m_classes.begin ();
2671 it != m_classes.end (); ++it)
2673 unsigned int class_count = (*it)->classes.length ();
2675 for (unsigned i = 0; i < class_count; i++)
2677 congruence_class *c = (*it)->classes [i];
2679 if (c->members.length() > 1)
2681 auto_vec <sem_item *> new_vector;
2683 sem_item *first = c->members[0];
2684 new_vector.safe_push (first);
2686 unsigned class_split_first = (*it)->classes.length ();
2688 for (unsigned j = 1; j < c->members.length (); j++)
2690 sem_item *item = c->members[j];
2692 bool equals = in_wpa ? first->equals_wpa (item,
2693 m_symtab_node_map) : first->equals (item, m_symtab_node_map);
2695 if (equals)
2696 new_vector.safe_push (item);
2697 else
2699 bool integrated = false;
2701 for (unsigned k = class_split_first; k < (*it)->classes.length (); k++)
2703 sem_item *x = (*it)->classes[k]->members[0];
2704 bool equals = in_wpa ? x->equals_wpa (item,
2705 m_symtab_node_map) : x->equals (item, m_symtab_node_map);
2707 if (equals)
2709 integrated = true;
2710 add_item_to_class ((*it)->classes[k], item);
2712 break;
2716 if (!integrated)
2718 congruence_class *c = new congruence_class (class_id++);
2719 m_classes_count++;
2720 add_item_to_class (c, item);
2722 (*it)->classes.safe_push (c);
2727 // we replace newly created new_vector for the class we've just splitted
2728 c->members.release ();
2729 c->members.create (new_vector.length ());
2731 for (unsigned int j = 0; j < new_vector.length (); j++)
2732 add_item_to_class (c, new_vector[j]);
2737 verify_classes ();
2740 /* Subdivide classes by address references that members of the class
2741 reference. Example can be a pair of functions that have an address
2742 taken from a function. If these addresses are different the class
2743 is split. */
2745 unsigned
2746 sem_item_optimizer::subdivide_classes_by_sensitive_refs ()
2748 unsigned newly_created_classes = 0;
2750 for (hash_table <congruence_class_group_hash>::iterator it = m_classes.begin ();
2751 it != m_classes.end (); ++it)
2753 unsigned int class_count = (*it)->classes.length ();
2754 auto_vec<congruence_class *> new_classes;
2756 for (unsigned i = 0; i < class_count; i++)
2758 congruence_class *c = (*it)->classes [i];
2760 if (c->members.length() > 1)
2762 hash_map <symbol_compare_collection *, vec <sem_item *>,
2763 symbol_compare_hashmap_traits> split_map;
2765 for (unsigned j = 0; j < c->members.length (); j++)
2767 sem_item *source_node = c->members[j];
2769 symbol_compare_collection *collection = new symbol_compare_collection (source_node->node);
2771 vec <sem_item *> *slot = &split_map.get_or_insert (collection);
2772 gcc_checking_assert (slot);
2774 slot->safe_push (source_node);
2777 /* If the map contains more than one key, we have to split the map
2778 appropriately. */
2779 if (split_map.elements () != 1)
2781 bool first_class = true;
2783 hash_map <symbol_compare_collection *, vec <sem_item *>,
2784 symbol_compare_hashmap_traits>::iterator it2 = split_map.begin ();
2785 for (; it2 != split_map.end (); ++it2)
2787 congruence_class *new_cls;
2788 new_cls = new congruence_class (class_id++);
2790 for (unsigned k = 0; k < (*it2).second.length (); k++)
2791 add_item_to_class (new_cls, (*it2).second[k]);
2793 worklist_push (new_cls);
2794 newly_created_classes++;
2796 if (first_class)
2798 (*it)->classes[i] = new_cls;
2799 first_class = false;
2801 else
2803 new_classes.safe_push (new_cls);
2804 m_classes_count++;
2811 for (unsigned i = 0; i < new_classes.length (); i++)
2812 (*it)->classes.safe_push (new_classes[i]);
2815 return newly_created_classes;
2818 /* Verify congruence classes if checking is enabled. */
2820 void
2821 sem_item_optimizer::verify_classes (void)
2823 #if ENABLE_CHECKING
2824 for (hash_table <congruence_class_group_hash>::iterator it = m_classes.begin ();
2825 it != m_classes.end (); ++it)
2827 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
2829 congruence_class *cls = (*it)->classes[i];
2831 gcc_checking_assert (cls);
2832 gcc_checking_assert (cls->members.length () > 0);
2834 for (unsigned int j = 0; j < cls->members.length (); j++)
2836 sem_item *item = cls->members[j];
2838 gcc_checking_assert (item);
2839 gcc_checking_assert (item->cls == cls);
2841 for (unsigned k = 0; k < item->usages.length (); k++)
2843 sem_usage_pair *usage = item->usages[k];
2844 gcc_checking_assert (usage->item->index_in_class <
2845 usage->item->cls->members.length ());
2850 #endif
2853 /* Disposes split map traverse function. CLS_PTR is pointer to congruence
2854 class, BSLOT is bitmap slot we want to release. DATA is mandatory,
2855 but unused argument. */
2857 bool
2858 sem_item_optimizer::release_split_map (congruence_class * const &,
2859 bitmap const &b, traverse_split_pair *)
2861 bitmap bmp = b;
2863 BITMAP_FREE (bmp);
2865 return true;
2868 /* Process split operation for a class given as pointer CLS_PTR,
2869 where bitmap B splits congruence class members. DATA is used
2870 as argument of split pair. */
2872 bool
2873 sem_item_optimizer::traverse_congruence_split (congruence_class * const &cls,
2874 bitmap const &b, traverse_split_pair *pair)
2876 sem_item_optimizer *optimizer = pair->optimizer;
2877 const congruence_class *splitter_cls = pair->cls;
2879 /* If counted bits are greater than zero and less than the number of members
2880 a group will be splitted. */
2881 unsigned popcount = bitmap_count_bits (b);
2883 if (popcount > 0 && popcount < cls->members.length ())
2885 congruence_class* newclasses[2] = { new congruence_class (class_id++), new congruence_class (class_id++) };
2887 for (unsigned int i = 0; i < cls->members.length (); i++)
2889 int target = bitmap_bit_p (b, i);
2890 congruence_class *tc = newclasses[target];
2892 add_item_to_class (tc, cls->members[i]);
2895 #ifdef ENABLE_CHECKING
2896 for (unsigned int i = 0; i < 2; i++)
2897 gcc_checking_assert (newclasses[i]->members.length ());
2898 #endif
2900 if (splitter_cls == cls)
2901 optimizer->splitter_class_removed = true;
2903 /* Remove old class from worklist if presented. */
2904 bool in_worklist = cls->in_worklist;
2906 if (in_worklist)
2907 cls->in_worklist = false;
2909 congruence_class_group g;
2910 g.hash = cls->members[0]->get_hash ();
2911 g.type = cls->members[0]->type;
2913 congruence_class_group *slot = optimizer->m_classes.find(&g);
2915 for (unsigned int i = 0; i < slot->classes.length (); i++)
2916 if (slot->classes[i] == cls)
2918 slot->classes.ordered_remove (i);
2919 break;
2922 /* New class will be inserted and integrated to work list. */
2923 for (unsigned int i = 0; i < 2; i++)
2924 optimizer->add_class (newclasses[i]);
2926 /* Two classes replace one, so that increment just by one. */
2927 optimizer->m_classes_count++;
2929 /* If OLD class was presented in the worklist, we remove the class
2930 and replace it will both newly created classes. */
2931 if (in_worklist)
2932 for (unsigned int i = 0; i < 2; i++)
2933 optimizer->worklist_push (newclasses[i]);
2934 else /* Just smaller class is inserted. */
2936 unsigned int smaller_index = newclasses[0]->members.length () <
2937 newclasses[1]->members.length () ?
2938 0 : 1;
2939 optimizer->worklist_push (newclasses[smaller_index]);
2942 if (dump_file && (dump_flags & TDF_DETAILS))
2944 fprintf (dump_file, " congruence class splitted:\n");
2945 cls->dump (dump_file, 4);
2947 fprintf (dump_file, " newly created groups:\n");
2948 for (unsigned int i = 0; i < 2; i++)
2949 newclasses[i]->dump (dump_file, 4);
2952 /* Release class if not presented in work list. */
2953 if (!in_worklist)
2954 delete cls;
2958 return true;
2961 /* Tests if a class CLS used as INDEXth splits any congruence classes.
2962 Bitmap stack BMSTACK is used for bitmap allocation. */
2964 void
2965 sem_item_optimizer::do_congruence_step_for_index (congruence_class *cls,
2966 unsigned int index)
2968 hash_map <congruence_class *, bitmap> split_map;
2970 for (unsigned int i = 0; i < cls->members.length (); i++)
2972 sem_item *item = cls->members[i];
2974 /* Iterate all usages that have INDEX as usage of the item. */
2975 for (unsigned int j = 0; j < item->usages.length (); j++)
2977 sem_usage_pair *usage = item->usages[j];
2979 if (usage->index != index)
2980 continue;
2982 bitmap *slot = split_map.get (usage->item->cls);
2983 bitmap b;
2985 if(!slot)
2987 b = BITMAP_ALLOC (&m_bmstack);
2988 split_map.put (usage->item->cls, b);
2990 else
2991 b = *slot;
2993 #if ENABLE_CHECKING
2994 gcc_checking_assert (usage->item->cls);
2995 gcc_checking_assert (usage->item->index_in_class <
2996 usage->item->cls->members.length ());
2997 #endif
2999 bitmap_set_bit (b, usage->item->index_in_class);
3003 traverse_split_pair pair;
3004 pair.optimizer = this;
3005 pair.cls = cls;
3007 splitter_class_removed = false;
3008 split_map.traverse
3009 <traverse_split_pair *, sem_item_optimizer::traverse_congruence_split> (&pair);
3011 /* Bitmap clean-up. */
3012 split_map.traverse
3013 <traverse_split_pair *, sem_item_optimizer::release_split_map> (NULL);
3016 /* Every usage of a congruence class CLS is a candidate that can split the
3017 collection of classes. Bitmap stack BMSTACK is used for bitmap
3018 allocation. */
3020 void
3021 sem_item_optimizer::do_congruence_step (congruence_class *cls)
3023 bitmap_iterator bi;
3024 unsigned int i;
3026 bitmap usage = BITMAP_ALLOC (&m_bmstack);
3028 for (unsigned int i = 0; i < cls->members.length (); i++)
3029 bitmap_ior_into (usage, cls->members[i]->usage_index_bitmap);
3031 EXECUTE_IF_SET_IN_BITMAP (usage, 0, i, bi)
3033 if (dump_file && (dump_flags & TDF_DETAILS))
3034 fprintf (dump_file, " processing congruece step for class: %u, index: %u\n",
3035 cls->id, i);
3037 do_congruence_step_for_index (cls, i);
3039 if (splitter_class_removed)
3040 break;
3043 BITMAP_FREE (usage);
3046 /* Adds a newly created congruence class CLS to worklist. */
3048 void
3049 sem_item_optimizer::worklist_push (congruence_class *cls)
3051 /* Return if the class CLS is already presented in work list. */
3052 if (cls->in_worklist)
3053 return;
3055 cls->in_worklist = true;
3056 worklist.push_back (cls);
3059 /* Pops a class from worklist. */
3061 congruence_class *
3062 sem_item_optimizer::worklist_pop (void)
3064 congruence_class *cls;
3066 while (!worklist.empty ())
3068 cls = worklist.front ();
3069 worklist.pop_front ();
3070 if (cls->in_worklist)
3072 cls->in_worklist = false;
3074 return cls;
3076 else
3078 /* Work list item was already intended to be removed.
3079 The only reason for doing it is to split a class.
3080 Thus, the class CLS is deleted. */
3081 delete cls;
3085 return NULL;
3088 /* Iterative congruence reduction function. */
3090 void
3091 sem_item_optimizer::process_cong_reduction (void)
3093 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
3094 it != m_classes.end (); ++it)
3095 for (unsigned i = 0; i < (*it)->classes.length (); i++)
3096 if ((*it)->classes[i]->is_class_used ())
3097 worklist_push ((*it)->classes[i]);
3099 if (dump_file)
3100 fprintf (dump_file, "Worklist has been filled with: %lu\n",
3101 (unsigned long) worklist.size ());
3103 if (dump_file && (dump_flags & TDF_DETAILS))
3104 fprintf (dump_file, "Congruence class reduction\n");
3106 congruence_class *cls;
3108 /* Process complete congruence reduction. */
3109 while ((cls = worklist_pop ()) != NULL)
3110 do_congruence_step (cls);
3112 /* Subdivide newly created classes according to references. */
3113 unsigned new_classes = subdivide_classes_by_sensitive_refs ();
3115 if (dump_file)
3116 fprintf (dump_file, "Address reference subdivision created: %u "
3117 "new classes.\n", new_classes);
3120 /* Debug function prints all informations about congruence classes. */
3122 void
3123 sem_item_optimizer::dump_cong_classes (void)
3125 if (!dump_file)
3126 return;
3128 fprintf (dump_file,
3129 "Congruence classes: %u (unique hash values: %lu), with total: %u items\n",
3130 m_classes_count, (unsigned long) m_classes.elements(), m_items.length ());
3132 /* Histogram calculation. */
3133 unsigned int max_index = 0;
3134 unsigned int* histogram = XCNEWVEC (unsigned int, m_items.length () + 1);
3136 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
3137 it != m_classes.end (); ++it)
3139 for (unsigned i = 0; i < (*it)->classes.length (); i++)
3141 unsigned int c = (*it)->classes[i]->members.length ();
3142 histogram[c]++;
3144 if (c > max_index)
3145 max_index = c;
3148 fprintf (dump_file,
3149 "Class size histogram [num of members]: number of classe number of classess\n");
3151 for (unsigned int i = 0; i <= max_index; i++)
3152 if (histogram[i])
3153 fprintf (dump_file, "[%u]: %u classes\n", i, histogram[i]);
3155 fprintf (dump_file, "\n\n");
3158 if (dump_flags & TDF_DETAILS)
3159 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
3160 it != m_classes.end (); ++it)
3162 fprintf (dump_file, " group: with %u classes:\n", (*it)->classes.length ());
3164 for (unsigned i = 0; i < (*it)->classes.length (); i++)
3166 (*it)->classes[i]->dump (dump_file, 4);
3168 if(i < (*it)->classes.length () - 1)
3169 fprintf (dump_file, " ");
3173 free (histogram);
3176 /* After reduction is done, we can declare all items in a group
3177 to be equal. PREV_CLASS_COUNT is start number of classes
3178 before reduction. True is returned if there's a merge operation
3179 processed. */
3181 bool
3182 sem_item_optimizer::merge_classes (unsigned int prev_class_count)
3184 unsigned int item_count = m_items.length ();
3185 unsigned int class_count = m_classes_count;
3186 unsigned int equal_items = item_count - class_count;
3188 unsigned int non_singular_classes_count = 0;
3189 unsigned int non_singular_classes_sum = 0;
3191 bool merged_p = false;
3193 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
3194 it != m_classes.end (); ++it)
3195 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
3197 congruence_class *c = (*it)->classes[i];
3198 if (c->members.length () > 1)
3200 non_singular_classes_count++;
3201 non_singular_classes_sum += c->members.length ();
3205 if (dump_file)
3207 fprintf (dump_file, "\nItem count: %u\n", item_count);
3208 fprintf (dump_file, "Congruent classes before: %u, after: %u\n",
3209 prev_class_count, class_count);
3210 fprintf (dump_file, "Average class size before: %.2f, after: %.2f\n",
3211 prev_class_count ? 1.0f * item_count / prev_class_count : 0.0f,
3212 class_count ? 1.0f * item_count / class_count : 0.0f);
3213 fprintf (dump_file, "Average non-singular class size: %.2f, count: %u\n",
3214 non_singular_classes_count ? 1.0f * non_singular_classes_sum /
3215 non_singular_classes_count : 0.0f,
3216 non_singular_classes_count);
3217 fprintf (dump_file, "Equal symbols: %u\n", equal_items);
3218 fprintf (dump_file, "Fraction of visited symbols: %.2f%%\n\n",
3219 item_count ? 100.0f * equal_items / item_count : 0.0f);
3222 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
3223 it != m_classes.end (); ++it)
3224 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
3226 congruence_class *c = (*it)->classes[i];
3228 if (c->members.length () == 1)
3229 continue;
3231 gcc_assert (c->members.length ());
3233 sem_item *source = c->members[0];
3235 for (unsigned int j = 1; j < c->members.length (); j++)
3237 sem_item *alias = c->members[j];
3239 if (dump_file)
3241 fprintf (dump_file, "Semantic equality hit:%s->%s\n",
3242 xstrdup_for_dump (source->node->name ()),
3243 xstrdup_for_dump (alias->node->name ()));
3244 fprintf (dump_file, "Assembler symbol names:%s->%s\n",
3245 xstrdup_for_dump (source->node->asm_name ()),
3246 xstrdup_for_dump (alias->node->asm_name ()));
3249 if (lookup_attribute ("no_icf", DECL_ATTRIBUTES (alias->decl)))
3251 if (dump_file)
3252 fprintf (dump_file,
3253 "Merge operation is skipped due to no_icf "
3254 "attribute.\n\n");
3256 continue;
3259 if (dump_file && (dump_flags & TDF_DETAILS))
3261 source->dump_to_file (dump_file);
3262 alias->dump_to_file (dump_file);
3265 merged_p |= source->merge (alias);
3269 return merged_p;
3272 /* Dump function prints all class members to a FILE with an INDENT. */
3274 void
3275 congruence_class::dump (FILE *file, unsigned int indent) const
3277 FPRINTF_SPACES (file, indent, "class with id: %u, hash: %u, items: %u\n",
3278 id, members[0]->get_hash (), members.length ());
3280 FPUTS_SPACES (file, indent + 2, "");
3281 for (unsigned i = 0; i < members.length (); i++)
3282 fprintf (file, "%s(%p/%u) ", members[i]->node->asm_name (),
3283 (void *) members[i]->decl,
3284 members[i]->node->order);
3286 fprintf (file, "\n");
3289 /* Returns true if there's a member that is used from another group. */
3291 bool
3292 congruence_class::is_class_used (void)
3294 for (unsigned int i = 0; i < members.length (); i++)
3295 if (members[i]->usages.length ())
3296 return true;
3298 return false;
3301 /* Generate pass summary for IPA ICF pass. */
3303 static void
3304 ipa_icf_generate_summary (void)
3306 if (!optimizer)
3307 optimizer = new sem_item_optimizer ();
3309 optimizer->register_hooks ();
3310 optimizer->parse_funcs_and_vars ();
3313 /* Write pass summary for IPA ICF pass. */
3315 static void
3316 ipa_icf_write_summary (void)
3318 gcc_assert (optimizer);
3320 optimizer->write_summary ();
3323 /* Read pass summary for IPA ICF pass. */
3325 static void
3326 ipa_icf_read_summary (void)
3328 if (!optimizer)
3329 optimizer = new sem_item_optimizer ();
3331 optimizer->read_summary ();
3332 optimizer->register_hooks ();
3335 /* Semantic equality exection function. */
3337 static unsigned int
3338 ipa_icf_driver (void)
3340 gcc_assert (optimizer);
3342 bool merged_p = optimizer->execute ();
3344 delete optimizer;
3345 optimizer = NULL;
3347 return merged_p ? TODO_remove_functions : 0;
3350 const pass_data pass_data_ipa_icf =
3352 IPA_PASS, /* type */
3353 "icf", /* name */
3354 OPTGROUP_IPA, /* optinfo_flags */
3355 TV_IPA_ICF, /* tv_id */
3356 0, /* properties_required */
3357 0, /* properties_provided */
3358 0, /* properties_destroyed */
3359 0, /* todo_flags_start */
3360 0, /* todo_flags_finish */
3363 class pass_ipa_icf : public ipa_opt_pass_d
3365 public:
3366 pass_ipa_icf (gcc::context *ctxt)
3367 : ipa_opt_pass_d (pass_data_ipa_icf, ctxt,
3368 ipa_icf_generate_summary, /* generate_summary */
3369 ipa_icf_write_summary, /* write_summary */
3370 ipa_icf_read_summary, /* read_summary */
3371 NULL, /*
3372 write_optimization_summary */
3373 NULL, /*
3374 read_optimization_summary */
3375 NULL, /* stmt_fixup */
3376 0, /* function_transform_todo_flags_start */
3377 NULL, /* function_transform */
3378 NULL) /* variable_transform */
3381 /* opt_pass methods: */
3382 virtual bool gate (function *)
3384 return in_lto_p || flag_ipa_icf_variables || flag_ipa_icf_functions;
3387 virtual unsigned int execute (function *)
3389 return ipa_icf_driver();
3391 }; // class pass_ipa_icf
3393 } // ipa_icf namespace
3395 ipa_opt_pass_d *
3396 make_pass_ipa_icf (gcc::context *ctxt)
3398 return new ipa_icf::pass_ipa_icf (ctxt);