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