OSDN Git Service

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