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