Simplify X * C1 == C2 with undefined overflow
[official-gcc.git] / gcc / ipa-icf.c
blob069de9d82fb3e2c6385b54b412e9e81a6993ab1c
1 /* Interprocedural Identical Code Folding pass
2 Copyright (C) 2014-2020 Free Software Foundation, Inc.
4 Contributed by Jan Hubicka <hubicka@ucw.cz> and Martin Liska <mliska@suse.cz>
6 This file is part of GCC.
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.
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.
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/>. */
22 /* Interprocedural Identical Code Folding for functions and
23 read-only variables.
25 The goal of this transformation is to discover functions and read-only
26 variables which do have exactly the same semantics.
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.
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.
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"
88 using namespace ipa_icf_gimple;
90 namespace ipa_icf {
92 /* Initialization and computation of symtab node hash, there data
93 are propagated later on. */
95 static sem_item_optimizer *optimizer = NULL;
97 /* Constructor. */
99 symbol_compare_collection::symbol_compare_collection (symtab_node *node)
101 m_references.create (0);
102 m_interposables.create (0);
104 ipa_ref *ref;
106 if (is_a <varpool_node *> (node) && DECL_VIRTUAL_P (node->decl))
107 return;
109 for (unsigned i = 0; node->iterate_reference (i, ref); i++)
111 if (ref->address_matters_p ())
112 m_references.safe_push (ref->referred);
114 if (ref->referred->get_availability () <= AVAIL_INTERPOSABLE)
116 if (ref->address_matters_p ())
117 m_references.safe_push (ref->referred);
118 else
119 m_interposables.safe_push (ref->referred);
123 if (is_a <cgraph_node *> (node))
125 cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
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);
133 /* Constructor for key value pair, where _ITEM is key and _INDEX is a target. */
135 sem_usage_pair::sem_usage_pair (sem_item *_item, unsigned int _index)
136 : item (_item), index (_index)
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)
143 setup (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)
151 decl = node->decl;
152 setup (stack);
155 /* Add reference to a semantic TARGET. */
157 void
158 sem_item::add_reference (ref_map *refs,
159 sem_item *target)
161 unsigned index = reference_count++;
162 bool existed;
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;
172 /* Initialize internal data structures. Bitmap STACK is used for
173 bitmap memory allocation process. */
175 void
176 sem_item::setup (bitmap_obstack *stack)
178 gcc_checking_assert (node);
180 reference_count = 0;
181 tree_refs.create (0);
182 usage_index_bitmap = BITMAP_ALLOC (stack);
185 sem_item::~sem_item ()
187 tree_refs.release ();
189 BITMAP_FREE (usage_index_bitmap);
192 /* Dump function for debugging purpose. */
194 DEBUG_FUNCTION void
195 sem_item::dump (void)
197 if (dump_file)
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 ());
205 /* Return true if target supports alias symbols. */
207 bool
208 sem_item::target_supports_symbol_aliases_p (void)
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
217 void sem_item::set_hash (hashval_t hash)
219 m_hash = hash;
220 m_hash_set = true;
223 hash_map<const_tree, hashval_t> sem_item::m_type_hash_cache;
225 /* Semantic function constructor that uses STACK as bitmap memory stack. */
227 sem_function::sem_function (bitmap_obstack *stack)
228 : sem_item (FUNC, stack), m_checker (NULL), m_compared_func (NULL)
230 bb_sizes.create (0);
231 bb_sorted.create (0);
234 sem_function::sem_function (cgraph_node *node, bitmap_obstack *stack)
235 : sem_item (FUNC, node, stack), m_checker (NULL), m_compared_func (NULL)
237 bb_sizes.create (0);
238 bb_sorted.create (0);
241 sem_function::~sem_function ()
243 for (unsigned i = 0; i < bb_sorted.length (); i++)
244 delete (bb_sorted[i]);
246 bb_sizes.release ();
247 bb_sorted.release ();
250 /* Calculates hash value based on a BASIC_BLOCK. */
252 hashval_t
253 sem_function::get_bb_hash (const sem_bb *basic_block)
255 inchash::hash hstate;
257 hstate.add_int (basic_block->nondbg_stmt_count);
258 hstate.add_int (basic_block->edge_count);
260 return hstate.end ();
263 /* References independent hash function. */
265 hashval_t
266 sem_function::get_hash (void)
268 if (!m_hash_set)
270 inchash::hash hstate;
271 hstate.add_int (177454); /* Random number for function type. */
273 hstate.add_int (arg_count);
274 hstate.add_int (cfg_checksum);
275 hstate.add_int (gcode_hash);
277 for (unsigned i = 0; i < bb_sorted.length (); i++)
278 hstate.merge_hash (get_bb_hash (bb_sorted[i]));
280 for (unsigned i = 0; i < bb_sizes.length (); i++)
281 hstate.add_int (bb_sizes[i]);
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));
295 set_hash (hstate.end ());
298 return m_hash;
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.
306 If ADDRESS is true, do extra checking needed for IPA_REF_ADDR.
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. */
312 bool
313 sem_item::compare_referenced_symbol_properties (symtab_node *used_by,
314 symtab_node *n1,
315 symtab_node *n2,
316 bool address)
318 if (is_a <cgraph_node *> (n1))
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.
325 Also ignore inline flag when optimizing for size or when function
326 is known to not be inlinable.
328 TODO: the optimize_size checks can also be assumed to be true if
329 unit has no !optimize_size functions. */
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)))
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");
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");
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");
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");
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))
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");
370 if (address && DECL_ALIGN (n1->decl) != DECL_ALIGN (n2->decl))
371 return return_false_with_msg ("alignment mismatch");
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");
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))
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");
397 return true;
400 /* Hash properties that are compared by compare_referenced_symbol_properties. */
402 void
403 sem_item::hash_referenced_symbol_properties (symtab_node *ref,
404 inchash::hash &hstate,
405 bool address)
407 if (is_a <cgraph_node *> (ref))
409 if ((type != FUNC || address || !opt_for_fn (decl, optimize_size))
410 && !opt_for_fn (ref->decl, optimize_size)
411 && !DECL_UNINLINABLE (ref->decl))
413 hstate.add_flag (DECL_DISREGARD_INLINE_LIMITS (ref->decl));
414 hstate.add_flag (DECL_DECLARED_INLINE_P (ref->decl));
416 hstate.add_flag (DECL_IS_OPERATOR_NEW_P (ref->decl));
418 else if (is_a <varpool_node *> (ref))
420 hstate.add_flag (DECL_VIRTUAL_P (ref->decl));
421 if (address)
422 hstate.add_int (DECL_ALIGN (ref->decl));
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. */
431 bool
432 sem_item::compare_symbol_references (
433 hash_map <symtab_node *, sem_item *> &ignored_nodes,
434 symtab_node *n1, symtab_node *n2, bool address)
436 enum availability avail1, avail2;
438 if (n1 == n2)
439 return true;
441 /* Never match variable and function. */
442 if (is_a <varpool_node *> (n1) != is_a <varpool_node *> (n2))
443 return false;
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;
452 n1 = n1->ultimate_alias_target (&avail1);
453 n2 = n2->ultimate_alias_target (&avail2);
455 if (avail1 > AVAIL_INTERPOSABLE && ignored_nodes.get (n1)
456 && avail2 > AVAIL_INTERPOSABLE && ignored_nodes.get (n2))
457 return true;
459 return return_false_with_msg ("different references");
462 /* If cgraph edges E1 and E2 are indirect calls, verify that
463 ECF flags are the same. */
465 bool sem_function::compare_edge_flags (cgraph_edge *e1, cgraph_edge *e2)
467 if (e1->indirect_info && e2->indirect_info)
469 int e1_flags = e1->indirect_info->ecf_flags;
470 int e2_flags = e2->indirect_info->ecf_flags;
472 if (e1_flags != e2_flags)
473 return return_false_with_msg ("ICF flags are different");
475 else if (e1->indirect_info || e2->indirect_info)
476 return false;
478 return true;
481 /* Return true if parameter I may be used. */
483 bool
484 sem_function::param_used_p (unsigned int i)
486 if (ipa_node_params_sum == NULL)
487 return true;
489 class ipa_node_params *parms_info = IPA_NODE_REF (get_node ());
491 if (!parms_info || vec_safe_length (parms_info->descriptors) <= i)
492 return true;
494 return ipa_is_param_used (IPA_NODE_REF (get_node ()), i);
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. */
501 bool
502 sem_function::compatible_parm_types_p (tree parm1, tree parm2)
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");
508 if (POINTER_TYPE_P (parm1)
509 && (TYPE_RESTRICT (parm1) != TYPE_RESTRICT (parm2)))
510 return return_false_with_msg ("argument restrict flag mismatch");
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");
518 return true;
521 /* Fast equality function based on knowledge known in WPA. */
523 bool
524 sem_function::equals_wpa (sem_item *item,
525 hash_map <symtab_node *, sem_item *> &ignored_nodes)
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);
531 m_compared_func = static_cast<sem_function *> (item);
533 if (cnode->thunk.thunk_p != cnode2->thunk.thunk_p)
534 return return_false_with_msg ("thunk_p mismatch");
536 if (cnode->thunk.thunk_p)
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");
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");
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");
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");
563 if (DECL_CXX_CONSTRUCTOR_P (decl) != DECL_CXX_CONSTRUCTOR_P (item->decl))
564 return return_false_with_msg ("DECL_CXX_CONSTRUCTOR mismatch");
566 if (DECL_CXX_DESTRUCTOR_P (decl) != DECL_CXX_DESTRUCTOR_P (item->decl))
567 return return_false_with_msg ("DECL_CXX_DESTRUCTOR mismatch");
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");
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)
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");
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);
594 if (tar1 != tar2 && !cl_target_option_eq (tar1, tar2))
596 if (dump_file && (dump_flags & TDF_DETAILS))
598 fprintf (dump_file, "target flags difference");
599 cl_target_option_print_diff (dump_file, 2, tar1, tar2);
602 return return_false_with_msg ("Target flags are different");
605 cl_optimization *opt1 = opts_for_fn (decl);
606 cl_optimization *opt2 = opts_for_fn (item->decl);
608 if (opt1 != opt2 && !cl_optimization_option_eq (opt1, opt2))
610 if (dump_file && (dump_flags & TDF_DETAILS))
612 fprintf (dump_file, "optimization flags difference");
613 cl_optimization_print_diff (dump_file, 2, opt1, opt2);
616 return return_false_with_msg ("optimization flags are different");
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");
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++)
631 tree parm1 = TREE_VALUE (list1);
632 tree parm2 = TREE_VALUE (list2);
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");
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");
643 if (!param_used_p (i))
644 continue;
646 /* Perform additional checks for used parameters. */
647 if (!compatible_parm_types_p (parm1, parm2))
648 return false;
651 if (list1 || list2)
652 return return_false_with_msg ("Mismatched number of parameters");
654 if (node->num_references () != item->node->num_references ())
655 return return_false_with_msg ("different number of references");
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");
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 ())
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");
682 ipa_ref *ref = NULL, *ref2 = NULL;
683 for (unsigned i = 0; node->iterate_reference (i, ref); i++)
685 item->node->iterate_reference (i, ref2);
687 if (ref->use != ref2->use)
688 return return_false_with_msg ("reference use mismatch");
690 if (!compare_symbol_references (ignored_nodes, ref->referred,
691 ref2->referred,
692 ref->address_matters_p ()))
693 return false;
696 cgraph_edge *e1 = dyn_cast <cgraph_node *> (node)->callees;
697 cgraph_edge *e2 = dyn_cast <cgraph_node *> (item->node)->callees;
699 while (e1 && e2)
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;
707 e1 = e1->next_callee;
708 e2 = e2->next_callee;
711 if (e1 || e2)
712 return return_false_with_msg ("different number of calls");
714 e1 = dyn_cast <cgraph_node *> (node)->indirect_calls;
715 e2 = dyn_cast <cgraph_node *> (item->node)->indirect_calls;
717 while (e1 && e2)
719 if (!compare_edge_flags (e1, e2))
720 return false;
722 e1 = e1->next_callee;
723 e2 = e2->next_callee;
726 if (e1 || e2)
727 return return_false_with_msg ("different number of indirect calls");
729 return true;
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.
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. */
740 void
741 sem_item::update_hash_by_addr_refs (hash_map <symtab_node *,
742 sem_item *> &m_symtab_node_map)
744 ipa_ref* ref;
745 inchash::hash hstate (get_hash ());
747 for (unsigned i = 0; node->iterate_reference (i, ref); i++)
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);
756 if (is_a <cgraph_node *> (node))
758 for (cgraph_edge *e = dyn_cast <cgraph_node *> (node)->callers; e;
759 e = e->next_caller)
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);
768 set_hash (hstate.end ());
771 /* Update hash by computed local hash values taken from different
772 semantic items.
773 TODO: stronger SCC based hashing would be desirable here. */
775 void
776 sem_item::update_hash_by_local_refs (hash_map <symtab_node *,
777 sem_item *> &m_symtab_node_map)
779 ipa_ref* ref;
780 inchash::hash state (get_hash ());
782 for (unsigned j = 0; node->iterate_reference (j, ref); j++)
784 sem_item **result = m_symtab_node_map.get (ref->referring);
785 if (result)
786 state.merge_hash ((*result)->get_hash ());
789 if (type == FUNC)
791 for (cgraph_edge *e = dyn_cast <cgraph_node *> (node)->callees; e;
792 e = e->next_callee)
794 sem_item **result = m_symtab_node_map.get (e->caller);
795 if (result)
796 state.merge_hash ((*result)->get_hash ());
800 global_hash = state.end ();
803 /* Returns true if the item equals to ITEM given as argument. */
805 bool
806 sem_function::equals (sem_item *item,
807 hash_map <symtab_node *, sem_item *> &)
809 gcc_assert (item->type == FUNC);
810 bool eq = equals_private (item);
812 if (m_checker != NULL)
814 delete m_checker;
815 m_checker = NULL;
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");
825 return eq;
828 /* Processes function equality comparison. */
830 bool
831 sem_function::equals_private (sem_item *item)
833 if (item->type != FUNC)
834 return false;
836 basic_block bb1, bb2;
837 edge e1, e2;
838 edge_iterator ei1, ei2;
839 bool result = true;
840 tree arg1, arg2;
842 m_compared_func = static_cast<sem_function *> (item);
844 gcc_assert (decl != item->decl);
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 ();
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++)
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 ();
870 if (arg1 || arg2)
871 return return_false_with_msg ("Mismatched number of arguments");
873 if (!dyn_cast <cgraph_node *> (node)->has_gimple_body_p ())
874 return true;
876 /* Fill-up label dictionary. */
877 for (unsigned i = 0; i < bb_sorted.length (); ++i)
879 m_checker->parse_labels (bb_sorted[i]);
880 m_checker->parse_labels (m_compared_func->bb_sorted[i]);
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 ();
888 auto_vec <int> bb_dict;
890 /* Basic block edges check. */
891 for (unsigned i = 0; i < bb_sorted.length (); ++i)
893 bb1 = bb_sorted[i]->bb;
894 bb2 = m_compared_func->bb_sorted[i]->bb;
896 ei2 = ei_start (bb2->preds);
898 for (ei1 = ei_start (bb1->preds); ei_cond (ei1, &e1); ei_next (&ei1))
900 ei_cond (ei2, &e2);
902 if (e1->flags != e2->flags)
903 return return_false_with_msg ("flags comparison returns false");
905 if (!bb_dict_test (&bb_dict, e1->src->index, e2->src->index))
906 return return_false_with_msg ("edge comparison returns false");
908 if (!bb_dict_test (&bb_dict, e1->dest->index, e2->dest->index))
909 return return_false_with_msg ("BB comparison returns false");
911 if (!m_checker->compare_edge (e1, e2))
912 return return_false_with_msg ("edge comparison returns false");
914 ei_next (&ei2);
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");
923 return result;
926 /* Set LOCAL_P of NODE to true if DATA is non-NULL.
927 Helper for call_for_symbol_thunks_and_aliases. */
929 static bool
930 set_local (cgraph_node *node, void *data)
932 node->local = data != NULL;
933 return false;
936 /* TREE_ADDRESSABLE of NODE to true.
937 Helper for call_for_symbol_thunks_and_aliases. */
939 static bool
940 set_addressable (varpool_node *node, void *)
942 TREE_ADDRESSABLE (node->decl) = 1;
943 return false;
946 /* Clear DECL_RTL of NODE.
947 Helper for call_for_symbol_thunks_and_aliases. */
949 static bool
950 clear_decl_rtl (symtab_node *node, void *)
952 SET_DECL_RTL (node->decl, NULL);
953 return false;
956 /* Redirect all callers of N and its aliases to TO. Remove aliases if
957 possible. Return number of redirections made. */
959 static int
960 redirect_all_callers (cgraph_node *n, cgraph_node *to)
962 int nredirected = 0;
963 ipa_ref *ref;
964 cgraph_edge *e = n->callers;
966 while (e)
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)
973 struct cgraph_edge *nexte = e->next_caller;
974 e->redirect_callee (to);
975 e = nexte;
976 nredirected++;
978 else
979 e = e->next_callee;
981 for (unsigned i = 0; n->iterate_direct_aliases (i, ref);)
983 bool removed = false;
984 cgraph_node *n_alias = dyn_cast <cgraph_node *> (ref->referring);
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))
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 ();
999 if (!removed)
1000 i++;
1002 return nredirected;
1005 /* Merges instance with an ALIAS_ITEM, where alias, thunk or redirection can
1006 be applied. */
1008 bool
1009 sem_function::merge (sem_item *alias_item)
1011 gcc_assert (alias_item->type == FUNC);
1013 sem_function *alias_func = static_cast<sem_function *> (alias_item);
1015 cgraph_node *original = get_node ();
1016 cgraph_node *local_original = NULL;
1017 cgraph_node *alias = alias_func->get_node ();
1019 bool create_wrapper = false;
1020 bool create_alias = false;
1021 bool redirect_callers = false;
1022 bool remove = false;
1024 bool original_discardable = false;
1025 bool original_discarded = false;
1027 bool original_address_matters = original->address_matters_p ();
1028 bool alias_address_matters = alias->address_matters_p ();
1030 AUTO_DUMP_SCOPE ("merge",
1031 dump_user_location_t::from_function_decl (decl));
1033 if (DECL_EXTERNAL (alias->decl))
1035 if (dump_enabled_p ())
1036 dump_printf (MSG_MISSED_OPTIMIZATION,
1037 "Not unifying; alias is external.\n");
1038 return false;
1041 if (DECL_NO_INLINE_WARNING_P (original->decl)
1042 != DECL_NO_INLINE_WARNING_P (alias->decl))
1044 if (dump_enabled_p ())
1045 dump_printf (MSG_MISSED_OPTIMIZATION,
1046 "Not unifying; DECL_NO_INLINE_WARNING mismatch.\n");
1047 return false;
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))
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;
1063 if (!original->in_same_comdat_group_p (alias)
1064 || original->comdat_local_p ())
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;
1073 /* See if original is in a section that can be discarded if the main
1074 symbol is not used. */
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;
1085 /* Creating a symtab alias is the optimal way to merge.
1086 It however cannot be used in the following cases:
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.
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))
1106 /* First see if we can produce wrapper. */
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))
1114 if (dump_enabled_p ())
1115 dump_printf (MSG_MISSED_OPTIMIZATION,
1116 "Wrapper cannot be created because referenced symbol "
1117 "properties mismatch\n");
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)))
1128 if (dump_enabled_p ())
1129 dump_printf (MSG_MISSED_OPTIMIZATION,
1130 "Wrapper cannot be created because of COMDAT\n");
1132 else if (DECL_STATIC_CHAIN (alias->decl)
1133 || DECL_STATIC_CHAIN (original->decl))
1135 if (dump_enabled_p ())
1136 dump_printf (MSG_MISSED_OPTIMIZATION,
1137 "Cannot create wrapper of nested function.\n");
1139 /* TODO: We can also deal with variadic functions never calling
1140 VA_START. */
1141 else if (stdarg_p (TREE_TYPE (alias->decl)))
1143 if (dump_enabled_p ())
1144 dump_printf (MSG_MISSED_OPTIMIZATION,
1145 "cannot create wrapper of stdarg function.\n");
1147 else if (ipa_fn_summaries
1148 && ipa_size_summaries->get (alias) != NULL
1149 && ipa_size_summaries->get (alias)->self_size <= 2)
1151 if (dump_enabled_p ())
1152 dump_printf (MSG_MISSED_OPTIMIZATION, "Wrapper creation is not "
1153 "profitable (function is too small).\n");
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)))
1160 if (dump_enabled_p ())
1161 dump_printf (MSG_MISSED_OPTIMIZATION,
1162 "Wrappers are not created for noinline.\n");
1164 else
1165 create_wrapper = true;
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;
1178 if (!redirect_callers && !create_wrapper)
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;
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.
1191 Local aliases cannot be created inside comdat groups because that
1192 prevents inlining. */
1193 if (!original_discardable && !original->get_comdat_group ())
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;
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;
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)
1212 if (dump_enabled_p ())
1213 dump_printf (MSG_MISSED_OPTIMIZATION,
1214 "Not unifying; cannot produce local alias.\n");
1215 return false;
1218 if (!redirect_callers && !create_wrapper)
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;
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 ())
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;
1238 else
1239 create_alias = true;
1241 if (redirect_callers)
1243 int nredirected = redirect_all_callers (alias, local_original);
1245 if (nredirected)
1247 alias->icf_merged = true;
1248 local_original->icf_merged = true;
1250 if (dump_enabled_p ())
1251 dump_printf (MSG_NOTE,
1252 "%i local calls have been "
1253 "redirected.\n", nredirected);
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 ())
1261 create_wrapper = false;
1262 remove = true;
1264 gcc_assert (!create_alias);
1266 else if (create_alias)
1268 alias->icf_merged = true;
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);
1279 /* Create the alias. */
1280 cgraph_node::create_alias (alias_func->decl, decl);
1281 alias->resolve_alias (original);
1283 original->call_for_symbol_thunks_and_aliases
1284 (set_local, (void *)(size_t) original->local_p (), true);
1286 if (dump_enabled_p ())
1287 dump_printf (MSG_OPTIMIZED_LOCATIONS,
1288 "Unified; Function alias has been created.\n");
1290 if (create_wrapper)
1292 gcc_assert (!create_alias);
1293 alias->icf_merged = true;
1294 symtab->call_cgraph_removal_hooks (alias);
1295 local_original->icf_merged = true;
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);
1302 if (dump_enabled_p ())
1303 dump_printf (MSG_OPTIMIZED_LOCATIONS,
1304 "Unified; Wrapper has been created.\n");
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;
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)
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;
1324 if (remove)
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");
1336 return true;
1339 /* Semantic item initialization function. */
1341 void
1342 sem_function::init (ipa_icf_gimple::func_checker *checker)
1344 m_checker = checker;
1345 if (in_lto_p)
1346 get_node ()->get_untransformed_body ();
1348 tree fndecl = node->decl;
1349 function *func = DECL_STRUCT_FUNCTION (fndecl);
1351 gcc_assert (func);
1352 gcc_assert (SSANAMES (func));
1354 ssa_names_size = SSANAMES (func)->length ();
1355 node = node;
1357 decl = fndecl;
1358 region_tree = func->eh->region_tree;
1360 /* iterating all function arguments. */
1361 arg_count = count_formal_params (fndecl);
1363 edge_count = n_edges_for_fn (func);
1364 cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
1365 if (!cnode->thunk.thunk_p)
1367 cfg_checksum = coverage_compute_cfg_checksum (func);
1369 inchash::hash hstate;
1371 basic_block bb;
1372 FOR_EACH_BB_FN (bb, func)
1374 unsigned nondbg_stmt_count = 0;
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);
1382 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
1383 gsi_next (&gsi))
1385 gimple *stmt = gsi_stmt (gsi);
1387 if (gimple_code (stmt) != GIMPLE_DEBUG
1388 && gimple_code (stmt) != GIMPLE_PREDICT)
1390 hash_stmt (stmt, hstate);
1391 nondbg_stmt_count++;
1395 hstate.commit_flag ();
1396 gcode_hash = hstate.end ();
1397 bb_sizes.safe_push (nondbg_stmt_count);
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));
1404 bb_sorted.safe_push (semantic_bb);
1407 else
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 ();
1418 m_checker = NULL;
1421 /* Improve accumulated hash for HSTATE based on a gimple statement STMT. */
1423 void
1424 sem_function::hash_stmt (gimple *stmt, inchash::hash &hstate)
1426 enum gimple_code code = gimple_code (stmt);
1428 hstate.add_int (code);
1430 switch (code)
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)))
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);
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;
1467 /* Return true if polymorphic comparison must be processed. */
1469 bool
1470 sem_function::compare_polymorphic_p (void)
1472 struct cgraph_edge *e;
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;
1487 /* For a given call graph NODE, the function constructs new
1488 semantic function item. */
1490 sem_function *
1491 sem_function::parse (cgraph_node *node, bitmap_obstack *stack,
1492 func_checker *checker)
1494 tree fndecl = node->decl;
1495 function *func = DECL_STRUCT_FUNCTION (fndecl);
1497 if (!func || (!node->has_gimple_body_p () && !node->thunk.thunk_p))
1498 return NULL;
1500 if (lookup_attribute_by_prefix ("omp ", DECL_ATTRIBUTES (node->decl)) != NULL)
1501 return NULL;
1503 if (lookup_attribute_by_prefix ("oacc ",
1504 DECL_ATTRIBUTES (node->decl)) != NULL)
1505 return NULL;
1507 /* PR ipa/70306. */
1508 if (DECL_STATIC_CONSTRUCTOR (node->decl)
1509 || DECL_STATIC_DESTRUCTOR (node->decl))
1510 return NULL;
1512 sem_function *f = new sem_function (node, stack);
1513 f->init (checker);
1515 return f;
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 . */
1521 bool
1522 sem_function::compare_phi_node (basic_block bb1, basic_block bb2)
1524 gphi_iterator si1, si2;
1525 gphi *phi1, *phi2;
1526 unsigned size1, size2, i;
1527 tree t1, t2;
1528 edge e1, e2;
1530 gcc_assert (bb1 != NULL);
1531 gcc_assert (bb2 != NULL);
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))
1537 if (gsi_end_p (si1) && gsi_end_p (si2))
1538 break;
1540 if (gsi_end_p (si1) || gsi_end_p (si2))
1541 return return_false();
1543 phi1 = si1.phi ();
1544 phi2 = si2.phi ();
1546 tree phi_result1 = gimple_phi_result (phi1);
1547 tree phi_result2 = gimple_phi_result (phi2);
1549 if (!m_checker->compare_operand (phi_result1, phi_result2))
1550 return return_false_with_msg ("PHI results are different");
1552 size1 = gimple_phi_num_args (phi1);
1553 size2 = gimple_phi_num_args (phi2);
1555 if (size1 != size2)
1556 return return_false ();
1558 for (i = 0; i < size1; ++i)
1560 t1 = gimple_phi_arg (phi1, i)->def;
1561 t2 = gimple_phi_arg (phi2, i)->def;
1563 if (!m_checker->compare_operand (t1, t2))
1564 return return_false ();
1566 e1 = gimple_phi_arg_edge (phi1, i);
1567 e2 = gimple_phi_arg_edge (phi2, i);
1569 if (!m_checker->compare_edge (e1, e2))
1570 return return_false ();
1573 gsi_next_nonvirtual_phi (&si2);
1576 return true;
1579 /* Basic blocks dictionary BB_DICT returns true if SOURCE index BB
1580 corresponds to TARGET. */
1582 bool
1583 sem_function::bb_dict_test (vec<int> *bb_dict, int source, int target)
1585 source++;
1586 target++;
1588 if (bb_dict->length () <= (unsigned)source)
1589 bb_dict->safe_grow_cleared (source + 1);
1591 if ((*bb_dict)[source] == 0)
1593 (*bb_dict)[source] = target;
1594 return true;
1596 else
1597 return (*bb_dict)[source] == target;
1600 sem_variable::sem_variable (bitmap_obstack *stack): sem_item (VAR, stack)
1604 sem_variable::sem_variable (varpool_node *node, bitmap_obstack *stack)
1605 : sem_item (VAR, node, stack)
1607 gcc_checking_assert (node);
1608 gcc_checking_assert (get_node ());
1611 /* Fast equality function based on knowledge known in WPA. */
1613 bool
1614 sem_variable::equals_wpa (sem_item *item,
1615 hash_map <symtab_node *, sem_item *> &ignored_nodes)
1617 gcc_assert (item->type == VAR);
1619 if (node->num_references () != item->node->num_references ())
1620 return return_false_with_msg ("different number of references");
1622 if (DECL_TLS_MODEL (decl) || DECL_TLS_MODEL (item->decl))
1623 return return_false_with_msg ("TLS model");
1625 /* DECL_ALIGN is safe to merge, because we will always chose the largest
1626 alignment out of all aliases. */
1628 if (DECL_VIRTUAL_P (decl) != DECL_VIRTUAL_P (item->decl))
1629 return return_false_with_msg ("Virtual flag mismatch");
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");
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");
1644 if (DECL_IN_TEXT_SECTION (decl) != DECL_IN_TEXT_SECTION (item->decl))
1645 return return_false_with_msg ("text section");
1647 ipa_ref *ref = NULL, *ref2 = NULL;
1648 for (unsigned i = 0; node->iterate_reference (i, ref); i++)
1650 item->node->iterate_reference (i, ref2);
1652 if (ref->use != ref2->use)
1653 return return_false_with_msg ("reference use mismatch");
1655 if (!compare_symbol_references (ignored_nodes,
1656 ref->referred, ref2->referred,
1657 ref->address_matters_p ()))
1658 return false;
1661 return true;
1664 /* Returns true if the item equals to ITEM given as argument. */
1666 bool
1667 sem_variable::equals (sem_item *item,
1668 hash_map <symtab_node *, sem_item *> &)
1670 gcc_assert (item->type == VAR);
1671 bool ret;
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 ();
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");
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");
1691 return ret;
1694 /* Compares trees T1 and T2 for semantic equality. */
1696 bool
1697 sem_variable::equals (tree t1, tree t2)
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);
1706 if (tc1 != tc2)
1707 return return_false_with_msg ("TREE_CODE mismatch");
1709 switch (tc1)
1711 case CONSTRUCTOR:
1713 vec<constructor_elt, va_gc> *v1, *v2;
1714 unsigned HOST_WIDE_INT idx;
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");
1720 if (typecode == ARRAY_TYPE)
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");
1729 else if (!func_checker::compatible_types_p (TREE_TYPE (t1),
1730 TREE_TYPE (t2)))
1731 return return_false_with_msg ("constructor type incompatible");
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");
1738 for (idx = 0; idx < vec_safe_length (v1); ++idx)
1740 constructor_elt *c1 = &(*v1)[idx];
1741 constructor_elt *c2 = &(*v2)[idx];
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;
1750 return true;
1752 case MEM_REF:
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);
1759 if (!func_checker::compatible_types_p (TREE_TYPE (x1), TREE_TYPE (x2)))
1760 return return_false ();
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)));
1767 case ADDR_EXPR:
1768 case FDESC_EXPR:
1770 tree op1 = TREE_OPERAND (t1, 0);
1771 tree op2 = TREE_OPERAND (t2, 0);
1772 return sem_variable::equals (op1, op2);
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");
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:
1821 if (maybe_ne (VECTOR_CST_NELTS (t1), VECTOR_CST_NELTS (t2)))
1822 return return_false_with_msg ("VECTOR_CST nelts mismatch");
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;
1831 return true;
1833 case ARRAY_REF:
1834 case ARRAY_RANGE_REF:
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);
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;
1852 case COMPONENT_REF:
1853 case POINTER_PLUS_EXPR:
1854 case PLUS_EXPR:
1855 case MINUS_EXPR:
1856 case RANGE_EXPR:
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);
1863 return sem_variable::equals (x1, x2) && sem_variable::equals (y1, y2);
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");
1878 /* Parser function that visits a varpool NODE. */
1880 sem_variable *
1881 sem_variable::parse (varpool_node *node, bitmap_obstack *stack,
1882 func_checker *checker)
1884 if (TREE_THIS_VOLATILE (node->decl) || DECL_HARD_REGISTER (node->decl)
1885 || node->alias)
1886 return NULL;
1888 sem_variable *v = new sem_variable (node, stack);
1889 v->init (checker);
1891 return v;
1894 /* Semantic variable initialization function. */
1896 void
1897 sem_variable::init (ipa_icf_gimple::func_checker *checker)
1899 decl = get_node ()->decl;
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)
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 ());
1914 /* References independent hash function. */
1916 hashval_t
1917 sem_variable::get_hash (void)
1919 gcc_checking_assert (m_hash_set);
1920 return m_hash;
1923 /* Merges instance with an ALIAS_ITEM, where alias, thunk or redirection can
1924 be applied. */
1926 bool
1927 sem_variable::merge (sem_item *alias_item)
1929 gcc_assert (alias_item->type == VAR);
1931 AUTO_DUMP_SCOPE ("merge",
1932 dump_user_location_t::from_function_decl (decl));
1933 if (!sem_item::target_supports_symbol_aliases_p ())
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;
1941 if (DECL_EXTERNAL (alias_item->decl))
1943 if (dump_enabled_p ())
1944 dump_printf (MSG_MISSED_OPTIMIZATION,
1945 "Not unifying; alias is external.\n");
1946 return false;
1949 sem_variable *alias_var = static_cast<sem_variable *> (alias_item);
1951 varpool_node *original = get_node ();
1952 varpool_node *alias = alias_var->get_node ();
1953 bool original_discardable = false;
1955 bool alias_address_matters = alias->address_matters_p ();
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;
1967 gcc_assert (!TREE_ASM_WRITTEN (alias->decl));
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))
1977 if (dump_enabled_p ())
1978 dump_printf (MSG_MISSED_OPTIMIZATION,
1979 "Not unifying; constant pool variables.\n");
1980 return false;
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))
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;
1996 /* We cannot merge if address comparison matters. */
1997 if (alias_address_matters && flag_merge_constants < 2)
1999 if (dump_enabled_p ())
2000 dump_printf (MSG_MISSED_OPTIMIZATION,
2001 "Not unifying; address of original may be compared.\n");
2002 return false;
2005 if (DECL_ALIGN (original->decl) < DECL_ALIGN (alias->decl))
2007 if (dump_enabled_p ())
2008 dump_printf (MSG_MISSED_OPTIMIZATION,
2009 "Not unifying; "
2010 "original and alias have incompatible alignments\n");
2012 return false;
2015 if (DECL_COMDAT_GROUP (original->decl) != DECL_COMDAT_GROUP (alias->decl))
2017 if (dump_enabled_p ())
2018 dump_printf (MSG_MISSED_OPTIMIZATION,
2019 "Not unifying; alias cannot be created; "
2020 "across comdat group boundary\n");
2022 return false;
2025 if (original_discardable)
2027 if (dump_enabled_p ())
2028 dump_printf (MSG_MISSED_OPTIMIZATION,
2029 "Not unifying; alias cannot be created; "
2030 "target is discardable\n");
2032 return false;
2034 else
2036 gcc_assert (!original->alias);
2037 gcc_assert (!alias->alias);
2039 alias->analyzed = false;
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);
2048 varpool_node::create_alias (alias_var->decl, decl);
2049 alias->resolve_alias (original);
2051 if (dump_enabled_p ())
2052 dump_printf (MSG_OPTIMIZED_LOCATIONS,
2053 "Unified; Variable alias has been created.\n");
2055 return true;
2059 /* Dump symbol to FILE. */
2061 void
2062 sem_variable::dump_to_file (FILE *file)
2064 gcc_assert (file);
2066 print_node (file, "", decl, 0);
2067 fprintf (file, "\n\n");
2070 unsigned int sem_item_optimizer::class_id = 0;
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 ()
2076 m_items.create (0);
2077 bitmap_obstack_initialize (&m_bmstack);
2080 sem_item_optimizer::~sem_item_optimizer ()
2082 for (unsigned int i = 0; i < m_items.length (); i++)
2083 delete m_items[i];
2086 for (hash_table<congruence_class_hash>::iterator it = m_classes.begin ();
2087 it != m_classes.end (); ++it)
2089 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
2090 delete (*it)->classes[i];
2092 (*it)->classes.release ();
2093 free (*it);
2096 m_items.release ();
2098 bitmap_obstack_release (&m_bmstack);
2099 m_merged_variables.release ();
2102 /* Write IPA ICF summary for symbols. */
2104 void
2105 sem_item_optimizer::write_summary (void)
2107 unsigned int count = 0;
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;
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))
2118 symtab_node *node = lsei_node (lsei);
2120 if (m_symtab_node_map.get (node))
2121 count++;
2124 streamer_write_uhwi (ob, count);
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))
2131 symtab_node *node = lsei_node (lsei);
2133 sem_item **item = m_symtab_node_map.get (node);
2135 if (item && *item)
2137 int node_ref = lto_symtab_encoder_encode (encoder, node);
2138 streamer_write_uhwi_stream (ob->main_stream, node_ref);
2140 streamer_write_uhwi (ob, (*item)->get_hash ());
2144 streamer_write_char_stream (ob->main_stream, 0);
2145 produce_asm (ob, NULL);
2146 destroy_output_block (ob);
2149 /* Reads a section from LTO stream file FILE_DATA. Input block for DATA
2150 contains LEN bytes. */
2152 void
2153 sem_item_optimizer::read_section (lto_file_decl_data *file_data,
2154 const char *data, size_t len)
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;
2165 lto_input_block ib_main ((const char *) data + main_offset, 0,
2166 header->main_size, file_data->mode_table);
2168 data_in
2169 = lto_data_in_create (file_data, (const char *) data + string_offset,
2170 header->string_size, vNULL);
2172 count = streamer_read_uhwi (&ib_main);
2174 for (i = 0; i < count; i++)
2176 unsigned int index;
2177 symtab_node *node;
2178 lto_symtab_encoder_t encoder;
2180 index = streamer_read_uhwi (&ib_main);
2181 encoder = file_data->symtab_node_encoder;
2182 node = lto_symtab_encoder_deref (encoder, index);
2184 hashval_t hash = streamer_read_uhwi (&ib_main);
2185 gcc_assert (node->definition);
2187 if (is_a<cgraph_node *> (node))
2189 cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
2191 sem_function *fn = new sem_function (cnode, &m_bmstack);
2192 fn->set_hash (hash);
2193 m_items.safe_push (fn);
2195 else
2197 varpool_node *vnode = dyn_cast <varpool_node *> (node);
2199 sem_variable *var = new sem_variable (vnode, &m_bmstack);
2200 var->set_hash (hash);
2201 m_items.safe_push (var);
2205 lto_free_section_data (file_data, LTO_section_ipa_icf, NULL, data,
2206 len);
2207 lto_data_in_delete (data_in);
2210 /* Read IPA ICF summary for symbols. */
2212 void
2213 sem_item_optimizer::read_summary (void)
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;
2219 while ((file_data = file_data_vec[j++]))
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);
2229 /* Register callgraph and varpool hooks. */
2231 void
2232 sem_item_optimizer::register_hooks (void)
2234 if (!m_cgraph_node_hooks)
2235 m_cgraph_node_hooks = symtab->add_cgraph_removal_hook
2236 (&sem_item_optimizer::cgraph_removal_hook, this);
2238 if (!m_varpool_node_hooks)
2239 m_varpool_node_hooks = symtab->add_varpool_removal_hook
2240 (&sem_item_optimizer::varpool_removal_hook, this);
2243 /* Unregister callgraph and varpool hooks. */
2245 void
2246 sem_item_optimizer::unregister_hooks (void)
2248 if (m_cgraph_node_hooks)
2249 symtab->remove_cgraph_removal_hook (m_cgraph_node_hooks);
2251 if (m_varpool_node_hooks)
2252 symtab->remove_varpool_removal_hook (m_varpool_node_hooks);
2255 /* Adds a CLS to hashtable associated by hash value. */
2257 void
2258 sem_item_optimizer::add_class (congruence_class *cls)
2260 gcc_assert (cls->members.length ());
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);
2268 /* Gets a congruence class group based on given HASH value and TYPE. */
2270 congruence_class_group *
2271 sem_item_optimizer::get_group_by_hash (hashval_t hash, sem_item_type type)
2273 congruence_class_group *item = XNEW (congruence_class_group);
2274 item->hash = hash;
2275 item->type = type;
2277 congruence_class_group **slot = m_classes.find_slot (item, INSERT);
2279 if (*slot)
2280 free (item);
2281 else
2283 item->classes.create (1);
2284 *slot = item;
2287 return *slot;
2290 /* Callgraph removal hook called for a NODE with a custom DATA. */
2292 void
2293 sem_item_optimizer::cgraph_removal_hook (cgraph_node *node, void *data)
2295 sem_item_optimizer *optimizer = (sem_item_optimizer *) data;
2296 optimizer->remove_symtab_node (node);
2299 /* Varpool removal hook called for a NODE with a custom DATA. */
2301 void
2302 sem_item_optimizer::varpool_removal_hook (varpool_node *node, void *data)
2304 sem_item_optimizer *optimizer = (sem_item_optimizer *) data;
2305 optimizer->remove_symtab_node (node);
2308 /* Remove symtab NODE triggered by symtab removal hooks. */
2310 void
2311 sem_item_optimizer::remove_symtab_node (symtab_node *node)
2313 gcc_assert (m_classes.is_empty ());
2315 m_removed_items_set.add (node);
2318 void
2319 sem_item_optimizer::remove_item (sem_item *item)
2321 if (m_symtab_node_map.get (item->node))
2322 m_symtab_node_map.remove (item->node);
2323 delete item;
2326 /* Removes all callgraph and varpool nodes that are marked by symtab
2327 as deleted. */
2329 void
2330 sem_item_optimizer::filter_removed_items (void)
2332 auto_vec <sem_item *> filtered;
2334 for (unsigned int i = 0; i < m_items.length(); i++)
2336 sem_item *item = m_items[i];
2338 if (m_removed_items_set.contains (item->node))
2340 remove_item (item);
2341 continue;
2344 if (item->type == FUNC)
2346 cgraph_node *cnode = static_cast <sem_function *>(item)->get_node ();
2348 if (in_lto_p && (cnode->alias || cnode->body_removed))
2349 remove_item (item);
2350 else
2351 filtered.safe_push (item);
2353 else /* VAR. */
2355 if (!flag_ipa_icf_variables)
2356 remove_item (item);
2357 else
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);
2369 /* Clean-up of released semantic items. */
2371 m_items.release ();
2372 for (unsigned int i = 0; i < filtered.length(); i++)
2373 m_items.safe_push (filtered[i]);
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. */
2380 bool
2381 sem_item_optimizer::execute (void)
2383 filter_removed_items ();
2384 unregister_hooks ();
2386 build_graph ();
2387 update_hash_by_addr_refs ();
2388 build_hash_based_classes ();
2390 if (dump_file)
2391 fprintf (dump_file, "Dump after hash based groups\n");
2392 dump_cong_classes ();
2394 subdivide_classes_by_equality (true);
2396 if (dump_file)
2397 fprintf (dump_file, "Dump after WPA based types groups\n");
2399 dump_cong_classes ();
2401 process_cong_reduction ();
2402 checking_verify_classes ();
2404 if (dump_file)
2405 fprintf (dump_file, "Dump after callgraph-based congruence reduction\n");
2407 dump_cong_classes ();
2409 unsigned int loaded_symbols = parse_nonsingleton_classes ();
2410 subdivide_classes_by_equality ();
2412 if (dump_file)
2413 fprintf (dump_file, "Dump after full equality comparison of groups\n");
2415 dump_cong_classes ();
2417 unsigned int prev_class_count = m_classes_count;
2419 process_cong_reduction ();
2420 dump_cong_classes ();
2421 checking_verify_classes ();
2422 bool merged_p = merge_classes (prev_class_count, loaded_symbols);
2424 if (dump_file && (dump_flags & TDF_DETAILS))
2425 symtab->dump (dump_file);
2427 return merged_p;
2430 /* Function responsible for visiting all potential functions and
2431 read-only variables that can be merged. */
2433 void
2434 sem_item_optimizer::parse_funcs_and_vars (void)
2436 cgraph_node *cnode;
2438 /* Create dummy func_checker for hashing purpose. */
2439 func_checker checker;
2441 if (flag_ipa_icf_functions)
2442 FOR_EACH_DEFINED_FUNCTION (cnode)
2444 sem_function *f = sem_function::parse (cnode, &m_bmstack, &checker);
2445 if (f)
2447 m_items.safe_push (f);
2448 m_symtab_node_map.put (cnode, f);
2452 varpool_node *vnode;
2454 if (flag_ipa_icf_variables)
2455 FOR_EACH_DEFINED_VARIABLE (vnode)
2457 sem_variable *v = sem_variable::parse (vnode, &m_bmstack, &checker);
2459 if (v)
2461 m_items.safe_push (v);
2462 m_symtab_node_map.put (vnode, v);
2467 /* Makes pairing between a congruence class CLS and semantic ITEM. */
2469 void
2470 sem_item_optimizer::add_item_to_class (congruence_class *cls, sem_item *item)
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;
2478 /* For each semantic item, append hash values of references. */
2480 void
2481 sem_item_optimizer::update_hash_by_addr_refs ()
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++)
2487 m_items[i]->update_hash_by_addr_refs (m_symtab_node_map);
2488 if (m_items[i]->type == FUNC)
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 ())))
2498 tree class_type
2499 = TYPE_METHOD_BASETYPE (TREE_TYPE (m_items[i]->decl));
2500 inchash::hash hstate (m_items[i]->get_hash ());
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))));
2508 m_items[i]->set_hash (hstate.end ());
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);
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);
2525 /* Congruence classes are built by hash value. */
2527 void
2528 sem_item_optimizer::build_hash_based_classes (void)
2530 for (unsigned i = 0; i < m_items.length (); i++)
2532 sem_item *item = m_items[i];
2534 congruence_class_group *group
2535 = get_group_by_hash (item->get_hash (), item->type);
2537 if (!group->classes.length ())
2539 m_classes_count++;
2540 group->classes.safe_push (new congruence_class (class_id++));
2543 add_item_to_class (group->classes[0], item);
2547 /* Build references according to call graph. */
2549 void
2550 sem_item_optimizer::build_graph (void)
2552 for (unsigned i = 0; i < m_items.length (); i++)
2554 sem_item *item = m_items[i];
2555 m_symtab_node_map.put (item->node, item);
2557 /* Initialize hash values if we are not in LTO mode. */
2558 if (!in_lto_p)
2559 item->get_hash ();
2562 for (unsigned i = 0; i < m_items.length (); i++)
2564 sem_item *item = m_items[i];
2566 if (item->type == FUNC)
2568 cgraph_node *cnode = dyn_cast <cgraph_node *> (item->node);
2570 cgraph_edge *e = cnode->callees;
2571 while (e)
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);
2578 e = e->next_callee;
2582 ipa_ref *ref = NULL;
2583 for (unsigned i = 0; item->node->iterate_reference (i, ref); i++)
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);
2593 /* Semantic items in classes having more than one element and initialized.
2594 In case of WPA, we load function body. */
2596 unsigned int
2597 sem_item_optimizer::parse_nonsingleton_classes (void)
2599 unsigned int counter = 0;
2601 /* Create dummy func_checker for hashing purpose. */
2602 func_checker checker;
2604 for (unsigned i = 0; i < m_items.length (); i++)
2605 if (m_items[i]->cls->members.length () > 1)
2607 m_items[i]->init (&checker);
2608 ++counter;
2611 if (dump_file)
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);
2617 return counter;
2620 /* Equality function for semantic items is used to subdivide existing
2621 classes. If IN_WPA, fast equality function is invoked. */
2623 void
2624 sem_item_optimizer::subdivide_classes_by_equality (bool in_wpa)
2626 for (hash_table <congruence_class_hash>::iterator it = m_classes.begin ();
2627 it != m_classes.end (); ++it)
2629 unsigned int class_count = (*it)->classes.length ();
2631 for (unsigned i = 0; i < class_count; i++)
2633 congruence_class *c = (*it)->classes[i];
2635 if (c->members.length() > 1)
2637 auto_vec <sem_item *> new_vector;
2639 sem_item *first = c->members[0];
2640 new_vector.safe_push (first);
2642 unsigned class_split_first = (*it)->classes.length ();
2644 for (unsigned j = 1; j < c->members.length (); j++)
2646 sem_item *item = c->members[j];
2648 bool equals
2649 = in_wpa ? first->equals_wpa (item, m_symtab_node_map)
2650 : first->equals (item, m_symtab_node_map);
2652 if (equals)
2653 new_vector.safe_push (item);
2654 else
2656 bool integrated = false;
2658 for (unsigned k = class_split_first;
2659 k < (*it)->classes.length (); k++)
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);
2666 if (equals)
2668 integrated = true;
2669 add_item_to_class ((*it)->classes[k], item);
2671 break;
2675 if (!integrated)
2677 congruence_class *c
2678 = new congruence_class (class_id++);
2679 m_classes_count++;
2680 add_item_to_class (c, item);
2682 (*it)->classes.safe_push (c);
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 ());
2692 for (unsigned int j = 0; j < new_vector.length (); j++)
2693 add_item_to_class (c, new_vector[j]);
2698 checking_verify_classes ();
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. */
2706 unsigned
2707 sem_item_optimizer::subdivide_classes_by_sensitive_refs ()
2709 typedef hash_map <symbol_compare_hash, vec <sem_item *> > subdivide_hash_map;
2711 unsigned newly_created_classes = 0;
2713 for (hash_table <congruence_class_hash>::iterator it = m_classes.begin ();
2714 it != m_classes.end (); ++it)
2716 unsigned int class_count = (*it)->classes.length ();
2717 auto_vec<congruence_class *> new_classes;
2719 for (unsigned i = 0; i < class_count; i++)
2721 congruence_class *c = (*it)->classes[i];
2723 if (c->members.length() > 1)
2725 subdivide_hash_map split_map;
2727 for (unsigned j = 0; j < c->members.length (); j++)
2729 sem_item *source_node = c->members[j];
2731 symbol_compare_collection *collection
2732 = new symbol_compare_collection (source_node->node);
2734 bool existed;
2735 vec <sem_item *> *slot
2736 = &split_map.get_or_insert (collection, &existed);
2737 gcc_checking_assert (slot);
2739 slot->safe_push (source_node);
2741 if (existed)
2742 delete collection;
2745 /* If the map contains more than one key, we have to split
2746 the map appropriately. */
2747 if (split_map.elements () != 1)
2749 bool first_class = true;
2751 for (subdivide_hash_map::iterator it2 = split_map.begin ();
2752 it2 != split_map.end (); ++it2)
2754 congruence_class *new_cls;
2755 new_cls = new congruence_class (class_id++);
2757 for (unsigned k = 0; k < (*it2).second.length (); k++)
2758 add_item_to_class (new_cls, (*it2).second[k]);
2760 worklist_push (new_cls);
2761 newly_created_classes++;
2763 if (first_class)
2765 (*it)->classes[i] = new_cls;
2766 first_class = false;
2768 else
2770 new_classes.safe_push (new_cls);
2771 m_classes_count++;
2776 /* Release memory. */
2777 for (subdivide_hash_map::iterator it2 = split_map.begin ();
2778 it2 != split_map.end (); ++it2)
2780 delete (*it2).first;
2781 (*it2).second.release ();
2786 for (unsigned i = 0; i < new_classes.length (); i++)
2787 (*it)->classes.safe_push (new_classes[i]);
2790 return newly_created_classes;
2793 /* Verify congruence classes, if checking is enabled. */
2795 void
2796 sem_item_optimizer::checking_verify_classes (void)
2798 if (flag_checking)
2799 verify_classes ();
2802 /* Verify congruence classes. */
2804 void
2805 sem_item_optimizer::verify_classes (void)
2807 for (hash_table<congruence_class_hash>::iterator it = m_classes.begin ();
2808 it != m_classes.end (); ++it)
2810 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
2812 congruence_class *cls = (*it)->classes[i];
2814 gcc_assert (cls);
2815 gcc_assert (cls->members.length () > 0);
2817 for (unsigned int j = 0; j < cls->members.length (); j++)
2819 sem_item *item = cls->members[j];
2821 gcc_assert (item);
2822 gcc_assert (item->cls == cls);
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. */
2832 bool
2833 sem_item_optimizer::release_split_map (congruence_class * const &,
2834 bitmap const &b, traverse_split_pair *)
2836 bitmap bmp = b;
2838 BITMAP_FREE (bmp);
2840 return true;
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. */
2847 bool
2848 sem_item_optimizer::traverse_congruence_split (congruence_class * const &cls,
2849 bitmap const &b,
2850 traverse_split_pair *pair)
2852 sem_item_optimizer *optimizer = pair->optimizer;
2853 const congruence_class *splitter_cls = pair->cls;
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);
2859 if (popcount > 0 && popcount < cls->members.length ())
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++));
2865 for (unsigned int i = 0; i < cls->members.length (); i++)
2867 int target = bitmap_bit_p (b, i);
2868 congruence_class *tc = newclasses[target];
2870 add_item_to_class (tc, cls->members[i]);
2873 if (flag_checking)
2875 for (unsigned int i = 0; i < 2; i++)
2876 gcc_assert (newclasses[i]->members.length ());
2879 if (splitter_cls == cls)
2880 optimizer->splitter_class_removed = true;
2882 /* Remove old class from worklist if presented. */
2883 bool in_worklist = cls->in_worklist;
2885 if (in_worklist)
2886 cls->in_worklist = false;
2888 congruence_class_group g;
2889 g.hash = cls->members[0]->get_hash ();
2890 g.type = cls->members[0]->type;
2892 congruence_class_group *slot = optimizer->m_classes.find (&g);
2894 for (unsigned int i = 0; i < slot->classes.length (); i++)
2895 if (slot->classes[i] == cls)
2897 slot->classes.ordered_remove (i);
2898 break;
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]);
2905 /* Two classes replace one, so that increment just by one. */
2906 optimizer->m_classes_count++;
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. */
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]);
2922 if (dump_file && (dump_flags & TDF_DETAILS))
2924 fprintf (dump_file, " congruence class splitted:\n");
2925 cls->dump (dump_file, 4);
2927 fprintf (dump_file, " newly created groups:\n");
2928 for (unsigned int i = 0; i < 2; i++)
2929 newclasses[i]->dump (dump_file, 4);
2932 /* Release class if not presented in work list. */
2933 if (!in_worklist)
2934 delete cls;
2936 return true;
2939 return false;
2942 /* Compare function for sorting pairs in do_congruence_step_f. */
2945 sem_item_optimizer::sort_congruence_split (const void *a_, const void *b_)
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;
2958 /* Tests if a class CLS used as INDEXth splits any congruence classes.
2959 Bitmap stack BMSTACK is used for bitmap allocation. */
2961 bool
2962 sem_item_optimizer::do_congruence_step_for_index (congruence_class *cls,
2963 unsigned int index)
2965 hash_map <congruence_class *, bitmap> split_map;
2967 for (unsigned int i = 0; i < cls->members.length (); i++)
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;
2975 for (unsigned int j = 0; j < callers->length (); j++)
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;
2983 if(!slot)
2985 b = BITMAP_ALLOC (&m_bmstack);
2986 split_map.put (caller->cls, b);
2988 else
2989 b = *slot;
2991 gcc_checking_assert (caller->cls);
2992 gcc_checking_assert (caller->index_in_class
2993 < caller->cls->members.length ());
2995 bitmap_set_bit (b, caller->index_in_class);
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);
3006 traverse_split_pair pair;
3007 pair.optimizer = this;
3008 pair.cls = cls;
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);
3016 /* Bitmap clean-up. */
3017 split_map.traverse <traverse_split_pair *,
3018 sem_item_optimizer::release_split_map> (NULL);
3020 return r;
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. */
3027 void
3028 sem_item_optimizer::do_congruence_step (congruence_class *cls)
3030 bitmap_iterator bi;
3031 unsigned int i;
3033 bitmap usage = BITMAP_ALLOC (&m_bmstack);
3035 for (unsigned int i = 0; i < cls->members.length (); i++)
3036 bitmap_ior_into (usage, cls->members[i]->usage_index_bitmap);
3038 EXECUTE_IF_SET_IN_BITMAP (usage, 0, i, bi)
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);
3046 if (splitter_class_removed)
3047 break;
3050 BITMAP_FREE (usage);
3053 /* Adds a newly created congruence class CLS to worklist. */
3055 void
3056 sem_item_optimizer::worklist_push (congruence_class *cls)
3058 /* Return if the class CLS is already presented in work list. */
3059 if (cls->in_worklist)
3060 return;
3062 cls->in_worklist = true;
3063 worklist.insert (cls->referenced_by_count, cls);
3066 /* Pops a class from worklist. */
3068 congruence_class *
3069 sem_item_optimizer::worklist_pop (void)
3071 congruence_class *cls;
3073 while (!worklist.empty ())
3075 cls = worklist.extract_min ();
3076 if (cls->in_worklist)
3078 cls->in_worklist = false;
3080 return cls;
3082 else
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;
3091 return NULL;
3094 /* Iterative congruence reduction function. */
3096 void
3097 sem_item_optimizer::process_cong_reduction (void)
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]);
3105 if (dump_file)
3106 fprintf (dump_file, "Worklist has been filled with: %lu\n",
3107 (unsigned long) worklist.nodes ());
3109 if (dump_file && (dump_flags & TDF_DETAILS))
3110 fprintf (dump_file, "Congruence class reduction\n");
3112 congruence_class *cls;
3114 /* Process complete congruence reduction. */
3115 while ((cls = worklist_pop ()) != NULL)
3116 do_congruence_step (cls);
3118 /* Subdivide newly created classes according to references. */
3119 unsigned new_classes = subdivide_classes_by_sensitive_refs ();
3121 if (dump_file)
3122 fprintf (dump_file, "Address reference subdivision created: %u "
3123 "new classes.\n", new_classes);
3126 /* Debug function prints all informations about congruence classes. */
3128 void
3129 sem_item_optimizer::dump_cong_classes (void)
3131 if (!dump_file)
3132 return;
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);
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++)
3143 unsigned int c = (*it)->classes[i]->members.length ();
3144 histogram[c]++;
3146 if (c > max_index)
3147 max_index = c;
3149 if (c == 1)
3150 ++single_element_classes;
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]);
3163 if (dump_flags & TDF_DETAILS)
3164 for (hash_table<congruence_class_hash>::iterator it = m_classes.begin ();
3165 it != m_classes.end (); ++it)
3167 fprintf (dump_file, " group: with %u classes:\n",
3168 (*it)->classes.length ());
3170 for (unsigned i = 0; i < (*it)->classes.length (); i++)
3172 (*it)->classes[i]->dump (dump_file, 4);
3174 if (i < (*it)->classes.length () - 1)
3175 fprintf (dump_file, " ");
3179 free (histogram);
3182 /* Sort pair of sem_items A and B by DECL_UID. */
3184 static int
3185 sort_sem_items_by_decl_uid (const void *a, const void *b)
3187 const sem_item *i1 = *(const sem_item * const *)a;
3188 const sem_item *i2 = *(const sem_item * const *)b;
3190 int uid1 = DECL_UID (i1->decl);
3191 int uid2 = DECL_UID (i2->decl);
3192 return uid1 - uid2;
3195 /* Sort pair of congruence_classes A and B by DECL_UID of the first member. */
3197 static int
3198 sort_congruence_classes_by_decl_uid (const void *a, const void *b)
3200 const congruence_class *c1 = *(const congruence_class * const *)a;
3201 const congruence_class *c2 = *(const congruence_class * const *)b;
3203 int uid1 = DECL_UID (c1->members[0]->decl);
3204 int uid2 = DECL_UID (c2->members[0]->decl);
3205 return uid1 - uid2;
3208 /* Sort pair of congruence_class_groups A and B by
3209 DECL_UID of the first member of a first group. */
3211 static int
3212 sort_congruence_class_groups_by_decl_uid (const void *a, const void *b)
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;
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. */
3227 bool
3228 sem_item_optimizer::merge_classes (unsigned int prev_class_count,
3229 unsigned int loaded_symbols)
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;
3235 unsigned int non_singular_classes_count = 0;
3236 unsigned int non_singular_classes_sum = 0;
3238 bool merged_p = false;
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. */
3244 for (hash_table<congruence_class_hash>::iterator it = m_classes.begin ();
3245 it != m_classes.end (); ++it)
3247 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
3249 congruence_class *c = (*it)->classes[i];
3250 c->members.qsort (sort_sem_items_by_decl_uid);
3253 (*it)->classes.qsort (sort_congruence_classes_by_decl_uid);
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++)
3260 congruence_class *c = (*it)->classes[i];
3261 if (c->members.length () > 1)
3263 non_singular_classes_count++;
3264 non_singular_classes_sum += c->members.length ();
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)
3273 int uid = DECL_UID ((*it)->classes[0]->members[0]->decl);
3274 classes.quick_push (std::pair<congruence_class_group *, int> (*it, uid));
3277 classes.qsort (sort_congruence_class_groups_by_decl_uid);
3279 if (dump_file)
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);
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++)
3303 congruence_class *c = it->first->classes[i];
3305 if (c->members.length () == 1)
3306 continue;
3308 sem_item *source = c->members[0];
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];
3316 for (unsigned int j = 0; j < c->members.length (); j++)
3318 sem_item *alias = c->members[j];
3320 if (alias == source)
3321 continue;
3323 dump_user_location_t loc
3324 = dump_user_location_t::from_function_decl (source->decl);
3325 if (dump_enabled_p ())
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 ());
3337 if (lookup_attribute ("no_icf", DECL_ATTRIBUTES (alias->decl)))
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;
3346 if (dump_file && (dump_flags & TDF_DETAILS))
3348 source->dump_to_file (dump_file);
3349 alias->dump_to_file (dump_file);
3352 if (dbg_cnt (merged_ipa_icf))
3354 bool merged = source->merge (alias);
3355 merged_p |= merged;
3357 if (merged && alias->type == VAR)
3359 symtab_pair p = symtab_pair (source->node, alias->node);
3360 m_merged_variables.safe_push (p);
3366 if (!m_merged_variables.is_empty ())
3367 fixup_points_to_sets ();
3369 return merged_p;
3372 /* Fixup points to set PT. */
3374 void
3375 sem_item_optimizer::fixup_pt_set (struct pt_solution *pt)
3377 if (pt->vars == NULL)
3378 return;
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));
3387 /* Set all points-to UIDs of aliases pointing to node N as UID. */
3389 static void
3390 set_alias_uids (symtab_node *n, int uid)
3392 ipa_ref *ref;
3393 FOR_EACH_ALIAS (n, ref)
3395 if (dump_file)
3396 fprintf (dump_file, " Setting points-to UID of [%s] as %d\n",
3397 ref->referring->dump_asm_name (), uid);
3399 SET_DECL_PT_UID (ref->referring->decl, uid);
3400 set_alias_uids (ref->referring, uid);
3404 /* Fixup points to analysis info. */
3406 void
3407 sem_item_optimizer::fixup_points_to_sets (void)
3409 /* TODO: remove in GCC 9 and trigger PTA re-creation after IPA passes. */
3410 cgraph_node *cnode;
3412 FOR_EACH_DEFINED_FUNCTION (cnode)
3414 tree name;
3415 unsigned i;
3416 function *fn = DECL_STRUCT_FUNCTION (cnode->decl);
3417 if (!gimple_in_ssa_p (fn))
3418 continue;
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);
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))
3435 gcall *call = dyn_cast<gcall *> (gsi_stmt (gsi));
3436 if (call)
3438 fixup_pt_set (gimple_call_use_set (call));
3439 fixup_pt_set (gimple_call_clobber_set (call));
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));
3450 /* Dump function prints all class members to a FILE with an INDENT. */
3452 void
3453 congruence_class::dump (FILE *file, unsigned int indent) const
3455 FPRINTF_SPACES (file, indent, "class with id: %u, hash: %u, items: %u\n",
3456 id, members[0]->get_hash (), members.length ());
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 ());
3462 fprintf (file, "\n");
3465 /* Returns true if there's a member that is used from another group. */
3467 bool
3468 congruence_class::is_class_used (void)
3470 for (unsigned int i = 0; i < members.length (); i++)
3471 if (members[i]->referenced_by_count)
3472 return true;
3474 return false;
3477 /* Generate pass summary for IPA ICF pass. */
3479 static void
3480 ipa_icf_generate_summary (void)
3482 if (!optimizer)
3483 optimizer = new sem_item_optimizer ();
3485 optimizer->register_hooks ();
3486 optimizer->parse_funcs_and_vars ();
3489 /* Write pass summary for IPA ICF pass. */
3491 static void
3492 ipa_icf_write_summary (void)
3494 gcc_assert (optimizer);
3496 optimizer->write_summary ();
3499 /* Read pass summary for IPA ICF pass. */
3501 static void
3502 ipa_icf_read_summary (void)
3504 if (!optimizer)
3505 optimizer = new sem_item_optimizer ();
3507 optimizer->read_summary ();
3508 optimizer->register_hooks ();
3511 /* Semantic equality execution function. */
3513 static unsigned int
3514 ipa_icf_driver (void)
3516 gcc_assert (optimizer);
3518 bool merged_p = optimizer->execute ();
3520 delete optimizer;
3521 optimizer = NULL;
3523 return merged_p ? TODO_remove_functions : 0;
3526 const pass_data pass_data_ipa_icf =
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 */
3539 class pass_ipa_icf : public ipa_opt_pass_d
3541 public:
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 */
3557 /* opt_pass methods: */
3558 virtual bool gate (function *)
3560 return in_lto_p || flag_ipa_icf_variables || flag_ipa_icf_functions;
3563 virtual unsigned int execute (function *)
3565 return ipa_icf_driver();
3567 }; // class pass_ipa_icf
3569 } // ipa_icf namespace
3571 ipa_opt_pass_d *
3572 make_pass_ipa_icf (gcc::context *ctxt)
3574 return new ipa_icf::pass_ipa_icf (ctxt);