1 /* Data flow functions for trees.
2 Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
3 Contributed by Diego Novillo <dnovillo@redhat.com>
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
24 #include "coretypes.h"
27 #include "pointer-set.h"
31 #include "hard-reg-set.h"
32 #include "basic-block.h"
38 #include "langhooks.h"
41 #include "diagnostic.h"
42 #include "tree-dump.h"
43 #include "tree-gimple.h"
44 #include "tree-flow.h"
45 #include "tree-inline.h"
46 #include "tree-pass.h"
51 /* Build and maintain data flow information for trees. */
53 /* Counters used to display DFA and SSA statistics. */
69 /* State information for find_vars_r. */
72 /* Hash table used to avoid adding the same variable more than once. */
77 /* Local functions. */
78 static void collect_dfa_stats (struct dfa_stats_d
*);
79 static tree
collect_dfa_stats_r (tree
*, int *, void *);
80 static tree
find_vars_r (tree
*, int *, void *);
81 static void add_referenced_var (tree
, struct walk_state
*);
84 /* Global declarations. */
86 /* Array of all variables referenced in the function. */
87 varray_type referenced_vars
;
90 /*---------------------------------------------------------------------------
91 Dataflow analysis (DFA) routines
92 ---------------------------------------------------------------------------*/
93 /* Find all the variables referenced in the function. This function
94 builds the global arrays REFERENCED_VARS and CALL_CLOBBERED_VARS.
96 Note that this function does not look for statement operands, it simply
97 determines what variables are referenced in the program and detects
98 various attributes for each variable used by alias analysis and the
102 find_referenced_vars (void)
106 block_stmt_iterator si
;
107 struct walk_state walk_state
;
109 vars_found
= htab_create (50, htab_hash_pointer
, htab_eq_pointer
, NULL
);
110 memset (&walk_state
, 0, sizeof (walk_state
));
111 walk_state
.vars_found
= vars_found
;
114 for (si
= bsi_start (bb
); !bsi_end_p (si
); bsi_next (&si
))
116 tree
*stmt_p
= bsi_stmt_ptr (si
);
117 walk_tree (stmt_p
, find_vars_r
, &walk_state
, NULL
);
120 htab_delete (vars_found
);
123 struct tree_opt_pass pass_referenced_vars
=
127 find_referenced_vars
, /* execute */
130 0, /* static_pass_number */
131 TV_FIND_REFERENCED_VARS
, /* tv_id */
132 PROP_gimple_leh
| PROP_cfg
, /* properties_required */
133 PROP_referenced_vars
, /* properties_provided */
134 0, /* properties_destroyed */
135 0, /* todo_flags_start */
136 0, /* todo_flags_finish */
141 /*---------------------------------------------------------------------------
143 ---------------------------------------------------------------------------*/
144 /* Create a new annotation for a _DECL node T. */
147 create_var_ann (tree t
)
152 gcc_assert (DECL_P (t
));
153 gcc_assert (!t
->common
.ann
|| t
->common
.ann
->common
.type
== VAR_ANN
);
155 ann
= ggc_alloc (sizeof (*ann
));
156 memset ((void *) ann
, 0, sizeof (*ann
));
158 ann
->common
.type
= VAR_ANN
;
160 t
->common
.ann
= (tree_ann_t
) ann
;
166 /* Create a new annotation for a statement node T. */
169 create_stmt_ann (tree t
)
173 gcc_assert (is_gimple_stmt (t
));
174 gcc_assert (!t
->common
.ann
|| t
->common
.ann
->common
.type
== STMT_ANN
);
176 ann
= ggc_alloc (sizeof (*ann
));
177 memset ((void *) ann
, 0, sizeof (*ann
));
179 ann
->common
.type
= STMT_ANN
;
181 /* Since we just created the annotation, mark the statement modified. */
182 ann
->modified
= true;
184 t
->common
.ann
= (tree_ann_t
) ann
;
190 /* Create a new annotation for a tree T. */
193 create_tree_ann (tree t
)
198 gcc_assert (!t
->common
.ann
|| t
->common
.ann
->common
.type
== TREE_ANN_COMMON
);
200 ann
= ggc_alloc (sizeof (*ann
));
201 memset ((void *) ann
, 0, sizeof (*ann
));
203 ann
->common
.type
= TREE_ANN_COMMON
;
209 /* Build a temporary. Make sure and register it to be renamed. */
212 make_rename_temp (tree type
, const char *prefix
)
214 tree t
= create_tmp_var (type
, prefix
);
217 add_referenced_tmp_var (t
);
218 mark_sym_for_renaming (t
);
226 /*---------------------------------------------------------------------------
228 ---------------------------------------------------------------------------*/
229 /* Dump the list of all the referenced variables in the current function to
233 dump_referenced_vars (FILE *file
)
237 fprintf (file
, "\nReferenced variables in %s: %u\n\n",
238 get_name (current_function_decl
), (unsigned) num_referenced_vars
);
240 for (i
= 0; i
< num_referenced_vars
; i
++)
242 tree var
= referenced_var (i
);
243 fprintf (file
, "Variable: ");
244 dump_variable (file
, var
);
245 fprintf (file
, "\n");
250 /* Dump the list of all the referenced variables to stderr. */
253 debug_referenced_vars (void)
255 dump_referenced_vars (stderr
);
259 /* Dump variable VAR and its may-aliases to FILE. */
262 dump_variable (FILE *file
, tree var
)
266 if (TREE_CODE (var
) == SSA_NAME
)
268 if (POINTER_TYPE_P (TREE_TYPE (var
)))
269 dump_points_to_info_for (file
, var
);
270 var
= SSA_NAME_VAR (var
);
273 if (var
== NULL_TREE
)
275 fprintf (file
, "<nil>");
279 print_generic_expr (file
, var
, dump_flags
);
283 fprintf (file
, ", UID %u", (unsigned) ann
->uid
);
285 fprintf (file
, ", ");
286 print_generic_expr (file
, TREE_TYPE (var
), dump_flags
);
288 if (ann
->type_mem_tag
)
290 fprintf (file
, ", type memory tag: ");
291 print_generic_expr (file
, ann
->type_mem_tag
, dump_flags
);
294 if (ann
->is_alias_tag
)
295 fprintf (file
, ", is an alias tag");
297 if (TREE_ADDRESSABLE (var
))
298 fprintf (file
, ", is addressable");
300 if (is_global_var (var
))
301 fprintf (file
, ", is global");
303 if (TREE_THIS_VOLATILE (var
))
304 fprintf (file
, ", is volatile");
306 if (is_call_clobbered (var
))
307 fprintf (file
, ", call clobbered");
309 if (ann
->default_def
)
311 fprintf (file
, ", default def: ");
312 print_generic_expr (file
, ann
->default_def
, dump_flags
);
315 if (ann
->may_aliases
)
317 fprintf (file
, ", may aliases: ");
318 dump_may_aliases_for (file
, var
);
321 fprintf (file
, "\n");
325 /* Dump variable VAR and its may-aliases to stderr. */
328 debug_variable (tree var
)
330 dump_variable (stderr
, var
);
334 /* Dump various DFA statistics to FILE. */
337 dump_dfa_stats (FILE *file
)
339 struct dfa_stats_d dfa_stats
;
341 unsigned long size
, total
= 0;
342 const char * const fmt_str
= "%-30s%-13s%12s\n";
343 const char * const fmt_str_1
= "%-30s%13lu%11lu%c\n";
344 const char * const fmt_str_3
= "%-43s%11lu%c\n";
346 = lang_hooks
.decl_printable_name (current_function_decl
, 2);
348 collect_dfa_stats (&dfa_stats
);
350 fprintf (file
, "\nDFA Statistics for %s\n\n", funcname
);
352 fprintf (file
, "---------------------------------------------------------\n");
353 fprintf (file
, fmt_str
, "", " Number of ", "Memory");
354 fprintf (file
, fmt_str
, "", " instances ", "used ");
355 fprintf (file
, "---------------------------------------------------------\n");
357 size
= num_referenced_vars
* sizeof (tree
);
359 fprintf (file
, fmt_str_1
, "Referenced variables", (unsigned long)num_referenced_vars
,
360 SCALE (size
), LABEL (size
));
362 size
= dfa_stats
.num_stmt_anns
* sizeof (struct stmt_ann_d
);
364 fprintf (file
, fmt_str_1
, "Statements annotated", dfa_stats
.num_stmt_anns
,
365 SCALE (size
), LABEL (size
));
367 size
= dfa_stats
.num_var_anns
* sizeof (struct var_ann_d
);
369 fprintf (file
, fmt_str_1
, "Variables annotated", dfa_stats
.num_var_anns
,
370 SCALE (size
), LABEL (size
));
372 size
= dfa_stats
.num_uses
* sizeof (tree
*);
374 fprintf (file
, fmt_str_1
, "USE operands", dfa_stats
.num_uses
,
375 SCALE (size
), LABEL (size
));
377 size
= dfa_stats
.num_defs
* sizeof (tree
*);
379 fprintf (file
, fmt_str_1
, "DEF operands", dfa_stats
.num_defs
,
380 SCALE (size
), LABEL (size
));
382 size
= dfa_stats
.num_vuses
* sizeof (tree
*);
384 fprintf (file
, fmt_str_1
, "VUSE operands", dfa_stats
.num_vuses
,
385 SCALE (size
), LABEL (size
));
387 size
= dfa_stats
.num_v_may_defs
* sizeof (tree
*);
389 fprintf (file
, fmt_str_1
, "V_MAY_DEF operands", dfa_stats
.num_v_may_defs
,
390 SCALE (size
), LABEL (size
));
392 size
= dfa_stats
.num_v_must_defs
* sizeof (tree
*);
394 fprintf (file
, fmt_str_1
, "V_MUST_DEF operands", dfa_stats
.num_v_must_defs
,
395 SCALE (size
), LABEL (size
));
397 size
= dfa_stats
.num_phis
* sizeof (struct tree_phi_node
);
399 fprintf (file
, fmt_str_1
, "PHI nodes", dfa_stats
.num_phis
,
400 SCALE (size
), LABEL (size
));
402 size
= dfa_stats
.num_phi_args
* sizeof (struct phi_arg_d
);
404 fprintf (file
, fmt_str_1
, "PHI arguments", dfa_stats
.num_phi_args
,
405 SCALE (size
), LABEL (size
));
407 fprintf (file
, "---------------------------------------------------------\n");
408 fprintf (file
, fmt_str_3
, "Total memory used by DFA/SSA data", SCALE (total
),
410 fprintf (file
, "---------------------------------------------------------\n");
411 fprintf (file
, "\n");
413 if (dfa_stats
.num_phis
)
414 fprintf (file
, "Average number of arguments per PHI node: %.1f (max: %d)\n",
415 (float) dfa_stats
.num_phi_args
/ (float) dfa_stats
.num_phis
,
416 dfa_stats
.max_num_phi_args
);
418 fprintf (file
, "\n");
422 /* Dump DFA statistics on stderr. */
425 debug_dfa_stats (void)
427 dump_dfa_stats (stderr
);
431 /* Collect DFA statistics and store them in the structure pointed by
435 collect_dfa_stats (struct dfa_stats_d
*dfa_stats_p
)
437 struct pointer_set_t
*pset
;
439 block_stmt_iterator i
;
441 gcc_assert (dfa_stats_p
);
443 memset ((void *)dfa_stats_p
, 0, sizeof (struct dfa_stats_d
));
445 /* Walk all the trees in the function counting references. Start at
446 basic block 0, but don't stop at block boundaries. */
447 pset
= pointer_set_create ();
449 for (i
= bsi_start (BASIC_BLOCK (0)); !bsi_end_p (i
); bsi_next (&i
))
450 walk_tree (bsi_stmt_ptr (i
), collect_dfa_stats_r
, (void *) dfa_stats_p
,
453 pointer_set_destroy (pset
);
458 for (phi
= phi_nodes (bb
); phi
; phi
= PHI_CHAIN (phi
))
460 dfa_stats_p
->num_phis
++;
461 dfa_stats_p
->num_phi_args
+= PHI_NUM_ARGS (phi
);
462 if (PHI_NUM_ARGS (phi
) > dfa_stats_p
->max_num_phi_args
)
463 dfa_stats_p
->max_num_phi_args
= PHI_NUM_ARGS (phi
);
469 /* Callback for walk_tree to collect DFA statistics for a tree and its
473 collect_dfa_stats_r (tree
*tp
, int *walk_subtrees ATTRIBUTE_UNUSED
,
477 struct dfa_stats_d
*dfa_stats_p
= (struct dfa_stats_d
*)data
;
481 switch (ann_type (t
->common
.ann
))
485 stmt_ann_t ann
= (stmt_ann_t
) t
->common
.ann
;
486 dfa_stats_p
->num_stmt_anns
++;
487 dfa_stats_p
->num_defs
+= NUM_DEFS (DEF_OPS (ann
));
488 dfa_stats_p
->num_uses
+= NUM_USES (USE_OPS (ann
));
489 dfa_stats_p
->num_v_may_defs
+=
490 NUM_V_MAY_DEFS (V_MAY_DEF_OPS (ann
));
491 dfa_stats_p
->num_vuses
+= NUM_VUSES (VUSE_OPS (ann
));
492 dfa_stats_p
->num_v_must_defs
+=
493 NUM_V_MUST_DEFS (V_MUST_DEF_OPS (ann
));
498 dfa_stats_p
->num_var_anns
++;
510 /*---------------------------------------------------------------------------
511 Miscellaneous helpers
512 ---------------------------------------------------------------------------*/
513 /* Callback for walk_tree. Used to collect variables referenced in
517 find_vars_r (tree
*tp
, int *walk_subtrees
, void *data
)
519 struct walk_state
*walk_state
= (struct walk_state
*) data
;
521 /* If T is a regular variable that the optimizers are interested
522 in, add it to the list of variables. */
524 add_referenced_var (*tp
, walk_state
);
526 /* Type, _DECL and constant nodes have no interesting children.
528 else if (IS_TYPE_OR_DECL_P (*tp
) || CONSTANT_CLASS_P (*tp
))
535 /* Add VAR to the list of dereferenced variables.
537 WALK_STATE contains a hash table used to avoid adding the same
538 variable more than once. Note that this function assumes that
539 VAR is a valid SSA variable. If WALK_STATE is NULL, no
540 duplicate checking is done. */
543 add_referenced_var (tree var
, struct walk_state
*walk_state
)
548 v_ann
= get_var_ann (var
);
551 slot
= htab_find_slot (walk_state
->vars_found
, (void *) var
, INSERT
);
555 if (slot
== NULL
|| *slot
== NULL
)
557 /* This is the first time we find this variable, add it to the
558 REFERENCED_VARS array and annotate it with attributes that are
559 intrinsic to the variable. */
561 *slot
= (void *) var
;
562 v_ann
->uid
= num_referenced_vars
;
563 VARRAY_PUSH_TREE (referenced_vars
, var
);
565 /* Global variables are always call-clobbered. */
566 if (is_global_var (var
))
567 mark_call_clobbered (var
);
569 /* Scan DECL_INITIAL for pointer variables as they may contain
570 address arithmetic referencing the address of other
572 if (DECL_INITIAL (var
)
573 /* Initializers of external variables are not useful to the
575 && !DECL_EXTERNAL (var
)
576 /* It's not necessary to walk the initial value of non-constant
577 public variables because it cannot be propagated by the
579 && (!TREE_PUBLIC (var
) || !TREE_CONSTANT (var
)))
580 walk_tree (&DECL_INITIAL (var
), find_vars_r
, walk_state
, 0);
585 /* Return the virtual variable associated to the non-scalar variable VAR. */
588 get_virtual_var (tree var
)
592 if (TREE_CODE (var
) == SSA_NAME
)
593 var
= SSA_NAME_VAR (var
);
595 while (TREE_CODE (var
) == REALPART_EXPR
|| TREE_CODE (var
) == IMAGPART_EXPR
596 || handled_component_p (var
))
597 var
= TREE_OPERAND (var
, 0);
599 /* Treating GIMPLE registers as virtual variables makes no sense.
600 Also complain if we couldn't extract a _DECL out of the original
602 gcc_assert (SSA_VAR_P (var
));
603 gcc_assert (!is_gimple_reg (var
));
608 /* Add a temporary variable to REFERENCED_VARS. This is similar to
609 add_referenced_var, but is used by passes that need to add new temps to
610 the REFERENCED_VARS array after the program has been scanned for
611 variables. The variable will just receive a new UID and be added
612 to the REFERENCED_VARS array without checking for duplicates. */
615 add_referenced_tmp_var (tree var
)
617 add_referenced_var (var
, NULL
);
621 /* Mark all the non-SSA variables found in STMT's operands to be
622 processed by update_ssa. */
625 mark_new_vars_to_rename (tree stmt
)
629 bitmap vars_in_vops_to_rename
;
630 bool found_exposed_symbol
= false;
631 int v_may_defs_before
, v_may_defs_after
;
632 int v_must_defs_before
, v_must_defs_after
;
634 vars_in_vops_to_rename
= BITMAP_ALLOC (NULL
);
636 /* Before re-scanning the statement for operands, mark the existing
637 virtual operands to be renamed again. We do this because when new
638 symbols are exposed, the virtual operands that were here before due to
639 aliasing will probably be removed by the call to get_stmt_operand.
640 Therefore, we need to flag them to be renamed beforehand.
642 We flag them in a separate bitmap because we don't really want to
643 rename them if there are not any newly exposed symbols in the
644 statement operands. */
645 v_may_defs_before
= NUM_V_MAY_DEFS (STMT_V_MAY_DEF_OPS (stmt
));
646 v_must_defs_before
= NUM_V_MUST_DEFS (STMT_V_MUST_DEF_OPS (stmt
));
648 FOR_EACH_SSA_TREE_OPERAND (val
, stmt
, iter
,
649 SSA_OP_VMAYDEF
| SSA_OP_VUSE
| SSA_OP_VMUSTDEF
)
652 val
= SSA_NAME_VAR (val
);
653 bitmap_set_bit (vars_in_vops_to_rename
, var_ann (val
)->uid
);
656 /* Now force an operand re-scan on the statement and mark any newly
657 exposed variables. */
660 v_may_defs_after
= NUM_V_MAY_DEFS (STMT_V_MAY_DEF_OPS (stmt
));
661 v_must_defs_after
= NUM_V_MUST_DEFS (STMT_V_MUST_DEF_OPS (stmt
));
663 FOR_EACH_SSA_TREE_OPERAND (val
, stmt
, iter
, SSA_OP_ALL_OPERANDS
)
666 found_exposed_symbol
= true;
667 mark_sym_for_renaming (val
);
670 /* If we found any newly exposed symbols, or if there are fewer VDEF
671 operands in the statement, add the variables we had set in
672 VARS_IN_VOPS_TO_RENAME to VARS_TO_RENAME. We need to check for
673 vanishing VDEFs because in those cases, the names that were formerly
674 generated by this statement are not going to be available anymore. */
675 if (found_exposed_symbol
676 || v_may_defs_before
> v_may_defs_after
677 || v_must_defs_before
> v_must_defs_after
)
678 mark_set_for_renaming (vars_in_vops_to_rename
);
680 BITMAP_FREE (vars_in_vops_to_rename
);
683 /* Find all variables within the gimplified statement that were not previously
684 visible to the function and add them to the referenced variables list. */
687 find_new_referenced_vars_1 (tree
*tp
, int *walk_subtrees
,
688 void *data ATTRIBUTE_UNUSED
)
692 if (TREE_CODE (t
) == VAR_DECL
&& !var_ann (t
))
694 add_referenced_tmp_var (t
);
695 mark_sym_for_renaming (t
);
698 if (IS_TYPE_OR_DECL_P (t
))
705 find_new_referenced_vars (tree
*stmt_p
)
707 walk_tree (stmt_p
, find_new_referenced_vars_1
, NULL
, NULL
);
711 /* If REF is a COMPONENT_REF for a structure that can have sub-variables, and
712 we know where REF is accessing, return the variable in REF that has the
713 sub-variables. If the return value is not NULL, POFFSET will be the
714 offset, in bits, of REF inside the return value, and PSIZE will be the
715 size, in bits, of REF inside the return value. */
718 okay_component_ref_for_subvars (tree ref
, HOST_WIDE_INT
*poffset
,
719 HOST_WIDE_INT
*psize
)
722 HOST_WIDE_INT bitsize
;
723 HOST_WIDE_INT bitpos
;
725 enum machine_mode mode
;
729 gcc_assert (!SSA_VAR_P (ref
));
731 *psize
= (unsigned int) -1;
733 if (ref_contains_array_ref (ref
))
735 ref
= get_inner_reference (ref
, &bitsize
, &bitpos
, &offset
, &mode
,
736 &unsignedp
, &volatilep
, false);
737 if (TREE_CODE (ref
) == INDIRECT_REF
)
739 else if (offset
== NULL
&& bitsize
!= -1 && SSA_VAR_P (ref
))
743 if (get_subvars_for_var (ref
) != NULL
)
746 else if (SSA_VAR_P (ref
))
748 if (get_subvars_for_var (ref
) != NULL
)