1 /* Interprocedural Identical Code Folding pass
2 Copyright (C) 2014-2020 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 "fold-const.h"
72 #include "gimple-iterator.h"
74 #include "symbol-summary.h"
76 #include "ipa-fnsummary.h"
79 #include "print-tree.h"
80 #include "ipa-utils.h"
81 #include "ipa-icf-gimple.h"
82 #include "fibonacci_heap.h"
84 #include "stor-layout.h"
86 #include "tree-vector-builder.h"
88 using namespace ipa_icf_gimple
;
92 /* Initialization and computation of symtab node hash, there data
93 are propagated later on. */
95 static sem_item_optimizer
*optimizer
= NULL
;
99 symbol_compare_collection::symbol_compare_collection (symtab_node
*node
)
101 m_references
.create (0);
102 m_interposables
.create (0);
106 if (is_a
<varpool_node
*> (node
) && DECL_VIRTUAL_P (node
->decl
))
109 for (unsigned i
= 0; node
->iterate_reference (i
, ref
); i
++)
111 if (ref
->address_matters_p ())
112 m_references
.safe_push (ref
->referred
);
114 if (ref
->referred
->get_availability () <= AVAIL_INTERPOSABLE
)
116 if (ref
->address_matters_p ())
117 m_references
.safe_push (ref
->referred
);
119 m_interposables
.safe_push (ref
->referred
);
123 if (is_a
<cgraph_node
*> (node
))
125 cgraph_node
*cnode
= dyn_cast
<cgraph_node
*> (node
);
127 for (cgraph_edge
*e
= cnode
->callees
; e
; e
= e
->next_callee
)
128 if (e
->callee
->get_availability () <= AVAIL_INTERPOSABLE
)
129 m_interposables
.safe_push (e
->callee
);
133 /* Constructor for key value pair, where _ITEM is key and _INDEX is a target. */
135 sem_usage_pair::sem_usage_pair (sem_item
*_item
, unsigned int _index
)
136 : item (_item
), index (_index
)
140 sem_item::sem_item (sem_item_type _type
, bitmap_obstack
*stack
)
141 : type (_type
), referenced_by_count (0), m_hash (-1), m_hash_set (false)
146 sem_item::sem_item (sem_item_type _type
, symtab_node
*_node
,
147 bitmap_obstack
*stack
)
148 : type (_type
), node (_node
), referenced_by_count (0), m_hash (-1),
155 /* Add reference to a semantic TARGET. */
158 sem_item::add_reference (ref_map
*refs
,
161 unsigned index
= reference_count
++;
165 = refs
->get_or_insert (new sem_usage_pair (target
, index
), &existed
);
167 bitmap_set_bit (target
->usage_index_bitmap
, index
);
168 refs_set
.add (target
->node
);
169 ++target
->referenced_by_count
;
172 /* Initialize internal data structures. Bitmap STACK is used for
173 bitmap memory allocation process. */
176 sem_item::setup (bitmap_obstack
*stack
)
178 gcc_checking_assert (node
);
181 tree_refs
.create (0);
182 usage_index_bitmap
= BITMAP_ALLOC (stack
);
185 sem_item::~sem_item ()
187 tree_refs
.release ();
189 BITMAP_FREE (usage_index_bitmap
);
192 /* Dump function for debugging purpose. */
195 sem_item::dump (void)
199 fprintf (dump_file
, "[%s] %s (tree:%p)\n", type
== FUNC
? "func" : "var",
200 node
->dump_name (), (void *) node
->decl
);
201 fprintf (dump_file
, " hash: %u\n", get_hash ());
205 /* Return true if target supports alias symbols. */
208 sem_item::target_supports_symbol_aliases_p (void)
210 #if !defined (ASM_OUTPUT_DEF) || (!defined(ASM_OUTPUT_WEAK_ALIAS) && !defined (ASM_WEAKEN_DECL))
217 void sem_item::set_hash (hashval_t hash
)
223 hash_map
<const_tree
, hashval_t
> sem_item::m_type_hash_cache
;
225 /* Semantic function constructor that uses STACK as bitmap memory stack. */
227 sem_function::sem_function (bitmap_obstack
*stack
)
228 : sem_item (FUNC
, stack
), m_checker (NULL
), m_compared_func (NULL
)
231 bb_sorted
.create (0);
234 sem_function::sem_function (cgraph_node
*node
, bitmap_obstack
*stack
)
235 : sem_item (FUNC
, node
, stack
), m_checker (NULL
), m_compared_func (NULL
)
238 bb_sorted
.create (0);
241 sem_function::~sem_function ()
243 for (unsigned i
= 0; i
< bb_sorted
.length (); i
++)
244 delete (bb_sorted
[i
]);
247 bb_sorted
.release ();
250 /* Calculates hash value based on a BASIC_BLOCK. */
253 sem_function::get_bb_hash (const sem_bb
*basic_block
)
255 inchash::hash hstate
;
257 hstate
.add_int (basic_block
->nondbg_stmt_count
);
258 hstate
.add_int (basic_block
->edge_count
);
260 return hstate
.end ();
263 /* References independent hash function. */
266 sem_function::get_hash (void)
270 inchash::hash hstate
;
271 hstate
.add_int (177454); /* Random number for function type. */
273 hstate
.add_int (arg_count
);
274 hstate
.add_int (cfg_checksum
);
275 hstate
.add_int (gcode_hash
);
277 for (unsigned i
= 0; i
< bb_sorted
.length (); i
++)
278 hstate
.merge_hash (get_bb_hash (bb_sorted
[i
]));
280 for (unsigned i
= 0; i
< bb_sizes
.length (); i
++)
281 hstate
.add_int (bb_sizes
[i
]);
283 /* Add common features of declaration itself. */
284 if (DECL_FUNCTION_SPECIFIC_TARGET (decl
))
286 (cl_target_option_hash
287 (TREE_TARGET_OPTION (DECL_FUNCTION_SPECIFIC_TARGET (decl
))));
288 if (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (decl
))
290 (cl_optimization_hash
291 (TREE_OPTIMIZATION (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (decl
))));
292 hstate
.add_flag (DECL_CXX_CONSTRUCTOR_P (decl
));
293 hstate
.add_flag (DECL_CXX_DESTRUCTOR_P (decl
));
295 set_hash (hstate
.end ());
301 /* Compare properties of symbols N1 and N2 that does not affect semantics of
302 symbol itself but affects semantics of its references from USED_BY (which
303 may be NULL if it is unknown). If comparison is false, symbols
304 can still be merged but any symbols referring them can't.
306 If ADDRESS is true, do extra checking needed for IPA_REF_ADDR.
308 TODO: We can also split attributes to those that determine codegen of
309 a function body/variable constructor itself and those that are used when
313 sem_item::compare_referenced_symbol_properties (symtab_node
*used_by
,
318 if (is_a
<cgraph_node
*> (n1
))
320 /* Inline properties matters: we do now want to merge uses of inline
321 function to uses of normal function because inline hint would be lost.
322 We however can merge inline function to noinline because the alias
323 will keep its DECL_DECLARED_INLINE flag.
325 Also ignore inline flag when optimizing for size or when function
326 is known to not be inlinable.
328 TODO: the optimize_size checks can also be assumed to be true if
329 unit has no !optimize_size functions. */
331 if ((!used_by
|| address
|| !is_a
<cgraph_node
*> (used_by
)
332 || !opt_for_fn (used_by
->decl
, optimize_size
))
333 && !opt_for_fn (n1
->decl
, optimize_size
)
334 && n1
->get_availability () > AVAIL_INTERPOSABLE
335 && (!DECL_UNINLINABLE (n1
->decl
) || !DECL_UNINLINABLE (n2
->decl
)))
337 if (DECL_DISREGARD_INLINE_LIMITS (n1
->decl
)
338 != DECL_DISREGARD_INLINE_LIMITS (n2
->decl
))
339 return return_false_with_msg
340 ("DECL_DISREGARD_INLINE_LIMITS are different");
342 if (DECL_DECLARED_INLINE_P (n1
->decl
)
343 != DECL_DECLARED_INLINE_P (n2
->decl
))
344 return return_false_with_msg ("inline attributes are different");
347 if (DECL_IS_OPERATOR_NEW_P (n1
->decl
)
348 != DECL_IS_OPERATOR_NEW_P (n2
->decl
))
349 return return_false_with_msg ("operator new flags are different");
351 if (DECL_IS_REPLACEABLE_OPERATOR (n1
->decl
)
352 != DECL_IS_REPLACEABLE_OPERATOR (n2
->decl
))
353 return return_false_with_msg ("replaceable operator flags are different");
356 /* Merging two definitions with a reference to equivalent vtables, but
357 belonging to a different type may result in ipa-polymorphic-call analysis
358 giving a wrong answer about the dynamic type of instance. */
359 if (is_a
<varpool_node
*> (n1
))
361 if ((DECL_VIRTUAL_P (n1
->decl
) || DECL_VIRTUAL_P (n2
->decl
))
362 && (DECL_VIRTUAL_P (n1
->decl
) != DECL_VIRTUAL_P (n2
->decl
)
363 || !types_must_be_same_for_odr (DECL_CONTEXT (n1
->decl
),
364 DECL_CONTEXT (n2
->decl
)))
365 && (!used_by
|| !is_a
<cgraph_node
*> (used_by
) || address
366 || opt_for_fn (used_by
->decl
, flag_devirtualize
)))
367 return return_false_with_msg
368 ("references to virtual tables cannot be merged");
370 if (address
&& DECL_ALIGN (n1
->decl
) != DECL_ALIGN (n2
->decl
))
371 return return_false_with_msg ("alignment mismatch");
373 /* For functions we compare attributes in equals_wpa, because we do
374 not know what attributes may cause codegen differences, but for
375 variables just compare attributes for references - the codegen
376 for constructors is affected only by those attributes that we lower
377 to explicit representation (such as DECL_ALIGN or DECL_SECTION). */
378 if (!attribute_list_equal (DECL_ATTRIBUTES (n1
->decl
),
379 DECL_ATTRIBUTES (n2
->decl
)))
380 return return_false_with_msg ("different var decl attributes");
381 if (comp_type_attributes (TREE_TYPE (n1
->decl
),
382 TREE_TYPE (n2
->decl
)) != 1)
383 return return_false_with_msg ("different var type attributes");
386 /* When matching virtual tables, be sure to also match information
387 relevant for polymorphic call analysis. */
388 if (used_by
&& is_a
<varpool_node
*> (used_by
)
389 && DECL_VIRTUAL_P (used_by
->decl
))
391 if (DECL_VIRTUAL_P (n1
->decl
) != DECL_VIRTUAL_P (n2
->decl
))
392 return return_false_with_msg ("virtual flag mismatch");
393 if (DECL_VIRTUAL_P (n1
->decl
) && is_a
<cgraph_node
*> (n1
)
394 && (DECL_FINAL_P (n1
->decl
) != DECL_FINAL_P (n2
->decl
)))
395 return return_false_with_msg ("final flag mismatch");
400 /* Hash properties that are compared by compare_referenced_symbol_properties. */
403 sem_item::hash_referenced_symbol_properties (symtab_node
*ref
,
404 inchash::hash
&hstate
,
407 if (is_a
<cgraph_node
*> (ref
))
409 if ((type
!= FUNC
|| address
|| !opt_for_fn (decl
, optimize_size
))
410 && !opt_for_fn (ref
->decl
, optimize_size
)
411 && !DECL_UNINLINABLE (ref
->decl
))
413 hstate
.add_flag (DECL_DISREGARD_INLINE_LIMITS (ref
->decl
));
414 hstate
.add_flag (DECL_DECLARED_INLINE_P (ref
->decl
));
416 hstate
.add_flag (DECL_IS_OPERATOR_NEW_P (ref
->decl
));
418 else if (is_a
<varpool_node
*> (ref
))
420 hstate
.add_flag (DECL_VIRTUAL_P (ref
->decl
));
422 hstate
.add_int (DECL_ALIGN (ref
->decl
));
427 /* For a given symbol table nodes N1 and N2, we check that FUNCTION_DECLs
428 point to a same function. Comparison can be skipped if IGNORED_NODES
429 contains these nodes. ADDRESS indicate if address is taken. */
432 sem_item::compare_symbol_references (
433 hash_map
<symtab_node
*, sem_item
*> &ignored_nodes
,
434 symtab_node
*n1
, symtab_node
*n2
, bool address
)
436 enum availability avail1
, avail2
;
441 /* Never match variable and function. */
442 if (is_a
<varpool_node
*> (n1
) != is_a
<varpool_node
*> (n2
))
445 if (!compare_referenced_symbol_properties (node
, n1
, n2
, address
))
447 if (address
&& n1
->equal_address_to (n2
) == 1)
449 if (!address
&& n1
->semantically_equivalent_p (n2
))
452 n1
= n1
->ultimate_alias_target (&avail1
);
453 n2
= n2
->ultimate_alias_target (&avail2
);
455 if (avail1
> AVAIL_INTERPOSABLE
&& ignored_nodes
.get (n1
)
456 && avail2
> AVAIL_INTERPOSABLE
&& ignored_nodes
.get (n2
))
459 return return_false_with_msg ("different references");
462 /* If cgraph edges E1 and E2 are indirect calls, verify that
463 ECF flags are the same. */
465 bool sem_function::compare_edge_flags (cgraph_edge
*e1
, cgraph_edge
*e2
)
467 if (e1
->indirect_info
&& e2
->indirect_info
)
469 int e1_flags
= e1
->indirect_info
->ecf_flags
;
470 int e2_flags
= e2
->indirect_info
->ecf_flags
;
472 if (e1_flags
!= e2_flags
)
473 return return_false_with_msg ("ICF flags are different");
475 else if (e1
->indirect_info
|| e2
->indirect_info
)
481 /* Return true if parameter I may be used. */
484 sem_function::param_used_p (unsigned int i
)
486 if (ipa_node_params_sum
== NULL
)
489 class ipa_node_params
*parms_info
= IPA_NODE_REF (get_node ());
491 if (!parms_info
|| vec_safe_length (parms_info
->descriptors
) <= i
)
494 return ipa_is_param_used (IPA_NODE_REF (get_node ()), i
);
497 /* Perform additional check needed to match types function parameters that are
498 used. Unlike for normal decls it matters if type is TYPE_RESTRICT and we
499 make an assumption that REFERENCE_TYPE parameters are always non-NULL. */
502 sem_function::compatible_parm_types_p (tree parm1
, tree parm2
)
504 /* Be sure that parameters are TBAA compatible. */
505 if (!func_checker::compatible_types_p (parm1
, parm2
))
506 return return_false_with_msg ("parameter type is not compatible");
508 if (POINTER_TYPE_P (parm1
)
509 && (TYPE_RESTRICT (parm1
) != TYPE_RESTRICT (parm2
)))
510 return return_false_with_msg ("argument restrict flag mismatch");
512 /* nonnull_arg_p implies non-zero range to REFERENCE types. */
513 if (POINTER_TYPE_P (parm1
)
514 && TREE_CODE (parm1
) != TREE_CODE (parm2
)
515 && opt_for_fn (decl
, flag_delete_null_pointer_checks
))
516 return return_false_with_msg ("pointer wrt reference mismatch");
521 /* Fast equality function based on knowledge known in WPA. */
524 sem_function::equals_wpa (sem_item
*item
,
525 hash_map
<symtab_node
*, sem_item
*> &ignored_nodes
)
527 gcc_assert (item
->type
== FUNC
);
528 cgraph_node
*cnode
= dyn_cast
<cgraph_node
*> (node
);
529 cgraph_node
*cnode2
= dyn_cast
<cgraph_node
*> (item
->node
);
531 m_compared_func
= static_cast<sem_function
*> (item
);
533 if (cnode
->thunk
.thunk_p
!= cnode2
->thunk
.thunk_p
)
534 return return_false_with_msg ("thunk_p mismatch");
536 if (cnode
->thunk
.thunk_p
)
538 if (cnode
->thunk
.fixed_offset
!= cnode2
->thunk
.fixed_offset
)
539 return return_false_with_msg ("thunk fixed_offset mismatch");
540 if (cnode
->thunk
.virtual_value
!= cnode2
->thunk
.virtual_value
)
541 return return_false_with_msg ("thunk virtual_value mismatch");
542 if (cnode
->thunk
.indirect_offset
!= cnode2
->thunk
.indirect_offset
)
543 return return_false_with_msg ("thunk indirect_offset mismatch");
544 if (cnode
->thunk
.this_adjusting
!= cnode2
->thunk
.this_adjusting
)
545 return return_false_with_msg ("thunk this_adjusting mismatch");
546 if (cnode
->thunk
.virtual_offset_p
!= cnode2
->thunk
.virtual_offset_p
)
547 return return_false_with_msg ("thunk virtual_offset_p mismatch");
550 /* Compare special function DECL attributes. */
551 if (DECL_FUNCTION_PERSONALITY (decl
)
552 != DECL_FUNCTION_PERSONALITY (item
->decl
))
553 return return_false_with_msg ("function personalities are different");
555 if (DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl
)
556 != DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (item
->decl
))
557 return return_false_with_msg ("instrument function entry exit "
558 "attributes are different");
560 if (DECL_NO_LIMIT_STACK (decl
) != DECL_NO_LIMIT_STACK (item
->decl
))
561 return return_false_with_msg ("no stack limit attributes are different");
563 if (DECL_CXX_CONSTRUCTOR_P (decl
) != DECL_CXX_CONSTRUCTOR_P (item
->decl
))
564 return return_false_with_msg ("DECL_CXX_CONSTRUCTOR mismatch");
566 if (DECL_CXX_DESTRUCTOR_P (decl
) != DECL_CXX_DESTRUCTOR_P (item
->decl
))
567 return return_false_with_msg ("DECL_CXX_DESTRUCTOR mismatch");
569 /* TODO: pure/const flags mostly matters only for references, except for
570 the fact that codegen takes LOOPING flag as a hint that loops are
571 finite. We may arrange the code to always pick leader that has least
572 specified flags and then this can go into comparing symbol properties. */
573 if (flags_from_decl_or_type (decl
) != flags_from_decl_or_type (item
->decl
))
574 return return_false_with_msg ("decl_or_type flags are different");
576 /* Do not match polymorphic constructors of different types. They calls
577 type memory location for ipa-polymorphic-call and we do not want
578 it to get confused by wrong type. */
579 if (DECL_CXX_CONSTRUCTOR_P (decl
)
580 && TREE_CODE (TREE_TYPE (decl
)) == METHOD_TYPE
)
582 if (TREE_CODE (TREE_TYPE (item
->decl
)) != METHOD_TYPE
)
583 return return_false_with_msg ("DECL_CXX_CONSTRUCTOR type mismatch");
584 else if (!func_checker::compatible_polymorphic_types_p
585 (TYPE_METHOD_BASETYPE (TREE_TYPE (decl
)),
586 TYPE_METHOD_BASETYPE (TREE_TYPE (item
->decl
)), false))
587 return return_false_with_msg ("ctor polymorphic type mismatch");
590 /* Checking function TARGET and OPTIMIZATION flags. */
591 cl_target_option
*tar1
= target_opts_for_fn (decl
);
592 cl_target_option
*tar2
= target_opts_for_fn (item
->decl
);
594 if (tar1
!= tar2
&& !cl_target_option_eq (tar1
, tar2
))
596 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
598 fprintf (dump_file
, "target flags difference");
599 cl_target_option_print_diff (dump_file
, 2, tar1
, tar2
);
602 return return_false_with_msg ("Target flags are different");
605 cl_optimization
*opt1
= opts_for_fn (decl
);
606 cl_optimization
*opt2
= opts_for_fn (item
->decl
);
608 if (opt1
!= opt2
&& !cl_optimization_option_eq (opt1
, opt2
))
610 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
612 fprintf (dump_file
, "optimization flags difference");
613 cl_optimization_print_diff (dump_file
, 2, opt1
, opt2
);
616 return return_false_with_msg ("optimization flags are different");
619 /* Result type checking. */
620 if (!func_checker::compatible_types_p
621 (TREE_TYPE (TREE_TYPE (decl
)),
622 TREE_TYPE (TREE_TYPE (m_compared_func
->decl
))))
623 return return_false_with_msg ("result types are different");
625 /* Checking types of arguments. */
626 tree list1
= TYPE_ARG_TYPES (TREE_TYPE (decl
)),
627 list2
= TYPE_ARG_TYPES (TREE_TYPE (m_compared_func
->decl
));
628 for (unsigned i
= 0; list1
&& list2
;
629 list1
= TREE_CHAIN (list1
), list2
= TREE_CHAIN (list2
), i
++)
631 tree parm1
= TREE_VALUE (list1
);
632 tree parm2
= TREE_VALUE (list2
);
634 /* This guard is here for function pointer with attributes (pr59927.c). */
635 if (!parm1
|| !parm2
)
636 return return_false_with_msg ("NULL argument type");
638 /* Verify that types are compatible to ensure that both functions
639 have same calling conventions. */
640 if (!types_compatible_p (parm1
, parm2
))
641 return return_false_with_msg ("parameter types are not compatible");
643 if (!param_used_p (i
))
646 /* Perform additional checks for used parameters. */
647 if (!compatible_parm_types_p (parm1
, parm2
))
652 return return_false_with_msg ("Mismatched number of parameters");
654 if (node
->num_references () != item
->node
->num_references ())
655 return return_false_with_msg ("different number of references");
657 /* Checking function attributes.
658 This is quadratic in number of attributes */
659 if (comp_type_attributes (TREE_TYPE (decl
),
660 TREE_TYPE (item
->decl
)) != 1)
661 return return_false_with_msg ("different type attributes");
662 if (!attribute_list_equal (DECL_ATTRIBUTES (decl
),
663 DECL_ATTRIBUTES (item
->decl
)))
664 return return_false_with_msg ("different decl attributes");
666 /* The type of THIS pointer type memory location for
667 ipa-polymorphic-call-analysis. */
668 if (opt_for_fn (decl
, flag_devirtualize
)
669 && (TREE_CODE (TREE_TYPE (decl
)) == METHOD_TYPE
670 || TREE_CODE (TREE_TYPE (item
->decl
)) == METHOD_TYPE
)
672 && compare_polymorphic_p ())
674 if (TREE_CODE (TREE_TYPE (decl
)) != TREE_CODE (TREE_TYPE (item
->decl
)))
675 return return_false_with_msg ("METHOD_TYPE and FUNCTION_TYPE mismatch");
676 if (!func_checker::compatible_polymorphic_types_p
677 (TYPE_METHOD_BASETYPE (TREE_TYPE (decl
)),
678 TYPE_METHOD_BASETYPE (TREE_TYPE (item
->decl
)), false))
679 return return_false_with_msg ("THIS pointer ODR type mismatch");
682 ipa_ref
*ref
= NULL
, *ref2
= NULL
;
683 for (unsigned i
= 0; node
->iterate_reference (i
, ref
); i
++)
685 item
->node
->iterate_reference (i
, ref2
);
687 if (ref
->use
!= ref2
->use
)
688 return return_false_with_msg ("reference use mismatch");
690 if (!compare_symbol_references (ignored_nodes
, ref
->referred
,
692 ref
->address_matters_p ()))
696 cgraph_edge
*e1
= dyn_cast
<cgraph_node
*> (node
)->callees
;
697 cgraph_edge
*e2
= dyn_cast
<cgraph_node
*> (item
->node
)->callees
;
701 if (!compare_symbol_references (ignored_nodes
, e1
->callee
,
704 if (!compare_edge_flags (e1
, e2
))
707 e1
= e1
->next_callee
;
708 e2
= e2
->next_callee
;
712 return return_false_with_msg ("different number of calls");
714 e1
= dyn_cast
<cgraph_node
*> (node
)->indirect_calls
;
715 e2
= dyn_cast
<cgraph_node
*> (item
->node
)->indirect_calls
;
719 if (!compare_edge_flags (e1
, e2
))
722 e1
= e1
->next_callee
;
723 e2
= e2
->next_callee
;
727 return return_false_with_msg ("different number of indirect calls");
732 /* Update hash by address sensitive references. We iterate over all
733 sensitive references (address_matters_p) and we hash ultimate alias
734 target of these nodes, which can improve a semantic item hash.
736 Also hash in referenced symbols properties. This can be done at any time
737 (as the properties should not change), but it is convenient to do it here
738 while we walk the references anyway. */
741 sem_item::update_hash_by_addr_refs (hash_map
<symtab_node
*,
742 sem_item
*> &m_symtab_node_map
)
745 inchash::hash
hstate (get_hash ());
747 for (unsigned i
= 0; node
->iterate_reference (i
, ref
); i
++)
749 hstate
.add_int (ref
->use
);
750 hash_referenced_symbol_properties (ref
->referred
, hstate
,
751 ref
->use
== IPA_REF_ADDR
);
752 if (ref
->address_matters_p () || !m_symtab_node_map
.get (ref
->referred
))
753 hstate
.add_int (ref
->referred
->ultimate_alias_target ()->order
);
756 if (is_a
<cgraph_node
*> (node
))
758 for (cgraph_edge
*e
= dyn_cast
<cgraph_node
*> (node
)->callers
; e
;
761 sem_item
**result
= m_symtab_node_map
.get (e
->callee
);
762 hash_referenced_symbol_properties (e
->callee
, hstate
, false);
764 hstate
.add_int (e
->callee
->ultimate_alias_target ()->order
);
768 set_hash (hstate
.end ());
771 /* Update hash by computed local hash values taken from different
773 TODO: stronger SCC based hashing would be desirable here. */
776 sem_item::update_hash_by_local_refs (hash_map
<symtab_node
*,
777 sem_item
*> &m_symtab_node_map
)
780 inchash::hash
state (get_hash ());
782 for (unsigned j
= 0; node
->iterate_reference (j
, ref
); j
++)
784 sem_item
**result
= m_symtab_node_map
.get (ref
->referring
);
786 state
.merge_hash ((*result
)->get_hash ());
791 for (cgraph_edge
*e
= dyn_cast
<cgraph_node
*> (node
)->callees
; e
;
794 sem_item
**result
= m_symtab_node_map
.get (e
->caller
);
796 state
.merge_hash ((*result
)->get_hash ());
800 global_hash
= state
.end ();
803 /* Returns true if the item equals to ITEM given as argument. */
806 sem_function::equals (sem_item
*item
,
807 hash_map
<symtab_node
*, sem_item
*> &)
809 gcc_assert (item
->type
== FUNC
);
810 bool eq
= equals_private (item
);
812 if (m_checker
!= NULL
)
818 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
820 "Equals called for: %s:%s with result: %s\n\n",
822 item
->node
->dump_name (),
823 eq
? "true" : "false");
828 /* Processes function equality comparison. */
831 sem_function::equals_private (sem_item
*item
)
833 if (item
->type
!= FUNC
)
836 basic_block bb1
, bb2
;
838 edge_iterator ei1
, ei2
;
842 m_compared_func
= static_cast<sem_function
*> (item
);
844 gcc_assert (decl
!= item
->decl
);
846 if (bb_sorted
.length () != m_compared_func
->bb_sorted
.length ()
847 || edge_count
!= m_compared_func
->edge_count
848 || cfg_checksum
!= m_compared_func
->cfg_checksum
)
849 return return_false ();
851 m_checker
= new func_checker (decl
, m_compared_func
->decl
,
854 &m_compared_func
->refs_set
);
855 arg1
= DECL_ARGUMENTS (decl
);
856 arg2
= DECL_ARGUMENTS (m_compared_func
->decl
);
858 arg1
&& arg2
; arg1
= DECL_CHAIN (arg1
), arg2
= DECL_CHAIN (arg2
), i
++)
860 if (!types_compatible_p (TREE_TYPE (arg1
), TREE_TYPE (arg2
)))
861 return return_false_with_msg ("argument types are not compatible");
862 if (!param_used_p (i
))
864 /* Perform additional checks for used parameters. */
865 if (!compatible_parm_types_p (TREE_TYPE (arg1
), TREE_TYPE (arg2
)))
867 if (!m_checker
->compare_decl (arg1
, arg2
))
868 return return_false ();
871 return return_false_with_msg ("Mismatched number of arguments");
873 if (!dyn_cast
<cgraph_node
*> (node
)->has_gimple_body_p ())
876 /* Fill-up label dictionary. */
877 for (unsigned i
= 0; i
< bb_sorted
.length (); ++i
)
879 m_checker
->parse_labels (bb_sorted
[i
]);
880 m_checker
->parse_labels (m_compared_func
->bb_sorted
[i
]);
883 /* Checking all basic blocks. */
884 for (unsigned i
= 0; i
< bb_sorted
.length (); ++i
)
885 if(!m_checker
->compare_bb (bb_sorted
[i
], m_compared_func
->bb_sorted
[i
]))
886 return return_false ();
888 auto_vec
<int> bb_dict
;
890 /* Basic block edges check. */
891 for (unsigned i
= 0; i
< bb_sorted
.length (); ++i
)
893 bb1
= bb_sorted
[i
]->bb
;
894 bb2
= m_compared_func
->bb_sorted
[i
]->bb
;
896 ei2
= ei_start (bb2
->preds
);
898 for (ei1
= ei_start (bb1
->preds
); ei_cond (ei1
, &e1
); ei_next (&ei1
))
902 if (e1
->flags
!= e2
->flags
)
903 return return_false_with_msg ("flags comparison returns false");
905 if (!bb_dict_test (&bb_dict
, e1
->src
->index
, e2
->src
->index
))
906 return return_false_with_msg ("edge comparison returns false");
908 if (!bb_dict_test (&bb_dict
, e1
->dest
->index
, e2
->dest
->index
))
909 return return_false_with_msg ("BB comparison returns false");
911 if (!m_checker
->compare_edge (e1
, e2
))
912 return return_false_with_msg ("edge comparison returns false");
918 /* Basic block PHI nodes comparison. */
919 for (unsigned i
= 0; i
< bb_sorted
.length (); i
++)
920 if (!compare_phi_node (bb_sorted
[i
]->bb
, m_compared_func
->bb_sorted
[i
]->bb
))
921 return return_false_with_msg ("PHI node comparison returns false");
926 /* Set LOCAL_P of NODE to true if DATA is non-NULL.
927 Helper for call_for_symbol_thunks_and_aliases. */
930 set_local (cgraph_node
*node
, void *data
)
932 node
->local
= data
!= NULL
;
936 /* TREE_ADDRESSABLE of NODE to true.
937 Helper for call_for_symbol_thunks_and_aliases. */
940 set_addressable (varpool_node
*node
, void *)
942 TREE_ADDRESSABLE (node
->decl
) = 1;
946 /* Clear DECL_RTL of NODE.
947 Helper for call_for_symbol_thunks_and_aliases. */
950 clear_decl_rtl (symtab_node
*node
, void *)
952 SET_DECL_RTL (node
->decl
, NULL
);
956 /* Redirect all callers of N and its aliases to TO. Remove aliases if
957 possible. Return number of redirections made. */
960 redirect_all_callers (cgraph_node
*n
, cgraph_node
*to
)
964 cgraph_edge
*e
= n
->callers
;
968 /* Redirecting thunks to interposable symbols or symbols in other sections
969 may not be supported by target output code. Play safe for now and
970 punt on redirection. */
971 if (!e
->caller
->thunk
.thunk_p
)
973 struct cgraph_edge
*nexte
= e
->next_caller
;
974 e
->redirect_callee (to
);
981 for (unsigned i
= 0; n
->iterate_direct_aliases (i
, ref
);)
983 bool removed
= false;
984 cgraph_node
*n_alias
= dyn_cast
<cgraph_node
*> (ref
->referring
);
986 if ((DECL_COMDAT_GROUP (n
->decl
)
987 && (DECL_COMDAT_GROUP (n
->decl
)
988 == DECL_COMDAT_GROUP (n_alias
->decl
)))
989 || (n_alias
->get_availability () > AVAIL_INTERPOSABLE
990 && n
->get_availability () > AVAIL_INTERPOSABLE
))
992 nredirected
+= redirect_all_callers (n_alias
, to
);
993 if (n_alias
->can_remove_if_no_direct_calls_p ()
994 && !n_alias
->call_for_symbol_and_aliases (cgraph_node::has_thunk_p
,
996 && !n_alias
->has_aliases_p ())
1005 /* Merges instance with an ALIAS_ITEM, where alias, thunk or redirection can
1009 sem_function::merge (sem_item
*alias_item
)
1011 gcc_assert (alias_item
->type
== FUNC
);
1013 sem_function
*alias_func
= static_cast<sem_function
*> (alias_item
);
1015 cgraph_node
*original
= get_node ();
1016 cgraph_node
*local_original
= NULL
;
1017 cgraph_node
*alias
= alias_func
->get_node ();
1019 bool create_wrapper
= false;
1020 bool create_alias
= false;
1021 bool redirect_callers
= false;
1022 bool remove
= false;
1024 bool original_discardable
= false;
1025 bool original_discarded
= false;
1027 bool original_address_matters
= original
->address_matters_p ();
1028 bool alias_address_matters
= alias
->address_matters_p ();
1030 AUTO_DUMP_SCOPE ("merge",
1031 dump_user_location_t::from_function_decl (decl
));
1033 if (DECL_EXTERNAL (alias
->decl
))
1035 if (dump_enabled_p ())
1036 dump_printf (MSG_MISSED_OPTIMIZATION
,
1037 "Not unifying; alias is external.\n");
1041 if (DECL_NO_INLINE_WARNING_P (original
->decl
)
1042 != DECL_NO_INLINE_WARNING_P (alias
->decl
))
1044 if (dump_enabled_p ())
1045 dump_printf (MSG_MISSED_OPTIMIZATION
,
1046 "Not unifying; DECL_NO_INLINE_WARNING mismatch.\n");
1050 /* Do not attempt to mix functions from different user sections;
1051 we do not know what user intends with those. */
1052 if (((DECL_SECTION_NAME (original
->decl
) && !original
->implicit_section
)
1053 || (DECL_SECTION_NAME (alias
->decl
) && !alias
->implicit_section
))
1054 && DECL_SECTION_NAME (original
->decl
) != DECL_SECTION_NAME (alias
->decl
))
1056 if (dump_enabled_p ())
1057 dump_printf (MSG_MISSED_OPTIMIZATION
,
1059 "original and alias are in different sections.\n");
1063 if (!original
->in_same_comdat_group_p (alias
)
1064 || original
->comdat_local_p ())
1066 if (dump_enabled_p ())
1067 dump_printf (MSG_MISSED_OPTIMIZATION
,
1068 "Not unifying; alias nor wrapper cannot be created; "
1069 "across comdat group boundary\n");
1073 /* See if original is in a section that can be discarded if the main
1074 symbol is not used. */
1076 if (original
->can_be_discarded_p ())
1077 original_discardable
= true;
1078 /* Also consider case where we have resolution info and we know that
1079 original's definition is not going to be used. In this case we cannot
1080 create alias to original. */
1081 if (node
->resolution
!= LDPR_UNKNOWN
1082 && !decl_binds_to_current_def_p (node
->decl
))
1083 original_discardable
= original_discarded
= true;
1085 /* Creating a symtab alias is the optimal way to merge.
1086 It however cannot be used in the following cases:
1088 1) if ORIGINAL and ALIAS may be possibly compared for address equality.
1089 2) if ORIGINAL is in a section that may be discarded by linker or if
1090 it is an external functions where we cannot create an alias
1091 (ORIGINAL_DISCARDABLE)
1092 3) if target do not support symbol aliases.
1093 4) original and alias lie in different comdat groups.
1095 If we cannot produce alias, we will turn ALIAS into WRAPPER of ORIGINAL
1096 and/or redirect all callers from ALIAS to ORIGINAL. */
1097 if ((original_address_matters
&& alias_address_matters
)
1098 || (original_discardable
1099 && (!DECL_COMDAT_GROUP (alias
->decl
)
1100 || (DECL_COMDAT_GROUP (alias
->decl
)
1101 != DECL_COMDAT_GROUP (original
->decl
))))
1102 || original_discarded
1103 || !sem_item::target_supports_symbol_aliases_p ()
1104 || DECL_COMDAT_GROUP (alias
->decl
) != DECL_COMDAT_GROUP (original
->decl
))
1106 /* First see if we can produce wrapper. */
1108 /* Symbol properties that matter for references must be preserved.
1109 TODO: We can produce wrapper, but we need to produce alias of ORIGINAL
1110 with proper properties. */
1111 if (!sem_item::compare_referenced_symbol_properties (NULL
, original
, alias
,
1112 alias
->address_taken
))
1114 if (dump_enabled_p ())
1115 dump_printf (MSG_MISSED_OPTIMIZATION
,
1116 "Wrapper cannot be created because referenced symbol "
1117 "properties mismatch\n");
1119 /* Do not turn function in one comdat group into wrapper to another
1120 comdat group. Other compiler producing the body of the
1121 another comdat group may make opposite decision and with unfortunate
1122 linker choices this may close a loop. */
1123 else if (DECL_COMDAT_GROUP (original
->decl
)
1124 && DECL_COMDAT_GROUP (alias
->decl
)
1125 && (DECL_COMDAT_GROUP (alias
->decl
)
1126 != DECL_COMDAT_GROUP (original
->decl
)))
1128 if (dump_enabled_p ())
1129 dump_printf (MSG_MISSED_OPTIMIZATION
,
1130 "Wrapper cannot be created because of COMDAT\n");
1132 else if (DECL_STATIC_CHAIN (alias
->decl
)
1133 || DECL_STATIC_CHAIN (original
->decl
))
1135 if (dump_enabled_p ())
1136 dump_printf (MSG_MISSED_OPTIMIZATION
,
1137 "Cannot create wrapper of nested function.\n");
1139 /* TODO: We can also deal with variadic functions never calling
1141 else if (stdarg_p (TREE_TYPE (alias
->decl
)))
1143 if (dump_enabled_p ())
1144 dump_printf (MSG_MISSED_OPTIMIZATION
,
1145 "cannot create wrapper of stdarg function.\n");
1147 else if (ipa_fn_summaries
1148 && ipa_size_summaries
->get (alias
) != NULL
1149 && ipa_size_summaries
->get (alias
)->self_size
<= 2)
1151 if (dump_enabled_p ())
1152 dump_printf (MSG_MISSED_OPTIMIZATION
, "Wrapper creation is not "
1153 "profitable (function is too small).\n");
1155 /* If user paid attention to mark function noinline, assume it is
1156 somewhat special and do not try to turn it into a wrapper that
1157 cannot be undone by inliner. */
1158 else if (lookup_attribute ("noinline", DECL_ATTRIBUTES (alias
->decl
)))
1160 if (dump_enabled_p ())
1161 dump_printf (MSG_MISSED_OPTIMIZATION
,
1162 "Wrappers are not created for noinline.\n");
1165 create_wrapper
= true;
1167 /* We can redirect local calls in the case both alias and original
1168 are not interposable. */
1170 = alias
->get_availability () > AVAIL_INTERPOSABLE
1171 && original
->get_availability () > AVAIL_INTERPOSABLE
;
1172 /* TODO: We can redirect, but we need to produce alias of ORIGINAL
1173 with proper properties. */
1174 if (!sem_item::compare_referenced_symbol_properties (NULL
, original
, alias
,
1175 alias
->address_taken
))
1176 redirect_callers
= false;
1178 if (!redirect_callers
&& !create_wrapper
)
1180 if (dump_enabled_p ())
1181 dump_printf (MSG_MISSED_OPTIMIZATION
,
1182 "Not unifying; cannot redirect callers nor "
1183 "produce wrapper\n");
1187 /* Work out the symbol the wrapper should call.
1188 If ORIGINAL is interposable, we need to call a local alias.
1189 Also produce local alias (if possible) as an optimization.
1191 Local aliases cannot be created inside comdat groups because that
1192 prevents inlining. */
1193 if (!original_discardable
&& !original
->get_comdat_group ())
1196 = dyn_cast
<cgraph_node
*> (original
->noninterposable_alias ());
1198 && original
->get_availability () > AVAIL_INTERPOSABLE
)
1199 local_original
= original
;
1201 /* If we cannot use local alias, fallback to the original
1203 else if (original
->get_availability () > AVAIL_INTERPOSABLE
)
1204 local_original
= original
;
1206 /* If original is COMDAT local, we cannot really redirect calls outside
1207 of its comdat group to it. */
1208 if (original
->comdat_local_p ())
1209 redirect_callers
= false;
1210 if (!local_original
)
1212 if (dump_enabled_p ())
1213 dump_printf (MSG_MISSED_OPTIMIZATION
,
1214 "Not unifying; cannot produce local alias.\n");
1218 if (!redirect_callers
&& !create_wrapper
)
1220 if (dump_enabled_p ())
1221 dump_printf (MSG_MISSED_OPTIMIZATION
,
1223 "cannot redirect callers nor produce a wrapper\n");
1227 && !alias
->call_for_symbol_and_aliases (cgraph_node::has_thunk_p
,
1229 && !alias
->can_remove_if_no_direct_calls_p ())
1231 if (dump_enabled_p ())
1232 dump_printf (MSG_MISSED_OPTIMIZATION
,
1233 "Not unifying; cannot make wrapper and "
1234 "function has other uses than direct calls\n");
1239 create_alias
= true;
1241 if (redirect_callers
)
1243 int nredirected
= redirect_all_callers (alias
, local_original
);
1247 alias
->icf_merged
= true;
1248 local_original
->icf_merged
= true;
1250 if (dump_enabled_p ())
1251 dump_printf (MSG_NOTE
,
1252 "%i local calls have been "
1253 "redirected.\n", nredirected
);
1256 /* If all callers was redirected, do not produce wrapper. */
1257 if (alias
->can_remove_if_no_direct_calls_p ()
1258 && !DECL_VIRTUAL_P (alias
->decl
)
1259 && !alias
->has_aliases_p ())
1261 create_wrapper
= false;
1264 gcc_assert (!create_alias
);
1266 else if (create_alias
)
1268 alias
->icf_merged
= true;
1270 /* Remove the function's body. */
1271 ipa_merge_profiles (original
, alias
);
1272 symtab
->call_cgraph_removal_hooks (alias
);
1273 alias
->release_body (true);
1275 /* Notice global symbol possibly produced RTL. */
1276 ((symtab_node
*)alias
)->call_for_symbol_and_aliases (clear_decl_rtl
,
1279 /* Create the alias. */
1280 cgraph_node::create_alias (alias_func
->decl
, decl
);
1281 alias
->resolve_alias (original
);
1283 original
->call_for_symbol_thunks_and_aliases
1284 (set_local
, (void *)(size_t) original
->local_p (), true);
1286 if (dump_enabled_p ())
1287 dump_printf (MSG_OPTIMIZED_LOCATIONS
,
1288 "Unified; Function alias has been created.\n");
1292 gcc_assert (!create_alias
);
1293 alias
->icf_merged
= true;
1294 symtab
->call_cgraph_removal_hooks (alias
);
1295 local_original
->icf_merged
= true;
1297 /* FIXME update local_original counts. */
1298 ipa_merge_profiles (original
, alias
, true);
1299 alias
->create_wrapper (local_original
);
1300 symtab
->call_cgraph_insertion_hooks (alias
);
1302 if (dump_enabled_p ())
1303 dump_printf (MSG_OPTIMIZED_LOCATIONS
,
1304 "Unified; Wrapper has been created.\n");
1307 /* It's possible that redirection can hit thunks that block
1308 redirection opportunities. */
1309 gcc_assert (alias
->icf_merged
|| remove
|| redirect_callers
);
1310 original
->icf_merged
= true;
1312 /* We use merged flag to track cases where COMDAT function is known to be
1313 compatible its callers. If we merged in non-COMDAT, we need to give up
1314 on this optimization. */
1315 if (original
->merged_comdat
&& !alias
->merged_comdat
)
1317 if (dump_enabled_p ())
1318 dump_printf (MSG_NOTE
, "Dropping merged_comdat flag.\n");
1320 local_original
->merged_comdat
= false;
1321 original
->merged_comdat
= false;
1326 ipa_merge_profiles (original
, alias
);
1327 alias
->release_body ();
1329 alias
->body_removed
= true;
1330 alias
->icf_merged
= true;
1331 if (dump_enabled_p ())
1332 dump_printf (MSG_OPTIMIZED_LOCATIONS
,
1333 "Unified; Function body was removed.\n");
1339 /* Semantic item initialization function. */
1342 sem_function::init (ipa_icf_gimple::func_checker
*checker
)
1344 m_checker
= checker
;
1346 get_node ()->get_untransformed_body ();
1348 tree fndecl
= node
->decl
;
1349 function
*func
= DECL_STRUCT_FUNCTION (fndecl
);
1352 gcc_assert (SSANAMES (func
));
1354 ssa_names_size
= SSANAMES (func
)->length ();
1358 region_tree
= func
->eh
->region_tree
;
1360 /* iterating all function arguments. */
1361 arg_count
= count_formal_params (fndecl
);
1363 edge_count
= n_edges_for_fn (func
);
1364 cgraph_node
*cnode
= dyn_cast
<cgraph_node
*> (node
);
1365 if (!cnode
->thunk
.thunk_p
)
1367 cfg_checksum
= coverage_compute_cfg_checksum (func
);
1369 inchash::hash hstate
;
1372 FOR_EACH_BB_FN (bb
, func
)
1374 unsigned nondbg_stmt_count
= 0;
1377 for (edge_iterator ei
= ei_start (bb
->preds
); ei_cond (ei
, &e
);
1379 cfg_checksum
= iterative_hash_host_wide_int (e
->flags
,
1382 for (gimple_stmt_iterator gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
);
1385 gimple
*stmt
= gsi_stmt (gsi
);
1387 if (gimple_code (stmt
) != GIMPLE_DEBUG
1388 && gimple_code (stmt
) != GIMPLE_PREDICT
)
1390 hash_stmt (stmt
, hstate
);
1391 nondbg_stmt_count
++;
1395 hstate
.commit_flag ();
1396 gcode_hash
= hstate
.end ();
1397 bb_sizes
.safe_push (nondbg_stmt_count
);
1399 /* Inserting basic block to hash table. */
1400 sem_bb
*semantic_bb
= new sem_bb (bb
, nondbg_stmt_count
,
1401 EDGE_COUNT (bb
->preds
)
1402 + EDGE_COUNT (bb
->succs
));
1404 bb_sorted
.safe_push (semantic_bb
);
1410 inchash::hash hstate
;
1411 hstate
.add_hwi (cnode
->thunk
.fixed_offset
);
1412 hstate
.add_hwi (cnode
->thunk
.virtual_value
);
1413 hstate
.add_flag (cnode
->thunk
.this_adjusting
);
1414 hstate
.add_flag (cnode
->thunk
.virtual_offset_p
);
1415 gcode_hash
= hstate
.end ();
1421 /* Improve accumulated hash for HSTATE based on a gimple statement STMT. */
1424 sem_function::hash_stmt (gimple
*stmt
, inchash::hash
&hstate
)
1426 enum gimple_code code
= gimple_code (stmt
);
1428 hstate
.add_int (code
);
1433 m_checker
->hash_operand (gimple_switch_index (as_a
<gswitch
*> (stmt
)),
1437 hstate
.add_int (gimple_assign_rhs_code (stmt
));
1438 if (commutative_tree_code (gimple_assign_rhs_code (stmt
))
1439 || commutative_ternary_tree_code (gimple_assign_rhs_code (stmt
)))
1441 m_checker
->hash_operand (gimple_assign_rhs1 (stmt
), hstate
, 0);
1442 m_checker
->hash_operand (gimple_assign_rhs2 (stmt
), hstate
, 0);
1443 if (commutative_ternary_tree_code (gimple_assign_rhs_code (stmt
)))
1444 m_checker
->hash_operand (gimple_assign_rhs3 (stmt
), hstate
, 0);
1445 m_checker
->hash_operand (gimple_assign_lhs (stmt
), hstate
, 0);
1453 /* All these statements are equivalent if their operands are. */
1454 for (unsigned i
= 0; i
< gimple_num_ops (stmt
); ++i
)
1455 m_checker
->hash_operand (gimple_op (stmt
, i
), hstate
, 0);
1456 /* Consider nocf_check attribute in hash as it affects code
1458 if (code
== GIMPLE_CALL
1459 && flag_cf_protection
& CF_BRANCH
)
1460 hstate
.add_flag (gimple_call_nocf_check_p (as_a
<gcall
*> (stmt
)));
1467 /* Return true if polymorphic comparison must be processed. */
1470 sem_function::compare_polymorphic_p (void)
1472 struct cgraph_edge
*e
;
1474 if (!opt_for_fn (get_node ()->decl
, flag_devirtualize
))
1476 if (get_node ()->indirect_calls
!= NULL
)
1478 /* TODO: We can do simple propagation determining what calls may lead to
1479 a polymorphic call. */
1480 for (e
= get_node ()->callees
; e
; e
= e
->next_callee
)
1481 if (e
->callee
->definition
1482 && opt_for_fn (e
->callee
->decl
, flag_devirtualize
))
1487 /* For a given call graph NODE, the function constructs new
1488 semantic function item. */
1491 sem_function::parse (cgraph_node
*node
, bitmap_obstack
*stack
,
1492 func_checker
*checker
)
1494 tree fndecl
= node
->decl
;
1495 function
*func
= DECL_STRUCT_FUNCTION (fndecl
);
1497 if (!func
|| (!node
->has_gimple_body_p () && !node
->thunk
.thunk_p
))
1500 if (lookup_attribute_by_prefix ("omp ", DECL_ATTRIBUTES (node
->decl
)) != NULL
)
1503 if (lookup_attribute_by_prefix ("oacc ",
1504 DECL_ATTRIBUTES (node
->decl
)) != NULL
)
1508 if (DECL_STATIC_CONSTRUCTOR (node
->decl
)
1509 || DECL_STATIC_DESTRUCTOR (node
->decl
))
1512 sem_function
*f
= new sem_function (node
, stack
);
1518 /* For given basic blocks BB1 and BB2 (from functions FUNC1 and FUNC),
1519 return true if phi nodes are semantically equivalent in these blocks . */
1522 sem_function::compare_phi_node (basic_block bb1
, basic_block bb2
)
1524 gphi_iterator si1
, si2
;
1526 unsigned size1
, size2
, i
;
1530 gcc_assert (bb1
!= NULL
);
1531 gcc_assert (bb2
!= NULL
);
1533 si2
= gsi_start_nonvirtual_phis (bb2
);
1534 for (si1
= gsi_start_nonvirtual_phis (bb1
); !gsi_end_p (si1
);
1535 gsi_next_nonvirtual_phi (&si1
))
1537 if (gsi_end_p (si1
) && gsi_end_p (si2
))
1540 if (gsi_end_p (si1
) || gsi_end_p (si2
))
1541 return return_false();
1546 tree phi_result1
= gimple_phi_result (phi1
);
1547 tree phi_result2
= gimple_phi_result (phi2
);
1549 if (!m_checker
->compare_operand (phi_result1
, phi_result2
))
1550 return return_false_with_msg ("PHI results are different");
1552 size1
= gimple_phi_num_args (phi1
);
1553 size2
= gimple_phi_num_args (phi2
);
1556 return return_false ();
1558 for (i
= 0; i
< size1
; ++i
)
1560 t1
= gimple_phi_arg (phi1
, i
)->def
;
1561 t2
= gimple_phi_arg (phi2
, i
)->def
;
1563 if (!m_checker
->compare_operand (t1
, t2
))
1564 return return_false ();
1566 e1
= gimple_phi_arg_edge (phi1
, i
);
1567 e2
= gimple_phi_arg_edge (phi2
, i
);
1569 if (!m_checker
->compare_edge (e1
, e2
))
1570 return return_false ();
1573 gsi_next_nonvirtual_phi (&si2
);
1579 /* Basic blocks dictionary BB_DICT returns true if SOURCE index BB
1580 corresponds to TARGET. */
1583 sem_function::bb_dict_test (vec
<int> *bb_dict
, int source
, int target
)
1588 if (bb_dict
->length () <= (unsigned)source
)
1589 bb_dict
->safe_grow_cleared (source
+ 1, true);
1591 if ((*bb_dict
)[source
] == 0)
1593 (*bb_dict
)[source
] = target
;
1597 return (*bb_dict
)[source
] == target
;
1600 sem_variable::sem_variable (bitmap_obstack
*stack
): sem_item (VAR
, stack
)
1604 sem_variable::sem_variable (varpool_node
*node
, bitmap_obstack
*stack
)
1605 : sem_item (VAR
, node
, stack
)
1607 gcc_checking_assert (node
);
1608 gcc_checking_assert (get_node ());
1611 /* Fast equality function based on knowledge known in WPA. */
1614 sem_variable::equals_wpa (sem_item
*item
,
1615 hash_map
<symtab_node
*, sem_item
*> &ignored_nodes
)
1617 gcc_assert (item
->type
== VAR
);
1619 if (node
->num_references () != item
->node
->num_references ())
1620 return return_false_with_msg ("different number of references");
1622 if (DECL_TLS_MODEL (decl
) || DECL_TLS_MODEL (item
->decl
))
1623 return return_false_with_msg ("TLS model");
1625 /* DECL_ALIGN is safe to merge, because we will always chose the largest
1626 alignment out of all aliases. */
1628 if (DECL_VIRTUAL_P (decl
) != DECL_VIRTUAL_P (item
->decl
))
1629 return return_false_with_msg ("Virtual flag mismatch");
1631 if (DECL_SIZE (decl
) != DECL_SIZE (item
->decl
)
1632 && ((!DECL_SIZE (decl
) || !DECL_SIZE (item
->decl
))
1633 || !operand_equal_p (DECL_SIZE (decl
),
1634 DECL_SIZE (item
->decl
), OEP_ONLY_CONST
)))
1635 return return_false_with_msg ("size mismatch");
1637 /* Do not attempt to mix data from different user sections;
1638 we do not know what user intends with those. */
1639 if (((DECL_SECTION_NAME (decl
) && !node
->implicit_section
)
1640 || (DECL_SECTION_NAME (item
->decl
) && !item
->node
->implicit_section
))
1641 && DECL_SECTION_NAME (decl
) != DECL_SECTION_NAME (item
->decl
))
1642 return return_false_with_msg ("user section mismatch");
1644 if (DECL_IN_TEXT_SECTION (decl
) != DECL_IN_TEXT_SECTION (item
->decl
))
1645 return return_false_with_msg ("text section");
1647 ipa_ref
*ref
= NULL
, *ref2
= NULL
;
1648 for (unsigned i
= 0; node
->iterate_reference (i
, ref
); i
++)
1650 item
->node
->iterate_reference (i
, ref2
);
1652 if (ref
->use
!= ref2
->use
)
1653 return return_false_with_msg ("reference use mismatch");
1655 if (!compare_symbol_references (ignored_nodes
,
1656 ref
->referred
, ref2
->referred
,
1657 ref
->address_matters_p ()))
1664 /* Returns true if the item equals to ITEM given as argument. */
1667 sem_variable::equals (sem_item
*item
,
1668 hash_map
<symtab_node
*, sem_item
*> &)
1670 gcc_assert (item
->type
== VAR
);
1673 if (DECL_INITIAL (decl
) == error_mark_node
&& in_lto_p
)
1674 dyn_cast
<varpool_node
*>(node
)->get_constructor ();
1675 if (DECL_INITIAL (item
->decl
) == error_mark_node
&& in_lto_p
)
1676 dyn_cast
<varpool_node
*>(item
->node
)->get_constructor ();
1678 /* As seen in PR ipa/65303 we have to compare variables types. */
1679 if (!func_checker::compatible_types_p (TREE_TYPE (decl
),
1680 TREE_TYPE (item
->decl
)))
1681 return return_false_with_msg ("variables types are different");
1683 ret
= sem_variable::equals (DECL_INITIAL (decl
),
1684 DECL_INITIAL (item
->node
->decl
));
1685 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1687 "Equals called for vars: %s:%s with result: %s\n\n",
1688 node
->dump_name (), item
->node
->dump_name (),
1689 ret
? "true" : "false");
1694 /* Compares trees T1 and T2 for semantic equality. */
1697 sem_variable::equals (tree t1
, tree t2
)
1700 return return_with_debug (t1
== t2
);
1703 tree_code tc1
= TREE_CODE (t1
);
1704 tree_code tc2
= TREE_CODE (t2
);
1707 return return_false_with_msg ("TREE_CODE mismatch");
1713 vec
<constructor_elt
, va_gc
> *v1
, *v2
;
1714 unsigned HOST_WIDE_INT idx
;
1716 enum tree_code typecode
= TREE_CODE (TREE_TYPE (t1
));
1717 if (typecode
!= TREE_CODE (TREE_TYPE (t2
)))
1718 return return_false_with_msg ("constructor type mismatch");
1720 if (typecode
== ARRAY_TYPE
)
1722 HOST_WIDE_INT size_1
= int_size_in_bytes (TREE_TYPE (t1
));
1723 /* For arrays, check that the sizes all match. */
1724 if (TYPE_MODE (TREE_TYPE (t1
)) != TYPE_MODE (TREE_TYPE (t2
))
1726 || size_1
!= int_size_in_bytes (TREE_TYPE (t2
)))
1727 return return_false_with_msg ("constructor array size mismatch");
1729 else if (!func_checker::compatible_types_p (TREE_TYPE (t1
),
1731 return return_false_with_msg ("constructor type incompatible");
1733 v1
= CONSTRUCTOR_ELTS (t1
);
1734 v2
= CONSTRUCTOR_ELTS (t2
);
1735 if (vec_safe_length (v1
) != vec_safe_length (v2
))
1736 return return_false_with_msg ("constructor number of elts mismatch");
1738 for (idx
= 0; idx
< vec_safe_length (v1
); ++idx
)
1740 constructor_elt
*c1
= &(*v1
)[idx
];
1741 constructor_elt
*c2
= &(*v2
)[idx
];
1743 /* Check that each value is the same... */
1744 if (!sem_variable::equals (c1
->value
, c2
->value
))
1746 /* ... and that they apply to the same fields! */
1747 if (!sem_variable::equals (c1
->index
, c2
->index
))
1754 tree x1
= TREE_OPERAND (t1
, 0);
1755 tree x2
= TREE_OPERAND (t2
, 0);
1756 tree y1
= TREE_OPERAND (t1
, 1);
1757 tree y2
= TREE_OPERAND (t2
, 1);
1759 if (!func_checker::compatible_types_p (TREE_TYPE (x1
), TREE_TYPE (x2
)))
1760 return return_false ();
1762 /* Type of the offset on MEM_REF does not matter. */
1763 return return_with_debug (sem_variable::equals (x1
, x2
)
1764 && known_eq (wi::to_poly_offset (y1
),
1765 wi::to_poly_offset (y2
)));
1770 tree op1
= TREE_OPERAND (t1
, 0);
1771 tree op2
= TREE_OPERAND (t2
, 0);
1772 return sem_variable::equals (op1
, op2
);
1774 /* References to other vars/decls are compared using ipa-ref. */
1777 if (decl_in_symtab_p (t1
) && decl_in_symtab_p (t2
))
1779 return return_false_with_msg ("Declaration mismatch");
1781 /* TODO: We can check CONST_DECL by its DECL_INITIAL, but for that we
1782 need to process its VAR/FUNCTION references without relying on ipa-ref
1786 return return_false_with_msg ("Declaration mismatch");
1788 /* Integer constants are the same only if the same width of type. */
1789 if (TYPE_PRECISION (TREE_TYPE (t1
)) != TYPE_PRECISION (TREE_TYPE (t2
)))
1790 return return_false_with_msg ("INTEGER_CST precision mismatch");
1791 if (TYPE_MODE (TREE_TYPE (t1
)) != TYPE_MODE (TREE_TYPE (t2
)))
1792 return return_false_with_msg ("INTEGER_CST mode mismatch");
1793 return return_with_debug (tree_int_cst_equal (t1
, t2
));
1795 if (TYPE_MODE (TREE_TYPE (t1
)) != TYPE_MODE (TREE_TYPE (t2
)))
1796 return return_false_with_msg ("STRING_CST mode mismatch");
1797 if (TREE_STRING_LENGTH (t1
) != TREE_STRING_LENGTH (t2
))
1798 return return_false_with_msg ("STRING_CST length mismatch");
1799 if (memcmp (TREE_STRING_POINTER (t1
), TREE_STRING_POINTER (t2
),
1800 TREE_STRING_LENGTH (t1
)))
1801 return return_false_with_msg ("STRING_CST mismatch");
1804 /* Fixed constants are the same only if the same width of type. */
1805 if (TYPE_PRECISION (TREE_TYPE (t1
)) != TYPE_PRECISION (TREE_TYPE (t2
)))
1806 return return_false_with_msg ("FIXED_CST precision mismatch");
1808 return return_with_debug (FIXED_VALUES_IDENTICAL (TREE_FIXED_CST (t1
),
1809 TREE_FIXED_CST (t2
)));
1811 return (sem_variable::equals (TREE_REALPART (t1
), TREE_REALPART (t2
))
1812 && sem_variable::equals (TREE_IMAGPART (t1
), TREE_IMAGPART (t2
)));
1814 /* Real 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 ("REAL_CST precision mismatch");
1817 return return_with_debug (real_identical (&TREE_REAL_CST (t1
),
1818 &TREE_REAL_CST (t2
)));
1821 if (maybe_ne (VECTOR_CST_NELTS (t1
), VECTOR_CST_NELTS (t2
)))
1822 return return_false_with_msg ("VECTOR_CST nelts mismatch");
1825 = tree_vector_builder::binary_encoded_nelts (t1
, t2
);
1826 for (unsigned int i
= 0; i
< count
; ++i
)
1827 if (!sem_variable::equals (VECTOR_CST_ENCODED_ELT (t1
, i
),
1828 VECTOR_CST_ENCODED_ELT (t2
, i
)))
1834 case ARRAY_RANGE_REF
:
1836 tree x1
= TREE_OPERAND (t1
, 0);
1837 tree x2
= TREE_OPERAND (t2
, 0);
1838 tree y1
= TREE_OPERAND (t1
, 1);
1839 tree y2
= TREE_OPERAND (t2
, 1);
1841 if (!sem_variable::equals (x1
, x2
) || !sem_variable::equals (y1
, y2
))
1843 if (!sem_variable::equals (array_ref_low_bound (t1
),
1844 array_ref_low_bound (t2
)))
1846 if (!sem_variable::equals (array_ref_element_size (t1
),
1847 array_ref_element_size (t2
)))
1853 case POINTER_PLUS_EXPR
:
1858 tree x1
= TREE_OPERAND (t1
, 0);
1859 tree x2
= TREE_OPERAND (t2
, 0);
1860 tree y1
= TREE_OPERAND (t1
, 1);
1861 tree y2
= TREE_OPERAND (t2
, 1);
1863 return sem_variable::equals (x1
, x2
) && sem_variable::equals (y1
, y2
);
1867 case VIEW_CONVERT_EXPR
:
1868 if (!func_checker::compatible_types_p (TREE_TYPE (t1
), TREE_TYPE (t2
)))
1869 return return_false ();
1870 return sem_variable::equals (TREE_OPERAND (t1
, 0), TREE_OPERAND (t2
, 0));
1872 return return_false_with_msg ("ERROR_MARK");
1874 return return_false_with_msg ("Unknown TREE code reached");
1878 /* Parser function that visits a varpool NODE. */
1881 sem_variable::parse (varpool_node
*node
, bitmap_obstack
*stack
,
1882 func_checker
*checker
)
1884 if (TREE_THIS_VOLATILE (node
->decl
) || DECL_HARD_REGISTER (node
->decl
)
1888 sem_variable
*v
= new sem_variable (node
, stack
);
1894 /* Semantic variable initialization function. */
1897 sem_variable::init (ipa_icf_gimple::func_checker
*checker
)
1899 decl
= get_node ()->decl
;
1901 /* All WPA streamed in symbols should have their hashes computed at compile
1902 time. At this point, the constructor may not be in memory at all.
1903 DECL_INITIAL (decl) would be error_mark_node in that case. */
1906 gcc_assert (!node
->lto_file_data
);
1907 inchash::hash hstate
;
1908 hstate
.add_int (456346417);
1909 checker
->hash_operand (DECL_INITIAL (decl
), hstate
, 0);
1910 set_hash (hstate
.end ());
1914 /* References independent hash function. */
1917 sem_variable::get_hash (void)
1919 gcc_checking_assert (m_hash_set
);
1923 /* Merges instance with an ALIAS_ITEM, where alias, thunk or redirection can
1927 sem_variable::merge (sem_item
*alias_item
)
1929 gcc_assert (alias_item
->type
== VAR
);
1931 AUTO_DUMP_SCOPE ("merge",
1932 dump_user_location_t::from_function_decl (decl
));
1933 if (!sem_item::target_supports_symbol_aliases_p ())
1935 if (dump_enabled_p ())
1936 dump_printf (MSG_MISSED_OPTIMIZATION
, "Not unifying; "
1937 "Symbol aliases are not supported by target\n");
1941 if (DECL_EXTERNAL (alias_item
->decl
))
1943 if (dump_enabled_p ())
1944 dump_printf (MSG_MISSED_OPTIMIZATION
,
1945 "Not unifying; alias is external.\n");
1949 sem_variable
*alias_var
= static_cast<sem_variable
*> (alias_item
);
1951 varpool_node
*original
= get_node ();
1952 varpool_node
*alias
= alias_var
->get_node ();
1953 bool original_discardable
= false;
1955 bool alias_address_matters
= alias
->address_matters_p ();
1957 /* See if original is in a section that can be discarded if the main
1959 Also consider case where we have resolution info and we know that
1960 original's definition is not going to be used. In this case we cannot
1961 create alias to original. */
1962 if (original
->can_be_discarded_p ()
1963 || (node
->resolution
!= LDPR_UNKNOWN
1964 && !decl_binds_to_current_def_p (node
->decl
)))
1965 original_discardable
= true;
1967 gcc_assert (!TREE_ASM_WRITTEN (alias
->decl
));
1969 /* Constant pool machinery is not quite ready for aliases.
1970 TODO: varasm code contains logic for merging DECL_IN_CONSTANT_POOL.
1971 For LTO merging does not happen that is an important missing feature.
1972 We can enable merging with LTO if the DECL_IN_CONSTANT_POOL
1973 flag is dropped and non-local symbol name is assigned. */
1974 if (DECL_IN_CONSTANT_POOL (alias
->decl
)
1975 || DECL_IN_CONSTANT_POOL (original
->decl
))
1977 if (dump_enabled_p ())
1978 dump_printf (MSG_MISSED_OPTIMIZATION
,
1979 "Not unifying; constant pool variables.\n");
1983 /* Do not attempt to mix functions from different user sections;
1984 we do not know what user intends with those. */
1985 if (((DECL_SECTION_NAME (original
->decl
) && !original
->implicit_section
)
1986 || (DECL_SECTION_NAME (alias
->decl
) && !alias
->implicit_section
))
1987 && DECL_SECTION_NAME (original
->decl
) != DECL_SECTION_NAME (alias
->decl
))
1989 if (dump_enabled_p ())
1990 dump_printf (MSG_MISSED_OPTIMIZATION
,
1992 "original and alias are in different sections.\n");
1996 /* We cannot merge if address comparison matters. */
1997 if (alias_address_matters
&& flag_merge_constants
< 2)
1999 if (dump_enabled_p ())
2000 dump_printf (MSG_MISSED_OPTIMIZATION
,
2001 "Not unifying; address of original may be compared.\n");
2005 if (DECL_ALIGN (original
->decl
) < DECL_ALIGN (alias
->decl
))
2007 if (dump_enabled_p ())
2008 dump_printf (MSG_MISSED_OPTIMIZATION
,
2010 "original and alias have incompatible alignments\n");
2015 if (DECL_COMDAT_GROUP (original
->decl
) != DECL_COMDAT_GROUP (alias
->decl
))
2017 if (dump_enabled_p ())
2018 dump_printf (MSG_MISSED_OPTIMIZATION
,
2019 "Not unifying; alias cannot be created; "
2020 "across comdat group boundary\n");
2025 if (original_discardable
)
2027 if (dump_enabled_p ())
2028 dump_printf (MSG_MISSED_OPTIMIZATION
,
2029 "Not unifying; alias cannot be created; "
2030 "target is discardable\n");
2036 gcc_assert (!original
->alias
);
2037 gcc_assert (!alias
->alias
);
2039 alias
->analyzed
= false;
2041 DECL_INITIAL (alias
->decl
) = NULL
;
2042 ((symtab_node
*)alias
)->call_for_symbol_and_aliases (clear_decl_rtl
,
2044 alias
->remove_all_references ();
2045 if (TREE_ADDRESSABLE (alias
->decl
))
2046 original
->call_for_symbol_and_aliases (set_addressable
, NULL
, true);
2048 varpool_node::create_alias (alias_var
->decl
, decl
);
2049 alias
->resolve_alias (original
);
2051 if (dump_enabled_p ())
2052 dump_printf (MSG_OPTIMIZED_LOCATIONS
,
2053 "Unified; Variable alias has been created.\n");
2059 /* Dump symbol to FILE. */
2062 sem_variable::dump_to_file (FILE *file
)
2066 print_node (file
, "", decl
, 0);
2067 fprintf (file
, "\n\n");
2070 unsigned int sem_item_optimizer::class_id
= 0;
2072 sem_item_optimizer::sem_item_optimizer ()
2073 : worklist (0), m_classes (0), m_classes_count (0), m_cgraph_node_hooks (NULL
),
2074 m_varpool_node_hooks (NULL
), m_merged_variables (), m_references ()
2077 bitmap_obstack_initialize (&m_bmstack
);
2080 sem_item_optimizer::~sem_item_optimizer ()
2082 for (unsigned int i
= 0; i
< m_items
.length (); i
++)
2086 for (hash_table
<congruence_class_hash
>::iterator it
= m_classes
.begin ();
2087 it
!= m_classes
.end (); ++it
)
2089 for (unsigned int i
= 0; i
< (*it
)->classes
.length (); i
++)
2090 delete (*it
)->classes
[i
];
2092 (*it
)->classes
.release ();
2098 bitmap_obstack_release (&m_bmstack
);
2099 m_merged_variables
.release ();
2102 /* Write IPA ICF summary for symbols. */
2105 sem_item_optimizer::write_summary (void)
2107 unsigned int count
= 0;
2109 output_block
*ob
= create_output_block (LTO_section_ipa_icf
);
2110 lto_symtab_encoder_t encoder
= ob
->decl_state
->symtab_node_encoder
;
2113 /* Calculate number of symbols to be serialized. */
2114 for (lto_symtab_encoder_iterator lsei
= lsei_start_in_partition (encoder
);
2116 lsei_next_in_partition (&lsei
))
2118 symtab_node
*node
= lsei_node (lsei
);
2120 if (m_symtab_node_map
.get (node
))
2124 streamer_write_uhwi (ob
, count
);
2126 /* Process all of the symbols. */
2127 for (lto_symtab_encoder_iterator lsei
= lsei_start_in_partition (encoder
);
2129 lsei_next_in_partition (&lsei
))
2131 symtab_node
*node
= lsei_node (lsei
);
2133 sem_item
**item
= m_symtab_node_map
.get (node
);
2137 int node_ref
= lto_symtab_encoder_encode (encoder
, node
);
2138 streamer_write_uhwi_stream (ob
->main_stream
, node_ref
);
2140 streamer_write_uhwi (ob
, (*item
)->get_hash ());
2144 streamer_write_char_stream (ob
->main_stream
, 0);
2145 produce_asm (ob
, NULL
);
2146 destroy_output_block (ob
);
2149 /* Reads a section from LTO stream file FILE_DATA. Input block for DATA
2150 contains LEN bytes. */
2153 sem_item_optimizer::read_section (lto_file_decl_data
*file_data
,
2154 const char *data
, size_t len
)
2156 const lto_function_header
*header
2157 = (const lto_function_header
*) data
;
2158 const int cfg_offset
= sizeof (lto_function_header
);
2159 const int main_offset
= cfg_offset
+ header
->cfg_size
;
2160 const int string_offset
= main_offset
+ header
->main_size
;
2165 lto_input_block
ib_main ((const char *) data
+ main_offset
, 0,
2166 header
->main_size
, file_data
->mode_table
);
2169 = lto_data_in_create (file_data
, (const char *) data
+ string_offset
,
2170 header
->string_size
, vNULL
);
2172 count
= streamer_read_uhwi (&ib_main
);
2174 for (i
= 0; i
< count
; i
++)
2178 lto_symtab_encoder_t encoder
;
2180 index
= streamer_read_uhwi (&ib_main
);
2181 encoder
= file_data
->symtab_node_encoder
;
2182 node
= lto_symtab_encoder_deref (encoder
, index
);
2184 hashval_t hash
= streamer_read_uhwi (&ib_main
);
2185 gcc_assert (node
->definition
);
2187 if (is_a
<cgraph_node
*> (node
))
2189 cgraph_node
*cnode
= dyn_cast
<cgraph_node
*> (node
);
2191 sem_function
*fn
= new sem_function (cnode
, &m_bmstack
);
2192 fn
->set_hash (hash
);
2193 m_items
.safe_push (fn
);
2197 varpool_node
*vnode
= dyn_cast
<varpool_node
*> (node
);
2199 sem_variable
*var
= new sem_variable (vnode
, &m_bmstack
);
2200 var
->set_hash (hash
);
2201 m_items
.safe_push (var
);
2205 lto_free_section_data (file_data
, LTO_section_ipa_icf
, NULL
, data
,
2207 lto_data_in_delete (data_in
);
2210 /* Read IPA ICF summary for symbols. */
2213 sem_item_optimizer::read_summary (void)
2215 lto_file_decl_data
**file_data_vec
= lto_get_file_decl_data ();
2216 lto_file_decl_data
*file_data
;
2219 while ((file_data
= file_data_vec
[j
++]))
2223 = lto_get_summary_section_data (file_data
, LTO_section_ipa_icf
, &len
);
2225 read_section (file_data
, data
, len
);
2229 /* Register callgraph and varpool hooks. */
2232 sem_item_optimizer::register_hooks (void)
2234 if (!m_cgraph_node_hooks
)
2235 m_cgraph_node_hooks
= symtab
->add_cgraph_removal_hook
2236 (&sem_item_optimizer::cgraph_removal_hook
, this);
2238 if (!m_varpool_node_hooks
)
2239 m_varpool_node_hooks
= symtab
->add_varpool_removal_hook
2240 (&sem_item_optimizer::varpool_removal_hook
, this);
2243 /* Unregister callgraph and varpool hooks. */
2246 sem_item_optimizer::unregister_hooks (void)
2248 if (m_cgraph_node_hooks
)
2249 symtab
->remove_cgraph_removal_hook (m_cgraph_node_hooks
);
2251 if (m_varpool_node_hooks
)
2252 symtab
->remove_varpool_removal_hook (m_varpool_node_hooks
);
2255 /* Adds a CLS to hashtable associated by hash value. */
2258 sem_item_optimizer::add_class (congruence_class
*cls
)
2260 gcc_assert (cls
->members
.length ());
2262 congruence_class_group
*group
2263 = get_group_by_hash (cls
->members
[0]->get_hash (),
2264 cls
->members
[0]->type
);
2265 group
->classes
.safe_push (cls
);
2268 /* Gets a congruence class group based on given HASH value and TYPE. */
2270 congruence_class_group
*
2271 sem_item_optimizer::get_group_by_hash (hashval_t hash
, sem_item_type type
)
2273 congruence_class_group
*item
= XNEW (congruence_class_group
);
2277 congruence_class_group
**slot
= m_classes
.find_slot (item
, INSERT
);
2283 item
->classes
.create (1);
2290 /* Callgraph removal hook called for a NODE with a custom DATA. */
2293 sem_item_optimizer::cgraph_removal_hook (cgraph_node
*node
, void *data
)
2295 sem_item_optimizer
*optimizer
= (sem_item_optimizer
*) data
;
2296 optimizer
->remove_symtab_node (node
);
2299 /* Varpool removal hook called for a NODE with a custom DATA. */
2302 sem_item_optimizer::varpool_removal_hook (varpool_node
*node
, void *data
)
2304 sem_item_optimizer
*optimizer
= (sem_item_optimizer
*) data
;
2305 optimizer
->remove_symtab_node (node
);
2308 /* Remove symtab NODE triggered by symtab removal hooks. */
2311 sem_item_optimizer::remove_symtab_node (symtab_node
*node
)
2313 gcc_assert (m_classes
.is_empty ());
2315 m_removed_items_set
.add (node
);
2319 sem_item_optimizer::remove_item (sem_item
*item
)
2321 if (m_symtab_node_map
.get (item
->node
))
2322 m_symtab_node_map
.remove (item
->node
);
2326 /* Removes all callgraph and varpool nodes that are marked by symtab
2330 sem_item_optimizer::filter_removed_items (void)
2332 auto_vec
<sem_item
*> filtered
;
2334 for (unsigned int i
= 0; i
< m_items
.length(); i
++)
2336 sem_item
*item
= m_items
[i
];
2338 if (m_removed_items_set
.contains (item
->node
))
2344 if (item
->type
== FUNC
)
2346 cgraph_node
*cnode
= static_cast <sem_function
*>(item
)->get_node ();
2348 if (in_lto_p
&& (cnode
->alias
|| cnode
->body_removed
))
2351 filtered
.safe_push (item
);
2355 if (!flag_ipa_icf_variables
)
2359 /* Filter out non-readonly variables. */
2360 tree decl
= item
->decl
;
2361 if (TREE_READONLY (decl
))
2362 filtered
.safe_push (item
);
2369 /* Clean-up of released semantic items. */
2372 for (unsigned int i
= 0; i
< filtered
.length(); i
++)
2373 m_items
.safe_push (filtered
[i
]);
2376 /* Optimizer entry point which returns true in case it processes
2377 a merge operation. True is returned if there's a merge operation
2381 sem_item_optimizer::execute (void)
2383 filter_removed_items ();
2384 unregister_hooks ();
2387 update_hash_by_addr_refs ();
2388 build_hash_based_classes ();
2391 fprintf (dump_file
, "Dump after hash based groups\n");
2392 dump_cong_classes ();
2394 subdivide_classes_by_equality (true);
2397 fprintf (dump_file
, "Dump after WPA based types groups\n");
2399 dump_cong_classes ();
2401 process_cong_reduction ();
2402 checking_verify_classes ();
2405 fprintf (dump_file
, "Dump after callgraph-based congruence reduction\n");
2407 dump_cong_classes ();
2409 unsigned int loaded_symbols
= parse_nonsingleton_classes ();
2410 subdivide_classes_by_equality ();
2413 fprintf (dump_file
, "Dump after full equality comparison of groups\n");
2415 dump_cong_classes ();
2417 unsigned int prev_class_count
= m_classes_count
;
2419 process_cong_reduction ();
2420 dump_cong_classes ();
2421 checking_verify_classes ();
2422 bool merged_p
= merge_classes (prev_class_count
, loaded_symbols
);
2424 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2425 symtab
->dump (dump_file
);
2430 /* Function responsible for visiting all potential functions and
2431 read-only variables that can be merged. */
2434 sem_item_optimizer::parse_funcs_and_vars (void)
2438 /* Create dummy func_checker for hashing purpose. */
2439 func_checker checker
;
2441 if (flag_ipa_icf_functions
)
2442 FOR_EACH_DEFINED_FUNCTION (cnode
)
2444 sem_function
*f
= sem_function::parse (cnode
, &m_bmstack
, &checker
);
2447 m_items
.safe_push (f
);
2448 m_symtab_node_map
.put (cnode
, f
);
2452 varpool_node
*vnode
;
2454 if (flag_ipa_icf_variables
)
2455 FOR_EACH_DEFINED_VARIABLE (vnode
)
2457 sem_variable
*v
= sem_variable::parse (vnode
, &m_bmstack
, &checker
);
2461 m_items
.safe_push (v
);
2462 m_symtab_node_map
.put (vnode
, v
);
2467 /* Makes pairing between a congruence class CLS and semantic ITEM. */
2470 sem_item_optimizer::add_item_to_class (congruence_class
*cls
, sem_item
*item
)
2472 item
->index_in_class
= cls
->members
.length ();
2473 cls
->members
.safe_push (item
);
2474 cls
->referenced_by_count
+= item
->referenced_by_count
;
2478 /* For each semantic item, append hash values of references. */
2481 sem_item_optimizer::update_hash_by_addr_refs ()
2483 /* First, append to hash sensitive references and class type if it need to
2484 be matched for ODR. */
2485 for (unsigned i
= 0; i
< m_items
.length (); i
++)
2487 m_items
[i
]->update_hash_by_addr_refs (m_symtab_node_map
);
2488 if (m_items
[i
]->type
== FUNC
)
2490 if (TREE_CODE (TREE_TYPE (m_items
[i
]->decl
)) == METHOD_TYPE
2491 && contains_polymorphic_type_p
2492 (TYPE_METHOD_BASETYPE (TREE_TYPE (m_items
[i
]->decl
)))
2493 && (DECL_CXX_CONSTRUCTOR_P (m_items
[i
]->decl
)
2494 || (static_cast<sem_function
*> (m_items
[i
])->param_used_p (0)
2495 && static_cast<sem_function
*> (m_items
[i
])
2496 ->compare_polymorphic_p ())))
2499 = TYPE_METHOD_BASETYPE (TREE_TYPE (m_items
[i
]->decl
));
2500 inchash::hash
hstate (m_items
[i
]->get_hash ());
2502 if (TYPE_NAME (class_type
)
2503 && DECL_ASSEMBLER_NAME_SET_P (TYPE_NAME (class_type
)))
2505 (IDENTIFIER_HASH_VALUE
2506 (DECL_ASSEMBLER_NAME (TYPE_NAME (class_type
))));
2508 m_items
[i
]->set_hash (hstate
.end ());
2513 /* Once all symbols have enhanced hash value, we can append
2514 hash values of symbols that are seen by IPA ICF and are
2515 references by a semantic item. Newly computed values
2516 are saved to global_hash member variable. */
2517 for (unsigned i
= 0; i
< m_items
.length (); i
++)
2518 m_items
[i
]->update_hash_by_local_refs (m_symtab_node_map
);
2520 /* Global hash value replace current hash values. */
2521 for (unsigned i
= 0; i
< m_items
.length (); i
++)
2522 m_items
[i
]->set_hash (m_items
[i
]->global_hash
);
2525 /* Congruence classes are built by hash value. */
2528 sem_item_optimizer::build_hash_based_classes (void)
2530 for (unsigned i
= 0; i
< m_items
.length (); i
++)
2532 sem_item
*item
= m_items
[i
];
2534 congruence_class_group
*group
2535 = get_group_by_hash (item
->get_hash (), item
->type
);
2537 if (!group
->classes
.length ())
2540 group
->classes
.safe_push (new congruence_class (class_id
++));
2543 add_item_to_class (group
->classes
[0], item
);
2547 /* Build references according to call graph. */
2550 sem_item_optimizer::build_graph (void)
2552 for (unsigned i
= 0; i
< m_items
.length (); i
++)
2554 sem_item
*item
= m_items
[i
];
2555 m_symtab_node_map
.put (item
->node
, item
);
2557 /* Initialize hash values if we are not in LTO mode. */
2562 for (unsigned i
= 0; i
< m_items
.length (); i
++)
2564 sem_item
*item
= m_items
[i
];
2566 if (item
->type
== FUNC
)
2568 cgraph_node
*cnode
= dyn_cast
<cgraph_node
*> (item
->node
);
2570 cgraph_edge
*e
= cnode
->callees
;
2573 sem_item
**slot
= m_symtab_node_map
.get
2574 (e
->callee
->ultimate_alias_target ());
2576 item
->add_reference (&m_references
, *slot
);
2582 ipa_ref
*ref
= NULL
;
2583 for (unsigned i
= 0; item
->node
->iterate_reference (i
, ref
); i
++)
2585 sem_item
**slot
= m_symtab_node_map
.get
2586 (ref
->referred
->ultimate_alias_target ());
2588 item
->add_reference (&m_references
, *slot
);
2593 /* Semantic items in classes having more than one element and initialized.
2594 In case of WPA, we load function body. */
2597 sem_item_optimizer::parse_nonsingleton_classes (void)
2599 unsigned int counter
= 0;
2601 /* Create dummy func_checker for hashing purpose. */
2602 func_checker checker
;
2604 for (unsigned i
= 0; i
< m_items
.length (); i
++)
2605 if (m_items
[i
]->cls
->members
.length () > 1)
2607 m_items
[i
]->init (&checker
);
2613 float f
= m_items
.length () ? 100.0f
* counter
/ m_items
.length () : 0.0f
;
2614 fprintf (dump_file
, "Init called for %u items (%.2f%%).\n", counter
, f
);
2620 /* Equality function for semantic items is used to subdivide existing
2621 classes. If IN_WPA, fast equality function is invoked. */
2624 sem_item_optimizer::subdivide_classes_by_equality (bool in_wpa
)
2626 for (hash_table
<congruence_class_hash
>::iterator it
= m_classes
.begin ();
2627 it
!= m_classes
.end (); ++it
)
2629 unsigned int class_count
= (*it
)->classes
.length ();
2631 for (unsigned i
= 0; i
< class_count
; i
++)
2633 congruence_class
*c
= (*it
)->classes
[i
];
2635 if (c
->members
.length() > 1)
2637 auto_vec
<sem_item
*> new_vector
;
2639 sem_item
*first
= c
->members
[0];
2640 new_vector
.safe_push (first
);
2642 unsigned class_split_first
= (*it
)->classes
.length ();
2644 for (unsigned j
= 1; j
< c
->members
.length (); j
++)
2646 sem_item
*item
= c
->members
[j
];
2649 = in_wpa
? first
->equals_wpa (item
, m_symtab_node_map
)
2650 : first
->equals (item
, m_symtab_node_map
);
2653 new_vector
.safe_push (item
);
2656 bool integrated
= false;
2658 for (unsigned k
= class_split_first
;
2659 k
< (*it
)->classes
.length (); k
++)
2661 sem_item
*x
= (*it
)->classes
[k
]->members
[0];
2663 = in_wpa
? x
->equals_wpa (item
, m_symtab_node_map
)
2664 : x
->equals (item
, m_symtab_node_map
);
2669 add_item_to_class ((*it
)->classes
[k
], item
);
2678 = new congruence_class (class_id
++);
2680 add_item_to_class (c
, item
);
2682 (*it
)->classes
.safe_push (c
);
2687 // We replace newly created new_vector for the class we've just
2689 c
->members
.release ();
2690 c
->members
.create (new_vector
.length ());
2692 for (unsigned int j
= 0; j
< new_vector
.length (); j
++)
2693 add_item_to_class (c
, new_vector
[j
]);
2698 checking_verify_classes ();
2701 /* Subdivide classes by address references that members of the class
2702 reference. Example can be a pair of functions that have an address
2703 taken from a function. If these addresses are different the class
2707 sem_item_optimizer::subdivide_classes_by_sensitive_refs ()
2709 typedef hash_map
<symbol_compare_hash
, vec
<sem_item
*> > subdivide_hash_map
;
2711 unsigned newly_created_classes
= 0;
2713 for (hash_table
<congruence_class_hash
>::iterator it
= m_classes
.begin ();
2714 it
!= m_classes
.end (); ++it
)
2716 unsigned int class_count
= (*it
)->classes
.length ();
2717 auto_vec
<congruence_class
*> new_classes
;
2719 for (unsigned i
= 0; i
< class_count
; i
++)
2721 congruence_class
*c
= (*it
)->classes
[i
];
2723 if (c
->members
.length() > 1)
2725 subdivide_hash_map split_map
;
2727 for (unsigned j
= 0; j
< c
->members
.length (); j
++)
2729 sem_item
*source_node
= c
->members
[j
];
2731 symbol_compare_collection
*collection
2732 = new symbol_compare_collection (source_node
->node
);
2735 vec
<sem_item
*> *slot
2736 = &split_map
.get_or_insert (collection
, &existed
);
2737 gcc_checking_assert (slot
);
2739 slot
->safe_push (source_node
);
2745 /* If the map contains more than one key, we have to split
2746 the map appropriately. */
2747 if (split_map
.elements () != 1)
2749 bool first_class
= true;
2751 for (subdivide_hash_map::iterator it2
= split_map
.begin ();
2752 it2
!= split_map
.end (); ++it2
)
2754 congruence_class
*new_cls
;
2755 new_cls
= new congruence_class (class_id
++);
2757 for (unsigned k
= 0; k
< (*it2
).second
.length (); k
++)
2758 add_item_to_class (new_cls
, (*it2
).second
[k
]);
2760 worklist_push (new_cls
);
2761 newly_created_classes
++;
2765 (*it
)->classes
[i
] = new_cls
;
2766 first_class
= false;
2770 new_classes
.safe_push (new_cls
);
2776 /* Release memory. */
2777 for (subdivide_hash_map::iterator it2
= split_map
.begin ();
2778 it2
!= split_map
.end (); ++it2
)
2780 delete (*it2
).first
;
2781 (*it2
).second
.release ();
2786 for (unsigned i
= 0; i
< new_classes
.length (); i
++)
2787 (*it
)->classes
.safe_push (new_classes
[i
]);
2790 return newly_created_classes
;
2793 /* Verify congruence classes, if checking is enabled. */
2796 sem_item_optimizer::checking_verify_classes (void)
2802 /* Verify congruence classes. */
2805 sem_item_optimizer::verify_classes (void)
2807 for (hash_table
<congruence_class_hash
>::iterator it
= m_classes
.begin ();
2808 it
!= m_classes
.end (); ++it
)
2810 for (unsigned int i
= 0; i
< (*it
)->classes
.length (); i
++)
2812 congruence_class
*cls
= (*it
)->classes
[i
];
2815 gcc_assert (cls
->members
.length () > 0);
2817 for (unsigned int j
= 0; j
< cls
->members
.length (); j
++)
2819 sem_item
*item
= cls
->members
[j
];
2822 gcc_assert (item
->cls
== cls
);
2828 /* Disposes split map traverse function. CLS_PTR is pointer to congruence
2829 class, BSLOT is bitmap slot we want to release. DATA is mandatory,
2830 but unused argument. */
2833 sem_item_optimizer::release_split_map (congruence_class
* const &,
2834 bitmap
const &b
, traverse_split_pair
*)
2843 /* Process split operation for a class given as pointer CLS_PTR,
2844 where bitmap B splits congruence class members. DATA is used
2845 as argument of split pair. */
2848 sem_item_optimizer::traverse_congruence_split (congruence_class
* const &cls
,
2850 traverse_split_pair
*pair
)
2852 sem_item_optimizer
*optimizer
= pair
->optimizer
;
2853 const congruence_class
*splitter_cls
= pair
->cls
;
2855 /* If counted bits are greater than zero and less than the number of members
2856 a group will be splitted. */
2857 unsigned popcount
= bitmap_count_bits (b
);
2859 if (popcount
> 0 && popcount
< cls
->members
.length ())
2861 auto_vec
<congruence_class
*, 2> newclasses
;
2862 newclasses
.quick_push (new congruence_class (class_id
++));
2863 newclasses
.quick_push (new congruence_class (class_id
++));
2865 for (unsigned int i
= 0; i
< cls
->members
.length (); i
++)
2867 int target
= bitmap_bit_p (b
, i
);
2868 congruence_class
*tc
= newclasses
[target
];
2870 add_item_to_class (tc
, cls
->members
[i
]);
2875 for (unsigned int i
= 0; i
< 2; i
++)
2876 gcc_assert (newclasses
[i
]->members
.length ());
2879 if (splitter_cls
== cls
)
2880 optimizer
->splitter_class_removed
= true;
2882 /* Remove old class from worklist if presented. */
2883 bool in_worklist
= cls
->in_worklist
;
2886 cls
->in_worklist
= false;
2888 congruence_class_group g
;
2889 g
.hash
= cls
->members
[0]->get_hash ();
2890 g
.type
= cls
->members
[0]->type
;
2892 congruence_class_group
*slot
= optimizer
->m_classes
.find (&g
);
2894 for (unsigned int i
= 0; i
< slot
->classes
.length (); i
++)
2895 if (slot
->classes
[i
] == cls
)
2897 slot
->classes
.ordered_remove (i
);
2901 /* New class will be inserted and integrated to work list. */
2902 for (unsigned int i
= 0; i
< 2; i
++)
2903 optimizer
->add_class (newclasses
[i
]);
2905 /* Two classes replace one, so that increment just by one. */
2906 optimizer
->m_classes_count
++;
2908 /* If OLD class was presented in the worklist, we remove the class
2909 and replace it will both newly created classes. */
2911 for (unsigned int i
= 0; i
< 2; i
++)
2912 optimizer
->worklist_push (newclasses
[i
]);
2913 else /* Just smaller class is inserted. */
2915 unsigned int smaller_index
2916 = (newclasses
[0]->members
.length ()
2917 < newclasses
[1]->members
.length ()
2919 optimizer
->worklist_push (newclasses
[smaller_index
]);
2922 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2924 fprintf (dump_file
, " congruence class splitted:\n");
2925 cls
->dump (dump_file
, 4);
2927 fprintf (dump_file
, " newly created groups:\n");
2928 for (unsigned int i
= 0; i
< 2; i
++)
2929 newclasses
[i
]->dump (dump_file
, 4);
2932 /* Release class if not presented in work list. */
2942 /* Compare function for sorting pairs in do_congruence_step_f. */
2945 sem_item_optimizer::sort_congruence_split (const void *a_
, const void *b_
)
2947 const std::pair
<congruence_class
*, bitmap
> *a
2948 = (const std::pair
<congruence_class
*, bitmap
> *)a_
;
2949 const std::pair
<congruence_class
*, bitmap
> *b
2950 = (const std::pair
<congruence_class
*, bitmap
> *)b_
;
2951 if (a
->first
->id
< b
->first
->id
)
2953 else if (a
->first
->id
> b
->first
->id
)
2958 /* Tests if a class CLS used as INDEXth splits any congruence classes.
2959 Bitmap stack BMSTACK is used for bitmap allocation. */
2962 sem_item_optimizer::do_congruence_step_for_index (congruence_class
*cls
,
2965 hash_map
<congruence_class
*, bitmap
> split_map
;
2967 for (unsigned int i
= 0; i
< cls
->members
.length (); i
++)
2969 sem_item
*item
= cls
->members
[i
];
2970 sem_usage_pair
needle (item
, index
);
2971 vec
<sem_item
*> *callers
= m_references
.get (&needle
);
2972 if (callers
== NULL
)
2975 for (unsigned int j
= 0; j
< callers
->length (); j
++)
2977 sem_item
*caller
= (*callers
)[j
];
2978 if (caller
->cls
->members
.length () < 2)
2980 bitmap
*slot
= split_map
.get (caller
->cls
);
2985 b
= BITMAP_ALLOC (&m_bmstack
);
2986 split_map
.put (caller
->cls
, b
);
2991 gcc_checking_assert (caller
->cls
);
2992 gcc_checking_assert (caller
->index_in_class
2993 < caller
->cls
->members
.length ());
2995 bitmap_set_bit (b
, caller
->index_in_class
);
2999 auto_vec
<std::pair
<congruence_class
*, bitmap
> > to_split
;
3000 to_split
.reserve_exact (split_map
.elements ());
3001 for (hash_map
<congruence_class
*, bitmap
>::iterator i
= split_map
.begin ();
3002 i
!= split_map
.end (); ++i
)
3003 to_split
.safe_push (*i
);
3004 to_split
.qsort (sort_congruence_split
);
3006 traverse_split_pair pair
;
3007 pair
.optimizer
= this;
3010 splitter_class_removed
= false;
3012 for (unsigned i
= 0; i
< to_split
.length (); ++i
)
3013 r
|= traverse_congruence_split (to_split
[i
].first
, to_split
[i
].second
,
3016 /* Bitmap clean-up. */
3017 split_map
.traverse
<traverse_split_pair
*,
3018 sem_item_optimizer::release_split_map
> (NULL
);
3023 /* Every usage of a congruence class CLS is a candidate that can split the
3024 collection of classes. Bitmap stack BMSTACK is used for bitmap
3028 sem_item_optimizer::do_congruence_step (congruence_class
*cls
)
3033 bitmap usage
= BITMAP_ALLOC (&m_bmstack
);
3035 for (unsigned int i
= 0; i
< cls
->members
.length (); i
++)
3036 bitmap_ior_into (usage
, cls
->members
[i
]->usage_index_bitmap
);
3038 EXECUTE_IF_SET_IN_BITMAP (usage
, 0, i
, bi
)
3040 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
3041 fprintf (dump_file
, " processing congruence step for class: %u "
3042 "(%u items, %u references), index: %u\n", cls
->id
,
3043 cls
->referenced_by_count
, cls
->members
.length (), i
);
3044 do_congruence_step_for_index (cls
, i
);
3046 if (splitter_class_removed
)
3050 BITMAP_FREE (usage
);
3053 /* Adds a newly created congruence class CLS to worklist. */
3056 sem_item_optimizer::worklist_push (congruence_class
*cls
)
3058 /* Return if the class CLS is already presented in work list. */
3059 if (cls
->in_worklist
)
3062 cls
->in_worklist
= true;
3063 worklist
.insert (cls
->referenced_by_count
, cls
);
3066 /* Pops a class from worklist. */
3069 sem_item_optimizer::worklist_pop (void)
3071 congruence_class
*cls
;
3073 while (!worklist
.empty ())
3075 cls
= worklist
.extract_min ();
3076 if (cls
->in_worklist
)
3078 cls
->in_worklist
= false;
3084 /* Work list item was already intended to be removed.
3085 The only reason for doing it is to split a class.
3086 Thus, the class CLS is deleted. */
3094 /* Iterative congruence reduction function. */
3097 sem_item_optimizer::process_cong_reduction (void)
3099 for (hash_table
<congruence_class_hash
>::iterator it
= m_classes
.begin ();
3100 it
!= m_classes
.end (); ++it
)
3101 for (unsigned i
= 0; i
< (*it
)->classes
.length (); i
++)
3102 if ((*it
)->classes
[i
]->is_class_used ())
3103 worklist_push ((*it
)->classes
[i
]);
3106 fprintf (dump_file
, "Worklist has been filled with: %lu\n",
3107 (unsigned long) worklist
.nodes ());
3109 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
3110 fprintf (dump_file
, "Congruence class reduction\n");
3112 congruence_class
*cls
;
3114 /* Process complete congruence reduction. */
3115 while ((cls
= worklist_pop ()) != NULL
)
3116 do_congruence_step (cls
);
3118 /* Subdivide newly created classes according to references. */
3119 unsigned new_classes
= subdivide_classes_by_sensitive_refs ();
3122 fprintf (dump_file
, "Address reference subdivision created: %u "
3123 "new classes.\n", new_classes
);
3126 /* Debug function prints all informations about congruence classes. */
3129 sem_item_optimizer::dump_cong_classes (void)
3134 /* Histogram calculation. */
3135 unsigned int max_index
= 0;
3136 unsigned int single_element_classes
= 0;
3137 unsigned int* histogram
= XCNEWVEC (unsigned int, m_items
.length () + 1);
3139 for (hash_table
<congruence_class_hash
>::iterator it
= m_classes
.begin ();
3140 it
!= m_classes
.end (); ++it
)
3141 for (unsigned i
= 0; i
< (*it
)->classes
.length (); i
++)
3143 unsigned int c
= (*it
)->classes
[i
]->members
.length ();
3150 ++single_element_classes
;
3154 "Congruence classes: %lu with total: %u items (in a non-singular "
3155 "class: %u)\n", (unsigned long) m_classes
.elements (),
3156 m_items
.length (), m_items
.length () - single_element_classes
);
3158 "Class size histogram [number of members]: number of classes\n");
3159 for (unsigned int i
= 0; i
<= max_index
; i
++)
3161 fprintf (dump_file
, "%6u: %6u\n", i
, histogram
[i
]);
3163 if (dump_flags
& TDF_DETAILS
)
3164 for (hash_table
<congruence_class_hash
>::iterator it
= m_classes
.begin ();
3165 it
!= m_classes
.end (); ++it
)
3167 fprintf (dump_file
, " group: with %u classes:\n",
3168 (*it
)->classes
.length ());
3170 for (unsigned i
= 0; i
< (*it
)->classes
.length (); i
++)
3172 (*it
)->classes
[i
]->dump (dump_file
, 4);
3174 if (i
< (*it
)->classes
.length () - 1)
3175 fprintf (dump_file
, " ");
3182 /* Sort pair of sem_items A and B by DECL_UID. */
3185 sort_sem_items_by_decl_uid (const void *a
, const void *b
)
3187 const sem_item
*i1
= *(const sem_item
* const *)a
;
3188 const sem_item
*i2
= *(const sem_item
* const *)b
;
3190 int uid1
= DECL_UID (i1
->decl
);
3191 int uid2
= DECL_UID (i2
->decl
);
3195 /* Sort pair of congruence_classes A and B by DECL_UID of the first member. */
3198 sort_congruence_classes_by_decl_uid (const void *a
, const void *b
)
3200 const congruence_class
*c1
= *(const congruence_class
* const *)a
;
3201 const congruence_class
*c2
= *(const congruence_class
* const *)b
;
3203 int uid1
= DECL_UID (c1
->members
[0]->decl
);
3204 int uid2
= DECL_UID (c2
->members
[0]->decl
);
3208 /* Sort pair of congruence_class_groups A and B by
3209 DECL_UID of the first member of a first group. */
3212 sort_congruence_class_groups_by_decl_uid (const void *a
, const void *b
)
3214 const std::pair
<congruence_class_group
*, int> *g1
3215 = (const std::pair
<congruence_class_group
*, int> *) a
;
3216 const std::pair
<congruence_class_group
*, int> *g2
3217 = (const std::pair
<congruence_class_group
*, int> *) b
;
3218 return g1
->second
- g2
->second
;
3221 /* After reduction is done, we can declare all items in a group
3222 to be equal. PREV_CLASS_COUNT is start number of classes
3223 before reduction. True is returned if there's a merge operation
3224 processed. LOADED_SYMBOLS is number of symbols that were loaded
3228 sem_item_optimizer::merge_classes (unsigned int prev_class_count
,
3229 unsigned int loaded_symbols
)
3231 unsigned int item_count
= m_items
.length ();
3232 unsigned int class_count
= m_classes_count
;
3233 unsigned int equal_items
= item_count
- class_count
;
3235 unsigned int non_singular_classes_count
= 0;
3236 unsigned int non_singular_classes_sum
= 0;
3238 bool merged_p
= false;
3241 Sort functions in congruence classes by DECL_UID and do the same
3242 for the classes to not to break -fcompare-debug. */
3244 for (hash_table
<congruence_class_hash
>::iterator it
= m_classes
.begin ();
3245 it
!= m_classes
.end (); ++it
)
3247 for (unsigned int i
= 0; i
< (*it
)->classes
.length (); i
++)
3249 congruence_class
*c
= (*it
)->classes
[i
];
3250 c
->members
.qsort (sort_sem_items_by_decl_uid
);
3253 (*it
)->classes
.qsort (sort_congruence_classes_by_decl_uid
);
3256 for (hash_table
<congruence_class_hash
>::iterator it
= m_classes
.begin ();
3257 it
!= m_classes
.end (); ++it
)
3258 for (unsigned int i
= 0; i
< (*it
)->classes
.length (); i
++)
3260 congruence_class
*c
= (*it
)->classes
[i
];
3261 if (c
->members
.length () > 1)
3263 non_singular_classes_count
++;
3264 non_singular_classes_sum
+= c
->members
.length ();
3268 auto_vec
<std::pair
<congruence_class_group
*, int> > classes (
3269 m_classes
.elements ());
3270 for (hash_table
<congruence_class_hash
>::iterator it
= m_classes
.begin ();
3271 it
!= m_classes
.end (); ++it
)
3273 int uid
= DECL_UID ((*it
)->classes
[0]->members
[0]->decl
);
3274 classes
.quick_push (std::pair
<congruence_class_group
*, int> (*it
, uid
));
3277 classes
.qsort (sort_congruence_class_groups_by_decl_uid
);
3281 fprintf (dump_file
, "\nItem count: %u\n", item_count
);
3282 fprintf (dump_file
, "Congruent classes before: %u, after: %u\n",
3283 prev_class_count
, class_count
);
3284 fprintf (dump_file
, "Average class size before: %.2f, after: %.2f\n",
3285 prev_class_count
? 1.0f
* item_count
/ prev_class_count
: 0.0f
,
3286 class_count
? 1.0f
* item_count
/ class_count
: 0.0f
);
3287 fprintf (dump_file
, "Average non-singular class size: %.2f, count: %u\n",
3288 non_singular_classes_count
? 1.0f
* non_singular_classes_sum
/
3289 non_singular_classes_count
: 0.0f
,
3290 non_singular_classes_count
);
3291 fprintf (dump_file
, "Equal symbols: %u\n", equal_items
);
3292 unsigned total
= equal_items
+ non_singular_classes_count
;
3293 fprintf (dump_file
, "Totally needed symbols: %u"
3294 ", fraction of loaded symbols: %.2f%%\n\n", total
,
3295 loaded_symbols
? 100.0f
* total
/ loaded_symbols
: 0.0f
);
3299 std::pair
<congruence_class_group
*, int> *it
;
3300 FOR_EACH_VEC_ELT (classes
, l
, it
)
3301 for (unsigned int i
= 0; i
< it
->first
->classes
.length (); i
++)
3303 congruence_class
*c
= it
->first
->classes
[i
];
3305 if (c
->members
.length () == 1)
3308 sem_item
*source
= c
->members
[0];
3310 if (DECL_NAME (source
->decl
)
3311 && MAIN_NAME_P (DECL_NAME (source
->decl
)))
3312 /* If merge via wrappers, picking main as the target can be
3314 source
= c
->members
[1];
3316 for (unsigned int j
= 0; j
< c
->members
.length (); j
++)
3318 sem_item
*alias
= c
->members
[j
];
3320 if (alias
== source
)
3323 dump_user_location_t loc
3324 = dump_user_location_t::from_function_decl (source
->decl
);
3325 if (dump_enabled_p ())
3327 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS
, loc
,
3328 "Semantic equality hit:%s->%s\n",
3329 source
->node
->dump_name (),
3330 alias
->node
->dump_name ());
3331 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS
, loc
,
3332 "Assembler symbol names:%s->%s\n",
3333 source
->node
->dump_asm_name (),
3334 alias
->node
->dump_asm_name ());
3337 if (lookup_attribute ("no_icf", DECL_ATTRIBUTES (alias
->decl
)))
3339 if (dump_enabled_p ())
3340 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS
, loc
,
3341 "Merge operation is skipped due to no_icf "
3346 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
3348 source
->dump_to_file (dump_file
);
3349 alias
->dump_to_file (dump_file
);
3352 if (dbg_cnt (merged_ipa_icf
))
3354 bool merged
= source
->merge (alias
);
3357 if (merged
&& alias
->type
== VAR
)
3359 symtab_pair p
= symtab_pair (source
->node
, alias
->node
);
3360 m_merged_variables
.safe_push (p
);
3366 if (!m_merged_variables
.is_empty ())
3367 fixup_points_to_sets ();
3372 /* Fixup points to set PT. */
3375 sem_item_optimizer::fixup_pt_set (struct pt_solution
*pt
)
3377 if (pt
->vars
== NULL
)
3382 FOR_EACH_VEC_ELT (m_merged_variables
, i
, item
)
3383 if (bitmap_bit_p (pt
->vars
, DECL_UID (item
->second
->decl
)))
3384 bitmap_set_bit (pt
->vars
, DECL_UID (item
->first
->decl
));
3387 /* Set all points-to UIDs of aliases pointing to node N as UID. */
3390 set_alias_uids (symtab_node
*n
, int uid
)
3393 FOR_EACH_ALIAS (n
, ref
)
3396 fprintf (dump_file
, " Setting points-to UID of [%s] as %d\n",
3397 ref
->referring
->dump_asm_name (), uid
);
3399 SET_DECL_PT_UID (ref
->referring
->decl
, uid
);
3400 set_alias_uids (ref
->referring
, uid
);
3404 /* Fixup points to analysis info. */
3407 sem_item_optimizer::fixup_points_to_sets (void)
3409 /* TODO: remove in GCC 9 and trigger PTA re-creation after IPA passes. */
3412 FOR_EACH_DEFINED_FUNCTION (cnode
)
3416 function
*fn
= DECL_STRUCT_FUNCTION (cnode
->decl
);
3417 if (!gimple_in_ssa_p (fn
))
3420 FOR_EACH_SSA_NAME (i
, name
, fn
)
3421 if (POINTER_TYPE_P (TREE_TYPE (name
))
3422 && SSA_NAME_PTR_INFO (name
))
3423 fixup_pt_set (&SSA_NAME_PTR_INFO (name
)->pt
);
3424 fixup_pt_set (&fn
->gimple_df
->escaped
);
3426 /* The above gets us to 99% I guess, at least catching the
3427 address compares. Below also gets us aliasing correct
3428 but as said we're giving leeway to the situation with
3429 readonly vars anyway, so ... */
3431 FOR_EACH_BB_FN (bb
, fn
)
3432 for (gimple_stmt_iterator gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
);
3435 gcall
*call
= dyn_cast
<gcall
*> (gsi_stmt (gsi
));
3438 fixup_pt_set (gimple_call_use_set (call
));
3439 fixup_pt_set (gimple_call_clobber_set (call
));
3446 FOR_EACH_VEC_ELT (m_merged_variables
, i
, item
)
3447 set_alias_uids (item
->first
, DECL_UID (item
->first
->decl
));
3450 /* Dump function prints all class members to a FILE with an INDENT. */
3453 congruence_class::dump (FILE *file
, unsigned int indent
) const
3455 FPRINTF_SPACES (file
, indent
, "class with id: %u, hash: %u, items: %u\n",
3456 id
, members
[0]->get_hash (), members
.length ());
3458 FPUTS_SPACES (file
, indent
+ 2, "");
3459 for (unsigned i
= 0; i
< members
.length (); i
++)
3460 fprintf (file
, "%s ", members
[i
]->node
->dump_asm_name ());
3462 fprintf (file
, "\n");
3465 /* Returns true if there's a member that is used from another group. */
3468 congruence_class::is_class_used (void)
3470 for (unsigned int i
= 0; i
< members
.length (); i
++)
3471 if (members
[i
]->referenced_by_count
)
3477 /* Generate pass summary for IPA ICF pass. */
3480 ipa_icf_generate_summary (void)
3483 optimizer
= new sem_item_optimizer ();
3485 optimizer
->register_hooks ();
3486 optimizer
->parse_funcs_and_vars ();
3489 /* Write pass summary for IPA ICF pass. */
3492 ipa_icf_write_summary (void)
3494 gcc_assert (optimizer
);
3496 optimizer
->write_summary ();
3499 /* Read pass summary for IPA ICF pass. */
3502 ipa_icf_read_summary (void)
3505 optimizer
= new sem_item_optimizer ();
3507 optimizer
->read_summary ();
3508 optimizer
->register_hooks ();
3511 /* Semantic equality execution function. */
3514 ipa_icf_driver (void)
3516 gcc_assert (optimizer
);
3518 bool merged_p
= optimizer
->execute ();
3523 return merged_p
? TODO_remove_functions
: 0;
3526 const pass_data pass_data_ipa_icf
=
3528 IPA_PASS
, /* type */
3530 OPTGROUP_IPA
, /* optinfo_flags */
3531 TV_IPA_ICF
, /* tv_id */
3532 0, /* properties_required */
3533 0, /* properties_provided */
3534 0, /* properties_destroyed */
3535 0, /* todo_flags_start */
3536 0, /* todo_flags_finish */
3539 class pass_ipa_icf
: public ipa_opt_pass_d
3542 pass_ipa_icf (gcc::context
*ctxt
)
3543 : ipa_opt_pass_d (pass_data_ipa_icf
, ctxt
,
3544 ipa_icf_generate_summary
, /* generate_summary */
3545 ipa_icf_write_summary
, /* write_summary */
3546 ipa_icf_read_summary
, /* read_summary */
3548 write_optimization_summary */
3550 read_optimization_summary */
3551 NULL
, /* stmt_fixup */
3552 0, /* function_transform_todo_flags_start */
3553 NULL
, /* function_transform */
3554 NULL
) /* variable_transform */
3557 /* opt_pass methods: */
3558 virtual bool gate (function
*)
3560 return in_lto_p
|| flag_ipa_icf_variables
|| flag_ipa_icf_functions
;
3563 virtual unsigned int execute (function
*)
3565 return ipa_icf_driver();
3567 }; // class pass_ipa_icf
3569 } // ipa_icf namespace
3572 make_pass_ipa_icf (gcc::context
*ctxt
)
3574 return new ipa_icf::pass_ipa_icf (ctxt
);