Fix nb_iterations calculation in tree-vect-loop-manip.c
[official-gcc.git] / gcc / ipa-icf.c
blob1ab67f316a4262a3943cf32bc095cbbf8399bbc9
1 /* Interprocedural Identical Code Folding pass
2 Copyright (C) 2014-2016 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 #define INCLUDE_LIST
56 #include "system.h"
57 #include "coretypes.h"
58 #include "backend.h"
59 #include "target.h"
60 #include "rtl.h"
61 #include "tree.h"
62 #include "gimple.h"
63 #include "alloc-pool.h"
64 #include "tree-pass.h"
65 #include "ssa.h"
66 #include "cgraph.h"
67 #include "coverage.h"
68 #include "gimple-pretty-print.h"
69 #include "data-streamer.h"
70 #include "fold-const.h"
71 #include "calls.h"
72 #include "varasm.h"
73 #include "gimple-iterator.h"
74 #include "tree-cfg.h"
75 #include "symbol-summary.h"
76 #include "ipa-prop.h"
77 #include "ipa-inline.h"
78 #include "except.h"
79 #include "attribs.h"
80 #include "print-tree.h"
81 #include "ipa-utils.h"
82 #include "ipa-icf-gimple.h"
83 #include "ipa-icf.h"
84 #include "stor-layout.h"
85 #include "dbgcnt.h"
87 using namespace ipa_icf_gimple;
89 namespace ipa_icf {
91 /* Initialization and computation of symtab node hash, there data
92 are propagated later on. */
94 static sem_item_optimizer *optimizer = NULL;
96 /* Constructor. */
98 symbol_compare_collection::symbol_compare_collection (symtab_node *node)
100 m_references.create (0);
101 m_interposables.create (0);
103 ipa_ref *ref;
105 if (is_a <varpool_node *> (node) && DECL_VIRTUAL_P (node->decl))
106 return;
108 for (unsigned i = 0; node->iterate_reference (i, ref); i++)
110 if (ref->address_matters_p ())
111 m_references.safe_push (ref->referred);
113 if (ref->referred->get_availability () <= AVAIL_INTERPOSABLE)
115 if (ref->address_matters_p ())
116 m_references.safe_push (ref->referred);
117 else
118 m_interposables.safe_push (ref->referred);
122 if (is_a <cgraph_node *> (node))
124 cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
126 for (cgraph_edge *e = cnode->callees; e; e = e->next_callee)
127 if (e->callee->get_availability () <= AVAIL_INTERPOSABLE)
128 m_interposables.safe_push (e->callee);
132 /* Constructor for key value pair, where _ITEM is key and _INDEX is a target. */
134 sem_usage_pair::sem_usage_pair (sem_item *_item, unsigned int _index):
135 item (_item), index (_index)
139 /* Semantic item constructor for a node of _TYPE, where STACK is used
140 for bitmap memory allocation. */
142 sem_item::sem_item (sem_item_type _type,
143 bitmap_obstack *stack): type (_type), m_hash (0)
145 setup (stack);
148 /* Semantic item constructor for a node of _TYPE, where STACK is used
149 for bitmap memory allocation. The item is based on symtab node _NODE
150 with computed _HASH. */
152 sem_item::sem_item (sem_item_type _type, symtab_node *_node,
153 hashval_t _hash, bitmap_obstack *stack): type(_type),
154 node (_node), m_hash (_hash)
156 decl = node->decl;
157 setup (stack);
160 /* Add reference to a semantic TARGET. */
162 void
163 sem_item::add_reference (sem_item *target)
165 refs.safe_push (target);
166 unsigned index = refs.length ();
167 target->usages.safe_push (new sem_usage_pair(this, index));
168 bitmap_set_bit (target->usage_index_bitmap, index);
169 refs_set.add (target->node);
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 refs.create (0);
181 tree_refs.create (0);
182 usages.create (0);
183 usage_index_bitmap = BITMAP_ALLOC (stack);
186 sem_item::~sem_item ()
188 for (unsigned i = 0; i < usages.length (); i++)
189 delete usages[i];
191 refs.release ();
192 tree_refs.release ();
193 usages.release ();
195 BITMAP_FREE (usage_index_bitmap);
198 /* Dump function for debugging purpose. */
200 DEBUG_FUNCTION void
201 sem_item::dump (void)
203 if (dump_file)
205 fprintf (dump_file, "[%s] %s (%u) (tree:%p)\n", type == FUNC ? "func" : "var",
206 node->name(), node->order, (void *) node->decl);
207 fprintf (dump_file, " hash: %u\n", get_hash ());
208 fprintf (dump_file, " references: ");
210 for (unsigned i = 0; i < refs.length (); i++)
211 fprintf (dump_file, "%s%s ", refs[i]->node->name (),
212 i < refs.length() - 1 ? "," : "");
214 fprintf (dump_file, "\n");
218 /* Return true if target supports alias symbols. */
220 bool
221 sem_item::target_supports_symbol_aliases_p (void)
223 #if !defined (ASM_OUTPUT_DEF) || (!defined(ASM_OUTPUT_WEAK_ALIAS) && !defined (ASM_WEAKEN_DECL))
224 return false;
225 #else
226 return true;
227 #endif
230 void sem_item::set_hash (hashval_t hash)
232 m_hash = hash;
235 /* Semantic function constructor that uses STACK as bitmap memory stack. */
237 sem_function::sem_function (bitmap_obstack *stack): sem_item (FUNC, stack),
238 m_checker (NULL), m_compared_func (NULL)
240 bb_sizes.create (0);
241 bb_sorted.create (0);
244 /* Constructor based on callgraph node _NODE with computed hash _HASH.
245 Bitmap STACK is used for memory allocation. */
246 sem_function::sem_function (cgraph_node *node, hashval_t hash,
247 bitmap_obstack *stack):
248 sem_item (FUNC, node, hash, stack),
249 m_checker (NULL), m_compared_func (NULL)
251 bb_sizes.create (0);
252 bb_sorted.create (0);
255 sem_function::~sem_function ()
257 for (unsigned i = 0; i < bb_sorted.length (); i++)
258 delete (bb_sorted[i]);
260 bb_sizes.release ();
261 bb_sorted.release ();
264 /* Calculates hash value based on a BASIC_BLOCK. */
266 hashval_t
267 sem_function::get_bb_hash (const sem_bb *basic_block)
269 inchash::hash hstate;
271 hstate.add_int (basic_block->nondbg_stmt_count);
272 hstate.add_int (basic_block->edge_count);
274 return hstate.end ();
277 /* References independent hash function. */
279 hashval_t
280 sem_function::get_hash (void)
282 if (!m_hash)
284 inchash::hash hstate;
285 hstate.add_int (177454); /* Random number for function type. */
287 hstate.add_int (arg_count);
288 hstate.add_int (cfg_checksum);
289 hstate.add_int (gcode_hash);
291 for (unsigned i = 0; i < bb_sorted.length (); i++)
292 hstate.merge_hash (get_bb_hash (bb_sorted[i]));
294 for (unsigned i = 0; i < bb_sizes.length (); i++)
295 hstate.add_int (bb_sizes[i]);
297 /* Add common features of declaration itself. */
298 if (DECL_FUNCTION_SPECIFIC_TARGET (decl))
299 hstate.add_wide_int
300 (cl_target_option_hash
301 (TREE_TARGET_OPTION (DECL_FUNCTION_SPECIFIC_TARGET (decl))));
302 if (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (decl))
303 hstate.add_wide_int
304 (cl_optimization_hash
305 (TREE_OPTIMIZATION (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (decl))));
306 hstate.add_flag (DECL_CXX_CONSTRUCTOR_P (decl));
307 hstate.add_flag (DECL_CXX_DESTRUCTOR_P (decl));
309 set_hash (hstate.end ());
312 return m_hash;
315 /* Return ture if A1 and A2 represent equivalent function attribute lists.
316 Based on comp_type_attributes. */
318 bool
319 sem_item::compare_attributes (const_tree a1, const_tree a2)
321 const_tree a;
322 if (a1 == a2)
323 return true;
324 for (a = a1; a != NULL_TREE; a = TREE_CHAIN (a))
326 const struct attribute_spec *as;
327 const_tree attr;
329 as = lookup_attribute_spec (get_attribute_name (a));
330 /* TODO: We can introduce as->affects_decl_identity
331 and as->affects_decl_reference_identity if attribute mismatch
332 gets a common reason to give up on merging. It may not be worth
333 the effort.
334 For example returns_nonnull affects only references, while
335 optimize attribute can be ignored because it is already lowered
336 into flags representation and compared separately. */
337 if (!as)
338 continue;
340 attr = lookup_attribute (as->name, CONST_CAST_TREE (a2));
341 if (!attr || !attribute_value_equal (a, attr))
342 break;
344 if (!a)
346 for (a = a2; a != NULL_TREE; a = TREE_CHAIN (a))
348 const struct attribute_spec *as;
350 as = lookup_attribute_spec (get_attribute_name (a));
351 if (!as)
352 continue;
354 if (!lookup_attribute (as->name, CONST_CAST_TREE (a1)))
355 break;
356 /* We don't need to compare trees again, as we did this
357 already in first loop. */
359 if (!a)
360 return true;
362 /* TODO: As in comp_type_attributes we may want to introduce target hook. */
363 return false;
366 /* Compare properties of symbols N1 and N2 that does not affect semantics of
367 symbol itself but affects semantics of its references from USED_BY (which
368 may be NULL if it is unknown). If comparsion is false, symbols
369 can still be merged but any symbols referring them can't.
371 If ADDRESS is true, do extra checking needed for IPA_REF_ADDR.
373 TODO: We can also split attributes to those that determine codegen of
374 a function body/variable constructor itself and those that are used when
375 referring to it. */
377 bool
378 sem_item::compare_referenced_symbol_properties (symtab_node *used_by,
379 symtab_node *n1,
380 symtab_node *n2,
381 bool address)
383 if (is_a <cgraph_node *> (n1))
385 /* Inline properties matters: we do now want to merge uses of inline
386 function to uses of normal function because inline hint would be lost.
387 We however can merge inline function to noinline because the alias
388 will keep its DECL_DECLARED_INLINE flag.
390 Also ignore inline flag when optimizing for size or when function
391 is known to not be inlinable.
393 TODO: the optimize_size checks can also be assumed to be true if
394 unit has no !optimize_size functions. */
396 if ((!used_by || address || !is_a <cgraph_node *> (used_by)
397 || !opt_for_fn (used_by->decl, optimize_size))
398 && !opt_for_fn (n1->decl, optimize_size)
399 && n1->get_availability () > AVAIL_INTERPOSABLE
400 && (!DECL_UNINLINABLE (n1->decl) || !DECL_UNINLINABLE (n2->decl)))
402 if (DECL_DISREGARD_INLINE_LIMITS (n1->decl)
403 != DECL_DISREGARD_INLINE_LIMITS (n2->decl))
404 return return_false_with_msg
405 ("DECL_DISREGARD_INLINE_LIMITS are different");
407 if (DECL_DECLARED_INLINE_P (n1->decl)
408 != DECL_DECLARED_INLINE_P (n2->decl))
409 return return_false_with_msg ("inline attributes are different");
412 if (DECL_IS_OPERATOR_NEW (n1->decl)
413 != DECL_IS_OPERATOR_NEW (n2->decl))
414 return return_false_with_msg ("operator new flags are different");
417 /* Merging two definitions with a reference to equivalent vtables, but
418 belonging to a different type may result in ipa-polymorphic-call analysis
419 giving a wrong answer about the dynamic type of instance. */
420 if (is_a <varpool_node *> (n1))
422 if ((DECL_VIRTUAL_P (n1->decl) || DECL_VIRTUAL_P (n2->decl))
423 && (DECL_VIRTUAL_P (n1->decl) != DECL_VIRTUAL_P (n2->decl)
424 || !types_must_be_same_for_odr (DECL_CONTEXT (n1->decl),
425 DECL_CONTEXT (n2->decl)))
426 && (!used_by || !is_a <cgraph_node *> (used_by) || address
427 || opt_for_fn (used_by->decl, flag_devirtualize)))
428 return return_false_with_msg
429 ("references to virtual tables can not be merged");
431 if (address && DECL_ALIGN (n1->decl) != DECL_ALIGN (n2->decl))
432 return return_false_with_msg ("alignment mismatch");
434 /* For functions we compare attributes in equals_wpa, because we do
435 not know what attributes may cause codegen differences, but for
436 variables just compare attributes for references - the codegen
437 for constructors is affected only by those attributes that we lower
438 to explicit representation (such as DECL_ALIGN or DECL_SECTION). */
439 if (!compare_attributes (DECL_ATTRIBUTES (n1->decl),
440 DECL_ATTRIBUTES (n2->decl)))
441 return return_false_with_msg ("different var decl attributes");
442 if (comp_type_attributes (TREE_TYPE (n1->decl),
443 TREE_TYPE (n2->decl)) != 1)
444 return return_false_with_msg ("different var type attributes");
447 /* When matching virtual tables, be sure to also match information
448 relevant for polymorphic call analysis. */
449 if (used_by && is_a <varpool_node *> (used_by)
450 && DECL_VIRTUAL_P (used_by->decl))
452 if (DECL_VIRTUAL_P (n1->decl) != DECL_VIRTUAL_P (n2->decl))
453 return return_false_with_msg ("virtual flag mismatch");
454 if (DECL_VIRTUAL_P (n1->decl) && is_a <cgraph_node *> (n1)
455 && (DECL_FINAL_P (n1->decl) != DECL_FINAL_P (n2->decl)))
456 return return_false_with_msg ("final flag mismatch");
458 return true;
461 /* Hash properties that are compared by compare_referenced_symbol_properties. */
463 void
464 sem_item::hash_referenced_symbol_properties (symtab_node *ref,
465 inchash::hash &hstate,
466 bool address)
468 if (is_a <cgraph_node *> (ref))
470 if ((type != FUNC || address || !opt_for_fn (decl, optimize_size))
471 && !opt_for_fn (ref->decl, optimize_size)
472 && !DECL_UNINLINABLE (ref->decl))
474 hstate.add_flag (DECL_DISREGARD_INLINE_LIMITS (ref->decl));
475 hstate.add_flag (DECL_DECLARED_INLINE_P (ref->decl));
477 hstate.add_flag (DECL_IS_OPERATOR_NEW (ref->decl));
479 else if (is_a <varpool_node *> (ref))
481 hstate.add_flag (DECL_VIRTUAL_P (ref->decl));
482 if (address)
483 hstate.add_int (DECL_ALIGN (ref->decl));
488 /* For a given symbol table nodes N1 and N2, we check that FUNCTION_DECLs
489 point to a same function. Comparison can be skipped if IGNORED_NODES
490 contains these nodes. ADDRESS indicate if address is taken. */
492 bool
493 sem_item::compare_symbol_references (
494 hash_map <symtab_node *, sem_item *> &ignored_nodes,
495 symtab_node *n1, symtab_node *n2, bool address)
497 enum availability avail1, avail2;
499 if (n1 == n2)
500 return true;
502 /* Never match variable and function. */
503 if (is_a <varpool_node *> (n1) != is_a <varpool_node *> (n2))
504 return false;
506 if (!compare_referenced_symbol_properties (node, n1, n2, address))
507 return false;
508 if (address && n1->equal_address_to (n2) == 1)
509 return true;
510 if (!address && n1->semantically_equivalent_p (n2))
511 return true;
513 n1 = n1->ultimate_alias_target (&avail1);
514 n2 = n2->ultimate_alias_target (&avail2);
516 if (avail1 > AVAIL_INTERPOSABLE && ignored_nodes.get (n1)
517 && avail2 > AVAIL_INTERPOSABLE && ignored_nodes.get (n2))
518 return true;
520 return return_false_with_msg ("different references");
523 /* If cgraph edges E1 and E2 are indirect calls, verify that
524 ECF flags are the same. */
526 bool sem_function::compare_edge_flags (cgraph_edge *e1, cgraph_edge *e2)
528 if (e1->indirect_info && e2->indirect_info)
530 int e1_flags = e1->indirect_info->ecf_flags;
531 int e2_flags = e2->indirect_info->ecf_flags;
533 if (e1_flags != e2_flags)
534 return return_false_with_msg ("ICF flags are different");
536 else if (e1->indirect_info || e2->indirect_info)
537 return false;
539 return true;
542 /* Return true if parameter I may be used. */
544 bool
545 sem_function::param_used_p (unsigned int i)
547 if (ipa_node_params_sum == NULL)
548 return true;
550 struct ipa_node_params *parms_info = IPA_NODE_REF (get_node ());
552 if (parms_info->descriptors.is_empty ()
553 || parms_info->descriptors.length () <= i)
554 return true;
556 return ipa_is_param_used (IPA_NODE_REF (get_node ()), i);
559 /* Perform additional check needed to match types function parameters that are
560 used. Unlike for normal decls it matters if type is TYPE_RESTRICT and we
561 make an assumption that REFERENCE_TYPE parameters are always non-NULL. */
563 bool
564 sem_function::compatible_parm_types_p (tree parm1, tree parm2)
566 /* Be sure that parameters are TBAA compatible. */
567 if (!func_checker::compatible_types_p (parm1, parm2))
568 return return_false_with_msg ("parameter type is not compatible");
570 if (POINTER_TYPE_P (parm1)
571 && (TYPE_RESTRICT (parm1) != TYPE_RESTRICT (parm2)))
572 return return_false_with_msg ("argument restrict flag mismatch");
574 /* nonnull_arg_p implies non-zero range to REFERENCE types. */
575 if (POINTER_TYPE_P (parm1)
576 && TREE_CODE (parm1) != TREE_CODE (parm2)
577 && opt_for_fn (decl, flag_delete_null_pointer_checks))
578 return return_false_with_msg ("pointer wrt reference mismatch");
580 return true;
583 /* Fast equality function based on knowledge known in WPA. */
585 bool
586 sem_function::equals_wpa (sem_item *item,
587 hash_map <symtab_node *, sem_item *> &ignored_nodes)
589 gcc_assert (item->type == FUNC);
590 cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
591 cgraph_node *cnode2 = dyn_cast <cgraph_node *> (item->node);
593 m_compared_func = static_cast<sem_function *> (item);
595 if (cnode->thunk.thunk_p != cnode2->thunk.thunk_p)
596 return return_false_with_msg ("thunk_p mismatch");
598 if (cnode->thunk.thunk_p)
600 if (cnode->thunk.fixed_offset != cnode2->thunk.fixed_offset)
601 return return_false_with_msg ("thunk fixed_offset mismatch");
602 if (cnode->thunk.virtual_value != cnode2->thunk.virtual_value)
603 return return_false_with_msg ("thunk virtual_value mismatch");
604 if (cnode->thunk.this_adjusting != cnode2->thunk.this_adjusting)
605 return return_false_with_msg ("thunk this_adjusting mismatch");
606 if (cnode->thunk.virtual_offset_p != cnode2->thunk.virtual_offset_p)
607 return return_false_with_msg ("thunk virtual_offset_p mismatch");
608 if (cnode->thunk.add_pointer_bounds_args
609 != cnode2->thunk.add_pointer_bounds_args)
610 return return_false_with_msg ("thunk add_pointer_bounds_args mismatch");
613 /* Compare special function DECL attributes. */
614 if (DECL_FUNCTION_PERSONALITY (decl)
615 != DECL_FUNCTION_PERSONALITY (item->decl))
616 return return_false_with_msg ("function personalities are different");
618 if (DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl)
619 != DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (item->decl))
620 return return_false_with_msg ("intrument function entry exit "
621 "attributes are different");
623 if (DECL_NO_LIMIT_STACK (decl) != DECL_NO_LIMIT_STACK (item->decl))
624 return return_false_with_msg ("no stack limit attributes are different");
626 if (DECL_CXX_CONSTRUCTOR_P (decl) != DECL_CXX_CONSTRUCTOR_P (item->decl))
627 return return_false_with_msg ("DECL_CXX_CONSTRUCTOR mismatch");
629 if (DECL_CXX_DESTRUCTOR_P (decl) != DECL_CXX_DESTRUCTOR_P (item->decl))
630 return return_false_with_msg ("DECL_CXX_DESTRUCTOR mismatch");
632 /* TODO: pure/const flags mostly matters only for references, except for
633 the fact that codegen takes LOOPING flag as a hint that loops are
634 finite. We may arrange the code to always pick leader that has least
635 specified flags and then this can go into comparing symbol properties. */
636 if (flags_from_decl_or_type (decl) != flags_from_decl_or_type (item->decl))
637 return return_false_with_msg ("decl_or_type flags are different");
639 /* Do not match polymorphic constructors of different types. They calls
640 type memory location for ipa-polymorphic-call and we do not want
641 it to get confused by wrong type. */
642 if (DECL_CXX_CONSTRUCTOR_P (decl)
643 && TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE)
645 if (TREE_CODE (TREE_TYPE (item->decl)) != METHOD_TYPE)
646 return return_false_with_msg ("DECL_CXX_CONSTURCTOR type mismatch");
647 else if (!func_checker::compatible_polymorphic_types_p
648 (TYPE_METHOD_BASETYPE (TREE_TYPE (decl)),
649 TYPE_METHOD_BASETYPE (TREE_TYPE (item->decl)), false))
650 return return_false_with_msg ("ctor polymorphic type mismatch");
653 /* Checking function TARGET and OPTIMIZATION flags. */
654 cl_target_option *tar1 = target_opts_for_fn (decl);
655 cl_target_option *tar2 = target_opts_for_fn (item->decl);
657 if (tar1 != tar2 && !cl_target_option_eq (tar1, tar2))
659 if (dump_file && (dump_flags & TDF_DETAILS))
661 fprintf (dump_file, "target flags difference");
662 cl_target_option_print_diff (dump_file, 2, tar1, tar2);
665 return return_false_with_msg ("Target flags are different");
668 cl_optimization *opt1 = opts_for_fn (decl);
669 cl_optimization *opt2 = opts_for_fn (item->decl);
671 if (opt1 != opt2 && memcmp (opt1, opt2, sizeof(cl_optimization)))
673 if (dump_file && (dump_flags & TDF_DETAILS))
675 fprintf (dump_file, "optimization flags difference");
676 cl_optimization_print_diff (dump_file, 2, opt1, opt2);
679 return return_false_with_msg ("optimization flags are different");
682 /* Result type checking. */
683 if (!func_checker::compatible_types_p
684 (TREE_TYPE (TREE_TYPE (decl)),
685 TREE_TYPE (TREE_TYPE (m_compared_func->decl))))
686 return return_false_with_msg ("result types are different");
688 /* Checking types of arguments. */
689 tree list1 = TYPE_ARG_TYPES (TREE_TYPE (decl)),
690 list2 = TYPE_ARG_TYPES (TREE_TYPE (m_compared_func->decl));
691 for (unsigned i = 0; list1 && list2;
692 list1 = TREE_CHAIN (list1), list2 = TREE_CHAIN (list2), i++)
694 tree parm1 = TREE_VALUE (list1);
695 tree parm2 = TREE_VALUE (list2);
697 /* This guard is here for function pointer with attributes (pr59927.c). */
698 if (!parm1 || !parm2)
699 return return_false_with_msg ("NULL argument type");
701 /* Verify that types are compatible to ensure that both functions
702 have same calling conventions. */
703 if (!types_compatible_p (parm1, parm2))
704 return return_false_with_msg ("parameter types are not compatible");
706 if (!param_used_p (i))
707 continue;
709 /* Perform additional checks for used parameters. */
710 if (!compatible_parm_types_p (parm1, parm2))
711 return false;
714 if (list1 || list2)
715 return return_false_with_msg ("Mismatched number of parameters");
717 if (node->num_references () != item->node->num_references ())
718 return return_false_with_msg ("different number of references");
720 /* Checking function attributes.
721 This is quadratic in number of attributes */
722 if (comp_type_attributes (TREE_TYPE (decl),
723 TREE_TYPE (item->decl)) != 1)
724 return return_false_with_msg ("different type attributes");
725 if (!compare_attributes (DECL_ATTRIBUTES (decl),
726 DECL_ATTRIBUTES (item->decl)))
727 return return_false_with_msg ("different decl attributes");
729 /* The type of THIS pointer type memory location for
730 ipa-polymorphic-call-analysis. */
731 if (opt_for_fn (decl, flag_devirtualize)
732 && (TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE
733 || TREE_CODE (TREE_TYPE (item->decl)) == METHOD_TYPE)
734 && param_used_p (0)
735 && compare_polymorphic_p ())
737 if (TREE_CODE (TREE_TYPE (decl)) != TREE_CODE (TREE_TYPE (item->decl)))
738 return return_false_with_msg ("METHOD_TYPE and FUNCTION_TYPE mismatch");
739 if (!func_checker::compatible_polymorphic_types_p
740 (TYPE_METHOD_BASETYPE (TREE_TYPE (decl)),
741 TYPE_METHOD_BASETYPE (TREE_TYPE (item->decl)), false))
742 return return_false_with_msg ("THIS pointer ODR type mismatch");
745 ipa_ref *ref = NULL, *ref2 = NULL;
746 for (unsigned i = 0; node->iterate_reference (i, ref); i++)
748 item->node->iterate_reference (i, ref2);
750 if (ref->use != ref2->use)
751 return return_false_with_msg ("reference use mismatch");
753 if (!compare_symbol_references (ignored_nodes, ref->referred,
754 ref2->referred,
755 ref->address_matters_p ()))
756 return false;
759 cgraph_edge *e1 = dyn_cast <cgraph_node *> (node)->callees;
760 cgraph_edge *e2 = dyn_cast <cgraph_node *> (item->node)->callees;
762 while (e1 && e2)
764 if (!compare_symbol_references (ignored_nodes, e1->callee,
765 e2->callee, false))
766 return false;
767 if (!compare_edge_flags (e1, e2))
768 return false;
770 e1 = e1->next_callee;
771 e2 = e2->next_callee;
774 if (e1 || e2)
775 return return_false_with_msg ("different number of calls");
777 e1 = dyn_cast <cgraph_node *> (node)->indirect_calls;
778 e2 = dyn_cast <cgraph_node *> (item->node)->indirect_calls;
780 while (e1 && e2)
782 if (!compare_edge_flags (e1, e2))
783 return false;
785 e1 = e1->next_callee;
786 e2 = e2->next_callee;
789 if (e1 || e2)
790 return return_false_with_msg ("different number of indirect calls");
792 return true;
795 /* Update hash by address sensitive references. We iterate over all
796 sensitive references (address_matters_p) and we hash ultime alias
797 target of these nodes, which can improve a semantic item hash.
799 Also hash in referenced symbols properties. This can be done at any time
800 (as the properties should not change), but it is convenient to do it here
801 while we walk the references anyway. */
803 void
804 sem_item::update_hash_by_addr_refs (hash_map <symtab_node *,
805 sem_item *> &m_symtab_node_map)
807 ipa_ref* ref;
808 inchash::hash hstate (get_hash ());
810 for (unsigned i = 0; node->iterate_reference (i, ref); i++)
812 hstate.add_int (ref->use);
813 hash_referenced_symbol_properties (ref->referred, hstate,
814 ref->use == IPA_REF_ADDR);
815 if (ref->address_matters_p () || !m_symtab_node_map.get (ref->referred))
816 hstate.add_int (ref->referred->ultimate_alias_target ()->order);
819 if (is_a <cgraph_node *> (node))
821 for (cgraph_edge *e = dyn_cast <cgraph_node *> (node)->callers; e;
822 e = e->next_caller)
824 sem_item **result = m_symtab_node_map.get (e->callee);
825 hash_referenced_symbol_properties (e->callee, hstate, false);
826 if (!result)
827 hstate.add_int (e->callee->ultimate_alias_target ()->order);
831 set_hash (hstate.end ());
834 /* Update hash by computed local hash values taken from different
835 semantic items.
836 TODO: stronger SCC based hashing would be desirable here. */
838 void
839 sem_item::update_hash_by_local_refs (hash_map <symtab_node *,
840 sem_item *> &m_symtab_node_map)
842 ipa_ref* ref;
843 inchash::hash state (get_hash ());
845 for (unsigned j = 0; node->iterate_reference (j, ref); j++)
847 sem_item **result = m_symtab_node_map.get (ref->referring);
848 if (result)
849 state.merge_hash ((*result)->get_hash ());
852 if (type == FUNC)
854 for (cgraph_edge *e = dyn_cast <cgraph_node *> (node)->callees; e;
855 e = e->next_callee)
857 sem_item **result = m_symtab_node_map.get (e->caller);
858 if (result)
859 state.merge_hash ((*result)->get_hash ());
863 global_hash = state.end ();
866 /* Returns true if the item equals to ITEM given as argument. */
868 bool
869 sem_function::equals (sem_item *item,
870 hash_map <symtab_node *, sem_item *> &)
872 gcc_assert (item->type == FUNC);
873 bool eq = equals_private (item);
875 if (m_checker != NULL)
877 delete m_checker;
878 m_checker = NULL;
881 if (dump_file && (dump_flags & TDF_DETAILS))
882 fprintf (dump_file,
883 "Equals called for:%s:%s (%u:%u) (%s:%s) with result: %s\n\n",
884 xstrdup_for_dump (node->name()),
885 xstrdup_for_dump (item->node->name ()),
886 node->order,
887 item->node->order,
888 xstrdup_for_dump (node->asm_name ()),
889 xstrdup_for_dump (item->node->asm_name ()),
890 eq ? "true" : "false");
892 return eq;
895 /* Processes function equality comparison. */
897 bool
898 sem_function::equals_private (sem_item *item)
900 if (item->type != FUNC)
901 return false;
903 basic_block bb1, bb2;
904 edge e1, e2;
905 edge_iterator ei1, ei2;
906 bool result = true;
907 tree arg1, arg2;
909 m_compared_func = static_cast<sem_function *> (item);
911 gcc_assert (decl != item->decl);
913 if (bb_sorted.length () != m_compared_func->bb_sorted.length ()
914 || edge_count != m_compared_func->edge_count
915 || cfg_checksum != m_compared_func->cfg_checksum)
916 return return_false ();
918 m_checker = new func_checker (decl, m_compared_func->decl,
919 compare_polymorphic_p (),
920 false,
921 &refs_set,
922 &m_compared_func->refs_set);
923 arg1 = DECL_ARGUMENTS (decl);
924 arg2 = DECL_ARGUMENTS (m_compared_func->decl);
925 for (unsigned i = 0;
926 arg1 && arg2; arg1 = DECL_CHAIN (arg1), arg2 = DECL_CHAIN (arg2), i++)
928 if (!types_compatible_p (TREE_TYPE (arg1), TREE_TYPE (arg2)))
929 return return_false_with_msg ("argument types are not compatible");
930 if (!param_used_p (i))
931 continue;
932 /* Perform additional checks for used parameters. */
933 if (!compatible_parm_types_p (TREE_TYPE (arg1), TREE_TYPE (arg2)))
934 return false;
935 if (!m_checker->compare_decl (arg1, arg2))
936 return return_false ();
938 if (arg1 || arg2)
939 return return_false_with_msg ("Mismatched number of arguments");
941 if (!dyn_cast <cgraph_node *> (node)->has_gimple_body_p ())
942 return true;
944 /* Fill-up label dictionary. */
945 for (unsigned i = 0; i < bb_sorted.length (); ++i)
947 m_checker->parse_labels (bb_sorted[i]);
948 m_checker->parse_labels (m_compared_func->bb_sorted[i]);
951 /* Checking all basic blocks. */
952 for (unsigned i = 0; i < bb_sorted.length (); ++i)
953 if(!m_checker->compare_bb (bb_sorted[i], m_compared_func->bb_sorted[i]))
954 return return_false();
956 dump_message ("All BBs are equal\n");
958 auto_vec <int> bb_dict;
960 /* Basic block edges check. */
961 for (unsigned i = 0; i < bb_sorted.length (); ++i)
963 bb1 = bb_sorted[i]->bb;
964 bb2 = m_compared_func->bb_sorted[i]->bb;
966 ei2 = ei_start (bb2->preds);
968 for (ei1 = ei_start (bb1->preds); ei_cond (ei1, &e1); ei_next (&ei1))
970 ei_cond (ei2, &e2);
972 if (e1->flags != e2->flags)
973 return return_false_with_msg ("flags comparison returns false");
975 if (!bb_dict_test (&bb_dict, e1->src->index, e2->src->index))
976 return return_false_with_msg ("edge comparison returns false");
978 if (!bb_dict_test (&bb_dict, e1->dest->index, e2->dest->index))
979 return return_false_with_msg ("BB comparison returns false");
981 if (!m_checker->compare_edge (e1, e2))
982 return return_false_with_msg ("edge comparison returns false");
984 ei_next (&ei2);
988 /* Basic block PHI nodes comparison. */
989 for (unsigned i = 0; i < bb_sorted.length (); i++)
990 if (!compare_phi_node (bb_sorted[i]->bb, m_compared_func->bb_sorted[i]->bb))
991 return return_false_with_msg ("PHI node comparison returns false");
993 return result;
996 /* Set LOCAL_P of NODE to true if DATA is non-NULL.
997 Helper for call_for_symbol_thunks_and_aliases. */
999 static bool
1000 set_local (cgraph_node *node, void *data)
1002 node->local.local = data != NULL;
1003 return false;
1006 /* TREE_ADDRESSABLE of NODE to true.
1007 Helper for call_for_symbol_thunks_and_aliases. */
1009 static bool
1010 set_addressable (varpool_node *node, void *)
1012 TREE_ADDRESSABLE (node->decl) = 1;
1013 return false;
1016 /* Clear DECL_RTL of NODE.
1017 Helper for call_for_symbol_thunks_and_aliases. */
1019 static bool
1020 clear_decl_rtl (symtab_node *node, void *)
1022 SET_DECL_RTL (node->decl, NULL);
1023 return false;
1026 /* Redirect all callers of N and its aliases to TO. Remove aliases if
1027 possible. Return number of redirections made. */
1029 static int
1030 redirect_all_callers (cgraph_node *n, cgraph_node *to)
1032 int nredirected = 0;
1033 ipa_ref *ref;
1034 cgraph_edge *e = n->callers;
1036 while (e)
1038 /* Redirecting thunks to interposable symbols or symbols in other sections
1039 may not be supported by target output code. Play safe for now and
1040 punt on redirection. */
1041 if (!e->caller->thunk.thunk_p)
1043 struct cgraph_edge *nexte = e->next_caller;
1044 e->redirect_callee (to);
1045 e = nexte;
1046 nredirected++;
1048 else
1049 e = e->next_callee;
1051 for (unsigned i = 0; n->iterate_direct_aliases (i, ref);)
1053 bool removed = false;
1054 cgraph_node *n_alias = dyn_cast <cgraph_node *> (ref->referring);
1056 if ((DECL_COMDAT_GROUP (n->decl)
1057 && (DECL_COMDAT_GROUP (n->decl)
1058 == DECL_COMDAT_GROUP (n_alias->decl)))
1059 || (n_alias->get_availability () > AVAIL_INTERPOSABLE
1060 && n->get_availability () > AVAIL_INTERPOSABLE))
1062 nredirected += redirect_all_callers (n_alias, to);
1063 if (n_alias->can_remove_if_no_direct_calls_p ()
1064 && !n_alias->call_for_symbol_and_aliases (cgraph_node::has_thunk_p,
1065 NULL, true)
1066 && !n_alias->has_aliases_p ())
1067 n_alias->remove ();
1069 if (!removed)
1070 i++;
1072 return nredirected;
1075 /* Merges instance with an ALIAS_ITEM, where alias, thunk or redirection can
1076 be applied. */
1078 bool
1079 sem_function::merge (sem_item *alias_item)
1081 gcc_assert (alias_item->type == FUNC);
1083 sem_function *alias_func = static_cast<sem_function *> (alias_item);
1085 cgraph_node *original = get_node ();
1086 cgraph_node *local_original = NULL;
1087 cgraph_node *alias = alias_func->get_node ();
1089 bool create_wrapper = false;
1090 bool create_alias = false;
1091 bool redirect_callers = false;
1092 bool remove = false;
1094 bool original_discardable = false;
1095 bool original_discarded = false;
1097 bool original_address_matters = original->address_matters_p ();
1098 bool alias_address_matters = alias->address_matters_p ();
1100 if (DECL_EXTERNAL (alias->decl))
1102 if (dump_file)
1103 fprintf (dump_file, "Not unifying; alias is external.\n\n");
1104 return false;
1107 if (DECL_NO_INLINE_WARNING_P (original->decl)
1108 != DECL_NO_INLINE_WARNING_P (alias->decl))
1110 if (dump_file)
1111 fprintf (dump_file,
1112 "Not unifying; "
1113 "DECL_NO_INLINE_WARNING mismatch.\n\n");
1114 return false;
1117 /* Do not attempt to mix functions from different user sections;
1118 we do not know what user intends with those. */
1119 if (((DECL_SECTION_NAME (original->decl) && !original->implicit_section)
1120 || (DECL_SECTION_NAME (alias->decl) && !alias->implicit_section))
1121 && DECL_SECTION_NAME (original->decl) != DECL_SECTION_NAME (alias->decl))
1123 if (dump_file)
1124 fprintf (dump_file,
1125 "Not unifying; "
1126 "original and alias are in different sections.\n\n");
1127 return false;
1130 /* See if original is in a section that can be discarded if the main
1131 symbol is not used. */
1133 if (original->can_be_discarded_p ())
1134 original_discardable = true;
1135 /* Also consider case where we have resolution info and we know that
1136 original's definition is not going to be used. In this case we can not
1137 create alias to original. */
1138 if (node->resolution != LDPR_UNKNOWN
1139 && !decl_binds_to_current_def_p (node->decl))
1140 original_discardable = original_discarded = true;
1142 /* Creating a symtab alias is the optimal way to merge.
1143 It however can not be used in the following cases:
1145 1) if ORIGINAL and ALIAS may be possibly compared for address equality.
1146 2) if ORIGINAL is in a section that may be discarded by linker or if
1147 it is an external functions where we can not create an alias
1148 (ORIGINAL_DISCARDABLE)
1149 3) if target do not support symbol aliases.
1150 4) original and alias lie in different comdat groups.
1152 If we can not produce alias, we will turn ALIAS into WRAPPER of ORIGINAL
1153 and/or redirect all callers from ALIAS to ORIGINAL. */
1154 if ((original_address_matters && alias_address_matters)
1155 || (original_discardable
1156 && (!DECL_COMDAT_GROUP (alias->decl)
1157 || (DECL_COMDAT_GROUP (alias->decl)
1158 != DECL_COMDAT_GROUP (original->decl))))
1159 || original_discarded
1160 || !sem_item::target_supports_symbol_aliases_p ()
1161 || DECL_COMDAT_GROUP (alias->decl) != DECL_COMDAT_GROUP (original->decl))
1163 /* First see if we can produce wrapper. */
1165 /* Symbol properties that matter for references must be preserved.
1166 TODO: We can produce wrapper, but we need to produce alias of ORIGINAL
1167 with proper properties. */
1168 if (!sem_item::compare_referenced_symbol_properties (NULL, original, alias,
1169 alias->address_taken))
1171 if (dump_file)
1172 fprintf (dump_file,
1173 "Wrapper cannot be created because referenced symbol "
1174 "properties mismatch\n");
1176 /* Do not turn function in one comdat group into wrapper to another
1177 comdat group. Other compiler producing the body of the
1178 another comdat group may make opossite decision and with unfortunate
1179 linker choices this may close a loop. */
1180 else if (DECL_COMDAT_GROUP (original->decl)
1181 && DECL_COMDAT_GROUP (alias->decl)
1182 && (DECL_COMDAT_GROUP (alias->decl)
1183 != DECL_COMDAT_GROUP (original->decl)))
1185 if (dump_file)
1186 fprintf (dump_file,
1187 "Wrapper cannot be created because of COMDAT\n");
1189 else if (DECL_STATIC_CHAIN (alias->decl)
1190 || DECL_STATIC_CHAIN (original->decl))
1192 if (dump_file)
1193 fprintf (dump_file,
1194 "Cannot create wrapper of nested function.\n");
1196 /* TODO: We can also deal with variadic functions never calling
1197 VA_START. */
1198 else if (stdarg_p (TREE_TYPE (alias->decl)))
1200 if (dump_file)
1201 fprintf (dump_file,
1202 "can not create wrapper of stdarg function.\n");
1204 else if (inline_summaries
1205 && inline_summaries->get (alias)->self_size <= 2)
1207 if (dump_file)
1208 fprintf (dump_file, "Wrapper creation is not "
1209 "profitable (function is too small).\n");
1211 /* If user paid attention to mark function noinline, assume it is
1212 somewhat special and do not try to turn it into a wrapper that can
1213 not be undone by inliner. */
1214 else if (lookup_attribute ("noinline", DECL_ATTRIBUTES (alias->decl)))
1216 if (dump_file)
1217 fprintf (dump_file, "Wrappers are not created for noinline.\n");
1219 else
1220 create_wrapper = true;
1222 /* We can redirect local calls in the case both alias and orignal
1223 are not interposable. */
1224 redirect_callers
1225 = alias->get_availability () > AVAIL_INTERPOSABLE
1226 && original->get_availability () > AVAIL_INTERPOSABLE
1227 && !alias->instrumented_version;
1228 /* TODO: We can redirect, but we need to produce alias of ORIGINAL
1229 with proper properties. */
1230 if (!sem_item::compare_referenced_symbol_properties (NULL, original, alias,
1231 alias->address_taken))
1232 redirect_callers = false;
1234 if (!redirect_callers && !create_wrapper)
1236 if (dump_file)
1237 fprintf (dump_file, "Not unifying; can not redirect callers nor "
1238 "produce wrapper\n\n");
1239 return false;
1242 /* Work out the symbol the wrapper should call.
1243 If ORIGINAL is interposable, we need to call a local alias.
1244 Also produce local alias (if possible) as an optimization.
1246 Local aliases can not be created inside comdat groups because that
1247 prevents inlining. */
1248 if (!original_discardable && !original->get_comdat_group ())
1250 local_original
1251 = dyn_cast <cgraph_node *> (original->noninterposable_alias ());
1252 if (!local_original
1253 && original->get_availability () > AVAIL_INTERPOSABLE)
1254 local_original = original;
1256 /* If we can not use local alias, fallback to the original
1257 when possible. */
1258 else if (original->get_availability () > AVAIL_INTERPOSABLE)
1259 local_original = original;
1261 /* If original is COMDAT local, we can not really redirect calls outside
1262 of its comdat group to it. */
1263 if (original->comdat_local_p ())
1264 redirect_callers = false;
1265 if (!local_original)
1267 if (dump_file)
1268 fprintf (dump_file, "Not unifying; "
1269 "can not produce local alias.\n\n");
1270 return false;
1273 if (!redirect_callers && !create_wrapper)
1275 if (dump_file)
1276 fprintf (dump_file, "Not unifying; "
1277 "can not redirect callers nor produce a wrapper\n\n");
1278 return false;
1280 if (!create_wrapper
1281 && !alias->call_for_symbol_and_aliases (cgraph_node::has_thunk_p,
1282 NULL, true)
1283 && !alias->can_remove_if_no_direct_calls_p ())
1285 if (dump_file)
1286 fprintf (dump_file, "Not unifying; can not make wrapper and "
1287 "function has other uses than direct calls\n\n");
1288 return false;
1291 else
1292 create_alias = true;
1294 if (redirect_callers)
1296 int nredirected = redirect_all_callers (alias, local_original);
1298 if (nredirected)
1300 alias->icf_merged = true;
1301 local_original->icf_merged = true;
1303 if (dump_file && nredirected)
1304 fprintf (dump_file, "%i local calls have been "
1305 "redirected.\n", nredirected);
1308 /* If all callers was redirected, do not produce wrapper. */
1309 if (alias->can_remove_if_no_direct_calls_p ()
1310 && !DECL_VIRTUAL_P (alias->decl)
1311 && !alias->has_aliases_p ())
1313 create_wrapper = false;
1314 remove = true;
1316 gcc_assert (!create_alias);
1318 else if (create_alias)
1320 alias->icf_merged = true;
1322 /* Remove the function's body. */
1323 ipa_merge_profiles (original, alias);
1324 alias->release_body (true);
1325 alias->reset ();
1326 /* Notice global symbol possibly produced RTL. */
1327 ((symtab_node *)alias)->call_for_symbol_and_aliases (clear_decl_rtl,
1328 NULL, true);
1330 /* Create the alias. */
1331 cgraph_node::create_alias (alias_func->decl, decl);
1332 alias->resolve_alias (original);
1334 original->call_for_symbol_thunks_and_aliases
1335 (set_local, (void *)(size_t) original->local_p (), true);
1337 if (dump_file)
1338 fprintf (dump_file, "Unified; Function alias has been created.\n\n");
1340 if (create_wrapper)
1342 gcc_assert (!create_alias);
1343 alias->icf_merged = true;
1344 local_original->icf_merged = true;
1346 ipa_merge_profiles (local_original, alias, true);
1347 alias->create_wrapper (local_original);
1349 if (dump_file)
1350 fprintf (dump_file, "Unified; Wrapper has been created.\n\n");
1353 /* It's possible that redirection can hit thunks that block
1354 redirection opportunities. */
1355 gcc_assert (alias->icf_merged || remove || redirect_callers);
1356 original->icf_merged = true;
1358 /* We use merged flag to track cases where COMDAT function is known to be
1359 compatible its callers. If we merged in non-COMDAT, we need to give up
1360 on this optimization. */
1361 if (original->merged_comdat && !alias->merged_comdat)
1363 if (dump_file)
1364 fprintf (dump_file, "Dropping merged_comdat flag.\n\n");
1365 if (local_original)
1366 local_original->merged_comdat = false;
1367 original->merged_comdat = false;
1370 if (remove)
1372 ipa_merge_profiles (original, alias);
1373 alias->release_body ();
1374 alias->reset ();
1375 alias->body_removed = true;
1376 alias->icf_merged = true;
1377 if (dump_file)
1378 fprintf (dump_file, "Unified; Function body was removed.\n");
1381 return true;
1384 /* Semantic item initialization function. */
1386 void
1387 sem_function::init (void)
1389 if (in_lto_p)
1390 get_node ()->get_untransformed_body ();
1392 tree fndecl = node->decl;
1393 function *func = DECL_STRUCT_FUNCTION (fndecl);
1395 gcc_assert (func);
1396 gcc_assert (SSANAMES (func));
1398 ssa_names_size = SSANAMES (func)->length ();
1399 node = node;
1401 decl = fndecl;
1402 region_tree = func->eh->region_tree;
1404 /* iterating all function arguments. */
1405 arg_count = count_formal_params (fndecl);
1407 edge_count = n_edges_for_fn (func);
1408 cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
1409 if (!cnode->thunk.thunk_p)
1411 cfg_checksum = coverage_compute_cfg_checksum (func);
1413 inchash::hash hstate;
1415 basic_block bb;
1416 FOR_EACH_BB_FN (bb, func)
1418 unsigned nondbg_stmt_count = 0;
1420 edge e;
1421 for (edge_iterator ei = ei_start (bb->preds); ei_cond (ei, &e);
1422 ei_next (&ei))
1423 cfg_checksum = iterative_hash_host_wide_int (e->flags,
1424 cfg_checksum);
1426 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
1427 gsi_next (&gsi))
1429 gimple *stmt = gsi_stmt (gsi);
1431 if (gimple_code (stmt) != GIMPLE_DEBUG
1432 && gimple_code (stmt) != GIMPLE_PREDICT)
1434 hash_stmt (stmt, hstate);
1435 nondbg_stmt_count++;
1439 gcode_hash = hstate.end ();
1440 bb_sizes.safe_push (nondbg_stmt_count);
1442 /* Inserting basic block to hash table. */
1443 sem_bb *semantic_bb = new sem_bb (bb, nondbg_stmt_count,
1444 EDGE_COUNT (bb->preds)
1445 + EDGE_COUNT (bb->succs));
1447 bb_sorted.safe_push (semantic_bb);
1450 else
1452 cfg_checksum = 0;
1453 inchash::hash hstate;
1454 hstate.add_wide_int (cnode->thunk.fixed_offset);
1455 hstate.add_wide_int (cnode->thunk.virtual_value);
1456 hstate.add_flag (cnode->thunk.this_adjusting);
1457 hstate.add_flag (cnode->thunk.virtual_offset_p);
1458 hstate.add_flag (cnode->thunk.add_pointer_bounds_args);
1459 gcode_hash = hstate.end ();
1463 /* Accumulate to HSTATE a hash of expression EXP.
1464 Identical to inchash::add_expr, but guaranteed to be stable across LTO
1465 and DECL equality classes. */
1467 void
1468 sem_item::add_expr (const_tree exp, inchash::hash &hstate)
1470 if (exp == NULL_TREE)
1472 hstate.merge_hash (0);
1473 return;
1476 /* Handled component can be matched in a cureful way proving equivalence
1477 even if they syntactically differ. Just skip them. */
1478 STRIP_NOPS (exp);
1479 while (handled_component_p (exp))
1480 exp = TREE_OPERAND (exp, 0);
1482 enum tree_code code = TREE_CODE (exp);
1483 hstate.add_int (code);
1485 switch (code)
1487 /* Use inchash::add_expr for everything that is LTO stable. */
1488 case VOID_CST:
1489 case INTEGER_CST:
1490 case REAL_CST:
1491 case FIXED_CST:
1492 case STRING_CST:
1493 case COMPLEX_CST:
1494 case VECTOR_CST:
1495 inchash::add_expr (exp, hstate);
1496 break;
1497 case CONSTRUCTOR:
1499 unsigned HOST_WIDE_INT idx;
1500 tree value;
1502 hstate.add_wide_int (int_size_in_bytes (TREE_TYPE (exp)));
1504 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, value)
1505 if (value)
1506 add_expr (value, hstate);
1507 break;
1509 case ADDR_EXPR:
1510 case FDESC_EXPR:
1511 add_expr (get_base_address (TREE_OPERAND (exp, 0)), hstate);
1512 break;
1513 case SSA_NAME:
1514 case VAR_DECL:
1515 case CONST_DECL:
1516 case PARM_DECL:
1517 hstate.add_wide_int (int_size_in_bytes (TREE_TYPE (exp)));
1518 break;
1519 case MEM_REF:
1520 case POINTER_PLUS_EXPR:
1521 case MINUS_EXPR:
1522 case RANGE_EXPR:
1523 add_expr (TREE_OPERAND (exp, 0), hstate);
1524 add_expr (TREE_OPERAND (exp, 1), hstate);
1525 break;
1526 case PLUS_EXPR:
1528 inchash::hash one, two;
1529 add_expr (TREE_OPERAND (exp, 0), one);
1530 add_expr (TREE_OPERAND (exp, 1), two);
1531 hstate.add_commutative (one, two);
1533 break;
1534 CASE_CONVERT:
1535 hstate.add_wide_int (int_size_in_bytes (TREE_TYPE (exp)));
1536 return add_expr (TREE_OPERAND (exp, 0), hstate);
1537 default:
1538 break;
1542 /* Accumulate to HSTATE a hash of type t.
1543 TYpes that may end up being compatible after LTO type merging needs to have
1544 the same hash. */
1546 void
1547 sem_item::add_type (const_tree type, inchash::hash &hstate)
1549 if (type == NULL_TREE)
1551 hstate.merge_hash (0);
1552 return;
1555 type = TYPE_MAIN_VARIANT (type);
1557 hstate.add_int (TYPE_MODE (type));
1559 if (TREE_CODE (type) == COMPLEX_TYPE)
1561 hstate.add_int (COMPLEX_TYPE);
1562 sem_item::add_type (TREE_TYPE (type), hstate);
1564 else if (INTEGRAL_TYPE_P (type))
1566 hstate.add_int (INTEGER_TYPE);
1567 hstate.add_flag (TYPE_UNSIGNED (type));
1568 hstate.add_int (TYPE_PRECISION (type));
1570 else if (VECTOR_TYPE_P (type))
1572 hstate.add_int (VECTOR_TYPE);
1573 hstate.add_int (TYPE_PRECISION (type));
1574 sem_item::add_type (TREE_TYPE (type), hstate);
1576 else if (TREE_CODE (type) == ARRAY_TYPE)
1578 hstate.add_int (ARRAY_TYPE);
1579 /* Do not hash size, so complete and incomplete types can match. */
1580 sem_item::add_type (TREE_TYPE (type), hstate);
1582 else if (RECORD_OR_UNION_TYPE_P (type))
1584 gcc_checking_assert (COMPLETE_TYPE_P (type));
1585 hashval_t *val = optimizer->m_type_hash_cache.get (type);
1587 if (!val)
1589 inchash::hash hstate2;
1590 unsigned nf;
1591 tree f;
1592 hashval_t hash;
1594 hstate2.add_int (RECORD_TYPE);
1595 gcc_assert (COMPLETE_TYPE_P (type));
1597 for (f = TYPE_FIELDS (type), nf = 0; f; f = TREE_CHAIN (f))
1598 if (TREE_CODE (f) == FIELD_DECL)
1600 add_type (TREE_TYPE (f), hstate2);
1601 nf++;
1604 hstate2.add_int (nf);
1605 hash = hstate2.end ();
1606 hstate.add_wide_int (hash);
1607 optimizer->m_type_hash_cache.put (type, hash);
1609 else
1610 hstate.add_wide_int (*val);
1614 /* Improve accumulated hash for HSTATE based on a gimple statement STMT. */
1616 void
1617 sem_function::hash_stmt (gimple *stmt, inchash::hash &hstate)
1619 enum gimple_code code = gimple_code (stmt);
1621 hstate.add_int (code);
1623 switch (code)
1625 case GIMPLE_SWITCH:
1626 add_expr (gimple_switch_index (as_a <gswitch *> (stmt)), hstate);
1627 break;
1628 case GIMPLE_ASSIGN:
1629 hstate.add_int (gimple_assign_rhs_code (stmt));
1630 if (commutative_tree_code (gimple_assign_rhs_code (stmt))
1631 || commutative_ternary_tree_code (gimple_assign_rhs_code (stmt)))
1633 inchash::hash one, two;
1635 add_expr (gimple_assign_rhs1 (stmt), one);
1636 add_type (TREE_TYPE (gimple_assign_rhs1 (stmt)), one);
1637 add_expr (gimple_assign_rhs2 (stmt), two);
1638 hstate.add_commutative (one, two);
1639 if (commutative_ternary_tree_code (gimple_assign_rhs_code (stmt)))
1641 add_expr (gimple_assign_rhs3 (stmt), hstate);
1642 add_type (TREE_TYPE (gimple_assign_rhs3 (stmt)), hstate);
1644 add_expr (gimple_assign_lhs (stmt), hstate);
1645 add_type (TREE_TYPE (gimple_assign_lhs (stmt)), two);
1646 break;
1648 /* fall through */
1649 case GIMPLE_CALL:
1650 case GIMPLE_ASM:
1651 case GIMPLE_COND:
1652 case GIMPLE_GOTO:
1653 case GIMPLE_RETURN:
1654 /* All these statements are equivalent if their operands are. */
1655 for (unsigned i = 0; i < gimple_num_ops (stmt); ++i)
1657 add_expr (gimple_op (stmt, i), hstate);
1658 if (gimple_op (stmt, i))
1659 add_type (TREE_TYPE (gimple_op (stmt, i)), hstate);
1661 default:
1662 break;
1667 /* Return true if polymorphic comparison must be processed. */
1669 bool
1670 sem_function::compare_polymorphic_p (void)
1672 struct cgraph_edge *e;
1674 if (!opt_for_fn (get_node ()->decl, flag_devirtualize))
1675 return false;
1676 if (get_node ()->indirect_calls != NULL)
1677 return true;
1678 /* TODO: We can do simple propagation determining what calls may lead to
1679 a polymorphic call. */
1680 for (e = get_node ()->callees; e; e = e->next_callee)
1681 if (e->callee->definition
1682 && opt_for_fn (e->callee->decl, flag_devirtualize))
1683 return true;
1684 return false;
1687 /* For a given call graph NODE, the function constructs new
1688 semantic function item. */
1690 sem_function *
1691 sem_function::parse (cgraph_node *node, bitmap_obstack *stack)
1693 tree fndecl = node->decl;
1694 function *func = DECL_STRUCT_FUNCTION (fndecl);
1696 if (!func || (!node->has_gimple_body_p () && !node->thunk.thunk_p))
1697 return NULL;
1699 if (lookup_attribute_by_prefix ("omp ", DECL_ATTRIBUTES (node->decl)) != NULL)
1700 return NULL;
1702 /* PR ipa/70306. */
1703 if (DECL_STATIC_CONSTRUCTOR (node->decl)
1704 || DECL_STATIC_DESTRUCTOR (node->decl))
1705 return NULL;
1707 sem_function *f = new sem_function (node, 0, stack);
1709 f->init ();
1711 return f;
1714 /* For given basic blocks BB1 and BB2 (from functions FUNC1 and FUNC),
1715 return true if phi nodes are semantically equivalent in these blocks . */
1717 bool
1718 sem_function::compare_phi_node (basic_block bb1, basic_block bb2)
1720 gphi_iterator si1, si2;
1721 gphi *phi1, *phi2;
1722 unsigned size1, size2, i;
1723 tree t1, t2;
1724 edge e1, e2;
1726 gcc_assert (bb1 != NULL);
1727 gcc_assert (bb2 != NULL);
1729 si2 = gsi_start_phis (bb2);
1730 for (si1 = gsi_start_phis (bb1); !gsi_end_p (si1);
1731 gsi_next (&si1))
1733 gsi_next_nonvirtual_phi (&si1);
1734 gsi_next_nonvirtual_phi (&si2);
1736 if (gsi_end_p (si1) && gsi_end_p (si2))
1737 break;
1739 if (gsi_end_p (si1) || gsi_end_p (si2))
1740 return return_false();
1742 phi1 = si1.phi ();
1743 phi2 = si2.phi ();
1745 tree phi_result1 = gimple_phi_result (phi1);
1746 tree phi_result2 = gimple_phi_result (phi2);
1748 if (!m_checker->compare_operand (phi_result1, phi_result2))
1749 return return_false_with_msg ("PHI results are different");
1751 size1 = gimple_phi_num_args (phi1);
1752 size2 = gimple_phi_num_args (phi2);
1754 if (size1 != size2)
1755 return return_false ();
1757 for (i = 0; i < size1; ++i)
1759 t1 = gimple_phi_arg (phi1, i)->def;
1760 t2 = gimple_phi_arg (phi2, i)->def;
1762 if (!m_checker->compare_operand (t1, t2))
1763 return return_false ();
1765 e1 = gimple_phi_arg_edge (phi1, i);
1766 e2 = gimple_phi_arg_edge (phi2, i);
1768 if (!m_checker->compare_edge (e1, e2))
1769 return return_false ();
1772 gsi_next (&si2);
1775 return true;
1778 /* Returns true if tree T can be compared as a handled component. */
1780 bool
1781 sem_function::icf_handled_component_p (tree t)
1783 tree_code tc = TREE_CODE (t);
1785 return (handled_component_p (t)
1786 || tc == ADDR_EXPR || tc == MEM_REF || tc == OBJ_TYPE_REF);
1789 /* Basic blocks dictionary BB_DICT returns true if SOURCE index BB
1790 corresponds to TARGET. */
1792 bool
1793 sem_function::bb_dict_test (vec<int> *bb_dict, int source, int target)
1795 source++;
1796 target++;
1798 if (bb_dict->length () <= (unsigned)source)
1799 bb_dict->safe_grow_cleared (source + 1);
1801 if ((*bb_dict)[source] == 0)
1803 (*bb_dict)[source] = target;
1804 return true;
1806 else
1807 return (*bb_dict)[source] == target;
1811 /* Semantic variable constructor that uses STACK as bitmap memory stack. */
1813 sem_variable::sem_variable (bitmap_obstack *stack): sem_item (VAR, stack)
1817 /* Constructor based on varpool node _NODE with computed hash _HASH.
1818 Bitmap STACK is used for memory allocation. */
1820 sem_variable::sem_variable (varpool_node *node, hashval_t _hash,
1821 bitmap_obstack *stack): sem_item(VAR,
1822 node, _hash, stack)
1824 gcc_checking_assert (node);
1825 gcc_checking_assert (get_node ());
1828 /* Fast equality function based on knowledge known in WPA. */
1830 bool
1831 sem_variable::equals_wpa (sem_item *item,
1832 hash_map <symtab_node *, sem_item *> &ignored_nodes)
1834 gcc_assert (item->type == VAR);
1836 if (node->num_references () != item->node->num_references ())
1837 return return_false_with_msg ("different number of references");
1839 if (DECL_TLS_MODEL (decl) || DECL_TLS_MODEL (item->decl))
1840 return return_false_with_msg ("TLS model");
1842 /* DECL_ALIGN is safe to merge, because we will always chose the largest
1843 alignment out of all aliases. */
1845 if (DECL_VIRTUAL_P (decl) != DECL_VIRTUAL_P (item->decl))
1846 return return_false_with_msg ("Virtual flag mismatch");
1848 if (DECL_SIZE (decl) != DECL_SIZE (item->decl)
1849 && ((!DECL_SIZE (decl) || !DECL_SIZE (item->decl))
1850 || !operand_equal_p (DECL_SIZE (decl),
1851 DECL_SIZE (item->decl), OEP_ONLY_CONST)))
1852 return return_false_with_msg ("size mismatch");
1854 /* Do not attempt to mix data from different user sections;
1855 we do not know what user intends with those. */
1856 if (((DECL_SECTION_NAME (decl) && !node->implicit_section)
1857 || (DECL_SECTION_NAME (item->decl) && !item->node->implicit_section))
1858 && DECL_SECTION_NAME (decl) != DECL_SECTION_NAME (item->decl))
1859 return return_false_with_msg ("user section mismatch");
1861 if (DECL_IN_TEXT_SECTION (decl) != DECL_IN_TEXT_SECTION (item->decl))
1862 return return_false_with_msg ("text section");
1864 ipa_ref *ref = NULL, *ref2 = NULL;
1865 for (unsigned i = 0; node->iterate_reference (i, ref); i++)
1867 item->node->iterate_reference (i, ref2);
1869 if (ref->use != ref2->use)
1870 return return_false_with_msg ("reference use mismatch");
1872 if (!compare_symbol_references (ignored_nodes,
1873 ref->referred, ref2->referred,
1874 ref->address_matters_p ()))
1875 return false;
1878 return true;
1881 /* Returns true if the item equals to ITEM given as argument. */
1883 bool
1884 sem_variable::equals (sem_item *item,
1885 hash_map <symtab_node *, sem_item *> &)
1887 gcc_assert (item->type == VAR);
1888 bool ret;
1890 if (DECL_INITIAL (decl) == error_mark_node && in_lto_p)
1891 dyn_cast <varpool_node *>(node)->get_constructor ();
1892 if (DECL_INITIAL (item->decl) == error_mark_node && in_lto_p)
1893 dyn_cast <varpool_node *>(item->node)->get_constructor ();
1895 /* As seen in PR ipa/65303 we have to compare variables types. */
1896 if (!func_checker::compatible_types_p (TREE_TYPE (decl),
1897 TREE_TYPE (item->decl)))
1898 return return_false_with_msg ("variables types are different");
1900 ret = sem_variable::equals (DECL_INITIAL (decl),
1901 DECL_INITIAL (item->node->decl));
1902 if (dump_file && (dump_flags & TDF_DETAILS))
1903 fprintf (dump_file,
1904 "Equals called for vars:%s:%s (%u:%u) (%s:%s) with result: %s\n\n",
1905 xstrdup_for_dump (node->name()),
1906 xstrdup_for_dump (item->node->name ()),
1907 node->order, item->node->order,
1908 xstrdup_for_dump (node->asm_name ()),
1909 xstrdup_for_dump (item->node->asm_name ()), ret ? "true" : "false");
1911 return ret;
1914 /* Compares trees T1 and T2 for semantic equality. */
1916 bool
1917 sem_variable::equals (tree t1, tree t2)
1919 if (!t1 || !t2)
1920 return return_with_debug (t1 == t2);
1921 if (t1 == t2)
1922 return true;
1923 tree_code tc1 = TREE_CODE (t1);
1924 tree_code tc2 = TREE_CODE (t2);
1926 if (tc1 != tc2)
1927 return return_false_with_msg ("TREE_CODE mismatch");
1929 switch (tc1)
1931 case CONSTRUCTOR:
1933 vec<constructor_elt, va_gc> *v1, *v2;
1934 unsigned HOST_WIDE_INT idx;
1936 enum tree_code typecode = TREE_CODE (TREE_TYPE (t1));
1937 if (typecode != TREE_CODE (TREE_TYPE (t2)))
1938 return return_false_with_msg ("constructor type mismatch");
1940 if (typecode == ARRAY_TYPE)
1942 HOST_WIDE_INT size_1 = int_size_in_bytes (TREE_TYPE (t1));
1943 /* For arrays, check that the sizes all match. */
1944 if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2))
1945 || size_1 == -1
1946 || size_1 != int_size_in_bytes (TREE_TYPE (t2)))
1947 return return_false_with_msg ("constructor array size mismatch");
1949 else if (!func_checker::compatible_types_p (TREE_TYPE (t1),
1950 TREE_TYPE (t2)))
1951 return return_false_with_msg ("constructor type incompatible");
1953 v1 = CONSTRUCTOR_ELTS (t1);
1954 v2 = CONSTRUCTOR_ELTS (t2);
1955 if (vec_safe_length (v1) != vec_safe_length (v2))
1956 return return_false_with_msg ("constructor number of elts mismatch");
1958 for (idx = 0; idx < vec_safe_length (v1); ++idx)
1960 constructor_elt *c1 = &(*v1)[idx];
1961 constructor_elt *c2 = &(*v2)[idx];
1963 /* Check that each value is the same... */
1964 if (!sem_variable::equals (c1->value, c2->value))
1965 return false;
1966 /* ... and that they apply to the same fields! */
1967 if (!sem_variable::equals (c1->index, c2->index))
1968 return false;
1970 return true;
1972 case MEM_REF:
1974 tree x1 = TREE_OPERAND (t1, 0);
1975 tree x2 = TREE_OPERAND (t2, 0);
1976 tree y1 = TREE_OPERAND (t1, 1);
1977 tree y2 = TREE_OPERAND (t2, 1);
1979 if (!func_checker::compatible_types_p (TREE_TYPE (x1), TREE_TYPE (x2)))
1980 return return_false ();
1982 /* Type of the offset on MEM_REF does not matter. */
1983 return return_with_debug (sem_variable::equals (x1, x2)
1984 && wi::to_offset (y1)
1985 == wi::to_offset (y2));
1987 case ADDR_EXPR:
1988 case FDESC_EXPR:
1990 tree op1 = TREE_OPERAND (t1, 0);
1991 tree op2 = TREE_OPERAND (t2, 0);
1992 return sem_variable::equals (op1, op2);
1994 /* References to other vars/decls are compared using ipa-ref. */
1995 case FUNCTION_DECL:
1996 case VAR_DECL:
1997 if (decl_in_symtab_p (t1) && decl_in_symtab_p (t2))
1998 return true;
1999 return return_false_with_msg ("Declaration mismatch");
2000 case CONST_DECL:
2001 /* TODO: We can check CONST_DECL by its DECL_INITIAL, but for that we
2002 need to process its VAR/FUNCTION references without relying on ipa-ref
2003 compare. */
2004 case FIELD_DECL:
2005 case LABEL_DECL:
2006 return return_false_with_msg ("Declaration mismatch");
2007 case INTEGER_CST:
2008 /* Integer constants are the same only if the same width of type. */
2009 if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
2010 return return_false_with_msg ("INTEGER_CST precision mismatch");
2011 if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2)))
2012 return return_false_with_msg ("INTEGER_CST mode mismatch");
2013 return return_with_debug (tree_int_cst_equal (t1, t2));
2014 case STRING_CST:
2015 if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2)))
2016 return return_false_with_msg ("STRING_CST mode mismatch");
2017 if (TREE_STRING_LENGTH (t1) != TREE_STRING_LENGTH (t2))
2018 return return_false_with_msg ("STRING_CST length mismatch");
2019 if (memcmp (TREE_STRING_POINTER (t1), TREE_STRING_POINTER (t2),
2020 TREE_STRING_LENGTH (t1)))
2021 return return_false_with_msg ("STRING_CST mismatch");
2022 return true;
2023 case FIXED_CST:
2024 /* Fixed constants are the same only if the same width of type. */
2025 if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
2026 return return_false_with_msg ("FIXED_CST precision mismatch");
2028 return return_with_debug (FIXED_VALUES_IDENTICAL (TREE_FIXED_CST (t1),
2029 TREE_FIXED_CST (t2)));
2030 case COMPLEX_CST:
2031 return (sem_variable::equals (TREE_REALPART (t1), TREE_REALPART (t2))
2032 && sem_variable::equals (TREE_IMAGPART (t1), TREE_IMAGPART (t2)));
2033 case REAL_CST:
2034 /* Real constants are the same only if the same width of type. */
2035 if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
2036 return return_false_with_msg ("REAL_CST precision mismatch");
2037 return return_with_debug (real_identical (&TREE_REAL_CST (t1),
2038 &TREE_REAL_CST (t2)));
2039 case VECTOR_CST:
2041 unsigned i;
2043 if (VECTOR_CST_NELTS (t1) != VECTOR_CST_NELTS (t2))
2044 return return_false_with_msg ("VECTOR_CST nelts mismatch");
2046 for (i = 0; i < VECTOR_CST_NELTS (t1); ++i)
2047 if (!sem_variable::equals (VECTOR_CST_ELT (t1, i),
2048 VECTOR_CST_ELT (t2, i)))
2049 return 0;
2051 return 1;
2053 case ARRAY_REF:
2054 case ARRAY_RANGE_REF:
2056 tree x1 = TREE_OPERAND (t1, 0);
2057 tree x2 = TREE_OPERAND (t2, 0);
2058 tree y1 = TREE_OPERAND (t1, 1);
2059 tree y2 = TREE_OPERAND (t2, 1);
2061 if (!sem_variable::equals (x1, x2) || !sem_variable::equals (y1, y2))
2062 return false;
2063 if (!sem_variable::equals (array_ref_low_bound (t1),
2064 array_ref_low_bound (t2)))
2065 return false;
2066 if (!sem_variable::equals (array_ref_element_size (t1),
2067 array_ref_element_size (t2)))
2068 return false;
2069 return true;
2072 case COMPONENT_REF:
2073 case POINTER_PLUS_EXPR:
2074 case PLUS_EXPR:
2075 case MINUS_EXPR:
2076 case RANGE_EXPR:
2078 tree x1 = TREE_OPERAND (t1, 0);
2079 tree x2 = TREE_OPERAND (t2, 0);
2080 tree y1 = TREE_OPERAND (t1, 1);
2081 tree y2 = TREE_OPERAND (t2, 1);
2083 return sem_variable::equals (x1, x2) && sem_variable::equals (y1, y2);
2086 CASE_CONVERT:
2087 case VIEW_CONVERT_EXPR:
2088 if (!func_checker::compatible_types_p (TREE_TYPE (t1), TREE_TYPE (t2)))
2089 return return_false ();
2090 return sem_variable::equals (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2091 case ERROR_MARK:
2092 return return_false_with_msg ("ERROR_MARK");
2093 default:
2094 return return_false_with_msg ("Unknown TREE code reached");
2098 /* Parser function that visits a varpool NODE. */
2100 sem_variable *
2101 sem_variable::parse (varpool_node *node, bitmap_obstack *stack)
2103 if (TREE_THIS_VOLATILE (node->decl) || DECL_HARD_REGISTER (node->decl)
2104 || node->alias)
2105 return NULL;
2107 sem_variable *v = new sem_variable (node, 0, stack);
2109 v->init ();
2111 return v;
2114 /* References independent hash function. */
2116 hashval_t
2117 sem_variable::get_hash (void)
2119 if (m_hash)
2120 return m_hash;
2122 /* All WPA streamed in symbols should have their hashes computed at compile
2123 time. At this point, the constructor may not be in memory at all.
2124 DECL_INITIAL (decl) would be error_mark_node in that case. */
2125 gcc_assert (!node->lto_file_data);
2126 tree ctor = DECL_INITIAL (decl);
2127 inchash::hash hstate;
2129 hstate.add_int (456346417);
2130 if (DECL_SIZE (decl) && tree_fits_shwi_p (DECL_SIZE (decl)))
2131 hstate.add_wide_int (tree_to_shwi (DECL_SIZE (decl)));
2132 add_expr (ctor, hstate);
2133 set_hash (hstate.end ());
2135 return m_hash;
2138 /* Set all points-to UIDs of aliases pointing to node N as UID. */
2140 static void
2141 set_alias_uids (symtab_node *n, int uid)
2143 ipa_ref *ref;
2144 FOR_EACH_ALIAS (n, ref)
2146 if (dump_file)
2147 fprintf (dump_file, " Setting points-to UID of [%s] as %d\n",
2148 xstrdup_for_dump (ref->referring->asm_name ()), uid);
2150 SET_DECL_PT_UID (ref->referring->decl, uid);
2151 set_alias_uids (ref->referring, uid);
2155 /* Merges instance with an ALIAS_ITEM, where alias, thunk or redirection can
2156 be applied. */
2158 bool
2159 sem_variable::merge (sem_item *alias_item)
2161 gcc_assert (alias_item->type == VAR);
2163 if (!sem_item::target_supports_symbol_aliases_p ())
2165 if (dump_file)
2166 fprintf (dump_file, "Not unifying; "
2167 "Symbol aliases are not supported by target\n\n");
2168 return false;
2171 if (DECL_EXTERNAL (alias_item->decl))
2173 if (dump_file)
2174 fprintf (dump_file, "Not unifying; alias is external.\n\n");
2175 return false;
2178 sem_variable *alias_var = static_cast<sem_variable *> (alias_item);
2180 varpool_node *original = get_node ();
2181 varpool_node *alias = alias_var->get_node ();
2182 bool original_discardable = false;
2184 bool alias_address_matters = alias->address_matters_p ();
2186 /* See if original is in a section that can be discarded if the main
2187 symbol is not used.
2188 Also consider case where we have resolution info and we know that
2189 original's definition is not going to be used. In this case we can not
2190 create alias to original. */
2191 if (original->can_be_discarded_p ()
2192 || (node->resolution != LDPR_UNKNOWN
2193 && !decl_binds_to_current_def_p (node->decl)))
2194 original_discardable = true;
2196 gcc_assert (!TREE_ASM_WRITTEN (alias->decl));
2198 /* Constant pool machinery is not quite ready for aliases.
2199 TODO: varasm code contains logic for merging DECL_IN_CONSTANT_POOL.
2200 For LTO merging does not happen that is an important missing feature.
2201 We can enable merging with LTO if the DECL_IN_CONSTANT_POOL
2202 flag is dropped and non-local symbol name is assigned. */
2203 if (DECL_IN_CONSTANT_POOL (alias->decl)
2204 || DECL_IN_CONSTANT_POOL (original->decl))
2206 if (dump_file)
2207 fprintf (dump_file,
2208 "Not unifying; constant pool variables.\n\n");
2209 return false;
2212 /* Do not attempt to mix functions from different user sections;
2213 we do not know what user intends with those. */
2214 if (((DECL_SECTION_NAME (original->decl) && !original->implicit_section)
2215 || (DECL_SECTION_NAME (alias->decl) && !alias->implicit_section))
2216 && DECL_SECTION_NAME (original->decl) != DECL_SECTION_NAME (alias->decl))
2218 if (dump_file)
2219 fprintf (dump_file,
2220 "Not unifying; "
2221 "original and alias are in different sections.\n\n");
2222 return false;
2225 /* We can not merge if address comparsion metters. */
2226 if (alias_address_matters && flag_merge_constants < 2)
2228 if (dump_file)
2229 fprintf (dump_file,
2230 "Not unifying; address of original may be compared.\n\n");
2231 return false;
2234 if (DECL_ALIGN (original->decl) < DECL_ALIGN (alias->decl))
2236 if (dump_file)
2237 fprintf (dump_file, "Not unifying; "
2238 "original and alias have incompatible alignments\n\n");
2240 return false;
2243 if (DECL_COMDAT_GROUP (original->decl) != DECL_COMDAT_GROUP (alias->decl))
2245 if (dump_file)
2246 fprintf (dump_file, "Not unifying; alias cannot be created; "
2247 "across comdat group boundary\n\n");
2249 return false;
2252 if (original_discardable)
2254 if (dump_file)
2255 fprintf (dump_file, "Not unifying; alias cannot be created; "
2256 "target is discardable\n\n");
2258 return false;
2260 else
2262 gcc_assert (!original->alias);
2263 gcc_assert (!alias->alias);
2265 alias->analyzed = false;
2267 DECL_INITIAL (alias->decl) = NULL;
2268 ((symtab_node *)alias)->call_for_symbol_and_aliases (clear_decl_rtl,
2269 NULL, true);
2270 alias->need_bounds_init = false;
2271 alias->remove_all_references ();
2272 if (TREE_ADDRESSABLE (alias->decl))
2273 original->call_for_symbol_and_aliases (set_addressable, NULL, true);
2275 varpool_node::create_alias (alias_var->decl, decl);
2276 alias->resolve_alias (original);
2278 if (dump_file)
2279 fprintf (dump_file, "Unified; Variable alias has been created.\n");
2281 set_alias_uids (original, DECL_UID (original->decl));
2282 return true;
2286 /* Dump symbol to FILE. */
2288 void
2289 sem_variable::dump_to_file (FILE *file)
2291 gcc_assert (file);
2293 print_node (file, "", decl, 0);
2294 fprintf (file, "\n\n");
2297 unsigned int sem_item_optimizer::class_id = 0;
2299 sem_item_optimizer::sem_item_optimizer (): worklist (0), m_classes (0),
2300 m_classes_count (0), m_cgraph_node_hooks (NULL), m_varpool_node_hooks (NULL)
2302 m_items.create (0);
2303 bitmap_obstack_initialize (&m_bmstack);
2306 sem_item_optimizer::~sem_item_optimizer ()
2308 for (unsigned int i = 0; i < m_items.length (); i++)
2309 delete m_items[i];
2311 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
2312 it != m_classes.end (); ++it)
2314 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
2315 delete (*it)->classes[i];
2317 (*it)->classes.release ();
2318 free (*it);
2321 m_items.release ();
2323 bitmap_obstack_release (&m_bmstack);
2326 /* Write IPA ICF summary for symbols. */
2328 void
2329 sem_item_optimizer::write_summary (void)
2331 unsigned int count = 0;
2333 output_block *ob = create_output_block (LTO_section_ipa_icf);
2334 lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
2335 ob->symbol = NULL;
2337 /* Calculate number of symbols to be serialized. */
2338 for (lto_symtab_encoder_iterator lsei = lsei_start_in_partition (encoder);
2339 !lsei_end_p (lsei);
2340 lsei_next_in_partition (&lsei))
2342 symtab_node *node = lsei_node (lsei);
2344 if (m_symtab_node_map.get (node))
2345 count++;
2348 streamer_write_uhwi (ob, count);
2350 /* Process all of the symbols. */
2351 for (lto_symtab_encoder_iterator lsei = lsei_start_in_partition (encoder);
2352 !lsei_end_p (lsei);
2353 lsei_next_in_partition (&lsei))
2355 symtab_node *node = lsei_node (lsei);
2357 sem_item **item = m_symtab_node_map.get (node);
2359 if (item && *item)
2361 int node_ref = lto_symtab_encoder_encode (encoder, node);
2362 streamer_write_uhwi_stream (ob->main_stream, node_ref);
2364 streamer_write_uhwi (ob, (*item)->get_hash ());
2368 streamer_write_char_stream (ob->main_stream, 0);
2369 produce_asm (ob, NULL);
2370 destroy_output_block (ob);
2373 /* Reads a section from LTO stream file FILE_DATA. Input block for DATA
2374 contains LEN bytes. */
2376 void
2377 sem_item_optimizer::read_section (lto_file_decl_data *file_data,
2378 const char *data, size_t len)
2380 const lto_function_header *header =
2381 (const lto_function_header *) data;
2382 const int cfg_offset = sizeof (lto_function_header);
2383 const int main_offset = cfg_offset + header->cfg_size;
2384 const int string_offset = main_offset + header->main_size;
2385 data_in *data_in;
2386 unsigned int i;
2387 unsigned int count;
2389 lto_input_block ib_main ((const char *) data + main_offset, 0,
2390 header->main_size, file_data->mode_table);
2392 data_in =
2393 lto_data_in_create (file_data, (const char *) data + string_offset,
2394 header->string_size, vNULL);
2396 count = streamer_read_uhwi (&ib_main);
2398 for (i = 0; i < count; i++)
2400 unsigned int index;
2401 symtab_node *node;
2402 lto_symtab_encoder_t encoder;
2404 index = streamer_read_uhwi (&ib_main);
2405 encoder = file_data->symtab_node_encoder;
2406 node = lto_symtab_encoder_deref (encoder, index);
2408 hashval_t hash = streamer_read_uhwi (&ib_main);
2410 gcc_assert (node->definition);
2412 if (dump_file)
2413 fprintf (dump_file, "Symbol added:%s (tree: %p, uid:%u)\n",
2414 node->asm_name (), (void *) node->decl, node->order);
2416 if (is_a<cgraph_node *> (node))
2418 cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
2420 m_items.safe_push (new sem_function (cnode, hash, &m_bmstack));
2422 else
2424 varpool_node *vnode = dyn_cast <varpool_node *> (node);
2426 m_items.safe_push (new sem_variable (vnode, hash, &m_bmstack));
2430 lto_free_section_data (file_data, LTO_section_ipa_icf, NULL, data,
2431 len);
2432 lto_data_in_delete (data_in);
2435 /* Read IPA ICF summary for symbols. */
2437 void
2438 sem_item_optimizer::read_summary (void)
2440 lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
2441 lto_file_decl_data *file_data;
2442 unsigned int j = 0;
2444 while ((file_data = file_data_vec[j++]))
2446 size_t len;
2447 const char *data = lto_get_section_data (file_data,
2448 LTO_section_ipa_icf, NULL, &len);
2450 if (data)
2451 read_section (file_data, data, len);
2455 /* Register callgraph and varpool hooks. */
2457 void
2458 sem_item_optimizer::register_hooks (void)
2460 if (!m_cgraph_node_hooks)
2461 m_cgraph_node_hooks = symtab->add_cgraph_removal_hook
2462 (&sem_item_optimizer::cgraph_removal_hook, this);
2464 if (!m_varpool_node_hooks)
2465 m_varpool_node_hooks = symtab->add_varpool_removal_hook
2466 (&sem_item_optimizer::varpool_removal_hook, this);
2469 /* Unregister callgraph and varpool hooks. */
2471 void
2472 sem_item_optimizer::unregister_hooks (void)
2474 if (m_cgraph_node_hooks)
2475 symtab->remove_cgraph_removal_hook (m_cgraph_node_hooks);
2477 if (m_varpool_node_hooks)
2478 symtab->remove_varpool_removal_hook (m_varpool_node_hooks);
2481 /* Adds a CLS to hashtable associated by hash value. */
2483 void
2484 sem_item_optimizer::add_class (congruence_class *cls)
2486 gcc_assert (cls->members.length ());
2488 congruence_class_group *group = get_group_by_hash (
2489 cls->members[0]->get_hash (),
2490 cls->members[0]->type);
2491 group->classes.safe_push (cls);
2494 /* Gets a congruence class group based on given HASH value and TYPE. */
2496 congruence_class_group *
2497 sem_item_optimizer::get_group_by_hash (hashval_t hash, sem_item_type type)
2499 congruence_class_group *item = XNEW (congruence_class_group);
2500 item->hash = hash;
2501 item->type = type;
2503 congruence_class_group **slot = m_classes.find_slot (item, INSERT);
2505 if (*slot)
2506 free (item);
2507 else
2509 item->classes.create (1);
2510 *slot = item;
2513 return *slot;
2516 /* Callgraph removal hook called for a NODE with a custom DATA. */
2518 void
2519 sem_item_optimizer::cgraph_removal_hook (cgraph_node *node, void *data)
2521 sem_item_optimizer *optimizer = (sem_item_optimizer *) data;
2522 optimizer->remove_symtab_node (node);
2525 /* Varpool removal hook called for a NODE with a custom DATA. */
2527 void
2528 sem_item_optimizer::varpool_removal_hook (varpool_node *node, void *data)
2530 sem_item_optimizer *optimizer = (sem_item_optimizer *) data;
2531 optimizer->remove_symtab_node (node);
2534 /* Remove symtab NODE triggered by symtab removal hooks. */
2536 void
2537 sem_item_optimizer::remove_symtab_node (symtab_node *node)
2539 gcc_assert (!m_classes.elements());
2541 m_removed_items_set.add (node);
2544 void
2545 sem_item_optimizer::remove_item (sem_item *item)
2547 if (m_symtab_node_map.get (item->node))
2548 m_symtab_node_map.remove (item->node);
2549 delete item;
2552 /* Removes all callgraph and varpool nodes that are marked by symtab
2553 as deleted. */
2555 void
2556 sem_item_optimizer::filter_removed_items (void)
2558 auto_vec <sem_item *> filtered;
2560 for (unsigned int i = 0; i < m_items.length(); i++)
2562 sem_item *item = m_items[i];
2564 if (m_removed_items_set.contains (item->node))
2566 remove_item (item);
2567 continue;
2570 if (item->type == FUNC)
2572 cgraph_node *cnode = static_cast <sem_function *>(item)->get_node ();
2574 if (in_lto_p && (cnode->alias || cnode->body_removed))
2575 remove_item (item);
2576 else
2577 filtered.safe_push (item);
2579 else /* VAR. */
2581 if (!flag_ipa_icf_variables)
2582 remove_item (item);
2583 else
2585 /* Filter out non-readonly variables. */
2586 tree decl = item->decl;
2587 if (TREE_READONLY (decl))
2588 filtered.safe_push (item);
2589 else
2590 remove_item (item);
2595 /* Clean-up of released semantic items. */
2597 m_items.release ();
2598 for (unsigned int i = 0; i < filtered.length(); i++)
2599 m_items.safe_push (filtered[i]);
2602 /* Optimizer entry point which returns true in case it processes
2603 a merge operation. True is returned if there's a merge operation
2604 processed. */
2606 bool
2607 sem_item_optimizer::execute (void)
2609 filter_removed_items ();
2610 unregister_hooks ();
2612 build_graph ();
2613 update_hash_by_addr_refs ();
2614 build_hash_based_classes ();
2616 if (dump_file)
2617 fprintf (dump_file, "Dump after hash based groups\n");
2618 dump_cong_classes ();
2620 for (unsigned int i = 0; i < m_items.length(); i++)
2621 m_items[i]->init_wpa ();
2623 subdivide_classes_by_equality (true);
2625 if (dump_file)
2626 fprintf (dump_file, "Dump after WPA based types groups\n");
2628 dump_cong_classes ();
2630 process_cong_reduction ();
2631 checking_verify_classes ();
2633 if (dump_file)
2634 fprintf (dump_file, "Dump after callgraph-based congruence reduction\n");
2636 dump_cong_classes ();
2638 parse_nonsingleton_classes ();
2639 subdivide_classes_by_equality ();
2641 if (dump_file)
2642 fprintf (dump_file, "Dump after full equality comparison of groups\n");
2644 dump_cong_classes ();
2646 unsigned int prev_class_count = m_classes_count;
2648 process_cong_reduction ();
2649 dump_cong_classes ();
2650 checking_verify_classes ();
2651 bool merged_p = merge_classes (prev_class_count);
2653 if (dump_file && (dump_flags & TDF_DETAILS))
2654 symtab_node::dump_table (dump_file);
2656 return merged_p;
2659 /* Function responsible for visiting all potential functions and
2660 read-only variables that can be merged. */
2662 void
2663 sem_item_optimizer::parse_funcs_and_vars (void)
2665 cgraph_node *cnode;
2667 if (flag_ipa_icf_functions)
2668 FOR_EACH_DEFINED_FUNCTION (cnode)
2670 sem_function *f = sem_function::parse (cnode, &m_bmstack);
2671 if (f)
2673 m_items.safe_push (f);
2674 m_symtab_node_map.put (cnode, f);
2676 if (dump_file)
2677 fprintf (dump_file, "Parsed function:%s\n", f->node->asm_name ());
2679 if (dump_file && (dump_flags & TDF_DETAILS))
2680 f->dump_to_file (dump_file);
2682 else if (dump_file)
2683 fprintf (dump_file, "Not parsed function:%s\n", cnode->asm_name ());
2686 varpool_node *vnode;
2688 if (flag_ipa_icf_variables)
2689 FOR_EACH_DEFINED_VARIABLE (vnode)
2691 sem_variable *v = sem_variable::parse (vnode, &m_bmstack);
2693 if (v)
2695 m_items.safe_push (v);
2696 m_symtab_node_map.put (vnode, v);
2701 /* Makes pairing between a congruence class CLS and semantic ITEM. */
2703 void
2704 sem_item_optimizer::add_item_to_class (congruence_class *cls, sem_item *item)
2706 item->index_in_class = cls->members.length ();
2707 cls->members.safe_push (item);
2708 item->cls = cls;
2711 /* For each semantic item, append hash values of references. */
2713 void
2714 sem_item_optimizer::update_hash_by_addr_refs ()
2716 /* First, append to hash sensitive references and class type if it need to
2717 be matched for ODR. */
2718 for (unsigned i = 0; i < m_items.length (); i++)
2720 m_items[i]->update_hash_by_addr_refs (m_symtab_node_map);
2721 if (m_items[i]->type == FUNC)
2723 if (TREE_CODE (TREE_TYPE (m_items[i]->decl)) == METHOD_TYPE
2724 && contains_polymorphic_type_p
2725 (TYPE_METHOD_BASETYPE (TREE_TYPE (m_items[i]->decl)))
2726 && (DECL_CXX_CONSTRUCTOR_P (m_items[i]->decl)
2727 || (static_cast<sem_function *> (m_items[i])->param_used_p (0)
2728 && static_cast<sem_function *> (m_items[i])
2729 ->compare_polymorphic_p ())))
2731 tree class_type
2732 = TYPE_METHOD_BASETYPE (TREE_TYPE (m_items[i]->decl));
2733 inchash::hash hstate (m_items[i]->get_hash ());
2735 if (TYPE_NAME (class_type)
2736 && DECL_ASSEMBLER_NAME_SET_P (TYPE_NAME (class_type)))
2737 hstate.add_wide_int
2738 (IDENTIFIER_HASH_VALUE
2739 (DECL_ASSEMBLER_NAME (TYPE_NAME (class_type))));
2741 m_items[i]->set_hash (hstate.end ());
2746 /* Once all symbols have enhanced hash value, we can append
2747 hash values of symbols that are seen by IPA ICF and are
2748 references by a semantic item. Newly computed values
2749 are saved to global_hash member variable. */
2750 for (unsigned i = 0; i < m_items.length (); i++)
2751 m_items[i]->update_hash_by_local_refs (m_symtab_node_map);
2753 /* Global hash value replace current hash values. */
2754 for (unsigned i = 0; i < m_items.length (); i++)
2755 m_items[i]->set_hash (m_items[i]->global_hash);
2758 /* Congruence classes are built by hash value. */
2760 void
2761 sem_item_optimizer::build_hash_based_classes (void)
2763 for (unsigned i = 0; i < m_items.length (); i++)
2765 sem_item *item = m_items[i];
2767 congruence_class_group *group = get_group_by_hash (item->get_hash (),
2768 item->type);
2770 if (!group->classes.length ())
2772 m_classes_count++;
2773 group->classes.safe_push (new congruence_class (class_id++));
2776 add_item_to_class (group->classes[0], item);
2780 /* Build references according to call graph. */
2782 void
2783 sem_item_optimizer::build_graph (void)
2785 for (unsigned i = 0; i < m_items.length (); i++)
2787 sem_item *item = m_items[i];
2788 m_symtab_node_map.put (item->node, item);
2790 /* Initialize hash values if we are not in LTO mode. */
2791 if (!in_lto_p)
2792 item->get_hash ();
2795 for (unsigned i = 0; i < m_items.length (); i++)
2797 sem_item *item = m_items[i];
2799 if (item->type == FUNC)
2801 cgraph_node *cnode = dyn_cast <cgraph_node *> (item->node);
2803 cgraph_edge *e = cnode->callees;
2804 while (e)
2806 sem_item **slot = m_symtab_node_map.get
2807 (e->callee->ultimate_alias_target ());
2808 if (slot)
2809 item->add_reference (*slot);
2811 e = e->next_callee;
2815 ipa_ref *ref = NULL;
2816 for (unsigned i = 0; item->node->iterate_reference (i, ref); i++)
2818 sem_item **slot = m_symtab_node_map.get
2819 (ref->referred->ultimate_alias_target ());
2820 if (slot)
2821 item->add_reference (*slot);
2826 /* Semantic items in classes having more than one element and initialized.
2827 In case of WPA, we load function body. */
2829 void
2830 sem_item_optimizer::parse_nonsingleton_classes (void)
2832 unsigned int init_called_count = 0;
2834 for (unsigned i = 0; i < m_items.length (); i++)
2835 if (m_items[i]->cls->members.length () > 1)
2837 m_items[i]->init ();
2838 init_called_count++;
2841 if (dump_file)
2842 fprintf (dump_file, "Init called for %u items (%.2f%%).\n", init_called_count,
2843 m_items.length () ? 100.0f * init_called_count / m_items.length (): 0.0f);
2846 /* Equality function for semantic items is used to subdivide existing
2847 classes. If IN_WPA, fast equality function is invoked. */
2849 void
2850 sem_item_optimizer::subdivide_classes_by_equality (bool in_wpa)
2852 for (hash_table <congruence_class_group_hash>::iterator it = m_classes.begin ();
2853 it != m_classes.end (); ++it)
2855 unsigned int class_count = (*it)->classes.length ();
2857 for (unsigned i = 0; i < class_count; i++)
2859 congruence_class *c = (*it)->classes [i];
2861 if (c->members.length() > 1)
2863 auto_vec <sem_item *> new_vector;
2865 sem_item *first = c->members[0];
2866 new_vector.safe_push (first);
2868 unsigned class_split_first = (*it)->classes.length ();
2870 for (unsigned j = 1; j < c->members.length (); j++)
2872 sem_item *item = c->members[j];
2874 bool equals = in_wpa ? first->equals_wpa (item,
2875 m_symtab_node_map) : first->equals (item, m_symtab_node_map);
2877 if (equals)
2878 new_vector.safe_push (item);
2879 else
2881 bool integrated = false;
2883 for (unsigned k = class_split_first; k < (*it)->classes.length (); k++)
2885 sem_item *x = (*it)->classes[k]->members[0];
2886 bool equals = in_wpa ? x->equals_wpa (item,
2887 m_symtab_node_map) : x->equals (item, m_symtab_node_map);
2889 if (equals)
2891 integrated = true;
2892 add_item_to_class ((*it)->classes[k], item);
2894 break;
2898 if (!integrated)
2900 congruence_class *c = new congruence_class (class_id++);
2901 m_classes_count++;
2902 add_item_to_class (c, item);
2904 (*it)->classes.safe_push (c);
2909 // we replace newly created new_vector for the class we've just splitted
2910 c->members.release ();
2911 c->members.create (new_vector.length ());
2913 for (unsigned int j = 0; j < new_vector.length (); j++)
2914 add_item_to_class (c, new_vector[j]);
2919 checking_verify_classes ();
2922 /* Subdivide classes by address references that members of the class
2923 reference. Example can be a pair of functions that have an address
2924 taken from a function. If these addresses are different the class
2925 is split. */
2927 unsigned
2928 sem_item_optimizer::subdivide_classes_by_sensitive_refs ()
2930 typedef hash_map <symbol_compare_hash, vec <sem_item *> > subdivide_hash_map;
2932 unsigned newly_created_classes = 0;
2934 for (hash_table <congruence_class_group_hash>::iterator it = m_classes.begin ();
2935 it != m_classes.end (); ++it)
2937 unsigned int class_count = (*it)->classes.length ();
2938 auto_vec<congruence_class *> new_classes;
2940 for (unsigned i = 0; i < class_count; i++)
2942 congruence_class *c = (*it)->classes [i];
2944 if (c->members.length() > 1)
2946 subdivide_hash_map split_map;
2948 for (unsigned j = 0; j < c->members.length (); j++)
2950 sem_item *source_node = c->members[j];
2952 symbol_compare_collection *collection = new symbol_compare_collection (source_node->node);
2954 bool existed;
2955 vec <sem_item *> *slot = &split_map.get_or_insert (collection,
2956 &existed);
2957 gcc_checking_assert (slot);
2959 slot->safe_push (source_node);
2961 if (existed)
2962 delete collection;
2965 /* If the map contains more than one key, we have to split the map
2966 appropriately. */
2967 if (split_map.elements () != 1)
2969 bool first_class = true;
2971 for (subdivide_hash_map::iterator it2 = split_map.begin ();
2972 it2 != split_map.end (); ++it2)
2974 congruence_class *new_cls;
2975 new_cls = new congruence_class (class_id++);
2977 for (unsigned k = 0; k < (*it2).second.length (); k++)
2978 add_item_to_class (new_cls, (*it2).second[k]);
2980 worklist_push (new_cls);
2981 newly_created_classes++;
2983 if (first_class)
2985 (*it)->classes[i] = new_cls;
2986 first_class = false;
2988 else
2990 new_classes.safe_push (new_cls);
2991 m_classes_count++;
2996 /* Release memory. */
2997 for (subdivide_hash_map::iterator it2 = split_map.begin ();
2998 it2 != split_map.end (); ++it2)
3000 delete (*it2).first;
3001 (*it2).second.release ();
3006 for (unsigned i = 0; i < new_classes.length (); i++)
3007 (*it)->classes.safe_push (new_classes[i]);
3010 return newly_created_classes;
3013 /* Verify congruence classes, if checking is enabled. */
3015 void
3016 sem_item_optimizer::checking_verify_classes (void)
3018 if (flag_checking)
3019 verify_classes ();
3022 /* Verify congruence classes. */
3024 void
3025 sem_item_optimizer::verify_classes (void)
3027 for (hash_table <congruence_class_group_hash>::iterator it = m_classes.begin ();
3028 it != m_classes.end (); ++it)
3030 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
3032 congruence_class *cls = (*it)->classes[i];
3034 gcc_assert (cls);
3035 gcc_assert (cls->members.length () > 0);
3037 for (unsigned int j = 0; j < cls->members.length (); j++)
3039 sem_item *item = cls->members[j];
3041 gcc_assert (item);
3042 gcc_assert (item->cls == cls);
3044 for (unsigned k = 0; k < item->usages.length (); k++)
3046 sem_usage_pair *usage = item->usages[k];
3047 gcc_assert (usage->item->index_in_class <
3048 usage->item->cls->members.length ());
3055 /* Disposes split map traverse function. CLS_PTR is pointer to congruence
3056 class, BSLOT is bitmap slot we want to release. DATA is mandatory,
3057 but unused argument. */
3059 bool
3060 sem_item_optimizer::release_split_map (congruence_class * const &,
3061 bitmap const &b, traverse_split_pair *)
3063 bitmap bmp = b;
3065 BITMAP_FREE (bmp);
3067 return true;
3070 /* Process split operation for a class given as pointer CLS_PTR,
3071 where bitmap B splits congruence class members. DATA is used
3072 as argument of split pair. */
3074 bool
3075 sem_item_optimizer::traverse_congruence_split (congruence_class * const &cls,
3076 bitmap const &b, traverse_split_pair *pair)
3078 sem_item_optimizer *optimizer = pair->optimizer;
3079 const congruence_class *splitter_cls = pair->cls;
3081 /* If counted bits are greater than zero and less than the number of members
3082 a group will be splitted. */
3083 unsigned popcount = bitmap_count_bits (b);
3085 if (popcount > 0 && popcount < cls->members.length ())
3087 auto_vec <congruence_class *, 2> newclasses;
3088 newclasses.quick_push (new congruence_class (class_id++));
3089 newclasses.quick_push (new congruence_class (class_id++));
3091 for (unsigned int i = 0; i < cls->members.length (); i++)
3093 int target = bitmap_bit_p (b, i);
3094 congruence_class *tc = newclasses[target];
3096 add_item_to_class (tc, cls->members[i]);
3099 if (flag_checking)
3101 for (unsigned int i = 0; i < 2; i++)
3102 gcc_assert (newclasses[i]->members.length ());
3105 if (splitter_cls == cls)
3106 optimizer->splitter_class_removed = true;
3108 /* Remove old class from worklist if presented. */
3109 bool in_worklist = cls->in_worklist;
3111 if (in_worklist)
3112 cls->in_worklist = false;
3114 congruence_class_group g;
3115 g.hash = cls->members[0]->get_hash ();
3116 g.type = cls->members[0]->type;
3118 congruence_class_group *slot = optimizer->m_classes.find(&g);
3120 for (unsigned int i = 0; i < slot->classes.length (); i++)
3121 if (slot->classes[i] == cls)
3123 slot->classes.ordered_remove (i);
3124 break;
3127 /* New class will be inserted and integrated to work list. */
3128 for (unsigned int i = 0; i < 2; i++)
3129 optimizer->add_class (newclasses[i]);
3131 /* Two classes replace one, so that increment just by one. */
3132 optimizer->m_classes_count++;
3134 /* If OLD class was presented in the worklist, we remove the class
3135 and replace it will both newly created classes. */
3136 if (in_worklist)
3137 for (unsigned int i = 0; i < 2; i++)
3138 optimizer->worklist_push (newclasses[i]);
3139 else /* Just smaller class is inserted. */
3141 unsigned int smaller_index = newclasses[0]->members.length () <
3142 newclasses[1]->members.length () ?
3143 0 : 1;
3144 optimizer->worklist_push (newclasses[smaller_index]);
3147 if (dump_file && (dump_flags & TDF_DETAILS))
3149 fprintf (dump_file, " congruence class splitted:\n");
3150 cls->dump (dump_file, 4);
3152 fprintf (dump_file, " newly created groups:\n");
3153 for (unsigned int i = 0; i < 2; i++)
3154 newclasses[i]->dump (dump_file, 4);
3157 /* Release class if not presented in work list. */
3158 if (!in_worklist)
3159 delete cls;
3163 return true;
3166 /* Tests if a class CLS used as INDEXth splits any congruence classes.
3167 Bitmap stack BMSTACK is used for bitmap allocation. */
3169 void
3170 sem_item_optimizer::do_congruence_step_for_index (congruence_class *cls,
3171 unsigned int index)
3173 hash_map <congruence_class *, bitmap> split_map;
3175 for (unsigned int i = 0; i < cls->members.length (); i++)
3177 sem_item *item = cls->members[i];
3179 /* Iterate all usages that have INDEX as usage of the item. */
3180 for (unsigned int j = 0; j < item->usages.length (); j++)
3182 sem_usage_pair *usage = item->usages[j];
3184 if (usage->index != index)
3185 continue;
3187 bitmap *slot = split_map.get (usage->item->cls);
3188 bitmap b;
3190 if(!slot)
3192 b = BITMAP_ALLOC (&m_bmstack);
3193 split_map.put (usage->item->cls, b);
3195 else
3196 b = *slot;
3198 gcc_checking_assert (usage->item->cls);
3199 gcc_checking_assert (usage->item->index_in_class <
3200 usage->item->cls->members.length ());
3202 bitmap_set_bit (b, usage->item->index_in_class);
3206 traverse_split_pair pair;
3207 pair.optimizer = this;
3208 pair.cls = cls;
3210 splitter_class_removed = false;
3211 split_map.traverse
3212 <traverse_split_pair *, sem_item_optimizer::traverse_congruence_split> (&pair);
3214 /* Bitmap clean-up. */
3215 split_map.traverse
3216 <traverse_split_pair *, sem_item_optimizer::release_split_map> (NULL);
3219 /* Every usage of a congruence class CLS is a candidate that can split the
3220 collection of classes. Bitmap stack BMSTACK is used for bitmap
3221 allocation. */
3223 void
3224 sem_item_optimizer::do_congruence_step (congruence_class *cls)
3226 bitmap_iterator bi;
3227 unsigned int i;
3229 bitmap usage = BITMAP_ALLOC (&m_bmstack);
3231 for (unsigned int i = 0; i < cls->members.length (); i++)
3232 bitmap_ior_into (usage, cls->members[i]->usage_index_bitmap);
3234 EXECUTE_IF_SET_IN_BITMAP (usage, 0, i, bi)
3236 if (dump_file && (dump_flags & TDF_DETAILS))
3237 fprintf (dump_file, " processing congruence step for class: %u, index: %u\n",
3238 cls->id, i);
3240 do_congruence_step_for_index (cls, i);
3242 if (splitter_class_removed)
3243 break;
3246 BITMAP_FREE (usage);
3249 /* Adds a newly created congruence class CLS to worklist. */
3251 void
3252 sem_item_optimizer::worklist_push (congruence_class *cls)
3254 /* Return if the class CLS is already presented in work list. */
3255 if (cls->in_worklist)
3256 return;
3258 cls->in_worklist = true;
3259 worklist.push_back (cls);
3262 /* Pops a class from worklist. */
3264 congruence_class *
3265 sem_item_optimizer::worklist_pop (void)
3267 congruence_class *cls;
3269 while (!worklist.empty ())
3271 cls = worklist.front ();
3272 worklist.pop_front ();
3273 if (cls->in_worklist)
3275 cls->in_worklist = false;
3277 return cls;
3279 else
3281 /* Work list item was already intended to be removed.
3282 The only reason for doing it is to split a class.
3283 Thus, the class CLS is deleted. */
3284 delete cls;
3288 return NULL;
3291 /* Iterative congruence reduction function. */
3293 void
3294 sem_item_optimizer::process_cong_reduction (void)
3296 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
3297 it != m_classes.end (); ++it)
3298 for (unsigned i = 0; i < (*it)->classes.length (); i++)
3299 if ((*it)->classes[i]->is_class_used ())
3300 worklist_push ((*it)->classes[i]);
3302 if (dump_file)
3303 fprintf (dump_file, "Worklist has been filled with: %lu\n",
3304 (unsigned long) worklist.size ());
3306 if (dump_file && (dump_flags & TDF_DETAILS))
3307 fprintf (dump_file, "Congruence class reduction\n");
3309 congruence_class *cls;
3311 /* Process complete congruence reduction. */
3312 while ((cls = worklist_pop ()) != NULL)
3313 do_congruence_step (cls);
3315 /* Subdivide newly created classes according to references. */
3316 unsigned new_classes = subdivide_classes_by_sensitive_refs ();
3318 if (dump_file)
3319 fprintf (dump_file, "Address reference subdivision created: %u "
3320 "new classes.\n", new_classes);
3323 /* Debug function prints all informations about congruence classes. */
3325 void
3326 sem_item_optimizer::dump_cong_classes (void)
3328 if (!dump_file)
3329 return;
3331 fprintf (dump_file,
3332 "Congruence classes: %u (unique hash values: %lu), with total: %u items\n",
3333 m_classes_count, (unsigned long) m_classes.elements(), m_items.length ());
3335 /* Histogram calculation. */
3336 unsigned int max_index = 0;
3337 unsigned int* histogram = XCNEWVEC (unsigned int, m_items.length () + 1);
3339 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
3340 it != m_classes.end (); ++it)
3342 for (unsigned i = 0; i < (*it)->classes.length (); i++)
3344 unsigned int c = (*it)->classes[i]->members.length ();
3345 histogram[c]++;
3347 if (c > max_index)
3348 max_index = c;
3351 fprintf (dump_file,
3352 "Class size histogram [num of members]: number of classe number of classess\n");
3354 for (unsigned int i = 0; i <= max_index; i++)
3355 if (histogram[i])
3356 fprintf (dump_file, "[%u]: %u classes\n", i, histogram[i]);
3358 fprintf (dump_file, "\n\n");
3361 if (dump_flags & TDF_DETAILS)
3362 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
3363 it != m_classes.end (); ++it)
3365 fprintf (dump_file, " group: with %u classes:\n", (*it)->classes.length ());
3367 for (unsigned i = 0; i < (*it)->classes.length (); i++)
3369 (*it)->classes[i]->dump (dump_file, 4);
3371 if(i < (*it)->classes.length () - 1)
3372 fprintf (dump_file, " ");
3376 free (histogram);
3379 /* After reduction is done, we can declare all items in a group
3380 to be equal. PREV_CLASS_COUNT is start number of classes
3381 before reduction. True is returned if there's a merge operation
3382 processed. */
3384 bool
3385 sem_item_optimizer::merge_classes (unsigned int prev_class_count)
3387 unsigned int item_count = m_items.length ();
3388 unsigned int class_count = m_classes_count;
3389 unsigned int equal_items = item_count - class_count;
3391 unsigned int non_singular_classes_count = 0;
3392 unsigned int non_singular_classes_sum = 0;
3394 bool merged_p = false;
3396 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
3397 it != m_classes.end (); ++it)
3398 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
3400 congruence_class *c = (*it)->classes[i];
3401 if (c->members.length () > 1)
3403 non_singular_classes_count++;
3404 non_singular_classes_sum += c->members.length ();
3408 if (dump_file)
3410 fprintf (dump_file, "\nItem count: %u\n", item_count);
3411 fprintf (dump_file, "Congruent classes before: %u, after: %u\n",
3412 prev_class_count, class_count);
3413 fprintf (dump_file, "Average class size before: %.2f, after: %.2f\n",
3414 prev_class_count ? 1.0f * item_count / prev_class_count : 0.0f,
3415 class_count ? 1.0f * item_count / class_count : 0.0f);
3416 fprintf (dump_file, "Average non-singular class size: %.2f, count: %u\n",
3417 non_singular_classes_count ? 1.0f * non_singular_classes_sum /
3418 non_singular_classes_count : 0.0f,
3419 non_singular_classes_count);
3420 fprintf (dump_file, "Equal symbols: %u\n", equal_items);
3421 fprintf (dump_file, "Fraction of visited symbols: %.2f%%\n\n",
3422 item_count ? 100.0f * equal_items / item_count : 0.0f);
3425 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
3426 it != m_classes.end (); ++it)
3427 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
3429 congruence_class *c = (*it)->classes[i];
3431 if (c->members.length () == 1)
3432 continue;
3434 sem_item *source = c->members[0];
3436 if (DECL_NAME (source->decl)
3437 && MAIN_NAME_P (DECL_NAME (source->decl)))
3438 /* If merge via wrappers, picking main as the target can be
3439 problematic. */
3440 source = c->members[1];
3442 for (unsigned int j = 0; j < c->members.length (); j++)
3444 sem_item *alias = c->members[j];
3446 if (alias == source)
3447 continue;
3449 if (dump_file)
3451 fprintf (dump_file, "Semantic equality hit:%s->%s\n",
3452 xstrdup_for_dump (source->node->name ()),
3453 xstrdup_for_dump (alias->node->name ()));
3454 fprintf (dump_file, "Assembler symbol names:%s->%s\n",
3455 xstrdup_for_dump (source->node->asm_name ()),
3456 xstrdup_for_dump (alias->node->asm_name ()));
3459 if (lookup_attribute ("no_icf", DECL_ATTRIBUTES (alias->decl)))
3461 if (dump_file)
3462 fprintf (dump_file,
3463 "Merge operation is skipped due to no_icf "
3464 "attribute.\n\n");
3466 continue;
3469 if (dump_file && (dump_flags & TDF_DETAILS))
3471 source->dump_to_file (dump_file);
3472 alias->dump_to_file (dump_file);
3475 if (dbg_cnt (merged_ipa_icf))
3476 merged_p |= source->merge (alias);
3480 return merged_p;
3483 /* Dump function prints all class members to a FILE with an INDENT. */
3485 void
3486 congruence_class::dump (FILE *file, unsigned int indent) const
3488 FPRINTF_SPACES (file, indent, "class with id: %u, hash: %u, items: %u\n",
3489 id, members[0]->get_hash (), members.length ());
3491 FPUTS_SPACES (file, indent + 2, "");
3492 for (unsigned i = 0; i < members.length (); i++)
3493 fprintf (file, "%s(%p/%u) ", members[i]->node->asm_name (),
3494 (void *) members[i]->decl,
3495 members[i]->node->order);
3497 fprintf (file, "\n");
3500 /* Returns true if there's a member that is used from another group. */
3502 bool
3503 congruence_class::is_class_used (void)
3505 for (unsigned int i = 0; i < members.length (); i++)
3506 if (members[i]->usages.length ())
3507 return true;
3509 return false;
3512 /* Generate pass summary for IPA ICF pass. */
3514 static void
3515 ipa_icf_generate_summary (void)
3517 if (!optimizer)
3518 optimizer = new sem_item_optimizer ();
3520 optimizer->register_hooks ();
3521 optimizer->parse_funcs_and_vars ();
3524 /* Write pass summary for IPA ICF pass. */
3526 static void
3527 ipa_icf_write_summary (void)
3529 gcc_assert (optimizer);
3531 optimizer->write_summary ();
3534 /* Read pass summary for IPA ICF pass. */
3536 static void
3537 ipa_icf_read_summary (void)
3539 if (!optimizer)
3540 optimizer = new sem_item_optimizer ();
3542 optimizer->read_summary ();
3543 optimizer->register_hooks ();
3546 /* Semantic equality exection function. */
3548 static unsigned int
3549 ipa_icf_driver (void)
3551 gcc_assert (optimizer);
3553 bool merged_p = optimizer->execute ();
3555 delete optimizer;
3556 optimizer = NULL;
3558 return merged_p ? TODO_remove_functions : 0;
3561 const pass_data pass_data_ipa_icf =
3563 IPA_PASS, /* type */
3564 "icf", /* name */
3565 OPTGROUP_IPA, /* optinfo_flags */
3566 TV_IPA_ICF, /* tv_id */
3567 0, /* properties_required */
3568 0, /* properties_provided */
3569 0, /* properties_destroyed */
3570 0, /* todo_flags_start */
3571 0, /* todo_flags_finish */
3574 class pass_ipa_icf : public ipa_opt_pass_d
3576 public:
3577 pass_ipa_icf (gcc::context *ctxt)
3578 : ipa_opt_pass_d (pass_data_ipa_icf, ctxt,
3579 ipa_icf_generate_summary, /* generate_summary */
3580 ipa_icf_write_summary, /* write_summary */
3581 ipa_icf_read_summary, /* read_summary */
3582 NULL, /*
3583 write_optimization_summary */
3584 NULL, /*
3585 read_optimization_summary */
3586 NULL, /* stmt_fixup */
3587 0, /* function_transform_todo_flags_start */
3588 NULL, /* function_transform */
3589 NULL) /* variable_transform */
3592 /* opt_pass methods: */
3593 virtual bool gate (function *)
3595 return in_lto_p || flag_ipa_icf_variables || flag_ipa_icf_functions;
3598 virtual unsigned int execute (function *)
3600 return ipa_icf_driver();
3602 }; // class pass_ipa_icf
3604 } // ipa_icf namespace
3606 ipa_opt_pass_d *
3607 make_pass_ipa_icf (gcc::context *ctxt)
3609 return new ipa_icf::pass_ipa_icf (ctxt);