[Ada] Missing range check on assignment to bit-packed array
[official-gcc.git] / gcc / ipa-icf.c
blob7c486eda7583d564e01e2727348029c736d1fc65
1 /* Interprocedural Identical Code Folding pass
2 Copyright (C) 2014-2019 Free Software Foundation, Inc.
4 Contributed by Jan Hubicka <hubicka@ucw.cz> and Martin Liska <mliska@suse.cz>
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
22 /* Interprocedural Identical Code Folding for functions and
23 read-only variables.
25 The goal of this transformation is to discover functions and read-only
26 variables which do have exactly the same semantics.
28 In case of functions,
29 we could either create a virtual clone or do a simple function wrapper
30 that will call equivalent function. If the function is just locally visible,
31 all function calls can be redirected. For read-only variables, we create
32 aliases if possible.
34 Optimization pass arranges as follows:
35 1) All functions and read-only variables are visited and internal
36 data structure, either sem_function or sem_variables is created.
37 2) For every symbol from the previous step, VAR_DECL and FUNCTION_DECL are
38 saved and matched to corresponding sem_items.
39 3) These declaration are ignored for equality check and are solved
40 by Value Numbering algorithm published by Alpert, Zadeck in 1992.
41 4) We compute hash value for each symbol.
42 5) Congruence classes are created based on hash value. If hash value are
43 equal, equals function is called and symbols are deeply compared.
44 We must prove that all SSA names, declarations and other items
45 correspond.
46 6) Value Numbering is executed for these classes. At the end of the process
47 all symbol members in remaining classes can be merged.
48 7) Merge operation creates alias in case of read-only variables. For
49 callgraph node, we must decide if we can redirect local calls,
50 create an alias or a thunk.
54 #include "config.h"
55 #include "system.h"
56 #include "coretypes.h"
57 #include "backend.h"
58 #include "target.h"
59 #include "rtl.h"
60 #include "tree.h"
61 #include "gimple.h"
62 #include "alloc-pool.h"
63 #include "tree-pass.h"
64 #include "ssa.h"
65 #include "cgraph.h"
66 #include "coverage.h"
67 #include "gimple-pretty-print.h"
68 #include "data-streamer.h"
69 #include "fold-const.h"
70 #include "calls.h"
71 #include "varasm.h"
72 #include "gimple-iterator.h"
73 #include "tree-cfg.h"
74 #include "symbol-summary.h"
75 #include "ipa-prop.h"
76 #include "ipa-fnsummary.h"
77 #include "except.h"
78 #include "attribs.h"
79 #include "print-tree.h"
80 #include "ipa-utils.h"
81 #include "ipa-icf-gimple.h"
82 #include "fibonacci_heap.h"
83 #include "ipa-icf.h"
84 #include "stor-layout.h"
85 #include "dbgcnt.h"
86 #include "tree-vector-builder.h"
88 using namespace ipa_icf_gimple;
90 namespace ipa_icf {
92 /* Initialization and computation of symtab node hash, there data
93 are propagated later on. */
95 static sem_item_optimizer *optimizer = NULL;
97 /* Constructor. */
99 symbol_compare_collection::symbol_compare_collection (symtab_node *node)
101 m_references.create (0);
102 m_interposables.create (0);
104 ipa_ref *ref;
106 if (is_a <varpool_node *> (node) && DECL_VIRTUAL_P (node->decl))
107 return;
109 for (unsigned i = 0; node->iterate_reference (i, ref); i++)
111 if (ref->address_matters_p ())
112 m_references.safe_push (ref->referred);
114 if (ref->referred->get_availability () <= AVAIL_INTERPOSABLE)
116 if (ref->address_matters_p ())
117 m_references.safe_push (ref->referred);
118 else
119 m_interposables.safe_push (ref->referred);
123 if (is_a <cgraph_node *> (node))
125 cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
127 for (cgraph_edge *e = cnode->callees; e; e = e->next_callee)
128 if (e->callee->get_availability () <= AVAIL_INTERPOSABLE)
129 m_interposables.safe_push (e->callee);
133 /* Constructor for key value pair, where _ITEM is key and _INDEX is a target. */
135 sem_usage_pair::sem_usage_pair (sem_item *_item, unsigned int _index)
136 : item (_item), index (_index)
140 sem_item::sem_item (sem_item_type _type, bitmap_obstack *stack)
141 : type (_type), referenced_by_count (0), m_hash (-1), m_hash_set (false)
143 setup (stack);
146 sem_item::sem_item (sem_item_type _type, symtab_node *_node,
147 bitmap_obstack *stack)
148 : type (_type), node (_node), referenced_by_count (0), m_hash (-1),
149 m_hash_set (false)
151 decl = node->decl;
152 setup (stack);
155 /* Add reference to a semantic TARGET. */
157 void
158 sem_item::add_reference (ref_map *refs,
159 sem_item *target)
161 unsigned index = reference_count++;
162 bool existed;
164 vec<sem_item *> &v
165 = refs->get_or_insert (new sem_usage_pair (target, index), &existed);
166 v.safe_push (this);
167 bitmap_set_bit (target->usage_index_bitmap, index);
168 refs_set.add (target->node);
169 ++target->referenced_by_count;
172 /* Initialize internal data structures. Bitmap STACK is used for
173 bitmap memory allocation process. */
175 void
176 sem_item::setup (bitmap_obstack *stack)
178 gcc_checking_assert (node);
180 reference_count = 0;
181 tree_refs.create (0);
182 usage_index_bitmap = BITMAP_ALLOC (stack);
185 sem_item::~sem_item ()
187 tree_refs.release ();
189 BITMAP_FREE (usage_index_bitmap);
192 /* Dump function for debugging purpose. */
194 DEBUG_FUNCTION void
195 sem_item::dump (void)
197 if (dump_file)
199 fprintf (dump_file, "[%s] %s (tree:%p)\n", type == FUNC ? "func" : "var",
200 node->dump_name (), (void *) node->decl);
201 fprintf (dump_file, " hash: %u\n", get_hash ());
205 /* Return true if target supports alias symbols. */
207 bool
208 sem_item::target_supports_symbol_aliases_p (void)
210 #if !defined (ASM_OUTPUT_DEF) || (!defined(ASM_OUTPUT_WEAK_ALIAS) && !defined (ASM_WEAKEN_DECL))
211 return false;
212 #else
213 return true;
214 #endif
217 void sem_item::set_hash (hashval_t hash)
219 m_hash = hash;
220 m_hash_set = true;
223 hash_map<const_tree, hashval_t> sem_item::m_type_hash_cache;
225 /* Semantic function constructor that uses STACK as bitmap memory stack. */
227 sem_function::sem_function (bitmap_obstack *stack)
228 : sem_item (FUNC, stack), m_checker (NULL), m_compared_func (NULL)
230 bb_sizes.create (0);
231 bb_sorted.create (0);
234 sem_function::sem_function (cgraph_node *node, bitmap_obstack *stack)
235 : sem_item (FUNC, node, stack), m_checker (NULL), m_compared_func (NULL)
237 bb_sizes.create (0);
238 bb_sorted.create (0);
241 sem_function::~sem_function ()
243 for (unsigned i = 0; i < bb_sorted.length (); i++)
244 delete (bb_sorted[i]);
246 bb_sizes.release ();
247 bb_sorted.release ();
250 /* Calculates hash value based on a BASIC_BLOCK. */
252 hashval_t
253 sem_function::get_bb_hash (const sem_bb *basic_block)
255 inchash::hash hstate;
257 hstate.add_int (basic_block->nondbg_stmt_count);
258 hstate.add_int (basic_block->edge_count);
260 return hstate.end ();
263 /* References independent hash function. */
265 hashval_t
266 sem_function::get_hash (void)
268 if (!m_hash_set)
270 inchash::hash hstate;
271 hstate.add_int (177454); /* Random number for function type. */
273 hstate.add_int (arg_count);
274 hstate.add_int (cfg_checksum);
275 hstate.add_int (gcode_hash);
277 for (unsigned i = 0; i < bb_sorted.length (); i++)
278 hstate.merge_hash (get_bb_hash (bb_sorted[i]));
280 for (unsigned i = 0; i < bb_sizes.length (); i++)
281 hstate.add_int (bb_sizes[i]);
283 /* Add common features of declaration itself. */
284 if (DECL_FUNCTION_SPECIFIC_TARGET (decl))
285 hstate.add_hwi
286 (cl_target_option_hash
287 (TREE_TARGET_OPTION (DECL_FUNCTION_SPECIFIC_TARGET (decl))));
288 if (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (decl))
289 hstate.add_hwi
290 (cl_optimization_hash
291 (TREE_OPTIMIZATION (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (decl))));
292 hstate.add_flag (DECL_CXX_CONSTRUCTOR_P (decl));
293 hstate.add_flag (DECL_CXX_DESTRUCTOR_P (decl));
295 set_hash (hstate.end ());
298 return m_hash;
301 /* Compare properties of symbols N1 and N2 that does not affect semantics of
302 symbol itself but affects semantics of its references from USED_BY (which
303 may be NULL if it is unknown). If comparsion is false, symbols
304 can still be merged but any symbols referring them can't.
306 If ADDRESS is true, do extra checking needed for IPA_REF_ADDR.
308 TODO: We can also split attributes to those that determine codegen of
309 a function body/variable constructor itself and those that are used when
310 referring to it. */
312 bool
313 sem_item::compare_referenced_symbol_properties (symtab_node *used_by,
314 symtab_node *n1,
315 symtab_node *n2,
316 bool address)
318 if (is_a <cgraph_node *> (n1))
320 /* Inline properties matters: we do now want to merge uses of inline
321 function to uses of normal function because inline hint would be lost.
322 We however can merge inline function to noinline because the alias
323 will keep its DECL_DECLARED_INLINE flag.
325 Also ignore inline flag when optimizing for size or when function
326 is known to not be inlinable.
328 TODO: the optimize_size checks can also be assumed to be true if
329 unit has no !optimize_size functions. */
331 if ((!used_by || address || !is_a <cgraph_node *> (used_by)
332 || !opt_for_fn (used_by->decl, optimize_size))
333 && !opt_for_fn (n1->decl, optimize_size)
334 && n1->get_availability () > AVAIL_INTERPOSABLE
335 && (!DECL_UNINLINABLE (n1->decl) || !DECL_UNINLINABLE (n2->decl)))
337 if (DECL_DISREGARD_INLINE_LIMITS (n1->decl)
338 != DECL_DISREGARD_INLINE_LIMITS (n2->decl))
339 return return_false_with_msg
340 ("DECL_DISREGARD_INLINE_LIMITS are different");
342 if (DECL_DECLARED_INLINE_P (n1->decl)
343 != DECL_DECLARED_INLINE_P (n2->decl))
344 return return_false_with_msg ("inline attributes are different");
347 if (DECL_IS_OPERATOR_NEW (n1->decl)
348 != DECL_IS_OPERATOR_NEW (n2->decl))
349 return return_false_with_msg ("operator new flags are different");
352 /* Merging two definitions with a reference to equivalent vtables, but
353 belonging to a different type may result in ipa-polymorphic-call analysis
354 giving a wrong answer about the dynamic type of instance. */
355 if (is_a <varpool_node *> (n1))
357 if ((DECL_VIRTUAL_P (n1->decl) || DECL_VIRTUAL_P (n2->decl))
358 && (DECL_VIRTUAL_P (n1->decl) != DECL_VIRTUAL_P (n2->decl)
359 || !types_must_be_same_for_odr (DECL_CONTEXT (n1->decl),
360 DECL_CONTEXT (n2->decl)))
361 && (!used_by || !is_a <cgraph_node *> (used_by) || address
362 || opt_for_fn (used_by->decl, flag_devirtualize)))
363 return return_false_with_msg
364 ("references to virtual tables cannot be merged");
366 if (address && DECL_ALIGN (n1->decl) != DECL_ALIGN (n2->decl))
367 return return_false_with_msg ("alignment mismatch");
369 /* For functions we compare attributes in equals_wpa, because we do
370 not know what attributes may cause codegen differences, but for
371 variables just compare attributes for references - the codegen
372 for constructors is affected only by those attributes that we lower
373 to explicit representation (such as DECL_ALIGN or DECL_SECTION). */
374 if (!attribute_list_equal (DECL_ATTRIBUTES (n1->decl),
375 DECL_ATTRIBUTES (n2->decl)))
376 return return_false_with_msg ("different var decl attributes");
377 if (comp_type_attributes (TREE_TYPE (n1->decl),
378 TREE_TYPE (n2->decl)) != 1)
379 return return_false_with_msg ("different var type attributes");
382 /* When matching virtual tables, be sure to also match information
383 relevant for polymorphic call analysis. */
384 if (used_by && is_a <varpool_node *> (used_by)
385 && DECL_VIRTUAL_P (used_by->decl))
387 if (DECL_VIRTUAL_P (n1->decl) != DECL_VIRTUAL_P (n2->decl))
388 return return_false_with_msg ("virtual flag mismatch");
389 if (DECL_VIRTUAL_P (n1->decl) && is_a <cgraph_node *> (n1)
390 && (DECL_FINAL_P (n1->decl) != DECL_FINAL_P (n2->decl)))
391 return return_false_with_msg ("final flag mismatch");
393 return true;
396 /* Hash properties that are compared by compare_referenced_symbol_properties. */
398 void
399 sem_item::hash_referenced_symbol_properties (symtab_node *ref,
400 inchash::hash &hstate,
401 bool address)
403 if (is_a <cgraph_node *> (ref))
405 if ((type != FUNC || address || !opt_for_fn (decl, optimize_size))
406 && !opt_for_fn (ref->decl, optimize_size)
407 && !DECL_UNINLINABLE (ref->decl))
409 hstate.add_flag (DECL_DISREGARD_INLINE_LIMITS (ref->decl));
410 hstate.add_flag (DECL_DECLARED_INLINE_P (ref->decl));
412 hstate.add_flag (DECL_IS_OPERATOR_NEW (ref->decl));
414 else if (is_a <varpool_node *> (ref))
416 hstate.add_flag (DECL_VIRTUAL_P (ref->decl));
417 if (address)
418 hstate.add_int (DECL_ALIGN (ref->decl));
423 /* For a given symbol table nodes N1 and N2, we check that FUNCTION_DECLs
424 point to a same function. Comparison can be skipped if IGNORED_NODES
425 contains these nodes. ADDRESS indicate if address is taken. */
427 bool
428 sem_item::compare_symbol_references (
429 hash_map <symtab_node *, sem_item *> &ignored_nodes,
430 symtab_node *n1, symtab_node *n2, bool address)
432 enum availability avail1, avail2;
434 if (n1 == n2)
435 return true;
437 /* Never match variable and function. */
438 if (is_a <varpool_node *> (n1) != is_a <varpool_node *> (n2))
439 return false;
441 if (!compare_referenced_symbol_properties (node, n1, n2, address))
442 return false;
443 if (address && n1->equal_address_to (n2) == 1)
444 return true;
445 if (!address && n1->semantically_equivalent_p (n2))
446 return true;
448 n1 = n1->ultimate_alias_target (&avail1);
449 n2 = n2->ultimate_alias_target (&avail2);
451 if (avail1 > AVAIL_INTERPOSABLE && ignored_nodes.get (n1)
452 && avail2 > AVAIL_INTERPOSABLE && ignored_nodes.get (n2))
453 return true;
455 return return_false_with_msg ("different references");
458 /* If cgraph edges E1 and E2 are indirect calls, verify that
459 ECF flags are the same. */
461 bool sem_function::compare_edge_flags (cgraph_edge *e1, cgraph_edge *e2)
463 if (e1->indirect_info && e2->indirect_info)
465 int e1_flags = e1->indirect_info->ecf_flags;
466 int e2_flags = e2->indirect_info->ecf_flags;
468 if (e1_flags != e2_flags)
469 return return_false_with_msg ("ICF flags are different");
471 else if (e1->indirect_info || e2->indirect_info)
472 return false;
474 return true;
477 /* Return true if parameter I may be used. */
479 bool
480 sem_function::param_used_p (unsigned int i)
482 if (ipa_node_params_sum == NULL)
483 return true;
485 struct ipa_node_params *parms_info = IPA_NODE_REF (get_node ());
487 if (vec_safe_length (parms_info->descriptors) <= i)
488 return true;
490 return ipa_is_param_used (IPA_NODE_REF (get_node ()), i);
493 /* Perform additional check needed to match types function parameters that are
494 used. Unlike for normal decls it matters if type is TYPE_RESTRICT and we
495 make an assumption that REFERENCE_TYPE parameters are always non-NULL. */
497 bool
498 sem_function::compatible_parm_types_p (tree parm1, tree parm2)
500 /* Be sure that parameters are TBAA compatible. */
501 if (!func_checker::compatible_types_p (parm1, parm2))
502 return return_false_with_msg ("parameter type is not compatible");
504 if (POINTER_TYPE_P (parm1)
505 && (TYPE_RESTRICT (parm1) != TYPE_RESTRICT (parm2)))
506 return return_false_with_msg ("argument restrict flag mismatch");
508 /* nonnull_arg_p implies non-zero range to REFERENCE types. */
509 if (POINTER_TYPE_P (parm1)
510 && TREE_CODE (parm1) != TREE_CODE (parm2)
511 && opt_for_fn (decl, flag_delete_null_pointer_checks))
512 return return_false_with_msg ("pointer wrt reference mismatch");
514 return true;
517 /* Fast equality function based on knowledge known in WPA. */
519 bool
520 sem_function::equals_wpa (sem_item *item,
521 hash_map <symtab_node *, sem_item *> &ignored_nodes)
523 gcc_assert (item->type == FUNC);
524 cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
525 cgraph_node *cnode2 = dyn_cast <cgraph_node *> (item->node);
527 m_compared_func = static_cast<sem_function *> (item);
529 if (cnode->thunk.thunk_p != cnode2->thunk.thunk_p)
530 return return_false_with_msg ("thunk_p mismatch");
532 if (cnode->thunk.thunk_p)
534 if (cnode->thunk.fixed_offset != cnode2->thunk.fixed_offset)
535 return return_false_with_msg ("thunk fixed_offset mismatch");
536 if (cnode->thunk.virtual_value != cnode2->thunk.virtual_value)
537 return return_false_with_msg ("thunk virtual_value mismatch");
538 if (cnode->thunk.indirect_offset != cnode2->thunk.indirect_offset)
539 return return_false_with_msg ("thunk indirect_offset mismatch");
540 if (cnode->thunk.this_adjusting != cnode2->thunk.this_adjusting)
541 return return_false_with_msg ("thunk this_adjusting mismatch");
542 if (cnode->thunk.virtual_offset_p != cnode2->thunk.virtual_offset_p)
543 return return_false_with_msg ("thunk virtual_offset_p mismatch");
546 /* Compare special function DECL attributes. */
547 if (DECL_FUNCTION_PERSONALITY (decl)
548 != DECL_FUNCTION_PERSONALITY (item->decl))
549 return return_false_with_msg ("function personalities are different");
551 if (DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl)
552 != DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (item->decl))
553 return return_false_with_msg ("intrument function entry exit "
554 "attributes are different");
556 if (DECL_NO_LIMIT_STACK (decl) != DECL_NO_LIMIT_STACK (item->decl))
557 return return_false_with_msg ("no stack limit attributes are different");
559 if (DECL_CXX_CONSTRUCTOR_P (decl) != DECL_CXX_CONSTRUCTOR_P (item->decl))
560 return return_false_with_msg ("DECL_CXX_CONSTRUCTOR mismatch");
562 if (DECL_CXX_DESTRUCTOR_P (decl) != DECL_CXX_DESTRUCTOR_P (item->decl))
563 return return_false_with_msg ("DECL_CXX_DESTRUCTOR mismatch");
565 /* TODO: pure/const flags mostly matters only for references, except for
566 the fact that codegen takes LOOPING flag as a hint that loops are
567 finite. We may arrange the code to always pick leader that has least
568 specified flags and then this can go into comparing symbol properties. */
569 if (flags_from_decl_or_type (decl) != flags_from_decl_or_type (item->decl))
570 return return_false_with_msg ("decl_or_type flags are different");
572 /* Do not match polymorphic constructors of different types. They calls
573 type memory location for ipa-polymorphic-call and we do not want
574 it to get confused by wrong type. */
575 if (DECL_CXX_CONSTRUCTOR_P (decl)
576 && TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE)
578 if (TREE_CODE (TREE_TYPE (item->decl)) != METHOD_TYPE)
579 return return_false_with_msg ("DECL_CXX_CONSTURCTOR type mismatch");
580 else if (!func_checker::compatible_polymorphic_types_p
581 (TYPE_METHOD_BASETYPE (TREE_TYPE (decl)),
582 TYPE_METHOD_BASETYPE (TREE_TYPE (item->decl)), false))
583 return return_false_with_msg ("ctor polymorphic type mismatch");
586 /* Checking function TARGET and OPTIMIZATION flags. */
587 cl_target_option *tar1 = target_opts_for_fn (decl);
588 cl_target_option *tar2 = target_opts_for_fn (item->decl);
590 if (tar1 != tar2 && !cl_target_option_eq (tar1, tar2))
592 if (dump_file && (dump_flags & TDF_DETAILS))
594 fprintf (dump_file, "target flags difference");
595 cl_target_option_print_diff (dump_file, 2, tar1, tar2);
598 return return_false_with_msg ("Target flags are different");
601 cl_optimization *opt1 = opts_for_fn (decl);
602 cl_optimization *opt2 = opts_for_fn (item->decl);
604 if (opt1 != opt2 && !cl_optimization_option_eq (opt1, opt2))
606 if (dump_file && (dump_flags & TDF_DETAILS))
608 fprintf (dump_file, "optimization flags difference");
609 cl_optimization_print_diff (dump_file, 2, opt1, opt2);
612 return return_false_with_msg ("optimization flags are different");
615 /* Result type checking. */
616 if (!func_checker::compatible_types_p
617 (TREE_TYPE (TREE_TYPE (decl)),
618 TREE_TYPE (TREE_TYPE (m_compared_func->decl))))
619 return return_false_with_msg ("result types are different");
621 /* Checking types of arguments. */
622 tree list1 = TYPE_ARG_TYPES (TREE_TYPE (decl)),
623 list2 = TYPE_ARG_TYPES (TREE_TYPE (m_compared_func->decl));
624 for (unsigned i = 0; list1 && list2;
625 list1 = TREE_CHAIN (list1), list2 = TREE_CHAIN (list2), i++)
627 tree parm1 = TREE_VALUE (list1);
628 tree parm2 = TREE_VALUE (list2);
630 /* This guard is here for function pointer with attributes (pr59927.c). */
631 if (!parm1 || !parm2)
632 return return_false_with_msg ("NULL argument type");
634 /* Verify that types are compatible to ensure that both functions
635 have same calling conventions. */
636 if (!types_compatible_p (parm1, parm2))
637 return return_false_with_msg ("parameter types are not compatible");
639 if (!param_used_p (i))
640 continue;
642 /* Perform additional checks for used parameters. */
643 if (!compatible_parm_types_p (parm1, parm2))
644 return false;
647 if (list1 || list2)
648 return return_false_with_msg ("Mismatched number of parameters");
650 if (node->num_references () != item->node->num_references ())
651 return return_false_with_msg ("different number of references");
653 /* Checking function attributes.
654 This is quadratic in number of attributes */
655 if (comp_type_attributes (TREE_TYPE (decl),
656 TREE_TYPE (item->decl)) != 1)
657 return return_false_with_msg ("different type attributes");
658 if (!attribute_list_equal (DECL_ATTRIBUTES (decl),
659 DECL_ATTRIBUTES (item->decl)))
660 return return_false_with_msg ("different decl attributes");
662 /* The type of THIS pointer type memory location for
663 ipa-polymorphic-call-analysis. */
664 if (opt_for_fn (decl, flag_devirtualize)
665 && (TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE
666 || TREE_CODE (TREE_TYPE (item->decl)) == METHOD_TYPE)
667 && param_used_p (0)
668 && compare_polymorphic_p ())
670 if (TREE_CODE (TREE_TYPE (decl)) != TREE_CODE (TREE_TYPE (item->decl)))
671 return return_false_with_msg ("METHOD_TYPE and FUNCTION_TYPE mismatch");
672 if (!func_checker::compatible_polymorphic_types_p
673 (TYPE_METHOD_BASETYPE (TREE_TYPE (decl)),
674 TYPE_METHOD_BASETYPE (TREE_TYPE (item->decl)), false))
675 return return_false_with_msg ("THIS pointer ODR type mismatch");
678 ipa_ref *ref = NULL, *ref2 = NULL;
679 for (unsigned i = 0; node->iterate_reference (i, ref); i++)
681 item->node->iterate_reference (i, ref2);
683 if (ref->use != ref2->use)
684 return return_false_with_msg ("reference use mismatch");
686 if (!compare_symbol_references (ignored_nodes, ref->referred,
687 ref2->referred,
688 ref->address_matters_p ()))
689 return false;
692 cgraph_edge *e1 = dyn_cast <cgraph_node *> (node)->callees;
693 cgraph_edge *e2 = dyn_cast <cgraph_node *> (item->node)->callees;
695 while (e1 && e2)
697 if (!compare_symbol_references (ignored_nodes, e1->callee,
698 e2->callee, false))
699 return false;
700 if (!compare_edge_flags (e1, e2))
701 return false;
703 e1 = e1->next_callee;
704 e2 = e2->next_callee;
707 if (e1 || e2)
708 return return_false_with_msg ("different number of calls");
710 e1 = dyn_cast <cgraph_node *> (node)->indirect_calls;
711 e2 = dyn_cast <cgraph_node *> (item->node)->indirect_calls;
713 while (e1 && e2)
715 if (!compare_edge_flags (e1, e2))
716 return false;
718 e1 = e1->next_callee;
719 e2 = e2->next_callee;
722 if (e1 || e2)
723 return return_false_with_msg ("different number of indirect calls");
725 return true;
728 /* Update hash by address sensitive references. We iterate over all
729 sensitive references (address_matters_p) and we hash ultime alias
730 target of these nodes, which can improve a semantic item hash.
732 Also hash in referenced symbols properties. This can be done at any time
733 (as the properties should not change), but it is convenient to do it here
734 while we walk the references anyway. */
736 void
737 sem_item::update_hash_by_addr_refs (hash_map <symtab_node *,
738 sem_item *> &m_symtab_node_map)
740 ipa_ref* ref;
741 inchash::hash hstate (get_hash ());
743 for (unsigned i = 0; node->iterate_reference (i, ref); i++)
745 hstate.add_int (ref->use);
746 hash_referenced_symbol_properties (ref->referred, hstate,
747 ref->use == IPA_REF_ADDR);
748 if (ref->address_matters_p () || !m_symtab_node_map.get (ref->referred))
749 hstate.add_int (ref->referred->ultimate_alias_target ()->order);
752 if (is_a <cgraph_node *> (node))
754 for (cgraph_edge *e = dyn_cast <cgraph_node *> (node)->callers; e;
755 e = e->next_caller)
757 sem_item **result = m_symtab_node_map.get (e->callee);
758 hash_referenced_symbol_properties (e->callee, hstate, false);
759 if (!result)
760 hstate.add_int (e->callee->ultimate_alias_target ()->order);
764 set_hash (hstate.end ());
767 /* Update hash by computed local hash values taken from different
768 semantic items.
769 TODO: stronger SCC based hashing would be desirable here. */
771 void
772 sem_item::update_hash_by_local_refs (hash_map <symtab_node *,
773 sem_item *> &m_symtab_node_map)
775 ipa_ref* ref;
776 inchash::hash state (get_hash ());
778 for (unsigned j = 0; node->iterate_reference (j, ref); j++)
780 sem_item **result = m_symtab_node_map.get (ref->referring);
781 if (result)
782 state.merge_hash ((*result)->get_hash ());
785 if (type == FUNC)
787 for (cgraph_edge *e = dyn_cast <cgraph_node *> (node)->callees; e;
788 e = e->next_callee)
790 sem_item **result = m_symtab_node_map.get (e->caller);
791 if (result)
792 state.merge_hash ((*result)->get_hash ());
796 global_hash = state.end ();
799 /* Returns true if the item equals to ITEM given as argument. */
801 bool
802 sem_function::equals (sem_item *item,
803 hash_map <symtab_node *, sem_item *> &)
805 gcc_assert (item->type == FUNC);
806 bool eq = equals_private (item);
808 if (m_checker != NULL)
810 delete m_checker;
811 m_checker = NULL;
814 if (dump_file && (dump_flags & TDF_DETAILS))
815 fprintf (dump_file,
816 "Equals called for: %s:%s with result: %s\n\n",
817 node->dump_name (),
818 item->node->dump_name (),
819 eq ? "true" : "false");
821 return eq;
824 /* Processes function equality comparison. */
826 bool
827 sem_function::equals_private (sem_item *item)
829 if (item->type != FUNC)
830 return false;
832 basic_block bb1, bb2;
833 edge e1, e2;
834 edge_iterator ei1, ei2;
835 bool result = true;
836 tree arg1, arg2;
838 m_compared_func = static_cast<sem_function *> (item);
840 gcc_assert (decl != item->decl);
842 if (bb_sorted.length () != m_compared_func->bb_sorted.length ()
843 || edge_count != m_compared_func->edge_count
844 || cfg_checksum != m_compared_func->cfg_checksum)
845 return return_false ();
847 m_checker = new func_checker (decl, m_compared_func->decl,
848 compare_polymorphic_p (),
849 false,
850 &refs_set,
851 &m_compared_func->refs_set);
852 arg1 = DECL_ARGUMENTS (decl);
853 arg2 = DECL_ARGUMENTS (m_compared_func->decl);
854 for (unsigned i = 0;
855 arg1 && arg2; arg1 = DECL_CHAIN (arg1), arg2 = DECL_CHAIN (arg2), i++)
857 if (!types_compatible_p (TREE_TYPE (arg1), TREE_TYPE (arg2)))
858 return return_false_with_msg ("argument types are not compatible");
859 if (!param_used_p (i))
860 continue;
861 /* Perform additional checks for used parameters. */
862 if (!compatible_parm_types_p (TREE_TYPE (arg1), TREE_TYPE (arg2)))
863 return false;
864 if (!m_checker->compare_decl (arg1, arg2))
865 return return_false ();
867 if (arg1 || arg2)
868 return return_false_with_msg ("Mismatched number of arguments");
870 if (!dyn_cast <cgraph_node *> (node)->has_gimple_body_p ())
871 return true;
873 /* Fill-up label dictionary. */
874 for (unsigned i = 0; i < bb_sorted.length (); ++i)
876 m_checker->parse_labels (bb_sorted[i]);
877 m_checker->parse_labels (m_compared_func->bb_sorted[i]);
880 /* Checking all basic blocks. */
881 for (unsigned i = 0; i < bb_sorted.length (); ++i)
882 if(!m_checker->compare_bb (bb_sorted[i], m_compared_func->bb_sorted[i]))
883 return return_false();
885 auto_vec <int> bb_dict;
887 /* Basic block edges check. */
888 for (unsigned i = 0; i < bb_sorted.length (); ++i)
890 bb1 = bb_sorted[i]->bb;
891 bb2 = m_compared_func->bb_sorted[i]->bb;
893 ei2 = ei_start (bb2->preds);
895 for (ei1 = ei_start (bb1->preds); ei_cond (ei1, &e1); ei_next (&ei1))
897 ei_cond (ei2, &e2);
899 if (e1->flags != e2->flags)
900 return return_false_with_msg ("flags comparison returns false");
902 if (!bb_dict_test (&bb_dict, e1->src->index, e2->src->index))
903 return return_false_with_msg ("edge comparison returns false");
905 if (!bb_dict_test (&bb_dict, e1->dest->index, e2->dest->index))
906 return return_false_with_msg ("BB comparison returns false");
908 if (!m_checker->compare_edge (e1, e2))
909 return return_false_with_msg ("edge comparison returns false");
911 ei_next (&ei2);
915 /* Basic block PHI nodes comparison. */
916 for (unsigned i = 0; i < bb_sorted.length (); i++)
917 if (!compare_phi_node (bb_sorted[i]->bb, m_compared_func->bb_sorted[i]->bb))
918 return return_false_with_msg ("PHI node comparison returns false");
920 return result;
923 /* Set LOCAL_P of NODE to true if DATA is non-NULL.
924 Helper for call_for_symbol_thunks_and_aliases. */
926 static bool
927 set_local (cgraph_node *node, void *data)
929 node->local.local = data != NULL;
930 return false;
933 /* TREE_ADDRESSABLE of NODE to true.
934 Helper for call_for_symbol_thunks_and_aliases. */
936 static bool
937 set_addressable (varpool_node *node, void *)
939 TREE_ADDRESSABLE (node->decl) = 1;
940 return false;
943 /* Clear DECL_RTL of NODE.
944 Helper for call_for_symbol_thunks_and_aliases. */
946 static bool
947 clear_decl_rtl (symtab_node *node, void *)
949 SET_DECL_RTL (node->decl, NULL);
950 return false;
953 /* Redirect all callers of N and its aliases to TO. Remove aliases if
954 possible. Return number of redirections made. */
956 static int
957 redirect_all_callers (cgraph_node *n, cgraph_node *to)
959 int nredirected = 0;
960 ipa_ref *ref;
961 cgraph_edge *e = n->callers;
963 while (e)
965 /* Redirecting thunks to interposable symbols or symbols in other sections
966 may not be supported by target output code. Play safe for now and
967 punt on redirection. */
968 if (!e->caller->thunk.thunk_p)
970 struct cgraph_edge *nexte = e->next_caller;
971 e->redirect_callee (to);
972 e = nexte;
973 nredirected++;
975 else
976 e = e->next_callee;
978 for (unsigned i = 0; n->iterate_direct_aliases (i, ref);)
980 bool removed = false;
981 cgraph_node *n_alias = dyn_cast <cgraph_node *> (ref->referring);
983 if ((DECL_COMDAT_GROUP (n->decl)
984 && (DECL_COMDAT_GROUP (n->decl)
985 == DECL_COMDAT_GROUP (n_alias->decl)))
986 || (n_alias->get_availability () > AVAIL_INTERPOSABLE
987 && n->get_availability () > AVAIL_INTERPOSABLE))
989 nredirected += redirect_all_callers (n_alias, to);
990 if (n_alias->can_remove_if_no_direct_calls_p ()
991 && !n_alias->call_for_symbol_and_aliases (cgraph_node::has_thunk_p,
992 NULL, true)
993 && !n_alias->has_aliases_p ())
994 n_alias->remove ();
996 if (!removed)
997 i++;
999 return nredirected;
1002 /* Merges instance with an ALIAS_ITEM, where alias, thunk or redirection can
1003 be applied. */
1005 bool
1006 sem_function::merge (sem_item *alias_item)
1008 gcc_assert (alias_item->type == FUNC);
1010 sem_function *alias_func = static_cast<sem_function *> (alias_item);
1012 cgraph_node *original = get_node ();
1013 cgraph_node *local_original = NULL;
1014 cgraph_node *alias = alias_func->get_node ();
1016 bool create_wrapper = false;
1017 bool create_alias = false;
1018 bool redirect_callers = false;
1019 bool remove = false;
1021 bool original_discardable = false;
1022 bool original_discarded = false;
1024 bool original_address_matters = original->address_matters_p ();
1025 bool alias_address_matters = alias->address_matters_p ();
1027 if (DECL_EXTERNAL (alias->decl))
1029 if (dump_file)
1030 fprintf (dump_file, "Not unifying; alias is external.\n\n");
1031 return false;
1034 if (DECL_NO_INLINE_WARNING_P (original->decl)
1035 != DECL_NO_INLINE_WARNING_P (alias->decl))
1037 if (dump_file)
1038 fprintf (dump_file,
1039 "Not unifying; "
1040 "DECL_NO_INLINE_WARNING mismatch.\n\n");
1041 return false;
1044 /* Do not attempt to mix functions from different user sections;
1045 we do not know what user intends with those. */
1046 if (((DECL_SECTION_NAME (original->decl) && !original->implicit_section)
1047 || (DECL_SECTION_NAME (alias->decl) && !alias->implicit_section))
1048 && DECL_SECTION_NAME (original->decl) != DECL_SECTION_NAME (alias->decl))
1050 if (dump_file)
1051 fprintf (dump_file,
1052 "Not unifying; "
1053 "original and alias are in different sections.\n\n");
1054 return false;
1057 if (!original->in_same_comdat_group_p (alias)
1058 || original->comdat_local_p ())
1060 if (dump_file)
1061 fprintf (dump_file,
1062 "Not unifying; alias nor wrapper cannot be created; "
1063 "across comdat group boundary\n\n");
1065 return false;
1068 /* See if original is in a section that can be discarded if the main
1069 symbol is not used. */
1071 if (original->can_be_discarded_p ())
1072 original_discardable = true;
1073 /* Also consider case where we have resolution info and we know that
1074 original's definition is not going to be used. In this case we cannot
1075 create alias to original. */
1076 if (node->resolution != LDPR_UNKNOWN
1077 && !decl_binds_to_current_def_p (node->decl))
1078 original_discardable = original_discarded = true;
1080 /* Creating a symtab alias is the optimal way to merge.
1081 It however cannot be used in the following cases:
1083 1) if ORIGINAL and ALIAS may be possibly compared for address equality.
1084 2) if ORIGINAL is in a section that may be discarded by linker or if
1085 it is an external functions where we cannot create an alias
1086 (ORIGINAL_DISCARDABLE)
1087 3) if target do not support symbol aliases.
1088 4) original and alias lie in different comdat groups.
1090 If we cannot produce alias, we will turn ALIAS into WRAPPER of ORIGINAL
1091 and/or redirect all callers from ALIAS to ORIGINAL. */
1092 if ((original_address_matters && alias_address_matters)
1093 || (original_discardable
1094 && (!DECL_COMDAT_GROUP (alias->decl)
1095 || (DECL_COMDAT_GROUP (alias->decl)
1096 != DECL_COMDAT_GROUP (original->decl))))
1097 || original_discarded
1098 || !sem_item::target_supports_symbol_aliases_p ()
1099 || DECL_COMDAT_GROUP (alias->decl) != DECL_COMDAT_GROUP (original->decl))
1101 /* First see if we can produce wrapper. */
1103 /* Symbol properties that matter for references must be preserved.
1104 TODO: We can produce wrapper, but we need to produce alias of ORIGINAL
1105 with proper properties. */
1106 if (!sem_item::compare_referenced_symbol_properties (NULL, original, alias,
1107 alias->address_taken))
1109 if (dump_file)
1110 fprintf (dump_file,
1111 "Wrapper cannot be created because referenced symbol "
1112 "properties mismatch\n");
1114 /* Do not turn function in one comdat group into wrapper to another
1115 comdat group. Other compiler producing the body of the
1116 another comdat group may make opossite decision and with unfortunate
1117 linker choices this may close a loop. */
1118 else if (DECL_COMDAT_GROUP (original->decl)
1119 && DECL_COMDAT_GROUP (alias->decl)
1120 && (DECL_COMDAT_GROUP (alias->decl)
1121 != DECL_COMDAT_GROUP (original->decl)))
1123 if (dump_file)
1124 fprintf (dump_file,
1125 "Wrapper cannot be created because of COMDAT\n");
1127 else if (DECL_STATIC_CHAIN (alias->decl)
1128 || DECL_STATIC_CHAIN (original->decl))
1130 if (dump_file)
1131 fprintf (dump_file,
1132 "Cannot create wrapper of nested function.\n");
1134 /* TODO: We can also deal with variadic functions never calling
1135 VA_START. */
1136 else if (stdarg_p (TREE_TYPE (alias->decl)))
1138 if (dump_file)
1139 fprintf (dump_file,
1140 "cannot create wrapper of stdarg function.\n");
1142 else if (ipa_fn_summaries
1143 && ipa_fn_summaries->get (alias) != NULL
1144 && ipa_fn_summaries->get (alias)->self_size <= 2)
1146 if (dump_file)
1147 fprintf (dump_file, "Wrapper creation is not "
1148 "profitable (function is too small).\n");
1150 /* If user paid attention to mark function noinline, assume it is
1151 somewhat special and do not try to turn it into a wrapper that
1152 cannot be undone by inliner. */
1153 else if (lookup_attribute ("noinline", DECL_ATTRIBUTES (alias->decl)))
1155 if (dump_file)
1156 fprintf (dump_file, "Wrappers are not created for noinline.\n");
1158 else
1159 create_wrapper = true;
1161 /* We can redirect local calls in the case both alias and orignal
1162 are not interposable. */
1163 redirect_callers
1164 = alias->get_availability () > AVAIL_INTERPOSABLE
1165 && original->get_availability () > AVAIL_INTERPOSABLE;
1166 /* TODO: We can redirect, 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))
1170 redirect_callers = false;
1172 if (!redirect_callers && !create_wrapper)
1174 if (dump_file)
1175 fprintf (dump_file, "Not unifying; cannot redirect callers nor "
1176 "produce wrapper\n\n");
1177 return false;
1180 /* Work out the symbol the wrapper should call.
1181 If ORIGINAL is interposable, we need to call a local alias.
1182 Also produce local alias (if possible) as an optimization.
1184 Local aliases cannot be created inside comdat groups because that
1185 prevents inlining. */
1186 if (!original_discardable && !original->get_comdat_group ())
1188 local_original
1189 = dyn_cast <cgraph_node *> (original->noninterposable_alias ());
1190 if (!local_original
1191 && original->get_availability () > AVAIL_INTERPOSABLE)
1192 local_original = original;
1194 /* If we cannot use local alias, fallback to the original
1195 when possible. */
1196 else if (original->get_availability () > AVAIL_INTERPOSABLE)
1197 local_original = original;
1199 /* If original is COMDAT local, we cannot really redirect calls outside
1200 of its comdat group to it. */
1201 if (original->comdat_local_p ())
1202 redirect_callers = false;
1203 if (!local_original)
1205 if (dump_file)
1206 fprintf (dump_file, "Not unifying; "
1207 "cannot produce local alias.\n\n");
1208 return false;
1211 if (!redirect_callers && !create_wrapper)
1213 if (dump_file)
1214 fprintf (dump_file, "Not unifying; "
1215 "cannot redirect callers nor produce a wrapper\n\n");
1216 return false;
1218 if (!create_wrapper
1219 && !alias->call_for_symbol_and_aliases (cgraph_node::has_thunk_p,
1220 NULL, true)
1221 && !alias->can_remove_if_no_direct_calls_p ())
1223 if (dump_file)
1224 fprintf (dump_file, "Not unifying; cannot make wrapper and "
1225 "function has other uses than direct calls\n\n");
1226 return false;
1229 else
1230 create_alias = true;
1232 if (redirect_callers)
1234 int nredirected = redirect_all_callers (alias, local_original);
1236 if (nredirected)
1238 alias->icf_merged = true;
1239 local_original->icf_merged = true;
1241 if (dump_file && nredirected)
1242 fprintf (dump_file, "%i local calls have been "
1243 "redirected.\n", nredirected);
1246 /* If all callers was redirected, do not produce wrapper. */
1247 if (alias->can_remove_if_no_direct_calls_p ()
1248 && !DECL_VIRTUAL_P (alias->decl)
1249 && !alias->has_aliases_p ())
1251 create_wrapper = false;
1252 remove = true;
1254 gcc_assert (!create_alias);
1256 else if (create_alias)
1258 alias->icf_merged = true;
1260 /* Remove the function's body. */
1261 ipa_merge_profiles (original, alias);
1262 alias->release_body (true);
1263 alias->reset ();
1264 /* Notice global symbol possibly produced RTL. */
1265 ((symtab_node *)alias)->call_for_symbol_and_aliases (clear_decl_rtl,
1266 NULL, true);
1268 /* Create the alias. */
1269 cgraph_node::create_alias (alias_func->decl, decl);
1270 alias->resolve_alias (original);
1272 original->call_for_symbol_thunks_and_aliases
1273 (set_local, (void *)(size_t) original->local_p (), true);
1275 if (dump_file)
1276 fprintf (dump_file, "Unified; Function alias has been created.\n\n");
1278 if (create_wrapper)
1280 gcc_assert (!create_alias);
1281 alias->icf_merged = true;
1282 local_original->icf_merged = true;
1284 /* FIXME update local_original counts. */
1285 ipa_merge_profiles (original, alias, true);
1286 alias->create_wrapper (local_original);
1288 if (dump_file)
1289 fprintf (dump_file, "Unified; Wrapper has been created.\n\n");
1292 /* It's possible that redirection can hit thunks that block
1293 redirection opportunities. */
1294 gcc_assert (alias->icf_merged || remove || redirect_callers);
1295 original->icf_merged = true;
1297 /* We use merged flag to track cases where COMDAT function is known to be
1298 compatible its callers. If we merged in non-COMDAT, we need to give up
1299 on this optimization. */
1300 if (original->merged_comdat && !alias->merged_comdat)
1302 if (dump_file)
1303 fprintf (dump_file, "Dropping merged_comdat flag.\n\n");
1304 if (local_original)
1305 local_original->merged_comdat = false;
1306 original->merged_comdat = false;
1309 if (remove)
1311 ipa_merge_profiles (original, alias);
1312 alias->release_body ();
1313 alias->reset ();
1314 alias->body_removed = true;
1315 alias->icf_merged = true;
1316 if (dump_file)
1317 fprintf (dump_file, "Unified; Function body was removed.\n");
1320 return true;
1323 /* Semantic item initialization function. */
1325 void
1326 sem_function::init (void)
1328 if (in_lto_p)
1329 get_node ()->get_untransformed_body ();
1331 tree fndecl = node->decl;
1332 function *func = DECL_STRUCT_FUNCTION (fndecl);
1334 gcc_assert (func);
1335 gcc_assert (SSANAMES (func));
1337 ssa_names_size = SSANAMES (func)->length ();
1338 node = node;
1340 decl = fndecl;
1341 region_tree = func->eh->region_tree;
1343 /* iterating all function arguments. */
1344 arg_count = count_formal_params (fndecl);
1346 edge_count = n_edges_for_fn (func);
1347 cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
1348 if (!cnode->thunk.thunk_p)
1350 cfg_checksum = coverage_compute_cfg_checksum (func);
1352 inchash::hash hstate;
1354 basic_block bb;
1355 FOR_EACH_BB_FN (bb, func)
1357 unsigned nondbg_stmt_count = 0;
1359 edge e;
1360 for (edge_iterator ei = ei_start (bb->preds); ei_cond (ei, &e);
1361 ei_next (&ei))
1362 cfg_checksum = iterative_hash_host_wide_int (e->flags,
1363 cfg_checksum);
1365 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
1366 gsi_next (&gsi))
1368 gimple *stmt = gsi_stmt (gsi);
1370 if (gimple_code (stmt) != GIMPLE_DEBUG
1371 && gimple_code (stmt) != GIMPLE_PREDICT)
1373 hash_stmt (stmt, hstate);
1374 nondbg_stmt_count++;
1378 hstate.commit_flag ();
1379 gcode_hash = hstate.end ();
1380 bb_sizes.safe_push (nondbg_stmt_count);
1382 /* Inserting basic block to hash table. */
1383 sem_bb *semantic_bb = new sem_bb (bb, nondbg_stmt_count,
1384 EDGE_COUNT (bb->preds)
1385 + EDGE_COUNT (bb->succs));
1387 bb_sorted.safe_push (semantic_bb);
1390 else
1392 cfg_checksum = 0;
1393 inchash::hash hstate;
1394 hstate.add_hwi (cnode->thunk.fixed_offset);
1395 hstate.add_hwi (cnode->thunk.virtual_value);
1396 hstate.add_flag (cnode->thunk.this_adjusting);
1397 hstate.add_flag (cnode->thunk.virtual_offset_p);
1398 gcode_hash = hstate.end ();
1402 /* Accumulate to HSTATE a hash of expression EXP.
1403 Identical to inchash::add_expr, but guaranteed to be stable across LTO
1404 and DECL equality classes. */
1406 void
1407 sem_item::add_expr (const_tree exp, inchash::hash &hstate)
1409 if (exp == NULL_TREE)
1411 hstate.merge_hash (0);
1412 return;
1415 /* Handled component can be matched in a cureful way proving equivalence
1416 even if they syntactically differ. Just skip them. */
1417 STRIP_NOPS (exp);
1418 while (handled_component_p (exp))
1419 exp = TREE_OPERAND (exp, 0);
1421 enum tree_code code = TREE_CODE (exp);
1422 hstate.add_int (code);
1424 switch (code)
1426 /* Use inchash::add_expr for everything that is LTO stable. */
1427 case VOID_CST:
1428 case INTEGER_CST:
1429 case REAL_CST:
1430 case FIXED_CST:
1431 case STRING_CST:
1432 case COMPLEX_CST:
1433 case VECTOR_CST:
1434 inchash::add_expr (exp, hstate);
1435 break;
1436 case CONSTRUCTOR:
1438 unsigned HOST_WIDE_INT idx;
1439 tree value;
1441 hstate.add_hwi (int_size_in_bytes (TREE_TYPE (exp)));
1443 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, value)
1444 if (value)
1445 add_expr (value, hstate);
1446 break;
1448 case ADDR_EXPR:
1449 case FDESC_EXPR:
1450 add_expr (get_base_address (TREE_OPERAND (exp, 0)), hstate);
1451 break;
1452 case SSA_NAME:
1453 case VAR_DECL:
1454 case CONST_DECL:
1455 case PARM_DECL:
1456 hstate.add_hwi (int_size_in_bytes (TREE_TYPE (exp)));
1457 break;
1458 case MEM_REF:
1459 case POINTER_PLUS_EXPR:
1460 case MINUS_EXPR:
1461 case RANGE_EXPR:
1462 add_expr (TREE_OPERAND (exp, 0), hstate);
1463 add_expr (TREE_OPERAND (exp, 1), hstate);
1464 break;
1465 case PLUS_EXPR:
1467 inchash::hash one, two;
1468 add_expr (TREE_OPERAND (exp, 0), one);
1469 add_expr (TREE_OPERAND (exp, 1), two);
1470 hstate.add_commutative (one, two);
1472 break;
1473 CASE_CONVERT:
1474 hstate.add_hwi (int_size_in_bytes (TREE_TYPE (exp)));
1475 return add_expr (TREE_OPERAND (exp, 0), hstate);
1476 default:
1477 break;
1481 /* Accumulate to HSTATE a hash of type t.
1482 TYpes that may end up being compatible after LTO type merging needs to have
1483 the same hash. */
1485 void
1486 sem_item::add_type (const_tree type, inchash::hash &hstate)
1488 if (type == NULL_TREE)
1490 hstate.merge_hash (0);
1491 return;
1494 type = TYPE_MAIN_VARIANT (type);
1496 hstate.add_int (TYPE_MODE (type));
1498 if (TREE_CODE (type) == COMPLEX_TYPE)
1500 hstate.add_int (COMPLEX_TYPE);
1501 sem_item::add_type (TREE_TYPE (type), hstate);
1503 else if (INTEGRAL_TYPE_P (type))
1505 hstate.add_int (INTEGER_TYPE);
1506 hstate.add_flag (TYPE_UNSIGNED (type));
1507 hstate.add_int (TYPE_PRECISION (type));
1509 else if (VECTOR_TYPE_P (type))
1511 hstate.add_int (VECTOR_TYPE);
1512 hstate.add_int (TYPE_PRECISION (type));
1513 sem_item::add_type (TREE_TYPE (type), hstate);
1515 else if (TREE_CODE (type) == ARRAY_TYPE)
1517 hstate.add_int (ARRAY_TYPE);
1518 /* Do not hash size, so complete and incomplete types can match. */
1519 sem_item::add_type (TREE_TYPE (type), hstate);
1521 else if (RECORD_OR_UNION_TYPE_P (type))
1523 /* Incomplete types must be skipped here. */
1524 if (!COMPLETE_TYPE_P (type))
1526 hstate.add_int (RECORD_TYPE);
1527 return;
1530 hashval_t *val = m_type_hash_cache.get (type);
1532 if (!val)
1534 inchash::hash hstate2;
1535 unsigned nf;
1536 tree f;
1537 hashval_t hash;
1539 hstate2.add_int (RECORD_TYPE);
1540 for (f = TYPE_FIELDS (type), nf = 0; f; f = TREE_CHAIN (f))
1541 if (TREE_CODE (f) == FIELD_DECL)
1543 add_type (TREE_TYPE (f), hstate2);
1544 nf++;
1547 hstate2.add_int (nf);
1548 hash = hstate2.end ();
1549 hstate.add_hwi (hash);
1550 m_type_hash_cache.put (type, hash);
1552 else
1553 hstate.add_hwi (*val);
1557 /* Improve accumulated hash for HSTATE based on a gimple statement STMT. */
1559 void
1560 sem_function::hash_stmt (gimple *stmt, inchash::hash &hstate)
1562 enum gimple_code code = gimple_code (stmt);
1564 hstate.add_int (code);
1566 switch (code)
1568 case GIMPLE_SWITCH:
1569 add_expr (gimple_switch_index (as_a <gswitch *> (stmt)), hstate);
1570 break;
1571 case GIMPLE_ASSIGN:
1572 hstate.add_int (gimple_assign_rhs_code (stmt));
1573 if (commutative_tree_code (gimple_assign_rhs_code (stmt))
1574 || commutative_ternary_tree_code (gimple_assign_rhs_code (stmt)))
1576 inchash::hash one, two;
1578 add_expr (gimple_assign_rhs1 (stmt), one);
1579 add_type (TREE_TYPE (gimple_assign_rhs1 (stmt)), one);
1580 add_expr (gimple_assign_rhs2 (stmt), two);
1581 hstate.add_commutative (one, two);
1582 if (commutative_ternary_tree_code (gimple_assign_rhs_code (stmt)))
1584 add_expr (gimple_assign_rhs3 (stmt), hstate);
1585 add_type (TREE_TYPE (gimple_assign_rhs3 (stmt)), hstate);
1587 add_expr (gimple_assign_lhs (stmt), hstate);
1588 add_type (TREE_TYPE (gimple_assign_lhs (stmt)), two);
1589 break;
1591 /* fall through */
1592 case GIMPLE_CALL:
1593 case GIMPLE_ASM:
1594 case GIMPLE_COND:
1595 case GIMPLE_GOTO:
1596 case GIMPLE_RETURN:
1597 /* All these statements are equivalent if their operands are. */
1598 for (unsigned i = 0; i < gimple_num_ops (stmt); ++i)
1600 add_expr (gimple_op (stmt, i), hstate);
1601 if (gimple_op (stmt, i))
1602 add_type (TREE_TYPE (gimple_op (stmt, i)), hstate);
1604 /* Consider nocf_check attribute in hash as it affects code
1605 generation. */
1606 if (code == GIMPLE_CALL
1607 && flag_cf_protection & CF_BRANCH)
1608 hstate.add_flag (gimple_call_nocf_check_p (as_a <gcall *> (stmt)));
1609 default:
1610 break;
1615 /* Return true if polymorphic comparison must be processed. */
1617 bool
1618 sem_function::compare_polymorphic_p (void)
1620 struct cgraph_edge *e;
1622 if (!opt_for_fn (get_node ()->decl, flag_devirtualize))
1623 return false;
1624 if (get_node ()->indirect_calls != NULL)
1625 return true;
1626 /* TODO: We can do simple propagation determining what calls may lead to
1627 a polymorphic call. */
1628 for (e = get_node ()->callees; e; e = e->next_callee)
1629 if (e->callee->definition
1630 && opt_for_fn (e->callee->decl, flag_devirtualize))
1631 return true;
1632 return false;
1635 /* For a given call graph NODE, the function constructs new
1636 semantic function item. */
1638 sem_function *
1639 sem_function::parse (cgraph_node *node, bitmap_obstack *stack)
1641 tree fndecl = node->decl;
1642 function *func = DECL_STRUCT_FUNCTION (fndecl);
1644 if (!func || (!node->has_gimple_body_p () && !node->thunk.thunk_p))
1645 return NULL;
1647 if (lookup_attribute_by_prefix ("omp ", DECL_ATTRIBUTES (node->decl)) != NULL)
1648 return NULL;
1650 if (lookup_attribute_by_prefix ("oacc ",
1651 DECL_ATTRIBUTES (node->decl)) != NULL)
1652 return NULL;
1654 /* PR ipa/70306. */
1655 if (DECL_STATIC_CONSTRUCTOR (node->decl)
1656 || DECL_STATIC_DESTRUCTOR (node->decl))
1657 return NULL;
1659 sem_function *f = new sem_function (node, stack);
1661 f->init ();
1663 return f;
1666 /* For given basic blocks BB1 and BB2 (from functions FUNC1 and FUNC),
1667 return true if phi nodes are semantically equivalent in these blocks . */
1669 bool
1670 sem_function::compare_phi_node (basic_block bb1, basic_block bb2)
1672 gphi_iterator si1, si2;
1673 gphi *phi1, *phi2;
1674 unsigned size1, size2, i;
1675 tree t1, t2;
1676 edge e1, e2;
1678 gcc_assert (bb1 != NULL);
1679 gcc_assert (bb2 != NULL);
1681 si2 = gsi_start_phis (bb2);
1682 for (si1 = gsi_start_phis (bb1); !gsi_end_p (si1);
1683 gsi_next (&si1))
1685 gsi_next_nonvirtual_phi (&si1);
1686 gsi_next_nonvirtual_phi (&si2);
1688 if (gsi_end_p (si1) && gsi_end_p (si2))
1689 break;
1691 if (gsi_end_p (si1) || gsi_end_p (si2))
1692 return return_false();
1694 phi1 = si1.phi ();
1695 phi2 = si2.phi ();
1697 tree phi_result1 = gimple_phi_result (phi1);
1698 tree phi_result2 = gimple_phi_result (phi2);
1700 if (!m_checker->compare_operand (phi_result1, phi_result2))
1701 return return_false_with_msg ("PHI results are different");
1703 size1 = gimple_phi_num_args (phi1);
1704 size2 = gimple_phi_num_args (phi2);
1706 if (size1 != size2)
1707 return return_false ();
1709 for (i = 0; i < size1; ++i)
1711 t1 = gimple_phi_arg (phi1, i)->def;
1712 t2 = gimple_phi_arg (phi2, i)->def;
1714 if (!m_checker->compare_operand (t1, t2))
1715 return return_false ();
1717 e1 = gimple_phi_arg_edge (phi1, i);
1718 e2 = gimple_phi_arg_edge (phi2, i);
1720 if (!m_checker->compare_edge (e1, e2))
1721 return return_false ();
1724 gsi_next (&si2);
1727 return true;
1730 /* Returns true if tree T can be compared as a handled component. */
1732 bool
1733 sem_function::icf_handled_component_p (tree t)
1735 tree_code tc = TREE_CODE (t);
1737 return (handled_component_p (t)
1738 || tc == ADDR_EXPR || tc == MEM_REF || tc == OBJ_TYPE_REF);
1741 /* Basic blocks dictionary BB_DICT returns true if SOURCE index BB
1742 corresponds to TARGET. */
1744 bool
1745 sem_function::bb_dict_test (vec<int> *bb_dict, int source, int target)
1747 source++;
1748 target++;
1750 if (bb_dict->length () <= (unsigned)source)
1751 bb_dict->safe_grow_cleared (source + 1);
1753 if ((*bb_dict)[source] == 0)
1755 (*bb_dict)[source] = target;
1756 return true;
1758 else
1759 return (*bb_dict)[source] == target;
1762 sem_variable::sem_variable (bitmap_obstack *stack): sem_item (VAR, stack)
1766 sem_variable::sem_variable (varpool_node *node, bitmap_obstack *stack)
1767 : sem_item (VAR, node, stack)
1769 gcc_checking_assert (node);
1770 gcc_checking_assert (get_node ());
1773 /* Fast equality function based on knowledge known in WPA. */
1775 bool
1776 sem_variable::equals_wpa (sem_item *item,
1777 hash_map <symtab_node *, sem_item *> &ignored_nodes)
1779 gcc_assert (item->type == VAR);
1781 if (node->num_references () != item->node->num_references ())
1782 return return_false_with_msg ("different number of references");
1784 if (DECL_TLS_MODEL (decl) || DECL_TLS_MODEL (item->decl))
1785 return return_false_with_msg ("TLS model");
1787 /* DECL_ALIGN is safe to merge, because we will always chose the largest
1788 alignment out of all aliases. */
1790 if (DECL_VIRTUAL_P (decl) != DECL_VIRTUAL_P (item->decl))
1791 return return_false_with_msg ("Virtual flag mismatch");
1793 if (DECL_SIZE (decl) != DECL_SIZE (item->decl)
1794 && ((!DECL_SIZE (decl) || !DECL_SIZE (item->decl))
1795 || !operand_equal_p (DECL_SIZE (decl),
1796 DECL_SIZE (item->decl), OEP_ONLY_CONST)))
1797 return return_false_with_msg ("size mismatch");
1799 /* Do not attempt to mix data from different user sections;
1800 we do not know what user intends with those. */
1801 if (((DECL_SECTION_NAME (decl) && !node->implicit_section)
1802 || (DECL_SECTION_NAME (item->decl) && !item->node->implicit_section))
1803 && DECL_SECTION_NAME (decl) != DECL_SECTION_NAME (item->decl))
1804 return return_false_with_msg ("user section mismatch");
1806 if (DECL_IN_TEXT_SECTION (decl) != DECL_IN_TEXT_SECTION (item->decl))
1807 return return_false_with_msg ("text section");
1809 ipa_ref *ref = NULL, *ref2 = NULL;
1810 for (unsigned i = 0; node->iterate_reference (i, ref); i++)
1812 item->node->iterate_reference (i, ref2);
1814 if (ref->use != ref2->use)
1815 return return_false_with_msg ("reference use mismatch");
1817 if (!compare_symbol_references (ignored_nodes,
1818 ref->referred, ref2->referred,
1819 ref->address_matters_p ()))
1820 return false;
1823 return true;
1826 /* Returns true if the item equals to ITEM given as argument. */
1828 bool
1829 sem_variable::equals (sem_item *item,
1830 hash_map <symtab_node *, sem_item *> &)
1832 gcc_assert (item->type == VAR);
1833 bool ret;
1835 if (DECL_INITIAL (decl) == error_mark_node && in_lto_p)
1836 dyn_cast <varpool_node *>(node)->get_constructor ();
1837 if (DECL_INITIAL (item->decl) == error_mark_node && in_lto_p)
1838 dyn_cast <varpool_node *>(item->node)->get_constructor ();
1840 /* As seen in PR ipa/65303 we have to compare variables types. */
1841 if (!func_checker::compatible_types_p (TREE_TYPE (decl),
1842 TREE_TYPE (item->decl)))
1843 return return_false_with_msg ("variables types are different");
1845 ret = sem_variable::equals (DECL_INITIAL (decl),
1846 DECL_INITIAL (item->node->decl));
1847 if (dump_file && (dump_flags & TDF_DETAILS))
1848 fprintf (dump_file,
1849 "Equals called for vars: %s:%s with result: %s\n\n",
1850 node->dump_name (), item->node->dump_name (),
1851 ret ? "true" : "false");
1853 return ret;
1856 /* Compares trees T1 and T2 for semantic equality. */
1858 bool
1859 sem_variable::equals (tree t1, tree t2)
1861 if (!t1 || !t2)
1862 return return_with_debug (t1 == t2);
1863 if (t1 == t2)
1864 return true;
1865 tree_code tc1 = TREE_CODE (t1);
1866 tree_code tc2 = TREE_CODE (t2);
1868 if (tc1 != tc2)
1869 return return_false_with_msg ("TREE_CODE mismatch");
1871 switch (tc1)
1873 case CONSTRUCTOR:
1875 vec<constructor_elt, va_gc> *v1, *v2;
1876 unsigned HOST_WIDE_INT idx;
1878 enum tree_code typecode = TREE_CODE (TREE_TYPE (t1));
1879 if (typecode != TREE_CODE (TREE_TYPE (t2)))
1880 return return_false_with_msg ("constructor type mismatch");
1882 if (typecode == ARRAY_TYPE)
1884 HOST_WIDE_INT size_1 = int_size_in_bytes (TREE_TYPE (t1));
1885 /* For arrays, check that the sizes all match. */
1886 if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2))
1887 || size_1 == -1
1888 || size_1 != int_size_in_bytes (TREE_TYPE (t2)))
1889 return return_false_with_msg ("constructor array size mismatch");
1891 else if (!func_checker::compatible_types_p (TREE_TYPE (t1),
1892 TREE_TYPE (t2)))
1893 return return_false_with_msg ("constructor type incompatible");
1895 v1 = CONSTRUCTOR_ELTS (t1);
1896 v2 = CONSTRUCTOR_ELTS (t2);
1897 if (vec_safe_length (v1) != vec_safe_length (v2))
1898 return return_false_with_msg ("constructor number of elts mismatch");
1900 for (idx = 0; idx < vec_safe_length (v1); ++idx)
1902 constructor_elt *c1 = &(*v1)[idx];
1903 constructor_elt *c2 = &(*v2)[idx];
1905 /* Check that each value is the same... */
1906 if (!sem_variable::equals (c1->value, c2->value))
1907 return false;
1908 /* ... and that they apply to the same fields! */
1909 if (!sem_variable::equals (c1->index, c2->index))
1910 return false;
1912 return true;
1914 case MEM_REF:
1916 tree x1 = TREE_OPERAND (t1, 0);
1917 tree x2 = TREE_OPERAND (t2, 0);
1918 tree y1 = TREE_OPERAND (t1, 1);
1919 tree y2 = TREE_OPERAND (t2, 1);
1921 if (!func_checker::compatible_types_p (TREE_TYPE (x1), TREE_TYPE (x2)))
1922 return return_false ();
1924 /* Type of the offset on MEM_REF does not matter. */
1925 return return_with_debug (sem_variable::equals (x1, x2)
1926 && known_eq (wi::to_poly_offset (y1),
1927 wi::to_poly_offset (y2)));
1929 case ADDR_EXPR:
1930 case FDESC_EXPR:
1932 tree op1 = TREE_OPERAND (t1, 0);
1933 tree op2 = TREE_OPERAND (t2, 0);
1934 return sem_variable::equals (op1, op2);
1936 /* References to other vars/decls are compared using ipa-ref. */
1937 case FUNCTION_DECL:
1938 case VAR_DECL:
1939 if (decl_in_symtab_p (t1) && decl_in_symtab_p (t2))
1940 return true;
1941 return return_false_with_msg ("Declaration mismatch");
1942 case CONST_DECL:
1943 /* TODO: We can check CONST_DECL by its DECL_INITIAL, but for that we
1944 need to process its VAR/FUNCTION references without relying on ipa-ref
1945 compare. */
1946 case FIELD_DECL:
1947 case LABEL_DECL:
1948 return return_false_with_msg ("Declaration mismatch");
1949 case INTEGER_CST:
1950 /* Integer constants are the same only if the same width of type. */
1951 if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
1952 return return_false_with_msg ("INTEGER_CST precision mismatch");
1953 if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2)))
1954 return return_false_with_msg ("INTEGER_CST mode mismatch");
1955 return return_with_debug (tree_int_cst_equal (t1, t2));
1956 case STRING_CST:
1957 if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2)))
1958 return return_false_with_msg ("STRING_CST mode mismatch");
1959 if (TREE_STRING_LENGTH (t1) != TREE_STRING_LENGTH (t2))
1960 return return_false_with_msg ("STRING_CST length mismatch");
1961 if (memcmp (TREE_STRING_POINTER (t1), TREE_STRING_POINTER (t2),
1962 TREE_STRING_LENGTH (t1)))
1963 return return_false_with_msg ("STRING_CST mismatch");
1964 return true;
1965 case FIXED_CST:
1966 /* Fixed constants are the same only if the same width of type. */
1967 if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
1968 return return_false_with_msg ("FIXED_CST precision mismatch");
1970 return return_with_debug (FIXED_VALUES_IDENTICAL (TREE_FIXED_CST (t1),
1971 TREE_FIXED_CST (t2)));
1972 case COMPLEX_CST:
1973 return (sem_variable::equals (TREE_REALPART (t1), TREE_REALPART (t2))
1974 && sem_variable::equals (TREE_IMAGPART (t1), TREE_IMAGPART (t2)));
1975 case REAL_CST:
1976 /* Real constants are the same only if the same width of type. */
1977 if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
1978 return return_false_with_msg ("REAL_CST precision mismatch");
1979 return return_with_debug (real_identical (&TREE_REAL_CST (t1),
1980 &TREE_REAL_CST (t2)));
1981 case VECTOR_CST:
1983 if (maybe_ne (VECTOR_CST_NELTS (t1), VECTOR_CST_NELTS (t2)))
1984 return return_false_with_msg ("VECTOR_CST nelts mismatch");
1986 unsigned int count
1987 = tree_vector_builder::binary_encoded_nelts (t1, t2);
1988 for (unsigned int i = 0; i < count; ++i)
1989 if (!sem_variable::equals (VECTOR_CST_ENCODED_ELT (t1, i),
1990 VECTOR_CST_ENCODED_ELT (t2, i)))
1991 return false;
1993 return true;
1995 case ARRAY_REF:
1996 case ARRAY_RANGE_REF:
1998 tree x1 = TREE_OPERAND (t1, 0);
1999 tree x2 = TREE_OPERAND (t2, 0);
2000 tree y1 = TREE_OPERAND (t1, 1);
2001 tree y2 = TREE_OPERAND (t2, 1);
2003 if (!sem_variable::equals (x1, x2) || !sem_variable::equals (y1, y2))
2004 return false;
2005 if (!sem_variable::equals (array_ref_low_bound (t1),
2006 array_ref_low_bound (t2)))
2007 return false;
2008 if (!sem_variable::equals (array_ref_element_size (t1),
2009 array_ref_element_size (t2)))
2010 return false;
2011 return true;
2014 case COMPONENT_REF:
2015 case POINTER_PLUS_EXPR:
2016 case PLUS_EXPR:
2017 case MINUS_EXPR:
2018 case RANGE_EXPR:
2020 tree x1 = TREE_OPERAND (t1, 0);
2021 tree x2 = TREE_OPERAND (t2, 0);
2022 tree y1 = TREE_OPERAND (t1, 1);
2023 tree y2 = TREE_OPERAND (t2, 1);
2025 return sem_variable::equals (x1, x2) && sem_variable::equals (y1, y2);
2028 CASE_CONVERT:
2029 case VIEW_CONVERT_EXPR:
2030 if (!func_checker::compatible_types_p (TREE_TYPE (t1), TREE_TYPE (t2)))
2031 return return_false ();
2032 return sem_variable::equals (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2033 case ERROR_MARK:
2034 return return_false_with_msg ("ERROR_MARK");
2035 default:
2036 return return_false_with_msg ("Unknown TREE code reached");
2040 /* Parser function that visits a varpool NODE. */
2042 sem_variable *
2043 sem_variable::parse (varpool_node *node, bitmap_obstack *stack)
2045 if (TREE_THIS_VOLATILE (node->decl) || DECL_HARD_REGISTER (node->decl)
2046 || node->alias)
2047 return NULL;
2049 sem_variable *v = new sem_variable (node, stack);
2051 v->init ();
2053 return v;
2056 /* References independent hash function. */
2058 hashval_t
2059 sem_variable::get_hash (void)
2061 if (m_hash_set)
2062 return m_hash;
2064 /* All WPA streamed in symbols should have their hashes computed at compile
2065 time. At this point, the constructor may not be in memory at all.
2066 DECL_INITIAL (decl) would be error_mark_node in that case. */
2067 gcc_assert (!node->lto_file_data);
2068 tree ctor = DECL_INITIAL (decl);
2069 inchash::hash hstate;
2071 hstate.add_int (456346417);
2072 if (DECL_SIZE (decl) && tree_fits_shwi_p (DECL_SIZE (decl)))
2073 hstate.add_hwi (tree_to_shwi (DECL_SIZE (decl)));
2074 add_expr (ctor, hstate);
2075 set_hash (hstate.end ());
2077 return m_hash;
2080 /* Merges instance with an ALIAS_ITEM, where alias, thunk or redirection can
2081 be applied. */
2083 bool
2084 sem_variable::merge (sem_item *alias_item)
2086 gcc_assert (alias_item->type == VAR);
2088 if (!sem_item::target_supports_symbol_aliases_p ())
2090 if (dump_file)
2091 fprintf (dump_file, "Not unifying; "
2092 "Symbol aliases are not supported by target\n\n");
2093 return false;
2096 if (DECL_EXTERNAL (alias_item->decl))
2098 if (dump_file)
2099 fprintf (dump_file, "Not unifying; alias is external.\n\n");
2100 return false;
2103 sem_variable *alias_var = static_cast<sem_variable *> (alias_item);
2105 varpool_node *original = get_node ();
2106 varpool_node *alias = alias_var->get_node ();
2107 bool original_discardable = false;
2109 bool alias_address_matters = alias->address_matters_p ();
2111 /* See if original is in a section that can be discarded if the main
2112 symbol is not used.
2113 Also consider case where we have resolution info and we know that
2114 original's definition is not going to be used. In this case we cannot
2115 create alias to original. */
2116 if (original->can_be_discarded_p ()
2117 || (node->resolution != LDPR_UNKNOWN
2118 && !decl_binds_to_current_def_p (node->decl)))
2119 original_discardable = true;
2121 gcc_assert (!TREE_ASM_WRITTEN (alias->decl));
2123 /* Constant pool machinery is not quite ready for aliases.
2124 TODO: varasm code contains logic for merging DECL_IN_CONSTANT_POOL.
2125 For LTO merging does not happen that is an important missing feature.
2126 We can enable merging with LTO if the DECL_IN_CONSTANT_POOL
2127 flag is dropped and non-local symbol name is assigned. */
2128 if (DECL_IN_CONSTANT_POOL (alias->decl)
2129 || DECL_IN_CONSTANT_POOL (original->decl))
2131 if (dump_file)
2132 fprintf (dump_file,
2133 "Not unifying; constant pool variables.\n\n");
2134 return false;
2137 /* Do not attempt to mix functions from different user sections;
2138 we do not know what user intends with those. */
2139 if (((DECL_SECTION_NAME (original->decl) && !original->implicit_section)
2140 || (DECL_SECTION_NAME (alias->decl) && !alias->implicit_section))
2141 && DECL_SECTION_NAME (original->decl) != DECL_SECTION_NAME (alias->decl))
2143 if (dump_file)
2144 fprintf (dump_file,
2145 "Not unifying; "
2146 "original and alias are in different sections.\n\n");
2147 return false;
2150 /* We cannot merge if address comparsion metters. */
2151 if (alias_address_matters && flag_merge_constants < 2)
2153 if (dump_file)
2154 fprintf (dump_file,
2155 "Not unifying; address of original may be compared.\n\n");
2156 return false;
2159 if (DECL_ALIGN (original->decl) < DECL_ALIGN (alias->decl))
2161 if (dump_file)
2162 fprintf (dump_file, "Not unifying; "
2163 "original and alias have incompatible alignments\n\n");
2165 return false;
2168 if (DECL_COMDAT_GROUP (original->decl) != DECL_COMDAT_GROUP (alias->decl))
2170 if (dump_file)
2171 fprintf (dump_file, "Not unifying; alias cannot be created; "
2172 "across comdat group boundary\n\n");
2174 return false;
2177 if (original_discardable)
2179 if (dump_file)
2180 fprintf (dump_file, "Not unifying; alias cannot be created; "
2181 "target is discardable\n\n");
2183 return false;
2185 else
2187 gcc_assert (!original->alias);
2188 gcc_assert (!alias->alias);
2190 alias->analyzed = false;
2192 DECL_INITIAL (alias->decl) = NULL;
2193 ((symtab_node *)alias)->call_for_symbol_and_aliases (clear_decl_rtl,
2194 NULL, true);
2195 alias->remove_all_references ();
2196 if (TREE_ADDRESSABLE (alias->decl))
2197 original->call_for_symbol_and_aliases (set_addressable, NULL, true);
2199 varpool_node::create_alias (alias_var->decl, decl);
2200 alias->resolve_alias (original);
2202 if (dump_file)
2203 fprintf (dump_file, "Unified; Variable alias has been created.\n");
2205 return true;
2209 /* Dump symbol to FILE. */
2211 void
2212 sem_variable::dump_to_file (FILE *file)
2214 gcc_assert (file);
2216 print_node (file, "", decl, 0);
2217 fprintf (file, "\n\n");
2220 unsigned int sem_item_optimizer::class_id = 0;
2222 sem_item_optimizer::sem_item_optimizer ()
2223 : worklist (0), m_classes (0), m_classes_count (0), m_cgraph_node_hooks (NULL),
2224 m_varpool_node_hooks (NULL), m_merged_variables (), m_references ()
2226 m_items.create (0);
2227 bitmap_obstack_initialize (&m_bmstack);
2230 sem_item_optimizer::~sem_item_optimizer ()
2232 for (unsigned int i = 0; i < m_items.length (); i++)
2233 delete m_items[i];
2236 for (hash_table<congruence_class_hash>::iterator it = m_classes.begin ();
2237 it != m_classes.end (); ++it)
2239 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
2240 delete (*it)->classes[i];
2242 (*it)->classes.release ();
2243 free (*it);
2246 m_items.release ();
2248 bitmap_obstack_release (&m_bmstack);
2249 m_merged_variables.release ();
2252 /* Write IPA ICF summary for symbols. */
2254 void
2255 sem_item_optimizer::write_summary (void)
2257 unsigned int count = 0;
2259 output_block *ob = create_output_block (LTO_section_ipa_icf);
2260 lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
2261 ob->symbol = NULL;
2263 /* Calculate number of symbols to be serialized. */
2264 for (lto_symtab_encoder_iterator lsei = lsei_start_in_partition (encoder);
2265 !lsei_end_p (lsei);
2266 lsei_next_in_partition (&lsei))
2268 symtab_node *node = lsei_node (lsei);
2270 if (m_symtab_node_map.get (node))
2271 count++;
2274 streamer_write_uhwi (ob, count);
2276 /* Process all of the symbols. */
2277 for (lto_symtab_encoder_iterator lsei = lsei_start_in_partition (encoder);
2278 !lsei_end_p (lsei);
2279 lsei_next_in_partition (&lsei))
2281 symtab_node *node = lsei_node (lsei);
2283 sem_item **item = m_symtab_node_map.get (node);
2285 if (item && *item)
2287 int node_ref = lto_symtab_encoder_encode (encoder, node);
2288 streamer_write_uhwi_stream (ob->main_stream, node_ref);
2290 streamer_write_uhwi (ob, (*item)->get_hash ());
2294 streamer_write_char_stream (ob->main_stream, 0);
2295 produce_asm (ob, NULL);
2296 destroy_output_block (ob);
2299 /* Reads a section from LTO stream file FILE_DATA. Input block for DATA
2300 contains LEN bytes. */
2302 void
2303 sem_item_optimizer::read_section (lto_file_decl_data *file_data,
2304 const char *data, size_t len)
2306 const lto_function_header *header
2307 = (const lto_function_header *) data;
2308 const int cfg_offset = sizeof (lto_function_header);
2309 const int main_offset = cfg_offset + header->cfg_size;
2310 const int string_offset = main_offset + header->main_size;
2311 data_in *data_in;
2312 unsigned int i;
2313 unsigned int count;
2315 lto_input_block ib_main ((const char *) data + main_offset, 0,
2316 header->main_size, file_data->mode_table);
2318 data_in
2319 = lto_data_in_create (file_data, (const char *) data + string_offset,
2320 header->string_size, vNULL);
2322 count = streamer_read_uhwi (&ib_main);
2324 for (i = 0; i < count; i++)
2326 unsigned int index;
2327 symtab_node *node;
2328 lto_symtab_encoder_t encoder;
2330 index = streamer_read_uhwi (&ib_main);
2331 encoder = file_data->symtab_node_encoder;
2332 node = lto_symtab_encoder_deref (encoder, index);
2334 hashval_t hash = streamer_read_uhwi (&ib_main);
2335 gcc_assert (node->definition);
2337 if (is_a<cgraph_node *> (node))
2339 cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
2341 sem_function *fn = new sem_function (cnode, &m_bmstack);
2342 fn->set_hash (hash);
2343 m_items.safe_push (fn);
2345 else
2347 varpool_node *vnode = dyn_cast <varpool_node *> (node);
2349 sem_variable *var = new sem_variable (vnode, &m_bmstack);
2350 var->set_hash (hash);
2351 m_items.safe_push (var);
2355 lto_free_section_data (file_data, LTO_section_ipa_icf, NULL, data,
2356 len);
2357 lto_data_in_delete (data_in);
2360 /* Read IPA ICF summary for symbols. */
2362 void
2363 sem_item_optimizer::read_summary (void)
2365 lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
2366 lto_file_decl_data *file_data;
2367 unsigned int j = 0;
2369 while ((file_data = file_data_vec[j++]))
2371 size_t len;
2372 const char *data = lto_get_section_data (file_data,
2373 LTO_section_ipa_icf, NULL, &len);
2375 if (data)
2376 read_section (file_data, data, len);
2380 /* Register callgraph and varpool hooks. */
2382 void
2383 sem_item_optimizer::register_hooks (void)
2385 if (!m_cgraph_node_hooks)
2386 m_cgraph_node_hooks = symtab->add_cgraph_removal_hook
2387 (&sem_item_optimizer::cgraph_removal_hook, this);
2389 if (!m_varpool_node_hooks)
2390 m_varpool_node_hooks = symtab->add_varpool_removal_hook
2391 (&sem_item_optimizer::varpool_removal_hook, this);
2394 /* Unregister callgraph and varpool hooks. */
2396 void
2397 sem_item_optimizer::unregister_hooks (void)
2399 if (m_cgraph_node_hooks)
2400 symtab->remove_cgraph_removal_hook (m_cgraph_node_hooks);
2402 if (m_varpool_node_hooks)
2403 symtab->remove_varpool_removal_hook (m_varpool_node_hooks);
2406 /* Adds a CLS to hashtable associated by hash value. */
2408 void
2409 sem_item_optimizer::add_class (congruence_class *cls)
2411 gcc_assert (cls->members.length ());
2413 congruence_class_group *group
2414 = get_group_by_hash (cls->members[0]->get_hash (),
2415 cls->members[0]->type);
2416 group->classes.safe_push (cls);
2419 /* Gets a congruence class group based on given HASH value and TYPE. */
2421 congruence_class_group *
2422 sem_item_optimizer::get_group_by_hash (hashval_t hash, sem_item_type type)
2424 congruence_class_group *item = XNEW (congruence_class_group);
2425 item->hash = hash;
2426 item->type = type;
2428 congruence_class_group **slot = m_classes.find_slot (item, INSERT);
2430 if (*slot)
2431 free (item);
2432 else
2434 item->classes.create (1);
2435 *slot = item;
2438 return *slot;
2441 /* Callgraph removal hook called for a NODE with a custom DATA. */
2443 void
2444 sem_item_optimizer::cgraph_removal_hook (cgraph_node *node, void *data)
2446 sem_item_optimizer *optimizer = (sem_item_optimizer *) data;
2447 optimizer->remove_symtab_node (node);
2450 /* Varpool removal hook called for a NODE with a custom DATA. */
2452 void
2453 sem_item_optimizer::varpool_removal_hook (varpool_node *node, void *data)
2455 sem_item_optimizer *optimizer = (sem_item_optimizer *) data;
2456 optimizer->remove_symtab_node (node);
2459 /* Remove symtab NODE triggered by symtab removal hooks. */
2461 void
2462 sem_item_optimizer::remove_symtab_node (symtab_node *node)
2464 gcc_assert (m_classes.is_empty ());
2466 m_removed_items_set.add (node);
2469 void
2470 sem_item_optimizer::remove_item (sem_item *item)
2472 if (m_symtab_node_map.get (item->node))
2473 m_symtab_node_map.remove (item->node);
2474 delete item;
2477 /* Removes all callgraph and varpool nodes that are marked by symtab
2478 as deleted. */
2480 void
2481 sem_item_optimizer::filter_removed_items (void)
2483 auto_vec <sem_item *> filtered;
2485 for (unsigned int i = 0; i < m_items.length(); i++)
2487 sem_item *item = m_items[i];
2489 if (m_removed_items_set.contains (item->node))
2491 remove_item (item);
2492 continue;
2495 if (item->type == FUNC)
2497 cgraph_node *cnode = static_cast <sem_function *>(item)->get_node ();
2499 if (in_lto_p && (cnode->alias || cnode->body_removed))
2500 remove_item (item);
2501 else
2502 filtered.safe_push (item);
2504 else /* VAR. */
2506 if (!flag_ipa_icf_variables)
2507 remove_item (item);
2508 else
2510 /* Filter out non-readonly variables. */
2511 tree decl = item->decl;
2512 if (TREE_READONLY (decl))
2513 filtered.safe_push (item);
2514 else
2515 remove_item (item);
2520 /* Clean-up of released semantic items. */
2522 m_items.release ();
2523 for (unsigned int i = 0; i < filtered.length(); i++)
2524 m_items.safe_push (filtered[i]);
2527 /* Optimizer entry point which returns true in case it processes
2528 a merge operation. True is returned if there's a merge operation
2529 processed. */
2531 bool
2532 sem_item_optimizer::execute (void)
2534 filter_removed_items ();
2535 unregister_hooks ();
2537 build_graph ();
2538 update_hash_by_addr_refs ();
2539 build_hash_based_classes ();
2541 if (dump_file)
2542 fprintf (dump_file, "Dump after hash based groups\n");
2543 dump_cong_classes ();
2545 subdivide_classes_by_equality (true);
2547 if (dump_file)
2548 fprintf (dump_file, "Dump after WPA based types groups\n");
2550 dump_cong_classes ();
2552 process_cong_reduction ();
2553 checking_verify_classes ();
2555 if (dump_file)
2556 fprintf (dump_file, "Dump after callgraph-based congruence reduction\n");
2558 dump_cong_classes ();
2560 parse_nonsingleton_classes ();
2561 subdivide_classes_by_equality ();
2563 if (dump_file)
2564 fprintf (dump_file, "Dump after full equality comparison of groups\n");
2566 dump_cong_classes ();
2568 unsigned int prev_class_count = m_classes_count;
2570 process_cong_reduction ();
2571 dump_cong_classes ();
2572 checking_verify_classes ();
2573 bool merged_p = merge_classes (prev_class_count);
2575 if (dump_file && (dump_flags & TDF_DETAILS))
2576 symtab->dump (dump_file);
2578 return merged_p;
2581 /* Function responsible for visiting all potential functions and
2582 read-only variables that can be merged. */
2584 void
2585 sem_item_optimizer::parse_funcs_and_vars (void)
2587 cgraph_node *cnode;
2589 if (flag_ipa_icf_functions)
2590 FOR_EACH_DEFINED_FUNCTION (cnode)
2592 sem_function *f = sem_function::parse (cnode, &m_bmstack);
2593 if (f)
2595 m_items.safe_push (f);
2596 m_symtab_node_map.put (cnode, f);
2600 varpool_node *vnode;
2602 if (flag_ipa_icf_variables)
2603 FOR_EACH_DEFINED_VARIABLE (vnode)
2605 sem_variable *v = sem_variable::parse (vnode, &m_bmstack);
2607 if (v)
2609 m_items.safe_push (v);
2610 m_symtab_node_map.put (vnode, v);
2615 /* Makes pairing between a congruence class CLS and semantic ITEM. */
2617 void
2618 sem_item_optimizer::add_item_to_class (congruence_class *cls, sem_item *item)
2620 item->index_in_class = cls->members.length ();
2621 cls->members.safe_push (item);
2622 cls->referenced_by_count += item->referenced_by_count;
2623 item->cls = cls;
2626 /* For each semantic item, append hash values of references. */
2628 void
2629 sem_item_optimizer::update_hash_by_addr_refs ()
2631 /* First, append to hash sensitive references and class type if it need to
2632 be matched for ODR. */
2633 for (unsigned i = 0; i < m_items.length (); i++)
2635 m_items[i]->update_hash_by_addr_refs (m_symtab_node_map);
2636 if (m_items[i]->type == FUNC)
2638 if (TREE_CODE (TREE_TYPE (m_items[i]->decl)) == METHOD_TYPE
2639 && contains_polymorphic_type_p
2640 (TYPE_METHOD_BASETYPE (TREE_TYPE (m_items[i]->decl)))
2641 && (DECL_CXX_CONSTRUCTOR_P (m_items[i]->decl)
2642 || (static_cast<sem_function *> (m_items[i])->param_used_p (0)
2643 && static_cast<sem_function *> (m_items[i])
2644 ->compare_polymorphic_p ())))
2646 tree class_type
2647 = TYPE_METHOD_BASETYPE (TREE_TYPE (m_items[i]->decl));
2648 inchash::hash hstate (m_items[i]->get_hash ());
2650 if (TYPE_NAME (class_type)
2651 && DECL_ASSEMBLER_NAME_SET_P (TYPE_NAME (class_type)))
2652 hstate.add_hwi
2653 (IDENTIFIER_HASH_VALUE
2654 (DECL_ASSEMBLER_NAME (TYPE_NAME (class_type))));
2656 m_items[i]->set_hash (hstate.end ());
2661 /* Once all symbols have enhanced hash value, we can append
2662 hash values of symbols that are seen by IPA ICF and are
2663 references by a semantic item. Newly computed values
2664 are saved to global_hash member variable. */
2665 for (unsigned i = 0; i < m_items.length (); i++)
2666 m_items[i]->update_hash_by_local_refs (m_symtab_node_map);
2668 /* Global hash value replace current hash values. */
2669 for (unsigned i = 0; i < m_items.length (); i++)
2670 m_items[i]->set_hash (m_items[i]->global_hash);
2673 /* Congruence classes are built by hash value. */
2675 void
2676 sem_item_optimizer::build_hash_based_classes (void)
2678 for (unsigned i = 0; i < m_items.length (); i++)
2680 sem_item *item = m_items[i];
2682 congruence_class_group *group
2683 = get_group_by_hash (item->get_hash (), item->type);
2685 if (!group->classes.length ())
2687 m_classes_count++;
2688 group->classes.safe_push (new congruence_class (class_id++));
2691 add_item_to_class (group->classes[0], item);
2695 /* Build references according to call graph. */
2697 void
2698 sem_item_optimizer::build_graph (void)
2700 for (unsigned i = 0; i < m_items.length (); i++)
2702 sem_item *item = m_items[i];
2703 m_symtab_node_map.put (item->node, item);
2705 /* Initialize hash values if we are not in LTO mode. */
2706 if (!in_lto_p)
2707 item->get_hash ();
2710 for (unsigned i = 0; i < m_items.length (); i++)
2712 sem_item *item = m_items[i];
2714 if (item->type == FUNC)
2716 cgraph_node *cnode = dyn_cast <cgraph_node *> (item->node);
2718 cgraph_edge *e = cnode->callees;
2719 while (e)
2721 sem_item **slot = m_symtab_node_map.get
2722 (e->callee->ultimate_alias_target ());
2723 if (slot)
2724 item->add_reference (&m_references, *slot);
2726 e = e->next_callee;
2730 ipa_ref *ref = NULL;
2731 for (unsigned i = 0; item->node->iterate_reference (i, ref); i++)
2733 sem_item **slot = m_symtab_node_map.get
2734 (ref->referred->ultimate_alias_target ());
2735 if (slot)
2736 item->add_reference (&m_references, *slot);
2741 /* Semantic items in classes having more than one element and initialized.
2742 In case of WPA, we load function body. */
2744 void
2745 sem_item_optimizer::parse_nonsingleton_classes (void)
2747 unsigned int counter = 0;
2749 for (unsigned i = 0; i < m_items.length (); i++)
2750 if (m_items[i]->cls->members.length () > 1)
2752 m_items[i]->init ();
2753 ++counter;
2756 if (dump_file)
2758 float f = m_items.length () ? 100.0f * counter / m_items.length () : 0.0f;
2759 fprintf (dump_file, "Init called for %u items (%.2f%%).\n", counter, f);
2763 /* Equality function for semantic items is used to subdivide existing
2764 classes. If IN_WPA, fast equality function is invoked. */
2766 void
2767 sem_item_optimizer::subdivide_classes_by_equality (bool in_wpa)
2769 for (hash_table <congruence_class_hash>::iterator it = m_classes.begin ();
2770 it != m_classes.end (); ++it)
2772 unsigned int class_count = (*it)->classes.length ();
2774 for (unsigned i = 0; i < class_count; i++)
2776 congruence_class *c = (*it)->classes[i];
2778 if (c->members.length() > 1)
2780 auto_vec <sem_item *> new_vector;
2782 sem_item *first = c->members[0];
2783 new_vector.safe_push (first);
2785 unsigned class_split_first = (*it)->classes.length ();
2787 for (unsigned j = 1; j < c->members.length (); j++)
2789 sem_item *item = c->members[j];
2791 bool equals
2792 = in_wpa ? first->equals_wpa (item, m_symtab_node_map)
2793 : first->equals (item, m_symtab_node_map);
2795 if (equals)
2796 new_vector.safe_push (item);
2797 else
2799 bool integrated = false;
2801 for (unsigned k = class_split_first;
2802 k < (*it)->classes.length (); k++)
2804 sem_item *x = (*it)->classes[k]->members[0];
2805 bool equals
2806 = in_wpa ? x->equals_wpa (item, m_symtab_node_map)
2807 : x->equals (item, m_symtab_node_map);
2809 if (equals)
2811 integrated = true;
2812 add_item_to_class ((*it)->classes[k], item);
2814 break;
2818 if (!integrated)
2820 congruence_class *c
2821 = new congruence_class (class_id++);
2822 m_classes_count++;
2823 add_item_to_class (c, item);
2825 (*it)->classes.safe_push (c);
2830 // We replace newly created new_vector for the class we've just
2831 // splitted.
2832 c->members.release ();
2833 c->members.create (new_vector.length ());
2835 for (unsigned int j = 0; j < new_vector.length (); j++)
2836 add_item_to_class (c, new_vector[j]);
2841 checking_verify_classes ();
2844 /* Subdivide classes by address references that members of the class
2845 reference. Example can be a pair of functions that have an address
2846 taken from a function. If these addresses are different the class
2847 is split. */
2849 unsigned
2850 sem_item_optimizer::subdivide_classes_by_sensitive_refs ()
2852 typedef hash_map <symbol_compare_hash, vec <sem_item *> > subdivide_hash_map;
2854 unsigned newly_created_classes = 0;
2856 for (hash_table <congruence_class_hash>::iterator it = m_classes.begin ();
2857 it != m_classes.end (); ++it)
2859 unsigned int class_count = (*it)->classes.length ();
2860 auto_vec<congruence_class *> new_classes;
2862 for (unsigned i = 0; i < class_count; i++)
2864 congruence_class *c = (*it)->classes[i];
2866 if (c->members.length() > 1)
2868 subdivide_hash_map split_map;
2870 for (unsigned j = 0; j < c->members.length (); j++)
2872 sem_item *source_node = c->members[j];
2874 symbol_compare_collection *collection
2875 = new symbol_compare_collection (source_node->node);
2877 bool existed;
2878 vec <sem_item *> *slot
2879 = &split_map.get_or_insert (collection, &existed);
2880 gcc_checking_assert (slot);
2882 slot->safe_push (source_node);
2884 if (existed)
2885 delete collection;
2888 /* If the map contains more than one key, we have to split
2889 the map appropriately. */
2890 if (split_map.elements () != 1)
2892 bool first_class = true;
2894 for (subdivide_hash_map::iterator it2 = split_map.begin ();
2895 it2 != split_map.end (); ++it2)
2897 congruence_class *new_cls;
2898 new_cls = new congruence_class (class_id++);
2900 for (unsigned k = 0; k < (*it2).second.length (); k++)
2901 add_item_to_class (new_cls, (*it2).second[k]);
2903 worklist_push (new_cls);
2904 newly_created_classes++;
2906 if (first_class)
2908 (*it)->classes[i] = new_cls;
2909 first_class = false;
2911 else
2913 new_classes.safe_push (new_cls);
2914 m_classes_count++;
2919 /* Release memory. */
2920 for (subdivide_hash_map::iterator it2 = split_map.begin ();
2921 it2 != split_map.end (); ++it2)
2923 delete (*it2).first;
2924 (*it2).second.release ();
2929 for (unsigned i = 0; i < new_classes.length (); i++)
2930 (*it)->classes.safe_push (new_classes[i]);
2933 return newly_created_classes;
2936 /* Verify congruence classes, if checking is enabled. */
2938 void
2939 sem_item_optimizer::checking_verify_classes (void)
2941 if (flag_checking)
2942 verify_classes ();
2945 /* Verify congruence classes. */
2947 void
2948 sem_item_optimizer::verify_classes (void)
2950 for (hash_table<congruence_class_hash>::iterator it = m_classes.begin ();
2951 it != m_classes.end (); ++it)
2953 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
2955 congruence_class *cls = (*it)->classes[i];
2957 gcc_assert (cls);
2958 gcc_assert (cls->members.length () > 0);
2960 for (unsigned int j = 0; j < cls->members.length (); j++)
2962 sem_item *item = cls->members[j];
2964 gcc_assert (item);
2965 gcc_assert (item->cls == cls);
2971 /* Disposes split map traverse function. CLS_PTR is pointer to congruence
2972 class, BSLOT is bitmap slot we want to release. DATA is mandatory,
2973 but unused argument. */
2975 bool
2976 sem_item_optimizer::release_split_map (congruence_class * const &,
2977 bitmap const &b, traverse_split_pair *)
2979 bitmap bmp = b;
2981 BITMAP_FREE (bmp);
2983 return true;
2986 /* Process split operation for a class given as pointer CLS_PTR,
2987 where bitmap B splits congruence class members. DATA is used
2988 as argument of split pair. */
2990 bool
2991 sem_item_optimizer::traverse_congruence_split (congruence_class * const &cls,
2992 bitmap const &b,
2993 traverse_split_pair *pair)
2995 sem_item_optimizer *optimizer = pair->optimizer;
2996 const congruence_class *splitter_cls = pair->cls;
2998 /* If counted bits are greater than zero and less than the number of members
2999 a group will be splitted. */
3000 unsigned popcount = bitmap_count_bits (b);
3002 if (popcount > 0 && popcount < cls->members.length ())
3004 auto_vec <congruence_class *, 2> newclasses;
3005 newclasses.quick_push (new congruence_class (class_id++));
3006 newclasses.quick_push (new congruence_class (class_id++));
3008 for (unsigned int i = 0; i < cls->members.length (); i++)
3010 int target = bitmap_bit_p (b, i);
3011 congruence_class *tc = newclasses[target];
3013 add_item_to_class (tc, cls->members[i]);
3016 if (flag_checking)
3018 for (unsigned int i = 0; i < 2; i++)
3019 gcc_assert (newclasses[i]->members.length ());
3022 if (splitter_cls == cls)
3023 optimizer->splitter_class_removed = true;
3025 /* Remove old class from worklist if presented. */
3026 bool in_worklist = cls->in_worklist;
3028 if (in_worklist)
3029 cls->in_worklist = false;
3031 congruence_class_group g;
3032 g.hash = cls->members[0]->get_hash ();
3033 g.type = cls->members[0]->type;
3035 congruence_class_group *slot = optimizer->m_classes.find (&g);
3037 for (unsigned int i = 0; i < slot->classes.length (); i++)
3038 if (slot->classes[i] == cls)
3040 slot->classes.ordered_remove (i);
3041 break;
3044 /* New class will be inserted and integrated to work list. */
3045 for (unsigned int i = 0; i < 2; i++)
3046 optimizer->add_class (newclasses[i]);
3048 /* Two classes replace one, so that increment just by one. */
3049 optimizer->m_classes_count++;
3051 /* If OLD class was presented in the worklist, we remove the class
3052 and replace it will both newly created classes. */
3053 if (in_worklist)
3054 for (unsigned int i = 0; i < 2; i++)
3055 optimizer->worklist_push (newclasses[i]);
3056 else /* Just smaller class is inserted. */
3058 unsigned int smaller_index
3059 = (newclasses[0]->members.length ()
3060 < newclasses[1]->members.length ()
3061 ? 0 : 1);
3062 optimizer->worklist_push (newclasses[smaller_index]);
3065 if (dump_file && (dump_flags & TDF_DETAILS))
3067 fprintf (dump_file, " congruence class splitted:\n");
3068 cls->dump (dump_file, 4);
3070 fprintf (dump_file, " newly created groups:\n");
3071 for (unsigned int i = 0; i < 2; i++)
3072 newclasses[i]->dump (dump_file, 4);
3075 /* Release class if not presented in work list. */
3076 if (!in_worklist)
3077 delete cls;
3079 return true;
3082 return false;
3085 /* Compare function for sorting pairs in do_congruence_step_f. */
3088 sem_item_optimizer::sort_congruence_split (const void *a_, const void *b_)
3090 const std::pair<congruence_class *, bitmap> *a
3091 = (const std::pair<congruence_class *, bitmap> *)a_;
3092 const std::pair<congruence_class *, bitmap> *b
3093 = (const std::pair<congruence_class *, bitmap> *)b_;
3094 if (a->first->id < b->first->id)
3095 return -1;
3096 else if (a->first->id > b->first->id)
3097 return 1;
3098 return 0;
3101 /* Tests if a class CLS used as INDEXth splits any congruence classes.
3102 Bitmap stack BMSTACK is used for bitmap allocation. */
3104 bool
3105 sem_item_optimizer::do_congruence_step_for_index (congruence_class *cls,
3106 unsigned int index)
3108 hash_map <congruence_class *, bitmap> split_map;
3110 for (unsigned int i = 0; i < cls->members.length (); i++)
3112 sem_item *item = cls->members[i];
3113 sem_usage_pair needle (item, index);
3114 vec<sem_item *> *callers = m_references.get (&needle);
3115 if (callers == NULL)
3116 continue;
3118 for (unsigned int j = 0; j < callers->length (); j++)
3120 sem_item *caller = (*callers)[j];
3121 if (caller->cls->members.length () < 2)
3122 continue;
3123 bitmap *slot = split_map.get (caller->cls);
3124 bitmap b;
3126 if(!slot)
3128 b = BITMAP_ALLOC (&m_bmstack);
3129 split_map.put (caller->cls, b);
3131 else
3132 b = *slot;
3134 gcc_checking_assert (caller->cls);
3135 gcc_checking_assert (caller->index_in_class
3136 < caller->cls->members.length ());
3138 bitmap_set_bit (b, caller->index_in_class);
3142 auto_vec<std::pair<congruence_class *, bitmap> > to_split;
3143 to_split.reserve_exact (split_map.elements ());
3144 for (hash_map <congruence_class *, bitmap>::iterator i = split_map.begin ();
3145 i != split_map.end (); ++i)
3146 to_split.safe_push (*i);
3147 to_split.qsort (sort_congruence_split);
3149 traverse_split_pair pair;
3150 pair.optimizer = this;
3151 pair.cls = cls;
3153 splitter_class_removed = false;
3154 bool r = false;
3155 for (unsigned i = 0; i < to_split.length (); ++i)
3156 r |= traverse_congruence_split (to_split[i].first, to_split[i].second,
3157 &pair);
3159 /* Bitmap clean-up. */
3160 split_map.traverse <traverse_split_pair *,
3161 sem_item_optimizer::release_split_map> (NULL);
3163 return r;
3166 /* Every usage of a congruence class CLS is a candidate that can split the
3167 collection of classes. Bitmap stack BMSTACK is used for bitmap
3168 allocation. */
3170 void
3171 sem_item_optimizer::do_congruence_step (congruence_class *cls)
3173 bitmap_iterator bi;
3174 unsigned int i;
3176 bitmap usage = BITMAP_ALLOC (&m_bmstack);
3178 for (unsigned int i = 0; i < cls->members.length (); i++)
3179 bitmap_ior_into (usage, cls->members[i]->usage_index_bitmap);
3181 EXECUTE_IF_SET_IN_BITMAP (usage, 0, i, bi)
3183 if (dump_file && (dump_flags & TDF_DETAILS))
3184 fprintf (dump_file, " processing congruence step for class: %u "
3185 "(%u items, %u references), index: %u\n", cls->id,
3186 cls->referenced_by_count, cls->members.length (), i);
3187 do_congruence_step_for_index (cls, i);
3189 if (splitter_class_removed)
3190 break;
3193 BITMAP_FREE (usage);
3196 /* Adds a newly created congruence class CLS to worklist. */
3198 void
3199 sem_item_optimizer::worklist_push (congruence_class *cls)
3201 /* Return if the class CLS is already presented in work list. */
3202 if (cls->in_worklist)
3203 return;
3205 cls->in_worklist = true;
3206 worklist.insert (cls->referenced_by_count, cls);
3209 /* Pops a class from worklist. */
3211 congruence_class *
3212 sem_item_optimizer::worklist_pop (void)
3214 congruence_class *cls;
3216 while (!worklist.empty ())
3218 cls = worklist.extract_min ();
3219 if (cls->in_worklist)
3221 cls->in_worklist = false;
3223 return cls;
3225 else
3227 /* Work list item was already intended to be removed.
3228 The only reason for doing it is to split a class.
3229 Thus, the class CLS is deleted. */
3230 delete cls;
3234 return NULL;
3237 /* Iterative congruence reduction function. */
3239 void
3240 sem_item_optimizer::process_cong_reduction (void)
3242 for (hash_table<congruence_class_hash>::iterator it = m_classes.begin ();
3243 it != m_classes.end (); ++it)
3244 for (unsigned i = 0; i < (*it)->classes.length (); i++)
3245 if ((*it)->classes[i]->is_class_used ())
3246 worklist_push ((*it)->classes[i]);
3248 if (dump_file)
3249 fprintf (dump_file, "Worklist has been filled with: %lu\n",
3250 (unsigned long) worklist.nodes ());
3252 if (dump_file && (dump_flags & TDF_DETAILS))
3253 fprintf (dump_file, "Congruence class reduction\n");
3255 congruence_class *cls;
3257 /* Process complete congruence reduction. */
3258 while ((cls = worklist_pop ()) != NULL)
3259 do_congruence_step (cls);
3261 /* Subdivide newly created classes according to references. */
3262 unsigned new_classes = subdivide_classes_by_sensitive_refs ();
3264 if (dump_file)
3265 fprintf (dump_file, "Address reference subdivision created: %u "
3266 "new classes.\n", new_classes);
3269 /* Debug function prints all informations about congruence classes. */
3271 void
3272 sem_item_optimizer::dump_cong_classes (void)
3274 if (!dump_file)
3275 return;
3277 /* Histogram calculation. */
3278 unsigned int max_index = 0;
3279 unsigned int single_element_classes = 0;
3280 unsigned int* histogram = XCNEWVEC (unsigned int, m_items.length () + 1);
3282 for (hash_table<congruence_class_hash>::iterator it = m_classes.begin ();
3283 it != m_classes.end (); ++it)
3284 for (unsigned i = 0; i < (*it)->classes.length (); i++)
3286 unsigned int c = (*it)->classes[i]->members.length ();
3287 histogram[c]++;
3289 if (c > max_index)
3290 max_index = c;
3292 if (c == 1)
3293 ++single_element_classes;
3296 fprintf (dump_file,
3297 "Congruence classes: %lu with total: %u items (in a non-singular "
3298 "class: %u)\n", (unsigned long) m_classes.elements (),
3299 m_items.length (), m_items.length () - single_element_classes);
3300 fprintf (dump_file,
3301 "Class size histogram [num of members]: number of classe number "
3302 "of classess\n");
3303 for (unsigned int i = 0; i <= max_index; i++)
3304 if (histogram[i])
3305 fprintf (dump_file, "%6u: %6u\n", i, histogram[i]);
3307 if (dump_flags & TDF_DETAILS)
3308 for (hash_table<congruence_class_hash>::iterator it = m_classes.begin ();
3309 it != m_classes.end (); ++it)
3311 fprintf (dump_file, " group: with %u classes:\n",
3312 (*it)->classes.length ());
3314 for (unsigned i = 0; i < (*it)->classes.length (); i++)
3316 (*it)->classes[i]->dump (dump_file, 4);
3318 if (i < (*it)->classes.length () - 1)
3319 fprintf (dump_file, " ");
3323 free (histogram);
3326 /* Sort pair of sem_items A and B by DECL_UID. */
3328 static int
3329 sort_sem_items_by_decl_uid (const void *a, const void *b)
3331 const sem_item *i1 = *(const sem_item * const *)a;
3332 const sem_item *i2 = *(const sem_item * const *)b;
3334 int uid1 = DECL_UID (i1->decl);
3335 int uid2 = DECL_UID (i2->decl);
3337 if (uid1 < uid2)
3338 return -1;
3339 else if (uid1 > uid2)
3340 return 1;
3341 else
3342 return 0;
3345 /* Sort pair of congruence_classes A and B by DECL_UID of the first member. */
3347 static int
3348 sort_congruence_classes_by_decl_uid (const void *a, const void *b)
3350 const congruence_class *c1 = *(const congruence_class * const *)a;
3351 const congruence_class *c2 = *(const congruence_class * const *)b;
3353 int uid1 = DECL_UID (c1->members[0]->decl);
3354 int uid2 = DECL_UID (c2->members[0]->decl);
3356 if (uid1 < uid2)
3357 return -1;
3358 else if (uid1 > uid2)
3359 return 1;
3360 else
3361 return 0;
3364 /* Sort pair of congruence_class_groups A and B by
3365 DECL_UID of the first member of a first group. */
3367 static int
3368 sort_congruence_class_groups_by_decl_uid (const void *a, const void *b)
3370 const congruence_class_group *g1
3371 = *(const congruence_class_group * const *)a;
3372 const congruence_class_group *g2
3373 = *(const congruence_class_group * const *)b;
3375 int uid1 = DECL_UID (g1->classes[0]->members[0]->decl);
3376 int uid2 = DECL_UID (g2->classes[0]->members[0]->decl);
3378 if (uid1 < uid2)
3379 return -1;
3380 else if (uid1 > uid2)
3381 return 1;
3382 else
3383 return 0;
3386 /* After reduction is done, we can declare all items in a group
3387 to be equal. PREV_CLASS_COUNT is start number of classes
3388 before reduction. True is returned if there's a merge operation
3389 processed. */
3391 bool
3392 sem_item_optimizer::merge_classes (unsigned int prev_class_count)
3394 unsigned int item_count = m_items.length ();
3395 unsigned int class_count = m_classes_count;
3396 unsigned int equal_items = item_count - class_count;
3398 unsigned int non_singular_classes_count = 0;
3399 unsigned int non_singular_classes_sum = 0;
3401 bool merged_p = false;
3403 /* PR lto/78211
3404 Sort functions in congruence classes by DECL_UID and do the same
3405 for the classes to not to break -fcompare-debug. */
3407 for (hash_table<congruence_class_hash>::iterator it = m_classes.begin ();
3408 it != m_classes.end (); ++it)
3410 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
3412 congruence_class *c = (*it)->classes[i];
3413 c->members.qsort (sort_sem_items_by_decl_uid);
3416 (*it)->classes.qsort (sort_congruence_classes_by_decl_uid);
3419 for (hash_table<congruence_class_hash>::iterator it = m_classes.begin ();
3420 it != m_classes.end (); ++it)
3421 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
3423 congruence_class *c = (*it)->classes[i];
3424 if (c->members.length () > 1)
3426 non_singular_classes_count++;
3427 non_singular_classes_sum += c->members.length ();
3431 auto_vec <congruence_class_group *> classes (m_classes.elements ());
3432 for (hash_table<congruence_class_hash>::iterator it = m_classes.begin ();
3433 it != m_classes.end (); ++it)
3434 classes.quick_push (*it);
3436 classes.qsort (sort_congruence_class_groups_by_decl_uid);
3438 if (dump_file)
3440 fprintf (dump_file, "\nItem count: %u\n", item_count);
3441 fprintf (dump_file, "Congruent classes before: %u, after: %u\n",
3442 prev_class_count, class_count);
3443 fprintf (dump_file, "Average class size before: %.2f, after: %.2f\n",
3444 prev_class_count ? 1.0f * item_count / prev_class_count : 0.0f,
3445 class_count ? 1.0f * item_count / class_count : 0.0f);
3446 fprintf (dump_file, "Average non-singular class size: %.2f, count: %u\n",
3447 non_singular_classes_count ? 1.0f * non_singular_classes_sum /
3448 non_singular_classes_count : 0.0f,
3449 non_singular_classes_count);
3450 fprintf (dump_file, "Equal symbols: %u\n", equal_items);
3451 fprintf (dump_file, "Fraction of visited symbols: %.2f%%\n\n",
3452 item_count ? 100.0f * equal_items / item_count : 0.0f);
3455 unsigned int l;
3456 congruence_class_group *it;
3457 FOR_EACH_VEC_ELT (classes, l, it)
3458 for (unsigned int i = 0; i < it->classes.length (); i++)
3460 congruence_class *c = it->classes[i];
3462 if (c->members.length () == 1)
3463 continue;
3465 sem_item *source = c->members[0];
3467 if (DECL_NAME (source->decl)
3468 && MAIN_NAME_P (DECL_NAME (source->decl)))
3469 /* If merge via wrappers, picking main as the target can be
3470 problematic. */
3471 source = c->members[1];
3473 for (unsigned int j = 0; j < c->members.length (); j++)
3475 sem_item *alias = c->members[j];
3477 if (alias == source)
3478 continue;
3480 if (dump_file)
3482 fprintf (dump_file, "Semantic equality hit:%s->%s\n",
3483 xstrdup_for_dump (source->node->name ()),
3484 xstrdup_for_dump (alias->node->name ()));
3485 fprintf (dump_file, "Assembler symbol names:%s->%s\n",
3486 xstrdup_for_dump (source->node->asm_name ()),
3487 xstrdup_for_dump (alias->node->asm_name ()));
3490 if (lookup_attribute ("no_icf", DECL_ATTRIBUTES (alias->decl)))
3492 if (dump_file)
3493 fprintf (dump_file,
3494 "Merge operation is skipped due to no_icf "
3495 "attribute.\n\n");
3497 continue;
3500 if (dump_file && (dump_flags & TDF_DETAILS))
3502 source->dump_to_file (dump_file);
3503 alias->dump_to_file (dump_file);
3506 if (dbg_cnt (merged_ipa_icf))
3508 bool merged = source->merge (alias);
3509 merged_p |= merged;
3511 if (merged && alias->type == VAR)
3513 symtab_pair p = symtab_pair (source->node, alias->node);
3514 m_merged_variables.safe_push (p);
3520 if (!m_merged_variables.is_empty ())
3521 fixup_points_to_sets ();
3523 return merged_p;
3526 /* Fixup points to set PT. */
3528 void
3529 sem_item_optimizer::fixup_pt_set (struct pt_solution *pt)
3531 if (pt->vars == NULL)
3532 return;
3534 unsigned i;
3535 symtab_pair *item;
3536 FOR_EACH_VEC_ELT (m_merged_variables, i, item)
3537 if (bitmap_bit_p (pt->vars, DECL_UID (item->second->decl)))
3538 bitmap_set_bit (pt->vars, DECL_UID (item->first->decl));
3541 /* Set all points-to UIDs of aliases pointing to node N as UID. */
3543 static void
3544 set_alias_uids (symtab_node *n, int uid)
3546 ipa_ref *ref;
3547 FOR_EACH_ALIAS (n, ref)
3549 if (dump_file)
3550 fprintf (dump_file, " Setting points-to UID of [%s] as %d\n",
3551 xstrdup_for_dump (ref->referring->asm_name ()), uid);
3553 SET_DECL_PT_UID (ref->referring->decl, uid);
3554 set_alias_uids (ref->referring, uid);
3558 /* Fixup points to analysis info. */
3560 void
3561 sem_item_optimizer::fixup_points_to_sets (void)
3563 /* TODO: remove in GCC 9 and trigger PTA re-creation after IPA passes. */
3564 cgraph_node *cnode;
3566 FOR_EACH_DEFINED_FUNCTION (cnode)
3568 tree name;
3569 unsigned i;
3570 function *fn = DECL_STRUCT_FUNCTION (cnode->decl);
3571 if (!gimple_in_ssa_p (fn))
3572 continue;
3574 FOR_EACH_SSA_NAME (i, name, fn)
3575 if (POINTER_TYPE_P (TREE_TYPE (name))
3576 && SSA_NAME_PTR_INFO (name))
3577 fixup_pt_set (&SSA_NAME_PTR_INFO (name)->pt);
3578 fixup_pt_set (&fn->gimple_df->escaped);
3580 /* The above get's us to 99% I guess, at least catching the
3581 address compares. Below also gets us aliasing correct
3582 but as said we're giving leeway to the situation with
3583 readonly vars anyway, so ... */
3584 basic_block bb;
3585 FOR_EACH_BB_FN (bb, fn)
3586 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
3587 gsi_next (&gsi))
3589 gcall *call = dyn_cast<gcall *> (gsi_stmt (gsi));
3590 if (call)
3592 fixup_pt_set (gimple_call_use_set (call));
3593 fixup_pt_set (gimple_call_clobber_set (call));
3598 unsigned i;
3599 symtab_pair *item;
3600 FOR_EACH_VEC_ELT (m_merged_variables, i, item)
3601 set_alias_uids (item->first, DECL_UID (item->first->decl));
3604 /* Dump function prints all class members to a FILE with an INDENT. */
3606 void
3607 congruence_class::dump (FILE *file, unsigned int indent) const
3609 FPRINTF_SPACES (file, indent, "class with id: %u, hash: %u, items: %u\n",
3610 id, members[0]->get_hash (), members.length ());
3612 FPUTS_SPACES (file, indent + 2, "");
3613 for (unsigned i = 0; i < members.length (); i++)
3614 fprintf (file, "%s ", members[i]->node->dump_asm_name ());
3616 fprintf (file, "\n");
3619 /* Returns true if there's a member that is used from another group. */
3621 bool
3622 congruence_class::is_class_used (void)
3624 for (unsigned int i = 0; i < members.length (); i++)
3625 if (members[i]->referenced_by_count)
3626 return true;
3628 return false;
3631 /* Generate pass summary for IPA ICF pass. */
3633 static void
3634 ipa_icf_generate_summary (void)
3636 if (!optimizer)
3637 optimizer = new sem_item_optimizer ();
3639 optimizer->register_hooks ();
3640 optimizer->parse_funcs_and_vars ();
3643 /* Write pass summary for IPA ICF pass. */
3645 static void
3646 ipa_icf_write_summary (void)
3648 gcc_assert (optimizer);
3650 optimizer->write_summary ();
3653 /* Read pass summary for IPA ICF pass. */
3655 static void
3656 ipa_icf_read_summary (void)
3658 if (!optimizer)
3659 optimizer = new sem_item_optimizer ();
3661 optimizer->read_summary ();
3662 optimizer->register_hooks ();
3665 /* Semantic equality exection function. */
3667 static unsigned int
3668 ipa_icf_driver (void)
3670 gcc_assert (optimizer);
3672 bool merged_p = optimizer->execute ();
3674 delete optimizer;
3675 optimizer = NULL;
3677 return merged_p ? TODO_remove_functions : 0;
3680 const pass_data pass_data_ipa_icf =
3682 IPA_PASS, /* type */
3683 "icf", /* name */
3684 OPTGROUP_IPA, /* optinfo_flags */
3685 TV_IPA_ICF, /* tv_id */
3686 0, /* properties_required */
3687 0, /* properties_provided */
3688 0, /* properties_destroyed */
3689 0, /* todo_flags_start */
3690 0, /* todo_flags_finish */
3693 class pass_ipa_icf : public ipa_opt_pass_d
3695 public:
3696 pass_ipa_icf (gcc::context *ctxt)
3697 : ipa_opt_pass_d (pass_data_ipa_icf, ctxt,
3698 ipa_icf_generate_summary, /* generate_summary */
3699 ipa_icf_write_summary, /* write_summary */
3700 ipa_icf_read_summary, /* read_summary */
3701 NULL, /*
3702 write_optimization_summary */
3703 NULL, /*
3704 read_optimization_summary */
3705 NULL, /* stmt_fixup */
3706 0, /* function_transform_todo_flags_start */
3707 NULL, /* function_transform */
3708 NULL) /* variable_transform */
3711 /* opt_pass methods: */
3712 virtual bool gate (function *)
3714 return in_lto_p || flag_ipa_icf_variables || flag_ipa_icf_functions;
3717 virtual unsigned int execute (function *)
3719 return ipa_icf_driver();
3721 }; // class pass_ipa_icf
3723 } // ipa_icf namespace
3725 ipa_opt_pass_d *
3726 make_pass_ipa_icf (gcc::context *ctxt)
3728 return new ipa_icf::pass_ipa_icf (ctxt);