ipa-icf.c (sem_item::compare_attributes): New function.
[platform/upstream/gcc.git] / gcc / ipa-icf.c
1 /* Interprocedural Identical Code Folding pass
2    Copyright (C) 2014-2015 Free Software Foundation, Inc.
3
4    Contributed by Jan Hubicka <hubicka@ucw.cz> and Martin Liska <mliska@suse.cz>
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 /* Interprocedural Identical Code Folding for functions and
23    read-only variables.
24
25    The goal of this transformation is to discover functions and read-only
26    variables which do have exactly the same semantics.
27
28    In case of functions,
29    we could either create a virtual clone or do a simple function wrapper
30    that will call equivalent function. If the function is just locally visible,
31    all function calls can be redirected. For read-only variables, we create
32    aliases if possible.
33
34    Optimization pass arranges as follows:
35    1) All functions and read-only variables are visited and internal
36       data structure, either sem_function or sem_variables is created.
37    2) For every symbol from the previous step, VAR_DECL and FUNCTION_DECL are
38       saved and matched to corresponding sem_items.
39    3) These declaration are ignored for equality check and are solved
40       by Value Numbering algorithm published by Alpert, Zadeck in 1992.
41    4) We compute hash value for each symbol.
42    5) Congruence classes are created based on hash value. If hash value are
43       equal, equals function is called and symbols are deeply compared.
44       We must prove that all SSA names, declarations and other items
45       correspond.
46    6) Value Numbering is executed for these classes. At the end of the process
47       all symbol members in remaining classes can be merged.
48    7) Merge operation creates alias in case of read-only variables. For
49       callgraph node, we must decide if we can redirect local calls,
50       create an alias or a thunk.
51
52 */
53
54 #include "config.h"
55 #include "system.h"
56 #include <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"
126
127 using namespace ipa_icf_gimple;
128
129 namespace ipa_icf {
130
131 /* Initialization and computation of symtab node hash, there data
132    are propagated later on.  */
133
134 static sem_item_optimizer *optimizer = NULL;
135
136 /* Constructor.  */
137
138 symbol_compare_collection::symbol_compare_collection (symtab_node *node)
139 {
140   m_references.create (0);
141   m_interposables.create (0);
142
143   ipa_ref *ref;
144
145   if (is_a <varpool_node *> (node) && DECL_VIRTUAL_P (node->decl))
146     return;
147
148   for (unsigned i = 0; node->iterate_reference (i, ref); i++)
149     {
150       if (ref->address_matters_p ())
151         m_references.safe_push (ref->referred);
152
153       if (ref->referred->get_availability () <= AVAIL_INTERPOSABLE)
154         {
155           if (ref->address_matters_p ())
156             m_references.safe_push (ref->referred);
157           else
158             m_interposables.safe_push (ref->referred);
159         }
160     }
161
162   if (is_a <cgraph_node *> (node))
163     {
164       cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
165
166       for (cgraph_edge *e = cnode->callees; e; e = e->next_callee)
167         if (e->callee->get_availability () <= AVAIL_INTERPOSABLE)
168           m_interposables.safe_push (e->callee);
169     }
170 }
171
172 /* Constructor for key value pair, where _ITEM is key and _INDEX is a target.  */
173
174 sem_usage_pair::sem_usage_pair (sem_item *_item, unsigned int _index):
175   item (_item), index (_index)
176 {
177 }
178
179 /* Semantic item constructor for a node of _TYPE, where STACK is used
180    for bitmap memory allocation.  */
181
182 sem_item::sem_item (sem_item_type _type,
183                     bitmap_obstack *stack): type(_type), hash(0)
184 {
185   setup (stack);
186 }
187
188 /* Semantic item constructor for a node of _TYPE, where STACK is used
189    for bitmap memory allocation. The item is based on symtab node _NODE
190    with computed _HASH.  */
191
192 sem_item::sem_item (sem_item_type _type, symtab_node *_node,
193                     hashval_t _hash, bitmap_obstack *stack): type(_type),
194   node (_node), hash (_hash)
195 {
196   decl = node->decl;
197   setup (stack);
198 }
199
200 /* Add reference to a semantic TARGET.  */
201
202 void
203 sem_item::add_reference (sem_item *target)
204 {
205   refs.safe_push (target);
206   unsigned index = refs.length ();
207   target->usages.safe_push (new sem_usage_pair(this, index));
208   bitmap_set_bit (target->usage_index_bitmap, index);
209   refs_set.add (target->node);
210 }
211
212 /* Initialize internal data structures. Bitmap STACK is used for
213    bitmap memory allocation process.  */
214
215 void
216 sem_item::setup (bitmap_obstack *stack)
217 {
218   gcc_checking_assert (node);
219
220   refs.create (0);
221   tree_refs.create (0);
222   usages.create (0);
223   usage_index_bitmap = BITMAP_ALLOC (stack);
224 }
225
226 sem_item::~sem_item ()
227 {
228   for (unsigned i = 0; i < usages.length (); i++)
229     delete usages[i];
230
231   refs.release ();
232   tree_refs.release ();
233   usages.release ();
234
235   BITMAP_FREE (usage_index_bitmap);
236 }
237
238 /* Dump function for debugging purpose.  */
239
240 DEBUG_FUNCTION void
241 sem_item::dump (void)
242 {
243   if (dump_file)
244     {
245       fprintf (dump_file, "[%s] %s (%u) (tree:%p)\n", type == FUNC ? "func" : "var",
246                node->name(), node->order, (void *) node->decl);
247       fprintf (dump_file, "  hash: %u\n", get_hash ());
248       fprintf (dump_file, "  references: ");
249
250       for (unsigned i = 0; i < refs.length (); i++)
251         fprintf (dump_file, "%s%s ", refs[i]->node->name (),
252                  i < refs.length() - 1 ? "," : "");
253
254       fprintf (dump_file, "\n");
255     }
256 }
257
258 /* Return true if target supports alias symbols.  */
259
260 bool
261 sem_item::target_supports_symbol_aliases_p (void)
262 {
263 #if !defined (ASM_OUTPUT_DEF) || (!defined(ASM_OUTPUT_WEAK_ALIAS) && !defined (ASM_WEAKEN_DECL))
264   return false;
265 #else
266   return true;
267 #endif
268 }
269
270 /* Semantic function constructor that uses STACK as bitmap memory stack.  */
271
272 sem_function::sem_function (bitmap_obstack *stack): sem_item (FUNC, stack),
273   m_checker (NULL), m_compared_func (NULL)
274 {
275   arg_types.create (0);
276   bb_sizes.create (0);
277   bb_sorted.create (0);
278 }
279
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)
286 {
287   arg_types.create (0);
288   bb_sizes.create (0);
289   bb_sorted.create (0);
290 }
291
292 sem_function::~sem_function ()
293 {
294   for (unsigned i = 0; i < bb_sorted.length (); i++)
295     delete (bb_sorted[i]);
296
297   arg_types.release ();
298   bb_sizes.release ();
299   bb_sorted.release ();
300 }
301
302 /* Calculates hash value based on a BASIC_BLOCK.  */
303
304 hashval_t
305 sem_function::get_bb_hash (const sem_bb *basic_block)
306 {
307   inchash::hash hstate;
308
309   hstate.add_int (basic_block->nondbg_stmt_count);
310   hstate.add_int (basic_block->edge_count);
311
312   return hstate.end ();
313 }
314
315 /* References independent hash function.  */
316
317 hashval_t
318 sem_function::get_hash (void)
319 {
320   if(!hash)
321     {
322       inchash::hash hstate;
323       hstate.add_int (177454); /* Random number for function type.  */
324
325       hstate.add_int (arg_count);
326       hstate.add_int (cfg_checksum);
327       hstate.add_int (gcode_hash);
328
329       for (unsigned i = 0; i < bb_sorted.length (); i++)
330         hstate.merge_hash (get_bb_hash (bb_sorted[i]));
331
332       for (unsigned i = 0; i < bb_sizes.length (); i++)
333         hstate.add_int (bb_sizes[i]);
334
335
336       /* Add common features of declaration itself.  */
337       if (DECL_FUNCTION_SPECIFIC_TARGET (decl))
338         hstate.add_wide_int
339          (cl_target_option_hash
340            (TREE_TARGET_OPTION (DECL_FUNCTION_SPECIFIC_TARGET (decl))));
341       if (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (decl))
342          (cl_optimization_hash
343            (TREE_OPTIMIZATION (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (decl))));
344       hstate.add_flag (DECL_CXX_CONSTRUCTOR_P (decl));
345       hstate.add_flag (DECL_CXX_DESTRUCTOR_P (decl));
346
347       hash = hstate.end ();
348     }
349
350   return hash;
351 }
352
353 /* Return ture if A1 and A2 represent equivalent function attribute lists.
354    Based on comp_type_attributes.  */
355
356 bool
357 sem_item::compare_attributes (const_tree a1, const_tree a2)
358 {
359   const_tree a;
360   if (a1 == a2)
361     return true;
362   for (a = a1; a != NULL_TREE; a = TREE_CHAIN (a))
363     {
364       const struct attribute_spec *as;
365       const_tree attr;
366
367       as = lookup_attribute_spec (get_attribute_name (a));
368       /* TODO: We can introduce as->affects_decl_identity
369          and as->affects_decl_reference_identity if attribute mismatch
370          gets a common reason to give up on merging.  It may not be worth
371          the effort.
372          For example returns_nonnull affects only references, while
373          optimize attribute can be ignored because it is already lowered
374          into flags representation and compared separately.  */
375       if (!as)
376         continue;
377
378       attr = lookup_attribute (as->name, CONST_CAST_TREE (a2));
379       if (!attr || !attribute_value_equal (a, attr))
380         break;
381     }
382   if (!a)
383     {
384       for (a = a2; a != NULL_TREE; a = TREE_CHAIN (a))
385         {
386           const struct attribute_spec *as;
387
388           as = lookup_attribute_spec (get_attribute_name (a));
389           if (!as)
390             continue;
391
392           if (!lookup_attribute (as->name, CONST_CAST_TREE (a1)))
393             break;
394           /* We don't need to compare trees again, as we did this
395              already in first loop.  */
396         }
397       if (!a)
398         return true;
399     }
400   /* TODO: As in comp_type_attributes we may want to introduce target hook.  */
401   return false;
402 }
403
404 /* Compare properties of symbols N1 and N2 that does not affect semantics of
405    symbol itself but affects semantics of its references from USED_BY (which
406    may be NULL if it is unknown).  If comparsion is false, symbols
407    can still be merged but any symbols referring them can't.
408
409    If ADDRESS is true, do extra checking needed for IPA_REF_ADDR.
410
411    TODO: We can also split attributes to those that determine codegen of
412    a function body/variable constructor itself and those that are used when
413    referring to it.  */
414
415 bool
416 sem_item::compare_referenced_symbol_properties (symtab_node *used_by,
417                                                 symtab_node *n1,
418                                                 symtab_node *n2,
419                                                 bool address)
420 {
421   if (is_a <cgraph_node *> (n1))
422     {
423       /* Inline properties matters: we do now want to merge uses of inline
424          function to uses of normal function because inline hint would be lost.
425          We however can merge inline function to noinline because the alias
426          will keep its DECL_DECLARED_INLINE flag.
427
428          Also ignore inline flag when optimizing for size or when function
429          is known to not be inlinable.
430
431          TODO: the optimize_size checks can also be assumed to be true if
432          unit has no !optimize_size functions. */
433
434       if ((!used_by || address || !is_a <cgraph_node *> (used_by)
435            || !opt_for_fn (used_by->decl, optimize_size))
436           && !opt_for_fn (n1->decl, optimize_size)
437           && n1->get_availability () > AVAIL_INTERPOSABLE
438           && (!DECL_UNINLINABLE (n1->decl) || !DECL_UNINLINABLE (n2->decl)))
439         {
440           if (DECL_DISREGARD_INLINE_LIMITS (n1->decl)
441               != DECL_DISREGARD_INLINE_LIMITS (n2->decl))
442             return return_false_with_msg
443                      ("DECL_DISREGARD_INLINE_LIMITS are different");
444
445           if (DECL_DECLARED_INLINE_P (n1->decl)
446               != DECL_DECLARED_INLINE_P (n2->decl))
447             return return_false_with_msg ("inline attributes are different");
448         }
449
450       if (DECL_IS_OPERATOR_NEW (n1->decl)
451           != DECL_IS_OPERATOR_NEW (n2->decl))
452         return return_false_with_msg ("operator new flags are different");
453     }
454
455   /* Merging two definitions with a reference to equivalent vtables, but
456      belonging to a different type may result in ipa-polymorphic-call analysis
457      giving a wrong answer about the dynamic type of instance.  */
458   if (is_a <varpool_node *> (n1))
459     {
460       if ((DECL_VIRTUAL_P (n1->decl) || DECL_VIRTUAL_P (n2->decl))
461           && (DECL_VIRTUAL_P (n1->decl) != DECL_VIRTUAL_P (n2->decl)
462               || !types_must_be_same_for_odr (DECL_CONTEXT (n1->decl),
463                                               DECL_CONTEXT (n2->decl)))
464           && (!used_by || !is_a <cgraph_node *> (used_by) || address
465               || opt_for_fn (used_by->decl, flag_devirtualize)))
466         return return_false_with_msg
467                  ("references to virtual tables can not be merged");
468
469       if (address && DECL_ALIGN (n1->decl) != DECL_ALIGN (n2->decl))
470         return return_false_with_msg ("alignment mismatch");
471
472       /* For functions we compare attributes in equals_wpa, because we do
473          not know what attributes may cause codegen differences, but for
474          variables just compare attributes for references - the codegen
475          for constructors is affected only by those attributes that we lower
476          to explicit representation (such as DECL_ALIGN or DECL_SECTION).  */
477       if (!compare_attributes (DECL_ATTRIBUTES (n1->decl),
478                                DECL_ATTRIBUTES (n2->decl)))
479         return return_false_with_msg ("different var decl attributes");
480       if (comp_type_attributes (TREE_TYPE (n1->decl),
481                                 TREE_TYPE (n2->decl)) != 1)
482         return return_false_with_msg ("different var type attributes");
483     }
484
485   /* When matching virtual tables, be sure to also match information
486      relevant for polymorphic call analysis.  */
487   if (used_by && is_a <varpool_node *> (used_by)
488       && DECL_VIRTUAL_P (used_by->decl))
489     {
490       if (DECL_VIRTUAL_P (n1->decl) != DECL_VIRTUAL_P (n2->decl))
491         return return_false_with_msg ("virtual flag mismatch");
492       if (DECL_VIRTUAL_P (n1->decl) && is_a <cgraph_node *> (n1)
493           && (DECL_FINAL_P (n1->decl) != DECL_FINAL_P (n2->decl)))
494         return return_false_with_msg ("final flag mismatch");
495     }
496   return true;
497 }
498
499 /* Hash properties that are compared by compare_referenced_symbol_properties. */
500
501 void
502 sem_item::hash_referenced_symbol_properties (symtab_node *ref,
503                                              inchash::hash &hstate,
504                                              bool address)
505 {
506   if (is_a <cgraph_node *> (ref))
507     {
508       if ((!type == FUNC || address || !opt_for_fn (decl, optimize_size))
509           && !opt_for_fn (ref->decl, optimize_size)
510           && !DECL_UNINLINABLE (ref->decl))
511         {
512           hstate.add_flag (DECL_DISREGARD_INLINE_LIMITS (ref->decl));
513           hstate.add_flag (DECL_DECLARED_INLINE_P (ref->decl));
514         }
515       hstate.add_flag (DECL_IS_OPERATOR_NEW (ref->decl));
516     }
517   else if (is_a <varpool_node *> (ref))
518     {
519       hstate.add_flag (DECL_VIRTUAL_P (ref->decl));
520       if (address)
521         hstate.add_int (DECL_ALIGN (ref->decl));
522     }
523 }
524
525
526 /* For a given symbol table nodes N1 and N2, we check that FUNCTION_DECLs
527    point to a same function. Comparison can be skipped if IGNORED_NODES
528    contains these nodes.  ADDRESS indicate if address is taken.  */
529
530 bool
531 sem_item::compare_symbol_references (
532     hash_map <symtab_node *, sem_item *> &ignored_nodes,
533     symtab_node *n1, symtab_node *n2, bool address)
534 {
535   enum availability avail1, avail2;
536
537   if (n1 == n2)
538     return true;
539
540   /* Never match variable and function.  */
541   if (is_a <varpool_node *> (n1) != is_a <varpool_node *> (n2))
542     return false;
543
544   if (!compare_referenced_symbol_properties (node, n1, n2, address))
545     return false;
546   if (address && n1->equal_address_to (n2) == 1)
547     return true;
548   if (!address && n1->semantically_equivalent_p (n2))
549     return true;
550
551   n1 = n1->ultimate_alias_target (&avail1);
552   n2 = n2->ultimate_alias_target (&avail2);
553
554   if (avail1 >= AVAIL_INTERPOSABLE && ignored_nodes.get (n1)
555       && avail2 >= AVAIL_INTERPOSABLE && ignored_nodes.get (n2))
556     return true;
557
558   return return_false_with_msg ("different references");
559 }
560
561 /* If cgraph edges E1 and E2 are indirect calls, verify that
562    ECF flags are the same.  */
563
564 bool sem_function::compare_edge_flags (cgraph_edge *e1, cgraph_edge *e2)
565 {
566   if (e1->indirect_info && e2->indirect_info)
567     {
568       int e1_flags = e1->indirect_info->ecf_flags;
569       int e2_flags = e2->indirect_info->ecf_flags;
570
571       if (e1_flags != e2_flags)
572         return return_false_with_msg ("ICF flags are different");
573     }
574   else if (e1->indirect_info || e2->indirect_info)
575     return false;
576
577   return true;
578 }
579
580 /* Return true if parameter I may be used.  */
581
582 bool
583 sem_function::param_used_p (unsigned int i)
584 {
585   if (ipa_node_params_sum == NULL)
586     return false;
587
588   struct ipa_node_params *parms_info = IPA_NODE_REF (get_node ());
589
590   if (parms_info->descriptors.is_empty ()
591       || parms_info->descriptors.length () <= i)
592      return true;
593
594   return ipa_is_param_used (IPA_NODE_REF (get_node ()), i);
595 }
596
597 /* Fast equality function based on knowledge known in WPA.  */
598
599 bool
600 sem_function::equals_wpa (sem_item *item,
601                           hash_map <symtab_node *, sem_item *> &ignored_nodes)
602 {
603   gcc_assert (item->type == FUNC);
604
605   m_compared_func = static_cast<sem_function *> (item);
606
607   if (arg_types.length () != m_compared_func->arg_types.length ())
608     return return_false_with_msg ("different number of arguments");
609
610   /* Compare special function DECL attributes.  */
611   if (DECL_FUNCTION_PERSONALITY (decl)
612       != DECL_FUNCTION_PERSONALITY (item->decl))
613     return return_false_with_msg ("function personalities are different");
614
615   if (DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl)
616        != DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (item->decl))
617     return return_false_with_msg ("intrument function entry exit "
618                                   "attributes are different");
619
620   if (DECL_NO_LIMIT_STACK (decl) != DECL_NO_LIMIT_STACK (item->decl))
621     return return_false_with_msg ("no stack limit attributes are different");
622
623   if (DECL_CXX_CONSTRUCTOR_P (decl) != DECL_CXX_CONSTRUCTOR_P (item->decl))
624     return return_false_with_msg ("DECL_CXX_CONSTRUCTOR mismatch");
625
626   if (DECL_CXX_DESTRUCTOR_P (decl) != DECL_CXX_DESTRUCTOR_P (item->decl))
627     return return_false_with_msg ("DECL_CXX_DESTRUCTOR mismatch");
628
629   /* TODO: pure/const flags mostly matters only for references, except for
630      the fact that codegen takes LOOPING flag as a hint that loops are
631      finite.  We may arrange the code to always pick leader that has least
632      specified flags and then this can go into comparing symbol properties.  */
633   if (flags_from_decl_or_type (decl) != flags_from_decl_or_type (item->decl))
634     return return_false_with_msg ("decl_or_type flags are different");
635
636   /* Do not match polymorphic constructors of different types.  They calls
637      type memory location for ipa-polymorphic-call and we do not want
638      it to get confused by wrong type.  */
639   if (DECL_CXX_CONSTRUCTOR_P (decl)
640       && TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE)
641     {
642       if (TREE_CODE (TREE_TYPE (item->decl)) != METHOD_TYPE)
643         return return_false_with_msg ("DECL_CXX_CONSTURCTOR type mismatch");
644       else if (!func_checker::compatible_polymorphic_types_p
645                  (method_class_type (TREE_TYPE (decl)),
646                   method_class_type (TREE_TYPE (item->decl)), false))
647         return return_false_with_msg ("ctor polymorphic type mismatch");
648     }
649
650   /* Checking function TARGET and OPTIMIZATION flags.  */
651   cl_target_option *tar1 = target_opts_for_fn (decl);
652   cl_target_option *tar2 = target_opts_for_fn (item->decl);
653
654   if (tar1 != tar2 && !cl_target_option_eq (tar1, tar2))
655     {
656       if (dump_file && (dump_flags & TDF_DETAILS))
657         {
658           fprintf (dump_file, "target flags difference");
659           cl_target_option_print_diff (dump_file, 2, tar1, tar2);
660         }
661
662       return return_false_with_msg ("Target flags are different");
663     }
664
665   cl_optimization *opt1 = opts_for_fn (decl);
666   cl_optimization *opt2 = opts_for_fn (item->decl);
667
668   if (opt1 != opt2 && memcmp (opt1, opt2, sizeof(cl_optimization)))
669     {
670       if (dump_file && (dump_flags & TDF_DETAILS))
671         {
672           fprintf (dump_file, "optimization flags difference");
673           cl_optimization_print_diff (dump_file, 2, opt1, opt2);
674         }
675
676       return return_false_with_msg ("optimization flags are different");
677     }
678
679   /* Result type checking.  */
680   if (!func_checker::compatible_types_p (result_type,
681                                          m_compared_func->result_type))
682     return return_false_with_msg ("result types are different");
683
684   /* Checking types of arguments.  */
685   for (unsigned i = 0; i < arg_types.length (); i++)
686     {
687       /* This guard is here for function pointer with attributes (pr59927.c).  */
688       if (!arg_types[i] || !m_compared_func->arg_types[i])
689         return return_false_with_msg ("NULL argument type");
690
691       /* We always need to match types so we are sure the callin conventions
692          are compatible.  */
693       if (!func_checker::compatible_types_p (arg_types[i],
694                                              m_compared_func->arg_types[i]))
695         return return_false_with_msg ("argument type is different");
696
697       /* On used arguments we need to do a bit more of work.  */
698       if (!param_used_p (i))
699         continue;
700       if (POINTER_TYPE_P (arg_types[i])
701           && (TYPE_RESTRICT (arg_types[i])
702               != TYPE_RESTRICT (m_compared_func->arg_types[i])))
703         return return_false_with_msg ("argument restrict flag mismatch");
704       /* nonnull_arg_p implies non-zero range to REFERENCE types.  */
705       if (POINTER_TYPE_P (arg_types[i])
706           && TREE_CODE (arg_types[i])
707              != TREE_CODE (m_compared_func->arg_types[i])
708           && opt_for_fn (decl, flag_delete_null_pointer_checks))
709         return return_false_with_msg ("pointer wrt reference mismatch");
710     }
711
712   if (node->num_references () != item->node->num_references ())
713     return return_false_with_msg ("different number of references");
714
715   /* Checking function attributes.
716      This is quadratic in number of attributes  */
717   if (comp_type_attributes (TREE_TYPE (decl),
718                             TREE_TYPE (item->decl)) != 1)
719     return return_false_with_msg ("different type attributes");
720   if (!compare_attributes (DECL_ATTRIBUTES (decl),
721                            DECL_ATTRIBUTES (item->decl)))
722     return return_false_with_msg ("different decl attributes");
723
724   /* The type of THIS pointer type memory location for
725      ipa-polymorphic-call-analysis.  */
726   if (opt_for_fn (decl, flag_devirtualize)
727       && (TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE
728           || TREE_CODE (TREE_TYPE (item->decl)) == METHOD_TYPE)
729       && param_used_p (0)
730       && compare_polymorphic_p ())
731     {
732       if (TREE_CODE (TREE_TYPE (decl)) != TREE_CODE (TREE_TYPE (item->decl)))
733         return return_false_with_msg ("METHOD_TYPE and FUNCTION_TYPE mismatch");
734       if (!func_checker::compatible_polymorphic_types_p
735            (method_class_type (TREE_TYPE (decl)),
736             method_class_type (TREE_TYPE (item->decl)), false))
737         return return_false_with_msg ("THIS pointer ODR type mismatch");
738     }
739
740   ipa_ref *ref = NULL, *ref2 = NULL;
741   for (unsigned i = 0; node->iterate_reference (i, ref); i++)
742     {
743       item->node->iterate_reference (i, ref2);
744
745       if (ref->use != ref2->use)
746         return return_false_with_msg ("reference use mismatch");
747
748       if (!compare_symbol_references (ignored_nodes, ref->referred,
749                                       ref2->referred,
750                                       ref->address_matters_p ()))
751         return false;
752     }
753
754   cgraph_edge *e1 = dyn_cast <cgraph_node *> (node)->callees;
755   cgraph_edge *e2 = dyn_cast <cgraph_node *> (item->node)->callees;
756
757   while (e1 && e2)
758     {
759       if (!compare_symbol_references (ignored_nodes, e1->callee,
760                                       e2->callee, false))
761         return false;
762       if (!compare_edge_flags (e1, e2))
763         return false;
764
765       e1 = e1->next_callee;
766       e2 = e2->next_callee;
767     }
768
769   if (e1 || e2)
770     return return_false_with_msg ("different number of calls");
771
772   e1 = dyn_cast <cgraph_node *> (node)->indirect_calls;
773   e2 = dyn_cast <cgraph_node *> (item->node)->indirect_calls;
774
775   while (e1 && e2)
776     {
777       if (!compare_edge_flags (e1, e2))
778         return false;
779
780       e1 = e1->next_callee;
781       e2 = e2->next_callee;
782     }
783
784   if (e1 || e2)
785     return return_false_with_msg ("different number of indirect calls");
786
787   return true;
788 }
789
790 /* Update hash by address sensitive references. We iterate over all
791    sensitive references (address_matters_p) and we hash ultime alias
792    target of these nodes, which can improve a semantic item hash.
793
794    Also hash in referenced symbols properties.  This can be done at any time
795    (as the properties should not change), but it is convenient to do it here
796    while we walk the references anyway.  */
797
798 void
799 sem_item::update_hash_by_addr_refs (hash_map <symtab_node *,
800                                     sem_item *> &m_symtab_node_map)
801 {
802   ipa_ref* ref;
803   inchash::hash hstate (hash);
804
805   for (unsigned i = 0; node->iterate_reference (i, ref); i++)
806     {
807       hstate.add_int (ref->use);
808       hash_referenced_symbol_properties (ref->referred, hstate,
809                                          ref->use == IPA_REF_ADDR);
810       if (ref->address_matters_p () || !m_symtab_node_map.get (ref->referred))
811         hstate.add_int (ref->referred->ultimate_alias_target ()->order);
812     }
813
814   if (is_a <cgraph_node *> (node))
815     {
816       for (cgraph_edge *e = dyn_cast <cgraph_node *> (node)->callers; e;
817            e = e->next_caller)
818         {
819           sem_item **result = m_symtab_node_map.get (e->callee);
820           hash_referenced_symbol_properties (e->callee, hstate, false);
821           if (!result)
822             hstate.add_int (e->callee->ultimate_alias_target ()->order);
823         }
824     }
825
826   hash = hstate.end ();
827 }
828
829 /* Update hash by computed local hash values taken from different
830    semantic items.
831    TODO: stronger SCC based hashing would be desirable here.  */
832
833 void
834 sem_item::update_hash_by_local_refs (hash_map <symtab_node *,
835                                      sem_item *> &m_symtab_node_map)
836 {
837   ipa_ref* ref;
838   inchash::hash state (hash);
839
840   for (unsigned j = 0; node->iterate_reference (j, ref); j++)
841     {
842       sem_item **result = m_symtab_node_map.get (ref->referring);
843       if (result)
844         state.merge_hash ((*result)->hash);
845     }
846
847   if (type == FUNC)
848     {
849       for (cgraph_edge *e = dyn_cast <cgraph_node *> (node)->callees; e;
850            e = e->next_callee)
851         {
852           sem_item **result = m_symtab_node_map.get (e->caller);
853           if (result)
854             state.merge_hash ((*result)->hash);
855         }
856     }
857
858   global_hash = state.end ();
859 }
860
861 /* Returns true if the item equals to ITEM given as argument.  */
862
863 bool
864 sem_function::equals (sem_item *item,
865                       hash_map <symtab_node *, sem_item *> &ignored_nodes)
866 {
867   gcc_assert (item->type == FUNC);
868   bool eq = equals_private (item, ignored_nodes);
869
870   if (m_checker != NULL)
871     {
872       delete m_checker;
873       m_checker = NULL;
874     }
875
876   if (dump_file && (dump_flags & TDF_DETAILS))
877     fprintf (dump_file,
878              "Equals called for:%s:%s (%u:%u) (%s:%s) with result: %s\n\n",
879              xstrdup_for_dump (node->name()),
880              xstrdup_for_dump (item->node->name ()),
881              node->order,
882              item->node->order,
883              xstrdup_for_dump (node->asm_name ()),
884              xstrdup_for_dump (item->node->asm_name ()),
885              eq ? "true" : "false");
886
887   return eq;
888 }
889
890 /* Processes function equality comparison.  */
891
892 bool
893 sem_function::equals_private (sem_item *item,
894                               hash_map <symtab_node *, sem_item *> &ignored_nodes)
895 {
896   if (item->type != FUNC)
897     return false;
898
899   basic_block bb1, bb2;
900   edge e1, e2;
901   edge_iterator ei1, ei2;
902   bool result = true;
903   tree arg1, arg2;
904
905   m_compared_func = static_cast<sem_function *> (item);
906
907   gcc_assert (decl != item->decl);
908
909   if (bb_sorted.length () != m_compared_func->bb_sorted.length ()
910       || edge_count != m_compared_func->edge_count
911       || cfg_checksum != m_compared_func->cfg_checksum)
912     return return_false ();
913
914   if (!equals_wpa (item, ignored_nodes))
915     return false;
916
917   m_checker = new func_checker (decl, m_compared_func->decl,
918                                 compare_polymorphic_p (),
919                                 false,
920                                 &refs_set,
921                                 &m_compared_func->refs_set);
922   for (arg1 = DECL_ARGUMENTS (decl),
923        arg2 = DECL_ARGUMENTS (m_compared_func->decl);
924        arg1; arg1 = DECL_CHAIN (arg1), arg2 = DECL_CHAIN (arg2))
925     if (!m_checker->compare_decl (arg1, arg2))
926       return return_false ();
927
928   /* Fill-up label dictionary.  */
929   for (unsigned i = 0; i < bb_sorted.length (); ++i)
930     {
931       m_checker->parse_labels (bb_sorted[i]);
932       m_checker->parse_labels (m_compared_func->bb_sorted[i]);
933     }
934
935   /* Checking all basic blocks.  */
936   for (unsigned i = 0; i < bb_sorted.length (); ++i)
937     if(!m_checker->compare_bb (bb_sorted[i], m_compared_func->bb_sorted[i]))
938       return return_false();
939
940   dump_message ("All BBs are equal\n");
941
942   auto_vec <int> bb_dict;
943
944   /* Basic block edges check.  */
945   for (unsigned i = 0; i < bb_sorted.length (); ++i)
946     {
947       bb1 = bb_sorted[i]->bb;
948       bb2 = m_compared_func->bb_sorted[i]->bb;
949
950       ei2 = ei_start (bb2->preds);
951
952       for (ei1 = ei_start (bb1->preds); ei_cond (ei1, &e1); ei_next (&ei1))
953         {
954           ei_cond (ei2, &e2);
955
956           if (e1->flags != e2->flags)
957             return return_false_with_msg ("flags comparison returns false");
958
959           if (!bb_dict_test (&bb_dict, e1->src->index, e2->src->index))
960             return return_false_with_msg ("edge comparison returns false");
961
962           if (!bb_dict_test (&bb_dict, e1->dest->index, e2->dest->index))
963             return return_false_with_msg ("BB comparison returns false");
964
965           if (!m_checker->compare_edge (e1, e2))
966             return return_false_with_msg ("edge comparison returns false");
967
968           ei_next (&ei2);
969         }
970     }
971
972   /* Basic block PHI nodes comparison.  */
973   for (unsigned i = 0; i < bb_sorted.length (); i++)
974     if (!compare_phi_node (bb_sorted[i]->bb, m_compared_func->bb_sorted[i]->bb))
975       return return_false_with_msg ("PHI node comparison returns false");
976
977   return result;
978 }
979
980 /* Set LOCAL_P of NODE to true if DATA is non-NULL.
981    Helper for call_for_symbol_thunks_and_aliases.  */
982
983 static bool
984 set_local (cgraph_node *node, void *data)
985 {
986   node->local.local = data != NULL;
987   return false;
988 }
989
990 /* TREE_ADDRESSABLE of NODE to true.
991    Helper for call_for_symbol_thunks_and_aliases.  */
992
993 static bool
994 set_addressable (varpool_node *node, void *)
995 {
996   TREE_ADDRESSABLE (node->decl) = 1;
997   return false;
998 }
999
1000 /* Clear DECL_RTL of NODE. 
1001    Helper for call_for_symbol_thunks_and_aliases.  */
1002
1003 static bool
1004 clear_decl_rtl (symtab_node *node, void *)
1005 {
1006   SET_DECL_RTL (node->decl, NULL);
1007   return false;
1008 }
1009
1010 /* Redirect all callers of N and its aliases to TO.  Remove aliases if
1011    possible.  Return number of redirections made.  */
1012
1013 static int
1014 redirect_all_callers (cgraph_node *n, cgraph_node *to)
1015 {
1016   int nredirected = 0;
1017   ipa_ref *ref;
1018   cgraph_edge *e = n->callers;
1019
1020   while (e)
1021     {
1022       /* Redirecting thunks to interposable symbols or symbols in other sections
1023          may not be supported by target output code.  Play safe for now and
1024          punt on redirection.  */
1025       if (!e->caller->thunk.thunk_p)
1026         {
1027           struct cgraph_edge *nexte = e->next_caller;
1028           e->redirect_callee (to);
1029           e = nexte;
1030           nredirected++;
1031         }
1032       else
1033         e = e->next_callee;
1034     }
1035   for (unsigned i = 0; n->iterate_direct_aliases (i, ref);)
1036     {
1037       bool removed = false;
1038       cgraph_node *n_alias = dyn_cast <cgraph_node *> (ref->referring);
1039
1040       if ((DECL_COMDAT_GROUP (n->decl)
1041            && (DECL_COMDAT_GROUP (n->decl)
1042                == DECL_COMDAT_GROUP (n_alias->decl)))
1043           || (n_alias->get_availability () > AVAIL_INTERPOSABLE
1044               && n->get_availability () > AVAIL_INTERPOSABLE))
1045         {
1046           nredirected += redirect_all_callers (n_alias, to);
1047           if (n_alias->can_remove_if_no_direct_calls_p ()
1048               && !n_alias->call_for_symbol_and_aliases (cgraph_node::has_thunk_p,
1049                                                         NULL, true)
1050               && !n_alias->has_aliases_p ())
1051             n_alias->remove ();
1052         }
1053       if (!removed)
1054         i++;
1055     }
1056   return nredirected;
1057 }
1058
1059 /* Merges instance with an ALIAS_ITEM, where alias, thunk or redirection can
1060    be applied.  */
1061
1062 bool
1063 sem_function::merge (sem_item *alias_item)
1064 {
1065   gcc_assert (alias_item->type == FUNC);
1066
1067   sem_function *alias_func = static_cast<sem_function *> (alias_item);
1068
1069   cgraph_node *original = get_node ();
1070   cgraph_node *local_original = NULL;
1071   cgraph_node *alias = alias_func->get_node ();
1072
1073   bool create_wrapper = false;
1074   bool create_alias = false;
1075   bool redirect_callers = false;
1076   bool remove = false;
1077
1078   bool original_discardable = false;
1079   bool original_discarded = false;
1080
1081   bool original_address_matters = original->address_matters_p ();
1082   bool alias_address_matters = alias->address_matters_p ();
1083
1084   if (DECL_EXTERNAL (alias->decl))
1085     {
1086       if (dump_file)
1087         fprintf (dump_file, "Not unifying; alias is external.\n\n");
1088       return false;
1089     }
1090
1091   if (DECL_NO_INLINE_WARNING_P (original->decl)
1092       != DECL_NO_INLINE_WARNING_P (alias->decl))
1093     {
1094       if (dump_file)
1095         fprintf (dump_file,
1096                  "Not unifying; "
1097                  "DECL_NO_INLINE_WARNING mismatch.\n\n");
1098       return false;
1099     }
1100
1101   /* Do not attempt to mix functions from different user sections;
1102      we do not know what user intends with those.  */
1103   if (((DECL_SECTION_NAME (original->decl) && !original->implicit_section)
1104        || (DECL_SECTION_NAME (alias->decl) && !alias->implicit_section))
1105       && DECL_SECTION_NAME (original->decl) != DECL_SECTION_NAME (alias->decl))
1106     {
1107       if (dump_file)
1108         fprintf (dump_file,
1109                  "Not unifying; "
1110                  "original and alias are in different sections.\n\n");
1111       return false;
1112     }
1113
1114   /* See if original is in a section that can be discarded if the main
1115      symbol is not used.  */
1116
1117   if (original->can_be_discarded_p ())
1118     original_discardable = true;
1119   /* Also consider case where we have resolution info and we know that
1120      original's definition is not going to be used.  In this case we can not
1121      create alias to original.  */
1122   if (node->resolution != LDPR_UNKNOWN
1123       && !decl_binds_to_current_def_p (node->decl))
1124     original_discardable = original_discarded = true;
1125
1126   /* Creating a symtab alias is the optimal way to merge.
1127      It however can not be used in the following cases:
1128
1129      1) if ORIGINAL and ALIAS may be possibly compared for address equality.
1130      2) if ORIGINAL is in a section that may be discarded by linker or if
1131         it is an external functions where we can not create an alias
1132         (ORIGINAL_DISCARDABLE)
1133      3) if target do not support symbol aliases.
1134      4) original and alias lie in different comdat groups.
1135
1136      If we can not produce alias, we will turn ALIAS into WRAPPER of ORIGINAL
1137      and/or redirect all callers from ALIAS to ORIGINAL.  */
1138   if ((original_address_matters && alias_address_matters)
1139       || (original_discardable
1140           && (!DECL_COMDAT_GROUP (alias->decl)
1141               || (DECL_COMDAT_GROUP (alias->decl)
1142                   != DECL_COMDAT_GROUP (original->decl))))
1143       || original_discarded
1144       || !sem_item::target_supports_symbol_aliases_p ()
1145       || DECL_COMDAT_GROUP (alias->decl) != DECL_COMDAT_GROUP (original->decl))
1146     {
1147       /* First see if we can produce wrapper.  */
1148
1149       /* Symbol properties that matter for references must be preserved.
1150          TODO: We can produce wrapper, but we need to produce alias of ORIGINAL
1151          with proper properties.  */
1152       if (!sem_item::compare_referenced_symbol_properties (NULL, original, alias,
1153                                                            alias->address_taken))
1154         {
1155           if (dump_file)
1156             fprintf (dump_file,
1157                      "Wrapper cannot be created because referenced symbol "
1158                      "properties mismatch\n");
1159         }
1160       /* Do not turn function in one comdat group into wrapper to another
1161          comdat group. Other compiler producing the body of the
1162          another comdat group may make opossite decision and with unfortunate
1163          linker choices this may close a loop.  */
1164       else if (DECL_COMDAT_GROUP (original->decl)
1165                && DECL_COMDAT_GROUP (alias->decl)
1166                && (DECL_COMDAT_GROUP (alias->decl)
1167                    != DECL_COMDAT_GROUP (original->decl)))
1168         {
1169           if (dump_file)
1170             fprintf (dump_file,
1171                      "Wrapper cannot be created because of COMDAT\n");
1172         }
1173       else if (DECL_STATIC_CHAIN (alias->decl))
1174         {
1175           if (dump_file)
1176             fprintf (dump_file,
1177                      "Can not create wrapper of nested functions.\n");
1178         }
1179       /* TODO: We can also deal with variadic functions never calling
1180          VA_START.  */
1181       else if (stdarg_p (TREE_TYPE (alias->decl)))
1182         {
1183           if (dump_file)
1184             fprintf (dump_file,
1185                      "can not create wrapper of stdarg function.\n");
1186         }
1187       else if (inline_summaries
1188                && inline_summaries->get (alias)->self_size <= 2)
1189         {
1190           if (dump_file)
1191             fprintf (dump_file, "Wrapper creation is not "
1192                      "profitable (function is too small).\n");
1193         }
1194       /* If user paid attention to mark function noinline, assume it is
1195          somewhat special and do not try to turn it into a wrapper that can
1196          not be undone by inliner.  */
1197       else if (lookup_attribute ("noinline", DECL_ATTRIBUTES (alias->decl)))
1198         {
1199           if (dump_file)
1200             fprintf (dump_file, "Wrappers are not created for noinline.\n");
1201         }
1202       else
1203         create_wrapper = true;
1204
1205       /* We can redirect local calls in the case both alias and orignal
1206          are not interposable.  */
1207       redirect_callers
1208         = alias->get_availability () > AVAIL_INTERPOSABLE
1209           && original->get_availability () > AVAIL_INTERPOSABLE
1210           && !alias->instrumented_version;
1211       /* TODO: We can redirect, but we need to produce alias of ORIGINAL
1212          with proper properties.  */
1213       if (!sem_item::compare_referenced_symbol_properties (NULL, original, alias,
1214                                                            alias->address_taken))
1215         redirect_callers = false;
1216
1217       if (!redirect_callers && !create_wrapper)
1218         {
1219           if (dump_file)
1220             fprintf (dump_file, "Not unifying; can not redirect callers nor "
1221                      "produce wrapper\n\n");
1222           return false;
1223         }
1224
1225       /* Work out the symbol the wrapper should call.
1226          If ORIGINAL is interposable, we need to call a local alias.
1227          Also produce local alias (if possible) as an optimization.
1228
1229          Local aliases can not be created inside comdat groups because that
1230          prevents inlining.  */
1231       if (!original_discardable && !original->get_comdat_group ())
1232         {
1233           local_original
1234             = dyn_cast <cgraph_node *> (original->noninterposable_alias ());
1235           if (!local_original
1236               && original->get_availability () > AVAIL_INTERPOSABLE)
1237             local_original = original;
1238         }
1239       /* If we can not use local alias, fallback to the original
1240          when possible.  */
1241       else if (original->get_availability () > AVAIL_INTERPOSABLE)
1242         local_original = original;
1243
1244       /* If original is COMDAT local, we can not really redirect calls outside
1245          of its comdat group to it.  */
1246       if (original->comdat_local_p ())
1247         redirect_callers = false;
1248       if (!local_original)
1249         {
1250           if (dump_file)
1251             fprintf (dump_file, "Not unifying; "
1252                      "can not produce local alias.\n\n");
1253           return false;
1254         }
1255
1256       if (!redirect_callers && !create_wrapper)
1257         {
1258           if (dump_file)
1259             fprintf (dump_file, "Not unifying; "
1260                      "can not redirect callers nor produce a wrapper\n\n");
1261           return false;
1262         }
1263       if (!create_wrapper
1264           && !alias->call_for_symbol_and_aliases (cgraph_node::has_thunk_p,
1265                                                   NULL, true)
1266           && !alias->can_remove_if_no_direct_calls_p ())
1267         {
1268           if (dump_file)
1269             fprintf (dump_file, "Not unifying; can not make wrapper and "
1270                      "function has other uses than direct calls\n\n");
1271           return false;
1272         }
1273     }
1274   else
1275     create_alias = true;
1276
1277   if (redirect_callers)
1278     {
1279       int nredirected = redirect_all_callers (alias, local_original);
1280
1281       if (nredirected)
1282         {
1283           alias->icf_merged = true;
1284           local_original->icf_merged = true;
1285
1286           if (dump_file && nredirected)
1287             fprintf (dump_file, "%i local calls have been "
1288                      "redirected.\n", nredirected);
1289         }
1290
1291       /* If all callers was redirected, do not produce wrapper.  */
1292       if (alias->can_remove_if_no_direct_calls_p ()
1293           && !alias->has_aliases_p ())
1294         {
1295           create_wrapper = false;
1296           remove = true;
1297         }
1298       gcc_assert (!create_alias);
1299     }
1300   else if (create_alias)
1301     {
1302       alias->icf_merged = true;
1303
1304       /* Remove the function's body.  */
1305       ipa_merge_profiles (original, alias);
1306       alias->release_body (true);
1307       alias->reset ();
1308       /* Notice global symbol possibly produced RTL.  */
1309       ((symtab_node *)alias)->call_for_symbol_and_aliases (clear_decl_rtl,
1310                                                            NULL, true);
1311
1312       /* Create the alias.  */
1313       cgraph_node::create_alias (alias_func->decl, decl);
1314       alias->resolve_alias (original);
1315
1316       original->call_for_symbol_thunks_and_aliases
1317          (set_local, (void *)(size_t) original->local_p (), true);
1318
1319       if (dump_file)
1320         fprintf (dump_file, "Unified; Function alias has been created.\n\n");
1321     }
1322   if (create_wrapper)
1323     {
1324       gcc_assert (!create_alias);
1325       alias->icf_merged = true;
1326       local_original->icf_merged = true;
1327
1328       ipa_merge_profiles (local_original, alias, true);
1329       alias->create_wrapper (local_original);
1330
1331       if (dump_file)
1332         fprintf (dump_file, "Unified; Wrapper has been created.\n\n");
1333     }
1334
1335   /* It's possible that redirection can hit thunks that block
1336      redirection opportunities.  */
1337   gcc_assert (alias->icf_merged || remove || redirect_callers);
1338   original->icf_merged = true;
1339
1340   /* Inform the inliner about cross-module merging.  */
1341   if ((original->lto_file_data || alias->lto_file_data)
1342       && original->lto_file_data != alias->lto_file_data)
1343     local_original->merged = original->merged = true;
1344
1345   if (remove)
1346     {
1347       ipa_merge_profiles (original, alias);
1348       alias->release_body ();
1349       alias->reset ();
1350       alias->body_removed = true;
1351       alias->icf_merged = true;
1352       if (dump_file)
1353         fprintf (dump_file, "Unified; Function body was removed.\n");
1354     }
1355
1356   return true;
1357 }
1358
1359 /* Semantic item initialization function.  */
1360
1361 void
1362 sem_function::init (void)
1363 {
1364   if (in_lto_p)
1365     get_node ()->get_untransformed_body ();
1366
1367   tree fndecl = node->decl;
1368   function *func = DECL_STRUCT_FUNCTION (fndecl);
1369
1370   gcc_assert (func);
1371   gcc_assert (SSANAMES (func));
1372
1373   ssa_names_size = SSANAMES (func)->length ();
1374   node = node;
1375
1376   decl = fndecl;
1377   region_tree = func->eh->region_tree;
1378
1379   /* iterating all function arguments.  */
1380   arg_count = count_formal_params (fndecl);
1381
1382   edge_count = n_edges_for_fn (func);
1383   cfg_checksum = coverage_compute_cfg_checksum (func);
1384
1385   inchash::hash hstate;
1386
1387   basic_block bb;
1388   FOR_EACH_BB_FN (bb, func)
1389   {
1390     unsigned nondbg_stmt_count = 0;
1391
1392     edge e;
1393     for (edge_iterator ei = ei_start (bb->preds); ei_cond (ei, &e);
1394          ei_next (&ei))
1395       cfg_checksum = iterative_hash_host_wide_int (e->flags,
1396                      cfg_checksum);
1397
1398     for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
1399          gsi_next (&gsi))
1400       {
1401         gimple stmt = gsi_stmt (gsi);
1402
1403         if (gimple_code (stmt) != GIMPLE_DEBUG
1404             && gimple_code (stmt) != GIMPLE_PREDICT)
1405           {
1406             hash_stmt (stmt, hstate);
1407             nondbg_stmt_count++;
1408           }
1409       }
1410
1411     gcode_hash = hstate.end ();
1412     bb_sizes.safe_push (nondbg_stmt_count);
1413
1414     /* Inserting basic block to hash table.  */
1415     sem_bb *semantic_bb = new sem_bb (bb, nondbg_stmt_count,
1416                                       EDGE_COUNT (bb->preds)
1417                                       + EDGE_COUNT (bb->succs));
1418
1419     bb_sorted.safe_push (semantic_bb);
1420   }
1421
1422   parse_tree_args ();
1423 }
1424
1425 /* Accumulate to HSTATE a hash of expression EXP.
1426    Identical to inchash::add_expr, but guaranteed to be stable across LTO
1427    and DECL equality classes.  */
1428
1429 void
1430 sem_item::add_expr (const_tree exp, inchash::hash &hstate)
1431 {
1432   if (exp == NULL_TREE)
1433     {
1434       hstate.merge_hash (0);
1435       return;
1436     }
1437
1438   /* Handled component can be matched in a cureful way proving equivalence
1439      even if they syntactically differ.  Just skip them.  */
1440   STRIP_NOPS (exp);
1441   while (handled_component_p (exp))
1442     exp = TREE_OPERAND (exp, 0);
1443
1444   enum tree_code code = TREE_CODE (exp);
1445   hstate.add_int (code);
1446
1447   switch (code)
1448     {
1449     /* Use inchash::add_expr for everything that is LTO stable.  */
1450     case VOID_CST:
1451     case INTEGER_CST:
1452     case REAL_CST:
1453     case FIXED_CST:
1454     case STRING_CST:
1455     case COMPLEX_CST:
1456     case VECTOR_CST:
1457       inchash::add_expr (exp, hstate);
1458       break;
1459     case CONSTRUCTOR:
1460       {
1461         unsigned HOST_WIDE_INT idx;
1462         tree value;
1463
1464         hstate.add_wide_int (int_size_in_bytes (TREE_TYPE (exp)));
1465
1466         FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, value)
1467           if (value)
1468             add_expr (value, hstate);
1469         break;
1470       }
1471     case ADDR_EXPR:
1472     case FDESC_EXPR:
1473       add_expr (get_base_address (TREE_OPERAND (exp, 0)), hstate);
1474       break;
1475     case SSA_NAME:
1476     case VAR_DECL:
1477     case CONST_DECL:
1478     case PARM_DECL:
1479       hstate.add_wide_int (int_size_in_bytes (TREE_TYPE (exp)));
1480       break;
1481     case MEM_REF:
1482     case POINTER_PLUS_EXPR:
1483     case MINUS_EXPR:
1484     case RANGE_EXPR:
1485       add_expr (TREE_OPERAND (exp, 0), hstate);
1486       add_expr (TREE_OPERAND (exp, 1), hstate);
1487       break;
1488     case PLUS_EXPR:
1489       {
1490         inchash::hash one, two;
1491         add_expr (TREE_OPERAND (exp, 0), one);
1492         add_expr (TREE_OPERAND (exp, 1), two);
1493         hstate.add_commutative (one, two);
1494       }
1495       break;
1496     CASE_CONVERT:
1497       hstate.add_wide_int (int_size_in_bytes (TREE_TYPE (exp)));
1498       return add_expr (TREE_OPERAND (exp, 0), hstate);
1499     default:
1500       break;
1501     }
1502 }
1503
1504 /* Accumulate to HSTATE a hash of type t.
1505    TYpes that may end up being compatible after LTO type merging needs to have
1506    the same hash.  */
1507
1508 void
1509 sem_item::add_type (const_tree type, inchash::hash &hstate)
1510 {
1511   if (type == NULL_TREE)
1512     {
1513       hstate.merge_hash (0);
1514       return;
1515     }
1516
1517   type = TYPE_MAIN_VARIANT (type);
1518   if (TYPE_CANONICAL (type))
1519     type = TYPE_CANONICAL (type);
1520
1521   if (!AGGREGATE_TYPE_P (type))
1522     hstate.add_int (TYPE_MODE (type));
1523
1524   if (TREE_CODE (type) == COMPLEX_TYPE)
1525     {
1526       hstate.add_int (COMPLEX_TYPE);
1527       sem_item::add_type (TREE_TYPE (type), hstate);
1528     }
1529   else if (INTEGRAL_TYPE_P (type))
1530     {
1531       hstate.add_int (INTEGER_TYPE);
1532       hstate.add_flag (TYPE_UNSIGNED (type));
1533       hstate.add_int (TYPE_PRECISION (type));
1534     }
1535   else if (VECTOR_TYPE_P (type))
1536     {
1537       hstate.add_int (VECTOR_TYPE);
1538       hstate.add_int (TYPE_PRECISION (type));
1539       sem_item::add_type (TREE_TYPE (type), hstate);
1540     }
1541   else if (TREE_CODE (type) == ARRAY_TYPE)
1542     {
1543       hstate.add_int (ARRAY_TYPE);
1544       /* Do not hash size, so complete and incomplete types can match.  */
1545       sem_item::add_type (TREE_TYPE (type), hstate);
1546     }
1547   else if (RECORD_OR_UNION_TYPE_P (type))
1548     {
1549       hashval_t *val = optimizer->m_type_hash_cache.get (type);
1550
1551       if (!val)
1552         {
1553           inchash::hash hstate2;
1554           unsigned nf;
1555           tree f;
1556           hashval_t hash;
1557
1558           hstate2.add_int (RECORD_TYPE);
1559           gcc_assert (COMPLETE_TYPE_P (type));
1560
1561           for (f = TYPE_FIELDS (type), nf = 0; f; f = TREE_CHAIN (f))
1562             if (TREE_CODE (f) == FIELD_DECL)
1563               {
1564                 add_type (TREE_TYPE (f), hstate2);
1565                 nf++;
1566               }
1567
1568           hstate2.add_int (nf);
1569           hash = hstate2.end ();
1570           hstate.add_wide_int (hash);
1571           optimizer->m_type_hash_cache.put (type, hash);
1572         }
1573       else
1574         hstate.add_wide_int (*val);
1575     }
1576 }
1577
1578 /* Improve accumulated hash for HSTATE based on a gimple statement STMT.  */
1579
1580 void
1581 sem_function::hash_stmt (gimple stmt, inchash::hash &hstate)
1582 {
1583   enum gimple_code code = gimple_code (stmt);
1584
1585   hstate.add_int (code);
1586
1587   switch (code)
1588     {
1589     case GIMPLE_SWITCH:
1590       add_expr (gimple_switch_index (as_a <gswitch *> (stmt)), hstate);
1591       break;
1592     case GIMPLE_ASSIGN:
1593       hstate.add_int (gimple_assign_rhs_code (stmt));
1594       if (commutative_tree_code (gimple_assign_rhs_code (stmt))
1595           || commutative_ternary_tree_code (gimple_assign_rhs_code (stmt)))
1596         {
1597           inchash::hash one, two;
1598
1599           add_expr (gimple_assign_rhs1 (stmt), one);
1600           add_type (TREE_TYPE (gimple_assign_rhs1 (stmt)), one);
1601           add_expr (gimple_assign_rhs2 (stmt), two);
1602           hstate.add_commutative (one, two);
1603           if (commutative_ternary_tree_code (gimple_assign_rhs_code (stmt)))
1604             {
1605               add_expr (gimple_assign_rhs3 (stmt), hstate);
1606               add_type (TREE_TYPE (gimple_assign_rhs3 (stmt)), hstate);
1607             }
1608           add_expr (gimple_assign_lhs (stmt), hstate);
1609           add_type (TREE_TYPE (gimple_assign_lhs (stmt)), two);
1610           break;
1611         }
1612       /* ... fall through ... */
1613     case GIMPLE_CALL:
1614     case GIMPLE_ASM:
1615     case GIMPLE_COND:
1616     case GIMPLE_GOTO:
1617     case GIMPLE_RETURN:
1618       /* All these statements are equivalent if their operands are.  */
1619       for (unsigned i = 0; i < gimple_num_ops (stmt); ++i)
1620         {
1621           add_expr (gimple_op (stmt, i), hstate);
1622           if (gimple_op (stmt, i))
1623             add_type (TREE_TYPE (gimple_op (stmt, i)), hstate);
1624         }
1625     default:
1626       break;
1627     }
1628 }
1629
1630
1631 /* Return true if polymorphic comparison must be processed.  */
1632
1633 bool
1634 sem_function::compare_polymorphic_p (void)
1635 {
1636   struct cgraph_edge *e;
1637
1638   if (!opt_for_fn (get_node ()->decl, flag_devirtualize))
1639     return false;
1640   if (get_node ()->indirect_calls != NULL)
1641     return true;
1642   /* TODO: We can do simple propagation determining what calls may lead to
1643      a polymorphic call.  */
1644   for (e = get_node ()->callees; e; e = e->next_callee)
1645     if (e->callee->definition
1646         && opt_for_fn (e->callee->decl, flag_devirtualize))
1647       return true;
1648   return false;
1649 }
1650
1651 /* For a given call graph NODE, the function constructs new
1652    semantic function item.  */
1653
1654 sem_function *
1655 sem_function::parse (cgraph_node *node, bitmap_obstack *stack)
1656 {
1657   tree fndecl = node->decl;
1658   function *func = DECL_STRUCT_FUNCTION (fndecl);
1659
1660   /* TODO: add support for thunks.  */
1661
1662   if (!func || !node->has_gimple_body_p ())
1663     return NULL;
1664
1665   if (lookup_attribute_by_prefix ("omp ", DECL_ATTRIBUTES (node->decl)) != NULL)
1666     return NULL;
1667
1668   sem_function *f = new sem_function (node, 0, stack);
1669
1670   f->init ();
1671
1672   return f;
1673 }
1674
1675 /* Parses function arguments and result type.  */
1676
1677 void
1678 sem_function::parse_tree_args (void)
1679 {
1680   tree result;
1681
1682   if (arg_types.exists ())
1683     arg_types.release ();
1684
1685   arg_types.create (4);
1686   tree fnargs = DECL_ARGUMENTS (decl);
1687
1688   for (tree parm = fnargs; parm; parm = DECL_CHAIN (parm))
1689     arg_types.safe_push (DECL_ARG_TYPE (parm));
1690
1691   /* Function result type.  */
1692   result = DECL_RESULT (decl);
1693   result_type = result ? TREE_TYPE (result) : NULL;
1694
1695   /* During WPA, we can get arguments by following method.  */
1696   if (!fnargs)
1697     {
1698       tree type = TYPE_ARG_TYPES (TREE_TYPE (decl));
1699       for (tree parm = type; parm; parm = TREE_CHAIN (parm))
1700         arg_types.safe_push (TYPE_CANONICAL (TREE_VALUE (parm)));
1701
1702       result_type = TREE_TYPE (TREE_TYPE (decl));
1703     }
1704 }
1705
1706 /* For given basic blocks BB1 and BB2 (from functions FUNC1 and FUNC),
1707    return true if phi nodes are semantically equivalent in these blocks .  */
1708
1709 bool
1710 sem_function::compare_phi_node (basic_block bb1, basic_block bb2)
1711 {
1712   gphi_iterator si1, si2;
1713   gphi *phi1, *phi2;
1714   unsigned size1, size2, i;
1715   tree t1, t2;
1716   edge e1, e2;
1717
1718   gcc_assert (bb1 != NULL);
1719   gcc_assert (bb2 != NULL);
1720
1721   si2 = gsi_start_phis (bb2);
1722   for (si1 = gsi_start_phis (bb1); !gsi_end_p (si1);
1723        gsi_next (&si1))
1724     {
1725       gsi_next_nonvirtual_phi (&si1);
1726       gsi_next_nonvirtual_phi (&si2);
1727
1728       if (gsi_end_p (si1) && gsi_end_p (si2))
1729         break;
1730
1731       if (gsi_end_p (si1) || gsi_end_p (si2))
1732         return return_false();
1733
1734       phi1 = si1.phi ();
1735       phi2 = si2.phi ();
1736
1737       tree phi_result1 = gimple_phi_result (phi1);
1738       tree phi_result2 = gimple_phi_result (phi2);
1739
1740       if (!m_checker->compare_operand (phi_result1, phi_result2))
1741         return return_false_with_msg ("PHI results are different");
1742
1743       size1 = gimple_phi_num_args (phi1);
1744       size2 = gimple_phi_num_args (phi2);
1745
1746       if (size1 != size2)
1747         return return_false ();
1748
1749       for (i = 0; i < size1; ++i)
1750         {
1751           t1 = gimple_phi_arg (phi1, i)->def;
1752           t2 = gimple_phi_arg (phi2, i)->def;
1753
1754           if (!m_checker->compare_operand (t1, t2))
1755             return return_false ();
1756
1757           e1 = gimple_phi_arg_edge (phi1, i);
1758           e2 = gimple_phi_arg_edge (phi2, i);
1759
1760           if (!m_checker->compare_edge (e1, e2))
1761             return return_false ();
1762         }
1763
1764       gsi_next (&si2);
1765     }
1766
1767   return true;
1768 }
1769
1770 /* Returns true if tree T can be compared as a handled component.  */
1771
1772 bool
1773 sem_function::icf_handled_component_p (tree t)
1774 {
1775   tree_code tc = TREE_CODE (t);
1776
1777   return ((handled_component_p (t))
1778           || tc == ADDR_EXPR || tc == MEM_REF || tc == REALPART_EXPR
1779           || tc == IMAGPART_EXPR || tc == OBJ_TYPE_REF);
1780 }
1781
1782 /* Basic blocks dictionary BB_DICT returns true if SOURCE index BB
1783    corresponds to TARGET.  */
1784
1785 bool
1786 sem_function::bb_dict_test (vec<int> *bb_dict, int source, int target)
1787 {
1788   source++;
1789   target++;
1790
1791   if (bb_dict->length () <= (unsigned)source)
1792     bb_dict->safe_grow_cleared (source + 1);
1793
1794   if ((*bb_dict)[source] == 0)
1795     {
1796       (*bb_dict)[source] = target;
1797       return true;
1798     }
1799   else
1800     return (*bb_dict)[source] == target;
1801 }
1802
1803
1804 /* Semantic variable constructor that uses STACK as bitmap memory stack.  */
1805
1806 sem_variable::sem_variable (bitmap_obstack *stack): sem_item (VAR, stack)
1807 {
1808 }
1809
1810 /*  Constructor based on varpool node _NODE with computed hash _HASH.
1811     Bitmap STACK is used for memory allocation.  */
1812
1813 sem_variable::sem_variable (varpool_node *node, hashval_t _hash,
1814                             bitmap_obstack *stack): sem_item(VAR,
1815                                   node, _hash, stack)
1816 {
1817   gcc_checking_assert (node);
1818   gcc_checking_assert (get_node ());
1819 }
1820
1821 /* Fast equality function based on knowledge known in WPA.  */
1822
1823 bool
1824 sem_variable::equals_wpa (sem_item *item,
1825                           hash_map <symtab_node *, sem_item *> &ignored_nodes)
1826 {
1827   gcc_assert (item->type == VAR);
1828
1829   if (node->num_references () != item->node->num_references ())
1830     return return_false_with_msg ("different number of references");
1831
1832   if (DECL_TLS_MODEL (decl) || DECL_TLS_MODEL (item->decl))
1833     return return_false_with_msg ("TLS model");
1834
1835   /* DECL_ALIGN is safe to merge, because we will always chose the largest
1836      alignment out of all aliases.  */
1837
1838   if (DECL_VIRTUAL_P (decl) != DECL_VIRTUAL_P (item->decl))
1839     return return_false_with_msg ("Virtual flag mismatch");
1840
1841   if (DECL_SIZE (decl) != DECL_SIZE (item->decl)
1842       && ((!DECL_SIZE (decl) || !DECL_SIZE (item->decl))
1843           || !operand_equal_p (DECL_SIZE (decl),
1844                                DECL_SIZE (item->decl), OEP_ONLY_CONST)))
1845     return return_false_with_msg ("size mismatch");
1846
1847   /* Do not attempt to mix data from different user sections;
1848      we do not know what user intends with those.  */
1849   if (((DECL_SECTION_NAME (decl) && !node->implicit_section)
1850        || (DECL_SECTION_NAME (item->decl) && !item->node->implicit_section))
1851       && DECL_SECTION_NAME (decl) != DECL_SECTION_NAME (item->decl))
1852     return return_false_with_msg ("user section mismatch");
1853
1854   if (DECL_IN_TEXT_SECTION (decl) != DECL_IN_TEXT_SECTION (item->decl))
1855     return return_false_with_msg ("text section");
1856
1857   ipa_ref *ref = NULL, *ref2 = NULL;
1858   for (unsigned i = 0; node->iterate_reference (i, ref); i++)
1859     {
1860       item->node->iterate_reference (i, ref2);
1861
1862       if (ref->use != ref2->use)
1863         return return_false_with_msg ("reference use mismatch");
1864
1865       if (!compare_symbol_references (ignored_nodes,
1866                                       ref->referred, ref2->referred,
1867                                       ref->address_matters_p ()))
1868         return false;
1869     }
1870
1871   return true;
1872 }
1873
1874 /* Returns true if the item equals to ITEM given as argument.  */
1875
1876 bool
1877 sem_variable::equals (sem_item *item,
1878                       hash_map <symtab_node *, sem_item *> &)
1879 {
1880   gcc_assert (item->type == VAR);
1881   bool ret;
1882
1883   if (DECL_INITIAL (decl) == error_mark_node && in_lto_p)
1884     dyn_cast <varpool_node *>(node)->get_constructor ();
1885   if (DECL_INITIAL (item->decl) == error_mark_node && in_lto_p)
1886     dyn_cast <varpool_node *>(item->node)->get_constructor ();
1887
1888   /* As seen in PR ipa/65303 we have to compare variables types.  */
1889   if (!func_checker::compatible_types_p (TREE_TYPE (decl),
1890                                          TREE_TYPE (item->decl)))
1891     return return_false_with_msg ("variables types are different");
1892
1893   ret = sem_variable::equals (DECL_INITIAL (decl),
1894                               DECL_INITIAL (item->node->decl));
1895   if (dump_file && (dump_flags & TDF_DETAILS))
1896     fprintf (dump_file,
1897              "Equals called for vars:%s:%s (%u:%u) (%s:%s) with result: %s\n\n",
1898              xstrdup_for_dump (node->name()),
1899              xstrdup_for_dump (item->node->name ()),
1900              node->order, item->node->order,
1901              xstrdup_for_dump (node->asm_name ()),
1902              xstrdup_for_dump (item->node->asm_name ()), ret ? "true" : "false");
1903
1904   return ret;
1905 }
1906
1907 /* Compares trees T1 and T2 for semantic equality.  */
1908
1909 bool
1910 sem_variable::equals (tree t1, tree t2)
1911 {
1912   if (!t1 || !t2)
1913     return return_with_debug (t1 == t2);
1914   if (t1 == t2)
1915     return true;
1916   tree_code tc1 = TREE_CODE (t1);
1917   tree_code tc2 = TREE_CODE (t2);
1918
1919   if (tc1 != tc2)
1920     return return_false_with_msg ("TREE_CODE mismatch");
1921
1922   switch (tc1)
1923     {
1924     case CONSTRUCTOR:
1925       {
1926         vec<constructor_elt, va_gc> *v1, *v2;
1927         unsigned HOST_WIDE_INT idx;
1928
1929         enum tree_code typecode = TREE_CODE (TREE_TYPE (t1));
1930         if (typecode != TREE_CODE (TREE_TYPE (t2)))
1931           return return_false_with_msg ("constructor type mismatch");
1932
1933         if (typecode == ARRAY_TYPE)
1934           {
1935             HOST_WIDE_INT size_1 = int_size_in_bytes (TREE_TYPE (t1));
1936             /* For arrays, check that the sizes all match.  */
1937             if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2))
1938                 || size_1 == -1
1939                 || size_1 != int_size_in_bytes (TREE_TYPE (t2)))
1940               return return_false_with_msg ("constructor array size mismatch");
1941           }
1942         else if (!func_checker::compatible_types_p (TREE_TYPE (t1),
1943                                                     TREE_TYPE (t2)))
1944           return return_false_with_msg ("constructor type incompatible");
1945
1946         v1 = CONSTRUCTOR_ELTS (t1);
1947         v2 = CONSTRUCTOR_ELTS (t2);
1948         if (vec_safe_length (v1) != vec_safe_length (v2))
1949           return return_false_with_msg ("constructor number of elts mismatch");
1950
1951         for (idx = 0; idx < vec_safe_length (v1); ++idx)
1952           {
1953             constructor_elt *c1 = &(*v1)[idx];
1954             constructor_elt *c2 = &(*v2)[idx];
1955
1956             /* Check that each value is the same...  */
1957             if (!sem_variable::equals (c1->value, c2->value))
1958               return false;
1959             /* ... and that they apply to the same fields!  */
1960             if (!sem_variable::equals (c1->index, c2->index))
1961               return false;
1962           }
1963         return true;
1964       }
1965     case MEM_REF:
1966       {
1967         tree x1 = TREE_OPERAND (t1, 0);
1968         tree x2 = TREE_OPERAND (t2, 0);
1969         tree y1 = TREE_OPERAND (t1, 1);
1970         tree y2 = TREE_OPERAND (t2, 1);
1971
1972         if (!func_checker::compatible_types_p (TREE_TYPE (x1), TREE_TYPE (x2)))
1973           return return_false ();
1974
1975         /* Type of the offset on MEM_REF does not matter.  */
1976         return return_with_debug (sem_variable::equals (x1, x2)
1977                                   && wi::to_offset  (y1)
1978                                      == wi::to_offset  (y2));
1979       }
1980     case ADDR_EXPR:
1981     case FDESC_EXPR:
1982       {
1983         tree op1 = TREE_OPERAND (t1, 0);
1984         tree op2 = TREE_OPERAND (t2, 0);
1985         return sem_variable::equals (op1, op2);
1986       }
1987     /* References to other vars/decls are compared using ipa-ref.  */
1988     case FUNCTION_DECL:
1989     case VAR_DECL:
1990       if (decl_in_symtab_p (t1) && decl_in_symtab_p (t2))
1991         return true;
1992       return return_false_with_msg ("Declaration mismatch");
1993     case CONST_DECL:
1994       /* TODO: We can check CONST_DECL by its DECL_INITIAL, but for that we
1995          need to process its VAR/FUNCTION references without relying on ipa-ref
1996          compare.  */
1997     case FIELD_DECL:
1998     case LABEL_DECL:
1999       return return_false_with_msg ("Declaration mismatch");
2000     case INTEGER_CST:
2001       /* Integer constants are the same only if the same width of type.  */
2002       if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
2003         return return_false_with_msg ("INTEGER_CST precision mismatch");
2004       if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2)))
2005         return return_false_with_msg ("INTEGER_CST mode mismatch");
2006       return return_with_debug (tree_int_cst_equal (t1, t2));
2007     case STRING_CST:
2008       if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2)))
2009         return return_false_with_msg ("STRING_CST mode mismatch");
2010       if (TREE_STRING_LENGTH (t1) != TREE_STRING_LENGTH (t2))
2011         return return_false_with_msg ("STRING_CST length mismatch");
2012       if (memcmp (TREE_STRING_POINTER (t1), TREE_STRING_POINTER (t2),
2013                     TREE_STRING_LENGTH (t1)))
2014         return return_false_with_msg ("STRING_CST mismatch");
2015       return true;
2016     case FIXED_CST:
2017       /* Fixed constants are the same only if the same width of type.  */
2018       if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
2019         return return_false_with_msg ("FIXED_CST precision mismatch");
2020
2021       return return_with_debug (FIXED_VALUES_IDENTICAL (TREE_FIXED_CST (t1),
2022                                                         TREE_FIXED_CST (t2)));
2023     case COMPLEX_CST:
2024       return (sem_variable::equals (TREE_REALPART (t1), TREE_REALPART (t2))
2025               && sem_variable::equals (TREE_IMAGPART (t1), TREE_IMAGPART (t2)));
2026     case REAL_CST:
2027       /* Real constants are the same only if the same width of type.  */
2028       if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
2029         return return_false_with_msg ("REAL_CST precision mismatch");
2030       return return_with_debug (REAL_VALUES_IDENTICAL (TREE_REAL_CST (t1),
2031                                                        TREE_REAL_CST (t2)));
2032     case VECTOR_CST:
2033       {
2034         unsigned i;
2035
2036         if (VECTOR_CST_NELTS (t1) != VECTOR_CST_NELTS (t2))
2037           return return_false_with_msg ("VECTOR_CST nelts mismatch");
2038
2039         for (i = 0; i < VECTOR_CST_NELTS (t1); ++i)
2040           if (!sem_variable::equals (VECTOR_CST_ELT (t1, i),
2041                                      VECTOR_CST_ELT (t2, i)))
2042             return 0;
2043
2044         return 1;
2045       }
2046     case ARRAY_REF:
2047     case ARRAY_RANGE_REF:
2048       {
2049         tree x1 = TREE_OPERAND (t1, 0);
2050         tree x2 = TREE_OPERAND (t2, 0);
2051         tree y1 = TREE_OPERAND (t1, 1);
2052         tree y2 = TREE_OPERAND (t2, 1);
2053
2054         if (!sem_variable::equals (x1, x2) || !sem_variable::equals (y1, y2))
2055           return false;
2056         if (!sem_variable::equals (array_ref_low_bound (t1),
2057                                    array_ref_low_bound (t2)))
2058           return false;
2059         if (!sem_variable::equals (array_ref_element_size (t1),
2060                                    array_ref_element_size (t2)))
2061           return false;
2062         return true;
2063       }
2064      
2065     case COMPONENT_REF:
2066     case POINTER_PLUS_EXPR:
2067     case PLUS_EXPR:
2068     case MINUS_EXPR:
2069     case RANGE_EXPR:
2070       {
2071         tree x1 = TREE_OPERAND (t1, 0);
2072         tree x2 = TREE_OPERAND (t2, 0);
2073         tree y1 = TREE_OPERAND (t1, 1);
2074         tree y2 = TREE_OPERAND (t2, 1);
2075
2076         return sem_variable::equals (x1, x2) && sem_variable::equals (y1, y2);
2077       }
2078
2079     CASE_CONVERT:
2080     case VIEW_CONVERT_EXPR:
2081       if (!func_checker::compatible_types_p (TREE_TYPE (t1), TREE_TYPE (t2)))
2082           return return_false ();
2083       return sem_variable::equals (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2084     case ERROR_MARK:
2085       return return_false_with_msg ("ERROR_MARK");
2086     default:
2087       return return_false_with_msg ("Unknown TREE code reached");
2088     }
2089 }
2090
2091 /* Parser function that visits a varpool NODE.  */
2092
2093 sem_variable *
2094 sem_variable::parse (varpool_node *node, bitmap_obstack *stack)
2095 {
2096   if (TREE_THIS_VOLATILE (node->decl) || DECL_HARD_REGISTER (node->decl)
2097       || node->alias)
2098     return NULL;
2099
2100   sem_variable *v = new sem_variable (node, 0, stack);
2101
2102   v->init ();
2103
2104   return v;
2105 }
2106
2107 /* References independent hash function.  */
2108
2109 hashval_t
2110 sem_variable::get_hash (void)
2111 {
2112   if (hash)
2113     return hash;
2114
2115   /* All WPA streamed in symbols should have their hashes computed at compile
2116      time.  At this point, the constructor may not be in memory at all.
2117      DECL_INITIAL (decl) would be error_mark_node in that case.  */
2118   gcc_assert (!node->lto_file_data);
2119   tree ctor = DECL_INITIAL (decl);
2120   inchash::hash hstate;
2121
2122   hstate.add_int (456346417);
2123   if (DECL_SIZE (decl) && tree_fits_shwi_p (DECL_SIZE (decl)))
2124     hstate.add_wide_int (tree_to_shwi (DECL_SIZE (decl)));
2125   add_expr (ctor, hstate);
2126   hash = hstate.end ();
2127
2128   return hash;
2129 }
2130
2131 /* Merges instance with an ALIAS_ITEM, where alias, thunk or redirection can
2132    be applied.  */
2133
2134 bool
2135 sem_variable::merge (sem_item *alias_item)
2136 {
2137   gcc_assert (alias_item->type == VAR);
2138
2139   if (!sem_item::target_supports_symbol_aliases_p ())
2140     {
2141       if (dump_file)
2142         fprintf (dump_file, "Not unifying; "
2143                  "Symbol aliases are not supported by target\n\n");
2144       return false;
2145     }
2146
2147   if (DECL_EXTERNAL (alias_item->decl))
2148     {
2149       if (dump_file)
2150         fprintf (dump_file, "Not unifying; alias is external.\n\n");
2151       return false;
2152     }
2153
2154   sem_variable *alias_var = static_cast<sem_variable *> (alias_item);
2155
2156   varpool_node *original = get_node ();
2157   varpool_node *alias = alias_var->get_node ();
2158   bool original_discardable = false;
2159
2160   bool original_address_matters = original->address_matters_p ();
2161   bool alias_address_matters = alias->address_matters_p ();
2162
2163   /* See if original is in a section that can be discarded if the main
2164      symbol is not used.
2165      Also consider case where we have resolution info and we know that
2166      original's definition is not going to be used.  In this case we can not
2167      create alias to original.  */
2168   if (original->can_be_discarded_p ()
2169       || (node->resolution != LDPR_UNKNOWN
2170           && !decl_binds_to_current_def_p (node->decl)))
2171     original_discardable = true;
2172
2173   gcc_assert (!TREE_ASM_WRITTEN (alias->decl));
2174
2175   /* Constant pool machinery is not quite ready for aliases.
2176      TODO: varasm code contains logic for merging DECL_IN_CONSTANT_POOL.
2177      For LTO merging does not happen that is an important missing feature.
2178      We can enable merging with LTO if the DECL_IN_CONSTANT_POOL
2179      flag is dropped and non-local symbol name is assigned.  */
2180   if (DECL_IN_CONSTANT_POOL (alias->decl)
2181       || DECL_IN_CONSTANT_POOL (original->decl))
2182     {
2183       if (dump_file)
2184         fprintf (dump_file,
2185                  "Not unifying; constant pool variables.\n\n");
2186       return false;
2187     }
2188
2189   /* Do not attempt to mix functions from different user sections;
2190      we do not know what user intends with those.  */
2191   if (((DECL_SECTION_NAME (original->decl) && !original->implicit_section)
2192        || (DECL_SECTION_NAME (alias->decl) && !alias->implicit_section))
2193       && DECL_SECTION_NAME (original->decl) != DECL_SECTION_NAME (alias->decl))
2194     {
2195       if (dump_file)
2196         fprintf (dump_file,
2197                  "Not unifying; "
2198                  "original and alias are in different sections.\n\n");
2199       return false;
2200     }
2201
2202   /* We can not merge if address comparsion metters.  */
2203   if (original_address_matters && alias_address_matters
2204       && flag_merge_constants < 2)
2205     {
2206       if (dump_file)
2207         fprintf (dump_file,
2208                  "Not unifying; "
2209                  "adress of original and alias may be compared.\n\n");
2210       return false;
2211     }
2212   if (DECL_COMDAT_GROUP (original->decl) != DECL_COMDAT_GROUP (alias->decl))
2213     {
2214       if (dump_file)
2215         fprintf (dump_file, "Not unifying; alias cannot be created; "
2216                  "across comdat group boundary\n\n");
2217
2218       return false;
2219     }
2220
2221   if (original_discardable)
2222     {
2223       if (dump_file)
2224         fprintf (dump_file, "Not unifying; alias cannot be created; "
2225                  "target is discardable\n\n");
2226
2227       return false;
2228     }
2229   else
2230     {
2231       gcc_assert (!original->alias);
2232       gcc_assert (!alias->alias);
2233
2234       alias->analyzed = false;
2235
2236       DECL_INITIAL (alias->decl) = NULL;
2237       ((symtab_node *)alias)->call_for_symbol_and_aliases (clear_decl_rtl,
2238                                                            NULL, true);
2239       alias->need_bounds_init = false;
2240       alias->remove_all_references ();
2241       if (TREE_ADDRESSABLE (alias->decl))
2242         original->call_for_symbol_and_aliases (set_addressable, NULL, true);
2243
2244       varpool_node::create_alias (alias_var->decl, decl);
2245       alias->resolve_alias (original);
2246
2247       if (dump_file)
2248         fprintf (dump_file, "Unified; Variable alias has been created.\n\n");
2249
2250       return true;
2251     }
2252 }
2253
2254 /* Dump symbol to FILE.  */
2255
2256 void
2257 sem_variable::dump_to_file (FILE *file)
2258 {
2259   gcc_assert (file);
2260
2261   print_node (file, "", decl, 0);
2262   fprintf (file, "\n\n");
2263 }
2264
2265 unsigned int sem_item_optimizer::class_id = 0;
2266
2267 sem_item_optimizer::sem_item_optimizer (): worklist (0), m_classes (0),
2268   m_classes_count (0), m_cgraph_node_hooks (NULL), m_varpool_node_hooks (NULL)
2269 {
2270   m_items.create (0);
2271   bitmap_obstack_initialize (&m_bmstack);
2272 }
2273
2274 sem_item_optimizer::~sem_item_optimizer ()
2275 {
2276   for (unsigned int i = 0; i < m_items.length (); i++)
2277     delete m_items[i];
2278
2279   for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
2280        it != m_classes.end (); ++it)
2281     {
2282       for (unsigned int i = 0; i < (*it)->classes.length (); i++)
2283         delete (*it)->classes[i];
2284
2285       (*it)->classes.release ();
2286       free (*it);
2287     }
2288
2289   m_items.release ();
2290
2291   bitmap_obstack_release (&m_bmstack);
2292 }
2293
2294 /* Write IPA ICF summary for symbols.  */
2295
2296 void
2297 sem_item_optimizer::write_summary (void)
2298 {
2299   unsigned int count = 0;
2300
2301   output_block *ob = create_output_block (LTO_section_ipa_icf);
2302   lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
2303   ob->symbol = NULL;
2304
2305   /* Calculate number of symbols to be serialized.  */
2306   for (lto_symtab_encoder_iterator lsei = lsei_start_in_partition (encoder);
2307        !lsei_end_p (lsei);
2308        lsei_next_in_partition (&lsei))
2309     {
2310       symtab_node *node = lsei_node (lsei);
2311
2312       if (m_symtab_node_map.get (node))
2313         count++;
2314     }
2315
2316   streamer_write_uhwi (ob, count);
2317
2318   /* Process all of the symbols.  */
2319   for (lto_symtab_encoder_iterator lsei = lsei_start_in_partition (encoder);
2320        !lsei_end_p (lsei);
2321        lsei_next_in_partition (&lsei))
2322     {
2323       symtab_node *node = lsei_node (lsei);
2324
2325       sem_item **item = m_symtab_node_map.get (node);
2326
2327       if (item && *item)
2328         {
2329           int node_ref = lto_symtab_encoder_encode (encoder, node);
2330           streamer_write_uhwi_stream (ob->main_stream, node_ref);
2331
2332           streamer_write_uhwi (ob, (*item)->get_hash ());
2333         }
2334     }
2335
2336   streamer_write_char_stream (ob->main_stream, 0);
2337   produce_asm (ob, NULL);
2338   destroy_output_block (ob);
2339 }
2340
2341 /* Reads a section from LTO stream file FILE_DATA. Input block for DATA
2342    contains LEN bytes.  */
2343
2344 void
2345 sem_item_optimizer::read_section (lto_file_decl_data *file_data,
2346                                   const char *data, size_t len)
2347 {
2348   const lto_function_header *header =
2349     (const lto_function_header *) data;
2350   const int cfg_offset = sizeof (lto_function_header);
2351   const int main_offset = cfg_offset + header->cfg_size;
2352   const int string_offset = main_offset + header->main_size;
2353   data_in *data_in;
2354   unsigned int i;
2355   unsigned int count;
2356
2357   lto_input_block ib_main ((const char *) data + main_offset, 0,
2358                            header->main_size, file_data->mode_table);
2359
2360   data_in =
2361     lto_data_in_create (file_data, (const char *) data + string_offset,
2362                         header->string_size, vNULL);
2363
2364   count = streamer_read_uhwi (&ib_main);
2365
2366   for (i = 0; i < count; i++)
2367     {
2368       unsigned int index;
2369       symtab_node *node;
2370       lto_symtab_encoder_t encoder;
2371
2372       index = streamer_read_uhwi (&ib_main);
2373       encoder = file_data->symtab_node_encoder;
2374       node = lto_symtab_encoder_deref (encoder, index);
2375
2376       hashval_t hash = streamer_read_uhwi (&ib_main);
2377
2378       gcc_assert (node->definition);
2379
2380       if (dump_file)
2381         fprintf (dump_file, "Symbol added:%s (tree: %p, uid:%u)\n",
2382                  node->asm_name (), (void *) node->decl, node->order);
2383
2384       if (is_a<cgraph_node *> (node))
2385         {
2386           cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
2387
2388           m_items.safe_push (new sem_function (cnode, hash, &m_bmstack));
2389         }
2390       else
2391         {
2392           varpool_node *vnode = dyn_cast <varpool_node *> (node);
2393
2394           m_items.safe_push (new sem_variable (vnode, hash, &m_bmstack));
2395         }
2396     }
2397
2398   lto_free_section_data (file_data, LTO_section_ipa_icf, NULL, data,
2399                          len);
2400   lto_data_in_delete (data_in);
2401 }
2402
2403 /* Read IPA IPA ICF summary for symbols.  */
2404
2405 void
2406 sem_item_optimizer::read_summary (void)
2407 {
2408   lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
2409   lto_file_decl_data *file_data;
2410   unsigned int j = 0;
2411
2412   while ((file_data = file_data_vec[j++]))
2413     {
2414       size_t len;
2415       const char *data = lto_get_section_data (file_data,
2416                          LTO_section_ipa_icf, NULL, &len);
2417
2418       if (data)
2419         read_section (file_data, data, len);
2420     }
2421 }
2422
2423 /* Register callgraph and varpool hooks.  */
2424
2425 void
2426 sem_item_optimizer::register_hooks (void)
2427 {
2428   if (!m_cgraph_node_hooks)
2429     m_cgraph_node_hooks = symtab->add_cgraph_removal_hook
2430                           (&sem_item_optimizer::cgraph_removal_hook, this);
2431
2432   if (!m_varpool_node_hooks)
2433     m_varpool_node_hooks = symtab->add_varpool_removal_hook
2434                            (&sem_item_optimizer::varpool_removal_hook, this);
2435 }
2436
2437 /* Unregister callgraph and varpool hooks.  */
2438
2439 void
2440 sem_item_optimizer::unregister_hooks (void)
2441 {
2442   if (m_cgraph_node_hooks)
2443     symtab->remove_cgraph_removal_hook (m_cgraph_node_hooks);
2444
2445   if (m_varpool_node_hooks)
2446     symtab->remove_varpool_removal_hook (m_varpool_node_hooks);
2447 }
2448
2449 /* Adds a CLS to hashtable associated by hash value.  */
2450
2451 void
2452 sem_item_optimizer::add_class (congruence_class *cls)
2453 {
2454   gcc_assert (cls->members.length ());
2455
2456   congruence_class_group *group = get_group_by_hash (
2457                                     cls->members[0]->get_hash (),
2458                                     cls->members[0]->type);
2459   group->classes.safe_push (cls);
2460 }
2461
2462 /* Gets a congruence class group based on given HASH value and TYPE.  */
2463
2464 congruence_class_group *
2465 sem_item_optimizer::get_group_by_hash (hashval_t hash, sem_item_type type)
2466 {
2467   congruence_class_group *item = XNEW (congruence_class_group);
2468   item->hash = hash;
2469   item->type = type;
2470
2471   congruence_class_group **slot = m_classes.find_slot (item, INSERT);
2472
2473   if (*slot)
2474     free (item);
2475   else
2476     {
2477       item->classes.create (1);
2478       *slot = item;
2479     }
2480
2481   return *slot;
2482 }
2483
2484 /* Callgraph removal hook called for a NODE with a custom DATA.  */
2485
2486 void
2487 sem_item_optimizer::cgraph_removal_hook (cgraph_node *node, void *data)
2488 {
2489   sem_item_optimizer *optimizer = (sem_item_optimizer *) data;
2490   optimizer->remove_symtab_node (node);
2491 }
2492
2493 /* Varpool removal hook called for a NODE with a custom DATA.  */
2494
2495 void
2496 sem_item_optimizer::varpool_removal_hook (varpool_node *node, void *data)
2497 {
2498   sem_item_optimizer *optimizer = (sem_item_optimizer *) data;
2499   optimizer->remove_symtab_node (node);
2500 }
2501
2502 /* Remove symtab NODE triggered by symtab removal hooks.  */
2503
2504 void
2505 sem_item_optimizer::remove_symtab_node (symtab_node *node)
2506 {
2507   gcc_assert (!m_classes.elements());
2508
2509   m_removed_items_set.add (node);
2510 }
2511
2512 void
2513 sem_item_optimizer::remove_item (sem_item *item)
2514 {
2515   if (m_symtab_node_map.get (item->node))
2516     m_symtab_node_map.remove (item->node);
2517   delete item;
2518 }
2519
2520 /* Removes all callgraph and varpool nodes that are marked by symtab
2521    as deleted.  */
2522
2523 void
2524 sem_item_optimizer::filter_removed_items (void)
2525 {
2526   auto_vec <sem_item *> filtered;
2527
2528   for (unsigned int i = 0; i < m_items.length(); i++)
2529     {
2530       sem_item *item = m_items[i];
2531
2532       if (m_removed_items_set.contains (item->node))
2533         {
2534           remove_item (item);
2535           continue;
2536         }
2537
2538       if (item->type == FUNC)
2539         {
2540           cgraph_node *cnode = static_cast <sem_function *>(item)->get_node ();
2541
2542           if (in_lto_p && (cnode->alias || cnode->body_removed))
2543             remove_item (item);
2544           else
2545             filtered.safe_push (item);
2546         }
2547       else /* VAR.  */
2548         {
2549           if (!flag_ipa_icf_variables)
2550             remove_item (item);
2551           else
2552             {
2553               /* Filter out non-readonly variables.  */
2554               tree decl = item->decl;
2555               if (TREE_READONLY (decl))
2556                 filtered.safe_push (item);
2557               else
2558                 remove_item (item);
2559             }
2560         }
2561     }
2562
2563   /* Clean-up of released semantic items.  */
2564
2565   m_items.release ();
2566   for (unsigned int i = 0; i < filtered.length(); i++)
2567     m_items.safe_push (filtered[i]);
2568 }
2569
2570 /* Optimizer entry point which returns true in case it processes
2571    a merge operation. True is returned if there's a merge operation
2572    processed.  */
2573
2574 bool
2575 sem_item_optimizer::execute (void)
2576 {
2577   filter_removed_items ();
2578   unregister_hooks ();
2579
2580   build_graph ();
2581   update_hash_by_addr_refs ();
2582   build_hash_based_classes ();
2583
2584   if (dump_file)
2585     fprintf (dump_file, "Dump after hash based groups\n");
2586   dump_cong_classes ();
2587
2588   for (unsigned int i = 0; i < m_items.length(); i++)
2589     m_items[i]->init_wpa ();
2590
2591   subdivide_classes_by_equality (true);
2592
2593   if (dump_file)
2594     fprintf (dump_file, "Dump after WPA based types groups\n");
2595
2596   dump_cong_classes ();
2597
2598   process_cong_reduction ();
2599   verify_classes ();
2600
2601   if (dump_file)
2602     fprintf (dump_file, "Dump after callgraph-based congruence reduction\n");
2603
2604   dump_cong_classes ();
2605
2606   parse_nonsingleton_classes ();
2607   subdivide_classes_by_equality ();
2608
2609   if (dump_file)
2610     fprintf (dump_file, "Dump after full equality comparison of groups\n");
2611
2612   dump_cong_classes ();
2613
2614   unsigned int prev_class_count = m_classes_count;
2615
2616   process_cong_reduction ();
2617   dump_cong_classes ();
2618   verify_classes ();
2619   bool merged_p = merge_classes (prev_class_count);
2620
2621   if (dump_file && (dump_flags & TDF_DETAILS))
2622     symtab_node::dump_table (dump_file);
2623
2624   return merged_p;
2625 }
2626
2627 /* Function responsible for visiting all potential functions and
2628    read-only variables that can be merged.  */
2629
2630 void
2631 sem_item_optimizer::parse_funcs_and_vars (void)
2632 {
2633   cgraph_node *cnode;
2634
2635   if (flag_ipa_icf_functions)
2636     FOR_EACH_DEFINED_FUNCTION (cnode)
2637     {
2638       sem_function *f = sem_function::parse (cnode, &m_bmstack);
2639       if (f)
2640         {
2641           m_items.safe_push (f);
2642           m_symtab_node_map.put (cnode, f);
2643
2644           if (dump_file)
2645             fprintf (dump_file, "Parsed function:%s\n", f->node->asm_name ());
2646
2647           if (dump_file && (dump_flags & TDF_DETAILS))
2648             f->dump_to_file (dump_file);
2649         }
2650       else if (dump_file)
2651         fprintf (dump_file, "Not parsed function:%s\n", cnode->asm_name ());
2652     }
2653
2654   varpool_node *vnode;
2655
2656   if (flag_ipa_icf_variables)
2657     FOR_EACH_DEFINED_VARIABLE (vnode)
2658     {
2659       sem_variable *v = sem_variable::parse (vnode, &m_bmstack);
2660
2661       if (v)
2662         {
2663           m_items.safe_push (v);
2664           m_symtab_node_map.put (vnode, v);
2665         }
2666     }
2667 }
2668
2669 /* Makes pairing between a congruence class CLS and semantic ITEM.  */
2670
2671 void
2672 sem_item_optimizer::add_item_to_class (congruence_class *cls, sem_item *item)
2673 {
2674   item->index_in_class = cls->members.length ();
2675   cls->members.safe_push (item);
2676   item->cls = cls;
2677 }
2678
2679 /* For each semantic item, append hash values of references.  */
2680
2681 void
2682 sem_item_optimizer::update_hash_by_addr_refs ()
2683 {
2684   /* First, append to hash sensitive references and class type if it need to
2685      be matched for ODR.  */
2686   for (unsigned i = 0; i < m_items.length (); i++)
2687     {
2688       m_items[i]->update_hash_by_addr_refs (m_symtab_node_map);
2689       if (m_items[i]->type == FUNC)
2690         {
2691           if (TREE_CODE (TREE_TYPE (m_items[i]->decl)) == METHOD_TYPE
2692               && contains_polymorphic_type_p
2693                    (method_class_type (TREE_TYPE (m_items[i]->decl)))
2694               && (DECL_CXX_CONSTRUCTOR_P (m_items[i]->decl)
2695                   || (static_cast<sem_function *> (m_items[i])->param_used_p (0)
2696                       && static_cast<sem_function *> (m_items[i])
2697                            ->compare_polymorphic_p ())))
2698              {
2699                 tree class_type
2700                   = method_class_type (TREE_TYPE (m_items[i]->decl));
2701                 inchash::hash hstate (m_items[i]->hash);
2702
2703                 if (TYPE_NAME (class_type)
2704                      && DECL_ASSEMBLER_NAME_SET_P (TYPE_NAME (class_type)))
2705                   hstate.add_wide_int
2706                     (IDENTIFIER_HASH_VALUE
2707                        (DECL_ASSEMBLER_NAME (TYPE_NAME (class_type))));
2708
2709                 m_items[i]->hash = hstate.end ();
2710              }
2711         }
2712     }
2713
2714   /* Once all symbols have enhanced hash value, we can append
2715      hash values of symbols that are seen by IPA ICF and are
2716      references by a semantic item. Newly computed values
2717      are saved to global_hash member variable.  */
2718   for (unsigned i = 0; i < m_items.length (); i++)
2719     m_items[i]->update_hash_by_local_refs (m_symtab_node_map);
2720
2721   /* Global hash value replace current hash values.  */
2722   for (unsigned i = 0; i < m_items.length (); i++)
2723     m_items[i]->hash = m_items[i]->global_hash;
2724 }
2725
2726 /* Congruence classes are built by hash value.  */
2727
2728 void
2729 sem_item_optimizer::build_hash_based_classes (void)
2730 {
2731   for (unsigned i = 0; i < m_items.length (); i++)
2732     {
2733       sem_item *item = m_items[i];
2734
2735       congruence_class_group *group = get_group_by_hash (item->hash,
2736                                       item->type);
2737
2738       if (!group->classes.length ())
2739         {
2740           m_classes_count++;
2741           group->classes.safe_push (new congruence_class (class_id++));
2742         }
2743
2744       add_item_to_class (group->classes[0], item);
2745     }
2746 }
2747
2748 /* Build references according to call graph.  */
2749
2750 void
2751 sem_item_optimizer::build_graph (void)
2752 {
2753   for (unsigned i = 0; i < m_items.length (); i++)
2754     {
2755       sem_item *item = m_items[i];
2756       m_symtab_node_map.put (item->node, item);
2757     }
2758
2759   for (unsigned i = 0; i < m_items.length (); i++)
2760     {
2761       sem_item *item = m_items[i];
2762
2763       if (item->type == FUNC)
2764         {
2765           cgraph_node *cnode = dyn_cast <cgraph_node *> (item->node);
2766
2767           cgraph_edge *e = cnode->callees;
2768           while (e)
2769             {
2770               sem_item **slot = m_symtab_node_map.get
2771                 (e->callee->ultimate_alias_target ());
2772               if (slot)
2773                 item->add_reference (*slot);
2774
2775               e = e->next_callee;
2776             }
2777         }
2778
2779       ipa_ref *ref = NULL;
2780       for (unsigned i = 0; item->node->iterate_reference (i, ref); i++)
2781         {
2782           sem_item **slot = m_symtab_node_map.get
2783             (ref->referred->ultimate_alias_target ());
2784           if (slot)
2785             item->add_reference (*slot);
2786         }
2787     }
2788 }
2789
2790 /* Semantic items in classes having more than one element and initialized.
2791    In case of WPA, we load function body.  */
2792
2793 void
2794 sem_item_optimizer::parse_nonsingleton_classes (void)
2795 {
2796   unsigned int init_called_count = 0;
2797
2798   for (unsigned i = 0; i < m_items.length (); i++)
2799     if (m_items[i]->cls->members.length () > 1)
2800       {
2801         m_items[i]->init ();
2802         init_called_count++;
2803       }
2804
2805   if (dump_file)
2806     fprintf (dump_file, "Init called for %u items (%.2f%%).\n", init_called_count,
2807              m_items.length () ? 100.0f * init_called_count / m_items.length (): 0.0f);
2808 }
2809
2810 /* Equality function for semantic items is used to subdivide existing
2811    classes. If IN_WPA, fast equality function is invoked.  */
2812
2813 void
2814 sem_item_optimizer::subdivide_classes_by_equality (bool in_wpa)
2815 {
2816   for (hash_table <congruence_class_group_hash>::iterator it = m_classes.begin ();
2817        it != m_classes.end (); ++it)
2818     {
2819       unsigned int class_count = (*it)->classes.length ();
2820
2821       for (unsigned i = 0; i < class_count; i++)
2822         {
2823           congruence_class *c = (*it)->classes [i];
2824
2825           if (c->members.length() > 1)
2826             {
2827               auto_vec <sem_item *> new_vector;
2828
2829               sem_item *first = c->members[0];
2830               new_vector.safe_push (first);
2831
2832               unsigned class_split_first = (*it)->classes.length ();
2833
2834               for (unsigned j = 1; j < c->members.length (); j++)
2835                 {
2836                   sem_item *item = c->members[j];
2837
2838                   bool equals = in_wpa ? first->equals_wpa (item,
2839                                 m_symtab_node_map) : first->equals (item, m_symtab_node_map);
2840
2841                   if (equals)
2842                     new_vector.safe_push (item);
2843                   else
2844                     {
2845                       bool integrated = false;
2846
2847                       for (unsigned k = class_split_first; k < (*it)->classes.length (); k++)
2848                         {
2849                           sem_item *x = (*it)->classes[k]->members[0];
2850                           bool equals = in_wpa ? x->equals_wpa (item,
2851                                                                 m_symtab_node_map) : x->equals (item, m_symtab_node_map);
2852
2853                           if (equals)
2854                             {
2855                               integrated = true;
2856                               add_item_to_class ((*it)->classes[k], item);
2857
2858                               break;
2859                             }
2860                         }
2861
2862                       if (!integrated)
2863                         {
2864                           congruence_class *c = new congruence_class (class_id++);
2865                           m_classes_count++;
2866                           add_item_to_class (c, item);
2867
2868                           (*it)->classes.safe_push (c);
2869                         }
2870                     }
2871                 }
2872
2873               // we replace newly created new_vector for the class we've just splitted
2874               c->members.release ();
2875               c->members.create (new_vector.length ());
2876
2877               for (unsigned int j = 0; j < new_vector.length (); j++)
2878                 add_item_to_class (c, new_vector[j]);
2879             }
2880         }
2881     }
2882
2883   verify_classes ();
2884 }
2885
2886 /* Subdivide classes by address references that members of the class
2887    reference. Example can be a pair of functions that have an address
2888    taken from a function. If these addresses are different the class
2889    is split.  */
2890
2891 unsigned
2892 sem_item_optimizer::subdivide_classes_by_sensitive_refs ()
2893 {
2894   typedef hash_map <symbol_compare_collection *, vec <sem_item *>,
2895     symbol_compare_hashmap_traits> subdivide_hash_map;
2896
2897   unsigned newly_created_classes = 0;
2898
2899   for (hash_table <congruence_class_group_hash>::iterator it = m_classes.begin ();
2900        it != m_classes.end (); ++it)
2901     {
2902       unsigned int class_count = (*it)->classes.length ();
2903       auto_vec<congruence_class *> new_classes;
2904
2905       for (unsigned i = 0; i < class_count; i++)
2906         {
2907           congruence_class *c = (*it)->classes [i];
2908
2909           if (c->members.length() > 1)
2910             {
2911               subdivide_hash_map split_map;
2912
2913               for (unsigned j = 0; j < c->members.length (); j++)
2914                 {
2915                   sem_item *source_node = c->members[j];
2916
2917                   symbol_compare_collection *collection = new symbol_compare_collection (source_node->node);
2918
2919                   bool existed;
2920                   vec <sem_item *> *slot = &split_map.get_or_insert (collection,
2921                                                                      &existed);
2922                   gcc_checking_assert (slot);
2923
2924                   slot->safe_push (source_node);
2925
2926                   if (existed)
2927                     delete collection;
2928                 }
2929
2930                /* If the map contains more than one key, we have to split the map
2931                   appropriately.  */
2932               if (split_map.elements () != 1)
2933                 {
2934                   bool first_class = true;
2935
2936                   for (subdivide_hash_map::iterator it2 = split_map.begin ();
2937                        it2 != split_map.end (); ++it2)
2938                     {
2939                       congruence_class *new_cls;
2940                       new_cls = new congruence_class (class_id++);
2941
2942                       for (unsigned k = 0; k < (*it2).second.length (); k++)
2943                         add_item_to_class (new_cls, (*it2).second[k]);
2944
2945                       worklist_push (new_cls);
2946                       newly_created_classes++;
2947
2948                       if (first_class)
2949                         {
2950                           (*it)->classes[i] = new_cls;
2951                           first_class = false;
2952                         }
2953                       else
2954                         {
2955                           new_classes.safe_push (new_cls);
2956                           m_classes_count++;
2957                         }
2958                     }
2959                 }
2960
2961               /* Release memory.  */
2962               for (subdivide_hash_map::iterator it2 = split_map.begin ();
2963                    it2 != split_map.end (); ++it2)
2964                 {
2965                   delete (*it2).first;
2966                   (*it2).second.release ();
2967                 }
2968             }
2969           }
2970
2971         for (unsigned i = 0; i < new_classes.length (); i++)
2972           (*it)->classes.safe_push (new_classes[i]);
2973     }
2974
2975   return newly_created_classes;
2976 }
2977
2978 /* Verify congruence classes if checking is enabled.  */
2979
2980 void
2981 sem_item_optimizer::verify_classes (void)
2982 {
2983 #if ENABLE_CHECKING
2984   for (hash_table <congruence_class_group_hash>::iterator it = m_classes.begin ();
2985        it != m_classes.end (); ++it)
2986     {
2987       for (unsigned int i = 0; i < (*it)->classes.length (); i++)
2988         {
2989           congruence_class *cls = (*it)->classes[i];
2990
2991           gcc_checking_assert (cls);
2992           gcc_checking_assert (cls->members.length () > 0);
2993
2994           for (unsigned int j = 0; j < cls->members.length (); j++)
2995             {
2996               sem_item *item = cls->members[j];
2997
2998               gcc_checking_assert (item);
2999               gcc_checking_assert (item->cls == cls);
3000
3001               for (unsigned k = 0; k < item->usages.length (); k++)
3002                 {
3003                   sem_usage_pair *usage = item->usages[k];
3004                   gcc_checking_assert (usage->item->index_in_class <
3005                                        usage->item->cls->members.length ());
3006                 }
3007             }
3008         }
3009     }
3010 #endif
3011 }
3012
3013 /* Disposes split map traverse function. CLS_PTR is pointer to congruence
3014    class, BSLOT is bitmap slot we want to release. DATA is mandatory,
3015    but unused argument.  */
3016
3017 bool
3018 sem_item_optimizer::release_split_map (congruence_class * const &,
3019                                        bitmap const &b, traverse_split_pair *)
3020 {
3021   bitmap bmp = b;
3022
3023   BITMAP_FREE (bmp);
3024
3025   return true;
3026 }
3027
3028 /* Process split operation for a class given as pointer CLS_PTR,
3029    where bitmap B splits congruence class members. DATA is used
3030    as argument of split pair.  */
3031
3032 bool
3033 sem_item_optimizer::traverse_congruence_split (congruence_class * const &cls,
3034     bitmap const &b, traverse_split_pair *pair)
3035 {
3036   sem_item_optimizer *optimizer = pair->optimizer;
3037   const congruence_class *splitter_cls = pair->cls;
3038
3039   /* If counted bits are greater than zero and less than the number of members
3040      a group will be splitted.  */
3041   unsigned popcount = bitmap_count_bits (b);
3042
3043   if (popcount > 0 && popcount < cls->members.length ())
3044     {
3045       congruence_class* newclasses[2] = { new congruence_class (class_id++), new congruence_class (class_id++) };
3046
3047       for (unsigned int i = 0; i < cls->members.length (); i++)
3048         {
3049           int target = bitmap_bit_p (b, i);
3050           congruence_class *tc = newclasses[target];
3051
3052           add_item_to_class (tc, cls->members[i]);
3053         }
3054
3055 #ifdef ENABLE_CHECKING
3056       for (unsigned int i = 0; i < 2; i++)
3057         gcc_checking_assert (newclasses[i]->members.length ());
3058 #endif
3059
3060       if (splitter_cls == cls)
3061         optimizer->splitter_class_removed = true;
3062
3063       /* Remove old class from worklist if presented.  */
3064       bool in_worklist = cls->in_worklist;
3065
3066       if (in_worklist)
3067         cls->in_worklist = false;
3068
3069       congruence_class_group g;
3070       g.hash = cls->members[0]->get_hash ();
3071       g.type = cls->members[0]->type;
3072
3073       congruence_class_group *slot = optimizer->m_classes.find(&g);
3074
3075       for (unsigned int i = 0; i < slot->classes.length (); i++)
3076         if (slot->classes[i] == cls)
3077           {
3078             slot->classes.ordered_remove (i);
3079             break;
3080           }
3081
3082       /* New class will be inserted and integrated to work list.  */
3083       for (unsigned int i = 0; i < 2; i++)
3084         optimizer->add_class (newclasses[i]);
3085
3086       /* Two classes replace one, so that increment just by one.  */
3087       optimizer->m_classes_count++;
3088
3089       /* If OLD class was presented in the worklist, we remove the class
3090          and replace it will both newly created classes.  */
3091       if (in_worklist)
3092         for (unsigned int i = 0; i < 2; i++)
3093           optimizer->worklist_push (newclasses[i]);
3094       else /* Just smaller class is inserted.  */
3095         {
3096           unsigned int smaller_index = newclasses[0]->members.length () <
3097                                        newclasses[1]->members.length () ?
3098                                        0 : 1;
3099           optimizer->worklist_push (newclasses[smaller_index]);
3100         }
3101
3102       if (dump_file && (dump_flags & TDF_DETAILS))
3103         {
3104           fprintf (dump_file, "  congruence class splitted:\n");
3105           cls->dump (dump_file, 4);
3106
3107           fprintf (dump_file, "  newly created groups:\n");
3108           for (unsigned int i = 0; i < 2; i++)
3109             newclasses[i]->dump (dump_file, 4);
3110         }
3111
3112       /* Release class if not presented in work list.  */
3113       if (!in_worklist)
3114         delete cls;
3115     }
3116
3117
3118   return true;
3119 }
3120
3121 /* Tests if a class CLS used as INDEXth splits any congruence classes.
3122    Bitmap stack BMSTACK is used for bitmap allocation.  */
3123
3124 void
3125 sem_item_optimizer::do_congruence_step_for_index (congruence_class *cls,
3126     unsigned int index)
3127 {
3128   hash_map <congruence_class *, bitmap> split_map;
3129
3130   for (unsigned int i = 0; i < cls->members.length (); i++)
3131     {
3132       sem_item *item = cls->members[i];
3133
3134       /* Iterate all usages that have INDEX as usage of the item.  */
3135       for (unsigned int j = 0; j < item->usages.length (); j++)
3136         {
3137           sem_usage_pair *usage = item->usages[j];
3138
3139           if (usage->index != index)
3140             continue;
3141
3142           bitmap *slot = split_map.get (usage->item->cls);
3143           bitmap b;
3144
3145           if(!slot)
3146             {
3147               b = BITMAP_ALLOC (&m_bmstack);
3148               split_map.put (usage->item->cls, b);
3149             }
3150           else
3151             b = *slot;
3152
3153 #if ENABLE_CHECKING
3154           gcc_checking_assert (usage->item->cls);
3155           gcc_checking_assert (usage->item->index_in_class <
3156                                usage->item->cls->members.length ());
3157 #endif
3158
3159           bitmap_set_bit (b, usage->item->index_in_class);
3160         }
3161     }
3162
3163   traverse_split_pair pair;
3164   pair.optimizer = this;
3165   pair.cls = cls;
3166
3167   splitter_class_removed = false;
3168   split_map.traverse
3169   <traverse_split_pair *, sem_item_optimizer::traverse_congruence_split> (&pair);
3170
3171   /* Bitmap clean-up.  */
3172   split_map.traverse
3173   <traverse_split_pair *, sem_item_optimizer::release_split_map> (NULL);
3174 }
3175
3176 /* Every usage of a congruence class CLS is a candidate that can split the
3177    collection of classes. Bitmap stack BMSTACK is used for bitmap
3178    allocation.  */
3179
3180 void
3181 sem_item_optimizer::do_congruence_step (congruence_class *cls)
3182 {
3183   bitmap_iterator bi;
3184   unsigned int i;
3185
3186   bitmap usage = BITMAP_ALLOC (&m_bmstack);
3187
3188   for (unsigned int i = 0; i < cls->members.length (); i++)
3189     bitmap_ior_into (usage, cls->members[i]->usage_index_bitmap);
3190
3191   EXECUTE_IF_SET_IN_BITMAP (usage, 0, i, bi)
3192   {
3193     if (dump_file && (dump_flags & TDF_DETAILS))
3194       fprintf (dump_file, "  processing congruece step for class: %u, index: %u\n",
3195                cls->id, i);
3196
3197     do_congruence_step_for_index (cls, i);
3198
3199     if (splitter_class_removed)
3200       break;
3201   }
3202
3203   BITMAP_FREE (usage);
3204 }
3205
3206 /* Adds a newly created congruence class CLS to worklist.  */
3207
3208 void
3209 sem_item_optimizer::worklist_push (congruence_class *cls)
3210 {
3211   /* Return if the class CLS is already presented in work list.  */
3212   if (cls->in_worklist)
3213     return;
3214
3215   cls->in_worklist = true;
3216   worklist.push_back (cls);
3217 }
3218
3219 /* Pops a class from worklist. */
3220
3221 congruence_class *
3222 sem_item_optimizer::worklist_pop (void)
3223 {
3224   congruence_class *cls;
3225
3226   while (!worklist.empty ())
3227     {
3228       cls = worklist.front ();
3229       worklist.pop_front ();
3230       if (cls->in_worklist)
3231         {
3232           cls->in_worklist = false;
3233
3234           return cls;
3235         }
3236       else
3237         {
3238           /* Work list item was already intended to be removed.
3239              The only reason for doing it is to split a class.
3240              Thus, the class CLS is deleted.  */
3241           delete cls;
3242         }
3243     }
3244
3245   return NULL;
3246 }
3247
3248 /* Iterative congruence reduction function.  */
3249
3250 void
3251 sem_item_optimizer::process_cong_reduction (void)
3252 {
3253   for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
3254        it != m_classes.end (); ++it)
3255     for (unsigned i = 0; i < (*it)->classes.length (); i++)
3256       if ((*it)->classes[i]->is_class_used ())
3257         worklist_push ((*it)->classes[i]);
3258
3259   if (dump_file)
3260     fprintf (dump_file, "Worklist has been filled with: %lu\n",
3261              (unsigned long) worklist.size ());
3262
3263   if (dump_file && (dump_flags & TDF_DETAILS))
3264     fprintf (dump_file, "Congruence class reduction\n");
3265
3266   congruence_class *cls;
3267
3268   /* Process complete congruence reduction.  */
3269   while ((cls = worklist_pop ()) != NULL)
3270     do_congruence_step (cls);
3271
3272   /* Subdivide newly created classes according to references.  */
3273   unsigned new_classes = subdivide_classes_by_sensitive_refs ();
3274
3275   if (dump_file)
3276     fprintf (dump_file, "Address reference subdivision created: %u "
3277              "new classes.\n", new_classes);
3278 }
3279
3280 /* Debug function prints all informations about congruence classes.  */
3281
3282 void
3283 sem_item_optimizer::dump_cong_classes (void)
3284 {
3285   if (!dump_file)
3286     return;
3287
3288   fprintf (dump_file,
3289            "Congruence classes: %u (unique hash values: %lu), with total: %u items\n",
3290            m_classes_count, (unsigned long) m_classes.elements(), m_items.length ());
3291
3292   /* Histogram calculation.  */
3293   unsigned int max_index = 0;
3294   unsigned int* histogram = XCNEWVEC (unsigned int, m_items.length () + 1);
3295
3296   for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
3297        it != m_classes.end (); ++it)
3298
3299     for (unsigned i = 0; i < (*it)->classes.length (); i++)
3300       {
3301         unsigned int c = (*it)->classes[i]->members.length ();
3302         histogram[c]++;
3303
3304         if (c > max_index)
3305           max_index = c;
3306       }
3307
3308   fprintf (dump_file,
3309            "Class size histogram [num of members]: number of classe number of classess\n");
3310
3311   for (unsigned int i = 0; i <= max_index; i++)
3312     if (histogram[i])
3313       fprintf (dump_file, "[%u]: %u classes\n", i, histogram[i]);
3314
3315   fprintf (dump_file, "\n\n");
3316
3317
3318   if (dump_flags & TDF_DETAILS)
3319     for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
3320          it != m_classes.end (); ++it)
3321       {
3322         fprintf (dump_file, "  group: with %u classes:\n", (*it)->classes.length ());
3323
3324         for (unsigned i = 0; i < (*it)->classes.length (); i++)
3325           {
3326             (*it)->classes[i]->dump (dump_file, 4);
3327
3328             if(i < (*it)->classes.length () - 1)
3329               fprintf (dump_file, " ");
3330           }
3331       }
3332
3333   free (histogram);
3334 }
3335
3336 /* After reduction is done, we can declare all items in a group
3337    to be equal. PREV_CLASS_COUNT is start number of classes
3338    before reduction. True is returned if there's a merge operation
3339    processed. */
3340
3341 bool
3342 sem_item_optimizer::merge_classes (unsigned int prev_class_count)
3343 {
3344   unsigned int item_count = m_items.length ();
3345   unsigned int class_count = m_classes_count;
3346   unsigned int equal_items = item_count - class_count;
3347
3348   unsigned int non_singular_classes_count = 0;
3349   unsigned int non_singular_classes_sum = 0;
3350
3351   bool merged_p = false;
3352
3353   for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
3354        it != m_classes.end (); ++it)
3355     for (unsigned int i = 0; i < (*it)->classes.length (); i++)
3356       {
3357         congruence_class *c = (*it)->classes[i];
3358         if (c->members.length () > 1)
3359           {
3360             non_singular_classes_count++;
3361             non_singular_classes_sum += c->members.length ();
3362           }
3363       }
3364
3365   if (dump_file)
3366     {
3367       fprintf (dump_file, "\nItem count: %u\n", item_count);
3368       fprintf (dump_file, "Congruent classes before: %u, after: %u\n",
3369                prev_class_count, class_count);
3370       fprintf (dump_file, "Average class size before: %.2f, after: %.2f\n",
3371                prev_class_count ? 1.0f * item_count / prev_class_count : 0.0f,
3372                class_count ? 1.0f * item_count / class_count : 0.0f);
3373       fprintf (dump_file, "Average non-singular class size: %.2f, count: %u\n",
3374                non_singular_classes_count ? 1.0f * non_singular_classes_sum /
3375                non_singular_classes_count : 0.0f,
3376                non_singular_classes_count);
3377       fprintf (dump_file, "Equal symbols: %u\n", equal_items);
3378       fprintf (dump_file, "Fraction of visited symbols: %.2f%%\n\n",
3379                item_count ? 100.0f * equal_items / item_count : 0.0f);
3380     }
3381
3382   for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
3383        it != m_classes.end (); ++it)
3384     for (unsigned int i = 0; i < (*it)->classes.length (); i++)
3385       {
3386         congruence_class *c = (*it)->classes[i];
3387
3388         if (c->members.length () == 1)
3389           continue;
3390
3391         gcc_assert (c->members.length ());
3392
3393         sem_item *source = c->members[0];
3394
3395         for (unsigned int j = 1; j < c->members.length (); j++)
3396           {
3397             sem_item *alias = c->members[j];
3398
3399             if (dump_file)
3400               {
3401                 fprintf (dump_file, "Semantic equality hit:%s->%s\n",
3402                          xstrdup_for_dump (source->node->name ()),
3403                          xstrdup_for_dump (alias->node->name ()));
3404                 fprintf (dump_file, "Assembler symbol names:%s->%s\n",
3405                          xstrdup_for_dump (source->node->asm_name ()),
3406                          xstrdup_for_dump (alias->node->asm_name ()));
3407               }
3408
3409             if (lookup_attribute ("no_icf", DECL_ATTRIBUTES (alias->decl)))
3410               {
3411                 if (dump_file)
3412                   fprintf (dump_file,
3413                            "Merge operation is skipped due to no_icf "
3414                            "attribute.\n\n");
3415
3416                 continue;
3417               }
3418
3419             if (dump_file && (dump_flags & TDF_DETAILS))
3420               {
3421                 source->dump_to_file (dump_file);
3422                 alias->dump_to_file (dump_file);
3423               }
3424
3425             merged_p |= source->merge (alias);
3426           }
3427       }
3428
3429   return merged_p;
3430 }
3431
3432 /* Dump function prints all class members to a FILE with an INDENT.  */
3433
3434 void
3435 congruence_class::dump (FILE *file, unsigned int indent) const
3436 {
3437   FPRINTF_SPACES (file, indent, "class with id: %u, hash: %u, items: %u\n",
3438                   id, members[0]->get_hash (), members.length ());
3439
3440   FPUTS_SPACES (file, indent + 2, "");
3441   for (unsigned i = 0; i < members.length (); i++)
3442     fprintf (file, "%s(%p/%u) ", members[i]->node->asm_name (),
3443              (void *) members[i]->decl,
3444              members[i]->node->order);
3445
3446   fprintf (file, "\n");
3447 }
3448
3449 /* Returns true if there's a member that is used from another group.  */
3450
3451 bool
3452 congruence_class::is_class_used (void)
3453 {
3454   for (unsigned int i = 0; i < members.length (); i++)
3455     if (members[i]->usages.length ())
3456       return true;
3457
3458   return false;
3459 }
3460
3461 /* Generate pass summary for IPA ICF pass.  */
3462
3463 static void
3464 ipa_icf_generate_summary (void)
3465 {
3466   if (!optimizer)
3467     optimizer = new sem_item_optimizer ();
3468
3469   optimizer->register_hooks ();
3470   optimizer->parse_funcs_and_vars ();
3471 }
3472
3473 /* Write pass summary for IPA ICF pass.  */
3474
3475 static void
3476 ipa_icf_write_summary (void)
3477 {
3478   gcc_assert (optimizer);
3479
3480   optimizer->write_summary ();
3481 }
3482
3483 /* Read pass summary for IPA ICF pass.  */
3484
3485 static void
3486 ipa_icf_read_summary (void)
3487 {
3488   if (!optimizer)
3489     optimizer = new sem_item_optimizer ();
3490
3491   optimizer->read_summary ();
3492   optimizer->register_hooks ();
3493 }
3494
3495 /* Semantic equality exection function.  */
3496
3497 static unsigned int
3498 ipa_icf_driver (void)
3499 {
3500   gcc_assert (optimizer);
3501
3502   bool merged_p = optimizer->execute ();
3503
3504   delete optimizer;
3505   optimizer = NULL;
3506
3507   return merged_p ? TODO_remove_functions : 0;
3508 }
3509
3510 const pass_data pass_data_ipa_icf =
3511 {
3512   IPA_PASS,                 /* type */
3513   "icf",                    /* name */
3514   OPTGROUP_IPA,             /* optinfo_flags */
3515   TV_IPA_ICF,               /* tv_id */
3516   0,                        /* properties_required */
3517   0,                        /* properties_provided */
3518   0,                        /* properties_destroyed */
3519   0,                        /* todo_flags_start */
3520   0,                        /* todo_flags_finish */
3521 };
3522
3523 class pass_ipa_icf : public ipa_opt_pass_d
3524 {
3525 public:
3526   pass_ipa_icf (gcc::context *ctxt)
3527     : ipa_opt_pass_d (pass_data_ipa_icf, ctxt,
3528                       ipa_icf_generate_summary, /* generate_summary */
3529                       ipa_icf_write_summary, /* write_summary */
3530                       ipa_icf_read_summary, /* read_summary */
3531                       NULL, /*
3532                       write_optimization_summary */
3533                       NULL, /*
3534                       read_optimization_summary */
3535                       NULL, /* stmt_fixup */
3536                       0, /* function_transform_todo_flags_start */
3537                       NULL, /* function_transform */
3538                       NULL) /* variable_transform */
3539   {}
3540
3541   /* opt_pass methods: */
3542   virtual bool gate (function *)
3543   {
3544     return in_lto_p || flag_ipa_icf_variables || flag_ipa_icf_functions;
3545   }
3546
3547   virtual unsigned int execute (function *)
3548   {
3549     return ipa_icf_driver();
3550   }
3551 }; // class pass_ipa_icf
3552
3553 } // ipa_icf namespace
3554
3555 ipa_opt_pass_d *
3556 make_pass_ipa_icf (gcc::context *ctxt)
3557 {
3558   return new ipa_icf::pass_ipa_icf (ctxt);
3559 }