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