GCC Middle and Back End API Reference
ipa-prop.h
Go to the documentation of this file.
1 /* Interprocedural analyses.
2  Copyright (C) 2005-2013 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 #ifndef IPA_PROP_H
21 #define IPA_PROP_H
22 
23 #include "tree.h"
24 #include "vec.h"
25 #include "cgraph.h"
26 #include "gimple.h"
27 #include "alloc-pool.h"
28 
29 /* The following definitions and interfaces are used by
30  interprocedural analyses or parameters. */
31 
32 #define IPA_UNDESCRIBED_USE -1
33 
34 /* ipa-prop.c stuff (ipa-cp, indirect inlining): */
35 
36 /* A jump function for a callsite represents the values passed as actual
37  arguments of the callsite. They were originally proposed in a paper called
38  "Interprocedural Constant Propagation", by David Callahan, Keith D Cooper,
39  Ken Kennedy, Linda Torczon in Comp86, pg 152-161. There are three main
40  types of values :
41 
42  Pass-through - the caller's formal parameter is passed as an actual
43  argument, possibly one simple operation performed on it.
44  Constant - a constant (is_gimple_ip_invariant)is passed as an actual
45  argument.
46  Unknown - neither of the above.
47 
48  IPA_JF_ANCESTOR is a special pass-through jump function, which means that
49  the result is an address of a part of the object pointed to by the formal
50  parameter to which the function refers. It is mainly intended to represent
51  getting addresses of of ancestor fields in C++
52  (e.g. &this_1(D)->D.1766.D.1756). Note that if the original pointer is
53  NULL, ancestor jump function must behave like a simple pass-through.
54 
55  Other pass-through functions can either simply pass on an unchanged formal
56  parameter or can apply one simple binary operation to it (such jump
57  functions are called polynomial).
58 
59  IPA_JF_KNOWN_TYPE is a special type of an "unknown" function that applies
60  only to pointer parameters. It means that even though we cannot prove that
61  the passed value is an interprocedural constant, we still know the exact
62  type of the containing object which may be valuable for devirtualization.
63 
64  Jump functions are computed in ipa-prop.c by function
65  update_call_notes_after_inlining. Some information can be lost and jump
66  functions degraded accordingly when inlining, see
67  update_call_notes_after_inlining in the same file. */
68 
70 {
71  IPA_JF_UNKNOWN = 0, /* newly allocated and zeroed jump functions default */
72  IPA_JF_KNOWN_TYPE, /* represented by field known_type */
73  IPA_JF_CONST, /* represented by field costant */
74  IPA_JF_PASS_THROUGH, /* represented by field pass_through */
75  IPA_JF_ANCESTOR /* represented by field ancestor */
76 };
77 
78 /* Structure holding data required to describe a known type jump function. */
80 {
81  /* Offset of the component of the base_type being described. */
83  /* Type of the whole object. */
85  /* Type of the component of the object that is being described. */
87 };
88 
89 struct ipa_cst_ref_desc;
90 
91 /* Structure holding data required to describe a constant jump function. */
93 {
94  /* THe value of the constant. */
96  /* Pointer to the structure that describes the reference. */
97  struct ipa_cst_ref_desc GTY((skip)) *rdesc;
98 };
99 
100 /* Structure holding data required to describe a pass-through jump function. */
101 
103 {
104  /* If an operation is to be performed on the original parameter, this is the
105  second (constant) operand. */
107  /* Number of the caller's formal parameter being passed. */
109  /* Operation that is performed on the argument before it is passed on.
110  NOP_EXPR means no operation. Otherwise oper must be a simple binary
111  arithmetic operation where the caller's parameter is the first operand and
112  operand field from this structure is the second one. */
114  /* When the passed value is a pointer, it is set to true only when we are
115  certain that no write to the object it points to has occurred since the
116  caller functions started execution, except for changes noted in the
117  aggregate part of the jump function (see description of
118  ipa_agg_jump_function). The flag is used only when the operation is
119  NOP_EXPR. */
121 };
122 
123 /* Structure holding data required to describe an ancestor pass-through
124  jump function. */
125 
127 {
128  /* Offset of the field representing the ancestor. */
130  /* Type of the result. */
132  /* Number of the caller's formal parameter being passed. */
134  /* Flag with the same meaning like agg_preserve in ipa_pass_through_data. */
136 };
137 
138 /* An element in an aggegate part of a jump function describing a known value
139  at a given offset. When it is part of a pass-through jump function with
140  agg_preserved set or an ancestor jump function with agg_preserved set, all
141  unlisted positions are assumed to be preserved but the value can be a type
142  node, which means that the particular piece (starting at offset and having
143  the size of the type) is clobbered with an unknown value. When
144  agg_preserved is false or the type of the containing jump function is
145  different, all unlisted parts are assumed to be unknown and all values must
146  fulfill is_gimple_ip_invariant. */
147 
148 typedef struct GTY(()) ipa_agg_jf_item
149 {
150  /* The offset at which the known value is located within the aggregate. */
152 
153  /* The known constant or type if this is a clobber. */
156 
157 
158 /* Aggregate jump function - i.e. description of contents of aggregates passed
159  either by reference or value. */
160 
162 {
163  /* Description of the individual items. */
165  /* True if the data was passed by reference (as opposed to by value). */
166  bool by_ref;
167 };
168 
171 
172 /* A jump function for a callsite represents the values passed as actual
173  arguments of the callsite. See enum jump_func_type for the various
174  types of jump functions supported. */
175 typedef struct GTY (()) ipa_jump_func
176 {
177  /* Aggregate contants description. See struct ipa_agg_jump_function and its
178  description. */
180 
182  /* Represents a value of a jump function. pass_through is used only in jump
183  function context. constant represents the actual constant in constant jump
184  functions and member_cst holds constant c++ member functions. */
186  {
187  struct ipa_known_type_data GTY ((tag ("IPA_JF_KNOWN_TYPE"))) known_type;
188  struct ipa_constant_data GTY ((tag ("IPA_JF_CONST"))) constant;
189  struct ipa_pass_through_data GTY ((tag ("IPA_JF_PASS_THROUGH"))) pass_through;
190  struct ipa_ancestor_jf_data GTY ((tag ("IPA_JF_ANCESTOR"))) ancestor;
191  } GTY ((desc ("%1.type"))) value;
193 
194 
195 /* Return the offset of the component that is described by a known type jump
196  function JFUNC. */
197 
198 static inline HOST_WIDE_INT
200 {
201  gcc_checking_assert (jfunc->type == IPA_JF_KNOWN_TYPE);
202  return jfunc->value.known_type.offset;
203 }
204 
205 /* Return the base type of a known type jump function JFUNC. */
206 
207 static inline tree
209 {
210  gcc_checking_assert (jfunc->type == IPA_JF_KNOWN_TYPE);
211  return jfunc->value.known_type.base_type;
212 }
213 
214 /* Return the component type of a known type jump function JFUNC. */
215 
216 static inline tree
218 {
219  gcc_checking_assert (jfunc->type == IPA_JF_KNOWN_TYPE);
220  return jfunc->value.known_type.component_type;
221 }
222 
223 /* Return the constant stored in a constant jump functin JFUNC. */
224 
225 static inline tree
227 {
228  gcc_checking_assert (jfunc->type == IPA_JF_CONST);
229  return jfunc->value.constant.value;
230 }
231 
232 static inline struct ipa_cst_ref_desc *
234 {
235  gcc_checking_assert (jfunc->type == IPA_JF_CONST);
236  return jfunc->value.constant.rdesc;
237 }
238 
239 /* Return the operand of a pass through jmp function JFUNC. */
240 
241 static inline tree
243 {
244  gcc_checking_assert (jfunc->type == IPA_JF_PASS_THROUGH);
245  return jfunc->value.pass_through.operand;
246 }
247 
248 /* Return the number of the caller's formal parameter that a pass through jump
249  function JFUNC refers to. */
250 
251 static inline int
253 {
254  gcc_checking_assert (jfunc->type == IPA_JF_PASS_THROUGH);
255  return jfunc->value.pass_through.formal_id;
256 }
257 
258 /* Return operation of a pass through jump function JFUNC. */
259 
260 static inline enum tree_code
262 {
263  gcc_checking_assert (jfunc->type == IPA_JF_PASS_THROUGH);
264  return jfunc->value.pass_through.operation;
265 }
266 
267 /* Return the agg_preserved flag of a pass through jump functin JFUNC. */
268 
269 static inline bool
271 {
272  gcc_checking_assert (jfunc->type == IPA_JF_PASS_THROUGH);
273  return jfunc->value.pass_through.agg_preserved;
274 }
275 
276 /* Return the offset of an ancestor jump function JFUNC. */
277 
278 static inline HOST_WIDE_INT
280 {
281  gcc_checking_assert (jfunc->type == IPA_JF_ANCESTOR);
282  return jfunc->value.ancestor.offset;
283 }
284 
285 /* Return the result type of an ancestor jump function JFUNC. */
286 
287 static inline tree
289 {
290  gcc_checking_assert (jfunc->type == IPA_JF_ANCESTOR);
291  return jfunc->value.ancestor.type;
292 }
293 
294 /* Return the number of the caller's formal parameter that an ancestor jump
295  function JFUNC refers to. */
296 
297 static inline int
299 {
300  gcc_checking_assert (jfunc->type == IPA_JF_ANCESTOR);
301  return jfunc->value.ancestor.formal_id;
302 }
303 
304 /* Return the agg_preserved flag of an ancestor jump functin JFUNC. */
305 
306 static inline bool
308 {
309  gcc_checking_assert (jfunc->type == IPA_JF_ANCESTOR);
310  return jfunc->value.ancestor.agg_preserved;
311 }
312 
313 /* Summary describing a single formal parameter. */
314 
316 {
317  /* PARAM_DECL of this parameter. */
319  /* If all uses of the parameter are described by ipa-prop structures, this
320  says how many there are. If any use could not be described by means of
321  ipa-prop structures, this is IPA_UNDESCRIBED_USE. */
323  unsigned int move_cost : 31;
324  /* The parameter is used. */
325  unsigned used : 1;
326 };
327 
329 struct ipcp_lattice;
330 
331 /* ipa_node_params stores information related to formal parameters of functions
332  and some other information for interprocedural passes that operate on
333  parameters (such as ipa-cp). */
334 
336 {
337  /* Information about individual formal parameters that are gathered when
338  summaries are generated. */
340  /* Pointer to an array of structures describing individual formal
341  parameters. */
343  /* Only for versioned nodes this field would not be NULL,
344  it points to the node that IPA cp cloned from. */
346  /* If this node is an ipa-cp clone, these are the known values that describe
347  what it has been specialized for. */
349  /* Whether the param uses analysis has already been performed. */
350  unsigned uses_analysis_done : 1;
351  /* Whether the function is enqueued in ipa-cp propagation stack. */
352  unsigned node_enqueued : 1;
353  /* Whether we should create a specialized version based on values that are
354  known to be constant in all contexts. */
355  unsigned do_clone_for_all_contexts : 1;
356  /* Set if this is an IPA-CP clone for all contexts. */
357  unsigned is_all_contexts_clone : 1;
358  /* Node has been completely replaced by clones and will be removed after
359  ipa-cp is finished. */
360  unsigned node_dead : 1;
361 };
362 
363 /* ipa_node_params access functions. Please use these to access fields that
364  are or will be shared among various passes. */
365 
366 /* Return the number of formal parameters. */
367 
368 static inline int
370 {
371  return info->descriptors.length ();
372 }
373 
374 /* Return the declaration of Ith formal parameter of the function corresponding
375  to INFO. Note there is no setter function as this array is built just once
376  using ipa_initialize_node_params. */
377 
378 static inline tree
379 ipa_get_param (struct ipa_node_params *info, int i)
380 {
381  gcc_checking_assert (!flag_wpa);
382  return info->descriptors[i].decl;
383 }
384 
385 /* Return the move cost of Ith formal parameter of the function corresponding
386  to INFO. */
387 
388 static inline int
390 {
391  return info->descriptors[i].move_cost;
392 }
393 
394 /* Set the used flag corresponding to the Ith formal parameter of the function
395  associated with INFO to VAL. */
396 
397 static inline void
398 ipa_set_param_used (struct ipa_node_params *info, int i, bool val)
399 {
400  info->descriptors[i].used = val;
401 }
402 
403 /* Return how many uses described by ipa-prop a parameter has or
404  IPA_UNDESCRIBED_USE if there is a use that is not described by these
405  structures. */
406 static inline int
408 {
409  return info->descriptors[i].controlled_uses;
410 }
411 
412 /* Set the controlled counter of a given parameter. */
413 
414 static inline void
415 ipa_set_controlled_uses (struct ipa_node_params *info, int i, int val)
416 {
417  info->descriptors[i].controlled_uses = val;
418 }
419 
420 /* Return the used flag corresponding to the Ith formal parameter of the
421  function associated with INFO. */
422 
423 static inline bool
424 ipa_is_param_used (struct ipa_node_params *info, int i)
425 {
426  return info->descriptors[i].used;
427 }
428 
429 /* Information about replacements done in aggregates for a given node (each
430  node has its linked list). */
432 {
433  /* Next item in the linked list. */
435  /* Offset within the aggregate. */
437  /* The constant value. */
439  /* The paramter index. */
440  int index;
441  /* Whether the value was passed by reference. */
442  bool by_ref;
443 };
444 
446 
447 void ipa_set_node_agg_value_chain (struct cgraph_node *node,
448  struct ipa_agg_replacement_value *aggvals);
449 
450 /* ipa_edge_args stores information related to a callsite and particularly its
451  arguments. It can be accessed by the IPA_EDGE_REF macro. */
452 typedef struct GTY(()) ipa_edge_args
453 {
454  /* Vector of the callsite's jump function of each parameter. */
457 
458 /* ipa_edge_args access functions. Please use these to access fields that
459  are or will be shared among various passes. */
460 
461 /* Return the number of actual arguments. */
462 
463 static inline int
465 {
466  return vec_safe_length (args->jump_functions);
467 }
468 
469 /* Returns a pointer to the jump function for the ith argument. Please note
470  there is no setter function as jump functions are all set up in
471  ipa_compute_jump_functions. */
472 
473 static inline struct ipa_jump_func *
475 {
476  return &(*args->jump_functions)[i];
477 }
478 
479 /* Vectors need to have typedefs of structures. */
481 
482 /* Types of vectors holding the infos. */
483 
484 /* Vector where the parameter infos are actually stored. */
486 /* Vector of known aggregate values in cloned nodes. */
488 /* Vector where the parameter infos are actually stored. */
490 
491 /* Return the associated parameter/argument info corresponding to the given
492  node/edge. */
493 #define IPA_NODE_REF(NODE) (&ipa_node_params_vector[(NODE)->uid])
494 #define IPA_EDGE_REF(EDGE) (&(*ipa_edge_args_vector)[(EDGE)->uid])
495 /* This macro checks validity of index returned by
496  ipa_get_param_decl_index function. */
497 #define IS_VALID_JUMP_FUNC_INDEX(I) ((I) != -1)
498 
499 /* Creating and freeing ipa_node_params and ipa_edge_args. */
500 void ipa_create_all_node_params (void);
501 void ipa_create_all_edge_args (void);
504 void ipa_free_all_node_params (void);
505 void ipa_free_all_edge_args (void);
508 void ipa_register_cgraph_hooks (void);
509 
510 /* This function ensures the array of node param infos is big enough to
511  accommodate a structure for all nodes and reallocates it if not. */
512 
513 static inline void
515 {
516  if (!ipa_node_params_vector.exists ())
518 
519  if (ipa_node_params_vector.length () <= (unsigned) cgraph_max_uid)
520  ipa_node_params_vector.safe_grow_cleared (cgraph_max_uid + 1);
521 }
522 
523 /* This function ensures the array of edge arguments infos is big enough to
524  accommodate a structure for all edges and reallocates it if not. */
525 
526 static inline void
528 {
529  if (vec_safe_length (ipa_edge_args_vector) <= (unsigned) cgraph_edge_max_uid)
530  vec_safe_grow_cleared (ipa_edge_args_vector, cgraph_edge_max_uid + 1);
531 }
532 
533 /* Returns true if the array of edge infos is large enough to accommodate an
534  info for EDGE. The main purpose of this function is that debug dumping
535  function can check info availability without causing reallocations. */
536 
537 static inline bool
539 {
540  return ((unsigned) edge->uid < vec_safe_length (ipa_edge_args_vector));
541 }
542 
543 /* Return the aggregate replacements for NODE, if there are any. */
544 
545 static inline struct ipa_agg_replacement_value *
547 {
548  if ((unsigned) node->uid >= vec_safe_length (ipa_node_agg_replacements))
549  return NULL;
550  return (*ipa_node_agg_replacements)[node->uid];
551 }
552 
553 /* Function formal parameters related computations. */
554 void ipa_initialize_node_params (struct cgraph_node *node);
556  vec<cgraph_edge_p> *new_edges);
557 
558 /* Indirect edge and binfo processing. */
560  vec<tree> ,
561  vec<tree> ,
566 
567 /* Functions related to both. */
568 void ipa_analyze_node (struct cgraph_node *);
569 
570 /* Aggregate jump function related functions. */
572  bool);
573 bool ipa_load_from_parm_agg (struct ipa_node_params *, gimple, tree, int *,
574  HOST_WIDE_INT *, bool *);
575 
576 /* Debugging interface. */
577 void ipa_print_node_params (FILE *, struct cgraph_node *node);
578 void ipa_print_all_params (FILE *);
579 void ipa_print_node_jump_functions (FILE *f, struct cgraph_node *node);
580 void ipa_print_all_jump_functions (FILE * f);
582 
586 
587 /* Structure to describe transformations of formal parameters and actual
588  arguments. Each instance describes one new parameter and they are meant to
589  be stored in a vector. Additionally, most users will probably want to store
590  adjustments about parameters that are being removed altogether so that SSA
591  names belonging to them can be replaced by SSA names of an artificial
592  variable. */
594 {
595  /* The original PARM_DECL itself, helpful for processing of the body of the
596  function itself. Intended for traversing function bodies.
597  ipa_modify_formal_parameters, ipa_modify_call_arguments and
598  ipa_combine_adjustments ignore this and use base_index.
599  ipa_modify_formal_parameters actually sets this. */
601 
602  /* Type of the new parameter. However, if by_ref is true, the real type will
603  be a pointer to this type. */
605 
606  /* Alias refrerence type to be used in MEM_REFs when adjusting caller
607  arguments. */
609 
610  /* The new declaration when creating/replacing a parameter. Created by
611  ipa_modify_formal_parameters, useful for functions modifying the body
612  accordingly. */
614 
615  /* New declaration of a substitute variable that we may use to replace all
616  non-default-def ssa names when a parm decl is going away. */
618 
619  /* If non-NULL and the original parameter is to be removed (copy_param below
620  is NULL), this is going to be its nonlocalized vars value. */
622 
623  /* Offset into the original parameter (for the cases when the new parameter
624  is a component of an original one). */
626 
627  /* Zero based index of the original parameter this one is based on. (ATM
628  there is no way to insert a new parameter out of the blue because there is
629  no need but if it arises the code can be easily exteded to do so.) */
631 
632  /* This new parameter is an unmodified parameter at index base_index. */
633  unsigned copy_param : 1;
634 
635  /* This adjustment describes a parameter that is about to be removed
636  completely. Most users will probably need to book keep those so that they
637  don't leave behinfd any non default def ssa names belonging to them. */
638  unsigned remove_param : 1;
639 
640  /* The parameter is to be passed by reference. */
641  unsigned by_ref : 1;
642 };
643 
645 
647 
650  const char *);
656 void ipa_dump_agg_replacement_values (FILE *f,
657  struct ipa_agg_replacement_value *av);
659 void ipa_prop_read_jump_functions (void);
662 void ipa_update_after_lto_read (void);
665  struct ipa_jump_func *jfunc);
666 unsigned int ipcp_transform_function (struct cgraph_node *node);
667 void ipa_dump_param (FILE *, struct ipa_node_params *info, int i);
668 
669 
670 /* From tree-sra.c: */
672  gimple_stmt_iterator *, bool);
673 
674 #endif /* IPA_PROP_H */