bmake(1): complete update to version 20141111
[dragonfly.git] / contrib / gcc-5.0 / 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 (n1 == n2)
349     return true;
350
351   /* Merging two definitions with a reference to equivalent vtables, but
352      belonging to a different type may result in ipa-polymorphic-call analysis
353      giving a wrong answer about the dynamic type of instance.  */
354   if (is_a <varpool_node *> (n1)
355       && (DECL_VIRTUAL_P (n1->decl) || DECL_VIRTUAL_P (n2->decl))
356       && (DECL_VIRTUAL_P (n1->decl) != DECL_VIRTUAL_P (n2->decl)
357           || !types_must_be_same_for_odr (DECL_CONTEXT (n1->decl),
358                                           DECL_CONTEXT (n2->decl))))
359     return return_false_with_msg
360              ("references to virtual tables can not be merged");
361
362   if (address && n1->equal_address_to (n2) == 1)
363     return true;
364   if (!address && n1->semantically_equivalent_p (n2))
365     return true;
366
367   n1 = n1->ultimate_alias_target (&avail1);
368   n2 = n2->ultimate_alias_target (&avail2);
369
370   if (avail1 >= AVAIL_INTERPOSABLE && ignored_nodes.get (n1)
371       && avail2 >= AVAIL_INTERPOSABLE && ignored_nodes.get (n2))
372     return true;
373
374   return return_false_with_msg ("different references");
375 }
376
377 /* If cgraph edges E1 and E2 are indirect calls, verify that
378    ECF flags are the same.  */
379
380 bool sem_function::compare_edge_flags (cgraph_edge *e1, cgraph_edge *e2)
381 {
382   if (e1->indirect_info && e2->indirect_info)
383     {
384       int e1_flags = e1->indirect_info->ecf_flags;
385       int e2_flags = e2->indirect_info->ecf_flags;
386
387       if (e1_flags != e2_flags)
388         return return_false_with_msg ("ICF flags are different");
389     }
390   else if (e1->indirect_info || e2->indirect_info)
391     return false;
392
393   return true;
394 }
395
396 /* Fast equality function based on knowledge known in WPA.  */
397
398 bool
399 sem_function::equals_wpa (sem_item *item,
400                           hash_map <symtab_node *, sem_item *> &ignored_nodes)
401 {
402   gcc_assert (item->type == FUNC);
403
404   m_compared_func = static_cast<sem_function *> (item);
405
406   if (arg_types.length () != m_compared_func->arg_types.length ())
407     return return_false_with_msg ("different number of arguments");
408
409   /* Compare special function DECL attributes.  */
410   if (DECL_FUNCTION_PERSONALITY (decl)
411       != DECL_FUNCTION_PERSONALITY (item->decl))
412     return return_false_with_msg ("function personalities are different");
413
414   if (DECL_DISREGARD_INLINE_LIMITS (decl)
415       != DECL_DISREGARD_INLINE_LIMITS (item->decl))
416     return return_false_with_msg ("DECL_DISREGARD_INLINE_LIMITS are different");
417
418   if (DECL_DECLARED_INLINE_P (decl) != DECL_DECLARED_INLINE_P (item->decl))
419     return return_false_with_msg ("inline attributes are different");
420
421   if (DECL_IS_OPERATOR_NEW (decl) != DECL_IS_OPERATOR_NEW (item->decl))
422     return return_false_with_msg ("operator new flags are different");
423
424   if (DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl)
425        != DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (item->decl))
426     return return_false_with_msg ("intrument function entry exit "
427                                   "attributes are different");
428
429   if (DECL_NO_LIMIT_STACK (decl) != DECL_NO_LIMIT_STACK (item->decl))
430     return return_false_with_msg ("no stack limit attributes are different");
431
432   if (DECL_CXX_CONSTRUCTOR_P (decl) != DECL_CXX_CONSTRUCTOR_P (item->decl))
433     return return_false_with_msg ("DELC_CXX_CONSTRUCTOR mismatch");
434
435   if (DECL_CXX_DESTRUCTOR_P (decl) != DECL_CXX_DESTRUCTOR_P (item->decl))
436     return return_false_with_msg ("DELC_CXX_DESTRUCTOR mismatch");
437
438   if (flags_from_decl_or_type (decl) != flags_from_decl_or_type (item->decl))
439     return return_false_with_msg ("decl_or_type flags are different");
440
441   /* Do not match polymorphic constructors of different types.  They calls
442      type memory location for ipa-polymorphic-call and we do not want
443      it to get confused by wrong type.  */
444   if (DECL_CXX_CONSTRUCTOR_P (decl)
445       && TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE)
446     {
447       if (TREE_CODE (TREE_TYPE (item->decl)) != METHOD_TYPE)
448         return return_false_with_msg ("DECL_CXX_CONSTURCTOR type mismatch");
449       else if (!func_checker::compatible_polymorphic_types_p
450                  (method_class_type (TREE_TYPE (decl)),
451                   method_class_type (TREE_TYPE (item->decl)), false))
452         return return_false_with_msg ("ctor polymorphic type mismatch");
453     }
454
455   /* Checking function TARGET and OPTIMIZATION flags.  */
456   cl_target_option *tar1 = target_opts_for_fn (decl);
457   cl_target_option *tar2 = target_opts_for_fn (item->decl);
458
459   if (tar1 != tar2 && !cl_target_option_eq (tar1, tar2))
460     {
461       if (dump_file && (dump_flags & TDF_DETAILS))
462         {
463           fprintf (dump_file, "target flags difference");
464           cl_target_option_print_diff (dump_file, 2, tar1, tar2);
465         }
466
467       return return_false_with_msg ("Target flags are different");
468     }
469
470   cl_optimization *opt1 = opts_for_fn (decl);
471   cl_optimization *opt2 = opts_for_fn (item->decl);
472
473   if (opt1 != opt2 && memcmp (opt1, opt2, sizeof(cl_optimization)))
474     {
475       if (dump_file && (dump_flags & TDF_DETAILS))
476         {
477           fprintf (dump_file, "optimization flags difference");
478           cl_optimization_print_diff (dump_file, 2, opt1, opt2);
479         }
480
481       return return_false_with_msg ("optimization flags are different");
482     }
483
484   /* Result type checking.  */
485   if (!func_checker::compatible_types_p (result_type,
486                                          m_compared_func->result_type))
487     return return_false_with_msg ("result types are different");
488
489   /* Checking types of arguments.  */
490   for (unsigned i = 0; i < arg_types.length (); i++)
491     {
492       /* This guard is here for function pointer with attributes (pr59927.c).  */
493       if (!arg_types[i] || !m_compared_func->arg_types[i])
494         return return_false_with_msg ("NULL argument type");
495
496       if (!func_checker::compatible_types_p (arg_types[i],
497                                              m_compared_func->arg_types[i]))
498         return return_false_with_msg ("argument type is different");
499       if (POINTER_TYPE_P (arg_types[i])
500           && (TYPE_RESTRICT (arg_types[i])
501               != TYPE_RESTRICT (m_compared_func->arg_types[i])))
502         return return_false_with_msg ("argument restrict flag mismatch");
503     }
504
505   if (node->num_references () != item->node->num_references ())
506     return return_false_with_msg ("different number of references");
507
508   if (comp_type_attributes (TREE_TYPE (decl),
509                             TREE_TYPE (item->decl)) != 1)
510     return return_false_with_msg ("different type attributes");
511
512   /* The type of THIS pointer type memory location for
513      ipa-polymorphic-call-analysis.  */
514   if (opt_for_fn (decl, flag_devirtualize)
515       && (TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE
516           || TREE_CODE (TREE_TYPE (item->decl)) == METHOD_TYPE)
517       && (!flag_ipa_cp
518           || ipa_is_param_used (IPA_NODE_REF (dyn_cast <cgraph_node *>(node)),
519                                 0))
520       && compare_polymorphic_p ())
521     {
522       if (TREE_CODE (TREE_TYPE (decl)) != TREE_CODE (TREE_TYPE (item->decl)))
523         return return_false_with_msg ("METHOD_TYPE and FUNCTION_TYPE mismatch");
524       if (!func_checker::compatible_polymorphic_types_p
525            (method_class_type (TREE_TYPE (decl)),
526             method_class_type (TREE_TYPE (item->decl)), false))
527         return return_false_with_msg ("THIS pointer ODR type mismatch");
528     }
529
530   ipa_ref *ref = NULL, *ref2 = NULL;
531   for (unsigned i = 0; node->iterate_reference (i, ref); i++)
532     {
533       item->node->iterate_reference (i, ref2);
534
535       if (!compare_cgraph_references (ignored_nodes, ref->referred,
536                                       ref2->referred,
537                                       ref->address_matters_p ()))
538         return false;
539     }
540
541   cgraph_edge *e1 = dyn_cast <cgraph_node *> (node)->callees;
542   cgraph_edge *e2 = dyn_cast <cgraph_node *> (item->node)->callees;
543
544   while (e1 && e2)
545     {
546       if (!compare_cgraph_references (ignored_nodes, e1->callee,
547                                       e2->callee, false))
548         return false;
549
550       e1 = e1->next_callee;
551       e2 = e2->next_callee;
552     }
553
554   if (e1 || e2)
555     return return_false_with_msg ("different number of edges");
556
557   return true;
558 }
559
560 /* Returns true if the item equals to ITEM given as argument.  */
561
562 bool
563 sem_function::equals (sem_item *item,
564                       hash_map <symtab_node *, sem_item *> &ignored_nodes)
565 {
566   gcc_assert (item->type == FUNC);
567   bool eq = equals_private (item, ignored_nodes);
568
569   if (m_checker != NULL)
570     {
571       delete m_checker;
572       m_checker = NULL;
573     }
574
575   if (dump_file && (dump_flags & TDF_DETAILS))
576     fprintf (dump_file,
577              "Equals called for:%s:%s (%u:%u) (%s:%s) with result: %s\n\n",
578              name(), item->name (), node->order, item->node->order, asm_name (),
579              item->asm_name (), eq ? "true" : "false");
580
581   return eq;
582 }
583
584 /* Processes function equality comparison.  */
585
586 bool
587 sem_function::equals_private (sem_item *item,
588                               hash_map <symtab_node *, sem_item *> &ignored_nodes)
589 {
590   if (item->type != FUNC)
591     return false;
592
593   basic_block bb1, bb2;
594   edge e1, e2;
595   edge_iterator ei1, ei2;
596   bool result = true;
597   tree arg1, arg2;
598
599   m_compared_func = static_cast<sem_function *> (item);
600
601   gcc_assert (decl != item->decl);
602
603   if (bb_sorted.length () != m_compared_func->bb_sorted.length ()
604       || edge_count != m_compared_func->edge_count
605       || cfg_checksum != m_compared_func->cfg_checksum)
606     return return_false ();
607
608   if (!equals_wpa (item, ignored_nodes))
609     return false;
610
611   /* Checking function arguments.  */
612   tree decl1 = DECL_ATTRIBUTES (decl);
613   tree decl2 = DECL_ATTRIBUTES (m_compared_func->decl);
614
615   m_checker = new func_checker (decl, m_compared_func->decl,
616                                 compare_polymorphic_p (),
617                                 false,
618                                 &refs_set,
619                                 &m_compared_func->refs_set);
620   while (decl1)
621     {
622       if (decl2 == NULL)
623         return return_false ();
624
625       if (get_attribute_name (decl1) != get_attribute_name (decl2))
626         return return_false ();
627
628       tree attr_value1 = TREE_VALUE (decl1);
629       tree attr_value2 = TREE_VALUE (decl2);
630
631       if (attr_value1 && attr_value2)
632         {
633           bool ret = m_checker->compare_operand (TREE_VALUE (attr_value1),
634                                                  TREE_VALUE (attr_value2));
635           if (!ret)
636             return return_false_with_msg ("attribute values are different");
637         }
638       else if (!attr_value1 && !attr_value2)
639         {}
640       else
641         return return_false ();
642
643       decl1 = TREE_CHAIN (decl1);
644       decl2 = TREE_CHAIN (decl2);
645     }
646
647   if (decl1 != decl2)
648     return return_false();
649
650   for (arg1 = DECL_ARGUMENTS (decl),
651        arg2 = DECL_ARGUMENTS (m_compared_func->decl);
652        arg1; arg1 = DECL_CHAIN (arg1), arg2 = DECL_CHAIN (arg2))
653     if (!m_checker->compare_decl (arg1, arg2))
654       return return_false ();
655
656   /* Fill-up label dictionary.  */
657   for (unsigned i = 0; i < bb_sorted.length (); ++i)
658     {
659       m_checker->parse_labels (bb_sorted[i]);
660       m_checker->parse_labels (m_compared_func->bb_sorted[i]);
661     }
662
663   /* Checking all basic blocks.  */
664   for (unsigned i = 0; i < bb_sorted.length (); ++i)
665     if(!m_checker->compare_bb (bb_sorted[i], m_compared_func->bb_sorted[i]))
666       return return_false();
667
668   dump_message ("All BBs are equal\n");
669
670   auto_vec <int> bb_dict;
671
672   /* Basic block edges check.  */
673   for (unsigned i = 0; i < bb_sorted.length (); ++i)
674     {
675       bb1 = bb_sorted[i]->bb;
676       bb2 = m_compared_func->bb_sorted[i]->bb;
677
678       ei2 = ei_start (bb2->preds);
679
680       for (ei1 = ei_start (bb1->preds); ei_cond (ei1, &e1); ei_next (&ei1))
681         {
682           ei_cond (ei2, &e2);
683
684           if (e1->flags != e2->flags)
685             return return_false_with_msg ("flags comparison returns false");
686
687           if (!bb_dict_test (&bb_dict, e1->src->index, e2->src->index))
688             return return_false_with_msg ("edge comparison returns false");
689
690           if (!bb_dict_test (&bb_dict, e1->dest->index, e2->dest->index))
691             return return_false_with_msg ("BB comparison returns false");
692
693           if (!m_checker->compare_edge (e1, e2))
694             return return_false_with_msg ("edge comparison returns false");
695
696           ei_next (&ei2);
697         }
698     }
699
700   /* Basic block PHI nodes comparison.  */
701   for (unsigned i = 0; i < bb_sorted.length (); i++)
702     if (!compare_phi_node (bb_sorted[i]->bb, m_compared_func->bb_sorted[i]->bb))
703       return return_false_with_msg ("PHI node comparison returns false");
704
705   return result;
706 }
707
708 /* Set LOCAL_P of NODE to true if DATA is non-NULL.
709    Helper for call_for_symbol_thunks_and_aliases.  */
710
711 static bool
712 set_local (cgraph_node *node, void *data)
713 {
714   node->local.local = data != NULL;
715   return false;
716 }
717
718 /* TREE_ADDRESSABLE of NODE to true.
719    Helper for call_for_symbol_thunks_and_aliases.  */
720
721 static bool
722 set_addressable (varpool_node *node, void *)
723 {
724   TREE_ADDRESSABLE (node->decl) = 1;
725   return false;
726 }
727
728 /* Clear DECL_RTL of NODE. 
729    Helper for call_for_symbol_thunks_and_aliases.  */
730
731 static bool
732 clear_decl_rtl (symtab_node *node, void *)
733 {
734   SET_DECL_RTL (node->decl, NULL);
735   return false;
736 }
737
738 /* Redirect all callers of N and its aliases to TO.  Remove aliases if
739    possible.  Return number of redirections made.  */
740
741 static int
742 redirect_all_callers (cgraph_node *n, cgraph_node *to)
743 {
744   int nredirected = 0;
745   ipa_ref *ref;
746   cgraph_edge *e = n->callers;
747
748   while (e)
749     {
750       /* Redirecting thunks to interposable symbols or symbols in other sections
751          may not be supported by target output code.  Play safe for now and
752          punt on redirection.  */
753       if (!e->caller->thunk.thunk_p)
754         {
755           struct cgraph_edge *nexte = e->next_caller;
756           e->redirect_callee (to);
757           e = nexte;
758           nredirected++;
759         }
760       else
761         e = e->next_callee;
762     }
763   for (unsigned i = 0; n->iterate_direct_aliases (i, ref);)
764     {
765       bool removed = false;
766       cgraph_node *n_alias = dyn_cast <cgraph_node *> (ref->referring);
767
768       if ((DECL_COMDAT_GROUP (n->decl)
769            && (DECL_COMDAT_GROUP (n->decl)
770                == DECL_COMDAT_GROUP (n_alias->decl)))
771           || (n_alias->get_availability () > AVAIL_INTERPOSABLE
772               && n->get_availability () > AVAIL_INTERPOSABLE))
773         {
774           nredirected += redirect_all_callers (n_alias, to);
775           if (n_alias->can_remove_if_no_direct_calls_p ()
776               && !n_alias->call_for_symbol_and_aliases (cgraph_node::has_thunk_p,
777                                                         NULL, true)
778               && !n_alias->has_aliases_p ())
779             n_alias->remove ();
780         }
781       if (!removed)
782         i++;
783     }
784   return nredirected;
785 }
786
787 /* Merges instance with an ALIAS_ITEM, where alias, thunk or redirection can
788    be applied.  */
789
790 bool
791 sem_function::merge (sem_item *alias_item)
792 {
793   gcc_assert (alias_item->type == FUNC);
794
795   sem_function *alias_func = static_cast<sem_function *> (alias_item);
796
797   cgraph_node *original = get_node ();
798   cgraph_node *local_original = NULL;
799   cgraph_node *alias = alias_func->get_node ();
800
801   bool create_wrapper = false;
802   bool create_alias = false;
803   bool redirect_callers = false;
804   bool remove = false;
805
806   bool original_discardable = false;
807   bool original_discarded = false;
808
809   bool original_address_matters = original->address_matters_p ();
810   bool alias_address_matters = alias->address_matters_p ();
811
812   if (DECL_NO_INLINE_WARNING_P (original->decl)
813       != DECL_NO_INLINE_WARNING_P (alias->decl))
814     {
815       if (dump_file)
816         fprintf (dump_file,
817                  "Not unifying; "
818                  "DECL_NO_INLINE_WARNING mismatch.\n\n");
819       return false;
820     }
821
822   /* Do not attempt to mix functions from different user sections;
823      we do not know what user intends with those.  */
824   if (((DECL_SECTION_NAME (original->decl) && !original->implicit_section)
825        || (DECL_SECTION_NAME (alias->decl) && !alias->implicit_section))
826       && DECL_SECTION_NAME (original->decl) != DECL_SECTION_NAME (alias->decl))
827     {
828       if (dump_file)
829         fprintf (dump_file,
830                  "Not unifying; "
831                  "original and alias are in different sections.\n\n");
832       return false;
833     }
834
835   /* See if original is in a section that can be discarded if the main
836      symbol is not used.  */
837
838   if (original->can_be_discarded_p ())
839     original_discardable = true;
840   /* Also consider case where we have resolution info and we know that
841      original's definition is not going to be used.  In this case we can not
842      create alias to original.  */
843   if (node->resolution != LDPR_UNKNOWN
844       && !decl_binds_to_current_def_p (node->decl))
845     original_discardable = original_discarded = true;
846
847   /* Creating a symtab alias is the optimal way to merge.
848      It however can not be used in the following cases:
849
850      1) if ORIGINAL and ALIAS may be possibly compared for address equality.
851      2) if ORIGINAL is in a section that may be discarded by linker or if
852         it is an external functions where we can not create an alias
853         (ORIGINAL_DISCARDABLE)
854      3) if target do not support symbol aliases.
855      4) original and alias lie in different comdat groups.
856
857      If we can not produce alias, we will turn ALIAS into WRAPPER of ORIGINAL
858      and/or redirect all callers from ALIAS to ORIGINAL.  */
859   if ((original_address_matters && alias_address_matters)
860       || (original_discardable
861           && (!DECL_COMDAT_GROUP (alias->decl)
862               || (DECL_COMDAT_GROUP (alias->decl)
863                   != DECL_COMDAT_GROUP (original->decl))))
864       || original_discarded
865       || !sem_item::target_supports_symbol_aliases_p ()
866       || DECL_COMDAT_GROUP (alias->decl) != DECL_COMDAT_GROUP (original->decl))
867     {
868       /* First see if we can produce wrapper.  */
869
870       /* Do not turn function in one comdat group into wrapper to another
871          comdat group. Other compiler producing the body of the
872          another comdat group may make opossite decision and with unfortunate
873          linker choices this may close a loop.  */
874       if (DECL_COMDAT_GROUP (original->decl) && DECL_COMDAT_GROUP (alias->decl)
875           && (DECL_COMDAT_GROUP (alias->decl)
876               != DECL_COMDAT_GROUP (original->decl)))
877         {
878           if (dump_file)
879             fprintf (dump_file,
880                      "Wrapper cannot be created because of COMDAT\n");
881         }
882       else if (DECL_STATIC_CHAIN (alias->decl))
883         {
884           if (dump_file)
885             fprintf (dump_file,
886                      "Can not create wrapper of nested functions.\n");
887         }
888       /* TODO: We can also deal with variadic functions never calling
889          VA_START.  */
890       else if (stdarg_p (TREE_TYPE (alias->decl)))
891         {
892           if (dump_file)
893             fprintf (dump_file,
894                      "can not create wrapper of stdarg function.\n");
895         }
896       else if (inline_summaries
897                && inline_summaries->get (alias)->self_size <= 2)
898         {
899           if (dump_file)
900             fprintf (dump_file, "Wrapper creation is not "
901                      "profitable (function is too small).\n");
902         }
903       /* If user paid attention to mark function noinline, assume it is
904          somewhat special and do not try to turn it into a wrapper that can
905          not be undone by inliner.  */
906       else if (lookup_attribute ("noinline", DECL_ATTRIBUTES (alias->decl)))
907         {
908           if (dump_file)
909             fprintf (dump_file, "Wrappers are not created for noinline.\n");
910         }
911       else
912         create_wrapper = true;
913
914       /* We can redirect local calls in the case both alias and orignal
915          are not interposable.  */
916       redirect_callers
917         = alias->get_availability () > AVAIL_INTERPOSABLE
918           && original->get_availability () > AVAIL_INTERPOSABLE
919           && !alias->instrumented_version;
920
921       if (!redirect_callers && !create_wrapper)
922         {
923           if (dump_file)
924             fprintf (dump_file, "Not unifying; can not redirect callers nor "
925                      "produce wrapper\n\n");
926           return false;
927         }
928
929       /* Work out the symbol the wrapper should call.
930          If ORIGINAL is interposable, we need to call a local alias.
931          Also produce local alias (if possible) as an optimization.
932
933          Local aliases can not be created inside comdat groups because that
934          prevents inlining.  */
935       if (!original_discardable && !original->get_comdat_group ())
936         {
937           local_original
938             = dyn_cast <cgraph_node *> (original->noninterposable_alias ());
939           if (!local_original
940               && original->get_availability () > AVAIL_INTERPOSABLE)
941             local_original = original;
942         }
943       /* If we can not use local alias, fallback to the original
944          when possible.  */
945       else if (original->get_availability () > AVAIL_INTERPOSABLE)
946         local_original = original;
947
948       /* If original is COMDAT local, we can not really redirect calls outside
949          of its comdat group to it.  */
950       if (original->comdat_local_p ())
951         redirect_callers = false;
952       if (!local_original)
953         {
954           if (dump_file)
955             fprintf (dump_file, "Not unifying; "
956                      "can not produce local alias.\n\n");
957           return false;
958         }
959
960       if (!redirect_callers && !create_wrapper)
961         {
962           if (dump_file)
963             fprintf (dump_file, "Not unifying; "
964                      "can not redirect callers nor produce a wrapper\n\n");
965           return false;
966         }
967       if (!create_wrapper
968           && !alias->call_for_symbol_and_aliases (cgraph_node::has_thunk_p,
969                                                   NULL, true)
970           && !alias->can_remove_if_no_direct_calls_p ())
971         {
972           if (dump_file)
973             fprintf (dump_file, "Not unifying; can not make wrapper and "
974                      "function has other uses than direct calls\n\n");
975           return false;
976         }
977     }
978   else
979     create_alias = true;
980
981   if (redirect_callers)
982     {
983       int nredirected = redirect_all_callers (alias, local_original);
984
985       if (nredirected)
986         {
987           alias->icf_merged = true;
988           local_original->icf_merged = true;
989
990           if (dump_file && nredirected)
991             fprintf (dump_file, "%i local calls have been "
992                      "redirected.\n", nredirected);
993         }
994
995       /* If all callers was redirected, do not produce wrapper.  */
996       if (alias->can_remove_if_no_direct_calls_p ()
997           && !alias->has_aliases_p ())
998         {
999           create_wrapper = false;
1000           remove = true;
1001         }
1002       gcc_assert (!create_alias);
1003     }
1004   else if (create_alias)
1005     {
1006       alias->icf_merged = true;
1007
1008       /* Remove the function's body.  */
1009       ipa_merge_profiles (original, alias);
1010       alias->release_body (true);
1011       alias->reset ();
1012       /* Notice global symbol possibly produced RTL.  */
1013       ((symtab_node *)alias)->call_for_symbol_and_aliases (clear_decl_rtl,
1014                                                            NULL, true);
1015
1016       /* Create the alias.  */
1017       cgraph_node::create_alias (alias_func->decl, decl);
1018       alias->resolve_alias (original);
1019
1020       original->call_for_symbol_thunks_and_aliases
1021          (set_local, (void *)(size_t) original->local_p (), true);
1022
1023       if (dump_file)
1024         fprintf (dump_file, "Unified; Function alias has been created.\n\n");
1025     }
1026   if (create_wrapper)
1027     {
1028       gcc_assert (!create_alias);
1029       alias->icf_merged = true;
1030       local_original->icf_merged = true;
1031
1032       ipa_merge_profiles (local_original, alias, true);
1033       alias->create_wrapper (local_original);
1034
1035       if (dump_file)
1036         fprintf (dump_file, "Unified; Wrapper has been created.\n\n");
1037     }
1038
1039   /* It's possible that redirection can hit thunks that block
1040      redirection opportunities.  */
1041   gcc_assert (alias->icf_merged || remove || redirect_callers);
1042   original->icf_merged = true;
1043
1044   /* Inform the inliner about cross-module merging.  */
1045   if ((original->lto_file_data || alias->lto_file_data)
1046       && original->lto_file_data != alias->lto_file_data)
1047     local_original->merged = original->merged = true;
1048
1049   if (remove)
1050     {
1051       ipa_merge_profiles (original, alias);
1052       alias->release_body ();
1053       alias->reset ();
1054       alias->body_removed = true;
1055       alias->icf_merged = true;
1056       if (dump_file)
1057         fprintf (dump_file, "Unified; Function body was removed.\n");
1058     }
1059
1060   return true;
1061 }
1062
1063 /* Semantic item initialization function.  */
1064
1065 void
1066 sem_function::init (void)
1067 {
1068   if (in_lto_p)
1069     get_node ()->get_untransformed_body ();
1070
1071   tree fndecl = node->decl;
1072   function *func = DECL_STRUCT_FUNCTION (fndecl);
1073
1074   gcc_assert (func);
1075   gcc_assert (SSANAMES (func));
1076
1077   ssa_names_size = SSANAMES (func)->length ();
1078   node = node;
1079
1080   decl = fndecl;
1081   region_tree = func->eh->region_tree;
1082
1083   /* iterating all function arguments.  */
1084   arg_count = count_formal_params (fndecl);
1085
1086   edge_count = n_edges_for_fn (func);
1087   cfg_checksum = coverage_compute_cfg_checksum (func);
1088
1089   inchash::hash hstate;
1090
1091   basic_block bb;
1092   FOR_EACH_BB_FN (bb, func)
1093   {
1094     unsigned nondbg_stmt_count = 0;
1095
1096     edge e;
1097     for (edge_iterator ei = ei_start (bb->preds); ei_cond (ei, &e);
1098          ei_next (&ei))
1099       cfg_checksum = iterative_hash_host_wide_int (e->flags,
1100                      cfg_checksum);
1101
1102     for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
1103          gsi_next (&gsi))
1104       {
1105         gimple stmt = gsi_stmt (gsi);
1106
1107         if (gimple_code (stmt) != GIMPLE_DEBUG
1108             && gimple_code (stmt) != GIMPLE_PREDICT)
1109           {
1110             hash_stmt (stmt, hstate);
1111             nondbg_stmt_count++;
1112           }
1113       }
1114
1115     gcode_hash = hstate.end ();
1116     bb_sizes.safe_push (nondbg_stmt_count);
1117
1118     /* Inserting basic block to hash table.  */
1119     sem_bb *semantic_bb = new sem_bb (bb, nondbg_stmt_count,
1120                                       EDGE_COUNT (bb->preds)
1121                                       + EDGE_COUNT (bb->succs));
1122
1123     bb_sorted.safe_push (semantic_bb);
1124   }
1125
1126   parse_tree_args ();
1127 }
1128
1129 /* Accumulate to HSTATE a hash of expression EXP.
1130    Identical to inchash::add_expr, but guaranteed to be stable across LTO
1131    and DECL equality classes.  */
1132
1133 void
1134 sem_item::add_expr (const_tree exp, inchash::hash &hstate)
1135 {
1136   if (exp == NULL_TREE)
1137     {
1138       hstate.merge_hash (0);
1139       return;
1140     }
1141
1142   /* Handled component can be matched in a cureful way proving equivalence
1143      even if they syntactically differ.  Just skip them.  */
1144   STRIP_NOPS (exp);
1145   while (handled_component_p (exp))
1146     exp = TREE_OPERAND (exp, 0);
1147
1148   enum tree_code code = TREE_CODE (exp);
1149   hstate.add_int (code);
1150
1151   switch (code)
1152     {
1153     /* Use inchash::add_expr for everything that is LTO stable.  */
1154     case VOID_CST:
1155     case INTEGER_CST:
1156     case REAL_CST:
1157     case FIXED_CST:
1158     case STRING_CST:
1159     case COMPLEX_CST:
1160     case VECTOR_CST:
1161       inchash::add_expr (exp, hstate);
1162       break;
1163     case CONSTRUCTOR:
1164       {
1165         unsigned HOST_WIDE_INT idx;
1166         tree value;
1167
1168         hstate.add_wide_int (int_size_in_bytes (TREE_TYPE (exp)));
1169
1170         FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, value)
1171           if (value)
1172             add_expr (value, hstate);
1173         break;
1174       }
1175     case ADDR_EXPR:
1176     case FDESC_EXPR:
1177       add_expr (get_base_address (TREE_OPERAND (exp, 0)), hstate);
1178       break;
1179     case SSA_NAME:
1180     case VAR_DECL:
1181     case CONST_DECL:
1182     case PARM_DECL:
1183       hstate.add_wide_int (int_size_in_bytes (TREE_TYPE (exp)));
1184       break;
1185     case MEM_REF:
1186     case POINTER_PLUS_EXPR:
1187     case MINUS_EXPR:
1188     case RANGE_EXPR:
1189       add_expr (TREE_OPERAND (exp, 0), hstate);
1190       add_expr (TREE_OPERAND (exp, 1), hstate);
1191       break;
1192     case PLUS_EXPR:
1193       {
1194         inchash::hash one, two;
1195         add_expr (TREE_OPERAND (exp, 0), one);
1196         add_expr (TREE_OPERAND (exp, 1), two);
1197         hstate.add_commutative (one, two);
1198       }
1199       break;
1200     CASE_CONVERT:
1201       hstate.add_wide_int (int_size_in_bytes (TREE_TYPE (exp)));
1202       return add_expr (TREE_OPERAND (exp, 0), hstate);
1203     default:
1204       break;
1205     }
1206 }
1207
1208 /* Improve accumulated hash for HSTATE based on a gimple statement STMT.  */
1209
1210 void
1211 sem_function::hash_stmt (gimple stmt, inchash::hash &hstate)
1212 {
1213   enum gimple_code code = gimple_code (stmt);
1214
1215   hstate.add_int (code);
1216
1217   switch (code)
1218     {
1219     case GIMPLE_ASSIGN:
1220       if (commutative_tree_code (gimple_assign_rhs_code (stmt))
1221           || commutative_ternary_tree_code (gimple_assign_rhs_code (stmt)))
1222         {
1223           inchash::hash one, two;
1224
1225           add_expr (gimple_assign_rhs1 (stmt), one);
1226           add_expr (gimple_assign_rhs2 (stmt), two);
1227           hstate.add_commutative (one, two);
1228           add_expr (gimple_assign_lhs (stmt), hstate);
1229           break;
1230         }
1231       /* ... fall through ... */
1232     case GIMPLE_CALL:
1233     case GIMPLE_ASM:
1234     case GIMPLE_COND:
1235     case GIMPLE_GOTO:
1236     case GIMPLE_RETURN:
1237       /* All these statements are equivalent if their operands are.  */
1238       for (unsigned i = 0; i < gimple_num_ops (stmt); ++i)
1239         add_expr (gimple_op (stmt, i), hstate);
1240     default:
1241       break;
1242     }
1243 }
1244
1245
1246 /* Return true if polymorphic comparison must be processed.  */
1247
1248 bool
1249 sem_function::compare_polymorphic_p (void)
1250 {
1251   struct cgraph_edge *e;
1252
1253   if (!opt_for_fn (decl, flag_devirtualize))
1254     return false;
1255   if (get_node ()->indirect_calls != NULL
1256       || m_compared_func->get_node ()->indirect_calls != NULL)
1257     return true;
1258   /* TODO: We can do simple propagation determining what calls may lead to
1259      a polymorphic call.  */
1260   for (e = m_compared_func->get_node ()->callees; e; e = e->next_callee)
1261     if (e->callee->definition
1262         && opt_for_fn (e->callee->decl, flag_devirtualize))
1263       return true;
1264   return false;
1265 }
1266
1267 /* For a given call graph NODE, the function constructs new
1268    semantic function item.  */
1269
1270 sem_function *
1271 sem_function::parse (cgraph_node *node, bitmap_obstack *stack)
1272 {
1273   tree fndecl = node->decl;
1274   function *func = DECL_STRUCT_FUNCTION (fndecl);
1275
1276   /* TODO: add support for thunks.  */
1277
1278   if (!func || !node->has_gimple_body_p ())
1279     return NULL;
1280
1281   if (lookup_attribute_by_prefix ("omp ", DECL_ATTRIBUTES (node->decl)) != NULL)
1282     return NULL;
1283
1284   sem_function *f = new sem_function (node, 0, stack);
1285
1286   f->init ();
1287
1288   return f;
1289 }
1290
1291 /* Parses function arguments and result type.  */
1292
1293 void
1294 sem_function::parse_tree_args (void)
1295 {
1296   tree result;
1297
1298   if (arg_types.exists ())
1299     arg_types.release ();
1300
1301   arg_types.create (4);
1302   tree fnargs = DECL_ARGUMENTS (decl);
1303
1304   for (tree parm = fnargs; parm; parm = DECL_CHAIN (parm))
1305     arg_types.safe_push (DECL_ARG_TYPE (parm));
1306
1307   /* Function result type.  */
1308   result = DECL_RESULT (decl);
1309   result_type = result ? TREE_TYPE (result) : NULL;
1310
1311   /* During WPA, we can get arguments by following method.  */
1312   if (!fnargs)
1313     {
1314       tree type = TYPE_ARG_TYPES (TREE_TYPE (decl));
1315       for (tree parm = type; parm; parm = TREE_CHAIN (parm))
1316         arg_types.safe_push (TYPE_CANONICAL (TREE_VALUE (parm)));
1317
1318       result_type = TREE_TYPE (TREE_TYPE (decl));
1319     }
1320 }
1321
1322 /* For given basic blocks BB1 and BB2 (from functions FUNC1 and FUNC),
1323    return true if phi nodes are semantically equivalent in these blocks .  */
1324
1325 bool
1326 sem_function::compare_phi_node (basic_block bb1, basic_block bb2)
1327 {
1328   gphi_iterator si1, si2;
1329   gphi *phi1, *phi2;
1330   unsigned size1, size2, i;
1331   tree t1, t2;
1332   edge e1, e2;
1333
1334   gcc_assert (bb1 != NULL);
1335   gcc_assert (bb2 != NULL);
1336
1337   si2 = gsi_start_phis (bb2);
1338   for (si1 = gsi_start_phis (bb1); !gsi_end_p (si1);
1339        gsi_next (&si1))
1340     {
1341       gsi_next_nonvirtual_phi (&si1);
1342       gsi_next_nonvirtual_phi (&si2);
1343
1344       if (gsi_end_p (si1) && gsi_end_p (si2))
1345         break;
1346
1347       if (gsi_end_p (si1) || gsi_end_p (si2))
1348         return return_false();
1349
1350       phi1 = si1.phi ();
1351       phi2 = si2.phi ();
1352
1353       tree phi_result1 = gimple_phi_result (phi1);
1354       tree phi_result2 = gimple_phi_result (phi2);
1355
1356       if (!m_checker->compare_operand (phi_result1, phi_result2))
1357         return return_false_with_msg ("PHI results are different");
1358
1359       size1 = gimple_phi_num_args (phi1);
1360       size2 = gimple_phi_num_args (phi2);
1361
1362       if (size1 != size2)
1363         return return_false ();
1364
1365       for (i = 0; i < size1; ++i)
1366         {
1367           t1 = gimple_phi_arg (phi1, i)->def;
1368           t2 = gimple_phi_arg (phi2, i)->def;
1369
1370           if (!m_checker->compare_operand (t1, t2))
1371             return return_false ();
1372
1373           e1 = gimple_phi_arg_edge (phi1, i);
1374           e2 = gimple_phi_arg_edge (phi2, i);
1375
1376           if (!m_checker->compare_edge (e1, e2))
1377             return return_false ();
1378         }
1379
1380       gsi_next (&si2);
1381     }
1382
1383   return true;
1384 }
1385
1386 /* Returns true if tree T can be compared as a handled component.  */
1387
1388 bool
1389 sem_function::icf_handled_component_p (tree t)
1390 {
1391   tree_code tc = TREE_CODE (t);
1392
1393   return ((handled_component_p (t))
1394           || tc == ADDR_EXPR || tc == MEM_REF || tc == REALPART_EXPR
1395           || tc == IMAGPART_EXPR || tc == OBJ_TYPE_REF);
1396 }
1397
1398 /* Basic blocks dictionary BB_DICT returns true if SOURCE index BB
1399    corresponds to TARGET.  */
1400
1401 bool
1402 sem_function::bb_dict_test (vec<int> *bb_dict, int source, int target)
1403 {
1404   source++;
1405   target++;
1406
1407   if (bb_dict->length () <= (unsigned)source)
1408     bb_dict->safe_grow_cleared (source + 1);
1409
1410   if ((*bb_dict)[source] == 0)
1411     {
1412       (*bb_dict)[source] = target;
1413       return true;
1414     }
1415   else
1416     return (*bb_dict)[source] == target;
1417 }
1418
1419
1420 /* Semantic variable constructor that uses STACK as bitmap memory stack.  */
1421
1422 sem_variable::sem_variable (bitmap_obstack *stack): sem_item (VAR, stack)
1423 {
1424 }
1425
1426 /*  Constructor based on varpool node _NODE with computed hash _HASH.
1427     Bitmap STACK is used for memory allocation.  */
1428
1429 sem_variable::sem_variable (varpool_node *node, hashval_t _hash,
1430                             bitmap_obstack *stack): sem_item(VAR,
1431                                   node, _hash, stack)
1432 {
1433   gcc_checking_assert (node);
1434   gcc_checking_assert (get_node ());
1435 }
1436
1437 /* Fast equality function based on knowledge known in WPA.  */
1438
1439 bool
1440 sem_variable::equals_wpa (sem_item *item,
1441                           hash_map <symtab_node *, sem_item *> &ignored_nodes)
1442 {
1443   gcc_assert (item->type == VAR);
1444
1445   if (node->num_references () != item->node->num_references ())
1446     return return_false_with_msg ("different number of references");
1447
1448   if (DECL_TLS_MODEL (decl) || DECL_TLS_MODEL (item->decl))
1449     return return_false_with_msg ("TLS model");
1450
1451   if (DECL_ALIGN (decl) != DECL_ALIGN (item->decl))
1452     return return_false_with_msg ("alignment mismatch");
1453
1454   if (DECL_VIRTUAL_P (decl) != DECL_VIRTUAL_P (item->decl))
1455     return return_false_with_msg ("Virtual flag mismatch");
1456
1457   if (DECL_SIZE (decl) != DECL_SIZE (item->decl)
1458       && ((!DECL_SIZE (decl) || !DECL_SIZE (item->decl))
1459           || !operand_equal_p (DECL_SIZE (decl),
1460                                DECL_SIZE (item->decl), OEP_ONLY_CONST)))
1461     return return_false_with_msg ("size mismatch");
1462
1463   /* Do not attempt to mix data from different user sections;
1464      we do not know what user intends with those.  */
1465   if (((DECL_SECTION_NAME (decl) && !node->implicit_section)
1466        || (DECL_SECTION_NAME (item->decl) && !item->node->implicit_section))
1467       && DECL_SECTION_NAME (decl) != DECL_SECTION_NAME (item->decl))
1468     return return_false_with_msg ("user section mismatch");
1469
1470   if (DECL_IN_TEXT_SECTION (decl) != DECL_IN_TEXT_SECTION (item->decl))
1471     return return_false_with_msg ("text section");
1472
1473   ipa_ref *ref = NULL, *ref2 = NULL;
1474   for (unsigned i = 0; node->iterate_reference (i, ref); i++)
1475     {
1476       item->node->iterate_reference (i, ref2);
1477
1478       if (!compare_cgraph_references (ignored_nodes,
1479                                       ref->referred, ref2->referred,
1480                                       ref->address_matters_p ()))
1481         return false;
1482
1483       /* DECL_FINAL_P flag on methods referred by virtual tables is used
1484          to decide on completeness possible_polymorphic_call_targets lists
1485          and therefore it must match.  */
1486       if ((DECL_VIRTUAL_P (decl) || DECL_VIRTUAL_P (item->decl))
1487           && (DECL_VIRTUAL_P (ref->referred->decl)
1488               || DECL_VIRTUAL_P (ref2->referred->decl))
1489           && ((DECL_VIRTUAL_P (ref->referred->decl)
1490                != DECL_VIRTUAL_P (ref2->referred->decl))
1491               || (DECL_FINAL_P (ref->referred->decl)
1492                   != DECL_FINAL_P (ref2->referred->decl))))
1493         return return_false_with_msg ("virtual or final flag mismatch");
1494     }
1495
1496   return true;
1497 }
1498
1499 /* Returns true if the item equals to ITEM given as argument.  */
1500
1501 /* Returns true if the item equals to ITEM given as argument.  */
1502
1503 bool
1504 sem_variable::equals (sem_item *item,
1505                       hash_map <symtab_node *, sem_item *> &)
1506 {
1507   gcc_assert (item->type == VAR);
1508   bool ret;
1509
1510   if (DECL_INITIAL (decl) == error_mark_node && in_lto_p)
1511     dyn_cast <varpool_node *>(node)->get_constructor ();
1512   if (DECL_INITIAL (item->decl) == error_mark_node && in_lto_p)
1513     dyn_cast <varpool_node *>(item->node)->get_constructor ();
1514
1515   /* As seen in PR ipa/65303 we have to compare variables types.  */
1516   if (!func_checker::compatible_types_p (TREE_TYPE (decl),
1517                                          TREE_TYPE (item->decl)))
1518     return return_false_with_msg ("variables types are different");
1519
1520   ret = sem_variable::equals (DECL_INITIAL (decl),
1521                               DECL_INITIAL (item->node->decl));
1522   if (dump_file && (dump_flags & TDF_DETAILS))
1523     fprintf (dump_file,
1524              "Equals called for vars:%s:%s (%u:%u) (%s:%s) with result: %s\n\n",
1525              name(), item->name (), node->order, item->node->order, asm_name (),
1526              item->asm_name (), ret ? "true" : "false");
1527
1528   return ret;
1529 }
1530
1531 /* Compares trees T1 and T2 for semantic equality.  */
1532
1533 bool
1534 sem_variable::equals (tree t1, tree t2)
1535 {
1536   if (!t1 || !t2)
1537     return return_with_debug (t1 == t2);
1538   if (t1 == t2)
1539     return true;
1540   tree_code tc1 = TREE_CODE (t1);
1541   tree_code tc2 = TREE_CODE (t2);
1542
1543   if (tc1 != tc2)
1544     return return_false_with_msg ("TREE_CODE mismatch");
1545
1546   switch (tc1)
1547     {
1548     case CONSTRUCTOR:
1549       {
1550         vec<constructor_elt, va_gc> *v1, *v2;
1551         unsigned HOST_WIDE_INT idx;
1552
1553         enum tree_code typecode = TREE_CODE (TREE_TYPE (t1));
1554         if (typecode != TREE_CODE (TREE_TYPE (t2)))
1555           return return_false_with_msg ("constructor type mismatch");
1556
1557         if (typecode == ARRAY_TYPE)
1558           {
1559             HOST_WIDE_INT size_1 = int_size_in_bytes (TREE_TYPE (t1));
1560             /* For arrays, check that the sizes all match.  */
1561             if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2))
1562                 || size_1 == -1
1563                 || size_1 != int_size_in_bytes (TREE_TYPE (t2)))
1564               return return_false_with_msg ("constructor array size mismatch");
1565           }
1566         else if (!func_checker::compatible_types_p (TREE_TYPE (t1),
1567                                                     TREE_TYPE (t2)))
1568           return return_false_with_msg ("constructor type incompatible");
1569
1570         v1 = CONSTRUCTOR_ELTS (t1);
1571         v2 = CONSTRUCTOR_ELTS (t2);
1572         if (vec_safe_length (v1) != vec_safe_length (v2))
1573           return return_false_with_msg ("constructor number of elts mismatch");
1574
1575         for (idx = 0; idx < vec_safe_length (v1); ++idx)
1576           {
1577             constructor_elt *c1 = &(*v1)[idx];
1578             constructor_elt *c2 = &(*v2)[idx];
1579
1580             /* Check that each value is the same...  */
1581             if (!sem_variable::equals (c1->value, c2->value))
1582               return false;
1583             /* ... and that they apply to the same fields!  */
1584             if (!sem_variable::equals (c1->index, c2->index))
1585               return false;
1586           }
1587         return true;
1588       }
1589     case MEM_REF:
1590       {
1591         tree x1 = TREE_OPERAND (t1, 0);
1592         tree x2 = TREE_OPERAND (t2, 0);
1593         tree y1 = TREE_OPERAND (t1, 1);
1594         tree y2 = TREE_OPERAND (t2, 1);
1595
1596         if (!func_checker::compatible_types_p (TREE_TYPE (x1), TREE_TYPE (x2)))
1597           return return_false ();
1598
1599         /* Type of the offset on MEM_REF does not matter.  */
1600         return return_with_debug (sem_variable::equals (x1, x2)
1601                                   && wi::to_offset  (y1)
1602                                      == wi::to_offset  (y2));
1603       }
1604     case ADDR_EXPR:
1605     case FDESC_EXPR:
1606       {
1607         tree op1 = TREE_OPERAND (t1, 0);
1608         tree op2 = TREE_OPERAND (t2, 0);
1609         return sem_variable::equals (op1, op2);
1610       }
1611     /* References to other vars/decls are compared using ipa-ref.  */
1612     case FUNCTION_DECL:
1613     case VAR_DECL:
1614       if (decl_in_symtab_p (t1) && decl_in_symtab_p (t2))
1615         return true;
1616       return return_false_with_msg ("Declaration mismatch");
1617     case CONST_DECL:
1618       /* TODO: We can check CONST_DECL by its DECL_INITIAL, but for that we
1619          need to process its VAR/FUNCTION references without relying on ipa-ref
1620          compare.  */
1621     case FIELD_DECL:
1622     case LABEL_DECL:
1623       return return_false_with_msg ("Declaration mismatch");
1624     case INTEGER_CST:
1625       /* Integer constants are the same only if the same width of type.  */
1626       if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
1627         return return_false_with_msg ("INTEGER_CST precision mismatch");
1628       if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2)))
1629         return return_false_with_msg ("INTEGER_CST mode mismatch");
1630       return return_with_debug (tree_int_cst_equal (t1, t2));
1631     case STRING_CST:
1632       if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2)))
1633         return return_false_with_msg ("STRING_CST mode mismatch");
1634       if (TREE_STRING_LENGTH (t1) != TREE_STRING_LENGTH (t2))
1635         return return_false_with_msg ("STRING_CST length mismatch");
1636       if (memcmp (TREE_STRING_POINTER (t1), TREE_STRING_POINTER (t2),
1637                     TREE_STRING_LENGTH (t1)))
1638         return return_false_with_msg ("STRING_CST mismatch");
1639       return true;
1640     case FIXED_CST:
1641       /* Fixed constants are the same only if the same width of type.  */
1642       if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
1643         return return_false_with_msg ("FIXED_CST precision mismatch");
1644
1645       return return_with_debug (FIXED_VALUES_IDENTICAL (TREE_FIXED_CST (t1),
1646                                                         TREE_FIXED_CST (t2)));
1647     case COMPLEX_CST:
1648       return (sem_variable::equals (TREE_REALPART (t1), TREE_REALPART (t2))
1649               && sem_variable::equals (TREE_IMAGPART (t1), TREE_IMAGPART (t2)));
1650     case REAL_CST:
1651       /* Real constants are the same only if the same width of type.  */
1652       if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
1653         return return_false_with_msg ("REAL_CST precision mismatch");
1654       return return_with_debug (REAL_VALUES_IDENTICAL (TREE_REAL_CST (t1),
1655                                                        TREE_REAL_CST (t2)));
1656     case VECTOR_CST:
1657       {
1658         unsigned i;
1659
1660         if (VECTOR_CST_NELTS (t1) != VECTOR_CST_NELTS (t2))
1661           return return_false_with_msg ("VECTOR_CST nelts mismatch");
1662
1663         for (i = 0; i < VECTOR_CST_NELTS (t1); ++i)
1664           if (!sem_variable::equals (VECTOR_CST_ELT (t1, i),
1665                                      VECTOR_CST_ELT (t2, i)))
1666             return 0;
1667
1668         return 1;
1669       }
1670     case ARRAY_REF:
1671     case ARRAY_RANGE_REF:
1672       {
1673         tree x1 = TREE_OPERAND (t1, 0);
1674         tree x2 = TREE_OPERAND (t2, 0);
1675         tree y1 = TREE_OPERAND (t1, 1);
1676         tree y2 = TREE_OPERAND (t2, 1);
1677
1678         if (!sem_variable::equals (x1, x2) || !sem_variable::equals (y1, y2))
1679           return false;
1680         if (!sem_variable::equals (array_ref_low_bound (t1),
1681                                    array_ref_low_bound (t2)))
1682           return false;
1683         if (!sem_variable::equals (array_ref_element_size (t1),
1684                                    array_ref_element_size (t2)))
1685           return false;
1686         return true;
1687       }
1688      
1689     case COMPONENT_REF:
1690     case POINTER_PLUS_EXPR:
1691     case PLUS_EXPR:
1692     case MINUS_EXPR:
1693     case RANGE_EXPR:
1694       {
1695         tree x1 = TREE_OPERAND (t1, 0);
1696         tree x2 = TREE_OPERAND (t2, 0);
1697         tree y1 = TREE_OPERAND (t1, 1);
1698         tree y2 = TREE_OPERAND (t2, 1);
1699
1700         return sem_variable::equals (x1, x2) && sem_variable::equals (y1, y2);
1701       }
1702
1703     CASE_CONVERT:
1704     case VIEW_CONVERT_EXPR:
1705       if (!func_checker::compatible_types_p (TREE_TYPE (t1), TREE_TYPE (t2)))
1706           return return_false ();
1707       return sem_variable::equals (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
1708     case ERROR_MARK:
1709       return return_false_with_msg ("ERROR_MARK");
1710     default:
1711       return return_false_with_msg ("Unknown TREE code reached");
1712     }
1713 }
1714
1715 /* Parser function that visits a varpool NODE.  */
1716
1717 sem_variable *
1718 sem_variable::parse (varpool_node *node, bitmap_obstack *stack)
1719 {
1720   if (TREE_THIS_VOLATILE (node->decl) || DECL_HARD_REGISTER (node->decl)
1721       || node->alias)
1722     return NULL;
1723
1724   sem_variable *v = new sem_variable (node, 0, stack);
1725
1726   v->init ();
1727
1728   return v;
1729 }
1730
1731 /* References independent hash function.  */
1732
1733 hashval_t
1734 sem_variable::get_hash (void)
1735 {
1736   if (hash)
1737
1738     return hash;
1739   /* All WPA streamed in symbols should have their hashes computed at compile
1740      time.  At this point, the constructor may not be in memory at all.
1741      DECL_INITIAL (decl) would be error_mark_node in that case.  */
1742   gcc_assert (!node->lto_file_data);
1743   tree ctor = DECL_INITIAL (decl);
1744   inchash::hash hstate;
1745
1746   hstate.add_int (456346417);
1747   if (DECL_SIZE (decl) && tree_fits_shwi_p (DECL_SIZE (decl)))
1748     hstate.add_wide_int (tree_to_shwi (DECL_SIZE (decl)));
1749   add_expr (ctor, hstate);
1750   hash = hstate.end ();
1751
1752   return hash;
1753 }
1754
1755 /* Merges instance with an ALIAS_ITEM, where alias, thunk or redirection can
1756    be applied.  */
1757
1758 bool
1759 sem_variable::merge (sem_item *alias_item)
1760 {
1761   gcc_assert (alias_item->type == VAR);
1762
1763   if (!sem_item::target_supports_symbol_aliases_p ())
1764     {
1765       if (dump_file)
1766         fprintf (dump_file, "Not unifying; "
1767                  "Symbol aliases are not supported by target\n\n");
1768       return false;
1769     }
1770
1771   sem_variable *alias_var = static_cast<sem_variable *> (alias_item);
1772
1773   varpool_node *original = get_node ();
1774   varpool_node *alias = alias_var->get_node ();
1775   bool original_discardable = false;
1776
1777   bool original_address_matters = original->address_matters_p ();
1778   bool alias_address_matters = alias->address_matters_p ();
1779
1780   /* See if original is in a section that can be discarded if the main
1781      symbol is not used.
1782      Also consider case where we have resolution info and we know that
1783      original's definition is not going to be used.  In this case we can not
1784      create alias to original.  */
1785   if (original->can_be_discarded_p ()
1786       || (node->resolution != LDPR_UNKNOWN
1787           && !decl_binds_to_current_def_p (node->decl)))
1788     original_discardable = true;
1789
1790   gcc_assert (!TREE_ASM_WRITTEN (alias->decl));
1791
1792   /* Constant pool machinery is not quite ready for aliases.
1793      TODO: varasm code contains logic for merging DECL_IN_CONSTANT_POOL.
1794      For LTO merging does not happen that is an important missing feature.
1795      We can enable merging with LTO if the DECL_IN_CONSTANT_POOL
1796      flag is dropped and non-local symbol name is assigned.  */
1797   if (DECL_IN_CONSTANT_POOL (alias->decl)
1798       || DECL_IN_CONSTANT_POOL (original->decl))
1799     {
1800       if (dump_file)
1801         fprintf (dump_file,
1802                  "Not unifying; constant pool variables.\n\n");
1803       return false;
1804     }
1805
1806   /* Do not attempt to mix functions from different user sections;
1807      we do not know what user intends with those.  */
1808   if (((DECL_SECTION_NAME (original->decl) && !original->implicit_section)
1809        || (DECL_SECTION_NAME (alias->decl) && !alias->implicit_section))
1810       && DECL_SECTION_NAME (original->decl) != DECL_SECTION_NAME (alias->decl))
1811     {
1812       if (dump_file)
1813         fprintf (dump_file,
1814                  "Not unifying; "
1815                  "original and alias are in different sections.\n\n");
1816       return false;
1817     }
1818
1819   /* We can not merge if address comparsion metters.  */
1820   if (original_address_matters && alias_address_matters
1821       && flag_merge_constants < 2)
1822     {
1823       if (dump_file)
1824         fprintf (dump_file,
1825                  "Not unifying; "
1826                  "adress of original and alias may be compared.\n\n");
1827       return false;
1828     }
1829   if (DECL_COMDAT_GROUP (original->decl) != DECL_COMDAT_GROUP (alias->decl))
1830     {
1831       if (dump_file)
1832         fprintf (dump_file, "Not unifying; alias cannot be created; "
1833                  "across comdat group boundary\n\n");
1834
1835       return false;
1836     }
1837
1838   if (original_discardable)
1839     {
1840       if (dump_file)
1841         fprintf (dump_file, "Not unifying; alias cannot be created; "
1842                  "target is discardable\n\n");
1843
1844       return false;
1845     }
1846   else
1847     {
1848       gcc_assert (!original->alias);
1849       gcc_assert (!alias->alias);
1850
1851       alias->analyzed = false;
1852
1853       DECL_INITIAL (alias->decl) = NULL;
1854       ((symtab_node *)alias)->call_for_symbol_and_aliases (clear_decl_rtl,
1855                                                            NULL, true);
1856       alias->need_bounds_init = false;
1857       alias->remove_all_references ();
1858       if (TREE_ADDRESSABLE (alias->decl))
1859         original->call_for_symbol_and_aliases (set_addressable, NULL, true);
1860
1861       varpool_node::create_alias (alias_var->decl, decl);
1862       alias->resolve_alias (original);
1863
1864       if (dump_file)
1865         fprintf (dump_file, "Unified; Variable alias has been created.\n\n");
1866
1867       return true;
1868     }
1869 }
1870
1871 /* Dump symbol to FILE.  */
1872
1873 void
1874 sem_variable::dump_to_file (FILE *file)
1875 {
1876   gcc_assert (file);
1877
1878   print_node (file, "", decl, 0);
1879   fprintf (file, "\n\n");
1880 }
1881
1882 unsigned int sem_item_optimizer::class_id = 0;
1883
1884 sem_item_optimizer::sem_item_optimizer (): worklist (0), m_classes (0),
1885   m_classes_count (0), m_cgraph_node_hooks (NULL), m_varpool_node_hooks (NULL)
1886 {
1887   m_items.create (0);
1888   bitmap_obstack_initialize (&m_bmstack);
1889 }
1890
1891 sem_item_optimizer::~sem_item_optimizer ()
1892 {
1893   for (unsigned int i = 0; i < m_items.length (); i++)
1894     delete m_items[i];
1895
1896   for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
1897        it != m_classes.end (); ++it)
1898     {
1899       for (unsigned int i = 0; i < (*it)->classes.length (); i++)
1900         delete (*it)->classes[i];
1901
1902       (*it)->classes.release ();
1903       free (*it);
1904     }
1905
1906   m_items.release ();
1907
1908   bitmap_obstack_release (&m_bmstack);
1909 }
1910
1911 /* Write IPA ICF summary for symbols.  */
1912
1913 void
1914 sem_item_optimizer::write_summary (void)
1915 {
1916   unsigned int count = 0;
1917
1918   output_block *ob = create_output_block (LTO_section_ipa_icf);
1919   lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
1920   ob->symbol = NULL;
1921
1922   /* Calculate number of symbols to be serialized.  */
1923   for (lto_symtab_encoder_iterator lsei = lsei_start_in_partition (encoder);
1924        !lsei_end_p (lsei);
1925        lsei_next_in_partition (&lsei))
1926     {
1927       symtab_node *node = lsei_node (lsei);
1928
1929       if (m_symtab_node_map.get (node))
1930         count++;
1931     }
1932
1933   streamer_write_uhwi (ob, count);
1934
1935   /* Process all of the symbols.  */
1936   for (lto_symtab_encoder_iterator lsei = lsei_start_in_partition (encoder);
1937        !lsei_end_p (lsei);
1938        lsei_next_in_partition (&lsei))
1939     {
1940       symtab_node *node = lsei_node (lsei);
1941
1942       sem_item **item = m_symtab_node_map.get (node);
1943
1944       if (item && *item)
1945         {
1946           int node_ref = lto_symtab_encoder_encode (encoder, node);
1947           streamer_write_uhwi_stream (ob->main_stream, node_ref);
1948
1949           streamer_write_uhwi (ob, (*item)->get_hash ());
1950         }
1951     }
1952
1953   streamer_write_char_stream (ob->main_stream, 0);
1954   produce_asm (ob, NULL);
1955   destroy_output_block (ob);
1956 }
1957
1958 /* Reads a section from LTO stream file FILE_DATA. Input block for DATA
1959    contains LEN bytes.  */
1960
1961 void
1962 sem_item_optimizer::read_section (lto_file_decl_data *file_data,
1963                                   const char *data, size_t len)
1964 {
1965   const lto_function_header *header =
1966     (const lto_function_header *) data;
1967   const int cfg_offset = sizeof (lto_function_header);
1968   const int main_offset = cfg_offset + header->cfg_size;
1969   const int string_offset = main_offset + header->main_size;
1970   data_in *data_in;
1971   unsigned int i;
1972   unsigned int count;
1973
1974   lto_input_block ib_main ((const char *) data + main_offset, 0,
1975                            header->main_size, file_data->mode_table);
1976
1977   data_in =
1978     lto_data_in_create (file_data, (const char *) data + string_offset,
1979                         header->string_size, vNULL);
1980
1981   count = streamer_read_uhwi (&ib_main);
1982
1983   for (i = 0; i < count; i++)
1984     {
1985       unsigned int index;
1986       symtab_node *node;
1987       lto_symtab_encoder_t encoder;
1988
1989       index = streamer_read_uhwi (&ib_main);
1990       encoder = file_data->symtab_node_encoder;
1991       node = lto_symtab_encoder_deref (encoder, index);
1992
1993       hashval_t hash = streamer_read_uhwi (&ib_main);
1994
1995       gcc_assert (node->definition);
1996
1997       if (dump_file)
1998         fprintf (dump_file, "Symbol added:%s (tree: %p, uid:%u)\n", node->asm_name (),
1999                  (void *) node->decl, node->order);
2000
2001       if (is_a<cgraph_node *> (node))
2002         {
2003           cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
2004
2005           m_items.safe_push (new sem_function (cnode, hash, &m_bmstack));
2006         }
2007       else
2008         {
2009           varpool_node *vnode = dyn_cast <varpool_node *> (node);
2010
2011           m_items.safe_push (new sem_variable (vnode, hash, &m_bmstack));
2012         }
2013     }
2014
2015   lto_free_section_data (file_data, LTO_section_ipa_icf, NULL, data,
2016                          len);
2017   lto_data_in_delete (data_in);
2018 }
2019
2020 /* Read IPA IPA ICF summary for symbols.  */
2021
2022 void
2023 sem_item_optimizer::read_summary (void)
2024 {
2025   lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
2026   lto_file_decl_data *file_data;
2027   unsigned int j = 0;
2028
2029   while ((file_data = file_data_vec[j++]))
2030     {
2031       size_t len;
2032       const char *data = lto_get_section_data (file_data,
2033                          LTO_section_ipa_icf, NULL, &len);
2034
2035       if (data)
2036         read_section (file_data, data, len);
2037     }
2038 }
2039
2040 /* Register callgraph and varpool hooks.  */
2041
2042 void
2043 sem_item_optimizer::register_hooks (void)
2044 {
2045   if (!m_cgraph_node_hooks)
2046     m_cgraph_node_hooks = symtab->add_cgraph_removal_hook
2047                           (&sem_item_optimizer::cgraph_removal_hook, this);
2048
2049   if (!m_varpool_node_hooks)
2050     m_varpool_node_hooks = symtab->add_varpool_removal_hook
2051                            (&sem_item_optimizer::varpool_removal_hook, this);
2052 }
2053
2054 /* Unregister callgraph and varpool hooks.  */
2055
2056 void
2057 sem_item_optimizer::unregister_hooks (void)
2058 {
2059   if (m_cgraph_node_hooks)
2060     symtab->remove_cgraph_removal_hook (m_cgraph_node_hooks);
2061
2062   if (m_varpool_node_hooks)
2063     symtab->remove_varpool_removal_hook (m_varpool_node_hooks);
2064 }
2065
2066 /* Adds a CLS to hashtable associated by hash value.  */
2067
2068 void
2069 sem_item_optimizer::add_class (congruence_class *cls)
2070 {
2071   gcc_assert (cls->members.length ());
2072
2073   congruence_class_group *group = get_group_by_hash (
2074                                     cls->members[0]->get_hash (),
2075                                     cls->members[0]->type);
2076   group->classes.safe_push (cls);
2077 }
2078
2079 /* Gets a congruence class group based on given HASH value and TYPE.  */
2080
2081 congruence_class_group *
2082 sem_item_optimizer::get_group_by_hash (hashval_t hash, sem_item_type type)
2083 {
2084   congruence_class_group *item = XNEW (congruence_class_group);
2085   item->hash = hash;
2086   item->type = type;
2087
2088   congruence_class_group **slot = m_classes.find_slot (item, INSERT);
2089
2090   if (*slot)
2091     free (item);
2092   else
2093     {
2094       item->classes.create (1);
2095       *slot = item;
2096     }
2097
2098   return *slot;
2099 }
2100
2101 /* Callgraph removal hook called for a NODE with a custom DATA.  */
2102
2103 void
2104 sem_item_optimizer::cgraph_removal_hook (cgraph_node *node, void *data)
2105 {
2106   sem_item_optimizer *optimizer = (sem_item_optimizer *) data;
2107   optimizer->remove_symtab_node (node);
2108 }
2109
2110 /* Varpool removal hook called for a NODE with a custom DATA.  */
2111
2112 void
2113 sem_item_optimizer::varpool_removal_hook (varpool_node *node, void *data)
2114 {
2115   sem_item_optimizer *optimizer = (sem_item_optimizer *) data;
2116   optimizer->remove_symtab_node (node);
2117 }
2118
2119 /* Remove symtab NODE triggered by symtab removal hooks.  */
2120
2121 void
2122 sem_item_optimizer::remove_symtab_node (symtab_node *node)
2123 {
2124   gcc_assert (!m_classes.elements());
2125
2126   m_removed_items_set.add (node);
2127 }
2128
2129 void
2130 sem_item_optimizer::remove_item (sem_item *item)
2131 {
2132   if (m_symtab_node_map.get (item->node))
2133     m_symtab_node_map.remove (item->node);
2134   delete item;
2135 }
2136
2137 /* Removes all callgraph and varpool nodes that are marked by symtab
2138    as deleted.  */
2139
2140 void
2141 sem_item_optimizer::filter_removed_items (void)
2142 {
2143   auto_vec <sem_item *> filtered;
2144
2145   for (unsigned int i = 0; i < m_items.length(); i++)
2146     {
2147       sem_item *item = m_items[i];
2148
2149       if (m_removed_items_set.contains (item->node))
2150         {
2151           remove_item (item);
2152           continue;
2153         }
2154
2155       if (item->type == FUNC)
2156         {
2157           cgraph_node *cnode = static_cast <sem_function *>(item)->get_node ();
2158
2159           if (in_lto_p && (cnode->alias || cnode->body_removed))
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 }