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