re PR tree-optimization/40914 (ipa_analyze_call_uses fails to handle ptrmemfunc_vbit_...
[gcc.git] / gcc / ipa-prop.c
1 /* Interprocedural analyses.
2 Copyright (C) 2005, 2007, 2008, 2009 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
19
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "tree.h"
24 #include "langhooks.h"
25 #include "ggc.h"
26 #include "target.h"
27 #include "cgraph.h"
28 #include "ipa-prop.h"
29 #include "tree-flow.h"
30 #include "tree-pass.h"
31 #include "tree-inline.h"
32 #include "flags.h"
33 #include "timevar.h"
34 #include "flags.h"
35 #include "diagnostic.h"
36
37 /* Vector where the parameter infos are actually stored. */
38 VEC (ipa_node_params_t, heap) *ipa_node_params_vector;
39 /* Vector where the parameter infos are actually stored. */
40 VEC (ipa_edge_args_t, heap) *ipa_edge_args_vector;
41
42 /* Holders of ipa cgraph hooks: */
43 static struct cgraph_edge_hook_list *edge_removal_hook_holder;
44 static struct cgraph_node_hook_list *node_removal_hook_holder;
45 static struct cgraph_2edge_hook_list *edge_duplication_hook_holder;
46 static struct cgraph_2node_hook_list *node_duplication_hook_holder;
47
48 /* Add cgraph NODE described by INFO to the worklist WL regardless of whether
49 it is in one or not. It should almost never be used directly, as opposed to
50 ipa_push_func_to_list. */
51
52 void
53 ipa_push_func_to_list_1 (struct ipa_func_list **wl,
54 struct cgraph_node *node,
55 struct ipa_node_params *info)
56 {
57 struct ipa_func_list *temp;
58
59 info->node_enqueued = 1;
60 temp = XCNEW (struct ipa_func_list);
61 temp->node = node;
62 temp->next = *wl;
63 *wl = temp;
64 }
65
66 /* Initialize worklist to contain all functions. */
67
68 struct ipa_func_list *
69 ipa_init_func_list (void)
70 {
71 struct cgraph_node *node;
72 struct ipa_func_list * wl;
73
74 wl = NULL;
75 for (node = cgraph_nodes; node; node = node->next)
76 if (node->analyzed)
77 {
78 struct ipa_node_params *info = IPA_NODE_REF (node);
79 /* Unreachable nodes should have been eliminated before ipcp and
80 inlining. */
81 gcc_assert (node->needed || node->reachable);
82 ipa_push_func_to_list_1 (&wl, node, info);
83 }
84
85 return wl;
86 }
87
88 /* Remove a function from the worklist WL and return it. */
89
90 struct cgraph_node *
91 ipa_pop_func_from_list (struct ipa_func_list **wl)
92 {
93 struct ipa_node_params *info;
94 struct ipa_func_list *first;
95 struct cgraph_node *node;
96
97 first = *wl;
98 *wl = (*wl)->next;
99 node = first->node;
100 free (first);
101
102 info = IPA_NODE_REF (node);
103 info->node_enqueued = 0;
104 return node;
105 }
106
107 /* Return index of the formal whose tree is PTREE in function which corresponds
108 to INFO. */
109
110 static int
111 ipa_get_param_decl_index (struct ipa_node_params *info, tree ptree)
112 {
113 int i, count;
114
115 count = ipa_get_param_count (info);
116 for (i = 0; i < count; i++)
117 if (ipa_get_param(info, i) == ptree)
118 return i;
119
120 return -1;
121 }
122
123 /* Populate the param_decl field in parameter descriptors of INFO that
124 corresponds to NODE. */
125
126 static void
127 ipa_populate_param_decls (struct cgraph_node *node,
128 struct ipa_node_params *info)
129 {
130 tree fndecl;
131 tree fnargs;
132 tree parm;
133 int param_num;
134
135 fndecl = node->decl;
136 fnargs = DECL_ARGUMENTS (fndecl);
137 param_num = 0;
138 for (parm = fnargs; parm; parm = TREE_CHAIN (parm))
139 {
140 info->params[param_num].decl = parm;
141 param_num++;
142 }
143 }
144
145 /* Count number of formal parameters in NOTE. Store the result to the
146 appropriate field of INFO. */
147
148 static void
149 ipa_count_formal_params (struct cgraph_node *node,
150 struct ipa_node_params *info)
151 {
152 tree fndecl;
153 tree fnargs;
154 tree parm;
155 int param_num;
156
157 fndecl = node->decl;
158 fnargs = DECL_ARGUMENTS (fndecl);
159 param_num = 0;
160 for (parm = fnargs; parm; parm = TREE_CHAIN (parm))
161 param_num++;
162 ipa_set_param_count (info, param_num);
163 }
164
165 /* Initialize the ipa_node_params structure associated with NODE by counting
166 the function parameters, creating the descriptors and populating their
167 param_decls. */
168
169 void
170 ipa_initialize_node_params (struct cgraph_node *node)
171 {
172 struct ipa_node_params *info = IPA_NODE_REF (node);
173
174 if (!info->params)
175 {
176 ipa_count_formal_params (node, info);
177 info->params = XCNEWVEC (struct ipa_param_descriptor,
178 ipa_get_param_count (info));
179 ipa_populate_param_decls (node, info);
180 }
181 }
182
183 /* Callback of walk_stmt_load_store_addr_ops for the visit_store and visit_addr
184 parameters. If OP is a parameter declaration, mark it as modified in the
185 info structure passed in DATA. */
186
187 static bool
188 visit_store_addr_for_mod_analysis (gimple stmt ATTRIBUTE_UNUSED,
189 tree op, void *data)
190 {
191 struct ipa_node_params *info = (struct ipa_node_params *) data;
192
193 if (TREE_CODE (op) == PARM_DECL)
194 {
195 int index = ipa_get_param_decl_index (info, op);
196 gcc_assert (index >= 0);
197 info->params[index].modified = true;
198 }
199
200 return false;
201 }
202
203 /* Compute which formal parameters of function associated with NODE are locally
204 modified or their address is taken. Note that this does not apply on
205 parameters with SSA names but those can and should be analyzed
206 differently. */
207
208 void
209 ipa_detect_param_modifications (struct cgraph_node *node)
210 {
211 tree decl = node->decl;
212 basic_block bb;
213 struct function *func;
214 gimple_stmt_iterator gsi;
215 struct ipa_node_params *info = IPA_NODE_REF (node);
216
217 if (ipa_get_param_count (info) == 0 || info->modification_analysis_done)
218 return;
219
220 func = DECL_STRUCT_FUNCTION (decl);
221 FOR_EACH_BB_FN (bb, func)
222 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
223 walk_stmt_load_store_addr_ops (gsi_stmt (gsi), info, NULL,
224 visit_store_addr_for_mod_analysis,
225 visit_store_addr_for_mod_analysis);
226
227 info->modification_analysis_done = 1;
228 }
229
230 /* Count number of arguments callsite CS has and store it in
231 ipa_edge_args structure corresponding to this callsite. */
232
233 void
234 ipa_count_arguments (struct cgraph_edge *cs)
235 {
236 gimple stmt;
237 int arg_num;
238
239 stmt = cs->call_stmt;
240 gcc_assert (is_gimple_call (stmt));
241 arg_num = gimple_call_num_args (stmt);
242 if (VEC_length (ipa_edge_args_t, ipa_edge_args_vector)
243 <= (unsigned) cgraph_edge_max_uid)
244 VEC_safe_grow_cleared (ipa_edge_args_t, heap,
245 ipa_edge_args_vector, cgraph_edge_max_uid + 1);
246 ipa_set_cs_argument_count (IPA_EDGE_REF (cs), arg_num);
247 }
248
249 /* Print the jump functions of all arguments on all call graph edges going from
250 NODE to file F. */
251
252 void
253 ipa_print_node_jump_functions (FILE *f, struct cgraph_node *node)
254 {
255 int i, count;
256 struct cgraph_edge *cs;
257 struct ipa_jump_func *jump_func;
258 enum jump_func_type type;
259
260 fprintf (f, " Jump functions of caller %s:\n", cgraph_node_name (node));
261 for (cs = node->callees; cs; cs = cs->next_callee)
262 {
263 if (!ipa_edge_args_info_available_for_edge_p (cs))
264 continue;
265
266 fprintf (f, " callsite %s ", cgraph_node_name (node));
267 fprintf (f, "-> %s :: \n", cgraph_node_name (cs->callee));
268
269 count = ipa_get_cs_argument_count (IPA_EDGE_REF (cs));
270 for (i = 0; i < count; i++)
271 {
272 jump_func = ipa_get_ith_jump_func (IPA_EDGE_REF (cs), i);
273 type = jump_func->type;
274
275 fprintf (f, " param %d: ", i);
276 if (type == IPA_JF_UNKNOWN)
277 fprintf (f, "UNKNOWN\n");
278 else if (type == IPA_JF_CONST)
279 {
280 tree val = jump_func->value.constant;
281 fprintf (f, "CONST: ");
282 print_generic_expr (f, val, 0);
283 fprintf (f, "\n");
284 }
285 else if (type == IPA_JF_CONST_MEMBER_PTR)
286 {
287 fprintf (f, "CONST MEMBER PTR: ");
288 print_generic_expr (f, jump_func->value.member_cst.pfn, 0);
289 fprintf (f, ", ");
290 print_generic_expr (f, jump_func->value.member_cst.delta, 0);
291 fprintf (f, "\n");
292 }
293 else if (type == IPA_JF_PASS_THROUGH)
294 {
295 fprintf (f, "PASS THROUGH: ");
296 fprintf (f, "%d\n", jump_func->value.formal_id);
297 }
298 }
299 }
300 }
301
302 /* Print ipa_jump_func data structures of all nodes in the call graph to F. */
303
304 void
305 ipa_print_all_jump_functions (FILE *f)
306 {
307 struct cgraph_node *node;
308
309 fprintf (f, "\nJump functions:\n");
310 for (node = cgraph_nodes; node; node = node->next)
311 {
312 ipa_print_node_jump_functions (f, node);
313 }
314 }
315
316 /* Determine the jump functions of scalar arguments. Scalar means SSA names
317 and constants of a number of selected types. INFO is the ipa_node_params
318 structure associated with the caller, FUNCTIONS is a pointer to an array of
319 jump function structures associated with CALL which is the call statement
320 being examined.*/
321
322 static void
323 compute_scalar_jump_functions (struct ipa_node_params *info,
324 struct ipa_jump_func *functions,
325 gimple call)
326 {
327 tree arg;
328 unsigned num = 0;
329
330 for (num = 0; num < gimple_call_num_args (call); num++)
331 {
332 arg = gimple_call_arg (call, num);
333
334 if (is_gimple_ip_invariant (arg))
335 {
336 functions[num].type = IPA_JF_CONST;
337 functions[num].value.constant = arg;
338 }
339 else if ((TREE_CODE (arg) == SSA_NAME) && SSA_NAME_IS_DEFAULT_DEF (arg))
340 {
341 int index = ipa_get_param_decl_index (info, SSA_NAME_VAR (arg));
342
343 if (index >= 0)
344 {
345 functions[num].type = IPA_JF_PASS_THROUGH;
346 functions[num].value.formal_id = index;
347 }
348 }
349 }
350 }
351
352 /* Inspect the given TYPE and return true iff it has the same structure (the
353 same number of fields of the same types) as a C++ member pointer. If
354 METHOD_PTR and DELTA are non-NULL, store the trees representing the
355 corresponding fields there. */
356
357 static bool
358 type_like_member_ptr_p (tree type, tree *method_ptr, tree *delta)
359 {
360 tree fld;
361
362 if (TREE_CODE (type) != RECORD_TYPE)
363 return false;
364
365 fld = TYPE_FIELDS (type);
366 if (!fld || !POINTER_TYPE_P (TREE_TYPE (fld))
367 || TREE_CODE (TREE_TYPE (TREE_TYPE (fld))) != METHOD_TYPE)
368 return false;
369
370 if (method_ptr)
371 *method_ptr = fld;
372
373 fld = TREE_CHAIN (fld);
374 if (!fld || INTEGRAL_TYPE_P (fld))
375 return false;
376 if (delta)
377 *delta = fld;
378
379 if (TREE_CHAIN (fld))
380 return false;
381
382 return true;
383 }
384
385 /* Go through arguments of the CALL and for every one that looks like a member
386 pointer, check whether it can be safely declared pass-through and if so,
387 mark that to the corresponding item of jump FUNCTIONS. Return true iff
388 there are non-pass-through member pointers within the arguments. INFO
389 describes formal parameters of the caller. */
390
391 static bool
392 compute_pass_through_member_ptrs (struct ipa_node_params *info,
393 struct ipa_jump_func *functions,
394 gimple call)
395 {
396 bool undecided_members = false;
397 unsigned num;
398 tree arg;
399
400 for (num = 0; num < gimple_call_num_args (call); num++)
401 {
402 arg = gimple_call_arg (call, num);
403
404 if (type_like_member_ptr_p (TREE_TYPE (arg), NULL, NULL))
405 {
406 if (TREE_CODE (arg) == PARM_DECL)
407 {
408 int index = ipa_get_param_decl_index (info, arg);
409
410 gcc_assert (index >=0);
411 if (!ipa_is_param_modified (info, index))
412 {
413 functions[num].type = IPA_JF_PASS_THROUGH;
414 functions[num].value.formal_id = index;
415 }
416 else
417 undecided_members = true;
418 }
419 else
420 undecided_members = true;
421 }
422 }
423
424 return undecided_members;
425 }
426
427 /* Simple function filling in a member pointer constant jump function (with PFN
428 and DELTA as the constant value) into JFUNC. */
429
430 static void
431 fill_member_ptr_cst_jump_function (struct ipa_jump_func *jfunc,
432 tree pfn, tree delta)
433 {
434 jfunc->type = IPA_JF_CONST_MEMBER_PTR;
435 jfunc->value.member_cst.pfn = pfn;
436 jfunc->value.member_cst.delta = delta;
437 }
438
439 /* If RHS is an SSA_NAMe and it is defined by a simple copy assign statement,
440 return the rhs of its defining statement. */
441
442 static inline tree
443 get_ssa_def_if_simple_copy (tree rhs)
444 {
445 while (TREE_CODE (rhs) == SSA_NAME && !SSA_NAME_IS_DEFAULT_DEF (rhs))
446 {
447 gimple def_stmt = SSA_NAME_DEF_STMT (rhs);
448
449 if (gimple_assign_single_p (def_stmt))
450 rhs = gimple_assign_rhs1 (def_stmt);
451 else
452 break;
453 }
454 return rhs;
455 }
456
457 /* Traverse statements from CALL backwards, scanning whether the argument ARG
458 which is a member pointer is filled in with constant values. If it is, fill
459 the jump function JFUNC in appropriately. METHOD_FIELD and DELTA_FIELD are
460 fields of the record type of the member pointer. To give an example, we
461 look for a pattern looking like the following:
462
463 D.2515.__pfn ={v} printStuff;
464 D.2515.__delta ={v} 0;
465 i_1 = doprinting (D.2515); */
466
467 static void
468 determine_cst_member_ptr (gimple call, tree arg, tree method_field,
469 tree delta_field, struct ipa_jump_func *jfunc)
470 {
471 gimple_stmt_iterator gsi;
472 tree method = NULL_TREE;
473 tree delta = NULL_TREE;
474
475 gsi = gsi_for_stmt (call);
476
477 gsi_prev (&gsi);
478 for (; !gsi_end_p (gsi); gsi_prev (&gsi))
479 {
480 gimple stmt = gsi_stmt (gsi);
481 tree lhs, rhs, fld;
482
483 if (!gimple_assign_single_p (stmt))
484 return;
485
486 lhs = gimple_assign_lhs (stmt);
487 rhs = gimple_assign_rhs1 (stmt);
488
489 if (TREE_CODE (lhs) != COMPONENT_REF
490 || TREE_OPERAND (lhs, 0) != arg)
491 continue;
492
493 fld = TREE_OPERAND (lhs, 1);
494 if (!method && fld == method_field)
495 {
496 rhs = get_ssa_def_if_simple_copy (rhs);
497 if (TREE_CODE (rhs) == ADDR_EXPR
498 && TREE_CODE (TREE_OPERAND (rhs, 0)) == FUNCTION_DECL
499 && TREE_CODE (TREE_TYPE (TREE_OPERAND (rhs, 0))) == METHOD_TYPE)
500 {
501 method = TREE_OPERAND (rhs, 0);
502 if (delta)
503 {
504 fill_member_ptr_cst_jump_function (jfunc, rhs, delta);
505 return;
506 }
507 }
508 else
509 return;
510 }
511
512 if (!delta && fld == delta_field)
513 {
514 rhs = get_ssa_def_if_simple_copy (rhs);
515 if (TREE_CODE (rhs) == INTEGER_CST)
516 {
517 delta = rhs;
518 if (method)
519 {
520 fill_member_ptr_cst_jump_function (jfunc, rhs, delta);
521 return;
522 }
523 }
524 else
525 return;
526 }
527 }
528
529 return;
530 }
531
532 /* Go through the arguments of the CALL and for every member pointer within
533 tries determine whether it is a constant. If it is, create a corresponding
534 constant jump function in FUNCTIONS which is an array of jump functions
535 associated with the call. */
536
537 static void
538 compute_cst_member_ptr_arguments (struct ipa_jump_func *functions,
539 gimple call)
540 {
541 unsigned num;
542 tree arg, method_field, delta_field;
543
544 for (num = 0; num < gimple_call_num_args (call); num++)
545 {
546 arg = gimple_call_arg (call, num);
547
548 if (functions[num].type == IPA_JF_UNKNOWN
549 && type_like_member_ptr_p (TREE_TYPE (arg), &method_field,
550 &delta_field))
551 determine_cst_member_ptr (call, arg, method_field, delta_field,
552 &functions[num]);
553 }
554 }
555
556 /* Compute jump function for all arguments of callsite CS and insert the
557 information in the jump_functions array in the ipa_edge_args corresponding
558 to this callsite. */
559
560 void
561 ipa_compute_jump_functions (struct cgraph_edge *cs)
562 {
563 struct ipa_node_params *info = IPA_NODE_REF (cs->caller);
564 struct ipa_edge_args *arguments = IPA_EDGE_REF (cs);
565 gimple call;
566
567 if (ipa_get_cs_argument_count (arguments) == 0 || arguments->jump_functions)
568 return;
569 arguments->jump_functions = XCNEWVEC (struct ipa_jump_func,
570 ipa_get_cs_argument_count (arguments));
571
572 call = cs->call_stmt;
573 gcc_assert (is_gimple_call (call));
574
575 /* We will deal with constants and SSA scalars first: */
576 compute_scalar_jump_functions (info, arguments->jump_functions, call);
577
578 /* Let's check whether there are any potential member pointers and if so,
579 whether we can determine their functions as pass_through. */
580 if (!compute_pass_through_member_ptrs (info, arguments->jump_functions, call))
581 return;
582
583 /* Finally, let's check whether we actually pass a new constant member
584 pointer here... */
585 compute_cst_member_ptr_arguments (arguments->jump_functions, call);
586 }
587
588 /* If RHS looks like a rhs of a statement loading pfn from a member
589 pointer formal parameter, return the parameter, otherwise return
590 NULL. If USE_DELTA, then we look for a use of the delta field
591 rather than the pfn. */
592
593 static tree
594 ipa_get_member_ptr_load_param (tree rhs, bool use_delta)
595 {
596 tree rec, fld;
597 tree ptr_field;
598 tree delta_field;
599
600 if (TREE_CODE (rhs) != COMPONENT_REF)
601 return NULL_TREE;
602
603 rec = TREE_OPERAND (rhs, 0);
604 if (TREE_CODE (rec) != PARM_DECL
605 || !type_like_member_ptr_p (TREE_TYPE (rec), &ptr_field, &delta_field))
606 return NULL_TREE;
607
608 fld = TREE_OPERAND (rhs, 1);
609 if (use_delta ? (fld == delta_field) : (fld == ptr_field))
610 return rec;
611 else
612 return NULL_TREE;
613 }
614
615 /* If STMT looks like a statement loading a value from a member pointer formal
616 parameter, this function returns that parameter. */
617
618 static tree
619 ipa_get_stmt_member_ptr_load_param (gimple stmt, bool use_delta)
620 {
621 tree rhs;
622
623 if (!gimple_assign_single_p (stmt))
624 return NULL_TREE;
625
626 rhs = gimple_assign_rhs1 (stmt);
627 return ipa_get_member_ptr_load_param (rhs, use_delta);
628 }
629
630 /* Returns true iff T is an SSA_NAME defined by a statement. */
631
632 static bool
633 ipa_is_ssa_with_stmt_def (tree t)
634 {
635 if (TREE_CODE (t) == SSA_NAME
636 && !SSA_NAME_IS_DEFAULT_DEF (t))
637 return true;
638 else
639 return false;
640 }
641
642 /* Creates a new note describing a call to a parameter number FORMAL_ID and
643 attaches it to the linked list of INFO. It also sets the called flag of the
644 parameter. STMT is the corresponding call statement. */
645
646 static void
647 ipa_note_param_call (struct ipa_node_params *info, int formal_id,
648 gimple stmt)
649 {
650 struct ipa_param_call_note *note;
651 basic_block bb = gimple_bb (stmt);
652
653 info->params[formal_id].called = 1;
654
655 note = XCNEW (struct ipa_param_call_note);
656 note->formal_id = formal_id;
657 note->stmt = stmt;
658 note->count = bb->count;
659 note->frequency = compute_call_stmt_bb_frequency (current_function_decl, bb);
660
661 note->next = info->param_calls;
662 info->param_calls = note;
663
664 return;
665 }
666
667 /* Analyze the CALL and examine uses of formal parameters of the caller
668 (described by INFO). Currently it checks whether the call calls a pointer
669 that is a formal parameter and if so, the parameter is marked with the
670 called flag and a note describing the call is created. This is very simple
671 for ordinary pointers represented in SSA but not-so-nice when it comes to
672 member pointers. The ugly part of this function does nothing more than
673 tries to match the pattern of such a call. An example of such a pattern is
674 the gimple dump below, the call is on the last line:
675
676 <bb 2>:
677 f$__delta_5 = f.__delta;
678 f$__pfn_24 = f.__pfn;
679 D.2496_3 = (int) f$__pfn_24;
680 D.2497_4 = D.2496_3 & 1;
681 if (D.2497_4 != 0)
682 goto <bb 3>;
683 else
684 goto <bb 4>;
685
686 <bb 3>:
687 D.2500_7 = (unsigned int) f$__delta_5;
688 D.2501_8 = &S + D.2500_7;
689 D.2502_9 = (int (*__vtbl_ptr_type) (void) * *) D.2501_8;
690 D.2503_10 = *D.2502_9;
691 D.2504_12 = f$__pfn_24 + -1;
692 D.2505_13 = (unsigned int) D.2504_12;
693 D.2506_14 = D.2503_10 + D.2505_13;
694 D.2507_15 = *D.2506_14;
695 iftmp.11_16 = (String:: *) D.2507_15;
696
697 <bb 4>:
698 # iftmp.11_1 = PHI <iftmp.11_16(3), f$__pfn_24(2)>
699 D.2500_19 = (unsigned int) f$__delta_5;
700 D.2508_20 = &S + D.2500_19;
701 D.2493_21 = iftmp.11_1 (D.2508_20, 4);
702
703 Such patterns are results of simple calls to a member pointer:
704
705 int doprinting (int (MyString::* f)(int) const)
706 {
707 MyString S ("somestring");
708
709 return (S.*f)(4);
710 }
711 */
712
713 static void
714 ipa_analyze_call_uses (struct ipa_node_params *info, gimple call)
715 {
716 tree target = gimple_call_fn (call);
717 gimple def;
718 tree var;
719 tree n1, n2;
720 gimple d1, d2;
721 tree rec, rec2, cond;
722 gimple branch;
723 int index;
724 basic_block bb, virt_bb, join;
725
726 if (TREE_CODE (target) != SSA_NAME)
727 return;
728
729 var = SSA_NAME_VAR (target);
730 if (SSA_NAME_IS_DEFAULT_DEF (target))
731 {
732 /* assuming TREE_CODE (var) == PARM_DECL */
733 index = ipa_get_param_decl_index (info, var);
734 if (index >= 0)
735 ipa_note_param_call (info, index, call);
736 return;
737 }
738
739 /* Now we need to try to match the complex pattern of calling a member
740 pointer. */
741
742 if (!POINTER_TYPE_P (TREE_TYPE (target))
743 || TREE_CODE (TREE_TYPE (TREE_TYPE (target))) != METHOD_TYPE)
744 return;
745
746 def = SSA_NAME_DEF_STMT (target);
747 if (gimple_code (def) != GIMPLE_PHI)
748 return;
749
750 if (gimple_phi_num_args (def) != 2)
751 return;
752
753 /* First, we need to check whether one of these is a load from a member
754 pointer that is a parameter to this function. */
755 n1 = PHI_ARG_DEF (def, 0);
756 n2 = PHI_ARG_DEF (def, 1);
757 if (!ipa_is_ssa_with_stmt_def (n1) || !ipa_is_ssa_with_stmt_def (n2))
758 return;
759 d1 = SSA_NAME_DEF_STMT (n1);
760 d2 = SSA_NAME_DEF_STMT (n2);
761
762 if ((rec = ipa_get_stmt_member_ptr_load_param (d1, false)))
763 {
764 if (ipa_get_stmt_member_ptr_load_param (d2, false))
765 return;
766
767 bb = gimple_bb (d1);
768 virt_bb = gimple_bb (d2);
769 }
770 else if ((rec = ipa_get_stmt_member_ptr_load_param (d2, false)))
771 {
772 bb = gimple_bb (d2);
773 virt_bb = gimple_bb (d1);
774 }
775 else
776 return;
777
778 /* Second, we need to check that the basic blocks are laid out in the way
779 corresponding to the pattern. */
780
781 join = gimple_bb (def);
782 if (!single_pred_p (virt_bb) || !single_succ_p (virt_bb)
783 || single_pred (virt_bb) != bb
784 || single_succ (virt_bb) != join)
785 return;
786
787 /* Third, let's see that the branching is done depending on the least
788 significant bit of the pfn. */
789
790 branch = last_stmt (bb);
791 if (gimple_code (branch) != GIMPLE_COND)
792 return;
793
794 if (gimple_cond_code (branch) != NE_EXPR
795 || !integer_zerop (gimple_cond_rhs (branch)))
796 return;
797
798 cond = gimple_cond_lhs (branch);
799 if (!ipa_is_ssa_with_stmt_def (cond))
800 return;
801
802 def = SSA_NAME_DEF_STMT (cond);
803 if (!is_gimple_assign (def)
804 || gimple_assign_rhs_code (def) != BIT_AND_EXPR
805 || !integer_onep (gimple_assign_rhs2 (def)))
806 return;
807
808 cond = gimple_assign_rhs1 (def);
809 if (!ipa_is_ssa_with_stmt_def (cond))
810 return;
811
812 def = SSA_NAME_DEF_STMT (cond);
813
814 if (is_gimple_assign (def)
815 && CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def)))
816 {
817 cond = gimple_assign_rhs1 (def);
818 if (!ipa_is_ssa_with_stmt_def (cond))
819 return;
820 def = SSA_NAME_DEF_STMT (cond);
821 }
822
823 rec2 = ipa_get_stmt_member_ptr_load_param (def,
824 (TARGET_PTRMEMFUNC_VBIT_LOCATION
825 == ptrmemfunc_vbit_in_delta));
826
827 if (rec != rec2)
828 return;
829
830 index = ipa_get_param_decl_index (info, rec);
831 if (index >= 0 && !ipa_is_param_modified (info, index))
832 ipa_note_param_call (info, index, call);
833
834 return;
835 }
836
837 /* Analyze the statement STMT with respect to formal parameters (described in
838 INFO) and their uses. Currently it only checks whether formal parameters
839 are called. */
840
841 static void
842 ipa_analyze_stmt_uses (struct ipa_node_params *info, gimple stmt)
843 {
844 if (is_gimple_call (stmt))
845 ipa_analyze_call_uses (info, stmt);
846 }
847
848 /* Scan the function body of NODE and inspect the uses of formal parameters.
849 Store the findings in various structures of the associated ipa_node_params
850 structure, such as parameter flags, notes etc. */
851
852 void
853 ipa_analyze_params_uses (struct cgraph_node *node)
854 {
855 tree decl = node->decl;
856 basic_block bb;
857 struct function *func;
858 gimple_stmt_iterator gsi;
859 struct ipa_node_params *info = IPA_NODE_REF (node);
860
861 if (ipa_get_param_count (info) == 0 || info->uses_analysis_done)
862 return;
863
864 func = DECL_STRUCT_FUNCTION (decl);
865 FOR_EACH_BB_FN (bb, func)
866 {
867 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
868 {
869 gimple stmt = gsi_stmt (gsi);
870 ipa_analyze_stmt_uses (info, stmt);
871 }
872 }
873
874 info->uses_analysis_done = 1;
875 }
876
877 /* Update the jump functions associated with call graph edge E when the call
878 graph edge CS is being inlined, assuming that E->caller is already (possibly
879 indirectly) inlined into CS->callee and that E has not been inlined. */
880
881 static void
882 update_jump_functions_after_inlining (struct cgraph_edge *cs,
883 struct cgraph_edge *e)
884 {
885 struct ipa_edge_args *top = IPA_EDGE_REF (cs);
886 struct ipa_edge_args *args = IPA_EDGE_REF (e);
887 int count = ipa_get_cs_argument_count (args);
888 int i;
889
890 for (i = 0; i < count; i++)
891 {
892 struct ipa_jump_func *src, *dst = ipa_get_ith_jump_func (args, i);
893
894 if (dst->type != IPA_JF_PASS_THROUGH)
895 continue;
896
897 /* We must check range due to calls with variable number of arguments: */
898 if (dst->value.formal_id >= (unsigned) ipa_get_cs_argument_count (top))
899 {
900 dst->type = IPA_JF_UNKNOWN;
901 continue;
902 }
903
904 src = ipa_get_ith_jump_func (top, dst->value.formal_id);
905 *dst = *src;
906 }
907 }
908
909 /* Print out a debug message to file F that we have discovered that an indirect
910 call described by NT is in fact a call of a known constant function described
911 by JFUNC. NODE is the node where the call is. */
912
913 static void
914 print_edge_addition_message (FILE *f, struct ipa_param_call_note *nt,
915 struct ipa_jump_func *jfunc,
916 struct cgraph_node *node)
917 {
918 fprintf (f, "ipa-prop: Discovered an indirect call to a known target (");
919 if (jfunc->type == IPA_JF_CONST_MEMBER_PTR)
920 {
921 print_node_brief (f, "", jfunc->value.member_cst.pfn, 0);
922 print_node_brief (f, ", ", jfunc->value.member_cst.delta, 0);
923 }
924 else
925 print_node_brief(f, "", jfunc->value.constant, 0);
926
927 fprintf (f, ") in %s: ", cgraph_node_name (node));
928 print_gimple_stmt (f, nt->stmt, 2, TDF_SLIM);
929 }
930
931 /* Update the param called notes associated with NODE when CS is being inlined,
932 assuming NODE is (potentially indirectly) inlined into CS->callee.
933 Moreover, if the callee is discovered to be constant, create a new cgraph
934 edge for it. Newly discovered indirect edges will be added to *NEW_EDGES,
935 unless NEW_EDGES is NULL. Return true iff a new edge(s) were created. */
936
937 static bool
938 update_call_notes_after_inlining (struct cgraph_edge *cs,
939 struct cgraph_node *node,
940 VEC (cgraph_edge_p, heap) **new_edges)
941 {
942 struct ipa_node_params *info = IPA_NODE_REF (node);
943 struct ipa_edge_args *top = IPA_EDGE_REF (cs);
944 struct ipa_param_call_note *nt;
945 bool res = false;
946
947 for (nt = info->param_calls; nt; nt = nt->next)
948 {
949 struct ipa_jump_func *jfunc;
950
951 if (nt->processed)
952 continue;
953
954 /* We must check range due to calls with variable number of arguments: */
955 if (nt->formal_id >= (unsigned) ipa_get_cs_argument_count (top))
956 {
957 nt->processed = true;
958 continue;
959 }
960
961 jfunc = ipa_get_ith_jump_func (top, nt->formal_id);
962 if (jfunc->type == IPA_JF_PASS_THROUGH)
963 nt->formal_id = jfunc->value.formal_id;
964 else if (jfunc->type == IPA_JF_CONST
965 || jfunc->type == IPA_JF_CONST_MEMBER_PTR)
966 {
967 struct cgraph_node *callee;
968 struct cgraph_edge *new_indirect_edge;
969 tree decl;
970
971 nt->processed = true;
972 if (jfunc->type == IPA_JF_CONST_MEMBER_PTR)
973 decl = jfunc->value.member_cst.pfn;
974 else
975 decl = jfunc->value.constant;
976
977 if (TREE_CODE (decl) != ADDR_EXPR)
978 continue;
979 decl = TREE_OPERAND (decl, 0);
980
981 if (TREE_CODE (decl) != FUNCTION_DECL)
982 continue;
983 callee = cgraph_node (decl);
984 if (!callee || !callee->local.inlinable)
985 continue;
986
987 res = true;
988 if (dump_file)
989 print_edge_addition_message (dump_file, nt, jfunc, node);
990
991 new_indirect_edge = cgraph_create_edge (node, callee, nt->stmt,
992 nt->count, nt->frequency,
993 nt->loop_nest);
994 new_indirect_edge->indirect_call = 1;
995 ipa_check_create_edge_args ();
996 if (new_edges)
997 VEC_safe_push (cgraph_edge_p, heap, *new_edges, new_indirect_edge);
998 top = IPA_EDGE_REF (cs);
999 }
1000 }
1001 return res;
1002 }
1003
1004 /* Recursively traverse subtree of NODE (including node) made of inlined
1005 cgraph_edges when CS has been inlined and invoke
1006 update_call_notes_after_inlining on all nodes and
1007 update_jump_functions_after_inlining on all non-inlined edges that lead out
1008 of this subtree. Newly discovered indirect edges will be added to
1009 *NEW_EDGES, unless NEW_EDGES is NULL. Return true iff a new edge(s) were
1010 created. */
1011
1012 static bool
1013 propagate_info_to_inlined_callees (struct cgraph_edge *cs,
1014 struct cgraph_node *node,
1015 VEC (cgraph_edge_p, heap) **new_edges)
1016 {
1017 struct cgraph_edge *e;
1018 bool res;
1019
1020 res = update_call_notes_after_inlining (cs, node, new_edges);
1021
1022 for (e = node->callees; e; e = e->next_callee)
1023 if (!e->inline_failed)
1024 res |= propagate_info_to_inlined_callees (cs, e->callee, new_edges);
1025 else
1026 update_jump_functions_after_inlining (cs, e);
1027
1028 return res;
1029 }
1030
1031 /* Update jump functions and call note functions on inlining the call site CS.
1032 CS is expected to lead to a node already cloned by
1033 cgraph_clone_inline_nodes. Newly discovered indirect edges will be added to
1034 *NEW_EDGES, unless NEW_EDGES is NULL. Return true iff a new edge(s) were +
1035 created. */
1036
1037 bool
1038 ipa_propagate_indirect_call_infos (struct cgraph_edge *cs,
1039 VEC (cgraph_edge_p, heap) **new_edges)
1040 {
1041 /* Do nothing if the preparation phase has not been carried out yet
1042 (i.e. during early inlining). */
1043 if (!ipa_node_params_vector)
1044 return false;
1045 gcc_assert (ipa_edge_args_vector);
1046
1047 return propagate_info_to_inlined_callees (cs, cs->callee, new_edges);
1048 }
1049
1050 /* Frees all dynamically allocated structures that the argument info points
1051 to. */
1052
1053 void
1054 ipa_free_edge_args_substructures (struct ipa_edge_args *args)
1055 {
1056 if (args->jump_functions)
1057 free (args->jump_functions);
1058
1059 memset (args, 0, sizeof (*args));
1060 }
1061
1062 /* Free all ipa_edge structures. */
1063
1064 void
1065 ipa_free_all_edge_args (void)
1066 {
1067 int i;
1068 struct ipa_edge_args *args;
1069
1070 for (i = 0;
1071 VEC_iterate (ipa_edge_args_t, ipa_edge_args_vector, i, args);
1072 i++)
1073 ipa_free_edge_args_substructures (args);
1074
1075 VEC_free (ipa_edge_args_t, heap, ipa_edge_args_vector);
1076 ipa_edge_args_vector = NULL;
1077 }
1078
1079 /* Frees all dynamically allocated structures that the param info points
1080 to. */
1081
1082 void
1083 ipa_free_node_params_substructures (struct ipa_node_params *info)
1084 {
1085 if (info->params)
1086 free (info->params);
1087
1088 while (info->param_calls)
1089 {
1090 struct ipa_param_call_note *note = info->param_calls;
1091 info->param_calls = note->next;
1092 free (note);
1093 }
1094
1095 memset (info, 0, sizeof (*info));
1096 }
1097
1098 /* Free all ipa_node_params structures. */
1099
1100 void
1101 ipa_free_all_node_params (void)
1102 {
1103 int i;
1104 struct ipa_node_params *info;
1105
1106 for (i = 0;
1107 VEC_iterate (ipa_node_params_t, ipa_node_params_vector, i, info);
1108 i++)
1109 ipa_free_node_params_substructures (info);
1110
1111 VEC_free (ipa_node_params_t, heap, ipa_node_params_vector);
1112 ipa_node_params_vector = NULL;
1113 }
1114
1115 /* Hook that is called by cgraph.c when an edge is removed. */
1116
1117 static void
1118 ipa_edge_removal_hook (struct cgraph_edge *cs, void *data ATTRIBUTE_UNUSED)
1119 {
1120 /* During IPA-CP updating we can be called on not-yet analyze clones. */
1121 if (VEC_length (ipa_edge_args_t, ipa_edge_args_vector)
1122 <= (unsigned)cs->uid)
1123 return;
1124 ipa_free_edge_args_substructures (IPA_EDGE_REF (cs));
1125 }
1126
1127 /* Hook that is called by cgraph.c when a node is removed. */
1128
1129 static void
1130 ipa_node_removal_hook (struct cgraph_node *node, void *data ATTRIBUTE_UNUSED)
1131 {
1132 ipa_free_node_params_substructures (IPA_NODE_REF (node));
1133 }
1134
1135 /* Helper function to duplicate an array of size N that is at SRC and store a
1136 pointer to it to DST. Nothing is done if SRC is NULL. */
1137
1138 static void *
1139 duplicate_array (void *src, size_t n)
1140 {
1141 void *p;
1142
1143 if (!src)
1144 return NULL;
1145
1146 p = xcalloc (1, n);
1147 memcpy (p, src, n);
1148 return p;
1149 }
1150
1151 /* Hook that is called by cgraph.c when a node is duplicated. */
1152
1153 static void
1154 ipa_edge_duplication_hook (struct cgraph_edge *src, struct cgraph_edge *dst,
1155 __attribute__((unused)) void *data)
1156 {
1157 struct ipa_edge_args *old_args, *new_args;
1158 int arg_count;
1159
1160 ipa_check_create_edge_args ();
1161
1162 old_args = IPA_EDGE_REF (src);
1163 new_args = IPA_EDGE_REF (dst);
1164
1165 arg_count = ipa_get_cs_argument_count (old_args);
1166 ipa_set_cs_argument_count (new_args, arg_count);
1167 new_args->jump_functions = (struct ipa_jump_func *)
1168 duplicate_array (old_args->jump_functions,
1169 sizeof (struct ipa_jump_func) * arg_count);
1170 }
1171
1172 /* Hook that is called by cgraph.c when a node is duplicated. */
1173
1174 static void
1175 ipa_node_duplication_hook (struct cgraph_node *src, struct cgraph_node *dst,
1176 __attribute__((unused)) void *data)
1177 {
1178 struct ipa_node_params *old_info, *new_info;
1179 struct ipa_param_call_note *note;
1180 int param_count;
1181
1182 ipa_check_create_node_params ();
1183 old_info = IPA_NODE_REF (src);
1184 new_info = IPA_NODE_REF (dst);
1185 param_count = ipa_get_param_count (old_info);
1186
1187 ipa_set_param_count (new_info, param_count);
1188 new_info->params = (struct ipa_param_descriptor *)
1189 duplicate_array (old_info->params,
1190 sizeof (struct ipa_param_descriptor) * param_count);
1191 new_info->ipcp_orig_node = old_info->ipcp_orig_node;
1192 new_info->count_scale = old_info->count_scale;
1193
1194 for (note = old_info->param_calls; note; note = note->next)
1195 {
1196 struct ipa_param_call_note *nn;
1197
1198 nn = (struct ipa_param_call_note *)
1199 xcalloc (1, sizeof (struct ipa_param_call_note));
1200 memcpy (nn, note, sizeof (struct ipa_param_call_note));
1201 nn->next = new_info->param_calls;
1202 new_info->param_calls = nn;
1203 }
1204 }
1205
1206 /* Register our cgraph hooks if they are not already there. */
1207
1208 void
1209 ipa_register_cgraph_hooks (void)
1210 {
1211 if (!edge_removal_hook_holder)
1212 edge_removal_hook_holder =
1213 cgraph_add_edge_removal_hook (&ipa_edge_removal_hook, NULL);
1214 if (!node_removal_hook_holder)
1215 node_removal_hook_holder =
1216 cgraph_add_node_removal_hook (&ipa_node_removal_hook, NULL);
1217 if (!edge_duplication_hook_holder)
1218 edge_duplication_hook_holder =
1219 cgraph_add_edge_duplication_hook (&ipa_edge_duplication_hook, NULL);
1220 if (!node_duplication_hook_holder)
1221 node_duplication_hook_holder =
1222 cgraph_add_node_duplication_hook (&ipa_node_duplication_hook, NULL);
1223 }
1224
1225 /* Unregister our cgraph hooks if they are not already there. */
1226
1227 static void
1228 ipa_unregister_cgraph_hooks (void)
1229 {
1230 cgraph_remove_edge_removal_hook (edge_removal_hook_holder);
1231 edge_removal_hook_holder = NULL;
1232 cgraph_remove_node_removal_hook (node_removal_hook_holder);
1233 node_removal_hook_holder = NULL;
1234 cgraph_remove_edge_duplication_hook (edge_duplication_hook_holder);
1235 edge_duplication_hook_holder = NULL;
1236 cgraph_remove_node_duplication_hook (node_duplication_hook_holder);
1237 node_duplication_hook_holder = NULL;
1238 }
1239
1240 /* Free all ipa_node_params and all ipa_edge_args structures if they are no
1241 longer needed after ipa-cp. */
1242
1243 void
1244 free_all_ipa_structures_after_ipa_cp (void)
1245 {
1246 if (!flag_indirect_inlining)
1247 {
1248 ipa_free_all_edge_args ();
1249 ipa_free_all_node_params ();
1250 ipa_unregister_cgraph_hooks ();
1251 }
1252 }
1253
1254 /* Free all ipa_node_params and all ipa_edge_args structures if they are no
1255 longer needed after indirect inlining. */
1256
1257 void
1258 free_all_ipa_structures_after_iinln (void)
1259 {
1260 ipa_free_all_edge_args ();
1261 ipa_free_all_node_params ();
1262 ipa_unregister_cgraph_hooks ();
1263 }
1264
1265 /* Print ipa_tree_map data structures of all functions in the
1266 callgraph to F. */
1267
1268 void
1269 ipa_print_node_params (FILE * f, struct cgraph_node *node)
1270 {
1271 int i, count;
1272 tree temp;
1273 struct ipa_node_params *info;
1274
1275 if (!node->analyzed)
1276 return;
1277 info = IPA_NODE_REF (node);
1278 fprintf (f, " function %s Trees :: \n", cgraph_node_name (node));
1279 count = ipa_get_param_count (info);
1280 for (i = 0; i < count; i++)
1281 {
1282 temp = ipa_get_param (info, i);
1283 if (TREE_CODE (temp) == PARM_DECL)
1284 fprintf (f, " param %d : %s", i,
1285 (*lang_hooks.decl_printable_name) (temp, 2));
1286 if (ipa_is_param_modified (info, i))
1287 fprintf (f, " modified");
1288 if (ipa_is_param_called (info, i))
1289 fprintf (f, " called");
1290 fprintf (f, "\n");
1291 }
1292 }
1293
1294 /* Print ipa_tree_map data structures of all functions in the
1295 callgraph to F. */
1296
1297 void
1298 ipa_print_all_params (FILE * f)
1299 {
1300 struct cgraph_node *node;
1301
1302 fprintf (f, "\nFunction parameters:\n");
1303 for (node = cgraph_nodes; node; node = node->next)
1304 ipa_print_node_params (f, node);
1305 }