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