]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/ipa-icf.c
Daily bump.
[thirdparty/gcc.git] / gcc / ipa-icf.c
CommitLineData
b84d4347 1/* Interprocedural Identical Code Folding pass
5624e564 2 Copyright (C) 2014-2015 Free Software Foundation, Inc.
b84d4347
ML
3
4 Contributed by Jan Hubicka <hubicka@ucw.cz> and Martin Liska <mliska@suse.cz>
5
6This file is part of GCC.
7
8GCC is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free
10Software Foundation; either version 3, or (at your option) any later
11version.
12
13GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14WARRANTY; without even the implied warranty of MERCHANTABILITY or
15FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16for more details.
17
18You should have received a copy of the GNU General Public License
19along with GCC; see the file COPYING3. If not see
20<http://www.gnu.org/licenses/>. */
21
22/* Interprocedural Identical Code Folding for functions and
23 read-only variables.
24
25 The goal of this transformation is to discover functions and read-only
26 variables which do have exactly the same semantics.
27
28 In case of functions,
29 we could either create a virtual clone or do a simple function wrapper
30 that will call equivalent function. If the function is just locally visible,
31 all function calls can be redirected. For read-only variables, we create
32 aliases if possible.
33
34 Optimization pass arranges as follows:
35 1) All functions and read-only variables are visited and internal
36 data structure, either sem_function or sem_variables is created.
37 2) For every symbol from the previous step, VAR_DECL and FUNCTION_DECL are
38 saved and matched to corresponding sem_items.
39 3) These declaration are ignored for equality check and are solved
40 by Value Numbering algorithm published by Alpert, Zadeck in 1992.
41 4) We compute hash value for each symbol.
42 5) Congruence classes are created based on hash value. If hash value are
43 equal, equals function is called and symbols are deeply compared.
44 We must prove that all SSA names, declarations and other items
45 correspond.
46 6) Value Numbering is executed for these classes. At the end of the process
47 all symbol members in remaining classes can be merged.
48 7) Merge operation creates alias in case of read-only variables. For
49 callgraph node, we must decide if we can redirect local calls,
50 create an alias or a thunk.
51
52*/
53
54#include "config.h"
55#include "system.h"
56#include "coretypes.h"
c7131fb2 57#include "backend.h"
957060b5
AM
58#include "target.h"
59#include "rtl.h"
40e23961 60#include "tree.h"
b84d4347 61#include "gimple.h"
957060b5
AM
62#include "alloc-pool.h"
63#include "tree-pass.h"
c7131fb2 64#include "ssa.h"
957060b5
AM
65#include "cgraph.h"
66#include "coverage.h"
67#include "gimple-pretty-print.h"
68#include "data-streamer.h"
69#include <list>
c7131fb2 70#include "fold-const.h"
36566b39 71#include "calls.h"
36566b39 72#include "varasm.h"
b84d4347 73#include "gimple-iterator.h"
b84d4347 74#include "tree-cfg.h"
dd912cb8 75#include "symbol-summary.h"
c582198b 76#include "ipa-prop.h"
b84d4347 77#include "ipa-inline.h"
b84d4347 78#include "except.h"
b84d4347
ML
79#include "attribs.h"
80#include "print-tree.h"
b84d4347 81#include "ipa-utils.h"
b84d4347
ML
82#include "ipa-icf-gimple.h"
83#include "ipa-icf.h"
46305737 84#include "stor-layout.h"
7aeb92b4 85#include "dbgcnt.h"
b84d4347
ML
86
87using namespace ipa_icf_gimple;
88
89namespace ipa_icf {
5ebd0e61 90
69f6b1f4
JH
91/* Initialization and computation of symtab node hash, there data
92 are propagated later on. */
93
94static sem_item_optimizer *optimizer = NULL;
95
5ebd0e61
ML
96/* Constructor. */
97
98symbol_compare_collection::symbol_compare_collection (symtab_node *node)
99{
100 m_references.create (0);
101 m_interposables.create (0);
102
103 ipa_ref *ref;
104
105 if (is_a <varpool_node *> (node) && DECL_VIRTUAL_P (node->decl))
106 return;
107
977b01e3 108 for (unsigned i = 0; node->iterate_reference (i, ref); i++)
5ebd0e61 109 {
5ebd0e61
ML
110 if (ref->address_matters_p ())
111 m_references.safe_push (ref->referred);
112
113 if (ref->referred->get_availability () <= AVAIL_INTERPOSABLE)
114 {
0a7246ee 115 if (ref->address_matters_p ())
5ebd0e61
ML
116 m_references.safe_push (ref->referred);
117 else
118 m_interposables.safe_push (ref->referred);
119 }
120 }
121
122 if (is_a <cgraph_node *> (node))
123 {
124 cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
125
126 for (cgraph_edge *e = cnode->callees; e; e = e->next_callee)
127 if (e->callee->get_availability () <= AVAIL_INTERPOSABLE)
128 m_interposables.safe_push (e->callee);
129 }
130}
131
b84d4347
ML
132/* Constructor for key value pair, where _ITEM is key and _INDEX is a target. */
133
134sem_usage_pair::sem_usage_pair (sem_item *_item, unsigned int _index):
135 item (_item), index (_index)
136{
137}
138
139/* Semantic item constructor for a node of _TYPE, where STACK is used
140 for bitmap memory allocation. */
141
142sem_item::sem_item (sem_item_type _type,
808b6bb7 143 bitmap_obstack *stack): type (_type), m_hash (0)
b84d4347
ML
144{
145 setup (stack);
146}
147
148/* Semantic item constructor for a node of _TYPE, where STACK is used
149 for bitmap memory allocation. The item is based on symtab node _NODE
150 with computed _HASH. */
151
152sem_item::sem_item (sem_item_type _type, symtab_node *_node,
153 hashval_t _hash, bitmap_obstack *stack): type(_type),
808b6bb7 154 node (_node), m_hash (_hash)
b84d4347
ML
155{
156 decl = node->decl;
157 setup (stack);
158}
159
160/* Add reference to a semantic TARGET. */
161
162void
163sem_item::add_reference (sem_item *target)
164{
165 refs.safe_push (target);
166 unsigned index = refs.length ();
167 target->usages.safe_push (new sem_usage_pair(this, index));
168 bitmap_set_bit (target->usage_index_bitmap, index);
169 refs_set.add (target->node);
170}
171
172/* Initialize internal data structures. Bitmap STACK is used for
173 bitmap memory allocation process. */
174
175void
176sem_item::setup (bitmap_obstack *stack)
177{
178 gcc_checking_assert (node);
179
180 refs.create (0);
181 tree_refs.create (0);
182 usages.create (0);
183 usage_index_bitmap = BITMAP_ALLOC (stack);
184}
185
186sem_item::~sem_item ()
187{
188 for (unsigned i = 0; i < usages.length (); i++)
189 delete usages[i];
190
191 refs.release ();
192 tree_refs.release ();
193 usages.release ();
194
195 BITMAP_FREE (usage_index_bitmap);
196}
197
198/* Dump function for debugging purpose. */
199
200DEBUG_FUNCTION void
201sem_item::dump (void)
202{
203 if (dump_file)
204 {
205 fprintf (dump_file, "[%s] %s (%u) (tree:%p)\n", type == FUNC ? "func" : "var",
1aec2ecc 206 node->name(), node->order, (void *) node->decl);
b84d4347
ML
207 fprintf (dump_file, " hash: %u\n", get_hash ());
208 fprintf (dump_file, " references: ");
209
210 for (unsigned i = 0; i < refs.length (); i++)
1aec2ecc 211 fprintf (dump_file, "%s%s ", refs[i]->node->name (),
b84d4347
ML
212 i < refs.length() - 1 ? "," : "");
213
214 fprintf (dump_file, "\n");
215 }
216}
217
f657d665
ML
218/* Return true if target supports alias symbols. */
219
220bool
221sem_item::target_supports_symbol_aliases_p (void)
222{
223#if !defined (ASM_OUTPUT_DEF) || (!defined(ASM_OUTPUT_WEAK_ALIAS) && !defined (ASM_WEAKEN_DECL))
224 return false;
225#else
226 return true;
227#endif
228}
229
808b6bb7
ML
230void sem_item::set_hash (hashval_t hash)
231{
232 m_hash = hash;
233}
234
b84d4347
ML
235/* Semantic function constructor that uses STACK as bitmap memory stack. */
236
237sem_function::sem_function (bitmap_obstack *stack): sem_item (FUNC, stack),
238 m_checker (NULL), m_compared_func (NULL)
239{
b84d4347
ML
240 bb_sizes.create (0);
241 bb_sorted.create (0);
242}
243
244/* Constructor based on callgraph node _NODE with computed hash _HASH.
245 Bitmap STACK is used for memory allocation. */
246sem_function::sem_function (cgraph_node *node, hashval_t hash,
247 bitmap_obstack *stack):
248 sem_item (FUNC, node, hash, stack),
249 m_checker (NULL), m_compared_func (NULL)
250{
b84d4347
ML
251 bb_sizes.create (0);
252 bb_sorted.create (0);
253}
254
255sem_function::~sem_function ()
256{
257 for (unsigned i = 0; i < bb_sorted.length (); i++)
e27d328a 258 delete (bb_sorted[i]);
b84d4347 259
b84d4347
ML
260 bb_sizes.release ();
261 bb_sorted.release ();
262}
263
264/* Calculates hash value based on a BASIC_BLOCK. */
265
266hashval_t
267sem_function::get_bb_hash (const sem_bb *basic_block)
268{
269 inchash::hash hstate;
270
271 hstate.add_int (basic_block->nondbg_stmt_count);
272 hstate.add_int (basic_block->edge_count);
273
274 return hstate.end ();
275}
276
277/* References independent hash function. */
278
279hashval_t
280sem_function::get_hash (void)
281{
808b6bb7 282 if (!m_hash)
b84d4347
ML
283 {
284 inchash::hash hstate;
285 hstate.add_int (177454); /* Random number for function type. */
286
287 hstate.add_int (arg_count);
288 hstate.add_int (cfg_checksum);
289 hstate.add_int (gcode_hash);
290
291 for (unsigned i = 0; i < bb_sorted.length (); i++)
292 hstate.merge_hash (get_bb_hash (bb_sorted[i]));
293
294 for (unsigned i = 0; i < bb_sizes.length (); i++)
295 hstate.add_int (bb_sizes[i]);
296
69f6b1f4
JH
297 /* Add common features of declaration itself. */
298 if (DECL_FUNCTION_SPECIFIC_TARGET (decl))
299 hstate.add_wide_int
300 (cl_target_option_hash
301 (TREE_TARGET_OPTION (DECL_FUNCTION_SPECIFIC_TARGET (decl))));
302 if (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (decl))
303 (cl_optimization_hash
304 (TREE_OPTIMIZATION (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (decl))));
69f6b1f4
JH
305 hstate.add_flag (DECL_CXX_CONSTRUCTOR_P (decl));
306 hstate.add_flag (DECL_CXX_DESTRUCTOR_P (decl));
307
808b6bb7 308 set_hash (hstate.end ());
b84d4347
ML
309 }
310
808b6bb7 311 return m_hash;
b84d4347
ML
312}
313
b3587b99
JH
314/* Return ture if A1 and A2 represent equivalent function attribute lists.
315 Based on comp_type_attributes. */
316
317bool
318sem_item::compare_attributes (const_tree a1, const_tree a2)
319{
320 const_tree a;
321 if (a1 == a2)
322 return true;
323 for (a = a1; a != NULL_TREE; a = TREE_CHAIN (a))
324 {
325 const struct attribute_spec *as;
326 const_tree attr;
327
328 as = lookup_attribute_spec (get_attribute_name (a));
329 /* TODO: We can introduce as->affects_decl_identity
330 and as->affects_decl_reference_identity if attribute mismatch
331 gets a common reason to give up on merging. It may not be worth
332 the effort.
333 For example returns_nonnull affects only references, while
334 optimize attribute can be ignored because it is already lowered
335 into flags representation and compared separately. */
336 if (!as)
337 continue;
338
339 attr = lookup_attribute (as->name, CONST_CAST_TREE (a2));
340 if (!attr || !attribute_value_equal (a, attr))
341 break;
342 }
343 if (!a)
344 {
345 for (a = a2; a != NULL_TREE; a = TREE_CHAIN (a))
346 {
347 const struct attribute_spec *as;
348
349 as = lookup_attribute_spec (get_attribute_name (a));
350 if (!as)
351 continue;
352
353 if (!lookup_attribute (as->name, CONST_CAST_TREE (a1)))
354 break;
355 /* We don't need to compare trees again, as we did this
356 already in first loop. */
357 }
358 if (!a)
359 return true;
360 }
361 /* TODO: As in comp_type_attributes we may want to introduce target hook. */
362 return false;
363}
364
977b01e3
JH
365/* Compare properties of symbols N1 and N2 that does not affect semantics of
366 symbol itself but affects semantics of its references from USED_BY (which
367 may be NULL if it is unknown). If comparsion is false, symbols
368 can still be merged but any symbols referring them can't.
369
370 If ADDRESS is true, do extra checking needed for IPA_REF_ADDR.
371
372 TODO: We can also split attributes to those that determine codegen of
373 a function body/variable constructor itself and those that are used when
374 referring to it. */
375
376bool
377sem_item::compare_referenced_symbol_properties (symtab_node *used_by,
378 symtab_node *n1,
379 symtab_node *n2,
380 bool address)
381{
382 if (is_a <cgraph_node *> (n1))
383 {
384 /* Inline properties matters: we do now want to merge uses of inline
385 function to uses of normal function because inline hint would be lost.
386 We however can merge inline function to noinline because the alias
387 will keep its DECL_DECLARED_INLINE flag.
388
389 Also ignore inline flag when optimizing for size or when function
390 is known to not be inlinable.
391
392 TODO: the optimize_size checks can also be assumed to be true if
393 unit has no !optimize_size functions. */
394
395 if ((!used_by || address || !is_a <cgraph_node *> (used_by)
396 || !opt_for_fn (used_by->decl, optimize_size))
397 && !opt_for_fn (n1->decl, optimize_size)
398 && n1->get_availability () > AVAIL_INTERPOSABLE
399 && (!DECL_UNINLINABLE (n1->decl) || !DECL_UNINLINABLE (n2->decl)))
400 {
401 if (DECL_DISREGARD_INLINE_LIMITS (n1->decl)
402 != DECL_DISREGARD_INLINE_LIMITS (n2->decl))
403 return return_false_with_msg
404 ("DECL_DISREGARD_INLINE_LIMITS are different");
405
406 if (DECL_DECLARED_INLINE_P (n1->decl)
407 != DECL_DECLARED_INLINE_P (n2->decl))
408 return return_false_with_msg ("inline attributes are different");
409 }
410
411 if (DECL_IS_OPERATOR_NEW (n1->decl)
412 != DECL_IS_OPERATOR_NEW (n2->decl))
413 return return_false_with_msg ("operator new flags are different");
414 }
415
416 /* Merging two definitions with a reference to equivalent vtables, but
417 belonging to a different type may result in ipa-polymorphic-call analysis
418 giving a wrong answer about the dynamic type of instance. */
419 if (is_a <varpool_node *> (n1))
420 {
421 if ((DECL_VIRTUAL_P (n1->decl) || DECL_VIRTUAL_P (n2->decl))
422 && (DECL_VIRTUAL_P (n1->decl) != DECL_VIRTUAL_P (n2->decl)
423 || !types_must_be_same_for_odr (DECL_CONTEXT (n1->decl),
424 DECL_CONTEXT (n2->decl)))
425 && (!used_by || !is_a <cgraph_node *> (used_by) || address
426 || opt_for_fn (used_by->decl, flag_devirtualize)))
427 return return_false_with_msg
428 ("references to virtual tables can not be merged");
b3587b99
JH
429
430 if (address && DECL_ALIGN (n1->decl) != DECL_ALIGN (n2->decl))
431 return return_false_with_msg ("alignment mismatch");
432
433 /* For functions we compare attributes in equals_wpa, because we do
434 not know what attributes may cause codegen differences, but for
435 variables just compare attributes for references - the codegen
436 for constructors is affected only by those attributes that we lower
437 to explicit representation (such as DECL_ALIGN or DECL_SECTION). */
438 if (!compare_attributes (DECL_ATTRIBUTES (n1->decl),
439 DECL_ATTRIBUTES (n2->decl)))
440 return return_false_with_msg ("different var decl attributes");
441 if (comp_type_attributes (TREE_TYPE (n1->decl),
442 TREE_TYPE (n2->decl)) != 1)
443 return return_false_with_msg ("different var type attributes");
977b01e3
JH
444 }
445
446 /* When matching virtual tables, be sure to also match information
447 relevant for polymorphic call analysis. */
448 if (used_by && is_a <varpool_node *> (used_by)
449 && DECL_VIRTUAL_P (used_by->decl))
450 {
451 if (DECL_VIRTUAL_P (n1->decl) != DECL_VIRTUAL_P (n2->decl))
452 return return_false_with_msg ("virtual flag mismatch");
453 if (DECL_VIRTUAL_P (n1->decl) && is_a <cgraph_node *> (n1)
454 && (DECL_FINAL_P (n1->decl) != DECL_FINAL_P (n2->decl)))
455 return return_false_with_msg ("final flag mismatch");
456 }
457 return true;
458}
459
460/* Hash properties that are compared by compare_referenced_symbol_properties. */
461
462void
463sem_item::hash_referenced_symbol_properties (symtab_node *ref,
464 inchash::hash &hstate,
465 bool address)
466{
467 if (is_a <cgraph_node *> (ref))
468 {
d57c9945 469 if ((type != FUNC || address || !opt_for_fn (decl, optimize_size))
977b01e3
JH
470 && !opt_for_fn (ref->decl, optimize_size)
471 && !DECL_UNINLINABLE (ref->decl))
472 {
473 hstate.add_flag (DECL_DISREGARD_INLINE_LIMITS (ref->decl));
474 hstate.add_flag (DECL_DECLARED_INLINE_P (ref->decl));
475 }
476 hstate.add_flag (DECL_IS_OPERATOR_NEW (ref->decl));
477 }
478 else if (is_a <varpool_node *> (ref))
479 {
480 hstate.add_flag (DECL_VIRTUAL_P (ref->decl));
b3587b99
JH
481 if (address)
482 hstate.add_int (DECL_ALIGN (ref->decl));
977b01e3
JH
483 }
484}
485
486
b84d4347
ML
487/* For a given symbol table nodes N1 and N2, we check that FUNCTION_DECLs
488 point to a same function. Comparison can be skipped if IGNORED_NODES
b6cddc7f 489 contains these nodes. ADDRESS indicate if address is taken. */
b84d4347
ML
490
491bool
977b01e3 492sem_item::compare_symbol_references (
b6cddc7f
ML
493 hash_map <symtab_node *, sem_item *> &ignored_nodes,
494 symtab_node *n1, symtab_node *n2, bool address)
b84d4347 495{
b6cddc7f
ML
496 enum availability avail1, avail2;
497
fe75bd20
JH
498 if (n1 == n2)
499 return true;
500
523f0450
JH
501 /* Never match variable and function. */
502 if (is_a <varpool_node *> (n1) != is_a <varpool_node *> (n2))
503 return false;
504
977b01e3
JH
505 if (!compare_referenced_symbol_properties (node, n1, n2, address))
506 return false;
b6cddc7f
ML
507 if (address && n1->equal_address_to (n2) == 1)
508 return true;
509 if (!address && n1->semantically_equivalent_p (n2))
b84d4347
ML
510 return true;
511
b6cddc7f
ML
512 n1 = n1->ultimate_alias_target (&avail1);
513 n2 = n2->ultimate_alias_target (&avail2);
514
d7e2ff72
JH
515 if (avail1 > AVAIL_INTERPOSABLE && ignored_nodes.get (n1)
516 && avail2 > AVAIL_INTERPOSABLE && ignored_nodes.get (n2))
b6cddc7f 517 return true;
b84d4347
ML
518
519 return return_false_with_msg ("different references");
520}
521
522/* If cgraph edges E1 and E2 are indirect calls, verify that
523 ECF flags are the same. */
524
525bool sem_function::compare_edge_flags (cgraph_edge *e1, cgraph_edge *e2)
526{
527 if (e1->indirect_info && e2->indirect_info)
528 {
529 int e1_flags = e1->indirect_info->ecf_flags;
530 int e2_flags = e2->indirect_info->ecf_flags;
531
532 if (e1_flags != e2_flags)
533 return return_false_with_msg ("ICF flags are different");
534 }
535 else if (e1->indirect_info || e2->indirect_info)
536 return false;
537
538 return true;
539}
540
b3587b99
JH
541/* Return true if parameter I may be used. */
542
543bool
544sem_function::param_used_p (unsigned int i)
545{
546 if (ipa_node_params_sum == NULL)
547 return false;
548
549 struct ipa_node_params *parms_info = IPA_NODE_REF (get_node ());
550
551 if (parms_info->descriptors.is_empty ()
552 || parms_info->descriptors.length () <= i)
553 return true;
554
555 return ipa_is_param_used (IPA_NODE_REF (get_node ()), i);
556}
557
1628e36b
JH
558/* Perform additional check needed to match types function parameters that are
559 used. Unlike for normal decls it matters if type is TYPE_RESTRICT and we
560 make an assumption that REFERENCE_TYPE parameters are always non-NULL. */
561
562bool
563sem_function::compatible_parm_types_p (tree parm1, tree parm2)
564{
565 /* Be sure that parameters are TBAA compatible. */
566 if (!func_checker::compatible_types_p (parm1, parm2))
567 return return_false_with_msg ("parameter type is not compatible");
568
569 if (POINTER_TYPE_P (parm1)
570 && (TYPE_RESTRICT (parm1) != TYPE_RESTRICT (parm2)))
571 return return_false_with_msg ("argument restrict flag mismatch");
572
573 /* nonnull_arg_p implies non-zero range to REFERENCE types. */
574 if (POINTER_TYPE_P (parm1)
575 && TREE_CODE (parm1) != TREE_CODE (parm2)
576 && opt_for_fn (decl, flag_delete_null_pointer_checks))
577 return return_false_with_msg ("pointer wrt reference mismatch");
578
579 return true;
580}
581
b84d4347
ML
582/* Fast equality function based on knowledge known in WPA. */
583
584bool
585sem_function::equals_wpa (sem_item *item,
586 hash_map <symtab_node *, sem_item *> &ignored_nodes)
587{
588 gcc_assert (item->type == FUNC);
fb5c322e
JH
589 cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
590 cgraph_node *cnode2 = dyn_cast <cgraph_node *> (item->node);
b84d4347
ML
591
592 m_compared_func = static_cast<sem_function *> (item);
593
fb5c322e
JH
594 if (cnode->thunk.thunk_p != cnode2->thunk.thunk_p)
595 return return_false_with_msg ("thunk_p mismatch");
596
597 if (cnode->thunk.thunk_p)
598 {
599 if (cnode->thunk.fixed_offset != cnode2->thunk.fixed_offset)
600 return return_false_with_msg ("thunk fixed_offset mismatch");
601 if (cnode->thunk.virtual_value != cnode2->thunk.virtual_value)
602 return return_false_with_msg ("thunk virtual_value mismatch");
603 if (cnode->thunk.this_adjusting != cnode2->thunk.this_adjusting)
604 return return_false_with_msg ("thunk this_adjusting mismatch");
605 if (cnode->thunk.virtual_offset_p != cnode2->thunk.virtual_offset_p)
606 return return_false_with_msg ("thunk virtual_offset_p mismatch");
607 if (cnode->thunk.add_pointer_bounds_args
608 != cnode2->thunk.add_pointer_bounds_args)
609 return return_false_with_msg ("thunk add_pointer_bounds_args mismatch");
610 }
611
c4234544
JH
612 /* Compare special function DECL attributes. */
613 if (DECL_FUNCTION_PERSONALITY (decl)
614 != DECL_FUNCTION_PERSONALITY (item->decl))
615 return return_false_with_msg ("function personalities are different");
616
c4234544
JH
617 if (DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl)
618 != DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (item->decl))
619 return return_false_with_msg ("intrument function entry exit "
620 "attributes are different");
621
622 if (DECL_NO_LIMIT_STACK (decl) != DECL_NO_LIMIT_STACK (item->decl))
623 return return_false_with_msg ("no stack limit attributes are different");
624
060cfff4 625 if (DECL_CXX_CONSTRUCTOR_P (decl) != DECL_CXX_CONSTRUCTOR_P (item->decl))
69f6b1f4 626 return return_false_with_msg ("DECL_CXX_CONSTRUCTOR mismatch");
060cfff4
JH
627
628 if (DECL_CXX_DESTRUCTOR_P (decl) != DECL_CXX_DESTRUCTOR_P (item->decl))
69f6b1f4 629 return return_false_with_msg ("DECL_CXX_DESTRUCTOR mismatch");
060cfff4 630
b3587b99
JH
631 /* TODO: pure/const flags mostly matters only for references, except for
632 the fact that codegen takes LOOPING flag as a hint that loops are
633 finite. We may arrange the code to always pick leader that has least
634 specified flags and then this can go into comparing symbol properties. */
c4234544
JH
635 if (flags_from_decl_or_type (decl) != flags_from_decl_or_type (item->decl))
636 return return_false_with_msg ("decl_or_type flags are different");
637
060cfff4
JH
638 /* Do not match polymorphic constructors of different types. They calls
639 type memory location for ipa-polymorphic-call and we do not want
640 it to get confused by wrong type. */
641 if (DECL_CXX_CONSTRUCTOR_P (decl)
642 && TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE)
643 {
644 if (TREE_CODE (TREE_TYPE (item->decl)) != METHOD_TYPE)
645 return return_false_with_msg ("DECL_CXX_CONSTURCTOR type mismatch");
646 else if (!func_checker::compatible_polymorphic_types_p
70e7f2a2
JH
647 (TYPE_METHOD_BASETYPE (TREE_TYPE (decl)),
648 TYPE_METHOD_BASETYPE (TREE_TYPE (item->decl)), false))
060cfff4
JH
649 return return_false_with_msg ("ctor polymorphic type mismatch");
650 }
651
c4234544
JH
652 /* Checking function TARGET and OPTIMIZATION flags. */
653 cl_target_option *tar1 = target_opts_for_fn (decl);
654 cl_target_option *tar2 = target_opts_for_fn (item->decl);
655
656 if (tar1 != tar2 && !cl_target_option_eq (tar1, tar2))
657 {
658 if (dump_file && (dump_flags & TDF_DETAILS))
659 {
660 fprintf (dump_file, "target flags difference");
661 cl_target_option_print_diff (dump_file, 2, tar1, tar2);
662 }
663
664 return return_false_with_msg ("Target flags are different");
665 }
666
667 cl_optimization *opt1 = opts_for_fn (decl);
668 cl_optimization *opt2 = opts_for_fn (item->decl);
669
670 if (opt1 != opt2 && memcmp (opt1, opt2, sizeof(cl_optimization)))
671 {
672 if (dump_file && (dump_flags & TDF_DETAILS))
673 {
674 fprintf (dump_file, "optimization flags difference");
675 cl_optimization_print_diff (dump_file, 2, opt1, opt2);
676 }
677
678 return return_false_with_msg ("optimization flags are different");
679 }
680
681 /* Result type checking. */
1628e36b
JH
682 if (!func_checker::compatible_types_p
683 (TREE_TYPE (TREE_TYPE (decl)),
684 TREE_TYPE (TREE_TYPE (m_compared_func->decl))))
c4234544
JH
685 return return_false_with_msg ("result types are different");
686
b84d4347 687 /* Checking types of arguments. */
1628e36b
JH
688 tree list1 = TYPE_ARG_TYPES (TREE_TYPE (decl)),
689 list2 = TYPE_ARG_TYPES (TREE_TYPE (m_compared_func->decl));
690 for (unsigned i = 0; list1 && list2;
691 list1 = TREE_CHAIN (list1), list2 = TREE_CHAIN (list2), i++)
b84d4347 692 {
1628e36b
JH
693 tree parm1 = TREE_VALUE (list1);
694 tree parm2 = TREE_VALUE (list2);
695
b84d4347 696 /* This guard is here for function pointer with attributes (pr59927.c). */
1628e36b 697 if (!parm1 || !parm2)
b84d4347
ML
698 return return_false_with_msg ("NULL argument type");
699
1628e36b
JH
700 /* Verify that types are compatible to ensure that both functions
701 have same calling conventions. */
702 if (!types_compatible_p (parm1, parm2))
703 return return_false_with_msg ("parameter types are not compatible");
b3587b99 704
b3587b99
JH
705 if (!param_used_p (i))
706 continue;
1628e36b
JH
707
708 /* Perform additional checks for used parameters. */
709 if (!compatible_parm_types_p (parm1, parm2))
710 return false;
b84d4347
ML
711 }
712
1628e36b
JH
713 if (list1 || list2)
714 return return_false_with_msg ("Mismatched number of parameters");
715
b84d4347
ML
716 if (node->num_references () != item->node->num_references ())
717 return return_false_with_msg ("different number of references");
718
b3587b99
JH
719 /* Checking function attributes.
720 This is quadratic in number of attributes */
fe75bd20
JH
721 if (comp_type_attributes (TREE_TYPE (decl),
722 TREE_TYPE (item->decl)) != 1)
723 return return_false_with_msg ("different type attributes");
b3587b99
JH
724 if (!compare_attributes (DECL_ATTRIBUTES (decl),
725 DECL_ATTRIBUTES (item->decl)))
726 return return_false_with_msg ("different decl attributes");
fe75bd20 727
060cfff4
JH
728 /* The type of THIS pointer type memory location for
729 ipa-polymorphic-call-analysis. */
730 if (opt_for_fn (decl, flag_devirtualize)
731 && (TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE
732 || TREE_CODE (TREE_TYPE (item->decl)) == METHOD_TYPE)
b3587b99 733 && param_used_p (0)
060cfff4
JH
734 && compare_polymorphic_p ())
735 {
736 if (TREE_CODE (TREE_TYPE (decl)) != TREE_CODE (TREE_TYPE (item->decl)))
737 return return_false_with_msg ("METHOD_TYPE and FUNCTION_TYPE mismatch");
738 if (!func_checker::compatible_polymorphic_types_p
70e7f2a2
JH
739 (TYPE_METHOD_BASETYPE (TREE_TYPE (decl)),
740 TYPE_METHOD_BASETYPE (TREE_TYPE (item->decl)), false))
060cfff4
JH
741 return return_false_with_msg ("THIS pointer ODR type mismatch");
742 }
743
b84d4347
ML
744 ipa_ref *ref = NULL, *ref2 = NULL;
745 for (unsigned i = 0; node->iterate_reference (i, ref); i++)
746 {
747 item->node->iterate_reference (i, ref2);
748
b3587b99
JH
749 if (ref->use != ref2->use)
750 return return_false_with_msg ("reference use mismatch");
751
977b01e3 752 if (!compare_symbol_references (ignored_nodes, ref->referred,
b6cddc7f
ML
753 ref2->referred,
754 ref->address_matters_p ()))
b84d4347
ML
755 return false;
756 }
757
758 cgraph_edge *e1 = dyn_cast <cgraph_node *> (node)->callees;
759 cgraph_edge *e2 = dyn_cast <cgraph_node *> (item->node)->callees;
760
761 while (e1 && e2)
762 {
977b01e3 763 if (!compare_symbol_references (ignored_nodes, e1->callee,
b6cddc7f 764 e2->callee, false))
b84d4347 765 return false;
b3587b99
JH
766 if (!compare_edge_flags (e1, e2))
767 return false;
b84d4347
ML
768
769 e1 = e1->next_callee;
770 e2 = e2->next_callee;
771 }
772
773 if (e1 || e2)
b3587b99
JH
774 return return_false_with_msg ("different number of calls");
775
776 e1 = dyn_cast <cgraph_node *> (node)->indirect_calls;
777 e2 = dyn_cast <cgraph_node *> (item->node)->indirect_calls;
778
779 while (e1 && e2)
780 {
781 if (!compare_edge_flags (e1, e2))
782 return false;
783
784 e1 = e1->next_callee;
785 e2 = e2->next_callee;
786 }
787
788 if (e1 || e2)
789 return return_false_with_msg ("different number of indirect calls");
b84d4347
ML
790
791 return true;
792}
793
3ab93359
ML
794/* Update hash by address sensitive references. We iterate over all
795 sensitive references (address_matters_p) and we hash ultime alias
796 target of these nodes, which can improve a semantic item hash.
977b01e3
JH
797
798 Also hash in referenced symbols properties. This can be done at any time
799 (as the properties should not change), but it is convenient to do it here
800 while we walk the references anyway. */
3ab93359
ML
801
802void
803sem_item::update_hash_by_addr_refs (hash_map <symtab_node *,
804 sem_item *> &m_symtab_node_map)
805{
3ab93359 806 ipa_ref* ref;
808b6bb7 807 inchash::hash hstate (get_hash ());
977b01e3
JH
808
809 for (unsigned i = 0; node->iterate_reference (i, ref); i++)
3ab93359 810 {
b3587b99 811 hstate.add_int (ref->use);
977b01e3
JH
812 hash_referenced_symbol_properties (ref->referred, hstate,
813 ref->use == IPA_REF_ADDR);
3ab93359 814 if (ref->address_matters_p () || !m_symtab_node_map.get (ref->referred))
f45be077 815 hstate.add_int (ref->referred->ultimate_alias_target ()->order);
3ab93359
ML
816 }
817
818 if (is_a <cgraph_node *> (node))
819 {
820 for (cgraph_edge *e = dyn_cast <cgraph_node *> (node)->callers; e;
821 e = e->next_caller)
822 {
823 sem_item **result = m_symtab_node_map.get (e->callee);
977b01e3 824 hash_referenced_symbol_properties (e->callee, hstate, false);
3ab93359 825 if (!result)
f45be077 826 hstate.add_int (e->callee->ultimate_alias_target ()->order);
3ab93359
ML
827 }
828 }
829
808b6bb7 830 set_hash (hstate.end ());
3ab93359
ML
831}
832
833/* Update hash by computed local hash values taken from different
977b01e3
JH
834 semantic items.
835 TODO: stronger SCC based hashing would be desirable here. */
3ab93359
ML
836
837void
838sem_item::update_hash_by_local_refs (hash_map <symtab_node *,
839 sem_item *> &m_symtab_node_map)
840{
977b01e3 841 ipa_ref* ref;
808b6bb7 842 inchash::hash state (get_hash ());
977b01e3
JH
843
844 for (unsigned j = 0; node->iterate_reference (j, ref); j++)
3ab93359 845 {
3ab93359
ML
846 sem_item **result = m_symtab_node_map.get (ref->referring);
847 if (result)
808b6bb7 848 state.merge_hash ((*result)->get_hash ());
3ab93359
ML
849 }
850
851 if (type == FUNC)
852 {
853 for (cgraph_edge *e = dyn_cast <cgraph_node *> (node)->callees; e;
854 e = e->next_callee)
855 {
856 sem_item **result = m_symtab_node_map.get (e->caller);
857 if (result)
808b6bb7 858 state.merge_hash ((*result)->get_hash ());
3ab93359
ML
859 }
860 }
861
862 global_hash = state.end ();
863}
864
b84d4347
ML
865/* Returns true if the item equals to ITEM given as argument. */
866
867bool
868sem_function::equals (sem_item *item,
fb5c322e 869 hash_map <symtab_node *, sem_item *> &)
b84d4347
ML
870{
871 gcc_assert (item->type == FUNC);
fb5c322e 872 bool eq = equals_private (item);
b84d4347
ML
873
874 if (m_checker != NULL)
875 {
876 delete m_checker;
877 m_checker = NULL;
878 }
879
880 if (dump_file && (dump_flags & TDF_DETAILS))
881 fprintf (dump_file,
882 "Equals called for:%s:%s (%u:%u) (%s:%s) with result: %s\n\n",
1aec2ecc
ML
883 xstrdup_for_dump (node->name()),
884 xstrdup_for_dump (item->node->name ()),
885 node->order,
886 item->node->order,
887 xstrdup_for_dump (node->asm_name ()),
888 xstrdup_for_dump (item->node->asm_name ()),
889 eq ? "true" : "false");
b84d4347
ML
890
891 return eq;
892}
893
894/* Processes function equality comparison. */
895
896bool
fb5c322e 897sem_function::equals_private (sem_item *item)
b84d4347
ML
898{
899 if (item->type != FUNC)
900 return false;
901
902 basic_block bb1, bb2;
903 edge e1, e2;
904 edge_iterator ei1, ei2;
b84d4347
ML
905 bool result = true;
906 tree arg1, arg2;
907
908 m_compared_func = static_cast<sem_function *> (item);
909
910 gcc_assert (decl != item->decl);
911
912 if (bb_sorted.length () != m_compared_func->bb_sorted.length ()
913 || edge_count != m_compared_func->edge_count
914 || cfg_checksum != m_compared_func->cfg_checksum)
915 return return_false ();
916
b84d4347
ML
917 m_checker = new func_checker (decl, m_compared_func->decl,
918 compare_polymorphic_p (),
919 false,
920 &refs_set,
921 &m_compared_func->refs_set);
1628e36b
JH
922 arg1 = DECL_ARGUMENTS (decl);
923 arg2 = DECL_ARGUMENTS (m_compared_func->decl);
924 for (unsigned i = 0;
925 arg1 && arg2; arg1 = DECL_CHAIN (arg1), arg2 = DECL_CHAIN (arg2), i++)
926 {
927 if (!types_compatible_p (TREE_TYPE (arg1), TREE_TYPE (arg2)))
928 return return_false_with_msg ("argument types are not compatible");
929 if (!param_used_p (i))
930 continue;
931 /* Perform additional checks for used parameters. */
932 if (!compatible_parm_types_p (TREE_TYPE (arg1), TREE_TYPE (arg2)))
933 return false;
934 if (!m_checker->compare_decl (arg1, arg2))
935 return return_false ();
936 }
937 if (arg1 || arg2)
938 return return_false_with_msg ("Mismatched number of arguments");
b84d4347 939
fb5c322e
JH
940 if (!dyn_cast <cgraph_node *> (node)->has_gimple_body_p ())
941 return true;
942
b84d4347
ML
943 /* Fill-up label dictionary. */
944 for (unsigned i = 0; i < bb_sorted.length (); ++i)
945 {
946 m_checker->parse_labels (bb_sorted[i]);
947 m_checker->parse_labels (m_compared_func->bb_sorted[i]);
948 }
949
950 /* Checking all basic blocks. */
951 for (unsigned i = 0; i < bb_sorted.length (); ++i)
952 if(!m_checker->compare_bb (bb_sorted[i], m_compared_func->bb_sorted[i]))
953 return return_false();
954
955 dump_message ("All BBs are equal\n");
956
c190efcc
ML
957 auto_vec <int> bb_dict;
958
b84d4347
ML
959 /* Basic block edges check. */
960 for (unsigned i = 0; i < bb_sorted.length (); ++i)
961 {
b84d4347
ML
962 bb1 = bb_sorted[i]->bb;
963 bb2 = m_compared_func->bb_sorted[i]->bb;
964
965 ei2 = ei_start (bb2->preds);
966
967 for (ei1 = ei_start (bb1->preds); ei_cond (ei1, &e1); ei_next (&ei1))
968 {
969 ei_cond (ei2, &e2);
970
971 if (e1->flags != e2->flags)
972 return return_false_with_msg ("flags comparison returns false");
973
1216ea72 974 if (!bb_dict_test (&bb_dict, e1->src->index, e2->src->index))
b84d4347
ML
975 return return_false_with_msg ("edge comparison returns false");
976
1216ea72 977 if (!bb_dict_test (&bb_dict, e1->dest->index, e2->dest->index))
b84d4347
ML
978 return return_false_with_msg ("BB comparison returns false");
979
980 if (!m_checker->compare_edge (e1, e2))
981 return return_false_with_msg ("edge comparison returns false");
982
983 ei_next (&ei2);
984 }
985 }
986
987 /* Basic block PHI nodes comparison. */
988 for (unsigned i = 0; i < bb_sorted.length (); i++)
989 if (!compare_phi_node (bb_sorted[i]->bb, m_compared_func->bb_sorted[i]->bb))
990 return return_false_with_msg ("PHI node comparison returns false");
991
992 return result;
993}
994
106b5466
JH
995/* Set LOCAL_P of NODE to true if DATA is non-NULL.
996 Helper for call_for_symbol_thunks_and_aliases. */
997
998static bool
999set_local (cgraph_node *node, void *data)
1000{
1001 node->local.local = data != NULL;
1002 return false;
1003}
1004
412049de 1005/* TREE_ADDRESSABLE of NODE to true.
0a7246ee
JH
1006 Helper for call_for_symbol_thunks_and_aliases. */
1007
1008static bool
1009set_addressable (varpool_node *node, void *)
1010{
1011 TREE_ADDRESSABLE (node->decl) = 1;
1012 return false;
1013}
1014
412049de
JH
1015/* Clear DECL_RTL of NODE.
1016 Helper for call_for_symbol_thunks_and_aliases. */
1017
1018static bool
1019clear_decl_rtl (symtab_node *node, void *)
1020{
1021 SET_DECL_RTL (node->decl, NULL);
1022 return false;
1023}
1024
0a7246ee
JH
1025/* Redirect all callers of N and its aliases to TO. Remove aliases if
1026 possible. Return number of redirections made. */
1027
1028static int
1029redirect_all_callers (cgraph_node *n, cgraph_node *to)
1030{
1031 int nredirected = 0;
1032 ipa_ref *ref;
17d1bf76 1033 cgraph_edge *e = n->callers;
0a7246ee 1034
17d1bf76 1035 while (e)
0a7246ee 1036 {
17d1bf76
ML
1037 /* Redirecting thunks to interposable symbols or symbols in other sections
1038 may not be supported by target output code. Play safe for now and
1039 punt on redirection. */
1040 if (!e->caller->thunk.thunk_p)
1041 {
1042 struct cgraph_edge *nexte = e->next_caller;
1043 e->redirect_callee (to);
1044 e = nexte;
1045 nredirected++;
1046 }
1047 else
1048 e = e->next_callee;
0a7246ee
JH
1049 }
1050 for (unsigned i = 0; n->iterate_direct_aliases (i, ref);)
1051 {
1052 bool removed = false;
1053 cgraph_node *n_alias = dyn_cast <cgraph_node *> (ref->referring);
1054
1055 if ((DECL_COMDAT_GROUP (n->decl)
1056 && (DECL_COMDAT_GROUP (n->decl)
1057 == DECL_COMDAT_GROUP (n_alias->decl)))
1058 || (n_alias->get_availability () > AVAIL_INTERPOSABLE
1059 && n->get_availability () > AVAIL_INTERPOSABLE))
1060 {
1061 nredirected += redirect_all_callers (n_alias, to);
1062 if (n_alias->can_remove_if_no_direct_calls_p ()
17d1bf76
ML
1063 && !n_alias->call_for_symbol_and_aliases (cgraph_node::has_thunk_p,
1064 NULL, true)
0a7246ee
JH
1065 && !n_alias->has_aliases_p ())
1066 n_alias->remove ();
1067 }
1068 if (!removed)
1069 i++;
1070 }
1071 return nredirected;
1072}
1073
b84d4347
ML
1074/* Merges instance with an ALIAS_ITEM, where alias, thunk or redirection can
1075 be applied. */
0a7246ee 1076
b84d4347
ML
1077bool
1078sem_function::merge (sem_item *alias_item)
1079{
1080 gcc_assert (alias_item->type == FUNC);
1081
1082 sem_function *alias_func = static_cast<sem_function *> (alias_item);
1083
1084 cgraph_node *original = get_node ();
0a7246ee 1085 cgraph_node *local_original = NULL;
b84d4347 1086 cgraph_node *alias = alias_func->get_node ();
b84d4347 1087
0a7246ee 1088 bool create_wrapper = false;
b84d4347
ML
1089 bool create_alias = false;
1090 bool redirect_callers = false;
0a7246ee
JH
1091 bool remove = false;
1092
b84d4347 1093 bool original_discardable = false;
c7a06bc1 1094 bool original_discarded = false;
b84d4347 1095
0a7246ee
JH
1096 bool original_address_matters = original->address_matters_p ();
1097 bool alias_address_matters = alias->address_matters_p ();
1098
257291fc
JH
1099 if (DECL_EXTERNAL (alias->decl))
1100 {
1101 if (dump_file)
1102 fprintf (dump_file, "Not unifying; alias is external.\n\n");
1103 return false;
1104 }
1105
0a7246ee
JH
1106 if (DECL_NO_INLINE_WARNING_P (original->decl)
1107 != DECL_NO_INLINE_WARNING_P (alias->decl))
1108 {
1109 if (dump_file)
1110 fprintf (dump_file,
1111 "Not unifying; "
1112 "DECL_NO_INLINE_WARNING mismatch.\n\n");
1113 return false;
1114 }
1115
b84d4347
ML
1116 /* Do not attempt to mix functions from different user sections;
1117 we do not know what user intends with those. */
1118 if (((DECL_SECTION_NAME (original->decl) && !original->implicit_section)
1119 || (DECL_SECTION_NAME (alias->decl) && !alias->implicit_section))
1120 && DECL_SECTION_NAME (original->decl) != DECL_SECTION_NAME (alias->decl))
1121 {
1122 if (dump_file)
1123 fprintf (dump_file,
0a7246ee
JH
1124 "Not unifying; "
1125 "original and alias are in different sections.\n\n");
b84d4347
ML
1126 return false;
1127 }
1128
1129 /* See if original is in a section that can be discarded if the main
c7a06bc1 1130 symbol is not used. */
0a7246ee 1131
c7a06bc1
JH
1132 if (original->can_be_discarded_p ())
1133 original_discardable = true;
1134 /* Also consider case where we have resolution info and we know that
0a7246ee
JH
1135 original's definition is not going to be used. In this case we can not
1136 create alias to original. */
c7a06bc1
JH
1137 if (node->resolution != LDPR_UNKNOWN
1138 && !decl_binds_to_current_def_p (node->decl))
1139 original_discardable = original_discarded = true;
b84d4347 1140
0a7246ee
JH
1141 /* Creating a symtab alias is the optimal way to merge.
1142 It however can not be used in the following cases:
1143
1144 1) if ORIGINAL and ALIAS may be possibly compared for address equality.
1145 2) if ORIGINAL is in a section that may be discarded by linker or if
1146 it is an external functions where we can not create an alias
1147 (ORIGINAL_DISCARDABLE)
1148 3) if target do not support symbol aliases.
bbcdfb93 1149 4) original and alias lie in different comdat groups.
0a7246ee
JH
1150
1151 If we can not produce alias, we will turn ALIAS into WRAPPER of ORIGINAL
1152 and/or redirect all callers from ALIAS to ORIGINAL. */
1153 if ((original_address_matters && alias_address_matters)
bbcdfb93
JH
1154 || (original_discardable
1155 && (!DECL_COMDAT_GROUP (alias->decl)
1156 || (DECL_COMDAT_GROUP (alias->decl)
1157 != DECL_COMDAT_GROUP (original->decl))))
c7a06bc1 1158 || original_discarded
bbcdfb93
JH
1159 || !sem_item::target_supports_symbol_aliases_p ()
1160 || DECL_COMDAT_GROUP (alias->decl) != DECL_COMDAT_GROUP (original->decl))
b84d4347 1161 {
0a7246ee
JH
1162 /* First see if we can produce wrapper. */
1163
977b01e3
JH
1164 /* Symbol properties that matter for references must be preserved.
1165 TODO: We can produce wrapper, but we need to produce alias of ORIGINAL
1166 with proper properties. */
1167 if (!sem_item::compare_referenced_symbol_properties (NULL, original, alias,
1168 alias->address_taken))
1169 {
1170 if (dump_file)
1171 fprintf (dump_file,
1172 "Wrapper cannot be created because referenced symbol "
1173 "properties mismatch\n");
1174 }
0a7246ee
JH
1175 /* Do not turn function in one comdat group into wrapper to another
1176 comdat group. Other compiler producing the body of the
1177 another comdat group may make opossite decision and with unfortunate
1178 linker choices this may close a loop. */
977b01e3
JH
1179 else if (DECL_COMDAT_GROUP (original->decl)
1180 && DECL_COMDAT_GROUP (alias->decl)
1181 && (DECL_COMDAT_GROUP (alias->decl)
1182 != DECL_COMDAT_GROUP (original->decl)))
0a7246ee
JH
1183 {
1184 if (dump_file)
1185 fprintf (dump_file,
1186 "Wrapper cannot be created because of COMDAT\n");
1187 }
1188 else if (DECL_STATIC_CHAIN (alias->decl))
1189 {
1190 if (dump_file)
1191 fprintf (dump_file,
1192 "Can not create wrapper of nested functions.\n");
1193 }
1194 /* TODO: We can also deal with variadic functions never calling
1195 VA_START. */
1196 else if (stdarg_p (TREE_TYPE (alias->decl)))
1197 {
1198 if (dump_file)
1199 fprintf (dump_file,
1200 "can not create wrapper of stdarg function.\n");
1201 }
1202 else if (inline_summaries
1203 && inline_summaries->get (alias)->self_size <= 2)
1204 {
1205 if (dump_file)
1206 fprintf (dump_file, "Wrapper creation is not "
1207 "profitable (function is too small).\n");
1208 }
1209 /* If user paid attention to mark function noinline, assume it is
1210 somewhat special and do not try to turn it into a wrapper that can
1211 not be undone by inliner. */
1212 else if (lookup_attribute ("noinline", DECL_ATTRIBUTES (alias->decl)))
1213 {
1214 if (dump_file)
1215 fprintf (dump_file, "Wrappers are not created for noinline.\n");
1216 }
1217 else
1218 create_wrapper = true;
1219
1220 /* We can redirect local calls in the case both alias and orignal
1221 are not interposable. */
b84d4347 1222 redirect_callers
0a7246ee
JH
1223 = alias->get_availability () > AVAIL_INTERPOSABLE
1224 && original->get_availability () > AVAIL_INTERPOSABLE
1225 && !alias->instrumented_version;
977b01e3
JH
1226 /* TODO: We can redirect, but we need to produce alias of ORIGINAL
1227 with proper properties. */
1228 if (!sem_item::compare_referenced_symbol_properties (NULL, original, alias,
1229 alias->address_taken))
1230 redirect_callers = false;
b84d4347 1231
0a7246ee
JH
1232 if (!redirect_callers && !create_wrapper)
1233 {
1234 if (dump_file)
1235 fprintf (dump_file, "Not unifying; can not redirect callers nor "
1236 "produce wrapper\n\n");
1237 return false;
1238 }
1239
1240 /* Work out the symbol the wrapper should call.
1241 If ORIGINAL is interposable, we need to call a local alias.
c7a06bc1
JH
1242 Also produce local alias (if possible) as an optimization.
1243
1244 Local aliases can not be created inside comdat groups because that
1245 prevents inlining. */
1246 if (!original_discardable && !original->get_comdat_group ())
0a7246ee
JH
1247 {
1248 local_original
1249 = dyn_cast <cgraph_node *> (original->noninterposable_alias ());
1250 if (!local_original
1251 && original->get_availability () > AVAIL_INTERPOSABLE)
1252 local_original = original;
0a7246ee
JH
1253 }
1254 /* If we can not use local alias, fallback to the original
1255 when possible. */
1256 else if (original->get_availability () > AVAIL_INTERPOSABLE)
1257 local_original = original;
c7a06bc1
JH
1258
1259 /* If original is COMDAT local, we can not really redirect calls outside
1260 of its comdat group to it. */
1261 if (original->comdat_local_p ())
1262 redirect_callers = false;
0a7246ee
JH
1263 if (!local_original)
1264 {
1265 if (dump_file)
1266 fprintf (dump_file, "Not unifying; "
1267 "can not produce local alias.\n\n");
1268 return false;
1269 }
f657d665 1270
0a7246ee
JH
1271 if (!redirect_callers && !create_wrapper)
1272 {
1273 if (dump_file)
1274 fprintf (dump_file, "Not unifying; "
1275 "can not redirect callers nor produce a wrapper\n\n");
1276 return false;
1277 }
1278 if (!create_wrapper
17d1bf76
ML
1279 && !alias->call_for_symbol_and_aliases (cgraph_node::has_thunk_p,
1280 NULL, true)
0a7246ee
JH
1281 && !alias->can_remove_if_no_direct_calls_p ())
1282 {
1283 if (dump_file)
1284 fprintf (dump_file, "Not unifying; can not make wrapper and "
1285 "function has other uses than direct calls\n\n");
1286 return false;
1287 }
544dafa6 1288 }
0a7246ee
JH
1289 else
1290 create_alias = true;
544dafa6 1291
b84d4347
ML
1292 if (redirect_callers)
1293 {
0a7246ee 1294 int nredirected = redirect_all_callers (alias, local_original);
b84d4347 1295
0a7246ee
JH
1296 if (nredirected)
1297 {
1298 alias->icf_merged = true;
1299 local_original->icf_merged = true;
b84d4347 1300
0a7246ee
JH
1301 if (dump_file && nredirected)
1302 fprintf (dump_file, "%i local calls have been "
1303 "redirected.\n", nredirected);
b84d4347
ML
1304 }
1305
0a7246ee
JH
1306 /* If all callers was redirected, do not produce wrapper. */
1307 if (alias->can_remove_if_no_direct_calls_p ()
1308 && !alias->has_aliases_p ())
1309 {
1310 create_wrapper = false;
1311 remove = true;
1312 }
1313 gcc_assert (!create_alias);
b84d4347 1314 }
b84d4347
ML
1315 else if (create_alias)
1316 {
1317 alias->icf_merged = true;
1318
1319 /* Remove the function's body. */
1320 ipa_merge_profiles (original, alias);
1321 alias->release_body (true);
1322 alias->reset ();
412049de
JH
1323 /* Notice global symbol possibly produced RTL. */
1324 ((symtab_node *)alias)->call_for_symbol_and_aliases (clear_decl_rtl,
1325 NULL, true);
b84d4347
ML
1326
1327 /* Create the alias. */
1328 cgraph_node::create_alias (alias_func->decl, decl);
1329 alias->resolve_alias (original);
1330
106b5466
JH
1331 original->call_for_symbol_thunks_and_aliases
1332 (set_local, (void *)(size_t) original->local_p (), true);
9d4ded75 1333
b84d4347 1334 if (dump_file)
0a7246ee 1335 fprintf (dump_file, "Unified; Function alias has been created.\n\n");
b84d4347 1336 }
0a7246ee 1337 if (create_wrapper)
b84d4347 1338 {
0a7246ee
JH
1339 gcc_assert (!create_alias);
1340 alias->icf_merged = true;
1341 local_original->icf_merged = true;
b84d4347 1342
0a7246ee
JH
1343 ipa_merge_profiles (local_original, alias, true);
1344 alias->create_wrapper (local_original);
b84d4347 1345
0a7246ee
JH
1346 if (dump_file)
1347 fprintf (dump_file, "Unified; Wrapper has been created.\n\n");
1348 }
17d1bf76
ML
1349
1350 /* It's possible that redirection can hit thunks that block
1351 redirection opportunities. */
1352 gcc_assert (alias->icf_merged || remove || redirect_callers);
0a7246ee 1353 original->icf_merged = true;
34b42fb0 1354
88636b62
JH
1355 /* We use merged flag to track cases where COMDAT function is known to be
1356 compatible its callers. If we merged in non-COMDAT, we need to give up
1357 on this optimization. */
1358 if (original->merged_comdat && !alias->merged_comdat)
1359 {
1360 if (dump_file)
1361 fprintf (dump_file, "Dropping merged_comdat flag.\n\n");
1362 local_original->merged_comdat = original->merged_comdat = false;
1363 }
34b42fb0 1364
0a7246ee
JH
1365 if (remove)
1366 {
1367 ipa_merge_profiles (original, alias);
1368 alias->release_body ();
1369 alias->reset ();
1370 alias->body_removed = true;
b84d4347 1371 alias->icf_merged = true;
b84d4347 1372 if (dump_file)
0a7246ee 1373 fprintf (dump_file, "Unified; Function body was removed.\n");
b84d4347 1374 }
b84d4347
ML
1375
1376 return true;
1377}
1378
1379/* Semantic item initialization function. */
1380
1381void
1382sem_function::init (void)
1383{
1384 if (in_lto_p)
70486010 1385 get_node ()->get_untransformed_body ();
b84d4347
ML
1386
1387 tree fndecl = node->decl;
1388 function *func = DECL_STRUCT_FUNCTION (fndecl);
1389
1390 gcc_assert (func);
1391 gcc_assert (SSANAMES (func));
1392
1393 ssa_names_size = SSANAMES (func)->length ();
1394 node = node;
1395
1396 decl = fndecl;
1397 region_tree = func->eh->region_tree;
1398
1399 /* iterating all function arguments. */
1400 arg_count = count_formal_params (fndecl);
1401
1402 edge_count = n_edges_for_fn (func);
fb5c322e
JH
1403 cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
1404 if (!cnode->thunk.thunk_p)
1405 {
1406 cfg_checksum = coverage_compute_cfg_checksum (func);
b84d4347 1407
fb5c322e 1408 inchash::hash hstate;
b84d4347 1409
fb5c322e
JH
1410 basic_block bb;
1411 FOR_EACH_BB_FN (bb, func)
b84d4347 1412 {
fb5c322e 1413 unsigned nondbg_stmt_count = 0;
b84d4347 1414
fb5c322e
JH
1415 edge e;
1416 for (edge_iterator ei = ei_start (bb->preds); ei_cond (ei, &e);
1417 ei_next (&ei))
1418 cfg_checksum = iterative_hash_host_wide_int (e->flags,
1419 cfg_checksum);
1420
1421 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
1422 gsi_next (&gsi))
b84d4347 1423 {
355fe088 1424 gimple *stmt = gsi_stmt (gsi);
fb5c322e
JH
1425
1426 if (gimple_code (stmt) != GIMPLE_DEBUG
1427 && gimple_code (stmt) != GIMPLE_PREDICT)
1428 {
1429 hash_stmt (stmt, hstate);
1430 nondbg_stmt_count++;
1431 }
b84d4347 1432 }
b84d4347 1433
fb5c322e
JH
1434 gcode_hash = hstate.end ();
1435 bb_sizes.safe_push (nondbg_stmt_count);
b84d4347 1436
fb5c322e
JH
1437 /* Inserting basic block to hash table. */
1438 sem_bb *semantic_bb = new sem_bb (bb, nondbg_stmt_count,
1439 EDGE_COUNT (bb->preds)
1440 + EDGE_COUNT (bb->succs));
b84d4347 1441
fb5c322e
JH
1442 bb_sorted.safe_push (semantic_bb);
1443 }
1444 }
1445 else
1446 {
1447 cfg_checksum = 0;
1448 inchash::hash hstate;
1449 hstate.add_wide_int (cnode->thunk.fixed_offset);
1450 hstate.add_wide_int (cnode->thunk.virtual_value);
1451 hstate.add_flag (cnode->thunk.this_adjusting);
1452 hstate.add_flag (cnode->thunk.virtual_offset_p);
1453 hstate.add_flag (cnode->thunk.add_pointer_bounds_args);
1454 gcode_hash = hstate.end ();
1455 }
b84d4347
ML
1456}
1457
a8d93817
JH
1458/* Accumulate to HSTATE a hash of expression EXP.
1459 Identical to inchash::add_expr, but guaranteed to be stable across LTO
1460 and DECL equality classes. */
1461
1462void
1463sem_item::add_expr (const_tree exp, inchash::hash &hstate)
1464{
1465 if (exp == NULL_TREE)
1466 {
1467 hstate.merge_hash (0);
1468 return;
1469 }
1470
1471 /* Handled component can be matched in a cureful way proving equivalence
1472 even if they syntactically differ. Just skip them. */
1473 STRIP_NOPS (exp);
1474 while (handled_component_p (exp))
1475 exp = TREE_OPERAND (exp, 0);
1476
1477 enum tree_code code = TREE_CODE (exp);
1478 hstate.add_int (code);
1479
1480 switch (code)
1481 {
1482 /* Use inchash::add_expr for everything that is LTO stable. */
1483 case VOID_CST:
1484 case INTEGER_CST:
1485 case REAL_CST:
1486 case FIXED_CST:
1487 case STRING_CST:
1488 case COMPLEX_CST:
1489 case VECTOR_CST:
1490 inchash::add_expr (exp, hstate);
1491 break;
1492 case CONSTRUCTOR:
1493 {
1494 unsigned HOST_WIDE_INT idx;
1495 tree value;
1496
1497 hstate.add_wide_int (int_size_in_bytes (TREE_TYPE (exp)));
1498
1499 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, value)
1500 if (value)
1501 add_expr (value, hstate);
1502 break;
1503 }
1504 case ADDR_EXPR:
1505 case FDESC_EXPR:
1506 add_expr (get_base_address (TREE_OPERAND (exp, 0)), hstate);
1507 break;
1508 case SSA_NAME:
1509 case VAR_DECL:
1510 case CONST_DECL:
1511 case PARM_DECL:
1512 hstate.add_wide_int (int_size_in_bytes (TREE_TYPE (exp)));
1513 break;
1514 case MEM_REF:
1515 case POINTER_PLUS_EXPR:
1516 case MINUS_EXPR:
1517 case RANGE_EXPR:
1518 add_expr (TREE_OPERAND (exp, 0), hstate);
1519 add_expr (TREE_OPERAND (exp, 1), hstate);
1520 break;
1521 case PLUS_EXPR:
1522 {
1523 inchash::hash one, two;
1524 add_expr (TREE_OPERAND (exp, 0), one);
1525 add_expr (TREE_OPERAND (exp, 1), two);
1526 hstate.add_commutative (one, two);
1527 }
1528 break;
1529 CASE_CONVERT:
1530 hstate.add_wide_int (int_size_in_bytes (TREE_TYPE (exp)));
1531 return add_expr (TREE_OPERAND (exp, 0), hstate);
1532 default:
1533 break;
1534 }
1535}
1536
69f6b1f4
JH
1537/* Accumulate to HSTATE a hash of type t.
1538 TYpes that may end up being compatible after LTO type merging needs to have
1539 the same hash. */
1540
1541void
1542sem_item::add_type (const_tree type, inchash::hash &hstate)
1543{
1544 if (type == NULL_TREE)
1545 {
1546 hstate.merge_hash (0);
1547 return;
1548 }
1549
1550 type = TYPE_MAIN_VARIANT (type);
69f6b1f4 1551
5e83f17d 1552 hstate.add_int (TYPE_MODE (type));
69f6b1f4
JH
1553
1554 if (TREE_CODE (type) == COMPLEX_TYPE)
1555 {
1556 hstate.add_int (COMPLEX_TYPE);
1557 sem_item::add_type (TREE_TYPE (type), hstate);
1558 }
1559 else if (INTEGRAL_TYPE_P (type))
1560 {
1561 hstate.add_int (INTEGER_TYPE);
1562 hstate.add_flag (TYPE_UNSIGNED (type));
1563 hstate.add_int (TYPE_PRECISION (type));
1564 }
1565 else if (VECTOR_TYPE_P (type))
1566 {
1567 hstate.add_int (VECTOR_TYPE);
1568 hstate.add_int (TYPE_PRECISION (type));
1569 sem_item::add_type (TREE_TYPE (type), hstate);
1570 }
1571 else if (TREE_CODE (type) == ARRAY_TYPE)
1572 {
1573 hstate.add_int (ARRAY_TYPE);
1574 /* Do not hash size, so complete and incomplete types can match. */
1575 sem_item::add_type (TREE_TYPE (type), hstate);
1576 }
1577 else if (RECORD_OR_UNION_TYPE_P (type))
1578 {
5e83f17d 1579 gcc_checking_assert (COMPLETE_TYPE_P (type));
69f6b1f4
JH
1580 hashval_t *val = optimizer->m_type_hash_cache.get (type);
1581
1582 if (!val)
1583 {
1584 inchash::hash hstate2;
1585 unsigned nf;
1586 tree f;
1587 hashval_t hash;
1588
1589 hstate2.add_int (RECORD_TYPE);
1590 gcc_assert (COMPLETE_TYPE_P (type));
1591
1592 for (f = TYPE_FIELDS (type), nf = 0; f; f = TREE_CHAIN (f))
1593 if (TREE_CODE (f) == FIELD_DECL)
1594 {
1595 add_type (TREE_TYPE (f), hstate2);
1596 nf++;
1597 }
1598
1599 hstate2.add_int (nf);
1600 hash = hstate2.end ();
1601 hstate.add_wide_int (hash);
1602 optimizer->m_type_hash_cache.put (type, hash);
1603 }
1604 else
1605 hstate.add_wide_int (*val);
1606 }
1607}
1608
b84d4347
ML
1609/* Improve accumulated hash for HSTATE based on a gimple statement STMT. */
1610
1611void
355fe088 1612sem_function::hash_stmt (gimple *stmt, inchash::hash &hstate)
b84d4347
ML
1613{
1614 enum gimple_code code = gimple_code (stmt);
1615
a8d93817 1616 hstate.add_int (code);
b84d4347 1617
a8d93817 1618 switch (code)
b84d4347 1619 {
69f6b1f4
JH
1620 case GIMPLE_SWITCH:
1621 add_expr (gimple_switch_index (as_a <gswitch *> (stmt)), hstate);
1622 break;
a8d93817 1623 case GIMPLE_ASSIGN:
69f6b1f4 1624 hstate.add_int (gimple_assign_rhs_code (stmt));
a8d93817
JH
1625 if (commutative_tree_code (gimple_assign_rhs_code (stmt))
1626 || commutative_ternary_tree_code (gimple_assign_rhs_code (stmt)))
b84d4347 1627 {
a8d93817 1628 inchash::hash one, two;
b84d4347 1629
a8d93817 1630 add_expr (gimple_assign_rhs1 (stmt), one);
69f6b1f4 1631 add_type (TREE_TYPE (gimple_assign_rhs1 (stmt)), one);
a8d93817
JH
1632 add_expr (gimple_assign_rhs2 (stmt), two);
1633 hstate.add_commutative (one, two);
69f6b1f4
JH
1634 if (commutative_ternary_tree_code (gimple_assign_rhs_code (stmt)))
1635 {
1636 add_expr (gimple_assign_rhs3 (stmt), hstate);
1637 add_type (TREE_TYPE (gimple_assign_rhs3 (stmt)), hstate);
1638 }
a8d93817 1639 add_expr (gimple_assign_lhs (stmt), hstate);
69f6b1f4 1640 add_type (TREE_TYPE (gimple_assign_lhs (stmt)), two);
a8d93817 1641 break;
b84d4347 1642 }
a8d93817
JH
1643 /* ... fall through ... */
1644 case GIMPLE_CALL:
1645 case GIMPLE_ASM:
1646 case GIMPLE_COND:
1647 case GIMPLE_GOTO:
1648 case GIMPLE_RETURN:
1649 /* All these statements are equivalent if their operands are. */
1650 for (unsigned i = 0; i < gimple_num_ops (stmt); ++i)
69f6b1f4
JH
1651 {
1652 add_expr (gimple_op (stmt, i), hstate);
1653 if (gimple_op (stmt, i))
1654 add_type (TREE_TYPE (gimple_op (stmt, i)), hstate);
1655 }
a8d93817
JH
1656 default:
1657 break;
b84d4347
ML
1658 }
1659}
1660
1661
1662/* Return true if polymorphic comparison must be processed. */
1663
1664bool
1665sem_function::compare_polymorphic_p (void)
1666{
060cfff4
JH
1667 struct cgraph_edge *e;
1668
69f6b1f4 1669 if (!opt_for_fn (get_node ()->decl, flag_devirtualize))
060cfff4 1670 return false;
69f6b1f4 1671 if (get_node ()->indirect_calls != NULL)
060cfff4
JH
1672 return true;
1673 /* TODO: We can do simple propagation determining what calls may lead to
1674 a polymorphic call. */
69f6b1f4 1675 for (e = get_node ()->callees; e; e = e->next_callee)
060cfff4
JH
1676 if (e->callee->definition
1677 && opt_for_fn (e->callee->decl, flag_devirtualize))
1678 return true;
1679 return false;
b84d4347
ML
1680}
1681
1682/* For a given call graph NODE, the function constructs new
1683 semantic function item. */
1684
1685sem_function *
1686sem_function::parse (cgraph_node *node, bitmap_obstack *stack)
1687{
1688 tree fndecl = node->decl;
1689 function *func = DECL_STRUCT_FUNCTION (fndecl);
1690
fb5c322e 1691 if (!func || (!node->has_gimple_body_p () && !node->thunk.thunk_p))
b84d4347
ML
1692 return NULL;
1693
1694 if (lookup_attribute_by_prefix ("omp ", DECL_ATTRIBUTES (node->decl)) != NULL)
1695 return NULL;
1696
1697 sem_function *f = new sem_function (node, 0, stack);
1698
1699 f->init ();
1700
1701 return f;
1702}
1703
b84d4347
ML
1704/* For given basic blocks BB1 and BB2 (from functions FUNC1 and FUNC),
1705 return true if phi nodes are semantically equivalent in these blocks . */
1706
1707bool
1708sem_function::compare_phi_node (basic_block bb1, basic_block bb2)
1709{
538dd0b7
DM
1710 gphi_iterator si1, si2;
1711 gphi *phi1, *phi2;
b84d4347
ML
1712 unsigned size1, size2, i;
1713 tree t1, t2;
1714 edge e1, e2;
1715
1716 gcc_assert (bb1 != NULL);
1717 gcc_assert (bb2 != NULL);
1718
1719 si2 = gsi_start_phis (bb2);
1720 for (si1 = gsi_start_phis (bb1); !gsi_end_p (si1);
1721 gsi_next (&si1))
1722 {
1723 gsi_next_nonvirtual_phi (&si1);
1724 gsi_next_nonvirtual_phi (&si2);
1725
1726 if (gsi_end_p (si1) && gsi_end_p (si2))
1727 break;
1728
1729 if (gsi_end_p (si1) || gsi_end_p (si2))
1730 return return_false();
1731
538dd0b7
DM
1732 phi1 = si1.phi ();
1733 phi2 = si2.phi ();
b84d4347 1734
59f084e0
ML
1735 tree phi_result1 = gimple_phi_result (phi1);
1736 tree phi_result2 = gimple_phi_result (phi2);
1737
1738 if (!m_checker->compare_operand (phi_result1, phi_result2))
1739 return return_false_with_msg ("PHI results are different");
1740
b84d4347
ML
1741 size1 = gimple_phi_num_args (phi1);
1742 size2 = gimple_phi_num_args (phi2);
1743
1744 if (size1 != size2)
1745 return return_false ();
1746
1747 for (i = 0; i < size1; ++i)
1748 {
1749 t1 = gimple_phi_arg (phi1, i)->def;
1750 t2 = gimple_phi_arg (phi2, i)->def;
1751
1752 if (!m_checker->compare_operand (t1, t2))
1753 return return_false ();
1754
1755 e1 = gimple_phi_arg_edge (phi1, i);
1756 e2 = gimple_phi_arg_edge (phi2, i);
1757
1758 if (!m_checker->compare_edge (e1, e2))
1759 return return_false ();
1760 }
1761
1762 gsi_next (&si2);
1763 }
1764
1765 return true;
1766}
1767
1768/* Returns true if tree T can be compared as a handled component. */
1769
1770bool
1771sem_function::icf_handled_component_p (tree t)
1772{
1773 tree_code tc = TREE_CODE (t);
1774
e5115cf9
EB
1775 return (handled_component_p (t)
1776 || tc == ADDR_EXPR || tc == MEM_REF || tc == OBJ_TYPE_REF);
b84d4347
ML
1777}
1778
1779/* Basic blocks dictionary BB_DICT returns true if SOURCE index BB
1780 corresponds to TARGET. */
1781
1782bool
1216ea72 1783sem_function::bb_dict_test (vec<int> *bb_dict, int source, int target)
b84d4347 1784{
c190efcc
ML
1785 source++;
1786 target++;
1787
1216ea72
TS
1788 if (bb_dict->length () <= (unsigned)source)
1789 bb_dict->safe_grow_cleared (source + 1);
c190efcc 1790
1216ea72 1791 if ((*bb_dict)[source] == 0)
b84d4347 1792 {
1216ea72 1793 (*bb_dict)[source] = target;
b84d4347
ML
1794 return true;
1795 }
1796 else
1216ea72 1797 return (*bb_dict)[source] == target;
b84d4347
ML
1798}
1799
b84d4347
ML
1800
1801/* Semantic variable constructor that uses STACK as bitmap memory stack. */
1802
1803sem_variable::sem_variable (bitmap_obstack *stack): sem_item (VAR, stack)
1804{
1805}
1806
1807/* Constructor based on varpool node _NODE with computed hash _HASH.
1808 Bitmap STACK is used for memory allocation. */
1809
1810sem_variable::sem_variable (varpool_node *node, hashval_t _hash,
1811 bitmap_obstack *stack): sem_item(VAR,
1812 node, _hash, stack)
1813{
1814 gcc_checking_assert (node);
1815 gcc_checking_assert (get_node ());
1816}
1817
46305737
JH
1818/* Fast equality function based on knowledge known in WPA. */
1819
1820bool
1821sem_variable::equals_wpa (sem_item *item,
1822 hash_map <symtab_node *, sem_item *> &ignored_nodes)
1823{
1824 gcc_assert (item->type == VAR);
1825
1826 if (node->num_references () != item->node->num_references ())
1827 return return_false_with_msg ("different number of references");
1828
1829 if (DECL_TLS_MODEL (decl) || DECL_TLS_MODEL (item->decl))
1830 return return_false_with_msg ("TLS model");
1831
b3587b99
JH
1832 /* DECL_ALIGN is safe to merge, because we will always chose the largest
1833 alignment out of all aliases. */
46305737
JH
1834
1835 if (DECL_VIRTUAL_P (decl) != DECL_VIRTUAL_P (item->decl))
1836 return return_false_with_msg ("Virtual flag mismatch");
1837
1838 if (DECL_SIZE (decl) != DECL_SIZE (item->decl)
1839 && ((!DECL_SIZE (decl) || !DECL_SIZE (item->decl))
1840 || !operand_equal_p (DECL_SIZE (decl),
1841 DECL_SIZE (item->decl), OEP_ONLY_CONST)))
1842 return return_false_with_msg ("size mismatch");
1843
1844 /* Do not attempt to mix data from different user sections;
1845 we do not know what user intends with those. */
1846 if (((DECL_SECTION_NAME (decl) && !node->implicit_section)
1847 || (DECL_SECTION_NAME (item->decl) && !item->node->implicit_section))
1848 && DECL_SECTION_NAME (decl) != DECL_SECTION_NAME (item->decl))
1849 return return_false_with_msg ("user section mismatch");
1850
1851 if (DECL_IN_TEXT_SECTION (decl) != DECL_IN_TEXT_SECTION (item->decl))
1852 return return_false_with_msg ("text section");
1853
1854 ipa_ref *ref = NULL, *ref2 = NULL;
1855 for (unsigned i = 0; node->iterate_reference (i, ref); i++)
1856 {
1857 item->node->iterate_reference (i, ref2);
1858
b3587b99
JH
1859 if (ref->use != ref2->use)
1860 return return_false_with_msg ("reference use mismatch");
1861
977b01e3 1862 if (!compare_symbol_references (ignored_nodes,
46305737
JH
1863 ref->referred, ref2->referred,
1864 ref->address_matters_p ()))
1865 return false;
1866 }
1867
1868 return true;
1869}
1870
b84d4347 1871/* Returns true if the item equals to ITEM given as argument. */
c4c0f336 1872
b84d4347
ML
1873bool
1874sem_variable::equals (sem_item *item,
c4c0f336 1875 hash_map <symtab_node *, sem_item *> &)
b84d4347
ML
1876{
1877 gcc_assert (item->type == VAR);
c4c0f336 1878 bool ret;
b84d4347 1879
c4c0f336
ML
1880 if (DECL_INITIAL (decl) == error_mark_node && in_lto_p)
1881 dyn_cast <varpool_node *>(node)->get_constructor ();
1882 if (DECL_INITIAL (item->decl) == error_mark_node && in_lto_p)
1883 dyn_cast <varpool_node *>(item->node)->get_constructor ();
b84d4347 1884
9374ef82
ML
1885 /* As seen in PR ipa/65303 we have to compare variables types. */
1886 if (!func_checker::compatible_types_p (TREE_TYPE (decl),
1887 TREE_TYPE (item->decl)))
1888 return return_false_with_msg ("variables types are different");
1889
c4c0f336
ML
1890 ret = sem_variable::equals (DECL_INITIAL (decl),
1891 DECL_INITIAL (item->node->decl));
1892 if (dump_file && (dump_flags & TDF_DETAILS))
1893 fprintf (dump_file,
1894 "Equals called for vars:%s:%s (%u:%u) (%s:%s) with result: %s\n\n",
1aec2ecc
ML
1895 xstrdup_for_dump (node->name()),
1896 xstrdup_for_dump (item->node->name ()),
1897 node->order, item->node->order,
1898 xstrdup_for_dump (node->asm_name ()),
1899 xstrdup_for_dump (item->node->asm_name ()), ret ? "true" : "false");
b84d4347 1900
c4c0f336 1901 return ret;
b84d4347
ML
1902}
1903
1904/* Compares trees T1 and T2 for semantic equality. */
1905
1906bool
1907sem_variable::equals (tree t1, tree t2)
1908{
46305737
JH
1909 if (!t1 || !t2)
1910 return return_with_debug (t1 == t2);
1911 if (t1 == t2)
1912 return true;
b84d4347
ML
1913 tree_code tc1 = TREE_CODE (t1);
1914 tree_code tc2 = TREE_CODE (t2);
1915
1916 if (tc1 != tc2)
46305737 1917 return return_false_with_msg ("TREE_CODE mismatch");
b84d4347
ML
1918
1919 switch (tc1)
1920 {
1921 case CONSTRUCTOR:
1922 {
46305737
JH
1923 vec<constructor_elt, va_gc> *v1, *v2;
1924 unsigned HOST_WIDE_INT idx;
b84d4347 1925
46305737
JH
1926 enum tree_code typecode = TREE_CODE (TREE_TYPE (t1));
1927 if (typecode != TREE_CODE (TREE_TYPE (t2)))
1928 return return_false_with_msg ("constructor type mismatch");
b84d4347 1929
46305737
JH
1930 if (typecode == ARRAY_TYPE)
1931 {
1932 HOST_WIDE_INT size_1 = int_size_in_bytes (TREE_TYPE (t1));
1933 /* For arrays, check that the sizes all match. */
1934 if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2))
1935 || size_1 == -1
1936 || size_1 != int_size_in_bytes (TREE_TYPE (t2)))
1937 return return_false_with_msg ("constructor array size mismatch");
1938 }
1939 else if (!func_checker::compatible_types_p (TREE_TYPE (t1),
1940 TREE_TYPE (t2)))
1941 return return_false_with_msg ("constructor type incompatible");
b84d4347 1942
46305737
JH
1943 v1 = CONSTRUCTOR_ELTS (t1);
1944 v2 = CONSTRUCTOR_ELTS (t2);
1945 if (vec_safe_length (v1) != vec_safe_length (v2))
1946 return return_false_with_msg ("constructor number of elts mismatch");
1947
1948 for (idx = 0; idx < vec_safe_length (v1); ++idx)
1949 {
1950 constructor_elt *c1 = &(*v1)[idx];
1951 constructor_elt *c2 = &(*v2)[idx];
1952
1953 /* Check that each value is the same... */
1954 if (!sem_variable::equals (c1->value, c2->value))
1955 return false;
1956 /* ... and that they apply to the same fields! */
1957 if (!sem_variable::equals (c1->index, c2->index))
1958 return false;
1959 }
b84d4347
ML
1960 return true;
1961 }
1962 case MEM_REF:
1963 {
1964 tree x1 = TREE_OPERAND (t1, 0);
1965 tree x2 = TREE_OPERAND (t2, 0);
1966 tree y1 = TREE_OPERAND (t1, 1);
1967 tree y2 = TREE_OPERAND (t2, 1);
1968
060cfff4 1969 if (!func_checker::compatible_types_p (TREE_TYPE (x1), TREE_TYPE (x2)))
b84d4347
ML
1970 return return_false ();
1971
1972 /* Type of the offset on MEM_REF does not matter. */
46305737
JH
1973 return return_with_debug (sem_variable::equals (x1, x2)
1974 && wi::to_offset (y1)
1975 == wi::to_offset (y2));
b84d4347 1976 }
b84d4347 1977 case ADDR_EXPR:
46305737 1978 case FDESC_EXPR:
b84d4347
ML
1979 {
1980 tree op1 = TREE_OPERAND (t1, 0);
1981 tree op2 = TREE_OPERAND (t2, 0);
1982 return sem_variable::equals (op1, op2);
1983 }
46305737 1984 /* References to other vars/decls are compared using ipa-ref. */
b84d4347
ML
1985 case FUNCTION_DECL:
1986 case VAR_DECL:
46305737
JH
1987 if (decl_in_symtab_p (t1) && decl_in_symtab_p (t2))
1988 return true;
1989 return return_false_with_msg ("Declaration mismatch");
1990 case CONST_DECL:
1991 /* TODO: We can check CONST_DECL by its DECL_INITIAL, but for that we
1992 need to process its VAR/FUNCTION references without relying on ipa-ref
1993 compare. */
b84d4347
ML
1994 case FIELD_DECL:
1995 case LABEL_DECL:
46305737 1996 return return_false_with_msg ("Declaration mismatch");
b84d4347 1997 case INTEGER_CST:
46305737
JH
1998 /* Integer constants are the same only if the same width of type. */
1999 if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
2000 return return_false_with_msg ("INTEGER_CST precision mismatch");
2001 if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2)))
2002 return return_false_with_msg ("INTEGER_CST mode mismatch");
2003 return return_with_debug (tree_int_cst_equal (t1, t2));
b84d4347 2004 case STRING_CST:
46305737
JH
2005 if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2)))
2006 return return_false_with_msg ("STRING_CST mode mismatch");
2007 if (TREE_STRING_LENGTH (t1) != TREE_STRING_LENGTH (t2))
2008 return return_false_with_msg ("STRING_CST length mismatch");
2009 if (memcmp (TREE_STRING_POINTER (t1), TREE_STRING_POINTER (t2),
2010 TREE_STRING_LENGTH (t1)))
2011 return return_false_with_msg ("STRING_CST mismatch");
2012 return true;
2013 case FIXED_CST:
2014 /* Fixed constants are the same only if the same width of type. */
2015 if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
2016 return return_false_with_msg ("FIXED_CST precision mismatch");
2017
2018 return return_with_debug (FIXED_VALUES_IDENTICAL (TREE_FIXED_CST (t1),
2019 TREE_FIXED_CST (t2)));
b84d4347 2020 case COMPLEX_CST:
46305737
JH
2021 return (sem_variable::equals (TREE_REALPART (t1), TREE_REALPART (t2))
2022 && sem_variable::equals (TREE_IMAGPART (t1), TREE_IMAGPART (t2)));
2023 case REAL_CST:
2024 /* Real constants are the same only if the same width of type. */
2025 if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
2026 return return_false_with_msg ("REAL_CST precision mismatch");
1a25c6b1
RS
2027 return return_with_debug (real_identical (&TREE_REAL_CST (t1),
2028 &TREE_REAL_CST (t2)));
46305737
JH
2029 case VECTOR_CST:
2030 {
2031 unsigned i;
2032
2033 if (VECTOR_CST_NELTS (t1) != VECTOR_CST_NELTS (t2))
2034 return return_false_with_msg ("VECTOR_CST nelts mismatch");
2035
2036 for (i = 0; i < VECTOR_CST_NELTS (t1); ++i)
2037 if (!sem_variable::equals (VECTOR_CST_ELT (t1, i),
2038 VECTOR_CST_ELT (t2, i)))
2039 return 0;
2040
2041 return 1;
2042 }
b84d4347 2043 case ARRAY_REF:
46305737
JH
2044 case ARRAY_RANGE_REF:
2045 {
2046 tree x1 = TREE_OPERAND (t1, 0);
2047 tree x2 = TREE_OPERAND (t2, 0);
2048 tree y1 = TREE_OPERAND (t1, 1);
2049 tree y2 = TREE_OPERAND (t2, 1);
2050
3c031cbe 2051 if (!sem_variable::equals (x1, x2) || !sem_variable::equals (y1, y2))
46305737
JH
2052 return false;
2053 if (!sem_variable::equals (array_ref_low_bound (t1),
2054 array_ref_low_bound (t2)))
2055 return false;
2056 if (!sem_variable::equals (array_ref_element_size (t1),
2057 array_ref_element_size (t2)))
2058 return false;
2059 return true;
2060 }
2061
2062 case COMPONENT_REF:
b84d4347 2063 case POINTER_PLUS_EXPR:
46305737
JH
2064 case PLUS_EXPR:
2065 case MINUS_EXPR:
2066 case RANGE_EXPR:
b84d4347
ML
2067 {
2068 tree x1 = TREE_OPERAND (t1, 0);
2069 tree x2 = TREE_OPERAND (t2, 0);
2070 tree y1 = TREE_OPERAND (t1, 1);
2071 tree y2 = TREE_OPERAND (t2, 1);
2072
2073 return sem_variable::equals (x1, x2) && sem_variable::equals (y1, y2);
2074 }
46305737
JH
2075
2076 CASE_CONVERT:
2077 case VIEW_CONVERT_EXPR:
060cfff4 2078 if (!func_checker::compatible_types_p (TREE_TYPE (t1), TREE_TYPE (t2)))
46305737
JH
2079 return return_false ();
2080 return sem_variable::equals (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
b84d4347
ML
2081 case ERROR_MARK:
2082 return return_false_with_msg ("ERROR_MARK");
2083 default:
2084 return return_false_with_msg ("Unknown TREE code reached");
2085 }
2086}
2087
2088/* Parser function that visits a varpool NODE. */
2089
2090sem_variable *
2091sem_variable::parse (varpool_node *node, bitmap_obstack *stack)
2092{
6fb12821
ML
2093 if (TREE_THIS_VOLATILE (node->decl) || DECL_HARD_REGISTER (node->decl)
2094 || node->alias)
b84d4347
ML
2095 return NULL;
2096
2097 sem_variable *v = new sem_variable (node, 0, stack);
2098
2099 v->init ();
2100
2101 return v;
2102}
2103
2104/* References independent hash function. */
2105
2106hashval_t
2107sem_variable::get_hash (void)
2108{
808b6bb7
ML
2109 if (m_hash)
2110 return m_hash;
3ab93359 2111
a8d93817
JH
2112 /* All WPA streamed in symbols should have their hashes computed at compile
2113 time. At this point, the constructor may not be in memory at all.
2114 DECL_INITIAL (decl) would be error_mark_node in that case. */
2115 gcc_assert (!node->lto_file_data);
2116 tree ctor = DECL_INITIAL (decl);
b84d4347
ML
2117 inchash::hash hstate;
2118
2119 hstate.add_int (456346417);
a8d93817
JH
2120 if (DECL_SIZE (decl) && tree_fits_shwi_p (DECL_SIZE (decl)))
2121 hstate.add_wide_int (tree_to_shwi (DECL_SIZE (decl)));
2122 add_expr (ctor, hstate);
808b6bb7 2123 set_hash (hstate.end ());
b84d4347 2124
808b6bb7 2125 return m_hash;
b84d4347
ML
2126}
2127
2128/* Merges instance with an ALIAS_ITEM, where alias, thunk or redirection can
2129 be applied. */
2130
2131bool
2132sem_variable::merge (sem_item *alias_item)
2133{
2134 gcc_assert (alias_item->type == VAR);
2135
f657d665
ML
2136 if (!sem_item::target_supports_symbol_aliases_p ())
2137 {
2138 if (dump_file)
0a7246ee
JH
2139 fprintf (dump_file, "Not unifying; "
2140 "Symbol aliases are not supported by target\n\n");
f657d665
ML
2141 return false;
2142 }
2143
257291fc
JH
2144 if (DECL_EXTERNAL (alias_item->decl))
2145 {
2146 if (dump_file)
2147 fprintf (dump_file, "Not unifying; alias is external.\n\n");
2148 return false;
2149 }
2150
b84d4347
ML
2151 sem_variable *alias_var = static_cast<sem_variable *> (alias_item);
2152
2153 varpool_node *original = get_node ();
2154 varpool_node *alias = alias_var->get_node ();
2155 bool original_discardable = false;
2156
0a7246ee
JH
2157 bool original_address_matters = original->address_matters_p ();
2158 bool alias_address_matters = alias->address_matters_p ();
2159
b84d4347 2160 /* See if original is in a section that can be discarded if the main
0a7246ee
JH
2161 symbol is not used.
2162 Also consider case where we have resolution info and we know that
2163 original's definition is not going to be used. In this case we can not
2164 create alias to original. */
2165 if (original->can_be_discarded_p ()
2166 || (node->resolution != LDPR_UNKNOWN
2167 && !decl_binds_to_current_def_p (node->decl)))
b84d4347
ML
2168 original_discardable = true;
2169
2170 gcc_assert (!TREE_ASM_WRITTEN (alias->decl));
2171
0a7246ee
JH
2172 /* Constant pool machinery is not quite ready for aliases.
2173 TODO: varasm code contains logic for merging DECL_IN_CONSTANT_POOL.
2174 For LTO merging does not happen that is an important missing feature.
2175 We can enable merging with LTO if the DECL_IN_CONSTANT_POOL
2176 flag is dropped and non-local symbol name is assigned. */
2177 if (DECL_IN_CONSTANT_POOL (alias->decl)
2178 || DECL_IN_CONSTANT_POOL (original->decl))
b84d4347
ML
2179 {
2180 if (dump_file)
0a7246ee
JH
2181 fprintf (dump_file,
2182 "Not unifying; constant pool variables.\n\n");
2183 return false;
2184 }
b84d4347 2185
0a7246ee
JH
2186 /* Do not attempt to mix functions from different user sections;
2187 we do not know what user intends with those. */
2188 if (((DECL_SECTION_NAME (original->decl) && !original->implicit_section)
2189 || (DECL_SECTION_NAME (alias->decl) && !alias->implicit_section))
2190 && DECL_SECTION_NAME (original->decl) != DECL_SECTION_NAME (alias->decl))
2191 {
2192 if (dump_file)
2193 fprintf (dump_file,
2194 "Not unifying; "
2195 "original and alias are in different sections.\n\n");
b84d4347
ML
2196 return false;
2197 }
0a7246ee
JH
2198
2199 /* We can not merge if address comparsion metters. */
2200 if (original_address_matters && alias_address_matters
2201 && flag_merge_constants < 2)
b84d4347 2202 {
0a7246ee
JH
2203 if (dump_file)
2204 fprintf (dump_file,
2205 "Not unifying; "
2206 "adress of original and alias may be compared.\n\n");
2207 return false;
2208 }
c7a06bc1
JH
2209 if (DECL_COMDAT_GROUP (original->decl) != DECL_COMDAT_GROUP (alias->decl))
2210 {
2211 if (dump_file)
2212 fprintf (dump_file, "Not unifying; alias cannot be created; "
2213 "across comdat group boundary\n\n");
2214
2215 return false;
2216 }
b84d4347 2217
c7a06bc1 2218 if (original_discardable)
0a7246ee
JH
2219 {
2220 if (dump_file)
2221 fprintf (dump_file, "Not unifying; alias cannot be created; "
2222 "target is discardable\n\n");
b84d4347 2223
0a7246ee
JH
2224 return false;
2225 }
2226 else
2227 {
2228 gcc_assert (!original->alias);
2229 gcc_assert (!alias->alias);
b84d4347
ML
2230
2231 alias->analyzed = false;
2232
2233 DECL_INITIAL (alias->decl) = NULL;
412049de
JH
2234 ((symtab_node *)alias)->call_for_symbol_and_aliases (clear_decl_rtl,
2235 NULL, true);
d5e254e1 2236 alias->need_bounds_init = false;
b84d4347 2237 alias->remove_all_references ();
0a7246ee
JH
2238 if (TREE_ADDRESSABLE (alias->decl))
2239 original->call_for_symbol_and_aliases (set_addressable, NULL, true);
b84d4347
ML
2240
2241 varpool_node::create_alias (alias_var->decl, decl);
2242 alias->resolve_alias (original);
2243
2244 if (dump_file)
0a7246ee 2245 fprintf (dump_file, "Unified; Variable alias has been created.\n\n");
b84d4347
ML
2246
2247 return true;
2248 }
2249}
2250
b84d4347
ML
2251/* Dump symbol to FILE. */
2252
2253void
2254sem_variable::dump_to_file (FILE *file)
2255{
2256 gcc_assert (file);
2257
2258 print_node (file, "", decl, 0);
2259 fprintf (file, "\n\n");
2260}
2261
b84d4347
ML
2262unsigned int sem_item_optimizer::class_id = 0;
2263
2264sem_item_optimizer::sem_item_optimizer (): worklist (0), m_classes (0),
2265 m_classes_count (0), m_cgraph_node_hooks (NULL), m_varpool_node_hooks (NULL)
2266{
2267 m_items.create (0);
2268 bitmap_obstack_initialize (&m_bmstack);
2269}
2270
2271sem_item_optimizer::~sem_item_optimizer ()
2272{
2273 for (unsigned int i = 0; i < m_items.length (); i++)
2274 delete m_items[i];
2275
2276 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
2277 it != m_classes.end (); ++it)
2278 {
2279 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
2280 delete (*it)->classes[i];
2281
2282 (*it)->classes.release ();
ba2dbfce 2283 free (*it);
b84d4347
ML
2284 }
2285
2286 m_items.release ();
2287
2288 bitmap_obstack_release (&m_bmstack);
2289}
2290
2291/* Write IPA ICF summary for symbols. */
2292
2293void
2294sem_item_optimizer::write_summary (void)
2295{
2296 unsigned int count = 0;
2297
2298 output_block *ob = create_output_block (LTO_section_ipa_icf);
2299 lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
2300 ob->symbol = NULL;
2301
2302 /* Calculate number of symbols to be serialized. */
2303 for (lto_symtab_encoder_iterator lsei = lsei_start_in_partition (encoder);
2304 !lsei_end_p (lsei);
2305 lsei_next_in_partition (&lsei))
2306 {
2307 symtab_node *node = lsei_node (lsei);
2308
2309 if (m_symtab_node_map.get (node))
2310 count++;
2311 }
2312
2313 streamer_write_uhwi (ob, count);
2314
2315 /* Process all of the symbols. */
2316 for (lto_symtab_encoder_iterator lsei = lsei_start_in_partition (encoder);
2317 !lsei_end_p (lsei);
2318 lsei_next_in_partition (&lsei))
2319 {
2320 symtab_node *node = lsei_node (lsei);
2321
2322 sem_item **item = m_symtab_node_map.get (node);
2323
2324 if (item && *item)
2325 {
2326 int node_ref = lto_symtab_encoder_encode (encoder, node);
2327 streamer_write_uhwi_stream (ob->main_stream, node_ref);
2328
2329 streamer_write_uhwi (ob, (*item)->get_hash ());
2330 }
2331 }
2332
2333 streamer_write_char_stream (ob->main_stream, 0);
2334 produce_asm (ob, NULL);
2335 destroy_output_block (ob);
2336}
2337
2338/* Reads a section from LTO stream file FILE_DATA. Input block for DATA
2339 contains LEN bytes. */
2340
2341void
2342sem_item_optimizer::read_section (lto_file_decl_data *file_data,
2343 const char *data, size_t len)
2344{
2345 const lto_function_header *header =
2346 (const lto_function_header *) data;
2347 const int cfg_offset = sizeof (lto_function_header);
2348 const int main_offset = cfg_offset + header->cfg_size;
2349 const int string_offset = main_offset + header->main_size;
2350 data_in *data_in;
2351 unsigned int i;
2352 unsigned int count;
2353
2354 lto_input_block ib_main ((const char *) data + main_offset, 0,
db847fa8 2355 header->main_size, file_data->mode_table);
b84d4347
ML
2356
2357 data_in =
2358 lto_data_in_create (file_data, (const char *) data + string_offset,
2359 header->string_size, vNULL);
2360
2361 count = streamer_read_uhwi (&ib_main);
2362
2363 for (i = 0; i < count; i++)
2364 {
2365 unsigned int index;
2366 symtab_node *node;
2367 lto_symtab_encoder_t encoder;
2368
2369 index = streamer_read_uhwi (&ib_main);
2370 encoder = file_data->symtab_node_encoder;
2371 node = lto_symtab_encoder_deref (encoder, index);
2372
2373 hashval_t hash = streamer_read_uhwi (&ib_main);
2374
2375 gcc_assert (node->definition);
2376
2377 if (dump_file)
1aec2ecc
ML
2378 fprintf (dump_file, "Symbol added:%s (tree: %p, uid:%u)\n",
2379 node->asm_name (), (void *) node->decl, node->order);
b84d4347
ML
2380
2381 if (is_a<cgraph_node *> (node))
2382 {
2383 cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
2384
2385 m_items.safe_push (new sem_function (cnode, hash, &m_bmstack));
2386 }
2387 else
2388 {
2389 varpool_node *vnode = dyn_cast <varpool_node *> (node);
2390
2391 m_items.safe_push (new sem_variable (vnode, hash, &m_bmstack));
2392 }
2393 }
2394
2395 lto_free_section_data (file_data, LTO_section_ipa_icf, NULL, data,
2396 len);
2397 lto_data_in_delete (data_in);
2398}
2399
026c3cfd 2400/* Read IPA ICF summary for symbols. */
b84d4347
ML
2401
2402void
2403sem_item_optimizer::read_summary (void)
2404{
2405 lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
2406 lto_file_decl_data *file_data;
2407 unsigned int j = 0;
2408
2409 while ((file_data = file_data_vec[j++]))
2410 {
2411 size_t len;
2412 const char *data = lto_get_section_data (file_data,
2413 LTO_section_ipa_icf, NULL, &len);
2414
2415 if (data)
2416 read_section (file_data, data, len);
2417 }
2418}
2419
2420/* Register callgraph and varpool hooks. */
2421
2422void
2423sem_item_optimizer::register_hooks (void)
2424{
e3e968e9
ML
2425 if (!m_cgraph_node_hooks)
2426 m_cgraph_node_hooks = symtab->add_cgraph_removal_hook
2427 (&sem_item_optimizer::cgraph_removal_hook, this);
b84d4347 2428
e3e968e9
ML
2429 if (!m_varpool_node_hooks)
2430 m_varpool_node_hooks = symtab->add_varpool_removal_hook
2431 (&sem_item_optimizer::varpool_removal_hook, this);
b84d4347
ML
2432}
2433
2434/* Unregister callgraph and varpool hooks. */
2435
2436void
2437sem_item_optimizer::unregister_hooks (void)
2438{
2439 if (m_cgraph_node_hooks)
2440 symtab->remove_cgraph_removal_hook (m_cgraph_node_hooks);
2441
2442 if (m_varpool_node_hooks)
2443 symtab->remove_varpool_removal_hook (m_varpool_node_hooks);
2444}
2445
2446/* Adds a CLS to hashtable associated by hash value. */
2447
2448void
2449sem_item_optimizer::add_class (congruence_class *cls)
2450{
2451 gcc_assert (cls->members.length ());
2452
2453 congruence_class_group *group = get_group_by_hash (
2454 cls->members[0]->get_hash (),
2455 cls->members[0]->type);
2456 group->classes.safe_push (cls);
2457}
2458
2459/* Gets a congruence class group based on given HASH value and TYPE. */
2460
2461congruence_class_group *
2462sem_item_optimizer::get_group_by_hash (hashval_t hash, sem_item_type type)
2463{
2464 congruence_class_group *item = XNEW (congruence_class_group);
2465 item->hash = hash;
2466 item->type = type;
2467
2468 congruence_class_group **slot = m_classes.find_slot (item, INSERT);
2469
2470 if (*slot)
2471 free (item);
2472 else
2473 {
2474 item->classes.create (1);
2475 *slot = item;
2476 }
2477
2478 return *slot;
2479}
2480
2481/* Callgraph removal hook called for a NODE with a custom DATA. */
2482
2483void
2484sem_item_optimizer::cgraph_removal_hook (cgraph_node *node, void *data)
2485{
2486 sem_item_optimizer *optimizer = (sem_item_optimizer *) data;
2487 optimizer->remove_symtab_node (node);
2488}
2489
2490/* Varpool removal hook called for a NODE with a custom DATA. */
2491
2492void
2493sem_item_optimizer::varpool_removal_hook (varpool_node *node, void *data)
2494{
2495 sem_item_optimizer *optimizer = (sem_item_optimizer *) data;
2496 optimizer->remove_symtab_node (node);
2497}
2498
2499/* Remove symtab NODE triggered by symtab removal hooks. */
2500
2501void
2502sem_item_optimizer::remove_symtab_node (symtab_node *node)
2503{
2504 gcc_assert (!m_classes.elements());
2505
2506 m_removed_items_set.add (node);
2507}
2508
2509void
2510sem_item_optimizer::remove_item (sem_item *item)
2511{
2512 if (m_symtab_node_map.get (item->node))
2513 m_symtab_node_map.remove (item->node);
2514 delete item;
2515}
2516
2517/* Removes all callgraph and varpool nodes that are marked by symtab
2518 as deleted. */
2519
2520void
2521sem_item_optimizer::filter_removed_items (void)
2522{
2523 auto_vec <sem_item *> filtered;
2524
2525 for (unsigned int i = 0; i < m_items.length(); i++)
2526 {
2527 sem_item *item = m_items[i];
2528
90190bb3
ML
2529 if (m_removed_items_set.contains (item->node))
2530 {
b84d4347
ML
2531 remove_item (item);
2532 continue;
90190bb3 2533 }
b84d4347
ML
2534
2535 if (item->type == FUNC)
90190bb3 2536 {
b84d4347
ML
2537 cgraph_node *cnode = static_cast <sem_function *>(item)->get_node ();
2538
060cfff4 2539 if (in_lto_p && (cnode->alias || cnode->body_removed))
90190bb3
ML
2540 remove_item (item);
2541 else
2542 filtered.safe_push (item);
2543 }
2544 else /* VAR. */
2545 {
2546 if (!flag_ipa_icf_variables)
2547 remove_item (item);
2548 else
c4c0f336
ML
2549 {
2550 /* Filter out non-readonly variables. */
2551 tree decl = item->decl;
2552 if (TREE_READONLY (decl))
2553 filtered.safe_push (item);
2554 else
2555 remove_item (item);
2556 }
90190bb3 2557 }
b84d4347
ML
2558 }
2559
2560 /* Clean-up of released semantic items. */
2561
2562 m_items.release ();
2563 for (unsigned int i = 0; i < filtered.length(); i++)
2564 m_items.safe_push (filtered[i]);
2565}
2566
bd31fe14
ML
2567/* Optimizer entry point which returns true in case it processes
2568 a merge operation. True is returned if there's a merge operation
2569 processed. */
b84d4347 2570
bd31fe14 2571bool
b84d4347
ML
2572sem_item_optimizer::execute (void)
2573{
2574 filter_removed_items ();
8b048701
JJ
2575 unregister_hooks ();
2576
3ab93359
ML
2577 build_graph ();
2578 update_hash_by_addr_refs ();
b84d4347
ML
2579 build_hash_based_classes ();
2580
2581 if (dump_file)
2582 fprintf (dump_file, "Dump after hash based groups\n");
2583 dump_cong_classes ();
2584
2585 for (unsigned int i = 0; i < m_items.length(); i++)
2586 m_items[i]->init_wpa ();
2587
b84d4347
ML
2588 subdivide_classes_by_equality (true);
2589
2590 if (dump_file)
2591 fprintf (dump_file, "Dump after WPA based types groups\n");
2592
2593 dump_cong_classes ();
2594
2595 process_cong_reduction ();
b2b29377 2596 checking_verify_classes ();
b84d4347
ML
2597
2598 if (dump_file)
2599 fprintf (dump_file, "Dump after callgraph-based congruence reduction\n");
2600
2601 dump_cong_classes ();
2602
2603 parse_nonsingleton_classes ();
2604 subdivide_classes_by_equality ();
2605
2606 if (dump_file)
2607 fprintf (dump_file, "Dump after full equality comparison of groups\n");
2608
2609 dump_cong_classes ();
2610
2611 unsigned int prev_class_count = m_classes_count;
2612
2613 process_cong_reduction ();
2614 dump_cong_classes ();
b2b29377 2615 checking_verify_classes ();
bd31fe14 2616 bool merged_p = merge_classes (prev_class_count);
b84d4347
ML
2617
2618 if (dump_file && (dump_flags & TDF_DETAILS))
2619 symtab_node::dump_table (dump_file);
bd31fe14
ML
2620
2621 return merged_p;
b84d4347
ML
2622}
2623
2624/* Function responsible for visiting all potential functions and
2625 read-only variables that can be merged. */
2626
2627void
2628sem_item_optimizer::parse_funcs_and_vars (void)
2629{
2630 cgraph_node *cnode;
2631
2632 if (flag_ipa_icf_functions)
2633 FOR_EACH_DEFINED_FUNCTION (cnode)
2634 {
2635 sem_function *f = sem_function::parse (cnode, &m_bmstack);
2636 if (f)
2637 {
2638 m_items.safe_push (f);
2639 m_symtab_node_map.put (cnode, f);
2640
2641 if (dump_file)
1aec2ecc 2642 fprintf (dump_file, "Parsed function:%s\n", f->node->asm_name ());
b84d4347
ML
2643
2644 if (dump_file && (dump_flags & TDF_DETAILS))
2645 f->dump_to_file (dump_file);
2646 }
2647 else if (dump_file)
2648 fprintf (dump_file, "Not parsed function:%s\n", cnode->asm_name ());
2649 }
2650
2651 varpool_node *vnode;
2652
2653 if (flag_ipa_icf_variables)
2654 FOR_EACH_DEFINED_VARIABLE (vnode)
2655 {
2656 sem_variable *v = sem_variable::parse (vnode, &m_bmstack);
2657
2658 if (v)
2659 {
2660 m_items.safe_push (v);
2661 m_symtab_node_map.put (vnode, v);
2662 }
2663 }
2664}
2665
2666/* Makes pairing between a congruence class CLS and semantic ITEM. */
2667
2668void
2669sem_item_optimizer::add_item_to_class (congruence_class *cls, sem_item *item)
2670{
2671 item->index_in_class = cls->members.length ();
2672 cls->members.safe_push (item);
2673 item->cls = cls;
2674}
2675
3ab93359
ML
2676/* For each semantic item, append hash values of references. */
2677
2678void
2679sem_item_optimizer::update_hash_by_addr_refs ()
2680{
69f6b1f4
JH
2681 /* First, append to hash sensitive references and class type if it need to
2682 be matched for ODR. */
3ab93359 2683 for (unsigned i = 0; i < m_items.length (); i++)
69f6b1f4
JH
2684 {
2685 m_items[i]->update_hash_by_addr_refs (m_symtab_node_map);
2686 if (m_items[i]->type == FUNC)
2687 {
2688 if (TREE_CODE (TREE_TYPE (m_items[i]->decl)) == METHOD_TYPE
2689 && contains_polymorphic_type_p
70e7f2a2 2690 (TYPE_METHOD_BASETYPE (TREE_TYPE (m_items[i]->decl)))
69f6b1f4 2691 && (DECL_CXX_CONSTRUCTOR_P (m_items[i]->decl)
b3587b99 2692 || (static_cast<sem_function *> (m_items[i])->param_used_p (0)
69f6b1f4
JH
2693 && static_cast<sem_function *> (m_items[i])
2694 ->compare_polymorphic_p ())))
2695 {
2696 tree class_type
70e7f2a2 2697 = TYPE_METHOD_BASETYPE (TREE_TYPE (m_items[i]->decl));
808b6bb7 2698 inchash::hash hstate (m_items[i]->get_hash ());
69f6b1f4
JH
2699
2700 if (TYPE_NAME (class_type)
2701 && DECL_ASSEMBLER_NAME_SET_P (TYPE_NAME (class_type)))
2702 hstate.add_wide_int
2703 (IDENTIFIER_HASH_VALUE
2704 (DECL_ASSEMBLER_NAME (TYPE_NAME (class_type))));
2705
808b6bb7 2706 m_items[i]->set_hash (hstate.end ());
69f6b1f4
JH
2707 }
2708 }
2709 }
3ab93359
ML
2710
2711 /* Once all symbols have enhanced hash value, we can append
2712 hash values of symbols that are seen by IPA ICF and are
2713 references by a semantic item. Newly computed values
2714 are saved to global_hash member variable. */
2715 for (unsigned i = 0; i < m_items.length (); i++)
2716 m_items[i]->update_hash_by_local_refs (m_symtab_node_map);
2717
2718 /* Global hash value replace current hash values. */
2719 for (unsigned i = 0; i < m_items.length (); i++)
808b6bb7 2720 m_items[i]->set_hash (m_items[i]->global_hash);
3ab93359
ML
2721}
2722
b84d4347
ML
2723/* Congruence classes are built by hash value. */
2724
2725void
2726sem_item_optimizer::build_hash_based_classes (void)
2727{
2728 for (unsigned i = 0; i < m_items.length (); i++)
2729 {
2730 sem_item *item = m_items[i];
2731
808b6bb7 2732 congruence_class_group *group = get_group_by_hash (item->get_hash (),
b84d4347
ML
2733 item->type);
2734
2735 if (!group->classes.length ())
2736 {
2737 m_classes_count++;
2738 group->classes.safe_push (new congruence_class (class_id++));
2739 }
2740
2741 add_item_to_class (group->classes[0], item);
2742 }
2743}
2744
2745/* Build references according to call graph. */
2746
2747void
2748sem_item_optimizer::build_graph (void)
2749{
2750 for (unsigned i = 0; i < m_items.length (); i++)
2751 {
2752 sem_item *item = m_items[i];
2753 m_symtab_node_map.put (item->node, item);
808b6bb7
ML
2754
2755 /* Initialize hash values if we are not in LTO mode. */
2756 if (!in_lto_p)
2757 item->get_hash ();
b84d4347
ML
2758 }
2759
2760 for (unsigned i = 0; i < m_items.length (); i++)
2761 {
2762 sem_item *item = m_items[i];
2763
2764 if (item->type == FUNC)
2765 {
2766 cgraph_node *cnode = dyn_cast <cgraph_node *> (item->node);
2767
2768 cgraph_edge *e = cnode->callees;
2769 while (e)
2770 {
b6cddc7f
ML
2771 sem_item **slot = m_symtab_node_map.get
2772 (e->callee->ultimate_alias_target ());
b84d4347
ML
2773 if (slot)
2774 item->add_reference (*slot);
2775
2776 e = e->next_callee;
2777 }
2778 }
2779
2780 ipa_ref *ref = NULL;
2781 for (unsigned i = 0; item->node->iterate_reference (i, ref); i++)
2782 {
b6cddc7f
ML
2783 sem_item **slot = m_symtab_node_map.get
2784 (ref->referred->ultimate_alias_target ());
b84d4347
ML
2785 if (slot)
2786 item->add_reference (*slot);
2787 }
2788 }
2789}
2790
2791/* Semantic items in classes having more than one element and initialized.
2792 In case of WPA, we load function body. */
2793
2794void
2795sem_item_optimizer::parse_nonsingleton_classes (void)
2796{
2797 unsigned int init_called_count = 0;
2798
2799 for (unsigned i = 0; i < m_items.length (); i++)
2800 if (m_items[i]->cls->members.length () > 1)
2801 {
2802 m_items[i]->init ();
2803 init_called_count++;
2804 }
2805
2806 if (dump_file)
2807 fprintf (dump_file, "Init called for %u items (%.2f%%).\n", init_called_count,
f1c859ee 2808 m_items.length () ? 100.0f * init_called_count / m_items.length (): 0.0f);
b84d4347
ML
2809}
2810
2811/* Equality function for semantic items is used to subdivide existing
2812 classes. If IN_WPA, fast equality function is invoked. */
2813
2814void
2815sem_item_optimizer::subdivide_classes_by_equality (bool in_wpa)
2816{
2817 for (hash_table <congruence_class_group_hash>::iterator it = m_classes.begin ();
2818 it != m_classes.end (); ++it)
2819 {
2820 unsigned int class_count = (*it)->classes.length ();
2821
2822 for (unsigned i = 0; i < class_count; i++)
2823 {
2824 congruence_class *c = (*it)->classes [i];
2825
2826 if (c->members.length() > 1)
2827 {
2828 auto_vec <sem_item *> new_vector;
2829
2830 sem_item *first = c->members[0];
2831 new_vector.safe_push (first);
2832
2833 unsigned class_split_first = (*it)->classes.length ();
2834
2835 for (unsigned j = 1; j < c->members.length (); j++)
2836 {
2837 sem_item *item = c->members[j];
2838
2839 bool equals = in_wpa ? first->equals_wpa (item,
2840 m_symtab_node_map) : first->equals (item, m_symtab_node_map);
2841
2842 if (equals)
2843 new_vector.safe_push (item);
2844 else
2845 {
2846 bool integrated = false;
2847
2848 for (unsigned k = class_split_first; k < (*it)->classes.length (); k++)
2849 {
2850 sem_item *x = (*it)->classes[k]->members[0];
2851 bool equals = in_wpa ? x->equals_wpa (item,
2852 m_symtab_node_map) : x->equals (item, m_symtab_node_map);
2853
2854 if (equals)
2855 {
2856 integrated = true;
2857 add_item_to_class ((*it)->classes[k], item);
2858
2859 break;
2860 }
2861 }
2862
2863 if (!integrated)
2864 {
2865 congruence_class *c = new congruence_class (class_id++);
2866 m_classes_count++;
2867 add_item_to_class (c, item);
2868
2869 (*it)->classes.safe_push (c);
2870 }
2871 }
2872 }
2873
2874 // we replace newly created new_vector for the class we've just splitted
2875 c->members.release ();
2876 c->members.create (new_vector.length ());
2877
2878 for (unsigned int j = 0; j < new_vector.length (); j++)
2879 add_item_to_class (c, new_vector[j]);
2880 }
2881 }
2882 }
2883
b2b29377 2884 checking_verify_classes ();
b84d4347
ML
2885}
2886
5ebd0e61
ML
2887/* Subdivide classes by address references that members of the class
2888 reference. Example can be a pair of functions that have an address
2889 taken from a function. If these addresses are different the class
2890 is split. */
2891
2892unsigned
2893sem_item_optimizer::subdivide_classes_by_sensitive_refs ()
2894{
fb5c464a 2895 typedef hash_map <symbol_compare_hash, vec <sem_item *> > subdivide_hash_map;
bbd08a5d 2896
5ebd0e61
ML
2897 unsigned newly_created_classes = 0;
2898
2899 for (hash_table <congruence_class_group_hash>::iterator it = m_classes.begin ();
2900 it != m_classes.end (); ++it)
2901 {
2902 unsigned int class_count = (*it)->classes.length ();
2903 auto_vec<congruence_class *> new_classes;
2904
2905 for (unsigned i = 0; i < class_count; i++)
2906 {
2907 congruence_class *c = (*it)->classes [i];
2908
2909 if (c->members.length() > 1)
2910 {
bbd08a5d 2911 subdivide_hash_map split_map;
5ebd0e61
ML
2912
2913 for (unsigned j = 0; j < c->members.length (); j++)
2914 {
2915 sem_item *source_node = c->members[j];
2916
2917 symbol_compare_collection *collection = new symbol_compare_collection (source_node->node);
2918
bbd08a5d
ML
2919 bool existed;
2920 vec <sem_item *> *slot = &split_map.get_or_insert (collection,
2921 &existed);
5ebd0e61
ML
2922 gcc_checking_assert (slot);
2923
2924 slot->safe_push (source_node);
bbd08a5d
ML
2925
2926 if (existed)
2927 delete collection;
5ebd0e61
ML
2928 }
2929
2930 /* If the map contains more than one key, we have to split the map
2931 appropriately. */
2932 if (split_map.elements () != 1)
2933 {
2934 bool first_class = true;
2935
bbd08a5d
ML
2936 for (subdivide_hash_map::iterator it2 = split_map.begin ();
2937 it2 != split_map.end (); ++it2)
5ebd0e61
ML
2938 {
2939 congruence_class *new_cls;
2940 new_cls = new congruence_class (class_id++);
2941
2942 for (unsigned k = 0; k < (*it2).second.length (); k++)
2943 add_item_to_class (new_cls, (*it2).second[k]);
2944
2945 worklist_push (new_cls);
2946 newly_created_classes++;
2947
2948 if (first_class)
2949 {
2950 (*it)->classes[i] = new_cls;
2951 first_class = false;
2952 }
2953 else
2954 {
2955 new_classes.safe_push (new_cls);
2956 m_classes_count++;
2957 }
2958 }
2959 }
bbd08a5d
ML
2960
2961 /* Release memory. */
2962 for (subdivide_hash_map::iterator it2 = split_map.begin ();
2963 it2 != split_map.end (); ++it2)
2964 {
2965 delete (*it2).first;
2966 (*it2).second.release ();
2967 }
5ebd0e61
ML
2968 }
2969 }
2970
2971 for (unsigned i = 0; i < new_classes.length (); i++)
2972 (*it)->classes.safe_push (new_classes[i]);
2973 }
2974
2975 return newly_created_classes;
2976}
2977
b2b29377
MM
2978/* Verify congruence classes, if checking is enabled. */
2979
2980void
2981sem_item_optimizer::checking_verify_classes (void)
2982{
2983 if (flag_checking)
2984 verify_classes ();
2985}
2986
2987/* Verify congruence classes. */
b84d4347
ML
2988
2989void
2990sem_item_optimizer::verify_classes (void)
2991{
b84d4347
ML
2992 for (hash_table <congruence_class_group_hash>::iterator it = m_classes.begin ();
2993 it != m_classes.end (); ++it)
2994 {
2995 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
2996 {
2997 congruence_class *cls = (*it)->classes[i];
2998
b2b29377
MM
2999 gcc_assert (cls);
3000 gcc_assert (cls->members.length () > 0);
b84d4347
ML
3001
3002 for (unsigned int j = 0; j < cls->members.length (); j++)
3003 {
3004 sem_item *item = cls->members[j];
3005
b2b29377
MM
3006 gcc_assert (item);
3007 gcc_assert (item->cls == cls);
b84d4347
ML
3008
3009 for (unsigned k = 0; k < item->usages.length (); k++)
3010 {
3011 sem_usage_pair *usage = item->usages[k];
b2b29377
MM
3012 gcc_assert (usage->item->index_in_class <
3013 usage->item->cls->members.length ());
b84d4347
ML
3014 }
3015 }
3016 }
3017 }
b84d4347
ML
3018}
3019
3020/* Disposes split map traverse function. CLS_PTR is pointer to congruence
3021 class, BSLOT is bitmap slot we want to release. DATA is mandatory,
3022 but unused argument. */
3023
3024bool
3025sem_item_optimizer::release_split_map (congruence_class * const &,
3026 bitmap const &b, traverse_split_pair *)
3027{
3028 bitmap bmp = b;
3029
3030 BITMAP_FREE (bmp);
3031
3032 return true;
3033}
3034
3035/* Process split operation for a class given as pointer CLS_PTR,
3036 where bitmap B splits congruence class members. DATA is used
3037 as argument of split pair. */
3038
3039bool
3040sem_item_optimizer::traverse_congruence_split (congruence_class * const &cls,
3041 bitmap const &b, traverse_split_pair *pair)
3042{
3043 sem_item_optimizer *optimizer = pair->optimizer;
3044 const congruence_class *splitter_cls = pair->cls;
3045
3046 /* If counted bits are greater than zero and less than the number of members
3047 a group will be splitted. */
3048 unsigned popcount = bitmap_count_bits (b);
3049
3050 if (popcount > 0 && popcount < cls->members.length ())
3051 {
c9ab724f
ML
3052 auto_vec <congruence_class *, 2> newclasses;
3053 newclasses.quick_push (new congruence_class (class_id++));
3054 newclasses.quick_push (new congruence_class (class_id++));
b84d4347
ML
3055
3056 for (unsigned int i = 0; i < cls->members.length (); i++)
3057 {
3058 int target = bitmap_bit_p (b, i);
3059 congruence_class *tc = newclasses[target];
3060
3061 add_item_to_class (tc, cls->members[i]);
3062 }
3063
b2b29377
MM
3064 if (flag_checking)
3065 {
3066 for (unsigned int i = 0; i < 2; i++)
3067 gcc_assert (newclasses[i]->members.length ());
3068 }
b84d4347
ML
3069
3070 if (splitter_cls == cls)
3071 optimizer->splitter_class_removed = true;
3072
3073 /* Remove old class from worklist if presented. */
3074 bool in_worklist = cls->in_worklist;
3075
3076 if (in_worklist)
3077 cls->in_worklist = false;
3078
3079 congruence_class_group g;
3080 g.hash = cls->members[0]->get_hash ();
3081 g.type = cls->members[0]->type;
3082
3083 congruence_class_group *slot = optimizer->m_classes.find(&g);
3084
3085 for (unsigned int i = 0; i < slot->classes.length (); i++)
3086 if (slot->classes[i] == cls)
3087 {
3088 slot->classes.ordered_remove (i);
3089 break;
3090 }
3091
3092 /* New class will be inserted and integrated to work list. */
3093 for (unsigned int i = 0; i < 2; i++)
3094 optimizer->add_class (newclasses[i]);
3095
3096 /* Two classes replace one, so that increment just by one. */
3097 optimizer->m_classes_count++;
3098
3099 /* If OLD class was presented in the worklist, we remove the class
3100 and replace it will both newly created classes. */
3101 if (in_worklist)
3102 for (unsigned int i = 0; i < 2; i++)
3103 optimizer->worklist_push (newclasses[i]);
3104 else /* Just smaller class is inserted. */
3105 {
3106 unsigned int smaller_index = newclasses[0]->members.length () <
3107 newclasses[1]->members.length () ?
3108 0 : 1;
3109 optimizer->worklist_push (newclasses[smaller_index]);
3110 }
3111
3112 if (dump_file && (dump_flags & TDF_DETAILS))
3113 {
3114 fprintf (dump_file, " congruence class splitted:\n");
3115 cls->dump (dump_file, 4);
3116
3117 fprintf (dump_file, " newly created groups:\n");
3118 for (unsigned int i = 0; i < 2; i++)
3119 newclasses[i]->dump (dump_file, 4);
3120 }
3121
3122 /* Release class if not presented in work list. */
3123 if (!in_worklist)
3124 delete cls;
3125 }
3126
3127
3128 return true;
3129}
3130
3131/* Tests if a class CLS used as INDEXth splits any congruence classes.
3132 Bitmap stack BMSTACK is used for bitmap allocation. */
3133
3134void
3135sem_item_optimizer::do_congruence_step_for_index (congruence_class *cls,
3136 unsigned int index)
3137{
3138 hash_map <congruence_class *, bitmap> split_map;
3139
3140 for (unsigned int i = 0; i < cls->members.length (); i++)
3141 {
3142 sem_item *item = cls->members[i];
3143
3144 /* Iterate all usages that have INDEX as usage of the item. */
3145 for (unsigned int j = 0; j < item->usages.length (); j++)
3146 {
3147 sem_usage_pair *usage = item->usages[j];
3148
3149 if (usage->index != index)
3150 continue;
3151
3152 bitmap *slot = split_map.get (usage->item->cls);
3153 bitmap b;
3154
3155 if(!slot)
3156 {
3157 b = BITMAP_ALLOC (&m_bmstack);
3158 split_map.put (usage->item->cls, b);
3159 }
3160 else
3161 b = *slot;
3162
b84d4347
ML
3163 gcc_checking_assert (usage->item->cls);
3164 gcc_checking_assert (usage->item->index_in_class <
3165 usage->item->cls->members.length ());
b84d4347
ML
3166
3167 bitmap_set_bit (b, usage->item->index_in_class);
3168 }
3169 }
3170
3171 traverse_split_pair pair;
3172 pair.optimizer = this;
3173 pair.cls = cls;
3174
3175 splitter_class_removed = false;
3176 split_map.traverse
3177 <traverse_split_pair *, sem_item_optimizer::traverse_congruence_split> (&pair);
3178
3179 /* Bitmap clean-up. */
3180 split_map.traverse
3181 <traverse_split_pair *, sem_item_optimizer::release_split_map> (NULL);
3182}
3183
3184/* Every usage of a congruence class CLS is a candidate that can split the
3185 collection of classes. Bitmap stack BMSTACK is used for bitmap
3186 allocation. */
3187
3188void
3189sem_item_optimizer::do_congruence_step (congruence_class *cls)
3190{
3191 bitmap_iterator bi;
3192 unsigned int i;
3193
3194 bitmap usage = BITMAP_ALLOC (&m_bmstack);
3195
3196 for (unsigned int i = 0; i < cls->members.length (); i++)
3197 bitmap_ior_into (usage, cls->members[i]->usage_index_bitmap);
3198
3199 EXECUTE_IF_SET_IN_BITMAP (usage, 0, i, bi)
3200 {
3201 if (dump_file && (dump_flags & TDF_DETAILS))
2374c427 3202 fprintf (dump_file, " processing congruence step for class: %u, index: %u\n",
b84d4347
ML
3203 cls->id, i);
3204
3205 do_congruence_step_for_index (cls, i);
3206
3207 if (splitter_class_removed)
3208 break;
3209 }
3210
3211 BITMAP_FREE (usage);
3212}
3213
3214/* Adds a newly created congruence class CLS to worklist. */
3215
3216void
3217sem_item_optimizer::worklist_push (congruence_class *cls)
3218{
3219 /* Return if the class CLS is already presented in work list. */
3220 if (cls->in_worklist)
3221 return;
3222
3223 cls->in_worklist = true;
3224 worklist.push_back (cls);
3225}
3226
3227/* Pops a class from worklist. */
3228
3229congruence_class *
3230sem_item_optimizer::worklist_pop (void)
3231{
3232 congruence_class *cls;
3233
3234 while (!worklist.empty ())
3235 {
3236 cls = worklist.front ();
3237 worklist.pop_front ();
3238 if (cls->in_worklist)
3239 {
3240 cls->in_worklist = false;
3241
3242 return cls;
3243 }
3244 else
3245 {
3246 /* Work list item was already intended to be removed.
3247 The only reason for doing it is to split a class.
3248 Thus, the class CLS is deleted. */
3249 delete cls;
3250 }
3251 }
3252
3253 return NULL;
3254}
3255
3256/* Iterative congruence reduction function. */
3257
3258void
3259sem_item_optimizer::process_cong_reduction (void)
3260{
3261 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
3262 it != m_classes.end (); ++it)
3263 for (unsigned i = 0; i < (*it)->classes.length (); i++)
3264 if ((*it)->classes[i]->is_class_used ())
3265 worklist_push ((*it)->classes[i]);
3266
3267 if (dump_file)
3268 fprintf (dump_file, "Worklist has been filled with: %lu\n",
10568163 3269 (unsigned long) worklist.size ());
b84d4347
ML
3270
3271 if (dump_file && (dump_flags & TDF_DETAILS))
3272 fprintf (dump_file, "Congruence class reduction\n");
3273
3274 congruence_class *cls;
5ebd0e61
ML
3275
3276 /* Process complete congruence reduction. */
b84d4347
ML
3277 while ((cls = worklist_pop ()) != NULL)
3278 do_congruence_step (cls);
5ebd0e61
ML
3279
3280 /* Subdivide newly created classes according to references. */
3281 unsigned new_classes = subdivide_classes_by_sensitive_refs ();
3282
3283 if (dump_file)
3284 fprintf (dump_file, "Address reference subdivision created: %u "
3285 "new classes.\n", new_classes);
b84d4347
ML
3286}
3287
3288/* Debug function prints all informations about congruence classes. */
3289
3290void
3291sem_item_optimizer::dump_cong_classes (void)
3292{
3293 if (!dump_file)
3294 return;
3295
3296 fprintf (dump_file,
3297 "Congruence classes: %u (unique hash values: %lu), with total: %u items\n",
10568163 3298 m_classes_count, (unsigned long) m_classes.elements(), m_items.length ());
b84d4347
ML
3299
3300 /* Histogram calculation. */
3301 unsigned int max_index = 0;
3302 unsigned int* histogram = XCNEWVEC (unsigned int, m_items.length () + 1);
3303
3304 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
3305 it != m_classes.end (); ++it)
3306
3307 for (unsigned i = 0; i < (*it)->classes.length (); i++)
3308 {
3309 unsigned int c = (*it)->classes[i]->members.length ();
3310 histogram[c]++;
3311
3312 if (c > max_index)
3313 max_index = c;
3314 }
3315
3316 fprintf (dump_file,
3317 "Class size histogram [num of members]: number of classe number of classess\n");
3318
3319 for (unsigned int i = 0; i <= max_index; i++)
3320 if (histogram[i])
3321 fprintf (dump_file, "[%u]: %u classes\n", i, histogram[i]);
3322
3323 fprintf (dump_file, "\n\n");
3324
3325
3326 if (dump_flags & TDF_DETAILS)
3327 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
3328 it != m_classes.end (); ++it)
3329 {
3330 fprintf (dump_file, " group: with %u classes:\n", (*it)->classes.length ());
3331
3332 for (unsigned i = 0; i < (*it)->classes.length (); i++)
3333 {
3334 (*it)->classes[i]->dump (dump_file, 4);
3335
3336 if(i < (*it)->classes.length () - 1)
3337 fprintf (dump_file, " ");
3338 }
3339 }
3340
3341 free (histogram);
3342}
3343
3344/* After reduction is done, we can declare all items in a group
3345 to be equal. PREV_CLASS_COUNT is start number of classes
bd31fe14
ML
3346 before reduction. True is returned if there's a merge operation
3347 processed. */
b84d4347 3348
bd31fe14 3349bool
b84d4347
ML
3350sem_item_optimizer::merge_classes (unsigned int prev_class_count)
3351{
3352 unsigned int item_count = m_items.length ();
3353 unsigned int class_count = m_classes_count;
3354 unsigned int equal_items = item_count - class_count;
3355
3356 unsigned int non_singular_classes_count = 0;
3357 unsigned int non_singular_classes_sum = 0;
3358
bd31fe14
ML
3359 bool merged_p = false;
3360
b84d4347
ML
3361 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
3362 it != m_classes.end (); ++it)
3363 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
3364 {
3365 congruence_class *c = (*it)->classes[i];
3366 if (c->members.length () > 1)
3367 {
3368 non_singular_classes_count++;
3369 non_singular_classes_sum += c->members.length ();
3370 }
3371 }
3372
3373 if (dump_file)
3374 {
3375 fprintf (dump_file, "\nItem count: %u\n", item_count);
3376 fprintf (dump_file, "Congruent classes before: %u, after: %u\n",
3377 prev_class_count, class_count);
3378 fprintf (dump_file, "Average class size before: %.2f, after: %.2f\n",
f1c859ee
ML
3379 prev_class_count ? 1.0f * item_count / prev_class_count : 0.0f,
3380 class_count ? 1.0f * item_count / class_count : 0.0f);
b84d4347 3381 fprintf (dump_file, "Average non-singular class size: %.2f, count: %u\n",
f1c859ee
ML
3382 non_singular_classes_count ? 1.0f * non_singular_classes_sum /
3383 non_singular_classes_count : 0.0f,
b84d4347
ML
3384 non_singular_classes_count);
3385 fprintf (dump_file, "Equal symbols: %u\n", equal_items);
3386 fprintf (dump_file, "Fraction of visited symbols: %.2f%%\n\n",
f1c859ee 3387 item_count ? 100.0f * equal_items / item_count : 0.0f);
b84d4347
ML
3388 }
3389
3390 for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
3391 it != m_classes.end (); ++it)
3392 for (unsigned int i = 0; i < (*it)->classes.length (); i++)
3393 {
3394 congruence_class *c = (*it)->classes[i];
3395
3396 if (c->members.length () == 1)
3397 continue;
3398
3399 gcc_assert (c->members.length ());
3400
3401 sem_item *source = c->members[0];
3402
3403 for (unsigned int j = 1; j < c->members.length (); j++)
3404 {
3405 sem_item *alias = c->members[j];
b84d4347
ML
3406
3407 if (dump_file)
3408 {
3409 fprintf (dump_file, "Semantic equality hit:%s->%s\n",
1aec2ecc
ML
3410 xstrdup_for_dump (source->node->name ()),
3411 xstrdup_for_dump (alias->node->name ()));
b84d4347 3412 fprintf (dump_file, "Assembler symbol names:%s->%s\n",
1aec2ecc
ML
3413 xstrdup_for_dump (source->node->asm_name ()),
3414 xstrdup_for_dump (alias->node->asm_name ()));
b84d4347
ML
3415 }
3416
185c9e56
ML
3417 if (lookup_attribute ("no_icf", DECL_ATTRIBUTES (alias->decl)))
3418 {
3419 if (dump_file)
3420 fprintf (dump_file,
3421 "Merge operation is skipped due to no_icf "
3422 "attribute.\n\n");
3423
3424 continue;
3425 }
3426
b84d4347
ML
3427 if (dump_file && (dump_flags & TDF_DETAILS))
3428 {
3429 source->dump_to_file (dump_file);
3430 alias->dump_to_file (dump_file);
3431 }
3432
7aeb92b4
ML
3433 if (dbg_cnt (merged_ipa_icf))
3434 merged_p |= source->merge (alias);
b84d4347
ML
3435 }
3436 }
bd31fe14
ML
3437
3438 return merged_p;
b84d4347
ML
3439}
3440
3441/* Dump function prints all class members to a FILE with an INDENT. */
3442
3443void
3444congruence_class::dump (FILE *file, unsigned int indent) const
3445{
3446 FPRINTF_SPACES (file, indent, "class with id: %u, hash: %u, items: %u\n",
3447 id, members[0]->get_hash (), members.length ());
3448
3449 FPUTS_SPACES (file, indent + 2, "");
3450 for (unsigned i = 0; i < members.length (); i++)
1aec2ecc
ML
3451 fprintf (file, "%s(%p/%u) ", members[i]->node->asm_name (),
3452 (void *) members[i]->decl,
b84d4347
ML
3453 members[i]->node->order);
3454
3455 fprintf (file, "\n");
3456}
3457
3458/* Returns true if there's a member that is used from another group. */
3459
3460bool
3461congruence_class::is_class_used (void)
3462{
3463 for (unsigned int i = 0; i < members.length (); i++)
3464 if (members[i]->usages.length ())
3465 return true;
3466
3467 return false;
3468}
3469
b84d4347
ML
3470/* Generate pass summary for IPA ICF pass. */
3471
3472static void
3473ipa_icf_generate_summary (void)
3474{
3475 if (!optimizer)
3476 optimizer = new sem_item_optimizer ();
3477
e3e968e9 3478 optimizer->register_hooks ();
b84d4347
ML
3479 optimizer->parse_funcs_and_vars ();
3480}
3481
3482/* Write pass summary for IPA ICF pass. */
3483
3484static void
3485ipa_icf_write_summary (void)
3486{
3487 gcc_assert (optimizer);
3488
3489 optimizer->write_summary ();
3490}
3491
3492/* Read pass summary for IPA ICF pass. */
3493
3494static void
3495ipa_icf_read_summary (void)
3496{
3497 if (!optimizer)
3498 optimizer = new sem_item_optimizer ();
3499
3500 optimizer->read_summary ();
3501 optimizer->register_hooks ();
3502}
3503
3504/* Semantic equality exection function. */
3505
3506static unsigned int
3507ipa_icf_driver (void)
3508{
3509 gcc_assert (optimizer);
3510
bd31fe14 3511 bool merged_p = optimizer->execute ();
b84d4347
ML
3512
3513 delete optimizer;
9612a39a 3514 optimizer = NULL;
b84d4347 3515
bd31fe14 3516 return merged_p ? TODO_remove_functions : 0;
b84d4347
ML
3517}
3518
3519const pass_data pass_data_ipa_icf =
3520{
3521 IPA_PASS, /* type */
3522 "icf", /* name */
3523 OPTGROUP_IPA, /* optinfo_flags */
3524 TV_IPA_ICF, /* tv_id */
3525 0, /* properties_required */
3526 0, /* properties_provided */
3527 0, /* properties_destroyed */
3528 0, /* todo_flags_start */
3529 0, /* todo_flags_finish */
3530};
3531
3532class pass_ipa_icf : public ipa_opt_pass_d
3533{
3534public:
3535 pass_ipa_icf (gcc::context *ctxt)
3536 : ipa_opt_pass_d (pass_data_ipa_icf, ctxt,
3537 ipa_icf_generate_summary, /* generate_summary */
3538 ipa_icf_write_summary, /* write_summary */
3539 ipa_icf_read_summary, /* read_summary */
3540 NULL, /*
3541 write_optimization_summary */
3542 NULL, /*
3543 read_optimization_summary */
3544 NULL, /* stmt_fixup */
3545 0, /* function_transform_todo_flags_start */
3546 NULL, /* function_transform */
3547 NULL) /* variable_transform */
3548 {}
3549
3550 /* opt_pass methods: */
3551 virtual bool gate (function *)
3552 {
b16650ac 3553 return in_lto_p || flag_ipa_icf_variables || flag_ipa_icf_functions;
b84d4347
ML
3554 }
3555
3556 virtual unsigned int execute (function *)
3557 {
3558 return ipa_icf_driver();
3559 }
3560}; // class pass_ipa_icf
3561
3562} // ipa_icf namespace
3563
3564ipa_opt_pass_d *
3565make_pass_ipa_icf (gcc::context *ctxt)
3566{
3567 return new ipa_icf::pass_ipa_icf (ctxt);
3568}