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