Fix internal error on function call returning extension of limited interface
[official-gcc.git] / gcc / ipa-icf.cc
blob3d62d7b6791d7a6195bb5d00a1b1f5d830d1a640
1 /* Interprocedural Identical Code Folding pass
2 Copyright (C) 2014-2024 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 "tree-streamer.h"
70 #include "fold-const.h"
71 #include "calls.h"
72 #include "varasm.h"
73 #include "gimple-iterator.h"
74 #include "tree-cfg.h"
75 #include "symbol-summary.h"
76 #include "ipa-prop.h"
77 #include "ipa-fnsummary.h"
78 #include "except.h"
79 #include "attribs.h"
80 #include "print-tree.h"
81 #include "ipa-utils.h"
82 #include "tree-ssa-alias-compare.h"
83 #include "ipa-icf-gimple.h"
84 #include "fibonacci_heap.h"
85 #include "ipa-icf.h"
86 #include "stor-layout.h"
87 #include "dbgcnt.h"
88 #include "tree-vector-builder.h"
89 #include "symtab-thunks.h"
90 #include "alias.h"
91 #include "asan.h"
93 using namespace ipa_icf_gimple;
95 namespace ipa_icf {
97 /* Initialization and computation of symtab node hash, there data
98 are propagated later on. */
100 static sem_item_optimizer *optimizer = NULL;
102 /* Constructor. */
104 symbol_compare_collection::symbol_compare_collection (symtab_node *node)
106 m_references.create (0);
107 m_interposables.create (0);
109 ipa_ref *ref;
111 if (is_a <varpool_node *> (node) && DECL_VIRTUAL_P (node->decl))
112 return;
114 for (unsigned i = 0; node->iterate_reference (i, ref); i++)
116 if (ref->address_matters_p ())
117 m_references.safe_push (ref->referred);
119 if (ref->referred->get_availability () <= AVAIL_INTERPOSABLE)
121 if (ref->address_matters_p ())
122 m_references.safe_push (ref->referred);
123 else
124 m_interposables.safe_push (ref->referred);
128 if (is_a <cgraph_node *> (node))
130 cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
132 for (cgraph_edge *e = cnode->callees; e; e = e->next_callee)
133 if (e->callee->get_availability () <= AVAIL_INTERPOSABLE)
134 m_interposables.safe_push (e->callee);
138 /* Constructor for key value pair, where _ITEM is key and _INDEX is a target. */
140 sem_usage_pair::sem_usage_pair (sem_item *_item, unsigned int _index)
141 : item (_item), index (_index)
145 sem_item::sem_item (sem_item_type _type, bitmap_obstack *stack)
146 : type (_type), referenced_by_count (0), m_hash (-1), m_hash_set (false)
148 setup (stack);
151 sem_item::sem_item (sem_item_type _type, symtab_node *_node,
152 bitmap_obstack *stack)
153 : type (_type), node (_node), referenced_by_count (0), m_hash (-1),
154 m_hash_set (false)
156 decl = node->decl;
157 setup (stack);
160 /* Add reference to a semantic TARGET. */
162 void
163 sem_item::add_reference (ref_map *refs,
164 sem_item *target)
166 unsigned index = reference_count++;
167 bool existed;
169 sem_usage_pair *pair = new sem_usage_pair (target, index);
170 vec<sem_item *> &v = refs->get_or_insert (pair, &existed);
171 if (existed)
172 delete pair;
174 v.safe_push (this);
175 bitmap_set_bit (target->usage_index_bitmap, index);
176 refs_set.add (target->node);
177 ++target->referenced_by_count;
180 /* Initialize internal data structures. Bitmap STACK is used for
181 bitmap memory allocation process. */
183 void
184 sem_item::setup (bitmap_obstack *stack)
186 gcc_checking_assert (node);
188 reference_count = 0;
189 tree_refs.create (0);
190 usage_index_bitmap = BITMAP_ALLOC (stack);
193 sem_item::~sem_item ()
195 tree_refs.release ();
197 BITMAP_FREE (usage_index_bitmap);
200 /* Dump function for debugging purpose. */
202 DEBUG_FUNCTION void
203 sem_item::dump (void)
205 if (dump_file)
207 fprintf (dump_file, "[%s] %s (tree:%p)\n", type == FUNC ? "func" : "var",
208 node->dump_name (), (void *) node->decl);
209 fprintf (dump_file, " hash: %u\n", get_hash ());
213 /* Return true if target supports alias symbols. */
215 bool
216 sem_item::target_supports_symbol_aliases_p (void)
218 #if !defined (ASM_OUTPUT_DEF) || (!defined(ASM_OUTPUT_WEAK_ALIAS) && !defined (ASM_WEAKEN_DECL))
219 return false;
220 #else
221 gcc_checking_assert (TARGET_SUPPORTS_ALIASES);
222 return true;
223 #endif
226 void sem_item::set_hash (hashval_t hash)
228 m_hash = hash;
229 m_hash_set = true;
232 hash_map<const_tree, hashval_t> sem_item::m_type_hash_cache;
234 /* Semantic function constructor that uses STACK as bitmap memory stack. */
236 sem_function::sem_function (bitmap_obstack *stack)
237 : sem_item (FUNC, stack), memory_access_types (), m_alias_sets_hash (0),
238 m_checker (NULL), m_compared_func (NULL)
240 bb_sizes.create (0);
241 bb_sorted.create (0);
244 sem_function::sem_function (cgraph_node *node, bitmap_obstack *stack)
245 : sem_item (FUNC, node, stack), memory_access_types (),
246 m_alias_sets_hash (0), m_checker (NULL), m_compared_func (NULL)
248 bb_sizes.create (0);
249 bb_sorted.create (0);
252 sem_function::~sem_function ()
254 for (unsigned i = 0; i < bb_sorted.length (); i++)
255 delete (bb_sorted[i]);
257 bb_sizes.release ();
258 bb_sorted.release ();
261 /* Calculates hash value based on a BASIC_BLOCK. */
263 hashval_t
264 sem_function::get_bb_hash (const sem_bb *basic_block)
266 inchash::hash hstate;
268 hstate.add_int (basic_block->nondbg_stmt_count);
269 hstate.add_int (basic_block->edge_count);
271 return hstate.end ();
274 /* References independent hash function. */
276 hashval_t
277 sem_function::get_hash (void)
279 if (!m_hash_set)
281 inchash::hash hstate;
282 hstate.add_int (177454); /* Random number for function type. */
284 hstate.add_int (arg_count);
285 hstate.add_int (cfg_checksum);
286 hstate.add_int (gcode_hash);
288 for (unsigned i = 0; i < bb_sorted.length (); i++)
289 hstate.merge_hash (get_bb_hash (bb_sorted[i]));
291 for (unsigned i = 0; i < bb_sizes.length (); i++)
292 hstate.add_int (bb_sizes[i]);
294 /* Add common features of declaration itself. */
295 if (DECL_FUNCTION_SPECIFIC_TARGET (decl))
296 hstate.add_hwi
297 (cl_target_option_hash
298 (TREE_TARGET_OPTION (DECL_FUNCTION_SPECIFIC_TARGET (decl))));
299 if (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (decl))
300 hstate.add_hwi
301 (cl_optimization_hash
302 (TREE_OPTIMIZATION (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (decl))));
303 hstate.add_flag (DECL_CXX_CONSTRUCTOR_P (decl));
304 hstate.add_flag (DECL_CXX_DESTRUCTOR_P (decl));
306 set_hash (hstate.end ());
309 return m_hash;
312 /* Compare properties of symbols N1 and N2 that does not affect semantics of
313 symbol itself but affects semantics of its references from USED_BY (which
314 may be NULL if it is unknown). If comparison is false, symbols
315 can still be merged but any symbols referring them can't.
317 If ADDRESS is true, do extra checking needed for IPA_REF_ADDR.
319 TODO: We can also split attributes to those that determine codegen of
320 a function body/variable constructor itself and those that are used when
321 referring to it. */
323 bool
324 sem_item::compare_referenced_symbol_properties (symtab_node *used_by,
325 symtab_node *n1,
326 symtab_node *n2,
327 bool address)
329 if (is_a <cgraph_node *> (n1))
331 /* Inline properties matters: we do now want to merge uses of inline
332 function to uses of normal function because inline hint would be lost.
333 We however can merge inline function to noinline because the alias
334 will keep its DECL_DECLARED_INLINE flag.
336 Also ignore inline flag when optimizing for size or when function
337 is known to not be inlinable.
339 TODO: the optimize_size checks can also be assumed to be true if
340 unit has no !optimize_size functions. */
342 if ((!used_by || address || !is_a <cgraph_node *> (used_by)
343 || !opt_for_fn (used_by->decl, optimize_size))
344 && !opt_for_fn (n1->decl, optimize_size)
345 && n1->get_availability () > AVAIL_INTERPOSABLE
346 && (!DECL_UNINLINABLE (n1->decl) || !DECL_UNINLINABLE (n2->decl)))
348 if (DECL_DISREGARD_INLINE_LIMITS (n1->decl)
349 != DECL_DISREGARD_INLINE_LIMITS (n2->decl))
350 return return_false_with_msg
351 ("DECL_DISREGARD_INLINE_LIMITS are different");
353 if (DECL_DECLARED_INLINE_P (n1->decl)
354 != DECL_DECLARED_INLINE_P (n2->decl))
355 return return_false_with_msg ("inline attributes are different");
358 if (DECL_IS_OPERATOR_NEW_P (n1->decl)
359 != DECL_IS_OPERATOR_NEW_P (n2->decl))
360 return return_false_with_msg ("operator new flags are different");
362 if (DECL_IS_REPLACEABLE_OPERATOR (n1->decl)
363 != DECL_IS_REPLACEABLE_OPERATOR (n2->decl))
364 return return_false_with_msg ("replaceable operator flags are different");
367 /* Merging two definitions with a reference to equivalent vtables, but
368 belonging to a different type may result in ipa-polymorphic-call analysis
369 giving a wrong answer about the dynamic type of instance. */
370 if (is_a <varpool_node *> (n1))
372 if ((DECL_VIRTUAL_P (n1->decl) || DECL_VIRTUAL_P (n2->decl))
373 && (DECL_VIRTUAL_P (n1->decl) != DECL_VIRTUAL_P (n2->decl)
374 || !types_must_be_same_for_odr (DECL_CONTEXT (n1->decl),
375 DECL_CONTEXT (n2->decl)))
376 && (!used_by || !is_a <cgraph_node *> (used_by) || address
377 || opt_for_fn (used_by->decl, flag_devirtualize)))
378 return return_false_with_msg
379 ("references to virtual tables cannot be merged");
381 if (address && DECL_ALIGN (n1->decl) != DECL_ALIGN (n2->decl))
382 return return_false_with_msg ("alignment mismatch");
384 /* For functions we compare attributes in equals_wpa, because we do
385 not know what attributes may cause codegen differences, but for
386 variables just compare attributes for references - the codegen
387 for constructors is affected only by those attributes that we lower
388 to explicit representation (such as DECL_ALIGN or DECL_SECTION). */
389 if (!attribute_list_equal (DECL_ATTRIBUTES (n1->decl),
390 DECL_ATTRIBUTES (n2->decl)))
391 return return_false_with_msg ("different var decl attributes");
392 if (comp_type_attributes (TREE_TYPE (n1->decl),
393 TREE_TYPE (n2->decl)) != 1)
394 return return_false_with_msg ("different var type attributes");
397 /* When matching virtual tables, be sure to also match information
398 relevant for polymorphic call analysis. */
399 if (used_by && is_a <varpool_node *> (used_by)
400 && DECL_VIRTUAL_P (used_by->decl))
402 if (DECL_VIRTUAL_P (n1->decl) != DECL_VIRTUAL_P (n2->decl))
403 return return_false_with_msg ("virtual flag mismatch");
404 if (DECL_VIRTUAL_P (n1->decl) && is_a <cgraph_node *> (n1)
405 && (DECL_FINAL_P (n1->decl) != DECL_FINAL_P (n2->decl)))
406 return return_false_with_msg ("final flag mismatch");
408 return true;
411 /* Hash properties that are compared by compare_referenced_symbol_properties. */
413 void
414 sem_item::hash_referenced_symbol_properties (symtab_node *ref,
415 inchash::hash &hstate,
416 bool address)
418 if (is_a <cgraph_node *> (ref))
420 if ((type != FUNC || address || !opt_for_fn (decl, optimize_size))
421 && !opt_for_fn (ref->decl, optimize_size)
422 && !DECL_UNINLINABLE (ref->decl))
424 hstate.add_flag (DECL_DISREGARD_INLINE_LIMITS (ref->decl));
425 hstate.add_flag (DECL_DECLARED_INLINE_P (ref->decl));
427 hstate.add_flag (DECL_IS_OPERATOR_NEW_P (ref->decl));
429 else if (is_a <varpool_node *> (ref))
431 hstate.add_flag (DECL_VIRTUAL_P (ref->decl));
432 if (address)
433 hstate.add_int (DECL_ALIGN (ref->decl));
438 /* For a given symbol table nodes N1 and N2, we check that FUNCTION_DECLs
439 point to a same function. Comparison can be skipped if IGNORED_NODES
440 contains these nodes. ADDRESS indicate if address is taken. */
442 bool
443 sem_item::compare_symbol_references (
444 hash_map <symtab_node *, sem_item *> &ignored_nodes,
445 symtab_node *n1, symtab_node *n2, bool address)
447 enum availability avail1, avail2;
449 if (n1 == n2)
450 return true;
452 /* Never match variable and function. */
453 if (is_a <varpool_node *> (n1) != is_a <varpool_node *> (n2))
454 return false;
456 if (!compare_referenced_symbol_properties (node, n1, n2, address))
457 return false;
458 if (address && n1->equal_address_to (n2) == 1)
459 return true;
460 if (!address && n1->semantically_equivalent_p (n2))
461 return true;
463 n1 = n1->ultimate_alias_target (&avail1);
464 n2 = n2->ultimate_alias_target (&avail2);
466 if (avail1 > AVAIL_INTERPOSABLE && ignored_nodes.get (n1)
467 && avail2 > AVAIL_INTERPOSABLE && ignored_nodes.get (n2))
468 return true;
470 return return_false_with_msg ("different references");
473 /* If cgraph edges E1 and E2 are indirect calls, verify that
474 ECF flags are the same. */
476 bool sem_function::compare_edge_flags (cgraph_edge *e1, cgraph_edge *e2)
478 if (e1->indirect_info && e2->indirect_info)
480 int e1_flags = e1->indirect_info->ecf_flags;
481 int e2_flags = e2->indirect_info->ecf_flags;
483 if (e1_flags != e2_flags)
484 return return_false_with_msg ("ICF flags are different");
486 else if (e1->indirect_info || e2->indirect_info)
487 return false;
489 return true;
492 /* Return true if parameter I may be used. */
494 bool
495 sem_function::param_used_p (unsigned int i)
497 if (ipa_node_params_sum == NULL)
498 return true;
500 ipa_node_params *parms_info = ipa_node_params_sum->get (get_node ());
502 if (!parms_info || vec_safe_length (parms_info->descriptors) <= i)
503 return true;
505 return ipa_is_param_used (parms_info, i);
508 /* Perform additional check needed to match types function parameters that are
509 used. Unlike for normal decls it matters if type is TYPE_RESTRICT and we
510 make an assumption that REFERENCE_TYPE parameters are always non-NULL. */
512 bool
513 sem_function::compatible_parm_types_p (tree parm1, tree parm2)
515 /* Be sure that parameters are TBAA compatible. */
516 if (!func_checker::compatible_types_p (parm1, parm2))
517 return return_false_with_msg ("parameter type is not compatible");
519 if (POINTER_TYPE_P (parm1)
520 && (TYPE_RESTRICT (parm1) != TYPE_RESTRICT (parm2)))
521 return return_false_with_msg ("argument restrict flag mismatch");
523 /* nonnull_arg_p implies non-zero range to REFERENCE types. */
524 if (POINTER_TYPE_P (parm1)
525 && TREE_CODE (parm1) != TREE_CODE (parm2)
526 && opt_for_fn (decl, flag_delete_null_pointer_checks))
527 return return_false_with_msg ("pointer wrt reference mismatch");
529 return true;
532 /* Fast equality function based on knowledge known in WPA. */
534 bool
535 sem_function::equals_wpa (sem_item *item,
536 hash_map <symtab_node *, sem_item *> &ignored_nodes)
538 gcc_assert (item->type == FUNC);
539 cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
540 cgraph_node *cnode2 = dyn_cast <cgraph_node *> (item->node);
542 m_compared_func = static_cast<sem_function *> (item);
544 if (cnode->thunk != cnode2->thunk)
545 return return_false_with_msg ("thunk mismatch");
546 if (cnode->former_thunk_p () != cnode2->former_thunk_p ())
547 return return_false_with_msg ("former_thunk_p mismatch");
549 if ((cnode->thunk || cnode->former_thunk_p ())
550 && thunk_info::get (cnode) != thunk_info::get (cnode2))
551 return return_false_with_msg ("thunk_info mismatch");
553 /* Compare special function DECL attributes. */
554 if (DECL_FUNCTION_PERSONALITY (decl)
555 != DECL_FUNCTION_PERSONALITY (item->decl))
556 return return_false_with_msg ("function personalities are different");
558 if (DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl)
559 != DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (item->decl))
560 return return_false_with_msg ("instrument function entry exit "
561 "attributes are different");
563 if (DECL_NO_LIMIT_STACK (decl) != DECL_NO_LIMIT_STACK (item->decl))
564 return return_false_with_msg ("no stack limit attributes are different");
566 if (DECL_CXX_CONSTRUCTOR_P (decl) != DECL_CXX_CONSTRUCTOR_P (item->decl))
567 return return_false_with_msg ("DECL_CXX_CONSTRUCTOR mismatch");
569 if (DECL_CXX_DESTRUCTOR_P (decl) != DECL_CXX_DESTRUCTOR_P (item->decl))
570 return return_false_with_msg ("DECL_CXX_DESTRUCTOR mismatch");
572 /* TODO: pure/const flags mostly matters only for references, except for
573 the fact that codegen takes LOOPING flag as a hint that loops are
574 finite. We may arrange the code to always pick leader that has least
575 specified flags and then this can go into comparing symbol properties. */
576 if (flags_from_decl_or_type (decl) != flags_from_decl_or_type (item->decl))
577 return return_false_with_msg ("decl_or_type flags are different");
579 /* Do not match polymorphic constructors of different types. They calls
580 type memory location for ipa-polymorphic-call and we do not want
581 it to get confused by wrong type. */
582 if (DECL_CXX_CONSTRUCTOR_P (decl)
583 && opt_for_fn (decl, flag_devirtualize)
584 && TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE)
586 if (TREE_CODE (TREE_TYPE (item->decl)) != METHOD_TYPE)
587 return return_false_with_msg ("DECL_CXX_CONSTRUCTOR type mismatch");
588 else if (!func_checker::compatible_polymorphic_types_p
589 (TYPE_METHOD_BASETYPE (TREE_TYPE (decl)),
590 TYPE_METHOD_BASETYPE (TREE_TYPE (item->decl)), false))
591 return return_false_with_msg ("ctor polymorphic type mismatch");
594 /* Checking function TARGET and OPTIMIZATION flags. */
595 cl_target_option *tar1 = target_opts_for_fn (decl);
596 cl_target_option *tar2 = target_opts_for_fn (item->decl);
598 if (tar1 != tar2 && !cl_target_option_eq (tar1, tar2))
600 if (dump_file && (dump_flags & TDF_DETAILS))
602 fprintf (dump_file, "target flags difference");
603 cl_target_option_print_diff (dump_file, 2, tar1, tar2);
606 return return_false_with_msg ("Target flags are different");
609 cl_optimization *opt1 = opts_for_fn (decl);
610 cl_optimization *opt2 = opts_for_fn (item->decl);
612 if (opt1 != opt2 && !cl_optimization_option_eq (opt1, opt2))
614 if (dump_file && (dump_flags & TDF_DETAILS))
616 fprintf (dump_file, "optimization flags difference");
617 cl_optimization_print_diff (dump_file, 2, opt1, opt2);
620 return return_false_with_msg ("optimization flags are different");
623 /* Result type checking. */
624 if (!func_checker::compatible_types_p
625 (TREE_TYPE (TREE_TYPE (decl)),
626 TREE_TYPE (TREE_TYPE (m_compared_func->decl))))
627 return return_false_with_msg ("result types are different");
629 /* Checking types of arguments. */
630 tree list1 = TYPE_ARG_TYPES (TREE_TYPE (decl)),
631 list2 = TYPE_ARG_TYPES (TREE_TYPE (m_compared_func->decl));
632 for (unsigned i = 0; list1 && list2;
633 list1 = TREE_CHAIN (list1), list2 = TREE_CHAIN (list2), i++)
635 tree parm1 = TREE_VALUE (list1);
636 tree parm2 = TREE_VALUE (list2);
638 /* This guard is here for function pointer with attributes (pr59927.c). */
639 if (!parm1 || !parm2)
640 return return_false_with_msg ("NULL argument type");
642 /* Verify that types are compatible to ensure that both functions
643 have same calling conventions. */
644 if (!types_compatible_p (parm1, parm2))
645 return return_false_with_msg ("parameter types are not compatible");
647 if (!param_used_p (i))
648 continue;
650 /* Perform additional checks for used parameters. */
651 if (!compatible_parm_types_p (parm1, parm2))
652 return false;
655 if (list1 || list2)
656 return return_false_with_msg ("Mismatched number of parameters");
658 if (node->num_references () != item->node->num_references ())
659 return return_false_with_msg ("different number of references");
661 /* Checking function attributes.
662 This is quadratic in number of attributes */
663 if (comp_type_attributes (TREE_TYPE (decl),
664 TREE_TYPE (item->decl)) != 1)
665 return return_false_with_msg ("different type attributes");
666 if (!attribute_list_equal (DECL_ATTRIBUTES (decl),
667 DECL_ATTRIBUTES (item->decl)))
668 return return_false_with_msg ("different decl attributes");
670 /* The type of THIS pointer type memory location for
671 ipa-polymorphic-call-analysis. */
672 if (opt_for_fn (decl, flag_devirtualize)
673 && (TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE
674 || TREE_CODE (TREE_TYPE (item->decl)) == METHOD_TYPE)
675 && param_used_p (0)
676 && compare_polymorphic_p ())
678 if (TREE_CODE (TREE_TYPE (decl)) != TREE_CODE (TREE_TYPE (item->decl)))
679 return return_false_with_msg ("METHOD_TYPE and FUNCTION_TYPE mismatch");
680 if (!func_checker::compatible_polymorphic_types_p
681 (TYPE_METHOD_BASETYPE (TREE_TYPE (decl)),
682 TYPE_METHOD_BASETYPE (TREE_TYPE (item->decl)), false))
683 return return_false_with_msg ("THIS pointer ODR type mismatch");
686 ipa_ref *ref = NULL, *ref2 = NULL;
687 for (unsigned i = 0; node->iterate_reference (i, ref); i++)
689 item->node->iterate_reference (i, ref2);
691 if (ref->use != ref2->use)
692 return return_false_with_msg ("reference use mismatch");
694 if (!compare_symbol_references (ignored_nodes, ref->referred,
695 ref2->referred,
696 ref->address_matters_p ()))
697 return false;
700 cgraph_edge *e1 = dyn_cast <cgraph_node *> (node)->callees;
701 cgraph_edge *e2 = dyn_cast <cgraph_node *> (item->node)->callees;
703 while (e1 && e2)
705 if (!compare_symbol_references (ignored_nodes, e1->callee,
706 e2->callee, false))
707 return false;
708 if (!compare_edge_flags (e1, e2))
709 return false;
711 e1 = e1->next_callee;
712 e2 = e2->next_callee;
715 if (e1 || e2)
716 return return_false_with_msg ("different number of calls");
718 e1 = dyn_cast <cgraph_node *> (node)->indirect_calls;
719 e2 = dyn_cast <cgraph_node *> (item->node)->indirect_calls;
721 while (e1 && e2)
723 if (!compare_edge_flags (e1, e2))
724 return false;
726 e1 = e1->next_callee;
727 e2 = e2->next_callee;
730 if (e1 || e2)
731 return return_false_with_msg ("different number of indirect calls");
733 return true;
736 /* Update hash by address sensitive references. We iterate over all
737 sensitive references (address_matters_p) and we hash ultimate alias
738 target of these nodes, which can improve a semantic item hash.
740 Also hash in referenced symbols properties. This can be done at any time
741 (as the properties should not change), but it is convenient to do it here
742 while we walk the references anyway. */
744 void
745 sem_item::update_hash_by_addr_refs (hash_map <symtab_node *,
746 sem_item *> &m_symtab_node_map)
748 ipa_ref* ref;
749 inchash::hash hstate (get_hash ());
751 for (unsigned i = 0; node->iterate_reference (i, ref); i++)
753 hstate.add_int (ref->use);
754 hash_referenced_symbol_properties (ref->referred, hstate,
755 ref->use == IPA_REF_ADDR);
756 if (ref->address_matters_p () || !m_symtab_node_map.get (ref->referred))
757 hstate.add_int (ref->referred->ultimate_alias_target ()->order);
760 if (is_a <cgraph_node *> (node))
762 for (cgraph_edge *e = dyn_cast <cgraph_node *> (node)->callers; e;
763 e = e->next_caller)
765 sem_item **result = m_symtab_node_map.get (e->callee);
766 hash_referenced_symbol_properties (e->callee, hstate, false);
767 if (!result)
768 hstate.add_int (e->callee->ultimate_alias_target ()->order);
772 set_hash (hstate.end ());
775 /* Update hash by computed local hash values taken from different
776 semantic items.
777 TODO: stronger SCC based hashing would be desirable here. */
779 void
780 sem_item::update_hash_by_local_refs (hash_map <symtab_node *,
781 sem_item *> &m_symtab_node_map)
783 ipa_ref* ref;
784 inchash::hash state (get_hash ());
786 for (unsigned j = 0; node->iterate_reference (j, ref); j++)
788 sem_item **result = m_symtab_node_map.get (ref->referring);
789 if (result)
790 state.merge_hash ((*result)->get_hash ());
793 if (type == FUNC)
795 for (cgraph_edge *e = dyn_cast <cgraph_node *> (node)->callees; e;
796 e = e->next_callee)
798 sem_item **result = m_symtab_node_map.get (e->caller);
799 if (result)
800 state.merge_hash ((*result)->get_hash ());
804 global_hash = state.end ();
807 /* Returns true if the item equals to ITEM given as argument. */
809 bool
810 sem_function::equals (sem_item *item,
811 hash_map <symtab_node *, sem_item *> &)
813 gcc_assert (item->type == FUNC);
814 bool eq = equals_private (item);
816 if (m_checker != NULL)
818 delete m_checker;
819 m_checker = NULL;
822 if (dump_file && (dump_flags & TDF_DETAILS))
823 fprintf (dump_file,
824 "Equals called for: %s:%s with result: %s\n\n",
825 node->dump_name (),
826 item->node->dump_name (),
827 eq ? "true" : "false");
829 return eq;
832 /* Processes function equality comparison. */
834 bool
835 sem_function::equals_private (sem_item *item)
837 if (item->type != FUNC)
838 return false;
840 basic_block bb1, bb2;
841 edge e1, e2;
842 edge_iterator ei1, ei2;
843 bool result = true;
844 tree arg1, arg2;
846 m_compared_func = static_cast<sem_function *> (item);
848 gcc_assert (decl != item->decl);
850 if (bb_sorted.length () != m_compared_func->bb_sorted.length ()
851 || edge_count != m_compared_func->edge_count
852 || cfg_checksum != m_compared_func->cfg_checksum)
853 return return_false ();
855 m_checker = new func_checker (decl, m_compared_func->decl,
856 false,
857 opt_for_fn (m_compared_func->decl,
858 flag_strict_aliasing),
859 &refs_set,
860 &m_compared_func->refs_set);
861 arg1 = DECL_ARGUMENTS (decl);
862 arg2 = DECL_ARGUMENTS (m_compared_func->decl);
863 for (unsigned i = 0;
864 arg1 && arg2; arg1 = DECL_CHAIN (arg1), arg2 = DECL_CHAIN (arg2), i++)
866 if (!types_compatible_p (TREE_TYPE (arg1), TREE_TYPE (arg2)))
867 return return_false_with_msg ("argument types are not compatible");
868 if (!param_used_p (i))
869 continue;
870 /* Perform additional checks for used parameters. */
871 if (!compatible_parm_types_p (TREE_TYPE (arg1), TREE_TYPE (arg2)))
872 return false;
873 if (!m_checker->compare_decl (arg1, arg2))
874 return return_false ();
876 if (arg1 || arg2)
877 return return_false_with_msg ("Mismatched number of arguments");
879 if (!dyn_cast <cgraph_node *> (node)->has_gimple_body_p ())
880 return true;
882 /* Fill-up label dictionary. */
883 for (unsigned i = 0; i < bb_sorted.length (); ++i)
885 m_checker->parse_labels (bb_sorted[i]);
886 m_checker->parse_labels (m_compared_func->bb_sorted[i]);
889 /* Checking all basic blocks. */
890 for (unsigned i = 0; i < bb_sorted.length (); ++i)
891 if(!m_checker->compare_bb (bb_sorted[i], m_compared_func->bb_sorted[i]))
892 return return_false ();
894 auto_vec <int> bb_dict;
896 /* Basic block edges check. */
897 for (unsigned i = 0; i < bb_sorted.length (); ++i)
899 bb1 = bb_sorted[i]->bb;
900 bb2 = m_compared_func->bb_sorted[i]->bb;
902 ei2 = ei_start (bb2->preds);
904 for (ei1 = ei_start (bb1->preds); ei_cond (ei1, &e1); ei_next (&ei1))
906 ei_cond (ei2, &e2);
908 if (e1->flags != e2->flags)
909 return return_false_with_msg ("flags comparison returns false");
911 if (!bb_dict_test (&bb_dict, e1->src->index, e2->src->index))
912 return return_false_with_msg ("edge comparison returns false");
914 if (!bb_dict_test (&bb_dict, e1->dest->index, e2->dest->index))
915 return return_false_with_msg ("BB comparison returns false");
917 if (!m_checker->compare_edge (e1, e2))
918 return return_false_with_msg ("edge comparison returns false");
920 ei_next (&ei2);
924 /* Basic block PHI nodes comparison. */
925 for (unsigned i = 0; i < bb_sorted.length (); i++)
926 if (!compare_phi_node (bb_sorted[i]->bb, m_compared_func->bb_sorted[i]->bb))
927 return return_false_with_msg ("PHI node comparison returns false");
929 return result;
932 /* Set LOCAL_P of NODE to true if DATA is non-NULL.
933 Helper for call_for_symbol_thunks_and_aliases. */
935 static bool
936 set_local (cgraph_node *node, void *data)
938 node->local = data != NULL;
939 return false;
942 /* TREE_ADDRESSABLE of NODE to true.
943 Helper for call_for_symbol_thunks_and_aliases. */
945 static bool
946 set_addressable (varpool_node *node, void *)
948 TREE_ADDRESSABLE (node->decl) = 1;
949 return false;
952 /* Clear DECL_RTL of NODE.
953 Helper for call_for_symbol_thunks_and_aliases. */
955 static bool
956 clear_decl_rtl (symtab_node *node, void *)
958 SET_DECL_RTL (node->decl, NULL);
959 return false;
962 /* Redirect all callers of N and its aliases to TO. Remove aliases if
963 possible. Return number of redirections made. */
965 static int
966 redirect_all_callers (cgraph_node *n, cgraph_node *to)
968 int nredirected = 0;
969 ipa_ref *ref;
970 cgraph_edge *e = n->callers;
972 while (e)
974 /* Redirecting thunks to interposable symbols or symbols in other sections
975 may not be supported by target output code. Play safe for now and
976 punt on redirection. */
977 if (!e->caller->thunk)
979 struct cgraph_edge *nexte = e->next_caller;
980 e->redirect_callee (to);
981 e = nexte;
982 nredirected++;
984 else
985 e = e->next_callee;
987 for (unsigned i = 0; n->iterate_direct_aliases (i, ref);)
989 bool removed = false;
990 cgraph_node *n_alias = dyn_cast <cgraph_node *> (ref->referring);
992 if ((DECL_COMDAT_GROUP (n->decl)
993 && (DECL_COMDAT_GROUP (n->decl)
994 == DECL_COMDAT_GROUP (n_alias->decl)))
995 || (n_alias->get_availability () > AVAIL_INTERPOSABLE
996 && n->get_availability () > AVAIL_INTERPOSABLE))
998 nredirected += redirect_all_callers (n_alias, to);
999 if (n_alias->can_remove_if_no_direct_calls_p ()
1000 && !n_alias->call_for_symbol_and_aliases (cgraph_node::has_thunk_p,
1001 NULL, true)
1002 && !n_alias->has_aliases_p ())
1003 n_alias->remove ();
1005 if (!removed)
1006 i++;
1008 return nredirected;
1011 /* Merges instance with an ALIAS_ITEM, where alias, thunk or redirection can
1012 be applied. */
1014 bool
1015 sem_function::merge (sem_item *alias_item)
1017 gcc_assert (alias_item->type == FUNC);
1019 sem_function *alias_func = static_cast<sem_function *> (alias_item);
1021 cgraph_node *original = get_node ();
1022 cgraph_node *local_original = NULL;
1023 cgraph_node *alias = alias_func->get_node ();
1025 bool create_wrapper = false;
1026 bool create_alias = false;
1027 bool redirect_callers = false;
1028 bool remove = false;
1030 bool original_discardable = false;
1031 bool original_discarded = false;
1033 bool original_address_matters = original->address_matters_p ();
1034 bool alias_address_matters = alias->address_matters_p ();
1036 AUTO_DUMP_SCOPE ("merge",
1037 dump_user_location_t::from_function_decl (decl));
1039 if (DECL_EXTERNAL (alias->decl))
1041 if (dump_enabled_p ())
1042 dump_printf (MSG_MISSED_OPTIMIZATION,
1043 "Not unifying; alias is external.\n");
1044 return false;
1047 if (DECL_NO_INLINE_WARNING_P (original->decl)
1048 != DECL_NO_INLINE_WARNING_P (alias->decl))
1050 if (dump_enabled_p ())
1051 dump_printf (MSG_MISSED_OPTIMIZATION,
1052 "Not unifying; DECL_NO_INLINE_WARNING mismatch.\n");
1053 return false;
1056 /* Do not attempt to mix functions from different user sections;
1057 we do not know what user intends with those. */
1058 if (((DECL_SECTION_NAME (original->decl) && !original->implicit_section)
1059 || (DECL_SECTION_NAME (alias->decl) && !alias->implicit_section))
1060 && DECL_SECTION_NAME (original->decl) != DECL_SECTION_NAME (alias->decl))
1062 if (dump_enabled_p ())
1063 dump_printf (MSG_MISSED_OPTIMIZATION,
1064 "Not unifying; "
1065 "original and alias are in different sections.\n");
1066 return false;
1069 if (!original->in_same_comdat_group_p (alias)
1070 || original->comdat_local_p ())
1072 if (dump_enabled_p ())
1073 dump_printf (MSG_MISSED_OPTIMIZATION,
1074 "Not unifying; alias nor wrapper cannot be created; "
1075 "across comdat group boundary\n");
1076 return false;
1079 /* See if original is in a section that can be discarded if the main
1080 symbol is not used. */
1082 if (original->can_be_discarded_p ())
1083 original_discardable = true;
1084 /* Also consider case where we have resolution info and we know that
1085 original's definition is not going to be used. In this case we cannot
1086 create alias to original. */
1087 if (node->resolution != LDPR_UNKNOWN
1088 && !decl_binds_to_current_def_p (node->decl))
1089 original_discardable = original_discarded = true;
1091 /* Creating a symtab alias is the optimal way to merge.
1092 It however cannot be used in the following cases:
1094 1) if ORIGINAL and ALIAS may be possibly compared for address equality.
1095 2) if ORIGINAL is in a section that may be discarded by linker or if
1096 it is an external functions where we cannot create an alias
1097 (ORIGINAL_DISCARDABLE)
1098 3) if target do not support symbol aliases.
1099 4) original and alias lie in different comdat groups.
1101 If we cannot produce alias, we will turn ALIAS into WRAPPER of ORIGINAL
1102 and/or redirect all callers from ALIAS to ORIGINAL. */
1103 if ((original_address_matters && alias_address_matters)
1104 || (original_discardable
1105 && (!DECL_COMDAT_GROUP (alias->decl)
1106 || (DECL_COMDAT_GROUP (alias->decl)
1107 != DECL_COMDAT_GROUP (original->decl))))
1108 || original_discarded
1109 || !sem_item::target_supports_symbol_aliases_p ()
1110 || DECL_COMDAT_GROUP (alias->decl) != DECL_COMDAT_GROUP (original->decl))
1112 /* First see if we can produce wrapper. */
1114 /* Symbol properties that matter for references must be preserved.
1115 TODO: We can produce wrapper, but we need to produce alias of ORIGINAL
1116 with proper properties. */
1117 if (!sem_item::compare_referenced_symbol_properties (NULL, original, alias,
1118 alias->address_taken))
1120 if (dump_enabled_p ())
1121 dump_printf (MSG_MISSED_OPTIMIZATION,
1122 "Wrapper cannot be created because referenced symbol "
1123 "properties mismatch\n");
1125 /* Do not turn function in one comdat group into wrapper to another
1126 comdat group. Other compiler producing the body of the
1127 another comdat group may make opposite decision and with unfortunate
1128 linker choices this may close a loop. */
1129 else if (DECL_COMDAT_GROUP (original->decl)
1130 && DECL_COMDAT_GROUP (alias->decl)
1131 && (DECL_COMDAT_GROUP (alias->decl)
1132 != DECL_COMDAT_GROUP (original->decl)))
1134 if (dump_enabled_p ())
1135 dump_printf (MSG_MISSED_OPTIMIZATION,
1136 "Wrapper cannot be created because of COMDAT\n");
1138 else if (DECL_STATIC_CHAIN (alias->decl)
1139 || DECL_STATIC_CHAIN (original->decl))
1141 if (dump_enabled_p ())
1142 dump_printf (MSG_MISSED_OPTIMIZATION,
1143 "Cannot create wrapper of nested function.\n");
1145 /* TODO: We can also deal with variadic functions never calling
1146 VA_START. */
1147 else if (stdarg_p (TREE_TYPE (alias->decl)))
1149 if (dump_enabled_p ())
1150 dump_printf (MSG_MISSED_OPTIMIZATION,
1151 "cannot create wrapper of stdarg function.\n");
1153 else if (ipa_fn_summaries
1154 && ipa_size_summaries->get (alias) != NULL
1155 && ipa_size_summaries->get (alias)->self_size <= 2)
1157 if (dump_enabled_p ())
1158 dump_printf (MSG_MISSED_OPTIMIZATION, "Wrapper creation is not "
1159 "profitable (function is too small).\n");
1161 /* If user paid attention to mark function noinline, assume it is
1162 somewhat special and do not try to turn it into a wrapper that
1163 cannot be undone by inliner. */
1164 else if (lookup_attribute ("noinline", DECL_ATTRIBUTES (alias->decl)))
1166 if (dump_enabled_p ())
1167 dump_printf (MSG_MISSED_OPTIMIZATION,
1168 "Wrappers are not created for noinline.\n");
1170 else
1171 create_wrapper = true;
1173 /* We can redirect local calls in the case both alias and original
1174 are not interposable. */
1175 redirect_callers
1176 = alias->get_availability () > AVAIL_INTERPOSABLE
1177 && original->get_availability () > AVAIL_INTERPOSABLE;
1178 /* TODO: We can redirect, but we need to produce alias of ORIGINAL
1179 with proper properties. */
1180 if (!sem_item::compare_referenced_symbol_properties (NULL, original, alias,
1181 alias->address_taken))
1182 redirect_callers = false;
1184 if (!redirect_callers && !create_wrapper)
1186 if (dump_enabled_p ())
1187 dump_printf (MSG_MISSED_OPTIMIZATION,
1188 "Not unifying; cannot redirect callers nor "
1189 "produce wrapper\n");
1190 return false;
1193 /* Work out the symbol the wrapper should call.
1194 If ORIGINAL is interposable, we need to call a local alias.
1195 Also produce local alias (if possible) as an optimization.
1197 Local aliases cannot be created inside comdat groups because that
1198 prevents inlining. */
1199 if (!original_discardable && !original->get_comdat_group ())
1201 local_original
1202 = dyn_cast <cgraph_node *> (original->noninterposable_alias ());
1203 if (!local_original
1204 && original->get_availability () > AVAIL_INTERPOSABLE)
1205 local_original = original;
1207 /* If we cannot use local alias, fallback to the original
1208 when possible. */
1209 else if (original->get_availability () > AVAIL_INTERPOSABLE)
1210 local_original = original;
1212 /* If original is COMDAT local, we cannot really redirect calls outside
1213 of its comdat group to it. */
1214 if (original->comdat_local_p ())
1215 redirect_callers = false;
1216 if (!local_original)
1218 if (dump_enabled_p ())
1219 dump_printf (MSG_MISSED_OPTIMIZATION,
1220 "Not unifying; cannot produce local alias.\n");
1221 return false;
1224 if (!redirect_callers && !create_wrapper)
1226 if (dump_enabled_p ())
1227 dump_printf (MSG_MISSED_OPTIMIZATION,
1228 "Not unifying; "
1229 "cannot redirect callers nor produce a wrapper\n");
1230 return false;
1232 if (!create_wrapper
1233 && !alias->call_for_symbol_and_aliases (cgraph_node::has_thunk_p,
1234 NULL, true)
1235 && !alias->can_remove_if_no_direct_calls_p ())
1237 if (dump_enabled_p ())
1238 dump_printf (MSG_MISSED_OPTIMIZATION,
1239 "Not unifying; cannot make wrapper and "
1240 "function has other uses than direct calls\n");
1241 return false;
1244 else
1245 create_alias = true;
1247 if (redirect_callers)
1249 int nredirected = redirect_all_callers (alias, local_original);
1251 if (nredirected)
1253 alias->icf_merged = true;
1254 local_original->icf_merged = true;
1256 if (dump_enabled_p ())
1257 dump_printf (MSG_NOTE,
1258 "%i local calls have been "
1259 "redirected.\n", nredirected);
1262 /* If all callers was redirected, do not produce wrapper. */
1263 if (alias->can_remove_if_no_direct_calls_p ()
1264 && !DECL_VIRTUAL_P (alias->decl)
1265 && !alias->has_aliases_p ())
1267 create_wrapper = false;
1268 remove = true;
1270 gcc_assert (!create_alias);
1272 else if (create_alias)
1274 alias->icf_merged = true;
1276 /* Remove the function's body. */
1277 ipa_merge_profiles (original, alias);
1278 symtab->call_cgraph_removal_hooks (alias);
1279 alias->release_body (true);
1280 alias->reset ();
1281 /* Notice global symbol possibly produced RTL. */
1282 ((symtab_node *)alias)->call_for_symbol_and_aliases (clear_decl_rtl,
1283 NULL, true);
1285 /* Create the alias. */
1286 cgraph_node::create_alias (alias_func->decl, decl);
1287 alias->resolve_alias (original);
1289 original->call_for_symbol_thunks_and_aliases
1290 (set_local, (void *)(size_t) original->local_p (), true);
1292 if (dump_enabled_p ())
1293 dump_printf (MSG_OPTIMIZED_LOCATIONS,
1294 "Unified; Function alias has been created.\n");
1296 if (create_wrapper)
1298 gcc_assert (!create_alias);
1299 alias->icf_merged = true;
1300 symtab->call_cgraph_removal_hooks (alias);
1301 local_original->icf_merged = true;
1303 /* FIXME update local_original counts. */
1304 ipa_merge_profiles (original, alias, true);
1305 alias->create_wrapper (local_original);
1306 symtab->call_cgraph_insertion_hooks (alias);
1308 if (dump_enabled_p ())
1309 dump_printf (MSG_OPTIMIZED_LOCATIONS,
1310 "Unified; Wrapper has been created.\n");
1313 /* It's possible that redirection can hit thunks that block
1314 redirection opportunities. */
1315 gcc_assert (alias->icf_merged || remove || redirect_callers);
1316 original->icf_merged = true;
1318 /* We use merged flag to track cases where COMDAT function is known to be
1319 compatible its callers. If we merged in non-COMDAT, we need to give up
1320 on this optimization. */
1321 if (original->merged_comdat && !alias->merged_comdat)
1323 if (dump_enabled_p ())
1324 dump_printf (MSG_NOTE, "Dropping merged_comdat flag.\n");
1325 if (local_original)
1326 local_original->merged_comdat = false;
1327 original->merged_comdat = false;
1330 if (remove)
1332 ipa_merge_profiles (original, alias);
1333 alias->release_body ();
1334 alias->reset ();
1335 alias->body_removed = true;
1336 alias->icf_merged = true;
1337 if (dump_enabled_p ())
1338 dump_printf (MSG_OPTIMIZED_LOCATIONS,
1339 "Unified; Function body was removed.\n");
1342 return true;
1345 /* Semantic item initialization function. */
1347 void
1348 sem_function::init (ipa_icf_gimple::func_checker *checker)
1350 m_checker = checker;
1351 if (in_lto_p)
1352 get_node ()->get_untransformed_body ();
1354 tree fndecl = node->decl;
1355 function *func = DECL_STRUCT_FUNCTION (fndecl);
1357 gcc_assert (func);
1358 gcc_assert (SSANAMES (func));
1360 ssa_names_size = SSANAMES (func)->length ();
1361 node = node;
1363 decl = fndecl;
1364 region_tree = func->eh->region_tree;
1366 /* iterating all function arguments. */
1367 arg_count = count_formal_params (fndecl);
1369 edge_count = n_edges_for_fn (func);
1370 cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
1371 if (!cnode->thunk)
1373 cfg_checksum = coverage_compute_cfg_checksum (func);
1375 inchash::hash hstate;
1377 basic_block bb;
1378 FOR_EACH_BB_FN (bb, func)
1380 unsigned nondbg_stmt_count = 0;
1382 edge e;
1383 for (edge_iterator ei = ei_start (bb->preds); ei_cond (ei, &e);
1384 ei_next (&ei))
1385 cfg_checksum = iterative_hash_host_wide_int (e->flags,
1386 cfg_checksum);
1388 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
1389 gsi_next (&gsi))
1391 gimple *stmt = gsi_stmt (gsi);
1393 if (gimple_code (stmt) != GIMPLE_DEBUG
1394 && gimple_code (stmt) != GIMPLE_PREDICT)
1396 hash_stmt (stmt, hstate);
1397 nondbg_stmt_count++;
1401 hstate.commit_flag ();
1402 gcode_hash = hstate.end ();
1403 bb_sizes.safe_push (nondbg_stmt_count);
1405 /* Inserting basic block to hash table. */
1406 sem_bb *semantic_bb = new sem_bb (bb, nondbg_stmt_count,
1407 EDGE_COUNT (bb->preds)
1408 + EDGE_COUNT (bb->succs));
1410 bb_sorted.safe_push (semantic_bb);
1413 else
1415 cfg_checksum = 0;
1416 gcode_hash = thunk_info::get (cnode)->hash ();
1419 m_checker = NULL;
1422 /* Improve accumulated hash for HSTATE based on a gimple statement STMT. */
1424 void
1425 sem_function::hash_stmt (gimple *stmt, inchash::hash &hstate)
1427 enum gimple_code code = gimple_code (stmt);
1429 hstate.add_int (code);
1431 switch (code)
1433 case GIMPLE_SWITCH:
1434 m_checker->hash_operand (gimple_switch_index (as_a <gswitch *> (stmt)),
1435 hstate, 0, func_checker::OP_NORMAL);
1436 break;
1437 case GIMPLE_ASSIGN:
1438 hstate.add_int (gimple_assign_rhs_code (stmt));
1439 /* fall through */
1440 case GIMPLE_CALL:
1441 case GIMPLE_ASM:
1442 case GIMPLE_COND:
1443 case GIMPLE_GOTO:
1444 case GIMPLE_RETURN:
1446 func_checker::operand_access_type_map map (5);
1447 func_checker::classify_operands (stmt, &map);
1449 /* All these statements are equivalent if their operands are. */
1450 for (unsigned i = 0; i < gimple_num_ops (stmt); ++i)
1452 func_checker::operand_access_type
1453 access_type = func_checker::get_operand_access_type
1454 (&map, gimple_op (stmt, i));
1455 m_checker->hash_operand (gimple_op (stmt, i), hstate, 0,
1456 access_type);
1457 /* For memory accesses when hasing for LTO stremaing record
1458 base and ref alias ptr types so we can compare them at WPA
1459 time without having to read actual function body. */
1460 if (access_type == func_checker::OP_MEMORY
1461 && lto_streaming_expected_p ()
1462 && flag_strict_aliasing)
1464 ao_ref ref;
1466 ao_ref_init (&ref, gimple_op (stmt, i));
1467 tree t = ao_ref_alias_ptr_type (&ref);
1468 if (!variably_modified_type_p (t, NULL_TREE))
1469 memory_access_types.safe_push (t);
1470 t = ao_ref_base_alias_ptr_type (&ref);
1471 if (!variably_modified_type_p (t, NULL_TREE))
1472 memory_access_types.safe_push (t);
1475 /* Consider nocf_check attribute in hash as it affects code
1476 generation. */
1477 if (code == GIMPLE_CALL
1478 && flag_cf_protection & CF_BRANCH)
1479 hstate.add_flag (gimple_call_nocf_check_p (as_a <gcall *> (stmt)));
1481 break;
1482 default:
1483 break;
1488 /* Return true if polymorphic comparison must be processed. */
1490 bool
1491 sem_function::compare_polymorphic_p (void)
1493 struct cgraph_edge *e;
1495 if (!opt_for_fn (get_node ()->decl, flag_devirtualize))
1496 return false;
1497 if (get_node ()->indirect_calls != NULL)
1498 return true;
1499 /* TODO: We can do simple propagation determining what calls may lead to
1500 a polymorphic call. */
1501 for (e = get_node ()->callees; e; e = e->next_callee)
1502 if (e->callee->definition
1503 && opt_for_fn (e->callee->decl, flag_devirtualize))
1504 return true;
1505 return false;
1508 /* For a given call graph NODE, the function constructs new
1509 semantic function item. */
1511 sem_function *
1512 sem_function::parse (cgraph_node *node, bitmap_obstack *stack,
1513 func_checker *checker)
1515 tree fndecl = node->decl;
1516 function *func = DECL_STRUCT_FUNCTION (fndecl);
1518 if (!func || (!node->has_gimple_body_p () && !node->thunk))
1519 return NULL;
1521 if (lookup_attribute_by_prefix ("omp ", DECL_ATTRIBUTES (node->decl)) != NULL)
1522 return NULL;
1524 if (lookup_attribute_by_prefix ("oacc ",
1525 DECL_ATTRIBUTES (node->decl)) != NULL)
1526 return NULL;
1528 /* PR ipa/70306. */
1529 if (DECL_STATIC_CONSTRUCTOR (node->decl)
1530 || DECL_STATIC_DESTRUCTOR (node->decl))
1531 return NULL;
1533 sem_function *f = new sem_function (node, stack);
1534 f->init (checker);
1536 return f;
1539 /* For given basic blocks BB1 and BB2 (from functions FUNC1 and FUNC),
1540 return true if phi nodes are semantically equivalent in these blocks . */
1542 bool
1543 sem_function::compare_phi_node (basic_block bb1, basic_block bb2)
1545 gphi_iterator si1, si2;
1546 gphi *phi1, *phi2;
1547 unsigned size1, size2, i;
1548 tree t1, t2;
1549 edge e1, e2;
1551 gcc_assert (bb1 != NULL);
1552 gcc_assert (bb2 != NULL);
1554 si2 = gsi_start_nonvirtual_phis (bb2);
1555 for (si1 = gsi_start_nonvirtual_phis (bb1); !gsi_end_p (si1);
1556 gsi_next_nonvirtual_phi (&si1))
1558 if (gsi_end_p (si1) && gsi_end_p (si2))
1559 break;
1561 if (gsi_end_p (si1) || gsi_end_p (si2))
1562 return return_false();
1564 phi1 = si1.phi ();
1565 phi2 = si2.phi ();
1567 tree phi_result1 = gimple_phi_result (phi1);
1568 tree phi_result2 = gimple_phi_result (phi2);
1570 if (!m_checker->compare_operand (phi_result1, phi_result2,
1571 func_checker::OP_NORMAL))
1572 return return_false_with_msg ("PHI results are different");
1574 size1 = gimple_phi_num_args (phi1);
1575 size2 = gimple_phi_num_args (phi2);
1577 if (size1 != size2)
1578 return return_false ();
1580 for (i = 0; i < size1; ++i)
1582 t1 = gimple_phi_arg (phi1, i)->def;
1583 t2 = gimple_phi_arg (phi2, i)->def;
1585 if (!m_checker->compare_operand (t1, t2, func_checker::OP_NORMAL))
1586 return return_false ();
1588 e1 = gimple_phi_arg_edge (phi1, i);
1589 e2 = gimple_phi_arg_edge (phi2, i);
1591 if (!m_checker->compare_edge (e1, e2))
1592 return return_false ();
1595 gsi_next_nonvirtual_phi (&si2);
1598 return true;
1601 /* Basic blocks dictionary BB_DICT returns true if SOURCE index BB
1602 corresponds to TARGET. */
1604 bool
1605 sem_function::bb_dict_test (vec<int> *bb_dict, int source, int target)
1607 source++;
1608 target++;
1610 if (bb_dict->length () <= (unsigned)source)
1611 bb_dict->safe_grow_cleared (source + 1, true);
1613 if ((*bb_dict)[source] == 0)
1615 (*bb_dict)[source] = target;
1616 return true;
1618 else
1619 return (*bb_dict)[source] == target;
1622 sem_variable::sem_variable (bitmap_obstack *stack): sem_item (VAR, stack)
1626 sem_variable::sem_variable (varpool_node *node, bitmap_obstack *stack)
1627 : sem_item (VAR, node, stack)
1629 gcc_checking_assert (node);
1630 gcc_checking_assert (get_node ());
1633 /* Fast equality function based on knowledge known in WPA. */
1635 bool
1636 sem_variable::equals_wpa (sem_item *item,
1637 hash_map <symtab_node *, sem_item *> &ignored_nodes)
1639 gcc_assert (item->type == VAR);
1641 if (node->num_references () != item->node->num_references ())
1642 return return_false_with_msg ("different number of references");
1644 if (DECL_TLS_MODEL (decl) || DECL_TLS_MODEL (item->decl))
1645 return return_false_with_msg ("TLS model");
1647 /* DECL_ALIGN is safe to merge, because we will always chose the largest
1648 alignment out of all aliases. */
1650 if (DECL_VIRTUAL_P (decl) != DECL_VIRTUAL_P (item->decl))
1651 return return_false_with_msg ("Virtual flag mismatch");
1653 if (DECL_SIZE (decl) != DECL_SIZE (item->decl)
1654 && ((!DECL_SIZE (decl) || !DECL_SIZE (item->decl))
1655 || !operand_equal_p (DECL_SIZE (decl),
1656 DECL_SIZE (item->decl), OEP_ONLY_CONST)))
1657 return return_false_with_msg ("size mismatch");
1659 /* Do not attempt to mix data from different user sections;
1660 we do not know what user intends with those. */
1661 if (((DECL_SECTION_NAME (decl) && !node->implicit_section)
1662 || (DECL_SECTION_NAME (item->decl) && !item->node->implicit_section))
1663 && DECL_SECTION_NAME (decl) != DECL_SECTION_NAME (item->decl))
1664 return return_false_with_msg ("user section mismatch");
1666 if (DECL_IN_TEXT_SECTION (decl) != DECL_IN_TEXT_SECTION (item->decl))
1667 return return_false_with_msg ("text section");
1669 if (TYPE_ADDR_SPACE (TREE_TYPE (decl))
1670 != TYPE_ADDR_SPACE (TREE_TYPE (item->decl)))
1671 return return_false_with_msg ("address-space");
1673 ipa_ref *ref = NULL, *ref2 = NULL;
1674 for (unsigned i = 0; node->iterate_reference (i, ref); i++)
1676 item->node->iterate_reference (i, ref2);
1678 if (ref->use != ref2->use)
1679 return return_false_with_msg ("reference use mismatch");
1681 if (!compare_symbol_references (ignored_nodes,
1682 ref->referred, ref2->referred,
1683 ref->address_matters_p ()))
1684 return false;
1687 return true;
1690 /* Returns true if the item equals to ITEM given as argument. */
1692 bool
1693 sem_variable::equals (sem_item *item,
1694 hash_map <symtab_node *, sem_item *> &)
1696 gcc_assert (item->type == VAR);
1697 bool ret;
1699 if (DECL_INITIAL (decl) == error_mark_node && in_lto_p)
1700 dyn_cast <varpool_node *>(node)->get_constructor ();
1701 if (DECL_INITIAL (item->decl) == error_mark_node && in_lto_p)
1702 dyn_cast <varpool_node *>(item->node)->get_constructor ();
1704 /* As seen in PR ipa/65303 we have to compare variables types. */
1705 if (!func_checker::compatible_types_p (TREE_TYPE (decl),
1706 TREE_TYPE (item->decl)))
1707 return return_false_with_msg ("variables types are different");
1709 ret = sem_variable::equals (DECL_INITIAL (decl),
1710 DECL_INITIAL (item->node->decl));
1711 if (dump_file && (dump_flags & TDF_DETAILS))
1712 fprintf (dump_file,
1713 "Equals called for vars: %s:%s with result: %s\n\n",
1714 node->dump_name (), item->node->dump_name (),
1715 ret ? "true" : "false");
1717 return ret;
1720 /* Compares trees T1 and T2 for semantic equality. */
1722 bool
1723 sem_variable::equals (tree t1, tree t2)
1725 if (!t1 || !t2)
1726 return return_with_debug (t1 == t2);
1727 if (t1 == t2)
1728 return true;
1729 tree_code tc1 = TREE_CODE (t1);
1730 tree_code tc2 = TREE_CODE (t2);
1732 if (tc1 != tc2)
1733 return return_false_with_msg ("TREE_CODE mismatch");
1735 switch (tc1)
1737 case CONSTRUCTOR:
1739 vec<constructor_elt, va_gc> *v1, *v2;
1740 unsigned HOST_WIDE_INT idx;
1742 enum tree_code typecode = TREE_CODE (TREE_TYPE (t1));
1743 if (typecode != TREE_CODE (TREE_TYPE (t2)))
1744 return return_false_with_msg ("constructor type mismatch");
1746 if (typecode == ARRAY_TYPE)
1748 HOST_WIDE_INT size_1 = int_size_in_bytes (TREE_TYPE (t1));
1749 /* For arrays, check that the sizes all match. */
1750 if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2))
1751 || size_1 == -1
1752 || size_1 != int_size_in_bytes (TREE_TYPE (t2)))
1753 return return_false_with_msg ("constructor array size mismatch");
1755 else if (!func_checker::compatible_types_p (TREE_TYPE (t1),
1756 TREE_TYPE (t2)))
1757 return return_false_with_msg ("constructor type incompatible");
1759 v1 = CONSTRUCTOR_ELTS (t1);
1760 v2 = CONSTRUCTOR_ELTS (t2);
1761 if (vec_safe_length (v1) != vec_safe_length (v2))
1762 return return_false_with_msg ("constructor number of elts mismatch");
1764 for (idx = 0; idx < vec_safe_length (v1); ++idx)
1766 constructor_elt *c1 = &(*v1)[idx];
1767 constructor_elt *c2 = &(*v2)[idx];
1769 /* Check that each value is the same... */
1770 if (!sem_variable::equals (c1->value, c2->value))
1771 return false;
1772 /* ... and that they apply to the same fields! */
1773 if (!sem_variable::equals (c1->index, c2->index))
1774 return false;
1776 return true;
1778 case MEM_REF:
1780 tree x1 = TREE_OPERAND (t1, 0);
1781 tree x2 = TREE_OPERAND (t2, 0);
1782 tree y1 = TREE_OPERAND (t1, 1);
1783 tree y2 = TREE_OPERAND (t2, 1);
1785 if (!func_checker::compatible_types_p (TREE_TYPE (x1), TREE_TYPE (x2)))
1786 return return_false ();
1788 /* Type of the offset on MEM_REF does not matter. */
1789 return return_with_debug (sem_variable::equals (x1, x2)
1790 && known_eq (wi::to_poly_offset (y1),
1791 wi::to_poly_offset (y2)));
1793 case ADDR_EXPR:
1794 case FDESC_EXPR:
1796 tree op1 = TREE_OPERAND (t1, 0);
1797 tree op2 = TREE_OPERAND (t2, 0);
1798 return sem_variable::equals (op1, op2);
1800 /* References to other vars/decls are compared using ipa-ref. */
1801 case FUNCTION_DECL:
1802 case VAR_DECL:
1803 if (decl_in_symtab_p (t1) && decl_in_symtab_p (t2))
1804 return true;
1805 return return_false_with_msg ("Declaration mismatch");
1806 case CONST_DECL:
1807 /* TODO: We can check CONST_DECL by its DECL_INITIAL, but for that we
1808 need to process its VAR/FUNCTION references without relying on ipa-ref
1809 compare. */
1810 case FIELD_DECL:
1811 case LABEL_DECL:
1812 return return_false_with_msg ("Declaration mismatch");
1813 case INTEGER_CST:
1814 /* Integer 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 ("INTEGER_CST precision mismatch");
1817 if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2)))
1818 return return_false_with_msg ("INTEGER_CST mode mismatch");
1819 return return_with_debug (tree_int_cst_equal (t1, t2));
1820 case STRING_CST:
1821 if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2)))
1822 return return_false_with_msg ("STRING_CST mode mismatch");
1823 if (TREE_STRING_LENGTH (t1) != TREE_STRING_LENGTH (t2))
1824 return return_false_with_msg ("STRING_CST length mismatch");
1825 if (memcmp (TREE_STRING_POINTER (t1), TREE_STRING_POINTER (t2),
1826 TREE_STRING_LENGTH (t1)))
1827 return return_false_with_msg ("STRING_CST mismatch");
1828 return true;
1829 case FIXED_CST:
1830 /* Fixed constants are the same only if the same width of type. */
1831 if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
1832 return return_false_with_msg ("FIXED_CST precision mismatch");
1834 return return_with_debug (FIXED_VALUES_IDENTICAL (TREE_FIXED_CST (t1),
1835 TREE_FIXED_CST (t2)));
1836 case COMPLEX_CST:
1837 return (sem_variable::equals (TREE_REALPART (t1), TREE_REALPART (t2))
1838 && sem_variable::equals (TREE_IMAGPART (t1), TREE_IMAGPART (t2)));
1839 case REAL_CST:
1840 /* Real constants are the same only if the same width of type. */
1841 if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
1842 return return_false_with_msg ("REAL_CST precision mismatch");
1843 return return_with_debug (real_identical (&TREE_REAL_CST (t1),
1844 &TREE_REAL_CST (t2)));
1845 case VECTOR_CST:
1847 if (maybe_ne (VECTOR_CST_NELTS (t1), VECTOR_CST_NELTS (t2)))
1848 return return_false_with_msg ("VECTOR_CST nelts mismatch");
1850 unsigned int count
1851 = tree_vector_builder::binary_encoded_nelts (t1, t2);
1852 for (unsigned int i = 0; i < count; ++i)
1853 if (!sem_variable::equals (VECTOR_CST_ENCODED_ELT (t1, i),
1854 VECTOR_CST_ENCODED_ELT (t2, i)))
1855 return false;
1857 return true;
1859 case ARRAY_REF:
1860 case ARRAY_RANGE_REF:
1862 tree x1 = TREE_OPERAND (t1, 0);
1863 tree x2 = TREE_OPERAND (t2, 0);
1864 tree y1 = TREE_OPERAND (t1, 1);
1865 tree y2 = TREE_OPERAND (t2, 1);
1867 if (!sem_variable::equals (x1, x2) || !sem_variable::equals (y1, y2))
1868 return false;
1869 if (!sem_variable::equals (array_ref_low_bound (t1),
1870 array_ref_low_bound (t2)))
1871 return false;
1872 if (!sem_variable::equals (array_ref_element_size (t1),
1873 array_ref_element_size (t2)))
1874 return false;
1875 return true;
1878 case COMPONENT_REF:
1879 case POINTER_PLUS_EXPR:
1880 case PLUS_EXPR:
1881 case MINUS_EXPR:
1882 case RANGE_EXPR:
1884 tree x1 = TREE_OPERAND (t1, 0);
1885 tree x2 = TREE_OPERAND (t2, 0);
1886 tree y1 = TREE_OPERAND (t1, 1);
1887 tree y2 = TREE_OPERAND (t2, 1);
1889 return sem_variable::equals (x1, x2) && sem_variable::equals (y1, y2);
1892 CASE_CONVERT:
1893 case VIEW_CONVERT_EXPR:
1894 if (!func_checker::compatible_types_p (TREE_TYPE (t1), TREE_TYPE (t2)))
1895 return return_false ();
1896 return sem_variable::equals (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
1897 case ERROR_MARK:
1898 return return_false_with_msg ("ERROR_MARK");
1899 default:
1900 return return_false_with_msg ("Unknown TREE code reached");
1904 /* Parser function that visits a varpool NODE. */
1906 sem_variable *
1907 sem_variable::parse (varpool_node *node, bitmap_obstack *stack,
1908 func_checker *checker)
1910 if (TREE_THIS_VOLATILE (node->decl) || DECL_HARD_REGISTER (node->decl)
1911 || node->alias)
1912 return NULL;
1914 sem_variable *v = new sem_variable (node, stack);
1915 v->init (checker);
1917 return v;
1920 /* Semantic variable initialization function. */
1922 void
1923 sem_variable::init (ipa_icf_gimple::func_checker *checker)
1925 decl = get_node ()->decl;
1927 /* All WPA streamed in symbols should have their hashes computed at compile
1928 time. At this point, the constructor may not be in memory at all.
1929 DECL_INITIAL (decl) would be error_mark_node in that case. */
1930 if (!m_hash_set)
1932 gcc_assert (!node->lto_file_data);
1933 inchash::hash hstate;
1934 hstate.add_int (456346417);
1935 checker->hash_operand (DECL_INITIAL (decl), hstate, 0);
1936 set_hash (hstate.end ());
1940 /* References independent hash function. */
1942 hashval_t
1943 sem_variable::get_hash (void)
1945 gcc_checking_assert (m_hash_set);
1946 return m_hash;
1949 /* Merges instance with an ALIAS_ITEM, where alias, thunk or redirection can
1950 be applied. */
1952 bool
1953 sem_variable::merge (sem_item *alias_item)
1955 gcc_assert (alias_item->type == VAR);
1957 AUTO_DUMP_SCOPE ("merge",
1958 dump_user_location_t::from_function_decl (decl));
1959 if (!sem_item::target_supports_symbol_aliases_p ())
1961 if (dump_enabled_p ())
1962 dump_printf (MSG_MISSED_OPTIMIZATION, "Not unifying; "
1963 "Symbol aliases are not supported by target\n");
1964 return false;
1967 if (DECL_EXTERNAL (alias_item->decl))
1969 if (dump_enabled_p ())
1970 dump_printf (MSG_MISSED_OPTIMIZATION,
1971 "Not unifying; alias is external.\n");
1972 return false;
1975 sem_variable *alias_var = static_cast<sem_variable *> (alias_item);
1977 varpool_node *original = get_node ();
1978 varpool_node *alias = alias_var->get_node ();
1979 bool original_discardable = false;
1981 bool alias_address_matters = alias->address_matters_p ();
1983 /* See if original is in a section that can be discarded if the main
1984 symbol is not used.
1985 Also consider case where we have resolution info and we know that
1986 original's definition is not going to be used. In this case we cannot
1987 create alias to original. */
1988 if (original->can_be_discarded_p ()
1989 || (node->resolution != LDPR_UNKNOWN
1990 && !decl_binds_to_current_def_p (node->decl)))
1991 original_discardable = true;
1993 gcc_assert (!TREE_ASM_WRITTEN (alias->decl));
1995 /* Constant pool machinery is not quite ready for aliases.
1996 TODO: varasm code contains logic for merging DECL_IN_CONSTANT_POOL.
1997 For LTO merging does not happen that is an important missing feature.
1998 We can enable merging with LTO if the DECL_IN_CONSTANT_POOL
1999 flag is dropped and non-local symbol name is assigned. */
2000 if (DECL_IN_CONSTANT_POOL (alias->decl)
2001 || DECL_IN_CONSTANT_POOL (original->decl))
2003 if (dump_enabled_p ())
2004 dump_printf (MSG_MISSED_OPTIMIZATION,
2005 "Not unifying; constant pool variables.\n");
2006 return false;
2009 /* Do not attempt to mix functions from different user sections;
2010 we do not know what user intends with those. */
2011 if (((DECL_SECTION_NAME (original->decl) && !original->implicit_section)
2012 || (DECL_SECTION_NAME (alias->decl) && !alias->implicit_section))
2013 && DECL_SECTION_NAME (original->decl) != DECL_SECTION_NAME (alias->decl))
2015 if (dump_enabled_p ())
2016 dump_printf (MSG_MISSED_OPTIMIZATION,
2017 "Not unifying; "
2018 "original and alias are in different sections.\n");
2019 return false;
2022 /* We cannot merge if address comparison matters. */
2023 if (alias_address_matters && flag_merge_constants < 2)
2025 if (dump_enabled_p ())
2026 dump_printf (MSG_MISSED_OPTIMIZATION,
2027 "Not unifying; address of original may be compared.\n");
2028 return false;
2031 if (DECL_ALIGN (original->decl) != DECL_ALIGN (alias->decl)
2032 && (sanitize_flags_p (SANITIZE_ADDRESS, original->decl)
2033 || sanitize_flags_p (SANITIZE_ADDRESS, alias->decl)))
2035 if (dump_enabled_p ())
2036 dump_printf (MSG_MISSED_OPTIMIZATION,
2037 "Not unifying; "
2038 "ASAN requires equal alignments for original and alias\n");
2040 return false;
2043 if (DECL_ALIGN (original->decl) < DECL_ALIGN (alias->decl))
2045 if (dump_enabled_p ())
2046 dump_printf (MSG_MISSED_OPTIMIZATION,
2047 "Not unifying; "
2048 "original and alias have incompatible alignments\n");
2050 return false;
2053 if (DECL_COMDAT_GROUP (original->decl) != DECL_COMDAT_GROUP (alias->decl))
2055 if (dump_enabled_p ())
2056 dump_printf (MSG_MISSED_OPTIMIZATION,
2057 "Not unifying; alias cannot be created; "
2058 "across comdat group boundary\n");
2060 return false;
2063 if (original_discardable)
2065 if (dump_enabled_p ())
2066 dump_printf (MSG_MISSED_OPTIMIZATION,
2067 "Not unifying; alias cannot be created; "
2068 "target is discardable\n");
2070 return false;
2072 else
2074 gcc_assert (!original->alias);
2075 gcc_assert (!alias->alias);
2077 alias->analyzed = false;
2079 DECL_INITIAL (alias->decl) = NULL;
2080 ((symtab_node *)alias)->call_for_symbol_and_aliases (clear_decl_rtl,
2081 NULL, true);
2082 alias->remove_all_references ();
2083 if (TREE_ADDRESSABLE (alias->decl))
2084 original->call_for_symbol_and_aliases (set_addressable, NULL, true);
2086 varpool_node::create_alias (alias_var->decl, decl);
2087 alias->resolve_alias (original);
2089 if (dump_enabled_p ())
2090 dump_printf (MSG_OPTIMIZED_LOCATIONS,
2091 "Unified; Variable alias has been created.\n");
2093 return true;
2097 /* Dump symbol to FILE. */
2099 void
2100 sem_variable::dump_to_file (FILE *file)
2102 gcc_assert (file);
2104 print_node (file, "", decl, 0);
2105 fprintf (file, "\n\n");
2108 unsigned int sem_item_optimizer::class_id = 0;
2110 sem_item_optimizer::sem_item_optimizer ()
2111 : worklist (0), m_classes (0), m_classes_count (0), m_cgraph_node_hooks (NULL),
2112 m_varpool_node_hooks (NULL), m_merged_variables (), m_references ()
2114 m_items.create (0);
2115 bitmap_obstack_initialize (&m_bmstack);
2118 sem_item_optimizer::~sem_item_optimizer ()
2120 for (unsigned int i = 0; i < m_items.length (); i++)
2121 delete m_items[i];
2124 for (hash_table<congruence_class_hash>::iterator it = m_classes.begin ();
2125 it != m_classes.end (); ++it)
2127 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
2128 delete (*it)->classes[i];
2130 (*it)->classes.release ();
2131 free (*it);
2134 m_items.release ();
2136 bitmap_obstack_release (&m_bmstack);
2137 m_merged_variables.release ();
2140 /* Write IPA ICF summary for symbols. */
2142 void
2143 sem_item_optimizer::write_summary (void)
2145 unsigned int count = 0;
2147 output_block *ob = create_output_block (LTO_section_ipa_icf);
2148 lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
2149 ob->symbol = NULL;
2151 /* Calculate number of symbols to be serialized. */
2152 for (lto_symtab_encoder_iterator lsei = lsei_start_in_partition (encoder);
2153 !lsei_end_p (lsei);
2154 lsei_next_in_partition (&lsei))
2156 symtab_node *node = lsei_node (lsei);
2158 if (m_symtab_node_map.get (node))
2159 count++;
2162 streamer_write_uhwi (ob, count);
2164 /* Process all of the symbols. */
2165 for (lto_symtab_encoder_iterator lsei = lsei_start_in_partition (encoder);
2166 !lsei_end_p (lsei);
2167 lsei_next_in_partition (&lsei))
2169 symtab_node *node = lsei_node (lsei);
2171 sem_item **item = m_symtab_node_map.get (node);
2173 if (item && *item)
2175 int node_ref = lto_symtab_encoder_encode (encoder, node);
2176 streamer_write_uhwi_stream (ob->main_stream, node_ref);
2178 streamer_write_uhwi (ob, (*item)->get_hash ());
2180 if ((*item)->type == FUNC)
2182 sem_function *fn = static_cast<sem_function *> (*item);
2183 streamer_write_uhwi (ob, fn->memory_access_types.length ());
2184 for (unsigned i = 0; i < fn->memory_access_types.length (); i++)
2185 stream_write_tree (ob, fn->memory_access_types[i], true);
2190 streamer_write_char_stream (ob->main_stream, 0);
2191 produce_asm (ob, NULL);
2192 destroy_output_block (ob);
2195 /* Reads a section from LTO stream file FILE_DATA. Input block for DATA
2196 contains LEN bytes. */
2198 void
2199 sem_item_optimizer::read_section (lto_file_decl_data *file_data,
2200 const char *data, size_t len)
2202 const lto_function_header *header
2203 = (const lto_function_header *) data;
2204 const int cfg_offset = sizeof (lto_function_header);
2205 const int main_offset = cfg_offset + header->cfg_size;
2206 const int string_offset = main_offset + header->main_size;
2207 data_in *data_in;
2208 unsigned int i;
2209 unsigned int count;
2211 lto_input_block ib_main ((const char *) data + main_offset, 0,
2212 header->main_size, file_data);
2214 data_in
2215 = lto_data_in_create (file_data, (const char *) data + string_offset,
2216 header->string_size, vNULL);
2218 count = streamer_read_uhwi (&ib_main);
2220 for (i = 0; i < count; i++)
2222 unsigned int index;
2223 symtab_node *node;
2224 lto_symtab_encoder_t encoder;
2226 index = streamer_read_uhwi (&ib_main);
2227 encoder = file_data->symtab_node_encoder;
2228 node = lto_symtab_encoder_deref (encoder, index);
2230 hashval_t hash = streamer_read_uhwi (&ib_main);
2231 gcc_assert (node->definition);
2233 if (is_a<cgraph_node *> (node))
2235 cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
2237 sem_function *fn = new sem_function (cnode, &m_bmstack);
2238 unsigned count = streamer_read_uhwi (&ib_main);
2239 inchash::hash hstate (0);
2240 if (flag_incremental_link == INCREMENTAL_LINK_LTO)
2241 fn->memory_access_types.reserve_exact (count);
2242 for (unsigned i = 0; i < count; i++)
2244 tree type = stream_read_tree (&ib_main, data_in);
2245 hstate.add_int (get_deref_alias_set (type));
2246 if (flag_incremental_link == INCREMENTAL_LINK_LTO)
2247 fn->memory_access_types.quick_push (type);
2249 fn->m_alias_sets_hash = hstate.end ();
2250 fn->set_hash (hash);
2251 m_items.safe_push (fn);
2253 else
2255 varpool_node *vnode = dyn_cast <varpool_node *> (node);
2257 sem_variable *var = new sem_variable (vnode, &m_bmstack);
2258 var->set_hash (hash);
2259 m_items.safe_push (var);
2263 lto_free_section_data (file_data, LTO_section_ipa_icf, NULL, data,
2264 len);
2265 lto_data_in_delete (data_in);
2268 /* Read IPA ICF summary for symbols. */
2270 void
2271 sem_item_optimizer::read_summary (void)
2273 lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
2274 lto_file_decl_data *file_data;
2275 unsigned int j = 0;
2277 while ((file_data = file_data_vec[j++]))
2279 size_t len;
2280 const char *data
2281 = lto_get_summary_section_data (file_data, LTO_section_ipa_icf, &len);
2282 if (data)
2283 read_section (file_data, data, len);
2287 /* Register callgraph and varpool hooks. */
2289 void
2290 sem_item_optimizer::register_hooks (void)
2292 if (!m_cgraph_node_hooks)
2293 m_cgraph_node_hooks = symtab->add_cgraph_removal_hook
2294 (&sem_item_optimizer::cgraph_removal_hook, this);
2296 if (!m_varpool_node_hooks)
2297 m_varpool_node_hooks = symtab->add_varpool_removal_hook
2298 (&sem_item_optimizer::varpool_removal_hook, this);
2301 /* Unregister callgraph and varpool hooks. */
2303 void
2304 sem_item_optimizer::unregister_hooks (void)
2306 if (m_cgraph_node_hooks)
2307 symtab->remove_cgraph_removal_hook (m_cgraph_node_hooks);
2309 if (m_varpool_node_hooks)
2310 symtab->remove_varpool_removal_hook (m_varpool_node_hooks);
2313 /* Adds a CLS to hashtable associated by hash value. */
2315 void
2316 sem_item_optimizer::add_class (congruence_class *cls)
2318 gcc_assert (cls->members.length ());
2320 congruence_class_group *group
2321 = get_group_by_hash (cls->members[0]->get_hash (),
2322 cls->members[0]->type);
2323 group->classes.safe_push (cls);
2326 /* Gets a congruence class group based on given HASH value and TYPE. */
2328 congruence_class_group *
2329 sem_item_optimizer::get_group_by_hash (hashval_t hash, sem_item_type type)
2331 congruence_class_group *item = XNEW (congruence_class_group);
2332 item->hash = hash;
2333 item->type = type;
2335 congruence_class_group **slot = m_classes.find_slot (item, INSERT);
2337 if (*slot)
2338 free (item);
2339 else
2341 item->classes.create (1);
2342 *slot = item;
2345 return *slot;
2348 /* Callgraph removal hook called for a NODE with a custom DATA. */
2350 void
2351 sem_item_optimizer::cgraph_removal_hook (cgraph_node *node, void *data)
2353 sem_item_optimizer *optimizer = (sem_item_optimizer *) data;
2354 optimizer->remove_symtab_node (node);
2357 /* Varpool removal hook called for a NODE with a custom DATA. */
2359 void
2360 sem_item_optimizer::varpool_removal_hook (varpool_node *node, void *data)
2362 sem_item_optimizer *optimizer = (sem_item_optimizer *) data;
2363 optimizer->remove_symtab_node (node);
2366 /* Remove symtab NODE triggered by symtab removal hooks. */
2368 void
2369 sem_item_optimizer::remove_symtab_node (symtab_node *node)
2371 gcc_assert (m_classes.is_empty ());
2373 m_removed_items_set.add (node);
2376 void
2377 sem_item_optimizer::remove_item (sem_item *item)
2379 if (m_symtab_node_map.get (item->node))
2380 m_symtab_node_map.remove (item->node);
2381 delete item;
2384 /* Removes all callgraph and varpool nodes that are marked by symtab
2385 as deleted. */
2387 void
2388 sem_item_optimizer::filter_removed_items (void)
2390 auto_vec <sem_item *> filtered;
2392 for (unsigned int i = 0; i < m_items.length(); i++)
2394 sem_item *item = m_items[i];
2396 if (m_removed_items_set.contains (item->node))
2398 remove_item (item);
2399 continue;
2402 if (item->type == FUNC)
2404 cgraph_node *cnode = static_cast <sem_function *>(item)->get_node ();
2406 if (in_lto_p && (cnode->alias || cnode->body_removed))
2407 remove_item (item);
2408 else
2409 filtered.safe_push (item);
2411 else /* VAR. */
2413 if (!flag_ipa_icf_variables)
2414 remove_item (item);
2415 else
2417 /* Filter out non-readonly variables. */
2418 tree decl = item->decl;
2419 varpool_node *vnode = static_cast <sem_variable *>(item)->get_node ();
2420 if (!TREE_READONLY (decl) || vnode->body_removed)
2421 remove_item (item);
2422 else
2423 filtered.safe_push (item);
2428 /* Clean-up of released semantic items. */
2430 m_items.release ();
2431 for (unsigned int i = 0; i < filtered.length(); i++)
2432 m_items.safe_push (filtered[i]);
2435 /* Optimizer entry point which returns true in case it processes
2436 a merge operation. True is returned if there's a merge operation
2437 processed. */
2439 bool
2440 sem_item_optimizer::execute (void)
2442 filter_removed_items ();
2443 unregister_hooks ();
2445 build_graph ();
2446 update_hash_by_addr_refs ();
2447 update_hash_by_memory_access_type ();
2448 build_hash_based_classes ();
2450 if (dump_file)
2451 fprintf (dump_file, "Dump after hash based groups\n");
2452 dump_cong_classes ();
2454 subdivide_classes_by_equality (true);
2456 if (dump_file)
2457 fprintf (dump_file, "Dump after WPA based types groups\n");
2459 dump_cong_classes ();
2461 process_cong_reduction ();
2462 checking_verify_classes ();
2464 if (dump_file)
2465 fprintf (dump_file, "Dump after callgraph-based congruence reduction\n");
2467 dump_cong_classes ();
2469 unsigned int loaded_symbols = parse_nonsingleton_classes ();
2470 subdivide_classes_by_equality ();
2472 if (dump_file)
2473 fprintf (dump_file, "Dump after full equality comparison of groups\n");
2475 dump_cong_classes ();
2477 unsigned int prev_class_count = m_classes_count;
2479 process_cong_reduction ();
2480 dump_cong_classes ();
2481 checking_verify_classes ();
2482 bool merged_p = merge_classes (prev_class_count, loaded_symbols);
2484 if (dump_file && (dump_flags & TDF_DETAILS))
2485 symtab->dump (dump_file);
2487 return merged_p;
2490 /* Function responsible for visiting all potential functions and
2491 read-only variables that can be merged. */
2493 void
2494 sem_item_optimizer::parse_funcs_and_vars (void)
2496 cgraph_node *cnode;
2498 /* Create dummy func_checker for hashing purpose. */
2499 func_checker checker;
2501 if (flag_ipa_icf_functions)
2502 FOR_EACH_DEFINED_FUNCTION (cnode)
2504 sem_function *f = sem_function::parse (cnode, &m_bmstack, &checker);
2505 if (f)
2507 m_items.safe_push (f);
2508 m_symtab_node_map.put (cnode, f);
2512 varpool_node *vnode;
2514 if (flag_ipa_icf_variables)
2515 FOR_EACH_DEFINED_VARIABLE (vnode)
2517 sem_variable *v = sem_variable::parse (vnode, &m_bmstack, &checker);
2519 if (v)
2521 m_items.safe_push (v);
2522 m_symtab_node_map.put (vnode, v);
2527 /* Makes pairing between a congruence class CLS and semantic ITEM. */
2529 void
2530 sem_item_optimizer::add_item_to_class (congruence_class *cls, sem_item *item)
2532 item->index_in_class = cls->members.length ();
2533 cls->members.safe_push (item);
2534 cls->referenced_by_count += item->referenced_by_count;
2535 item->cls = cls;
2538 /* For each semantic item, append hash values of references. */
2540 void
2541 sem_item_optimizer::update_hash_by_addr_refs ()
2543 /* First, append to hash sensitive references and class type if it need to
2544 be matched for ODR. */
2545 for (unsigned i = 0; i < m_items.length (); i++)
2547 m_items[i]->update_hash_by_addr_refs (m_symtab_node_map);
2548 if (m_items[i]->type == FUNC)
2550 if (TREE_CODE (TREE_TYPE (m_items[i]->decl)) == METHOD_TYPE
2551 && contains_polymorphic_type_p
2552 (TYPE_METHOD_BASETYPE (TREE_TYPE (m_items[i]->decl)))
2553 && (DECL_CXX_CONSTRUCTOR_P (m_items[i]->decl)
2554 || (static_cast<sem_function *> (m_items[i])->param_used_p (0)
2555 && static_cast<sem_function *> (m_items[i])
2556 ->compare_polymorphic_p ())))
2558 tree class_type
2559 = TYPE_METHOD_BASETYPE (TREE_TYPE (m_items[i]->decl));
2560 inchash::hash hstate (m_items[i]->get_hash ());
2562 /* Hash ODR types by mangled name if it is defined.
2563 If not we know that type is anonymous of free_lang_data
2564 was not run and in that case type main variants are
2565 unique. */
2566 if (TYPE_NAME (class_type)
2567 && DECL_ASSEMBLER_NAME_SET_P (TYPE_NAME (class_type))
2568 && !type_in_anonymous_namespace_p
2569 (class_type))
2570 hstate.add_hwi
2571 (IDENTIFIER_HASH_VALUE
2572 (DECL_ASSEMBLER_NAME (TYPE_NAME (class_type))));
2573 else
2575 gcc_checking_assert
2576 (!in_lto_p
2577 || type_in_anonymous_namespace_p (class_type));
2578 hstate.add_hwi (TYPE_UID (TYPE_MAIN_VARIANT (class_type)));
2581 m_items[i]->set_hash (hstate.end ());
2586 /* Once all symbols have enhanced hash value, we can append
2587 hash values of symbols that are seen by IPA ICF and are
2588 references by a semantic item. Newly computed values
2589 are saved to global_hash member variable. */
2590 for (unsigned i = 0; i < m_items.length (); i++)
2591 m_items[i]->update_hash_by_local_refs (m_symtab_node_map);
2593 /* Global hash value replace current hash values. */
2594 for (unsigned i = 0; i < m_items.length (); i++)
2595 m_items[i]->set_hash (m_items[i]->global_hash);
2598 void
2599 sem_item_optimizer::update_hash_by_memory_access_type ()
2601 for (unsigned i = 0; i < m_items.length (); i++)
2603 if (m_items[i]->type == FUNC)
2605 sem_function *fn = static_cast<sem_function *> (m_items[i]);
2606 inchash::hash hstate (fn->get_hash ());
2607 hstate.add_int (fn->m_alias_sets_hash);
2608 fn->set_hash (hstate.end ());
2613 /* Congruence classes are built by hash value. */
2615 void
2616 sem_item_optimizer::build_hash_based_classes (void)
2618 for (unsigned i = 0; i < m_items.length (); i++)
2620 sem_item *item = m_items[i];
2622 congruence_class_group *group
2623 = get_group_by_hash (item->get_hash (), item->type);
2625 if (!group->classes.length ())
2627 m_classes_count++;
2628 group->classes.safe_push (new congruence_class (class_id++));
2631 add_item_to_class (group->classes[0], item);
2635 /* Build references according to call graph. */
2637 void
2638 sem_item_optimizer::build_graph (void)
2640 for (unsigned i = 0; i < m_items.length (); i++)
2642 sem_item *item = m_items[i];
2643 m_symtab_node_map.put (item->node, item);
2645 /* Initialize hash values if we are not in LTO mode. */
2646 if (!in_lto_p)
2647 item->get_hash ();
2650 for (unsigned i = 0; i < m_items.length (); i++)
2652 sem_item *item = m_items[i];
2654 if (item->type == FUNC)
2656 cgraph_node *cnode = dyn_cast <cgraph_node *> (item->node);
2658 cgraph_edge *e = cnode->callees;
2659 while (e)
2661 sem_item **slot = m_symtab_node_map.get
2662 (e->callee->ultimate_alias_target ());
2663 if (slot)
2664 item->add_reference (&m_references, *slot);
2666 e = e->next_callee;
2670 ipa_ref *ref = NULL;
2671 for (unsigned i = 0; item->node->iterate_reference (i, ref); i++)
2673 sem_item **slot = m_symtab_node_map.get
2674 (ref->referred->ultimate_alias_target ());
2675 if (slot)
2676 item->add_reference (&m_references, *slot);
2681 /* Semantic items in classes having more than one element and initialized.
2682 In case of WPA, we load function body. */
2684 unsigned int
2685 sem_item_optimizer::parse_nonsingleton_classes (void)
2687 unsigned int counter = 0;
2689 /* Create dummy func_checker for hashing purpose. */
2690 func_checker checker;
2692 for (unsigned i = 0; i < m_items.length (); i++)
2693 if (m_items[i]->cls->members.length () > 1)
2695 m_items[i]->init (&checker);
2696 ++counter;
2699 if (dump_file)
2701 float f = m_items.length () ? 100.0f * counter / m_items.length () : 0.0f;
2702 fprintf (dump_file, "Init called for %u items (%.2f%%).\n", counter, f);
2705 return counter;
2708 /* Equality function for semantic items is used to subdivide existing
2709 classes. If IN_WPA, fast equality function is invoked. */
2711 void
2712 sem_item_optimizer::subdivide_classes_by_equality (bool in_wpa)
2714 for (hash_table <congruence_class_hash>::iterator it = m_classes.begin ();
2715 it != m_classes.end (); ++it)
2717 unsigned int class_count = (*it)->classes.length ();
2719 for (unsigned i = 0; i < class_count; i++)
2721 congruence_class *c = (*it)->classes[i];
2723 if (c->members.length() > 1)
2725 auto_vec <sem_item *> new_vector;
2727 sem_item *first = c->members[0];
2728 new_vector.safe_push (first);
2730 unsigned class_split_first = (*it)->classes.length ();
2732 for (unsigned j = 1; j < c->members.length (); j++)
2734 sem_item *item = c->members[j];
2736 bool equals
2737 = in_wpa ? first->equals_wpa (item, m_symtab_node_map)
2738 : first->equals (item, m_symtab_node_map);
2740 if (equals)
2741 new_vector.safe_push (item);
2742 else
2744 bool integrated = false;
2746 for (unsigned k = class_split_first;
2747 k < (*it)->classes.length (); k++)
2749 sem_item *x = (*it)->classes[k]->members[0];
2750 bool equals
2751 = in_wpa ? x->equals_wpa (item, m_symtab_node_map)
2752 : x->equals (item, m_symtab_node_map);
2754 if (equals)
2756 integrated = true;
2757 add_item_to_class ((*it)->classes[k], item);
2759 break;
2763 if (!integrated)
2765 congruence_class *c
2766 = new congruence_class (class_id++);
2767 m_classes_count++;
2768 add_item_to_class (c, item);
2770 (*it)->classes.safe_push (c);
2775 // We replace newly created new_vector for the class we've just
2776 // splitted.
2777 c->members.release ();
2778 c->members.create (new_vector.length ());
2780 for (unsigned int j = 0; j < new_vector.length (); j++)
2781 add_item_to_class (c, new_vector[j]);
2786 checking_verify_classes ();
2789 /* Subdivide classes by address references that members of the class
2790 reference. Example can be a pair of functions that have an address
2791 taken from a function. If these addresses are different the class
2792 is split. */
2794 unsigned
2795 sem_item_optimizer::subdivide_classes_by_sensitive_refs ()
2797 typedef hash_map <symbol_compare_hash, vec <sem_item *> > subdivide_hash_map;
2799 unsigned newly_created_classes = 0;
2801 for (hash_table <congruence_class_hash>::iterator it = m_classes.begin ();
2802 it != m_classes.end (); ++it)
2804 unsigned int class_count = (*it)->classes.length ();
2805 auto_vec<congruence_class *> new_classes;
2807 for (unsigned i = 0; i < class_count; i++)
2809 congruence_class *c = (*it)->classes[i];
2811 if (c->members.length() > 1)
2813 subdivide_hash_map split_map;
2815 for (unsigned j = 0; j < c->members.length (); j++)
2817 sem_item *source_node = c->members[j];
2819 symbol_compare_collection *collection
2820 = new symbol_compare_collection (source_node->node);
2822 bool existed;
2823 vec <sem_item *> *slot
2824 = &split_map.get_or_insert (collection, &existed);
2825 gcc_checking_assert (slot);
2827 slot->safe_push (source_node);
2829 if (existed)
2830 delete collection;
2833 /* If the map contains more than one key, we have to split
2834 the map appropriately. */
2835 if (split_map.elements () != 1)
2837 bool first_class = true;
2839 for (subdivide_hash_map::iterator it2 = split_map.begin ();
2840 it2 != split_map.end (); ++it2)
2842 congruence_class *new_cls;
2843 new_cls = new congruence_class (class_id++);
2845 for (unsigned k = 0; k < (*it2).second.length (); k++)
2846 add_item_to_class (new_cls, (*it2).second[k]);
2848 worklist_push (new_cls);
2849 newly_created_classes++;
2851 if (first_class)
2853 (*it)->classes[i] = new_cls;
2854 first_class = false;
2856 else
2858 new_classes.safe_push (new_cls);
2859 m_classes_count++;
2864 /* Release memory. */
2865 for (subdivide_hash_map::iterator it2 = split_map.begin ();
2866 it2 != split_map.end (); ++it2)
2868 delete (*it2).first;
2869 (*it2).second.release ();
2874 for (unsigned i = 0; i < new_classes.length (); i++)
2875 (*it)->classes.safe_push (new_classes[i]);
2878 return newly_created_classes;
2881 /* Verify congruence classes, if checking is enabled. */
2883 void
2884 sem_item_optimizer::checking_verify_classes (void)
2886 if (flag_checking)
2887 verify_classes ();
2890 /* Verify congruence classes. */
2892 void
2893 sem_item_optimizer::verify_classes (void)
2895 for (hash_table<congruence_class_hash>::iterator it = m_classes.begin ();
2896 it != m_classes.end (); ++it)
2898 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
2900 congruence_class *cls = (*it)->classes[i];
2902 gcc_assert (cls);
2903 gcc_assert (cls->members.length () > 0);
2905 for (unsigned int j = 0; j < cls->members.length (); j++)
2907 sem_item *item = cls->members[j];
2909 gcc_assert (item);
2910 gcc_assert (item->cls == cls);
2916 /* Disposes split map traverse function. CLS_PTR is pointer to congruence
2917 class, BSLOT is bitmap slot we want to release. DATA is mandatory,
2918 but unused argument. */
2920 bool
2921 sem_item_optimizer::release_split_map (congruence_class * const &,
2922 bitmap const &b, traverse_split_pair *)
2924 bitmap bmp = b;
2926 BITMAP_FREE (bmp);
2928 return true;
2931 /* Process split operation for a class given as pointer CLS_PTR,
2932 where bitmap B splits congruence class members. DATA is used
2933 as argument of split pair. */
2935 bool
2936 sem_item_optimizer::traverse_congruence_split (congruence_class * const &cls,
2937 bitmap const &b,
2938 traverse_split_pair *pair)
2940 sem_item_optimizer *optimizer = pair->optimizer;
2941 const congruence_class *splitter_cls = pair->cls;
2943 /* If counted bits are greater than zero and less than the number of members
2944 a group will be splitted. */
2945 unsigned popcount = bitmap_count_bits (b);
2947 if (popcount > 0 && popcount < cls->members.length ())
2949 auto_vec <congruence_class *, 2> newclasses;
2950 newclasses.quick_push (new congruence_class (class_id++));
2951 newclasses.quick_push (new congruence_class (class_id++));
2953 for (unsigned int i = 0; i < cls->members.length (); i++)
2955 int target = bitmap_bit_p (b, i);
2956 congruence_class *tc = newclasses[target];
2958 add_item_to_class (tc, cls->members[i]);
2961 if (flag_checking)
2963 for (unsigned int i = 0; i < 2; i++)
2964 gcc_assert (newclasses[i]->members.length ());
2967 if (splitter_cls == cls)
2968 optimizer->splitter_class_removed = true;
2970 /* Remove old class from worklist if presented. */
2971 bool in_worklist = cls->in_worklist;
2973 if (in_worklist)
2974 cls->in_worklist = false;
2976 congruence_class_group g;
2977 g.hash = cls->members[0]->get_hash ();
2978 g.type = cls->members[0]->type;
2980 congruence_class_group *slot = optimizer->m_classes.find (&g);
2982 for (unsigned int i = 0; i < slot->classes.length (); i++)
2983 if (slot->classes[i] == cls)
2985 slot->classes.ordered_remove (i);
2986 break;
2989 /* New class will be inserted and integrated to work list. */
2990 for (unsigned int i = 0; i < 2; i++)
2991 optimizer->add_class (newclasses[i]);
2993 /* Two classes replace one, so that increment just by one. */
2994 optimizer->m_classes_count++;
2996 /* If OLD class was presented in the worklist, we remove the class
2997 and replace it will both newly created classes. */
2998 if (in_worklist)
2999 for (unsigned int i = 0; i < 2; i++)
3000 optimizer->worklist_push (newclasses[i]);
3001 else /* Just smaller class is inserted. */
3003 unsigned int smaller_index
3004 = (newclasses[0]->members.length ()
3005 < newclasses[1]->members.length ()
3006 ? 0 : 1);
3007 optimizer->worklist_push (newclasses[smaller_index]);
3010 if (dump_file && (dump_flags & TDF_DETAILS))
3012 fprintf (dump_file, " congruence class splitted:\n");
3013 cls->dump (dump_file, 4);
3015 fprintf (dump_file, " newly created groups:\n");
3016 for (unsigned int i = 0; i < 2; i++)
3017 newclasses[i]->dump (dump_file, 4);
3020 /* Release class if not presented in work list. */
3021 if (!in_worklist)
3022 delete cls;
3024 return true;
3027 return false;
3030 /* Compare function for sorting pairs in do_congruence_step_f. */
3033 sem_item_optimizer::sort_congruence_split (const void *a_, const void *b_)
3035 const std::pair<congruence_class *, bitmap> *a
3036 = (const std::pair<congruence_class *, bitmap> *)a_;
3037 const std::pair<congruence_class *, bitmap> *b
3038 = (const std::pair<congruence_class *, bitmap> *)b_;
3039 if (a->first->id < b->first->id)
3040 return -1;
3041 else if (a->first->id > b->first->id)
3042 return 1;
3043 return 0;
3046 /* Tests if a class CLS used as INDEXth splits any congruence classes.
3047 Bitmap stack BMSTACK is used for bitmap allocation. */
3049 bool
3050 sem_item_optimizer::do_congruence_step_for_index (congruence_class *cls,
3051 unsigned int index)
3053 hash_map <congruence_class *, bitmap> split_map;
3055 for (unsigned int i = 0; i < cls->members.length (); i++)
3057 sem_item *item = cls->members[i];
3058 sem_usage_pair needle (item, index);
3059 vec<sem_item *> *callers = m_references.get (&needle);
3060 if (callers == NULL)
3061 continue;
3063 for (unsigned int j = 0; j < callers->length (); j++)
3065 sem_item *caller = (*callers)[j];
3066 if (caller->cls->members.length () < 2)
3067 continue;
3068 bitmap *slot = split_map.get (caller->cls);
3069 bitmap b;
3071 if(!slot)
3073 b = BITMAP_ALLOC (&m_bmstack);
3074 split_map.put (caller->cls, b);
3076 else
3077 b = *slot;
3079 gcc_checking_assert (caller->cls);
3080 gcc_checking_assert (caller->index_in_class
3081 < caller->cls->members.length ());
3083 bitmap_set_bit (b, caller->index_in_class);
3087 auto_vec<std::pair<congruence_class *, bitmap> > to_split;
3088 to_split.reserve_exact (split_map.elements ());
3089 for (hash_map <congruence_class *, bitmap>::iterator i = split_map.begin ();
3090 i != split_map.end (); ++i)
3091 to_split.safe_push (*i);
3092 to_split.qsort (sort_congruence_split);
3094 traverse_split_pair pair;
3095 pair.optimizer = this;
3096 pair.cls = cls;
3098 splitter_class_removed = false;
3099 bool r = false;
3100 for (unsigned i = 0; i < to_split.length (); ++i)
3101 r |= traverse_congruence_split (to_split[i].first, to_split[i].second,
3102 &pair);
3104 /* Bitmap clean-up. */
3105 split_map.traverse <traverse_split_pair *,
3106 sem_item_optimizer::release_split_map> (NULL);
3108 return r;
3111 /* Every usage of a congruence class CLS is a candidate that can split the
3112 collection of classes. Bitmap stack BMSTACK is used for bitmap
3113 allocation. */
3115 void
3116 sem_item_optimizer::do_congruence_step (congruence_class *cls)
3118 bitmap_iterator bi;
3119 unsigned int i;
3121 bitmap usage = BITMAP_ALLOC (&m_bmstack);
3123 for (unsigned int i = 0; i < cls->members.length (); i++)
3124 bitmap_ior_into (usage, cls->members[i]->usage_index_bitmap);
3126 EXECUTE_IF_SET_IN_BITMAP (usage, 0, i, bi)
3128 if (dump_file && (dump_flags & TDF_DETAILS))
3129 fprintf (dump_file, " processing congruence step for class: %u "
3130 "(%u items, %u references), index: %u\n", cls->id,
3131 cls->referenced_by_count, cls->members.length (), i);
3132 do_congruence_step_for_index (cls, i);
3134 if (splitter_class_removed)
3135 break;
3138 BITMAP_FREE (usage);
3141 /* Adds a newly created congruence class CLS to worklist. */
3143 void
3144 sem_item_optimizer::worklist_push (congruence_class *cls)
3146 /* Return if the class CLS is already presented in work list. */
3147 if (cls->in_worklist)
3148 return;
3150 cls->in_worklist = true;
3151 worklist.insert (cls->referenced_by_count, cls);
3154 /* Pops a class from worklist. */
3156 congruence_class *
3157 sem_item_optimizer::worklist_pop (void)
3159 congruence_class *cls;
3161 while (!worklist.empty ())
3163 cls = worklist.extract_min ();
3164 if (cls->in_worklist)
3166 cls->in_worklist = false;
3168 return cls;
3170 else
3172 /* Work list item was already intended to be removed.
3173 The only reason for doing it is to split a class.
3174 Thus, the class CLS is deleted. */
3175 delete cls;
3179 return NULL;
3182 /* Iterative congruence reduction function. */
3184 void
3185 sem_item_optimizer::process_cong_reduction (void)
3187 for (hash_table<congruence_class_hash>::iterator it = m_classes.begin ();
3188 it != m_classes.end (); ++it)
3189 for (unsigned i = 0; i < (*it)->classes.length (); i++)
3190 if ((*it)->classes[i]->is_class_used ())
3191 worklist_push ((*it)->classes[i]);
3193 if (dump_file)
3194 fprintf (dump_file, "Worklist has been filled with: %lu\n",
3195 (unsigned long) worklist.nodes ());
3197 if (dump_file && (dump_flags & TDF_DETAILS))
3198 fprintf (dump_file, "Congruence class reduction\n");
3200 congruence_class *cls;
3202 /* Process complete congruence reduction. */
3203 while ((cls = worklist_pop ()) != NULL)
3204 do_congruence_step (cls);
3206 /* Subdivide newly created classes according to references. */
3207 unsigned new_classes = subdivide_classes_by_sensitive_refs ();
3209 if (dump_file)
3210 fprintf (dump_file, "Address reference subdivision created: %u "
3211 "new classes.\n", new_classes);
3214 /* Debug function prints all informations about congruence classes. */
3216 void
3217 sem_item_optimizer::dump_cong_classes (void)
3219 if (!dump_file)
3220 return;
3222 /* Histogram calculation. */
3223 unsigned int max_index = 0;
3224 unsigned int single_element_classes = 0;
3225 unsigned int* histogram = XCNEWVEC (unsigned int, m_items.length () + 1);
3227 for (hash_table<congruence_class_hash>::iterator it = m_classes.begin ();
3228 it != m_classes.end (); ++it)
3229 for (unsigned i = 0; i < (*it)->classes.length (); i++)
3231 unsigned int c = (*it)->classes[i]->members.length ();
3232 histogram[c]++;
3234 if (c > max_index)
3235 max_index = c;
3237 if (c == 1)
3238 ++single_element_classes;
3241 fprintf (dump_file,
3242 "Congruence classes: %lu with total: %u items (in a non-singular "
3243 "class: %u)\n", (unsigned long) m_classes.elements (),
3244 m_items.length (), m_items.length () - single_element_classes);
3245 fprintf (dump_file,
3246 "Class size histogram [number of members]: number of classes\n");
3247 for (unsigned int i = 0; i <= max_index; i++)
3248 if (histogram[i])
3249 fprintf (dump_file, "%6u: %6u\n", i, histogram[i]);
3251 if (dump_flags & TDF_DETAILS)
3252 for (hash_table<congruence_class_hash>::iterator it = m_classes.begin ();
3253 it != m_classes.end (); ++it)
3255 fprintf (dump_file, " group: with %u classes:\n",
3256 (*it)->classes.length ());
3258 for (unsigned i = 0; i < (*it)->classes.length (); i++)
3260 (*it)->classes[i]->dump (dump_file, 4);
3262 if (i < (*it)->classes.length () - 1)
3263 fprintf (dump_file, " ");
3267 free (histogram);
3270 /* Sort pair of sem_items A and B by DECL_UID. */
3272 static int
3273 sort_sem_items_by_decl_uid (const void *a, const void *b)
3275 const sem_item *i1 = *(const sem_item * const *)a;
3276 const sem_item *i2 = *(const sem_item * const *)b;
3278 int uid1 = DECL_UID (i1->decl);
3279 int uid2 = DECL_UID (i2->decl);
3280 return uid1 - uid2;
3283 /* Sort pair of congruence_classes A and B by DECL_UID of the first member. */
3285 static int
3286 sort_congruence_classes_by_decl_uid (const void *a, const void *b)
3288 const congruence_class *c1 = *(const congruence_class * const *)a;
3289 const congruence_class *c2 = *(const congruence_class * const *)b;
3291 int uid1 = DECL_UID (c1->members[0]->decl);
3292 int uid2 = DECL_UID (c2->members[0]->decl);
3293 return uid1 - uid2;
3296 /* Sort pair of congruence_class_groups A and B by
3297 DECL_UID of the first member of a first group. */
3299 static int
3300 sort_congruence_class_groups_by_decl_uid (const void *a, const void *b)
3302 const std::pair<congruence_class_group *, int> *g1
3303 = (const std::pair<congruence_class_group *, int> *) a;
3304 const std::pair<congruence_class_group *, int> *g2
3305 = (const std::pair<congruence_class_group *, int> *) b;
3306 return g1->second - g2->second;
3309 /* After reduction is done, we can declare all items in a group
3310 to be equal. PREV_CLASS_COUNT is start number of classes
3311 before reduction. True is returned if there's a merge operation
3312 processed. LOADED_SYMBOLS is number of symbols that were loaded
3313 in WPA. */
3315 bool
3316 sem_item_optimizer::merge_classes (unsigned int prev_class_count,
3317 unsigned int loaded_symbols)
3319 unsigned int item_count = m_items.length ();
3320 unsigned int class_count = m_classes_count;
3321 unsigned int equal_items = item_count - class_count;
3323 unsigned int non_singular_classes_count = 0;
3324 unsigned int non_singular_classes_sum = 0;
3326 bool merged_p = false;
3328 /* PR lto/78211
3329 Sort functions in congruence classes by DECL_UID and do the same
3330 for the classes to not to break -fcompare-debug. */
3332 for (hash_table<congruence_class_hash>::iterator it = m_classes.begin ();
3333 it != m_classes.end (); ++it)
3335 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
3337 congruence_class *c = (*it)->classes[i];
3338 c->members.qsort (sort_sem_items_by_decl_uid);
3341 (*it)->classes.qsort (sort_congruence_classes_by_decl_uid);
3344 for (hash_table<congruence_class_hash>::iterator it = m_classes.begin ();
3345 it != m_classes.end (); ++it)
3346 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
3348 congruence_class *c = (*it)->classes[i];
3349 if (c->members.length () > 1)
3351 non_singular_classes_count++;
3352 non_singular_classes_sum += c->members.length ();
3356 auto_vec<std::pair<congruence_class_group *, int> > classes (
3357 m_classes.elements ());
3358 for (hash_table<congruence_class_hash>::iterator it = m_classes.begin ();
3359 it != m_classes.end (); ++it)
3361 int uid = DECL_UID ((*it)->classes[0]->members[0]->decl);
3362 classes.quick_push (std::pair<congruence_class_group *, int> (*it, uid));
3365 classes.qsort (sort_congruence_class_groups_by_decl_uid);
3367 if (dump_file)
3369 fprintf (dump_file, "\nItem count: %u\n", item_count);
3370 fprintf (dump_file, "Congruent classes before: %u, after: %u\n",
3371 prev_class_count, class_count);
3372 fprintf (dump_file, "Average class size before: %.2f, after: %.2f\n",
3373 prev_class_count ? 1.0f * item_count / prev_class_count : 0.0f,
3374 class_count ? 1.0f * item_count / class_count : 0.0f);
3375 fprintf (dump_file, "Average non-singular class size: %.2f, count: %u\n",
3376 non_singular_classes_count ? 1.0f * non_singular_classes_sum /
3377 non_singular_classes_count : 0.0f,
3378 non_singular_classes_count);
3379 fprintf (dump_file, "Equal symbols: %u\n", equal_items);
3380 unsigned total = equal_items + non_singular_classes_count;
3381 fprintf (dump_file, "Totally needed symbols: %u"
3382 ", fraction of loaded symbols: %.2f%%\n\n", total,
3383 loaded_symbols ? 100.0f * total / loaded_symbols: 0.0f);
3386 unsigned int l;
3387 std::pair<congruence_class_group *, int> *it;
3388 FOR_EACH_VEC_ELT (classes, l, it)
3389 for (unsigned int i = 0; i < it->first->classes.length (); i++)
3391 congruence_class *c = it->first->classes[i];
3393 if (c->members.length () == 1)
3394 continue;
3396 sem_item *source = c->members[0];
3398 if (DECL_NAME (source->decl)
3399 && MAIN_NAME_P (DECL_NAME (source->decl)))
3400 /* If merge via wrappers, picking main as the target can be
3401 problematic. */
3402 source = c->members[1];
3404 for (unsigned int j = 0; j < c->members.length (); j++)
3406 sem_item *alias = c->members[j];
3408 if (alias == source)
3409 continue;
3411 dump_user_location_t loc
3412 = dump_user_location_t::from_function_decl (source->decl);
3413 if (dump_enabled_p ())
3415 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc,
3416 "Semantic equality hit:%s->%s\n",
3417 source->node->dump_name (),
3418 alias->node->dump_name ());
3419 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc,
3420 "Assembler symbol names:%s->%s\n",
3421 source->node->dump_asm_name (),
3422 alias->node->dump_asm_name ());
3425 if (lookup_attribute ("no_icf", DECL_ATTRIBUTES (alias->decl))
3426 || lookup_attribute ("no_icf", DECL_ATTRIBUTES (source->decl)))
3428 if (dump_enabled_p ())
3429 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc,
3430 "Merge operation is skipped due to no_icf "
3431 "attribute.\n");
3432 continue;
3435 if (dump_file && (dump_flags & TDF_DETAILS))
3437 source->dump_to_file (dump_file);
3438 alias->dump_to_file (dump_file);
3441 if (dbg_cnt (merged_ipa_icf))
3443 bool merged = source->merge (alias);
3444 merged_p |= merged;
3446 if (merged && alias->type == VAR)
3448 symtab_pair p = symtab_pair (source->node, alias->node);
3449 m_merged_variables.safe_push (p);
3455 if (!m_merged_variables.is_empty ())
3456 fixup_points_to_sets ();
3458 return merged_p;
3461 /* Fixup points to set PT. */
3463 void
3464 sem_item_optimizer::fixup_pt_set (struct pt_solution *pt)
3466 if (pt->vars == NULL)
3467 return;
3469 unsigned i;
3470 symtab_pair *item;
3471 FOR_EACH_VEC_ELT (m_merged_variables, i, item)
3472 if (bitmap_bit_p (pt->vars, DECL_UID (item->second->decl)))
3473 bitmap_set_bit (pt->vars, DECL_UID (item->first->decl));
3476 /* Set all points-to UIDs of aliases pointing to node N as UID. */
3478 static void
3479 set_alias_uids (symtab_node *n, int uid)
3481 ipa_ref *ref;
3482 FOR_EACH_ALIAS (n, ref)
3484 if (dump_file)
3485 fprintf (dump_file, " Setting points-to UID of [%s] as %d\n",
3486 ref->referring->dump_asm_name (), uid);
3488 SET_DECL_PT_UID (ref->referring->decl, uid);
3489 set_alias_uids (ref->referring, uid);
3493 /* Fixup points to analysis info. */
3495 void
3496 sem_item_optimizer::fixup_points_to_sets (void)
3498 /* TODO: remove in GCC 9 and trigger PTA re-creation after IPA passes. */
3499 cgraph_node *cnode;
3501 FOR_EACH_DEFINED_FUNCTION (cnode)
3503 tree name;
3504 unsigned i;
3505 function *fn = DECL_STRUCT_FUNCTION (cnode->decl);
3506 if (!gimple_in_ssa_p (fn))
3507 continue;
3509 FOR_EACH_SSA_NAME (i, name, fn)
3510 if (POINTER_TYPE_P (TREE_TYPE (name))
3511 && SSA_NAME_PTR_INFO (name))
3512 fixup_pt_set (&SSA_NAME_PTR_INFO (name)->pt);
3513 fixup_pt_set (&fn->gimple_df->escaped);
3514 fixup_pt_set (&fn->gimple_df->escaped_return);
3516 /* The above gets us to 99% I guess, at least catching the
3517 address compares. Below also gets us aliasing correct
3518 but as said we're giving leeway to the situation with
3519 readonly vars anyway, so ... */
3520 basic_block bb;
3521 FOR_EACH_BB_FN (bb, fn)
3522 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
3523 gsi_next (&gsi))
3525 gcall *call = dyn_cast<gcall *> (gsi_stmt (gsi));
3526 if (call)
3528 fixup_pt_set (gimple_call_use_set (call));
3529 fixup_pt_set (gimple_call_clobber_set (call));
3534 unsigned i;
3535 symtab_pair *item;
3536 FOR_EACH_VEC_ELT (m_merged_variables, i, item)
3537 set_alias_uids (item->first, DECL_UID (item->first->decl));
3540 /* Dump function prints all class members to a FILE with an INDENT. */
3542 void
3543 congruence_class::dump (FILE *file, unsigned int indent) const
3545 FPRINTF_SPACES (file, indent, "class with id: %u, hash: %u, items: %u\n",
3546 id, members[0]->get_hash (), members.length ());
3548 FPUTS_SPACES (file, indent + 2, "");
3549 for (unsigned i = 0; i < members.length (); i++)
3550 fprintf (file, "%s ", members[i]->node->dump_asm_name ());
3552 fprintf (file, "\n");
3555 /* Returns true if there's a member that is used from another group. */
3557 bool
3558 congruence_class::is_class_used (void)
3560 for (unsigned int i = 0; i < members.length (); i++)
3561 if (members[i]->referenced_by_count)
3562 return true;
3564 return false;
3567 /* Generate pass summary for IPA ICF pass. */
3569 static void
3570 ipa_icf_generate_summary (void)
3572 if (!optimizer)
3573 optimizer = new sem_item_optimizer ();
3575 optimizer->register_hooks ();
3576 optimizer->parse_funcs_and_vars ();
3579 /* Write pass summary for IPA ICF pass. */
3581 static void
3582 ipa_icf_write_summary (void)
3584 gcc_assert (optimizer);
3586 optimizer->write_summary ();
3589 /* Read pass summary for IPA ICF pass. */
3591 static void
3592 ipa_icf_read_summary (void)
3594 if (!optimizer)
3595 optimizer = new sem_item_optimizer ();
3597 optimizer->read_summary ();
3598 optimizer->register_hooks ();
3601 /* Semantic equality execution function. */
3603 static unsigned int
3604 ipa_icf_driver (void)
3606 gcc_assert (optimizer);
3608 bool merged_p = optimizer->execute ();
3610 delete optimizer;
3611 optimizer = NULL;
3613 return merged_p ? TODO_remove_functions : 0;
3616 const pass_data pass_data_ipa_icf =
3618 IPA_PASS, /* type */
3619 "icf", /* name */
3620 OPTGROUP_IPA, /* optinfo_flags */
3621 TV_IPA_ICF, /* tv_id */
3622 0, /* properties_required */
3623 0, /* properties_provided */
3624 0, /* properties_destroyed */
3625 0, /* todo_flags_start */
3626 0, /* todo_flags_finish */
3629 class pass_ipa_icf : public ipa_opt_pass_d
3631 public:
3632 pass_ipa_icf (gcc::context *ctxt)
3633 : ipa_opt_pass_d (pass_data_ipa_icf, ctxt,
3634 ipa_icf_generate_summary, /* generate_summary */
3635 ipa_icf_write_summary, /* write_summary */
3636 ipa_icf_read_summary, /* read_summary */
3637 NULL, /*
3638 write_optimization_summary */
3639 NULL, /*
3640 read_optimization_summary */
3641 NULL, /* stmt_fixup */
3642 0, /* function_transform_todo_flags_start */
3643 NULL, /* function_transform */
3644 NULL) /* variable_transform */
3647 /* opt_pass methods: */
3648 bool gate (function *) final override
3650 return in_lto_p || flag_ipa_icf_variables || flag_ipa_icf_functions;
3653 unsigned int execute (function *) final override
3655 return ipa_icf_driver();
3657 }; // class pass_ipa_icf
3659 } // ipa_icf namespace
3661 ipa_opt_pass_d *
3662 make_pass_ipa_icf (gcc::context *ctxt)
3664 return new ipa_icf::pass_ipa_icf (ctxt);