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