typeck.c (cp_truthvalue_conversion): Add tsubst_flags_t parameter and use it in calls...
[official-gcc.git] / gcc / ipa-icf.c
blob15aac1cdbe690a56d03ded8b00785331f44d7073
1 /* Interprocedural Identical Code Folding pass
2 Copyright (C) 2014-2019 Free Software Foundation, Inc.
4 Contributed by Jan Hubicka <hubicka@ucw.cz> and Martin Liska <mliska@suse.cz>
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
22 /* Interprocedural Identical Code Folding for functions and
23 read-only variables.
25 The goal of this transformation is to discover functions and read-only
26 variables which do have exactly the same semantics.
28 In case of functions,
29 we could either create a virtual clone or do a simple function wrapper
30 that will call equivalent function. If the function is just locally visible,
31 all function calls can be redirected. For read-only variables, we create
32 aliases if possible.
34 Optimization pass arranges as follows:
35 1) All functions and read-only variables are visited and internal
36 data structure, either sem_function or sem_variables is created.
37 2) For every symbol from the previous step, VAR_DECL and FUNCTION_DECL are
38 saved and matched to corresponding sem_items.
39 3) These declaration are ignored for equality check and are solved
40 by Value Numbering algorithm published by Alpert, Zadeck in 1992.
41 4) We compute hash value for each symbol.
42 5) Congruence classes are created based on hash value. If hash value are
43 equal, equals function is called and symbols are deeply compared.
44 We must prove that all SSA names, declarations and other items
45 correspond.
46 6) Value Numbering is executed for these classes. At the end of the process
47 all symbol members in remaining classes can be merged.
48 7) Merge operation creates alias in case of read-only variables. For
49 callgraph node, we must decide if we can redirect local calls,
50 create an alias or a thunk.
54 #include "config.h"
55 #include "system.h"
56 #include "coretypes.h"
57 #include "backend.h"
58 #include "target.h"
59 #include "rtl.h"
60 #include "tree.h"
61 #include "gimple.h"
62 #include "alloc-pool.h"
63 #include "tree-pass.h"
64 #include "ssa.h"
65 #include "cgraph.h"
66 #include "coverage.h"
67 #include "gimple-pretty-print.h"
68 #include "data-streamer.h"
69 #include "fold-const.h"
70 #include "calls.h"
71 #include "varasm.h"
72 #include "gimple-iterator.h"
73 #include "tree-cfg.h"
74 #include "symbol-summary.h"
75 #include "ipa-prop.h"
76 #include "ipa-fnsummary.h"
77 #include "except.h"
78 #include "attribs.h"
79 #include "print-tree.h"
80 #include "ipa-utils.h"
81 #include "ipa-icf-gimple.h"
82 #include "fibonacci_heap.h"
83 #include "ipa-icf.h"
84 #include "stor-layout.h"
85 #include "dbgcnt.h"
86 #include "tree-vector-builder.h"
88 using namespace ipa_icf_gimple;
90 namespace ipa_icf {
92 /* Initialization and computation of symtab node hash, there data
93 are propagated later on. */
95 static sem_item_optimizer *optimizer = NULL;
97 /* Constructor. */
99 symbol_compare_collection::symbol_compare_collection (symtab_node *node)
101 m_references.create (0);
102 m_interposables.create (0);
104 ipa_ref *ref;
106 if (is_a <varpool_node *> (node) && DECL_VIRTUAL_P (node->decl))
107 return;
109 for (unsigned i = 0; node->iterate_reference (i, ref); i++)
111 if (ref->address_matters_p ())
112 m_references.safe_push (ref->referred);
114 if (ref->referred->get_availability () <= AVAIL_INTERPOSABLE)
116 if (ref->address_matters_p ())
117 m_references.safe_push (ref->referred);
118 else
119 m_interposables.safe_push (ref->referred);
123 if (is_a <cgraph_node *> (node))
125 cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
127 for (cgraph_edge *e = cnode->callees; e; e = e->next_callee)
128 if (e->callee->get_availability () <= AVAIL_INTERPOSABLE)
129 m_interposables.safe_push (e->callee);
133 /* Constructor for key value pair, where _ITEM is key and _INDEX is a target. */
135 sem_usage_pair::sem_usage_pair (sem_item *_item, unsigned int _index)
136 : item (_item), index (_index)
140 sem_item::sem_item (sem_item_type _type, bitmap_obstack *stack)
141 : type (_type), referenced_by_count (0), m_hash (-1), m_hash_set (false)
143 setup (stack);
146 sem_item::sem_item (sem_item_type _type, symtab_node *_node,
147 bitmap_obstack *stack)
148 : type (_type), node (_node), referenced_by_count (0), m_hash (-1),
149 m_hash_set (false)
151 decl = node->decl;
152 setup (stack);
155 /* Add reference to a semantic TARGET. */
157 void
158 sem_item::add_reference (ref_map *refs,
159 sem_item *target)
161 unsigned index = reference_count++;
162 bool existed;
164 vec<sem_item *> &v
165 = refs->get_or_insert (new sem_usage_pair (target, index), &existed);
166 v.safe_push (this);
167 bitmap_set_bit (target->usage_index_bitmap, index);
168 refs_set.add (target->node);
169 ++target->referenced_by_count;
172 /* Initialize internal data structures. Bitmap STACK is used for
173 bitmap memory allocation process. */
175 void
176 sem_item::setup (bitmap_obstack *stack)
178 gcc_checking_assert (node);
180 reference_count = 0;
181 tree_refs.create (0);
182 usage_index_bitmap = BITMAP_ALLOC (stack);
185 sem_item::~sem_item ()
187 tree_refs.release ();
189 BITMAP_FREE (usage_index_bitmap);
192 /* Dump function for debugging purpose. */
194 DEBUG_FUNCTION void
195 sem_item::dump (void)
197 if (dump_file)
199 fprintf (dump_file, "[%s] %s (tree:%p)\n", type == FUNC ? "func" : "var",
200 node->dump_name (), (void *) node->decl);
201 fprintf (dump_file, " hash: %u\n", get_hash ());
205 /* Return true if target supports alias symbols. */
207 bool
208 sem_item::target_supports_symbol_aliases_p (void)
210 #if !defined (ASM_OUTPUT_DEF) || (!defined(ASM_OUTPUT_WEAK_ALIAS) && !defined (ASM_WEAKEN_DECL))
211 return false;
212 #else
213 return true;
214 #endif
217 void sem_item::set_hash (hashval_t hash)
219 m_hash = hash;
220 m_hash_set = true;
223 hash_map<const_tree, hashval_t> sem_item::m_type_hash_cache;
225 /* Semantic function constructor that uses STACK as bitmap memory stack. */
227 sem_function::sem_function (bitmap_obstack *stack)
228 : sem_item (FUNC, stack), m_checker (NULL), m_compared_func (NULL)
230 bb_sizes.create (0);
231 bb_sorted.create (0);
234 sem_function::sem_function (cgraph_node *node, bitmap_obstack *stack)
235 : sem_item (FUNC, node, stack), m_checker (NULL), m_compared_func (NULL)
237 bb_sizes.create (0);
238 bb_sorted.create (0);
241 sem_function::~sem_function ()
243 for (unsigned i = 0; i < bb_sorted.length (); i++)
244 delete (bb_sorted[i]);
246 bb_sizes.release ();
247 bb_sorted.release ();
250 /* Calculates hash value based on a BASIC_BLOCK. */
252 hashval_t
253 sem_function::get_bb_hash (const sem_bb *basic_block)
255 inchash::hash hstate;
257 hstate.add_int (basic_block->nondbg_stmt_count);
258 hstate.add_int (basic_block->edge_count);
260 return hstate.end ();
263 /* References independent hash function. */
265 hashval_t
266 sem_function::get_hash (void)
268 if (!m_hash_set)
270 inchash::hash hstate;
271 hstate.add_int (177454); /* Random number for function type. */
273 hstate.add_int (arg_count);
274 hstate.add_int (cfg_checksum);
275 hstate.add_int (gcode_hash);
277 for (unsigned i = 0; i < bb_sorted.length (); i++)
278 hstate.merge_hash (get_bb_hash (bb_sorted[i]));
280 for (unsigned i = 0; i < bb_sizes.length (); i++)
281 hstate.add_int (bb_sizes[i]);
283 /* Add common features of declaration itself. */
284 if (DECL_FUNCTION_SPECIFIC_TARGET (decl))
285 hstate.add_hwi
286 (cl_target_option_hash
287 (TREE_TARGET_OPTION (DECL_FUNCTION_SPECIFIC_TARGET (decl))));
288 if (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (decl))
289 hstate.add_hwi
290 (cl_optimization_hash
291 (TREE_OPTIMIZATION (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (decl))));
292 hstate.add_flag (DECL_CXX_CONSTRUCTOR_P (decl));
293 hstate.add_flag (DECL_CXX_DESTRUCTOR_P (decl));
295 set_hash (hstate.end ());
298 return m_hash;
301 /* Compare properties of symbols N1 and N2 that does not affect semantics of
302 symbol itself but affects semantics of its references from USED_BY (which
303 may be NULL if it is unknown). If comparsion is false, symbols
304 can still be merged but any symbols referring them can't.
306 If ADDRESS is true, do extra checking needed for IPA_REF_ADDR.
308 TODO: We can also split attributes to those that determine codegen of
309 a function body/variable constructor itself and those that are used when
310 referring to it. */
312 bool
313 sem_item::compare_referenced_symbol_properties (symtab_node *used_by,
314 symtab_node *n1,
315 symtab_node *n2,
316 bool address)
318 if (is_a <cgraph_node *> (n1))
320 /* Inline properties matters: we do now want to merge uses of inline
321 function to uses of normal function because inline hint would be lost.
322 We however can merge inline function to noinline because the alias
323 will keep its DECL_DECLARED_INLINE flag.
325 Also ignore inline flag when optimizing for size or when function
326 is known to not be inlinable.
328 TODO: the optimize_size checks can also be assumed to be true if
329 unit has no !optimize_size functions. */
331 if ((!used_by || address || !is_a <cgraph_node *> (used_by)
332 || !opt_for_fn (used_by->decl, optimize_size))
333 && !opt_for_fn (n1->decl, optimize_size)
334 && n1->get_availability () > AVAIL_INTERPOSABLE
335 && (!DECL_UNINLINABLE (n1->decl) || !DECL_UNINLINABLE (n2->decl)))
337 if (DECL_DISREGARD_INLINE_LIMITS (n1->decl)
338 != DECL_DISREGARD_INLINE_LIMITS (n2->decl))
339 return return_false_with_msg
340 ("DECL_DISREGARD_INLINE_LIMITS are different");
342 if (DECL_DECLARED_INLINE_P (n1->decl)
343 != DECL_DECLARED_INLINE_P (n2->decl))
344 return return_false_with_msg ("inline attributes are different");
347 if (DECL_IS_OPERATOR_NEW_P (n1->decl)
348 != DECL_IS_OPERATOR_NEW_P (n2->decl))
349 return return_false_with_msg ("operator new flags are different");
352 /* Merging two definitions with a reference to equivalent vtables, but
353 belonging to a different type may result in ipa-polymorphic-call analysis
354 giving a wrong answer about the dynamic type of instance. */
355 if (is_a <varpool_node *> (n1))
357 if ((DECL_VIRTUAL_P (n1->decl) || DECL_VIRTUAL_P (n2->decl))
358 && (DECL_VIRTUAL_P (n1->decl) != DECL_VIRTUAL_P (n2->decl)
359 || !types_must_be_same_for_odr (DECL_CONTEXT (n1->decl),
360 DECL_CONTEXT (n2->decl)))
361 && (!used_by || !is_a <cgraph_node *> (used_by) || address
362 || opt_for_fn (used_by->decl, flag_devirtualize)))
363 return return_false_with_msg
364 ("references to virtual tables cannot be merged");
366 if (address && DECL_ALIGN (n1->decl) != DECL_ALIGN (n2->decl))
367 return return_false_with_msg ("alignment mismatch");
369 /* For functions we compare attributes in equals_wpa, because we do
370 not know what attributes may cause codegen differences, but for
371 variables just compare attributes for references - the codegen
372 for constructors is affected only by those attributes that we lower
373 to explicit representation (such as DECL_ALIGN or DECL_SECTION). */
374 if (!attribute_list_equal (DECL_ATTRIBUTES (n1->decl),
375 DECL_ATTRIBUTES (n2->decl)))
376 return return_false_with_msg ("different var decl attributes");
377 if (comp_type_attributes (TREE_TYPE (n1->decl),
378 TREE_TYPE (n2->decl)) != 1)
379 return return_false_with_msg ("different var type attributes");
382 /* When matching virtual tables, be sure to also match information
383 relevant for polymorphic call analysis. */
384 if (used_by && is_a <varpool_node *> (used_by)
385 && DECL_VIRTUAL_P (used_by->decl))
387 if (DECL_VIRTUAL_P (n1->decl) != DECL_VIRTUAL_P (n2->decl))
388 return return_false_with_msg ("virtual flag mismatch");
389 if (DECL_VIRTUAL_P (n1->decl) && is_a <cgraph_node *> (n1)
390 && (DECL_FINAL_P (n1->decl) != DECL_FINAL_P (n2->decl)))
391 return return_false_with_msg ("final flag mismatch");
393 return true;
396 /* Hash properties that are compared by compare_referenced_symbol_properties. */
398 void
399 sem_item::hash_referenced_symbol_properties (symtab_node *ref,
400 inchash::hash &hstate,
401 bool address)
403 if (is_a <cgraph_node *> (ref))
405 if ((type != FUNC || address || !opt_for_fn (decl, optimize_size))
406 && !opt_for_fn (ref->decl, optimize_size)
407 && !DECL_UNINLINABLE (ref->decl))
409 hstate.add_flag (DECL_DISREGARD_INLINE_LIMITS (ref->decl));
410 hstate.add_flag (DECL_DECLARED_INLINE_P (ref->decl));
412 hstate.add_flag (DECL_IS_OPERATOR_NEW_P (ref->decl));
414 else if (is_a <varpool_node *> (ref))
416 hstate.add_flag (DECL_VIRTUAL_P (ref->decl));
417 if (address)
418 hstate.add_int (DECL_ALIGN (ref->decl));
423 /* For a given symbol table nodes N1 and N2, we check that FUNCTION_DECLs
424 point to a same function. Comparison can be skipped if IGNORED_NODES
425 contains these nodes. ADDRESS indicate if address is taken. */
427 bool
428 sem_item::compare_symbol_references (
429 hash_map <symtab_node *, sem_item *> &ignored_nodes,
430 symtab_node *n1, symtab_node *n2, bool address)
432 enum availability avail1, avail2;
434 if (n1 == n2)
435 return true;
437 /* Never match variable and function. */
438 if (is_a <varpool_node *> (n1) != is_a <varpool_node *> (n2))
439 return false;
441 if (!compare_referenced_symbol_properties (node, n1, n2, address))
442 return false;
443 if (address && n1->equal_address_to (n2) == 1)
444 return true;
445 if (!address && n1->semantically_equivalent_p (n2))
446 return true;
448 n1 = n1->ultimate_alias_target (&avail1);
449 n2 = n2->ultimate_alias_target (&avail2);
451 if (avail1 > AVAIL_INTERPOSABLE && ignored_nodes.get (n1)
452 && avail2 > AVAIL_INTERPOSABLE && ignored_nodes.get (n2))
453 return true;
455 return return_false_with_msg ("different references");
458 /* If cgraph edges E1 and E2 are indirect calls, verify that
459 ECF flags are the same. */
461 bool sem_function::compare_edge_flags (cgraph_edge *e1, cgraph_edge *e2)
463 if (e1->indirect_info && e2->indirect_info)
465 int e1_flags = e1->indirect_info->ecf_flags;
466 int e2_flags = e2->indirect_info->ecf_flags;
468 if (e1_flags != e2_flags)
469 return return_false_with_msg ("ICF flags are different");
471 else if (e1->indirect_info || e2->indirect_info)
472 return false;
474 return true;
477 /* Return true if parameter I may be used. */
479 bool
480 sem_function::param_used_p (unsigned int i)
482 if (ipa_node_params_sum == NULL)
483 return true;
485 class ipa_node_params *parms_info = IPA_NODE_REF (get_node ());
487 if (!parms_info || vec_safe_length (parms_info->descriptors) <= i)
488 return true;
490 return ipa_is_param_used (IPA_NODE_REF (get_node ()), i);
493 /* Perform additional check needed to match types function parameters that are
494 used. Unlike for normal decls it matters if type is TYPE_RESTRICT and we
495 make an assumption that REFERENCE_TYPE parameters are always non-NULL. */
497 bool
498 sem_function::compatible_parm_types_p (tree parm1, tree parm2)
500 /* Be sure that parameters are TBAA compatible. */
501 if (!func_checker::compatible_types_p (parm1, parm2))
502 return return_false_with_msg ("parameter type is not compatible");
504 if (POINTER_TYPE_P (parm1)
505 && (TYPE_RESTRICT (parm1) != TYPE_RESTRICT (parm2)))
506 return return_false_with_msg ("argument restrict flag mismatch");
508 /* nonnull_arg_p implies non-zero range to REFERENCE types. */
509 if (POINTER_TYPE_P (parm1)
510 && TREE_CODE (parm1) != TREE_CODE (parm2)
511 && opt_for_fn (decl, flag_delete_null_pointer_checks))
512 return return_false_with_msg ("pointer wrt reference mismatch");
514 return true;
517 /* Fast equality function based on knowledge known in WPA. */
519 bool
520 sem_function::equals_wpa (sem_item *item,
521 hash_map <symtab_node *, sem_item *> &ignored_nodes)
523 gcc_assert (item->type == FUNC);
524 cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
525 cgraph_node *cnode2 = dyn_cast <cgraph_node *> (item->node);
527 m_compared_func = static_cast<sem_function *> (item);
529 if (cnode->thunk.thunk_p != cnode2->thunk.thunk_p)
530 return return_false_with_msg ("thunk_p mismatch");
532 if (cnode->thunk.thunk_p)
534 if (cnode->thunk.fixed_offset != cnode2->thunk.fixed_offset)
535 return return_false_with_msg ("thunk fixed_offset mismatch");
536 if (cnode->thunk.virtual_value != cnode2->thunk.virtual_value)
537 return return_false_with_msg ("thunk virtual_value mismatch");
538 if (cnode->thunk.indirect_offset != cnode2->thunk.indirect_offset)
539 return return_false_with_msg ("thunk indirect_offset mismatch");
540 if (cnode->thunk.this_adjusting != cnode2->thunk.this_adjusting)
541 return return_false_with_msg ("thunk this_adjusting mismatch");
542 if (cnode->thunk.virtual_offset_p != cnode2->thunk.virtual_offset_p)
543 return return_false_with_msg ("thunk virtual_offset_p mismatch");
546 /* Compare special function DECL attributes. */
547 if (DECL_FUNCTION_PERSONALITY (decl)
548 != DECL_FUNCTION_PERSONALITY (item->decl))
549 return return_false_with_msg ("function personalities are different");
551 if (DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl)
552 != DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (item->decl))
553 return return_false_with_msg ("intrument function entry exit "
554 "attributes are different");
556 if (DECL_NO_LIMIT_STACK (decl) != DECL_NO_LIMIT_STACK (item->decl))
557 return return_false_with_msg ("no stack limit attributes are different");
559 if (DECL_CXX_CONSTRUCTOR_P (decl) != DECL_CXX_CONSTRUCTOR_P (item->decl))
560 return return_false_with_msg ("DECL_CXX_CONSTRUCTOR mismatch");
562 if (DECL_CXX_DESTRUCTOR_P (decl) != DECL_CXX_DESTRUCTOR_P (item->decl))
563 return return_false_with_msg ("DECL_CXX_DESTRUCTOR mismatch");
565 /* TODO: pure/const flags mostly matters only for references, except for
566 the fact that codegen takes LOOPING flag as a hint that loops are
567 finite. We may arrange the code to always pick leader that has least
568 specified flags and then this can go into comparing symbol properties. */
569 if (flags_from_decl_or_type (decl) != flags_from_decl_or_type (item->decl))
570 return return_false_with_msg ("decl_or_type flags are different");
572 /* Do not match polymorphic constructors of different types. They calls
573 type memory location for ipa-polymorphic-call and we do not want
574 it to get confused by wrong type. */
575 if (DECL_CXX_CONSTRUCTOR_P (decl)
576 && TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE)
578 if (TREE_CODE (TREE_TYPE (item->decl)) != METHOD_TYPE)
579 return return_false_with_msg ("DECL_CXX_CONSTURCTOR type mismatch");
580 else if (!func_checker::compatible_polymorphic_types_p
581 (TYPE_METHOD_BASETYPE (TREE_TYPE (decl)),
582 TYPE_METHOD_BASETYPE (TREE_TYPE (item->decl)), false))
583 return return_false_with_msg ("ctor polymorphic type mismatch");
586 /* Checking function TARGET and OPTIMIZATION flags. */
587 cl_target_option *tar1 = target_opts_for_fn (decl);
588 cl_target_option *tar2 = target_opts_for_fn (item->decl);
590 if (tar1 != tar2 && !cl_target_option_eq (tar1, tar2))
592 if (dump_file && (dump_flags & TDF_DETAILS))
594 fprintf (dump_file, "target flags difference");
595 cl_target_option_print_diff (dump_file, 2, tar1, tar2);
598 return return_false_with_msg ("Target flags are different");
601 cl_optimization *opt1 = opts_for_fn (decl);
602 cl_optimization *opt2 = opts_for_fn (item->decl);
604 if (opt1 != opt2 && !cl_optimization_option_eq (opt1, opt2))
606 if (dump_file && (dump_flags & TDF_DETAILS))
608 fprintf (dump_file, "optimization flags difference");
609 cl_optimization_print_diff (dump_file, 2, opt1, opt2);
612 return return_false_with_msg ("optimization flags are different");
615 /* Result type checking. */
616 if (!func_checker::compatible_types_p
617 (TREE_TYPE (TREE_TYPE (decl)),
618 TREE_TYPE (TREE_TYPE (m_compared_func->decl))))
619 return return_false_with_msg ("result types are different");
621 /* Checking types of arguments. */
622 tree list1 = TYPE_ARG_TYPES (TREE_TYPE (decl)),
623 list2 = TYPE_ARG_TYPES (TREE_TYPE (m_compared_func->decl));
624 for (unsigned i = 0; list1 && list2;
625 list1 = TREE_CHAIN (list1), list2 = TREE_CHAIN (list2), i++)
627 tree parm1 = TREE_VALUE (list1);
628 tree parm2 = TREE_VALUE (list2);
630 /* This guard is here for function pointer with attributes (pr59927.c). */
631 if (!parm1 || !parm2)
632 return return_false_with_msg ("NULL argument type");
634 /* Verify that types are compatible to ensure that both functions
635 have same calling conventions. */
636 if (!types_compatible_p (parm1, parm2))
637 return return_false_with_msg ("parameter types are not compatible");
639 if (!param_used_p (i))
640 continue;
642 /* Perform additional checks for used parameters. */
643 if (!compatible_parm_types_p (parm1, parm2))
644 return false;
647 if (list1 || list2)
648 return return_false_with_msg ("Mismatched number of parameters");
650 if (node->num_references () != item->node->num_references ())
651 return return_false_with_msg ("different number of references");
653 /* Checking function attributes.
654 This is quadratic in number of attributes */
655 if (comp_type_attributes (TREE_TYPE (decl),
656 TREE_TYPE (item->decl)) != 1)
657 return return_false_with_msg ("different type attributes");
658 if (!attribute_list_equal (DECL_ATTRIBUTES (decl),
659 DECL_ATTRIBUTES (item->decl)))
660 return return_false_with_msg ("different decl attributes");
662 /* The type of THIS pointer type memory location for
663 ipa-polymorphic-call-analysis. */
664 if (opt_for_fn (decl, flag_devirtualize)
665 && (TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE
666 || TREE_CODE (TREE_TYPE (item->decl)) == METHOD_TYPE)
667 && param_used_p (0)
668 && compare_polymorphic_p ())
670 if (TREE_CODE (TREE_TYPE (decl)) != TREE_CODE (TREE_TYPE (item->decl)))
671 return return_false_with_msg ("METHOD_TYPE and FUNCTION_TYPE mismatch");
672 if (!func_checker::compatible_polymorphic_types_p
673 (TYPE_METHOD_BASETYPE (TREE_TYPE (decl)),
674 TYPE_METHOD_BASETYPE (TREE_TYPE (item->decl)), false))
675 return return_false_with_msg ("THIS pointer ODR type mismatch");
678 ipa_ref *ref = NULL, *ref2 = NULL;
679 for (unsigned i = 0; node->iterate_reference (i, ref); i++)
681 item->node->iterate_reference (i, ref2);
683 if (ref->use != ref2->use)
684 return return_false_with_msg ("reference use mismatch");
686 if (!compare_symbol_references (ignored_nodes, ref->referred,
687 ref2->referred,
688 ref->address_matters_p ()))
689 return false;
692 cgraph_edge *e1 = dyn_cast <cgraph_node *> (node)->callees;
693 cgraph_edge *e2 = dyn_cast <cgraph_node *> (item->node)->callees;
695 while (e1 && e2)
697 if (!compare_symbol_references (ignored_nodes, e1->callee,
698 e2->callee, false))
699 return false;
700 if (!compare_edge_flags (e1, e2))
701 return false;
703 e1 = e1->next_callee;
704 e2 = e2->next_callee;
707 if (e1 || e2)
708 return return_false_with_msg ("different number of calls");
710 e1 = dyn_cast <cgraph_node *> (node)->indirect_calls;
711 e2 = dyn_cast <cgraph_node *> (item->node)->indirect_calls;
713 while (e1 && e2)
715 if (!compare_edge_flags (e1, e2))
716 return false;
718 e1 = e1->next_callee;
719 e2 = e2->next_callee;
722 if (e1 || e2)
723 return return_false_with_msg ("different number of indirect calls");
725 return true;
728 /* Update hash by address sensitive references. We iterate over all
729 sensitive references (address_matters_p) and we hash ultime alias
730 target of these nodes, which can improve a semantic item hash.
732 Also hash in referenced symbols properties. This can be done at any time
733 (as the properties should not change), but it is convenient to do it here
734 while we walk the references anyway. */
736 void
737 sem_item::update_hash_by_addr_refs (hash_map <symtab_node *,
738 sem_item *> &m_symtab_node_map)
740 ipa_ref* ref;
741 inchash::hash hstate (get_hash ());
743 for (unsigned i = 0; node->iterate_reference (i, ref); i++)
745 hstate.add_int (ref->use);
746 hash_referenced_symbol_properties (ref->referred, hstate,
747 ref->use == IPA_REF_ADDR);
748 if (ref->address_matters_p () || !m_symtab_node_map.get (ref->referred))
749 hstate.add_int (ref->referred->ultimate_alias_target ()->order);
752 if (is_a <cgraph_node *> (node))
754 for (cgraph_edge *e = dyn_cast <cgraph_node *> (node)->callers; e;
755 e = e->next_caller)
757 sem_item **result = m_symtab_node_map.get (e->callee);
758 hash_referenced_symbol_properties (e->callee, hstate, false);
759 if (!result)
760 hstate.add_int (e->callee->ultimate_alias_target ()->order);
764 set_hash (hstate.end ());
767 /* Update hash by computed local hash values taken from different
768 semantic items.
769 TODO: stronger SCC based hashing would be desirable here. */
771 void
772 sem_item::update_hash_by_local_refs (hash_map <symtab_node *,
773 sem_item *> &m_symtab_node_map)
775 ipa_ref* ref;
776 inchash::hash state (get_hash ());
778 for (unsigned j = 0; node->iterate_reference (j, ref); j++)
780 sem_item **result = m_symtab_node_map.get (ref->referring);
781 if (result)
782 state.merge_hash ((*result)->get_hash ());
785 if (type == FUNC)
787 for (cgraph_edge *e = dyn_cast <cgraph_node *> (node)->callees; e;
788 e = e->next_callee)
790 sem_item **result = m_symtab_node_map.get (e->caller);
791 if (result)
792 state.merge_hash ((*result)->get_hash ());
796 global_hash = state.end ();
799 /* Returns true if the item equals to ITEM given as argument. */
801 bool
802 sem_function::equals (sem_item *item,
803 hash_map <symtab_node *, sem_item *> &)
805 gcc_assert (item->type == FUNC);
806 bool eq = equals_private (item);
808 if (m_checker != NULL)
810 delete m_checker;
811 m_checker = NULL;
814 if (dump_file && (dump_flags & TDF_DETAILS))
815 fprintf (dump_file,
816 "Equals called for: %s:%s with result: %s\n\n",
817 node->dump_name (),
818 item->node->dump_name (),
819 eq ? "true" : "false");
821 return eq;
824 /* Processes function equality comparison. */
826 bool
827 sem_function::equals_private (sem_item *item)
829 if (item->type != FUNC)
830 return false;
832 basic_block bb1, bb2;
833 edge e1, e2;
834 edge_iterator ei1, ei2;
835 bool result = true;
836 tree arg1, arg2;
838 m_compared_func = static_cast<sem_function *> (item);
840 gcc_assert (decl != item->decl);
842 if (bb_sorted.length () != m_compared_func->bb_sorted.length ()
843 || edge_count != m_compared_func->edge_count
844 || cfg_checksum != m_compared_func->cfg_checksum)
845 return return_false ();
847 m_checker = new func_checker (decl, m_compared_func->decl,
848 false,
849 &refs_set,
850 &m_compared_func->refs_set);
851 arg1 = DECL_ARGUMENTS (decl);
852 arg2 = DECL_ARGUMENTS (m_compared_func->decl);
853 for (unsigned i = 0;
854 arg1 && arg2; arg1 = DECL_CHAIN (arg1), arg2 = DECL_CHAIN (arg2), i++)
856 if (!types_compatible_p (TREE_TYPE (arg1), TREE_TYPE (arg2)))
857 return return_false_with_msg ("argument types are not compatible");
858 if (!param_used_p (i))
859 continue;
860 /* Perform additional checks for used parameters. */
861 if (!compatible_parm_types_p (TREE_TYPE (arg1), TREE_TYPE (arg2)))
862 return false;
863 if (!m_checker->compare_decl (arg1, arg2))
864 return return_false ();
866 if (arg1 || arg2)
867 return return_false_with_msg ("Mismatched number of arguments");
869 if (!dyn_cast <cgraph_node *> (node)->has_gimple_body_p ())
870 return true;
872 /* Fill-up label dictionary. */
873 for (unsigned i = 0; i < bb_sorted.length (); ++i)
875 m_checker->parse_labels (bb_sorted[i]);
876 m_checker->parse_labels (m_compared_func->bb_sorted[i]);
879 /* Checking all basic blocks. */
880 for (unsigned i = 0; i < bb_sorted.length (); ++i)
881 if(!m_checker->compare_bb (bb_sorted[i], m_compared_func->bb_sorted[i]))
882 return return_false ();
884 auto_vec <int> bb_dict;
886 /* Basic block edges check. */
887 for (unsigned i = 0; i < bb_sorted.length (); ++i)
889 bb1 = bb_sorted[i]->bb;
890 bb2 = m_compared_func->bb_sorted[i]->bb;
892 ei2 = ei_start (bb2->preds);
894 for (ei1 = ei_start (bb1->preds); ei_cond (ei1, &e1); ei_next (&ei1))
896 ei_cond (ei2, &e2);
898 if (e1->flags != e2->flags)
899 return return_false_with_msg ("flags comparison returns false");
901 if (!bb_dict_test (&bb_dict, e1->src->index, e2->src->index))
902 return return_false_with_msg ("edge comparison returns false");
904 if (!bb_dict_test (&bb_dict, e1->dest->index, e2->dest->index))
905 return return_false_with_msg ("BB comparison returns false");
907 if (!m_checker->compare_edge (e1, e2))
908 return return_false_with_msg ("edge comparison returns false");
910 ei_next (&ei2);
914 /* Basic block PHI nodes comparison. */
915 for (unsigned i = 0; i < bb_sorted.length (); i++)
916 if (!compare_phi_node (bb_sorted[i]->bb, m_compared_func->bb_sorted[i]->bb))
917 return return_false_with_msg ("PHI node comparison returns false");
919 return result;
922 /* Set LOCAL_P of NODE to true if DATA is non-NULL.
923 Helper for call_for_symbol_thunks_and_aliases. */
925 static bool
926 set_local (cgraph_node *node, void *data)
928 node->local = data != NULL;
929 return false;
932 /* TREE_ADDRESSABLE of NODE to true.
933 Helper for call_for_symbol_thunks_and_aliases. */
935 static bool
936 set_addressable (varpool_node *node, void *)
938 TREE_ADDRESSABLE (node->decl) = 1;
939 return false;
942 /* Clear DECL_RTL of NODE.
943 Helper for call_for_symbol_thunks_and_aliases. */
945 static bool
946 clear_decl_rtl (symtab_node *node, void *)
948 SET_DECL_RTL (node->decl, NULL);
949 return false;
952 /* Redirect all callers of N and its aliases to TO. Remove aliases if
953 possible. Return number of redirections made. */
955 static int
956 redirect_all_callers (cgraph_node *n, cgraph_node *to)
958 int nredirected = 0;
959 ipa_ref *ref;
960 cgraph_edge *e = n->callers;
962 while (e)
964 /* Redirecting thunks to interposable symbols or symbols in other sections
965 may not be supported by target output code. Play safe for now and
966 punt on redirection. */
967 if (!e->caller->thunk.thunk_p)
969 struct cgraph_edge *nexte = e->next_caller;
970 e->redirect_callee (to);
971 e = nexte;
972 nredirected++;
974 else
975 e = e->next_callee;
977 for (unsigned i = 0; n->iterate_direct_aliases (i, ref);)
979 bool removed = false;
980 cgraph_node *n_alias = dyn_cast <cgraph_node *> (ref->referring);
982 if ((DECL_COMDAT_GROUP (n->decl)
983 && (DECL_COMDAT_GROUP (n->decl)
984 == DECL_COMDAT_GROUP (n_alias->decl)))
985 || (n_alias->get_availability () > AVAIL_INTERPOSABLE
986 && n->get_availability () > AVAIL_INTERPOSABLE))
988 nredirected += redirect_all_callers (n_alias, to);
989 if (n_alias->can_remove_if_no_direct_calls_p ()
990 && !n_alias->call_for_symbol_and_aliases (cgraph_node::has_thunk_p,
991 NULL, true)
992 && !n_alias->has_aliases_p ())
993 n_alias->remove ();
995 if (!removed)
996 i++;
998 return nredirected;
1001 /* Merges instance with an ALIAS_ITEM, where alias, thunk or redirection can
1002 be applied. */
1004 bool
1005 sem_function::merge (sem_item *alias_item)
1007 gcc_assert (alias_item->type == FUNC);
1009 sem_function *alias_func = static_cast<sem_function *> (alias_item);
1011 cgraph_node *original = get_node ();
1012 cgraph_node *local_original = NULL;
1013 cgraph_node *alias = alias_func->get_node ();
1015 bool create_wrapper = false;
1016 bool create_alias = false;
1017 bool redirect_callers = false;
1018 bool remove = false;
1020 bool original_discardable = false;
1021 bool original_discarded = false;
1023 bool original_address_matters = original->address_matters_p ();
1024 bool alias_address_matters = alias->address_matters_p ();
1026 AUTO_DUMP_SCOPE ("merge",
1027 dump_user_location_t::from_function_decl (decl));
1029 if (DECL_EXTERNAL (alias->decl))
1031 if (dump_enabled_p ())
1032 dump_printf (MSG_MISSED_OPTIMIZATION,
1033 "Not unifying; alias is external.\n");
1034 return false;
1037 if (DECL_NO_INLINE_WARNING_P (original->decl)
1038 != DECL_NO_INLINE_WARNING_P (alias->decl))
1040 if (dump_enabled_p ())
1041 dump_printf (MSG_MISSED_OPTIMIZATION,
1042 "Not unifying; DECL_NO_INLINE_WARNING mismatch.\n");
1043 return false;
1046 /* Do not attempt to mix functions from different user sections;
1047 we do not know what user intends with those. */
1048 if (((DECL_SECTION_NAME (original->decl) && !original->implicit_section)
1049 || (DECL_SECTION_NAME (alias->decl) && !alias->implicit_section))
1050 && DECL_SECTION_NAME (original->decl) != DECL_SECTION_NAME (alias->decl))
1052 if (dump_enabled_p ())
1053 dump_printf (MSG_MISSED_OPTIMIZATION,
1054 "Not unifying; "
1055 "original and alias are in different sections.\n");
1056 return false;
1059 if (!original->in_same_comdat_group_p (alias)
1060 || original->comdat_local_p ())
1062 if (dump_enabled_p ())
1063 dump_printf (MSG_MISSED_OPTIMIZATION,
1064 "Not unifying; alias nor wrapper cannot be created; "
1065 "across comdat group boundary\n");
1066 return false;
1069 /* See if original is in a section that can be discarded if the main
1070 symbol is not used. */
1072 if (original->can_be_discarded_p ())
1073 original_discardable = true;
1074 /* Also consider case where we have resolution info and we know that
1075 original's definition is not going to be used. In this case we cannot
1076 create alias to original. */
1077 if (node->resolution != LDPR_UNKNOWN
1078 && !decl_binds_to_current_def_p (node->decl))
1079 original_discardable = original_discarded = true;
1081 /* Creating a symtab alias is the optimal way to merge.
1082 It however cannot be used in the following cases:
1084 1) if ORIGINAL and ALIAS may be possibly compared for address equality.
1085 2) if ORIGINAL is in a section that may be discarded by linker or if
1086 it is an external functions where we cannot create an alias
1087 (ORIGINAL_DISCARDABLE)
1088 3) if target do not support symbol aliases.
1089 4) original and alias lie in different comdat groups.
1091 If we cannot produce alias, we will turn ALIAS into WRAPPER of ORIGINAL
1092 and/or redirect all callers from ALIAS to ORIGINAL. */
1093 if ((original_address_matters && alias_address_matters)
1094 || (original_discardable
1095 && (!DECL_COMDAT_GROUP (alias->decl)
1096 || (DECL_COMDAT_GROUP (alias->decl)
1097 != DECL_COMDAT_GROUP (original->decl))))
1098 || original_discarded
1099 || !sem_item::target_supports_symbol_aliases_p ()
1100 || DECL_COMDAT_GROUP (alias->decl) != DECL_COMDAT_GROUP (original->decl))
1102 /* First see if we can produce wrapper. */
1104 /* Symbol properties that matter for references must be preserved.
1105 TODO: We can produce wrapper, but we need to produce alias of ORIGINAL
1106 with proper properties. */
1107 if (!sem_item::compare_referenced_symbol_properties (NULL, original, alias,
1108 alias->address_taken))
1110 if (dump_enabled_p ())
1111 dump_printf (MSG_MISSED_OPTIMIZATION,
1112 "Wrapper cannot be created because referenced symbol "
1113 "properties mismatch\n");
1115 /* Do not turn function in one comdat group into wrapper to another
1116 comdat group. Other compiler producing the body of the
1117 another comdat group may make opossite decision and with unfortunate
1118 linker choices this may close a loop. */
1119 else if (DECL_COMDAT_GROUP (original->decl)
1120 && DECL_COMDAT_GROUP (alias->decl)
1121 && (DECL_COMDAT_GROUP (alias->decl)
1122 != DECL_COMDAT_GROUP (original->decl)))
1124 if (dump_enabled_p ())
1125 dump_printf (MSG_MISSED_OPTIMIZATION,
1126 "Wrapper cannot be created because of COMDAT\n");
1128 else if (DECL_STATIC_CHAIN (alias->decl)
1129 || DECL_STATIC_CHAIN (original->decl))
1131 if (dump_enabled_p ())
1132 dump_printf (MSG_MISSED_OPTIMIZATION,
1133 "Cannot create wrapper of nested function.\n");
1135 /* TODO: We can also deal with variadic functions never calling
1136 VA_START. */
1137 else if (stdarg_p (TREE_TYPE (alias->decl)))
1139 if (dump_enabled_p ())
1140 dump_printf (MSG_MISSED_OPTIMIZATION,
1141 "cannot create wrapper of stdarg function.\n");
1143 else if (ipa_fn_summaries
1144 && ipa_size_summaries->get (alias) != NULL
1145 && ipa_size_summaries->get (alias)->self_size <= 2)
1147 if (dump_enabled_p ())
1148 dump_printf (MSG_MISSED_OPTIMIZATION, "Wrapper creation is not "
1149 "profitable (function is too small).\n");
1151 /* If user paid attention to mark function noinline, assume it is
1152 somewhat special and do not try to turn it into a wrapper that
1153 cannot be undone by inliner. */
1154 else if (lookup_attribute ("noinline", DECL_ATTRIBUTES (alias->decl)))
1156 if (dump_enabled_p ())
1157 dump_printf (MSG_MISSED_OPTIMIZATION,
1158 "Wrappers are not created for noinline.\n");
1160 else
1161 create_wrapper = true;
1163 /* We can redirect local calls in the case both alias and orignal
1164 are not interposable. */
1165 redirect_callers
1166 = alias->get_availability () > AVAIL_INTERPOSABLE
1167 && original->get_availability () > AVAIL_INTERPOSABLE;
1168 /* TODO: We can redirect, but we need to produce alias of ORIGINAL
1169 with proper properties. */
1170 if (!sem_item::compare_referenced_symbol_properties (NULL, original, alias,
1171 alias->address_taken))
1172 redirect_callers = false;
1174 if (!redirect_callers && !create_wrapper)
1176 if (dump_enabled_p ())
1177 dump_printf (MSG_MISSED_OPTIMIZATION,
1178 "Not unifying; cannot redirect callers nor "
1179 "produce wrapper\n");
1180 return false;
1183 /* Work out the symbol the wrapper should call.
1184 If ORIGINAL is interposable, we need to call a local alias.
1185 Also produce local alias (if possible) as an optimization.
1187 Local aliases cannot be created inside comdat groups because that
1188 prevents inlining. */
1189 if (!original_discardable && !original->get_comdat_group ())
1191 local_original
1192 = dyn_cast <cgraph_node *> (original->noninterposable_alias ());
1193 if (!local_original
1194 && original->get_availability () > AVAIL_INTERPOSABLE)
1195 local_original = original;
1197 /* If we cannot use local alias, fallback to the original
1198 when possible. */
1199 else if (original->get_availability () > AVAIL_INTERPOSABLE)
1200 local_original = original;
1202 /* If original is COMDAT local, we cannot really redirect calls outside
1203 of its comdat group to it. */
1204 if (original->comdat_local_p ())
1205 redirect_callers = false;
1206 if (!local_original)
1208 if (dump_enabled_p ())
1209 dump_printf (MSG_MISSED_OPTIMIZATION,
1210 "Not unifying; cannot produce local alias.\n");
1211 return false;
1214 if (!redirect_callers && !create_wrapper)
1216 if (dump_enabled_p ())
1217 dump_printf (MSG_MISSED_OPTIMIZATION,
1218 "Not unifying; "
1219 "cannot redirect callers nor produce a wrapper\n");
1220 return false;
1222 if (!create_wrapper
1223 && !alias->call_for_symbol_and_aliases (cgraph_node::has_thunk_p,
1224 NULL, true)
1225 && !alias->can_remove_if_no_direct_calls_p ())
1227 if (dump_enabled_p ())
1228 dump_printf (MSG_MISSED_OPTIMIZATION,
1229 "Not unifying; cannot make wrapper and "
1230 "function has other uses than direct calls\n");
1231 return false;
1234 else
1235 create_alias = true;
1237 if (redirect_callers)
1239 int nredirected = redirect_all_callers (alias, local_original);
1241 if (nredirected)
1243 alias->icf_merged = true;
1244 local_original->icf_merged = true;
1246 if (dump_enabled_p ())
1247 dump_printf (MSG_NOTE,
1248 "%i local calls have been "
1249 "redirected.\n", nredirected);
1252 /* If all callers was redirected, do not produce wrapper. */
1253 if (alias->can_remove_if_no_direct_calls_p ()
1254 && !DECL_VIRTUAL_P (alias->decl)
1255 && !alias->has_aliases_p ())
1257 create_wrapper = false;
1258 remove = true;
1260 gcc_assert (!create_alias);
1262 else if (create_alias)
1264 alias->icf_merged = true;
1266 /* Remove the function's body. */
1267 ipa_merge_profiles (original, alias);
1268 symtab->call_cgraph_removal_hooks (alias);
1269 alias->release_body (true);
1270 alias->reset ();
1271 /* Notice global symbol possibly produced RTL. */
1272 ((symtab_node *)alias)->call_for_symbol_and_aliases (clear_decl_rtl,
1273 NULL, true);
1275 /* Create the alias. */
1276 cgraph_node::create_alias (alias_func->decl, decl);
1277 alias->resolve_alias (original);
1279 original->call_for_symbol_thunks_and_aliases
1280 (set_local, (void *)(size_t) original->local_p (), true);
1282 if (dump_enabled_p ())
1283 dump_printf (MSG_OPTIMIZED_LOCATIONS,
1284 "Unified; Function alias has been created.\n");
1286 if (create_wrapper)
1288 gcc_assert (!create_alias);
1289 alias->icf_merged = true;
1290 symtab->call_cgraph_removal_hooks (alias);
1291 local_original->icf_merged = true;
1293 /* FIXME update local_original counts. */
1294 ipa_merge_profiles (original, alias, true);
1295 alias->create_wrapper (local_original);
1296 symtab->call_cgraph_insertion_hooks (alias);
1298 if (dump_enabled_p ())
1299 dump_printf (MSG_OPTIMIZED_LOCATIONS,
1300 "Unified; Wrapper has been created.\n");
1303 /* It's possible that redirection can hit thunks that block
1304 redirection opportunities. */
1305 gcc_assert (alias->icf_merged || remove || redirect_callers);
1306 original->icf_merged = true;
1308 /* We use merged flag to track cases where COMDAT function is known to be
1309 compatible its callers. If we merged in non-COMDAT, we need to give up
1310 on this optimization. */
1311 if (original->merged_comdat && !alias->merged_comdat)
1313 if (dump_enabled_p ())
1314 dump_printf (MSG_NOTE, "Dropping merged_comdat flag.\n");
1315 if (local_original)
1316 local_original->merged_comdat = false;
1317 original->merged_comdat = false;
1320 if (remove)
1322 ipa_merge_profiles (original, alias);
1323 alias->release_body ();
1324 alias->reset ();
1325 alias->body_removed = true;
1326 alias->icf_merged = true;
1327 if (dump_enabled_p ())
1328 dump_printf (MSG_OPTIMIZED_LOCATIONS,
1329 "Unified; Function body was removed.\n");
1332 return true;
1335 /* Semantic item initialization function. */
1337 void
1338 sem_function::init (ipa_icf_gimple::func_checker *checker)
1340 m_checker = checker;
1341 if (in_lto_p)
1342 get_node ()->get_untransformed_body ();
1344 tree fndecl = node->decl;
1345 function *func = DECL_STRUCT_FUNCTION (fndecl);
1347 gcc_assert (func);
1348 gcc_assert (SSANAMES (func));
1350 ssa_names_size = SSANAMES (func)->length ();
1351 node = node;
1353 decl = fndecl;
1354 region_tree = func->eh->region_tree;
1356 /* iterating all function arguments. */
1357 arg_count = count_formal_params (fndecl);
1359 edge_count = n_edges_for_fn (func);
1360 cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
1361 if (!cnode->thunk.thunk_p)
1363 cfg_checksum = coverage_compute_cfg_checksum (func);
1365 inchash::hash hstate;
1367 basic_block bb;
1368 FOR_EACH_BB_FN (bb, func)
1370 unsigned nondbg_stmt_count = 0;
1372 edge e;
1373 for (edge_iterator ei = ei_start (bb->preds); ei_cond (ei, &e);
1374 ei_next (&ei))
1375 cfg_checksum = iterative_hash_host_wide_int (e->flags,
1376 cfg_checksum);
1378 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
1379 gsi_next (&gsi))
1381 gimple *stmt = gsi_stmt (gsi);
1383 if (gimple_code (stmt) != GIMPLE_DEBUG
1384 && gimple_code (stmt) != GIMPLE_PREDICT)
1386 hash_stmt (stmt, hstate);
1387 nondbg_stmt_count++;
1391 hstate.commit_flag ();
1392 gcode_hash = hstate.end ();
1393 bb_sizes.safe_push (nondbg_stmt_count);
1395 /* Inserting basic block to hash table. */
1396 sem_bb *semantic_bb = new sem_bb (bb, nondbg_stmt_count,
1397 EDGE_COUNT (bb->preds)
1398 + EDGE_COUNT (bb->succs));
1400 bb_sorted.safe_push (semantic_bb);
1403 else
1405 cfg_checksum = 0;
1406 inchash::hash hstate;
1407 hstate.add_hwi (cnode->thunk.fixed_offset);
1408 hstate.add_hwi (cnode->thunk.virtual_value);
1409 hstate.add_flag (cnode->thunk.this_adjusting);
1410 hstate.add_flag (cnode->thunk.virtual_offset_p);
1411 gcode_hash = hstate.end ();
1415 /* Improve accumulated hash for HSTATE based on a gimple statement STMT. */
1417 void
1418 sem_function::hash_stmt (gimple *stmt, inchash::hash &hstate)
1420 enum gimple_code code = gimple_code (stmt);
1422 hstate.add_int (code);
1424 switch (code)
1426 case GIMPLE_SWITCH:
1427 m_checker->hash_operand (gimple_switch_index (as_a <gswitch *> (stmt)),
1428 hstate, 0);
1429 break;
1430 case GIMPLE_ASSIGN:
1431 hstate.add_int (gimple_assign_rhs_code (stmt));
1432 if (commutative_tree_code (gimple_assign_rhs_code (stmt))
1433 || commutative_ternary_tree_code (gimple_assign_rhs_code (stmt)))
1435 m_checker->hash_operand (gimple_assign_rhs1 (stmt), hstate, 0);
1436 m_checker->hash_operand (gimple_assign_rhs2 (stmt), hstate, 0);
1437 if (commutative_ternary_tree_code (gimple_assign_rhs_code (stmt)))
1438 m_checker->hash_operand (gimple_assign_rhs3 (stmt), hstate, 0);
1439 m_checker->hash_operand (gimple_assign_lhs (stmt), hstate, 0);
1441 /* fall through */
1442 case GIMPLE_CALL:
1443 case GIMPLE_ASM:
1444 case GIMPLE_COND:
1445 case GIMPLE_GOTO:
1446 case GIMPLE_RETURN:
1447 /* All these statements are equivalent if their operands are. */
1448 for (unsigned i = 0; i < gimple_num_ops (stmt); ++i)
1449 m_checker->hash_operand (gimple_op (stmt, i), hstate, 0);
1450 /* Consider nocf_check attribute in hash as it affects code
1451 generation. */
1452 if (code == GIMPLE_CALL
1453 && flag_cf_protection & CF_BRANCH)
1454 hstate.add_flag (gimple_call_nocf_check_p (as_a <gcall *> (stmt)));
1455 default:
1456 break;
1461 /* Return true if polymorphic comparison must be processed. */
1463 bool
1464 sem_function::compare_polymorphic_p (void)
1466 struct cgraph_edge *e;
1468 if (!opt_for_fn (get_node ()->decl, flag_devirtualize))
1469 return false;
1470 if (get_node ()->indirect_calls != NULL)
1471 return true;
1472 /* TODO: We can do simple propagation determining what calls may lead to
1473 a polymorphic call. */
1474 for (e = get_node ()->callees; e; e = e->next_callee)
1475 if (e->callee->definition
1476 && opt_for_fn (e->callee->decl, flag_devirtualize))
1477 return true;
1478 return false;
1481 /* For a given call graph NODE, the function constructs new
1482 semantic function item. */
1484 sem_function *
1485 sem_function::parse (cgraph_node *node, bitmap_obstack *stack,
1486 func_checker *checker)
1488 tree fndecl = node->decl;
1489 function *func = DECL_STRUCT_FUNCTION (fndecl);
1491 if (!func || (!node->has_gimple_body_p () && !node->thunk.thunk_p))
1492 return NULL;
1494 if (lookup_attribute_by_prefix ("omp ", DECL_ATTRIBUTES (node->decl)) != NULL)
1495 return NULL;
1497 if (lookup_attribute_by_prefix ("oacc ",
1498 DECL_ATTRIBUTES (node->decl)) != NULL)
1499 return NULL;
1501 /* PR ipa/70306. */
1502 if (DECL_STATIC_CONSTRUCTOR (node->decl)
1503 || DECL_STATIC_DESTRUCTOR (node->decl))
1504 return NULL;
1506 sem_function *f = new sem_function (node, stack);
1507 f->init (checker);
1509 return f;
1512 /* For given basic blocks BB1 and BB2 (from functions FUNC1 and FUNC),
1513 return true if phi nodes are semantically equivalent in these blocks . */
1515 bool
1516 sem_function::compare_phi_node (basic_block bb1, basic_block bb2)
1518 gphi_iterator si1, si2;
1519 gphi *phi1, *phi2;
1520 unsigned size1, size2, i;
1521 tree t1, t2;
1522 edge e1, e2;
1524 gcc_assert (bb1 != NULL);
1525 gcc_assert (bb2 != NULL);
1527 si2 = gsi_start_nonvirtual_phis (bb2);
1528 for (si1 = gsi_start_nonvirtual_phis (bb1); !gsi_end_p (si1);
1529 gsi_next_nonvirtual_phi (&si1))
1531 if (gsi_end_p (si1) && gsi_end_p (si2))
1532 break;
1534 if (gsi_end_p (si1) || gsi_end_p (si2))
1535 return return_false();
1537 phi1 = si1.phi ();
1538 phi2 = si2.phi ();
1540 tree phi_result1 = gimple_phi_result (phi1);
1541 tree phi_result2 = gimple_phi_result (phi2);
1543 if (!m_checker->compare_operand (phi_result1, phi_result2))
1544 return return_false_with_msg ("PHI results are different");
1546 size1 = gimple_phi_num_args (phi1);
1547 size2 = gimple_phi_num_args (phi2);
1549 if (size1 != size2)
1550 return return_false ();
1552 for (i = 0; i < size1; ++i)
1554 t1 = gimple_phi_arg (phi1, i)->def;
1555 t2 = gimple_phi_arg (phi2, i)->def;
1557 if (!m_checker->compare_operand (t1, t2))
1558 return return_false ();
1560 e1 = gimple_phi_arg_edge (phi1, i);
1561 e2 = gimple_phi_arg_edge (phi2, i);
1563 if (!m_checker->compare_edge (e1, e2))
1564 return return_false ();
1567 gsi_next_nonvirtual_phi (&si2);
1570 return true;
1573 /* Basic blocks dictionary BB_DICT returns true if SOURCE index BB
1574 corresponds to TARGET. */
1576 bool
1577 sem_function::bb_dict_test (vec<int> *bb_dict, int source, int target)
1579 source++;
1580 target++;
1582 if (bb_dict->length () <= (unsigned)source)
1583 bb_dict->safe_grow_cleared (source + 1);
1585 if ((*bb_dict)[source] == 0)
1587 (*bb_dict)[source] = target;
1588 return true;
1590 else
1591 return (*bb_dict)[source] == target;
1594 sem_variable::sem_variable (bitmap_obstack *stack): sem_item (VAR, stack)
1598 sem_variable::sem_variable (varpool_node *node, bitmap_obstack *stack)
1599 : sem_item (VAR, node, stack)
1601 gcc_checking_assert (node);
1602 gcc_checking_assert (get_node ());
1605 /* Fast equality function based on knowledge known in WPA. */
1607 bool
1608 sem_variable::equals_wpa (sem_item *item,
1609 hash_map <symtab_node *, sem_item *> &ignored_nodes)
1611 gcc_assert (item->type == VAR);
1613 if (node->num_references () != item->node->num_references ())
1614 return return_false_with_msg ("different number of references");
1616 if (DECL_TLS_MODEL (decl) || DECL_TLS_MODEL (item->decl))
1617 return return_false_with_msg ("TLS model");
1619 /* DECL_ALIGN is safe to merge, because we will always chose the largest
1620 alignment out of all aliases. */
1622 if (DECL_VIRTUAL_P (decl) != DECL_VIRTUAL_P (item->decl))
1623 return return_false_with_msg ("Virtual flag mismatch");
1625 if (DECL_SIZE (decl) != DECL_SIZE (item->decl)
1626 && ((!DECL_SIZE (decl) || !DECL_SIZE (item->decl))
1627 || !operand_equal_p (DECL_SIZE (decl),
1628 DECL_SIZE (item->decl), OEP_ONLY_CONST)))
1629 return return_false_with_msg ("size mismatch");
1631 /* Do not attempt to mix data from different user sections;
1632 we do not know what user intends with those. */
1633 if (((DECL_SECTION_NAME (decl) && !node->implicit_section)
1634 || (DECL_SECTION_NAME (item->decl) && !item->node->implicit_section))
1635 && DECL_SECTION_NAME (decl) != DECL_SECTION_NAME (item->decl))
1636 return return_false_with_msg ("user section mismatch");
1638 if (DECL_IN_TEXT_SECTION (decl) != DECL_IN_TEXT_SECTION (item->decl))
1639 return return_false_with_msg ("text section");
1641 ipa_ref *ref = NULL, *ref2 = NULL;
1642 for (unsigned i = 0; node->iterate_reference (i, ref); i++)
1644 item->node->iterate_reference (i, ref2);
1646 if (ref->use != ref2->use)
1647 return return_false_with_msg ("reference use mismatch");
1649 if (!compare_symbol_references (ignored_nodes,
1650 ref->referred, ref2->referred,
1651 ref->address_matters_p ()))
1652 return false;
1655 return true;
1658 /* Returns true if the item equals to ITEM given as argument. */
1660 bool
1661 sem_variable::equals (sem_item *item,
1662 hash_map <symtab_node *, sem_item *> &)
1664 gcc_assert (item->type == VAR);
1665 bool ret;
1667 if (DECL_INITIAL (decl) == error_mark_node && in_lto_p)
1668 dyn_cast <varpool_node *>(node)->get_constructor ();
1669 if (DECL_INITIAL (item->decl) == error_mark_node && in_lto_p)
1670 dyn_cast <varpool_node *>(item->node)->get_constructor ();
1672 /* As seen in PR ipa/65303 we have to compare variables types. */
1673 if (!func_checker::compatible_types_p (TREE_TYPE (decl),
1674 TREE_TYPE (item->decl)))
1675 return return_false_with_msg ("variables types are different");
1677 ret = sem_variable::equals (DECL_INITIAL (decl),
1678 DECL_INITIAL (item->node->decl));
1679 if (dump_file && (dump_flags & TDF_DETAILS))
1680 fprintf (dump_file,
1681 "Equals called for vars: %s:%s with result: %s\n\n",
1682 node->dump_name (), item->node->dump_name (),
1683 ret ? "true" : "false");
1685 return ret;
1688 /* Compares trees T1 and T2 for semantic equality. */
1690 bool
1691 sem_variable::equals (tree t1, tree t2)
1693 if (!t1 || !t2)
1694 return return_with_debug (t1 == t2);
1695 if (t1 == t2)
1696 return true;
1697 tree_code tc1 = TREE_CODE (t1);
1698 tree_code tc2 = TREE_CODE (t2);
1700 if (tc1 != tc2)
1701 return return_false_with_msg ("TREE_CODE mismatch");
1703 switch (tc1)
1705 case CONSTRUCTOR:
1707 vec<constructor_elt, va_gc> *v1, *v2;
1708 unsigned HOST_WIDE_INT idx;
1710 enum tree_code typecode = TREE_CODE (TREE_TYPE (t1));
1711 if (typecode != TREE_CODE (TREE_TYPE (t2)))
1712 return return_false_with_msg ("constructor type mismatch");
1714 if (typecode == ARRAY_TYPE)
1716 HOST_WIDE_INT size_1 = int_size_in_bytes (TREE_TYPE (t1));
1717 /* For arrays, check that the sizes all match. */
1718 if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2))
1719 || size_1 == -1
1720 || size_1 != int_size_in_bytes (TREE_TYPE (t2)))
1721 return return_false_with_msg ("constructor array size mismatch");
1723 else if (!func_checker::compatible_types_p (TREE_TYPE (t1),
1724 TREE_TYPE (t2)))
1725 return return_false_with_msg ("constructor type incompatible");
1727 v1 = CONSTRUCTOR_ELTS (t1);
1728 v2 = CONSTRUCTOR_ELTS (t2);
1729 if (vec_safe_length (v1) != vec_safe_length (v2))
1730 return return_false_with_msg ("constructor number of elts mismatch");
1732 for (idx = 0; idx < vec_safe_length (v1); ++idx)
1734 constructor_elt *c1 = &(*v1)[idx];
1735 constructor_elt *c2 = &(*v2)[idx];
1737 /* Check that each value is the same... */
1738 if (!sem_variable::equals (c1->value, c2->value))
1739 return false;
1740 /* ... and that they apply to the same fields! */
1741 if (!sem_variable::equals (c1->index, c2->index))
1742 return false;
1744 return true;
1746 case MEM_REF:
1748 tree x1 = TREE_OPERAND (t1, 0);
1749 tree x2 = TREE_OPERAND (t2, 0);
1750 tree y1 = TREE_OPERAND (t1, 1);
1751 tree y2 = TREE_OPERAND (t2, 1);
1753 if (!func_checker::compatible_types_p (TREE_TYPE (x1), TREE_TYPE (x2)))
1754 return return_false ();
1756 /* Type of the offset on MEM_REF does not matter. */
1757 return return_with_debug (sem_variable::equals (x1, x2)
1758 && known_eq (wi::to_poly_offset (y1),
1759 wi::to_poly_offset (y2)));
1761 case ADDR_EXPR:
1762 case FDESC_EXPR:
1764 tree op1 = TREE_OPERAND (t1, 0);
1765 tree op2 = TREE_OPERAND (t2, 0);
1766 return sem_variable::equals (op1, op2);
1768 /* References to other vars/decls are compared using ipa-ref. */
1769 case FUNCTION_DECL:
1770 case VAR_DECL:
1771 if (decl_in_symtab_p (t1) && decl_in_symtab_p (t2))
1772 return true;
1773 return return_false_with_msg ("Declaration mismatch");
1774 case CONST_DECL:
1775 /* TODO: We can check CONST_DECL by its DECL_INITIAL, but for that we
1776 need to process its VAR/FUNCTION references without relying on ipa-ref
1777 compare. */
1778 case FIELD_DECL:
1779 case LABEL_DECL:
1780 return return_false_with_msg ("Declaration mismatch");
1781 case INTEGER_CST:
1782 /* Integer constants are the same only if the same width of type. */
1783 if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
1784 return return_false_with_msg ("INTEGER_CST precision mismatch");
1785 if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2)))
1786 return return_false_with_msg ("INTEGER_CST mode mismatch");
1787 return return_with_debug (tree_int_cst_equal (t1, t2));
1788 case STRING_CST:
1789 if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2)))
1790 return return_false_with_msg ("STRING_CST mode mismatch");
1791 if (TREE_STRING_LENGTH (t1) != TREE_STRING_LENGTH (t2))
1792 return return_false_with_msg ("STRING_CST length mismatch");
1793 if (memcmp (TREE_STRING_POINTER (t1), TREE_STRING_POINTER (t2),
1794 TREE_STRING_LENGTH (t1)))
1795 return return_false_with_msg ("STRING_CST mismatch");
1796 return true;
1797 case FIXED_CST:
1798 /* Fixed constants are the same only if the same width of type. */
1799 if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
1800 return return_false_with_msg ("FIXED_CST precision mismatch");
1802 return return_with_debug (FIXED_VALUES_IDENTICAL (TREE_FIXED_CST (t1),
1803 TREE_FIXED_CST (t2)));
1804 case COMPLEX_CST:
1805 return (sem_variable::equals (TREE_REALPART (t1), TREE_REALPART (t2))
1806 && sem_variable::equals (TREE_IMAGPART (t1), TREE_IMAGPART (t2)));
1807 case REAL_CST:
1808 /* Real constants are the same only if the same width of type. */
1809 if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
1810 return return_false_with_msg ("REAL_CST precision mismatch");
1811 return return_with_debug (real_identical (&TREE_REAL_CST (t1),
1812 &TREE_REAL_CST (t2)));
1813 case VECTOR_CST:
1815 if (maybe_ne (VECTOR_CST_NELTS (t1), VECTOR_CST_NELTS (t2)))
1816 return return_false_with_msg ("VECTOR_CST nelts mismatch");
1818 unsigned int count
1819 = tree_vector_builder::binary_encoded_nelts (t1, t2);
1820 for (unsigned int i = 0; i < count; ++i)
1821 if (!sem_variable::equals (VECTOR_CST_ENCODED_ELT (t1, i),
1822 VECTOR_CST_ENCODED_ELT (t2, i)))
1823 return false;
1825 return true;
1827 case ARRAY_REF:
1828 case ARRAY_RANGE_REF:
1830 tree x1 = TREE_OPERAND (t1, 0);
1831 tree x2 = TREE_OPERAND (t2, 0);
1832 tree y1 = TREE_OPERAND (t1, 1);
1833 tree y2 = TREE_OPERAND (t2, 1);
1835 if (!sem_variable::equals (x1, x2) || !sem_variable::equals (y1, y2))
1836 return false;
1837 if (!sem_variable::equals (array_ref_low_bound (t1),
1838 array_ref_low_bound (t2)))
1839 return false;
1840 if (!sem_variable::equals (array_ref_element_size (t1),
1841 array_ref_element_size (t2)))
1842 return false;
1843 return true;
1846 case COMPONENT_REF:
1847 case POINTER_PLUS_EXPR:
1848 case PLUS_EXPR:
1849 case MINUS_EXPR:
1850 case RANGE_EXPR:
1852 tree x1 = TREE_OPERAND (t1, 0);
1853 tree x2 = TREE_OPERAND (t2, 0);
1854 tree y1 = TREE_OPERAND (t1, 1);
1855 tree y2 = TREE_OPERAND (t2, 1);
1857 return sem_variable::equals (x1, x2) && sem_variable::equals (y1, y2);
1860 CASE_CONVERT:
1861 case VIEW_CONVERT_EXPR:
1862 if (!func_checker::compatible_types_p (TREE_TYPE (t1), TREE_TYPE (t2)))
1863 return return_false ();
1864 return sem_variable::equals (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
1865 case ERROR_MARK:
1866 return return_false_with_msg ("ERROR_MARK");
1867 default:
1868 return return_false_with_msg ("Unknown TREE code reached");
1872 /* Parser function that visits a varpool NODE. */
1874 sem_variable *
1875 sem_variable::parse (varpool_node *node, bitmap_obstack *stack,
1876 func_checker *checker)
1878 if (TREE_THIS_VOLATILE (node->decl) || DECL_HARD_REGISTER (node->decl)
1879 || node->alias)
1880 return NULL;
1882 sem_variable *v = new sem_variable (node, stack);
1883 v->init (checker);
1885 return v;
1888 /* Semantic variable initialization function. */
1890 void
1891 sem_variable::init (ipa_icf_gimple::func_checker *checker)
1893 decl = get_node ()->decl;
1895 /* All WPA streamed in symbols should have their hashes computed at compile
1896 time. At this point, the constructor may not be in memory at all.
1897 DECL_INITIAL (decl) would be error_mark_node in that case. */
1898 if (!m_hash_set)
1900 gcc_assert (!node->lto_file_data);
1901 inchash::hash hstate;
1902 hstate.add_int (456346417);
1903 checker->hash_operand (DECL_INITIAL (decl), hstate, 0);
1904 set_hash (hstate.end ());
1908 /* References independent hash function. */
1910 hashval_t
1911 sem_variable::get_hash (void)
1913 gcc_checking_assert (m_hash_set);
1914 return m_hash;
1917 /* Merges instance with an ALIAS_ITEM, where alias, thunk or redirection can
1918 be applied. */
1920 bool
1921 sem_variable::merge (sem_item *alias_item)
1923 gcc_assert (alias_item->type == VAR);
1925 AUTO_DUMP_SCOPE ("merge",
1926 dump_user_location_t::from_function_decl (decl));
1927 if (!sem_item::target_supports_symbol_aliases_p ())
1929 if (dump_enabled_p ())
1930 dump_printf (MSG_MISSED_OPTIMIZATION, "Not unifying; "
1931 "Symbol aliases are not supported by target\n");
1932 return false;
1935 if (DECL_EXTERNAL (alias_item->decl))
1937 if (dump_enabled_p ())
1938 dump_printf (MSG_MISSED_OPTIMIZATION,
1939 "Not unifying; alias is external.\n");
1940 return false;
1943 sem_variable *alias_var = static_cast<sem_variable *> (alias_item);
1945 varpool_node *original = get_node ();
1946 varpool_node *alias = alias_var->get_node ();
1947 bool original_discardable = false;
1949 bool alias_address_matters = alias->address_matters_p ();
1951 /* See if original is in a section that can be discarded if the main
1952 symbol is not used.
1953 Also consider case where we have resolution info and we know that
1954 original's definition is not going to be used. In this case we cannot
1955 create alias to original. */
1956 if (original->can_be_discarded_p ()
1957 || (node->resolution != LDPR_UNKNOWN
1958 && !decl_binds_to_current_def_p (node->decl)))
1959 original_discardable = true;
1961 gcc_assert (!TREE_ASM_WRITTEN (alias->decl));
1963 /* Constant pool machinery is not quite ready for aliases.
1964 TODO: varasm code contains logic for merging DECL_IN_CONSTANT_POOL.
1965 For LTO merging does not happen that is an important missing feature.
1966 We can enable merging with LTO if the DECL_IN_CONSTANT_POOL
1967 flag is dropped and non-local symbol name is assigned. */
1968 if (DECL_IN_CONSTANT_POOL (alias->decl)
1969 || DECL_IN_CONSTANT_POOL (original->decl))
1971 if (dump_enabled_p ())
1972 dump_printf (MSG_MISSED_OPTIMIZATION,
1973 "Not unifying; constant pool variables.\n");
1974 return false;
1977 /* Do not attempt to mix functions from different user sections;
1978 we do not know what user intends with those. */
1979 if (((DECL_SECTION_NAME (original->decl) && !original->implicit_section)
1980 || (DECL_SECTION_NAME (alias->decl) && !alias->implicit_section))
1981 && DECL_SECTION_NAME (original->decl) != DECL_SECTION_NAME (alias->decl))
1983 if (dump_enabled_p ())
1984 dump_printf (MSG_MISSED_OPTIMIZATION,
1985 "Not unifying; "
1986 "original and alias are in different sections.\n");
1987 return false;
1990 /* We cannot merge if address comparsion metters. */
1991 if (alias_address_matters && flag_merge_constants < 2)
1993 if (dump_enabled_p ())
1994 dump_printf (MSG_MISSED_OPTIMIZATION,
1995 "Not unifying; address of original may be compared.\n");
1996 return false;
1999 if (DECL_ALIGN (original->decl) < DECL_ALIGN (alias->decl))
2001 if (dump_enabled_p ())
2002 dump_printf (MSG_MISSED_OPTIMIZATION,
2003 "Not unifying; "
2004 "original and alias have incompatible alignments\n");
2006 return false;
2009 if (DECL_COMDAT_GROUP (original->decl) != DECL_COMDAT_GROUP (alias->decl))
2011 if (dump_enabled_p ())
2012 dump_printf (MSG_MISSED_OPTIMIZATION,
2013 "Not unifying; alias cannot be created; "
2014 "across comdat group boundary\n");
2016 return false;
2019 if (original_discardable)
2021 if (dump_enabled_p ())
2022 dump_printf (MSG_MISSED_OPTIMIZATION,
2023 "Not unifying; alias cannot be created; "
2024 "target is discardable\n");
2026 return false;
2028 else
2030 gcc_assert (!original->alias);
2031 gcc_assert (!alias->alias);
2033 alias->analyzed = false;
2035 DECL_INITIAL (alias->decl) = NULL;
2036 ((symtab_node *)alias)->call_for_symbol_and_aliases (clear_decl_rtl,
2037 NULL, true);
2038 alias->remove_all_references ();
2039 if (TREE_ADDRESSABLE (alias->decl))
2040 original->call_for_symbol_and_aliases (set_addressable, NULL, true);
2042 varpool_node::create_alias (alias_var->decl, decl);
2043 alias->resolve_alias (original);
2045 if (dump_enabled_p ())
2046 dump_printf (MSG_OPTIMIZED_LOCATIONS,
2047 "Unified; Variable alias has been created.\n");
2049 return true;
2053 /* Dump symbol to FILE. */
2055 void
2056 sem_variable::dump_to_file (FILE *file)
2058 gcc_assert (file);
2060 print_node (file, "", decl, 0);
2061 fprintf (file, "\n\n");
2064 unsigned int sem_item_optimizer::class_id = 0;
2066 sem_item_optimizer::sem_item_optimizer ()
2067 : worklist (0), m_classes (0), m_classes_count (0), m_cgraph_node_hooks (NULL),
2068 m_varpool_node_hooks (NULL), m_merged_variables (), m_references ()
2070 m_items.create (0);
2071 bitmap_obstack_initialize (&m_bmstack);
2074 sem_item_optimizer::~sem_item_optimizer ()
2076 for (unsigned int i = 0; i < m_items.length (); i++)
2077 delete m_items[i];
2080 for (hash_table<congruence_class_hash>::iterator it = m_classes.begin ();
2081 it != m_classes.end (); ++it)
2083 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
2084 delete (*it)->classes[i];
2086 (*it)->classes.release ();
2087 free (*it);
2090 m_items.release ();
2092 bitmap_obstack_release (&m_bmstack);
2093 m_merged_variables.release ();
2096 /* Write IPA ICF summary for symbols. */
2098 void
2099 sem_item_optimizer::write_summary (void)
2101 unsigned int count = 0;
2103 output_block *ob = create_output_block (LTO_section_ipa_icf);
2104 lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
2105 ob->symbol = NULL;
2107 /* Calculate number of symbols to be serialized. */
2108 for (lto_symtab_encoder_iterator lsei = lsei_start_in_partition (encoder);
2109 !lsei_end_p (lsei);
2110 lsei_next_in_partition (&lsei))
2112 symtab_node *node = lsei_node (lsei);
2114 if (m_symtab_node_map.get (node))
2115 count++;
2118 streamer_write_uhwi (ob, count);
2120 /* Process all of the symbols. */
2121 for (lto_symtab_encoder_iterator lsei = lsei_start_in_partition (encoder);
2122 !lsei_end_p (lsei);
2123 lsei_next_in_partition (&lsei))
2125 symtab_node *node = lsei_node (lsei);
2127 sem_item **item = m_symtab_node_map.get (node);
2129 if (item && *item)
2131 int node_ref = lto_symtab_encoder_encode (encoder, node);
2132 streamer_write_uhwi_stream (ob->main_stream, node_ref);
2134 streamer_write_uhwi (ob, (*item)->get_hash ());
2138 streamer_write_char_stream (ob->main_stream, 0);
2139 produce_asm (ob, NULL);
2140 destroy_output_block (ob);
2143 /* Reads a section from LTO stream file FILE_DATA. Input block for DATA
2144 contains LEN bytes. */
2146 void
2147 sem_item_optimizer::read_section (lto_file_decl_data *file_data,
2148 const char *data, size_t len)
2150 const lto_function_header *header
2151 = (const lto_function_header *) data;
2152 const int cfg_offset = sizeof (lto_function_header);
2153 const int main_offset = cfg_offset + header->cfg_size;
2154 const int string_offset = main_offset + header->main_size;
2155 data_in *data_in;
2156 unsigned int i;
2157 unsigned int count;
2159 lto_input_block ib_main ((const char *) data + main_offset, 0,
2160 header->main_size, file_data->mode_table);
2162 data_in
2163 = lto_data_in_create (file_data, (const char *) data + string_offset,
2164 header->string_size, vNULL);
2166 count = streamer_read_uhwi (&ib_main);
2168 for (i = 0; i < count; i++)
2170 unsigned int index;
2171 symtab_node *node;
2172 lto_symtab_encoder_t encoder;
2174 index = streamer_read_uhwi (&ib_main);
2175 encoder = file_data->symtab_node_encoder;
2176 node = lto_symtab_encoder_deref (encoder, index);
2178 hashval_t hash = streamer_read_uhwi (&ib_main);
2179 gcc_assert (node->definition);
2181 if (is_a<cgraph_node *> (node))
2183 cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
2185 sem_function *fn = new sem_function (cnode, &m_bmstack);
2186 fn->set_hash (hash);
2187 m_items.safe_push (fn);
2189 else
2191 varpool_node *vnode = dyn_cast <varpool_node *> (node);
2193 sem_variable *var = new sem_variable (vnode, &m_bmstack);
2194 var->set_hash (hash);
2195 m_items.safe_push (var);
2199 lto_free_section_data (file_data, LTO_section_ipa_icf, NULL, data,
2200 len);
2201 lto_data_in_delete (data_in);
2204 /* Read IPA ICF summary for symbols. */
2206 void
2207 sem_item_optimizer::read_summary (void)
2209 lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
2210 lto_file_decl_data *file_data;
2211 unsigned int j = 0;
2213 while ((file_data = file_data_vec[j++]))
2215 size_t len;
2216 const char *data
2217 = lto_get_summary_section_data (file_data, LTO_section_ipa_icf, &len);
2218 if (data)
2219 read_section (file_data, data, len);
2223 /* Register callgraph and varpool hooks. */
2225 void
2226 sem_item_optimizer::register_hooks (void)
2228 if (!m_cgraph_node_hooks)
2229 m_cgraph_node_hooks = symtab->add_cgraph_removal_hook
2230 (&sem_item_optimizer::cgraph_removal_hook, this);
2232 if (!m_varpool_node_hooks)
2233 m_varpool_node_hooks = symtab->add_varpool_removal_hook
2234 (&sem_item_optimizer::varpool_removal_hook, this);
2237 /* Unregister callgraph and varpool hooks. */
2239 void
2240 sem_item_optimizer::unregister_hooks (void)
2242 if (m_cgraph_node_hooks)
2243 symtab->remove_cgraph_removal_hook (m_cgraph_node_hooks);
2245 if (m_varpool_node_hooks)
2246 symtab->remove_varpool_removal_hook (m_varpool_node_hooks);
2249 /* Adds a CLS to hashtable associated by hash value. */
2251 void
2252 sem_item_optimizer::add_class (congruence_class *cls)
2254 gcc_assert (cls->members.length ());
2256 congruence_class_group *group
2257 = get_group_by_hash (cls->members[0]->get_hash (),
2258 cls->members[0]->type);
2259 group->classes.safe_push (cls);
2262 /* Gets a congruence class group based on given HASH value and TYPE. */
2264 congruence_class_group *
2265 sem_item_optimizer::get_group_by_hash (hashval_t hash, sem_item_type type)
2267 congruence_class_group *item = XNEW (congruence_class_group);
2268 item->hash = hash;
2269 item->type = type;
2271 congruence_class_group **slot = m_classes.find_slot (item, INSERT);
2273 if (*slot)
2274 free (item);
2275 else
2277 item->classes.create (1);
2278 *slot = item;
2281 return *slot;
2284 /* Callgraph removal hook called for a NODE with a custom DATA. */
2286 void
2287 sem_item_optimizer::cgraph_removal_hook (cgraph_node *node, void *data)
2289 sem_item_optimizer *optimizer = (sem_item_optimizer *) data;
2290 optimizer->remove_symtab_node (node);
2293 /* Varpool removal hook called for a NODE with a custom DATA. */
2295 void
2296 sem_item_optimizer::varpool_removal_hook (varpool_node *node, void *data)
2298 sem_item_optimizer *optimizer = (sem_item_optimizer *) data;
2299 optimizer->remove_symtab_node (node);
2302 /* Remove symtab NODE triggered by symtab removal hooks. */
2304 void
2305 sem_item_optimizer::remove_symtab_node (symtab_node *node)
2307 gcc_assert (m_classes.is_empty ());
2309 m_removed_items_set.add (node);
2312 void
2313 sem_item_optimizer::remove_item (sem_item *item)
2315 if (m_symtab_node_map.get (item->node))
2316 m_symtab_node_map.remove (item->node);
2317 delete item;
2320 /* Removes all callgraph and varpool nodes that are marked by symtab
2321 as deleted. */
2323 void
2324 sem_item_optimizer::filter_removed_items (void)
2326 auto_vec <sem_item *> filtered;
2328 for (unsigned int i = 0; i < m_items.length(); i++)
2330 sem_item *item = m_items[i];
2332 if (m_removed_items_set.contains (item->node))
2334 remove_item (item);
2335 continue;
2338 if (item->type == FUNC)
2340 cgraph_node *cnode = static_cast <sem_function *>(item)->get_node ();
2342 if (in_lto_p && (cnode->alias || cnode->body_removed))
2343 remove_item (item);
2344 else
2345 filtered.safe_push (item);
2347 else /* VAR. */
2349 if (!flag_ipa_icf_variables)
2350 remove_item (item);
2351 else
2353 /* Filter out non-readonly variables. */
2354 tree decl = item->decl;
2355 if (TREE_READONLY (decl))
2356 filtered.safe_push (item);
2357 else
2358 remove_item (item);
2363 /* Clean-up of released semantic items. */
2365 m_items.release ();
2366 for (unsigned int i = 0; i < filtered.length(); i++)
2367 m_items.safe_push (filtered[i]);
2370 /* Optimizer entry point which returns true in case it processes
2371 a merge operation. True is returned if there's a merge operation
2372 processed. */
2374 bool
2375 sem_item_optimizer::execute (void)
2377 filter_removed_items ();
2378 unregister_hooks ();
2380 build_graph ();
2381 update_hash_by_addr_refs ();
2382 build_hash_based_classes ();
2384 if (dump_file)
2385 fprintf (dump_file, "Dump after hash based groups\n");
2386 dump_cong_classes ();
2388 subdivide_classes_by_equality (true);
2390 if (dump_file)
2391 fprintf (dump_file, "Dump after WPA based types groups\n");
2393 dump_cong_classes ();
2395 process_cong_reduction ();
2396 checking_verify_classes ();
2398 if (dump_file)
2399 fprintf (dump_file, "Dump after callgraph-based congruence reduction\n");
2401 dump_cong_classes ();
2403 unsigned int loaded_symbols = parse_nonsingleton_classes ();
2404 subdivide_classes_by_equality ();
2406 if (dump_file)
2407 fprintf (dump_file, "Dump after full equality comparison of groups\n");
2409 dump_cong_classes ();
2411 unsigned int prev_class_count = m_classes_count;
2413 process_cong_reduction ();
2414 dump_cong_classes ();
2415 checking_verify_classes ();
2416 bool merged_p = merge_classes (prev_class_count, loaded_symbols);
2418 if (dump_file && (dump_flags & TDF_DETAILS))
2419 symtab->dump (dump_file);
2421 return merged_p;
2424 /* Function responsible for visiting all potential functions and
2425 read-only variables that can be merged. */
2427 void
2428 sem_item_optimizer::parse_funcs_and_vars (void)
2430 cgraph_node *cnode;
2432 /* Create dummy func_checker for hashing purpose. */
2433 func_checker checker;
2435 if (flag_ipa_icf_functions)
2436 FOR_EACH_DEFINED_FUNCTION (cnode)
2438 sem_function *f = sem_function::parse (cnode, &m_bmstack, &checker);
2439 if (f)
2441 m_items.safe_push (f);
2442 m_symtab_node_map.put (cnode, f);
2446 varpool_node *vnode;
2448 if (flag_ipa_icf_variables)
2449 FOR_EACH_DEFINED_VARIABLE (vnode)
2451 sem_variable *v = sem_variable::parse (vnode, &m_bmstack, &checker);
2453 if (v)
2455 m_items.safe_push (v);
2456 m_symtab_node_map.put (vnode, v);
2461 /* Makes pairing between a congruence class CLS and semantic ITEM. */
2463 void
2464 sem_item_optimizer::add_item_to_class (congruence_class *cls, sem_item *item)
2466 item->index_in_class = cls->members.length ();
2467 cls->members.safe_push (item);
2468 cls->referenced_by_count += item->referenced_by_count;
2469 item->cls = cls;
2472 /* For each semantic item, append hash values of references. */
2474 void
2475 sem_item_optimizer::update_hash_by_addr_refs ()
2477 /* First, append to hash sensitive references and class type if it need to
2478 be matched for ODR. */
2479 for (unsigned i = 0; i < m_items.length (); i++)
2481 m_items[i]->update_hash_by_addr_refs (m_symtab_node_map);
2482 if (m_items[i]->type == FUNC)
2484 if (TREE_CODE (TREE_TYPE (m_items[i]->decl)) == METHOD_TYPE
2485 && contains_polymorphic_type_p
2486 (TYPE_METHOD_BASETYPE (TREE_TYPE (m_items[i]->decl)))
2487 && (DECL_CXX_CONSTRUCTOR_P (m_items[i]->decl)
2488 || (static_cast<sem_function *> (m_items[i])->param_used_p (0)
2489 && static_cast<sem_function *> (m_items[i])
2490 ->compare_polymorphic_p ())))
2492 tree class_type
2493 = TYPE_METHOD_BASETYPE (TREE_TYPE (m_items[i]->decl));
2494 inchash::hash hstate (m_items[i]->get_hash ());
2496 if (TYPE_NAME (class_type)
2497 && DECL_ASSEMBLER_NAME_SET_P (TYPE_NAME (class_type)))
2498 hstate.add_hwi
2499 (IDENTIFIER_HASH_VALUE
2500 (DECL_ASSEMBLER_NAME (TYPE_NAME (class_type))));
2502 m_items[i]->set_hash (hstate.end ());
2507 /* Once all symbols have enhanced hash value, we can append
2508 hash values of symbols that are seen by IPA ICF and are
2509 references by a semantic item. Newly computed values
2510 are saved to global_hash member variable. */
2511 for (unsigned i = 0; i < m_items.length (); i++)
2512 m_items[i]->update_hash_by_local_refs (m_symtab_node_map);
2514 /* Global hash value replace current hash values. */
2515 for (unsigned i = 0; i < m_items.length (); i++)
2516 m_items[i]->set_hash (m_items[i]->global_hash);
2519 /* Congruence classes are built by hash value. */
2521 void
2522 sem_item_optimizer::build_hash_based_classes (void)
2524 for (unsigned i = 0; i < m_items.length (); i++)
2526 sem_item *item = m_items[i];
2528 congruence_class_group *group
2529 = get_group_by_hash (item->get_hash (), item->type);
2531 if (!group->classes.length ())
2533 m_classes_count++;
2534 group->classes.safe_push (new congruence_class (class_id++));
2537 add_item_to_class (group->classes[0], item);
2541 /* Build references according to call graph. */
2543 void
2544 sem_item_optimizer::build_graph (void)
2546 for (unsigned i = 0; i < m_items.length (); i++)
2548 sem_item *item = m_items[i];
2549 m_symtab_node_map.put (item->node, item);
2551 /* Initialize hash values if we are not in LTO mode. */
2552 if (!in_lto_p)
2553 item->get_hash ();
2556 for (unsigned i = 0; i < m_items.length (); i++)
2558 sem_item *item = m_items[i];
2560 if (item->type == FUNC)
2562 cgraph_node *cnode = dyn_cast <cgraph_node *> (item->node);
2564 cgraph_edge *e = cnode->callees;
2565 while (e)
2567 sem_item **slot = m_symtab_node_map.get
2568 (e->callee->ultimate_alias_target ());
2569 if (slot)
2570 item->add_reference (&m_references, *slot);
2572 e = e->next_callee;
2576 ipa_ref *ref = NULL;
2577 for (unsigned i = 0; item->node->iterate_reference (i, ref); i++)
2579 sem_item **slot = m_symtab_node_map.get
2580 (ref->referred->ultimate_alias_target ());
2581 if (slot)
2582 item->add_reference (&m_references, *slot);
2587 /* Semantic items in classes having more than one element and initialized.
2588 In case of WPA, we load function body. */
2590 unsigned int
2591 sem_item_optimizer::parse_nonsingleton_classes (void)
2593 unsigned int counter = 0;
2595 /* Create dummy func_checker for hashing purpose. */
2596 func_checker checker;
2598 for (unsigned i = 0; i < m_items.length (); i++)
2599 if (m_items[i]->cls->members.length () > 1)
2601 m_items[i]->init (&checker);
2602 ++counter;
2605 if (dump_file)
2607 float f = m_items.length () ? 100.0f * counter / m_items.length () : 0.0f;
2608 fprintf (dump_file, "Init called for %u items (%.2f%%).\n", counter, f);
2611 return counter;
2614 /* Equality function for semantic items is used to subdivide existing
2615 classes. If IN_WPA, fast equality function is invoked. */
2617 void
2618 sem_item_optimizer::subdivide_classes_by_equality (bool in_wpa)
2620 for (hash_table <congruence_class_hash>::iterator it = m_classes.begin ();
2621 it != m_classes.end (); ++it)
2623 unsigned int class_count = (*it)->classes.length ();
2625 for (unsigned i = 0; i < class_count; i++)
2627 congruence_class *c = (*it)->classes[i];
2629 if (c->members.length() > 1)
2631 auto_vec <sem_item *> new_vector;
2633 sem_item *first = c->members[0];
2634 new_vector.safe_push (first);
2636 unsigned class_split_first = (*it)->classes.length ();
2638 for (unsigned j = 1; j < c->members.length (); j++)
2640 sem_item *item = c->members[j];
2642 bool equals
2643 = in_wpa ? first->equals_wpa (item, m_symtab_node_map)
2644 : first->equals (item, m_symtab_node_map);
2646 if (equals)
2647 new_vector.safe_push (item);
2648 else
2650 bool integrated = false;
2652 for (unsigned k = class_split_first;
2653 k < (*it)->classes.length (); k++)
2655 sem_item *x = (*it)->classes[k]->members[0];
2656 bool equals
2657 = in_wpa ? x->equals_wpa (item, m_symtab_node_map)
2658 : x->equals (item, m_symtab_node_map);
2660 if (equals)
2662 integrated = true;
2663 add_item_to_class ((*it)->classes[k], item);
2665 break;
2669 if (!integrated)
2671 congruence_class *c
2672 = new congruence_class (class_id++);
2673 m_classes_count++;
2674 add_item_to_class (c, item);
2676 (*it)->classes.safe_push (c);
2681 // We replace newly created new_vector for the class we've just
2682 // splitted.
2683 c->members.release ();
2684 c->members.create (new_vector.length ());
2686 for (unsigned int j = 0; j < new_vector.length (); j++)
2687 add_item_to_class (c, new_vector[j]);
2692 checking_verify_classes ();
2695 /* Subdivide classes by address references that members of the class
2696 reference. Example can be a pair of functions that have an address
2697 taken from a function. If these addresses are different the class
2698 is split. */
2700 unsigned
2701 sem_item_optimizer::subdivide_classes_by_sensitive_refs ()
2703 typedef hash_map <symbol_compare_hash, vec <sem_item *> > subdivide_hash_map;
2705 unsigned newly_created_classes = 0;
2707 for (hash_table <congruence_class_hash>::iterator it = m_classes.begin ();
2708 it != m_classes.end (); ++it)
2710 unsigned int class_count = (*it)->classes.length ();
2711 auto_vec<congruence_class *> new_classes;
2713 for (unsigned i = 0; i < class_count; i++)
2715 congruence_class *c = (*it)->classes[i];
2717 if (c->members.length() > 1)
2719 subdivide_hash_map split_map;
2721 for (unsigned j = 0; j < c->members.length (); j++)
2723 sem_item *source_node = c->members[j];
2725 symbol_compare_collection *collection
2726 = new symbol_compare_collection (source_node->node);
2728 bool existed;
2729 vec <sem_item *> *slot
2730 = &split_map.get_or_insert (collection, &existed);
2731 gcc_checking_assert (slot);
2733 slot->safe_push (source_node);
2735 if (existed)
2736 delete collection;
2739 /* If the map contains more than one key, we have to split
2740 the map appropriately. */
2741 if (split_map.elements () != 1)
2743 bool first_class = true;
2745 for (subdivide_hash_map::iterator it2 = split_map.begin ();
2746 it2 != split_map.end (); ++it2)
2748 congruence_class *new_cls;
2749 new_cls = new congruence_class (class_id++);
2751 for (unsigned k = 0; k < (*it2).second.length (); k++)
2752 add_item_to_class (new_cls, (*it2).second[k]);
2754 worklist_push (new_cls);
2755 newly_created_classes++;
2757 if (first_class)
2759 (*it)->classes[i] = new_cls;
2760 first_class = false;
2762 else
2764 new_classes.safe_push (new_cls);
2765 m_classes_count++;
2770 /* Release memory. */
2771 for (subdivide_hash_map::iterator it2 = split_map.begin ();
2772 it2 != split_map.end (); ++it2)
2774 delete (*it2).first;
2775 (*it2).second.release ();
2780 for (unsigned i = 0; i < new_classes.length (); i++)
2781 (*it)->classes.safe_push (new_classes[i]);
2784 return newly_created_classes;
2787 /* Verify congruence classes, if checking is enabled. */
2789 void
2790 sem_item_optimizer::checking_verify_classes (void)
2792 if (flag_checking)
2793 verify_classes ();
2796 /* Verify congruence classes. */
2798 void
2799 sem_item_optimizer::verify_classes (void)
2801 for (hash_table<congruence_class_hash>::iterator it = m_classes.begin ();
2802 it != m_classes.end (); ++it)
2804 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
2806 congruence_class *cls = (*it)->classes[i];
2808 gcc_assert (cls);
2809 gcc_assert (cls->members.length () > 0);
2811 for (unsigned int j = 0; j < cls->members.length (); j++)
2813 sem_item *item = cls->members[j];
2815 gcc_assert (item);
2816 gcc_assert (item->cls == cls);
2822 /* Disposes split map traverse function. CLS_PTR is pointer to congruence
2823 class, BSLOT is bitmap slot we want to release. DATA is mandatory,
2824 but unused argument. */
2826 bool
2827 sem_item_optimizer::release_split_map (congruence_class * const &,
2828 bitmap const &b, traverse_split_pair *)
2830 bitmap bmp = b;
2832 BITMAP_FREE (bmp);
2834 return true;
2837 /* Process split operation for a class given as pointer CLS_PTR,
2838 where bitmap B splits congruence class members. DATA is used
2839 as argument of split pair. */
2841 bool
2842 sem_item_optimizer::traverse_congruence_split (congruence_class * const &cls,
2843 bitmap const &b,
2844 traverse_split_pair *pair)
2846 sem_item_optimizer *optimizer = pair->optimizer;
2847 const congruence_class *splitter_cls = pair->cls;
2849 /* If counted bits are greater than zero and less than the number of members
2850 a group will be splitted. */
2851 unsigned popcount = bitmap_count_bits (b);
2853 if (popcount > 0 && popcount < cls->members.length ())
2855 auto_vec <congruence_class *, 2> newclasses;
2856 newclasses.quick_push (new congruence_class (class_id++));
2857 newclasses.quick_push (new congruence_class (class_id++));
2859 for (unsigned int i = 0; i < cls->members.length (); i++)
2861 int target = bitmap_bit_p (b, i);
2862 congruence_class *tc = newclasses[target];
2864 add_item_to_class (tc, cls->members[i]);
2867 if (flag_checking)
2869 for (unsigned int i = 0; i < 2; i++)
2870 gcc_assert (newclasses[i]->members.length ());
2873 if (splitter_cls == cls)
2874 optimizer->splitter_class_removed = true;
2876 /* Remove old class from worklist if presented. */
2877 bool in_worklist = cls->in_worklist;
2879 if (in_worklist)
2880 cls->in_worklist = false;
2882 congruence_class_group g;
2883 g.hash = cls->members[0]->get_hash ();
2884 g.type = cls->members[0]->type;
2886 congruence_class_group *slot = optimizer->m_classes.find (&g);
2888 for (unsigned int i = 0; i < slot->classes.length (); i++)
2889 if (slot->classes[i] == cls)
2891 slot->classes.ordered_remove (i);
2892 break;
2895 /* New class will be inserted and integrated to work list. */
2896 for (unsigned int i = 0; i < 2; i++)
2897 optimizer->add_class (newclasses[i]);
2899 /* Two classes replace one, so that increment just by one. */
2900 optimizer->m_classes_count++;
2902 /* If OLD class was presented in the worklist, we remove the class
2903 and replace it will both newly created classes. */
2904 if (in_worklist)
2905 for (unsigned int i = 0; i < 2; i++)
2906 optimizer->worklist_push (newclasses[i]);
2907 else /* Just smaller class is inserted. */
2909 unsigned int smaller_index
2910 = (newclasses[0]->members.length ()
2911 < newclasses[1]->members.length ()
2912 ? 0 : 1);
2913 optimizer->worklist_push (newclasses[smaller_index]);
2916 if (dump_file && (dump_flags & TDF_DETAILS))
2918 fprintf (dump_file, " congruence class splitted:\n");
2919 cls->dump (dump_file, 4);
2921 fprintf (dump_file, " newly created groups:\n");
2922 for (unsigned int i = 0; i < 2; i++)
2923 newclasses[i]->dump (dump_file, 4);
2926 /* Release class if not presented in work list. */
2927 if (!in_worklist)
2928 delete cls;
2930 return true;
2933 return false;
2936 /* Compare function for sorting pairs in do_congruence_step_f. */
2939 sem_item_optimizer::sort_congruence_split (const void *a_, const void *b_)
2941 const std::pair<congruence_class *, bitmap> *a
2942 = (const std::pair<congruence_class *, bitmap> *)a_;
2943 const std::pair<congruence_class *, bitmap> *b
2944 = (const std::pair<congruence_class *, bitmap> *)b_;
2945 if (a->first->id < b->first->id)
2946 return -1;
2947 else if (a->first->id > b->first->id)
2948 return 1;
2949 return 0;
2952 /* Tests if a class CLS used as INDEXth splits any congruence classes.
2953 Bitmap stack BMSTACK is used for bitmap allocation. */
2955 bool
2956 sem_item_optimizer::do_congruence_step_for_index (congruence_class *cls,
2957 unsigned int index)
2959 hash_map <congruence_class *, bitmap> split_map;
2961 for (unsigned int i = 0; i < cls->members.length (); i++)
2963 sem_item *item = cls->members[i];
2964 sem_usage_pair needle (item, index);
2965 vec<sem_item *> *callers = m_references.get (&needle);
2966 if (callers == NULL)
2967 continue;
2969 for (unsigned int j = 0; j < callers->length (); j++)
2971 sem_item *caller = (*callers)[j];
2972 if (caller->cls->members.length () < 2)
2973 continue;
2974 bitmap *slot = split_map.get (caller->cls);
2975 bitmap b;
2977 if(!slot)
2979 b = BITMAP_ALLOC (&m_bmstack);
2980 split_map.put (caller->cls, b);
2982 else
2983 b = *slot;
2985 gcc_checking_assert (caller->cls);
2986 gcc_checking_assert (caller->index_in_class
2987 < caller->cls->members.length ());
2989 bitmap_set_bit (b, caller->index_in_class);
2993 auto_vec<std::pair<congruence_class *, bitmap> > to_split;
2994 to_split.reserve_exact (split_map.elements ());
2995 for (hash_map <congruence_class *, bitmap>::iterator i = split_map.begin ();
2996 i != split_map.end (); ++i)
2997 to_split.safe_push (*i);
2998 to_split.qsort (sort_congruence_split);
3000 traverse_split_pair pair;
3001 pair.optimizer = this;
3002 pair.cls = cls;
3004 splitter_class_removed = false;
3005 bool r = false;
3006 for (unsigned i = 0; i < to_split.length (); ++i)
3007 r |= traverse_congruence_split (to_split[i].first, to_split[i].second,
3008 &pair);
3010 /* Bitmap clean-up. */
3011 split_map.traverse <traverse_split_pair *,
3012 sem_item_optimizer::release_split_map> (NULL);
3014 return r;
3017 /* Every usage of a congruence class CLS is a candidate that can split the
3018 collection of classes. Bitmap stack BMSTACK is used for bitmap
3019 allocation. */
3021 void
3022 sem_item_optimizer::do_congruence_step (congruence_class *cls)
3024 bitmap_iterator bi;
3025 unsigned int i;
3027 bitmap usage = BITMAP_ALLOC (&m_bmstack);
3029 for (unsigned int i = 0; i < cls->members.length (); i++)
3030 bitmap_ior_into (usage, cls->members[i]->usage_index_bitmap);
3032 EXECUTE_IF_SET_IN_BITMAP (usage, 0, i, bi)
3034 if (dump_file && (dump_flags & TDF_DETAILS))
3035 fprintf (dump_file, " processing congruence step for class: %u "
3036 "(%u items, %u references), index: %u\n", cls->id,
3037 cls->referenced_by_count, cls->members.length (), i);
3038 do_congruence_step_for_index (cls, i);
3040 if (splitter_class_removed)
3041 break;
3044 BITMAP_FREE (usage);
3047 /* Adds a newly created congruence class CLS to worklist. */
3049 void
3050 sem_item_optimizer::worklist_push (congruence_class *cls)
3052 /* Return if the class CLS is already presented in work list. */
3053 if (cls->in_worklist)
3054 return;
3056 cls->in_worklist = true;
3057 worklist.insert (cls->referenced_by_count, cls);
3060 /* Pops a class from worklist. */
3062 congruence_class *
3063 sem_item_optimizer::worklist_pop (void)
3065 congruence_class *cls;
3067 while (!worklist.empty ())
3069 cls = worklist.extract_min ();
3070 if (cls->in_worklist)
3072 cls->in_worklist = false;
3074 return cls;
3076 else
3078 /* Work list item was already intended to be removed.
3079 The only reason for doing it is to split a class.
3080 Thus, the class CLS is deleted. */
3081 delete cls;
3085 return NULL;
3088 /* Iterative congruence reduction function. */
3090 void
3091 sem_item_optimizer::process_cong_reduction (void)
3093 for (hash_table<congruence_class_hash>::iterator it = m_classes.begin ();
3094 it != m_classes.end (); ++it)
3095 for (unsigned i = 0; i < (*it)->classes.length (); i++)
3096 if ((*it)->classes[i]->is_class_used ())
3097 worklist_push ((*it)->classes[i]);
3099 if (dump_file)
3100 fprintf (dump_file, "Worklist has been filled with: %lu\n",
3101 (unsigned long) worklist.nodes ());
3103 if (dump_file && (dump_flags & TDF_DETAILS))
3104 fprintf (dump_file, "Congruence class reduction\n");
3106 congruence_class *cls;
3108 /* Process complete congruence reduction. */
3109 while ((cls = worklist_pop ()) != NULL)
3110 do_congruence_step (cls);
3112 /* Subdivide newly created classes according to references. */
3113 unsigned new_classes = subdivide_classes_by_sensitive_refs ();
3115 if (dump_file)
3116 fprintf (dump_file, "Address reference subdivision created: %u "
3117 "new classes.\n", new_classes);
3120 /* Debug function prints all informations about congruence classes. */
3122 void
3123 sem_item_optimizer::dump_cong_classes (void)
3125 if (!dump_file)
3126 return;
3128 /* Histogram calculation. */
3129 unsigned int max_index = 0;
3130 unsigned int single_element_classes = 0;
3131 unsigned int* histogram = XCNEWVEC (unsigned int, m_items.length () + 1);
3133 for (hash_table<congruence_class_hash>::iterator it = m_classes.begin ();
3134 it != m_classes.end (); ++it)
3135 for (unsigned i = 0; i < (*it)->classes.length (); i++)
3137 unsigned int c = (*it)->classes[i]->members.length ();
3138 histogram[c]++;
3140 if (c > max_index)
3141 max_index = c;
3143 if (c == 1)
3144 ++single_element_classes;
3147 fprintf (dump_file,
3148 "Congruence classes: %lu with total: %u items (in a non-singular "
3149 "class: %u)\n", (unsigned long) m_classes.elements (),
3150 m_items.length (), m_items.length () - single_element_classes);
3151 fprintf (dump_file,
3152 "Class size histogram [num of members]: number of classe number "
3153 "of classess\n");
3154 for (unsigned int i = 0; i <= max_index; i++)
3155 if (histogram[i])
3156 fprintf (dump_file, "%6u: %6u\n", i, histogram[i]);
3158 if (dump_flags & TDF_DETAILS)
3159 for (hash_table<congruence_class_hash>::iterator it = m_classes.begin ();
3160 it != m_classes.end (); ++it)
3162 fprintf (dump_file, " group: with %u classes:\n",
3163 (*it)->classes.length ());
3165 for (unsigned i = 0; i < (*it)->classes.length (); i++)
3167 (*it)->classes[i]->dump (dump_file, 4);
3169 if (i < (*it)->classes.length () - 1)
3170 fprintf (dump_file, " ");
3174 free (histogram);
3177 /* Sort pair of sem_items A and B by DECL_UID. */
3179 static int
3180 sort_sem_items_by_decl_uid (const void *a, const void *b)
3182 const sem_item *i1 = *(const sem_item * const *)a;
3183 const sem_item *i2 = *(const sem_item * const *)b;
3185 int uid1 = DECL_UID (i1->decl);
3186 int uid2 = DECL_UID (i2->decl);
3187 return uid1 - uid2;
3190 /* Sort pair of congruence_classes A and B by DECL_UID of the first member. */
3192 static int
3193 sort_congruence_classes_by_decl_uid (const void *a, const void *b)
3195 const congruence_class *c1 = *(const congruence_class * const *)a;
3196 const congruence_class *c2 = *(const congruence_class * const *)b;
3198 int uid1 = DECL_UID (c1->members[0]->decl);
3199 int uid2 = DECL_UID (c2->members[0]->decl);
3200 return uid1 - uid2;
3203 /* Sort pair of congruence_class_groups A and B by
3204 DECL_UID of the first member of a first group. */
3206 static int
3207 sort_congruence_class_groups_by_decl_uid (const void *a, const void *b)
3209 const std::pair<congruence_class_group *, int> *g1
3210 = (const std::pair<congruence_class_group *, int> *) a;
3211 const std::pair<congruence_class_group *, int> *g2
3212 = (const std::pair<congruence_class_group *, int> *) b;
3213 return g1->second - g2->second;
3216 /* After reduction is done, we can declare all items in a group
3217 to be equal. PREV_CLASS_COUNT is start number of classes
3218 before reduction. True is returned if there's a merge operation
3219 processed. LOADED_SYMBOLS is number of symbols that were loaded
3220 in WPA. */
3222 bool
3223 sem_item_optimizer::merge_classes (unsigned int prev_class_count,
3224 unsigned int loaded_symbols)
3226 unsigned int item_count = m_items.length ();
3227 unsigned int class_count = m_classes_count;
3228 unsigned int equal_items = item_count - class_count;
3230 unsigned int non_singular_classes_count = 0;
3231 unsigned int non_singular_classes_sum = 0;
3233 bool merged_p = false;
3235 /* PR lto/78211
3236 Sort functions in congruence classes by DECL_UID and do the same
3237 for the classes to not to break -fcompare-debug. */
3239 for (hash_table<congruence_class_hash>::iterator it = m_classes.begin ();
3240 it != m_classes.end (); ++it)
3242 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
3244 congruence_class *c = (*it)->classes[i];
3245 c->members.qsort (sort_sem_items_by_decl_uid);
3248 (*it)->classes.qsort (sort_congruence_classes_by_decl_uid);
3251 for (hash_table<congruence_class_hash>::iterator it = m_classes.begin ();
3252 it != m_classes.end (); ++it)
3253 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
3255 congruence_class *c = (*it)->classes[i];
3256 if (c->members.length () > 1)
3258 non_singular_classes_count++;
3259 non_singular_classes_sum += c->members.length ();
3263 auto_vec<std::pair<congruence_class_group *, int> > classes (
3264 m_classes.elements ());
3265 for (hash_table<congruence_class_hash>::iterator it = m_classes.begin ();
3266 it != m_classes.end (); ++it)
3268 int uid = DECL_UID ((*it)->classes[0]->members[0]->decl);
3269 classes.quick_push (std::pair<congruence_class_group *, int> (*it, uid));
3272 classes.qsort (sort_congruence_class_groups_by_decl_uid);
3274 if (dump_file)
3276 fprintf (dump_file, "\nItem count: %u\n", item_count);
3277 fprintf (dump_file, "Congruent classes before: %u, after: %u\n",
3278 prev_class_count, class_count);
3279 fprintf (dump_file, "Average class size before: %.2f, after: %.2f\n",
3280 prev_class_count ? 1.0f * item_count / prev_class_count : 0.0f,
3281 class_count ? 1.0f * item_count / class_count : 0.0f);
3282 fprintf (dump_file, "Average non-singular class size: %.2f, count: %u\n",
3283 non_singular_classes_count ? 1.0f * non_singular_classes_sum /
3284 non_singular_classes_count : 0.0f,
3285 non_singular_classes_count);
3286 fprintf (dump_file, "Equal symbols: %u\n", equal_items);
3287 unsigned total = equal_items + non_singular_classes_count;
3288 fprintf (dump_file, "Totally needed symbols: %u"
3289 ", fraction of loaded symbols: %.2f%%\n\n", total,
3290 loaded_symbols ? 100.0f * total / loaded_symbols: 0.0f);
3293 unsigned int l;
3294 std::pair<congruence_class_group *, int> *it;
3295 FOR_EACH_VEC_ELT (classes, l, it)
3296 for (unsigned int i = 0; i < it->first->classes.length (); i++)
3298 congruence_class *c = it->first->classes[i];
3300 if (c->members.length () == 1)
3301 continue;
3303 sem_item *source = c->members[0];
3305 if (DECL_NAME (source->decl)
3306 && MAIN_NAME_P (DECL_NAME (source->decl)))
3307 /* If merge via wrappers, picking main as the target can be
3308 problematic. */
3309 source = c->members[1];
3311 for (unsigned int j = 0; j < c->members.length (); j++)
3313 sem_item *alias = c->members[j];
3315 if (alias == source)
3316 continue;
3318 dump_user_location_t loc
3319 = dump_user_location_t::from_function_decl (source->decl);
3320 if (dump_enabled_p ())
3322 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc,
3323 "Semantic equality hit:%s->%s\n",
3324 xstrdup_for_dump (source->node->name ()),
3325 xstrdup_for_dump (alias->node->name ()));
3326 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc,
3327 "Assembler symbol names:%s->%s\n",
3328 xstrdup_for_dump (source->node->asm_name ()),
3329 xstrdup_for_dump (alias->node->asm_name ()));
3332 if (lookup_attribute ("no_icf", DECL_ATTRIBUTES (alias->decl)))
3334 if (dump_enabled_p ())
3335 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc,
3336 "Merge operation is skipped due to no_icf "
3337 "attribute.\n");
3338 continue;
3341 if (dump_file && (dump_flags & TDF_DETAILS))
3343 source->dump_to_file (dump_file);
3344 alias->dump_to_file (dump_file);
3347 if (dbg_cnt (merged_ipa_icf))
3349 bool merged = source->merge (alias);
3350 merged_p |= merged;
3352 if (merged && alias->type == VAR)
3354 symtab_pair p = symtab_pair (source->node, alias->node);
3355 m_merged_variables.safe_push (p);
3361 if (!m_merged_variables.is_empty ())
3362 fixup_points_to_sets ();
3364 return merged_p;
3367 /* Fixup points to set PT. */
3369 void
3370 sem_item_optimizer::fixup_pt_set (struct pt_solution *pt)
3372 if (pt->vars == NULL)
3373 return;
3375 unsigned i;
3376 symtab_pair *item;
3377 FOR_EACH_VEC_ELT (m_merged_variables, i, item)
3378 if (bitmap_bit_p (pt->vars, DECL_UID (item->second->decl)))
3379 bitmap_set_bit (pt->vars, DECL_UID (item->first->decl));
3382 /* Set all points-to UIDs of aliases pointing to node N as UID. */
3384 static void
3385 set_alias_uids (symtab_node *n, int uid)
3387 ipa_ref *ref;
3388 FOR_EACH_ALIAS (n, ref)
3390 if (dump_file)
3391 fprintf (dump_file, " Setting points-to UID of [%s] as %d\n",
3392 xstrdup_for_dump (ref->referring->asm_name ()), uid);
3394 SET_DECL_PT_UID (ref->referring->decl, uid);
3395 set_alias_uids (ref->referring, uid);
3399 /* Fixup points to analysis info. */
3401 void
3402 sem_item_optimizer::fixup_points_to_sets (void)
3404 /* TODO: remove in GCC 9 and trigger PTA re-creation after IPA passes. */
3405 cgraph_node *cnode;
3407 FOR_EACH_DEFINED_FUNCTION (cnode)
3409 tree name;
3410 unsigned i;
3411 function *fn = DECL_STRUCT_FUNCTION (cnode->decl);
3412 if (!gimple_in_ssa_p (fn))
3413 continue;
3415 FOR_EACH_SSA_NAME (i, name, fn)
3416 if (POINTER_TYPE_P (TREE_TYPE (name))
3417 && SSA_NAME_PTR_INFO (name))
3418 fixup_pt_set (&SSA_NAME_PTR_INFO (name)->pt);
3419 fixup_pt_set (&fn->gimple_df->escaped);
3421 /* The above get's us to 99% I guess, at least catching the
3422 address compares. Below also gets us aliasing correct
3423 but as said we're giving leeway to the situation with
3424 readonly vars anyway, so ... */
3425 basic_block bb;
3426 FOR_EACH_BB_FN (bb, fn)
3427 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
3428 gsi_next (&gsi))
3430 gcall *call = dyn_cast<gcall *> (gsi_stmt (gsi));
3431 if (call)
3433 fixup_pt_set (gimple_call_use_set (call));
3434 fixup_pt_set (gimple_call_clobber_set (call));
3439 unsigned i;
3440 symtab_pair *item;
3441 FOR_EACH_VEC_ELT (m_merged_variables, i, item)
3442 set_alias_uids (item->first, DECL_UID (item->first->decl));
3445 /* Dump function prints all class members to a FILE with an INDENT. */
3447 void
3448 congruence_class::dump (FILE *file, unsigned int indent) const
3450 FPRINTF_SPACES (file, indent, "class with id: %u, hash: %u, items: %u\n",
3451 id, members[0]->get_hash (), members.length ());
3453 FPUTS_SPACES (file, indent + 2, "");
3454 for (unsigned i = 0; i < members.length (); i++)
3455 fprintf (file, "%s ", members[i]->node->dump_asm_name ());
3457 fprintf (file, "\n");
3460 /* Returns true if there's a member that is used from another group. */
3462 bool
3463 congruence_class::is_class_used (void)
3465 for (unsigned int i = 0; i < members.length (); i++)
3466 if (members[i]->referenced_by_count)
3467 return true;
3469 return false;
3472 /* Generate pass summary for IPA ICF pass. */
3474 static void
3475 ipa_icf_generate_summary (void)
3477 if (!optimizer)
3478 optimizer = new sem_item_optimizer ();
3480 optimizer->register_hooks ();
3481 optimizer->parse_funcs_and_vars ();
3484 /* Write pass summary for IPA ICF pass. */
3486 static void
3487 ipa_icf_write_summary (void)
3489 gcc_assert (optimizer);
3491 optimizer->write_summary ();
3494 /* Read pass summary for IPA ICF pass. */
3496 static void
3497 ipa_icf_read_summary (void)
3499 if (!optimizer)
3500 optimizer = new sem_item_optimizer ();
3502 optimizer->read_summary ();
3503 optimizer->register_hooks ();
3506 /* Semantic equality exection function. */
3508 static unsigned int
3509 ipa_icf_driver (void)
3511 gcc_assert (optimizer);
3513 bool merged_p = optimizer->execute ();
3515 delete optimizer;
3516 optimizer = NULL;
3518 return merged_p ? TODO_remove_functions : 0;
3521 const pass_data pass_data_ipa_icf =
3523 IPA_PASS, /* type */
3524 "icf", /* name */
3525 OPTGROUP_IPA, /* optinfo_flags */
3526 TV_IPA_ICF, /* tv_id */
3527 0, /* properties_required */
3528 0, /* properties_provided */
3529 0, /* properties_destroyed */
3530 0, /* todo_flags_start */
3531 0, /* todo_flags_finish */
3534 class pass_ipa_icf : public ipa_opt_pass_d
3536 public:
3537 pass_ipa_icf (gcc::context *ctxt)
3538 : ipa_opt_pass_d (pass_data_ipa_icf, ctxt,
3539 ipa_icf_generate_summary, /* generate_summary */
3540 ipa_icf_write_summary, /* write_summary */
3541 ipa_icf_read_summary, /* read_summary */
3542 NULL, /*
3543 write_optimization_summary */
3544 NULL, /*
3545 read_optimization_summary */
3546 NULL, /* stmt_fixup */
3547 0, /* function_transform_todo_flags_start */
3548 NULL, /* function_transform */
3549 NULL) /* variable_transform */
3552 /* opt_pass methods: */
3553 virtual bool gate (function *)
3555 return in_lto_p || flag_ipa_icf_variables || flag_ipa_icf_functions;
3558 virtual unsigned int execute (function *)
3560 return ipa_icf_driver();
3562 }; // class pass_ipa_icf
3564 } // ipa_icf namespace
3566 ipa_opt_pass_d *
3567 make_pass_ipa_icf (gcc::context *ctxt)
3569 return new ipa_icf::pass_ipa_icf (ctxt);