OSDN Git Service

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