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