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 VEC(tree
,gc
) *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 dfa_stats_p
->num_stmt_anns
++;
486 dfa_stats_p
->num_defs
+= NUM_SSA_OPERANDS (t
, SSA_OP_DEF
);
487 dfa_stats_p
->num_uses
+= NUM_SSA_OPERANDS (t
, SSA_OP_USE
);
488 dfa_stats_p
->num_v_may_defs
+= NUM_SSA_OPERANDS (t
, SSA_OP_VMAYDEF
);
489 dfa_stats_p
->num_vuses
+= NUM_SSA_OPERANDS (t
, SSA_OP_VUSE
);
490 dfa_stats_p
->num_v_must_defs
+=
491 NUM_SSA_OPERANDS (t
, SSA_OP_VMUSTDEF
);
496 dfa_stats_p
->num_var_anns
++;
508 /*---------------------------------------------------------------------------
509 Miscellaneous helpers
510 ---------------------------------------------------------------------------*/
511 /* Callback for walk_tree. Used to collect variables referenced in
515 find_vars_r (tree
*tp
, int *walk_subtrees
, void *data
)
517 struct walk_state
*walk_state
= (struct walk_state
*) data
;
519 /* If T is a regular variable that the optimizers are interested
520 in, add it to the list of variables. */
522 add_referenced_var (*tp
, walk_state
);
524 /* Type, _DECL and constant nodes have no interesting children.
526 else if (IS_TYPE_OR_DECL_P (*tp
) || CONSTANT_CLASS_P (*tp
))
533 /* Add VAR to the list of dereferenced variables.
535 WALK_STATE contains a hash table used to avoid adding the same
536 variable more than once. Note that this function assumes that
537 VAR is a valid SSA variable. If WALK_STATE is NULL, no
538 duplicate checking is done. */
541 add_referenced_var (tree var
, struct walk_state
*walk_state
)
546 v_ann
= get_var_ann (var
);
549 slot
= htab_find_slot (walk_state
->vars_found
, (void *) var
, INSERT
);
553 if (slot
== NULL
|| *slot
== NULL
)
555 /* This is the first time we find this variable, add it to the
556 REFERENCED_VARS array and annotate it with attributes that are
557 intrinsic to the variable. */
559 *slot
= (void *) var
;
560 v_ann
->uid
= num_referenced_vars
;
561 VEC_safe_push (tree
, gc
, referenced_vars
, var
);
563 /* Global variables are always call-clobbered. */
564 if (is_global_var (var
))
565 mark_call_clobbered (var
);
567 /* Scan DECL_INITIAL for pointer variables as they may contain
568 address arithmetic referencing the address of other
570 if (DECL_INITIAL (var
)
571 /* Initializers of external variables are not useful to the
573 && !DECL_EXTERNAL (var
)
574 /* It's not necessary to walk the initial value of non-constant
575 public variables because it cannot be propagated by the
577 && (!TREE_PUBLIC (var
) || !TREE_CONSTANT (var
)))
578 walk_tree (&DECL_INITIAL (var
), find_vars_r
, walk_state
, 0);
583 /* Return the virtual variable associated to the non-scalar variable VAR. */
586 get_virtual_var (tree var
)
590 if (TREE_CODE (var
) == SSA_NAME
)
591 var
= SSA_NAME_VAR (var
);
593 while (TREE_CODE (var
) == REALPART_EXPR
|| TREE_CODE (var
) == IMAGPART_EXPR
594 || handled_component_p (var
))
595 var
= TREE_OPERAND (var
, 0);
597 /* Treating GIMPLE registers as virtual variables makes no sense.
598 Also complain if we couldn't extract a _DECL out of the original
600 gcc_assert (SSA_VAR_P (var
));
601 gcc_assert (!is_gimple_reg (var
));
606 /* Add a temporary variable to REFERENCED_VARS. This is similar to
607 add_referenced_var, but is used by passes that need to add new temps to
608 the REFERENCED_VARS array after the program has been scanned for
609 variables. The variable will just receive a new UID and be added
610 to the REFERENCED_VARS array without checking for duplicates. */
613 add_referenced_tmp_var (tree var
)
615 add_referenced_var (var
, NULL
);
619 /* Mark all the non-SSA variables found in STMT's operands to be
620 processed by update_ssa. */
623 mark_new_vars_to_rename (tree stmt
)
627 bitmap vars_in_vops_to_rename
;
628 bool found_exposed_symbol
= false;
629 int v_may_defs_before
, v_may_defs_after
;
630 int v_must_defs_before
, v_must_defs_after
;
632 vars_in_vops_to_rename
= BITMAP_ALLOC (NULL
);
634 /* Before re-scanning the statement for operands, mark the existing
635 virtual operands to be renamed again. We do this because when new
636 symbols are exposed, the virtual operands that were here before due to
637 aliasing will probably be removed by the call to get_stmt_operand.
638 Therefore, we need to flag them to be renamed beforehand.
640 We flag them in a separate bitmap because we don't really want to
641 rename them if there are not any newly exposed symbols in the
642 statement operands. */
643 v_may_defs_before
= NUM_SSA_OPERANDS (stmt
, SSA_OP_VMAYDEF
);
644 v_must_defs_before
= NUM_SSA_OPERANDS (stmt
, SSA_OP_VMUSTDEF
);
646 FOR_EACH_SSA_TREE_OPERAND (val
, stmt
, iter
,
647 SSA_OP_VMAYDEF
| SSA_OP_VUSE
| SSA_OP_VMUSTDEF
)
650 val
= SSA_NAME_VAR (val
);
651 bitmap_set_bit (vars_in_vops_to_rename
, var_ann (val
)->uid
);
654 /* Now force an operand re-scan on the statement and mark any newly
655 exposed variables. */
658 v_may_defs_after
= NUM_SSA_OPERANDS (stmt
, SSA_OP_VMAYDEF
);
659 v_must_defs_after
= NUM_SSA_OPERANDS (stmt
, SSA_OP_VMUSTDEF
);
661 FOR_EACH_SSA_TREE_OPERAND (val
, stmt
, iter
, SSA_OP_ALL_OPERANDS
)
664 found_exposed_symbol
= true;
665 mark_sym_for_renaming (val
);
668 /* If we found any newly exposed symbols, or if there are fewer VDEF
669 operands in the statement, add the variables we had set in
670 VARS_IN_VOPS_TO_RENAME to VARS_TO_RENAME. We need to check for
671 vanishing VDEFs because in those cases, the names that were formerly
672 generated by this statement are not going to be available anymore. */
673 if (found_exposed_symbol
674 || v_may_defs_before
> v_may_defs_after
675 || v_must_defs_before
> v_must_defs_after
)
676 mark_set_for_renaming (vars_in_vops_to_rename
);
678 BITMAP_FREE (vars_in_vops_to_rename
);
681 /* Find all variables within the gimplified statement that were not previously
682 visible to the function and add them to the referenced variables list. */
685 find_new_referenced_vars_1 (tree
*tp
, int *walk_subtrees
,
686 void *data ATTRIBUTE_UNUSED
)
690 if (TREE_CODE (t
) == VAR_DECL
&& !var_ann (t
))
692 add_referenced_tmp_var (t
);
693 mark_sym_for_renaming (t
);
696 if (IS_TYPE_OR_DECL_P (t
))
703 find_new_referenced_vars (tree
*stmt_p
)
705 walk_tree (stmt_p
, find_new_referenced_vars_1
, NULL
, NULL
);
709 /* If REF is a COMPONENT_REF for a structure that can have sub-variables, and
710 we know where REF is accessing, return the variable in REF that has the
711 sub-variables. If the return value is not NULL, POFFSET will be the
712 offset, in bits, of REF inside the return value, and PSIZE will be the
713 size, in bits, of REF inside the return value. */
716 okay_component_ref_for_subvars (tree ref
, HOST_WIDE_INT
*poffset
,
717 HOST_WIDE_INT
*psize
)
720 HOST_WIDE_INT bitsize
;
721 HOST_WIDE_INT bitpos
;
723 enum machine_mode mode
;
727 gcc_assert (!SSA_VAR_P (ref
));
729 *psize
= (unsigned int) -1;
731 if (ref_contains_array_ref (ref
))
733 ref
= get_inner_reference (ref
, &bitsize
, &bitpos
, &offset
, &mode
,
734 &unsignedp
, &volatilep
, false);
735 if (TREE_CODE (ref
) == INDIRECT_REF
)
737 else if (offset
== NULL
&& bitsize
!= -1 && SSA_VAR_P (ref
))
741 if (get_subvars_for_var (ref
) != NULL
)
744 else if (SSA_VAR_P (ref
))
746 if (get_subvars_for_var (ref
) != NULL
)