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"
37 #include "langhooks.h"
40 #include "diagnostic.h"
41 #include "tree-dump.h"
42 #include "tree-gimple.h"
43 #include "tree-flow.h"
44 #include "tree-inline.h"
45 #include "tree-pass.h"
50 /* Build and maintain data flow information for trees. */
52 /* Counters used to display DFA and SSA statistics. */
68 /* State information for find_vars_r. */
71 /* Hash table used to avoid adding the same variable more than once. */
76 /* Local functions. */
77 static void collect_dfa_stats (struct dfa_stats_d
*);
78 static tree
collect_dfa_stats_r (tree
*, int *, void *);
79 static tree
find_vars_r (tree
*, int *, void *);
80 static void add_referenced_var (tree
, struct walk_state
*);
83 /* Global declarations. */
85 /* Array of all variables referenced in the function. */
86 VEC(tree
,gc
) *referenced_vars
;
89 /*---------------------------------------------------------------------------
90 Dataflow analysis (DFA) routines
91 ---------------------------------------------------------------------------*/
92 /* Find all the variables referenced in the function. This function
93 builds the global arrays REFERENCED_VARS and CALL_CLOBBERED_VARS.
95 Note that this function does not look for statement operands, it simply
96 determines what variables are referenced in the program and detects
97 various attributes for each variable used by alias analysis and the
101 find_referenced_vars (void)
105 block_stmt_iterator si
;
106 struct walk_state walk_state
;
108 vars_found
= htab_create (50, htab_hash_pointer
, htab_eq_pointer
, NULL
);
109 memset (&walk_state
, 0, sizeof (walk_state
));
110 walk_state
.vars_found
= vars_found
;
113 for (si
= bsi_start (bb
); !bsi_end_p (si
); bsi_next (&si
))
115 tree
*stmt_p
= bsi_stmt_ptr (si
);
116 walk_tree (stmt_p
, find_vars_r
, &walk_state
, NULL
);
119 htab_delete (vars_found
);
122 struct tree_opt_pass pass_referenced_vars
=
126 find_referenced_vars
, /* execute */
129 0, /* static_pass_number */
130 TV_FIND_REFERENCED_VARS
, /* tv_id */
131 PROP_gimple_leh
| PROP_cfg
, /* properties_required */
132 PROP_referenced_vars
, /* properties_provided */
133 0, /* properties_destroyed */
134 0, /* todo_flags_start */
135 0, /* todo_flags_finish */
140 /*---------------------------------------------------------------------------
142 ---------------------------------------------------------------------------*/
143 /* Create a new annotation for a _DECL node T. */
146 create_var_ann (tree t
)
151 gcc_assert (DECL_P (t
));
152 gcc_assert (!t
->common
.ann
|| t
->common
.ann
->common
.type
== VAR_ANN
);
154 ann
= ggc_alloc (sizeof (*ann
));
155 memset ((void *) ann
, 0, sizeof (*ann
));
157 ann
->common
.type
= VAR_ANN
;
159 t
->common
.ann
= (tree_ann_t
) ann
;
165 /* Create a new annotation for a statement node T. */
168 create_stmt_ann (tree t
)
172 gcc_assert (is_gimple_stmt (t
));
173 gcc_assert (!t
->common
.ann
|| t
->common
.ann
->common
.type
== STMT_ANN
);
175 ann
= ggc_alloc (sizeof (*ann
));
176 memset ((void *) ann
, 0, sizeof (*ann
));
178 ann
->common
.type
= STMT_ANN
;
180 /* Since we just created the annotation, mark the statement modified. */
181 ann
->modified
= true;
183 t
->common
.ann
= (tree_ann_t
) ann
;
189 /* Create a new annotation for a tree T. */
192 create_tree_ann (tree t
)
197 gcc_assert (!t
->common
.ann
|| t
->common
.ann
->common
.type
== TREE_ANN_COMMON
);
199 ann
= ggc_alloc (sizeof (*ann
));
200 memset ((void *) ann
, 0, sizeof (*ann
));
202 ann
->common
.type
= TREE_ANN_COMMON
;
208 /* Build a temporary. Make sure and register it to be renamed. */
211 make_rename_temp (tree type
, const char *prefix
)
213 tree t
= create_tmp_var (type
, prefix
);
216 add_referenced_tmp_var (t
);
217 mark_sym_for_renaming (t
);
225 /*---------------------------------------------------------------------------
227 ---------------------------------------------------------------------------*/
228 /* Dump the list of all the referenced variables in the current function to
232 dump_referenced_vars (FILE *file
)
236 fprintf (file
, "\nReferenced variables in %s: %u\n\n",
237 get_name (current_function_decl
), (unsigned) num_referenced_vars
);
239 for (i
= 0; i
< num_referenced_vars
; i
++)
241 tree var
= referenced_var (i
);
242 fprintf (file
, "Variable: ");
243 dump_variable (file
, var
);
244 fprintf (file
, "\n");
249 /* Dump the list of all the referenced variables to stderr. */
252 debug_referenced_vars (void)
254 dump_referenced_vars (stderr
);
258 /* Dump variable VAR and its may-aliases to FILE. */
261 dump_variable (FILE *file
, tree var
)
265 if (TREE_CODE (var
) == SSA_NAME
)
267 if (POINTER_TYPE_P (TREE_TYPE (var
)))
268 dump_points_to_info_for (file
, var
);
269 var
= SSA_NAME_VAR (var
);
272 if (var
== NULL_TREE
)
274 fprintf (file
, "<nil>");
278 print_generic_expr (file
, var
, dump_flags
);
282 fprintf (file
, ", UID %u", (unsigned) ann
->uid
);
284 fprintf (file
, ", ");
285 print_generic_expr (file
, TREE_TYPE (var
), dump_flags
);
287 if (ann
->type_mem_tag
)
289 fprintf (file
, ", type memory tag: ");
290 print_generic_expr (file
, ann
->type_mem_tag
, dump_flags
);
293 if (ann
->is_alias_tag
)
294 fprintf (file
, ", is an alias tag");
296 if (TREE_ADDRESSABLE (var
))
297 fprintf (file
, ", is addressable");
299 if (is_global_var (var
))
300 fprintf (file
, ", is global");
302 if (TREE_THIS_VOLATILE (var
))
303 fprintf (file
, ", is volatile");
305 if (is_call_clobbered (var
))
306 fprintf (file
, ", call clobbered");
308 if (ann
->default_def
)
310 fprintf (file
, ", default def: ");
311 print_generic_expr (file
, ann
->default_def
, dump_flags
);
314 if (ann
->may_aliases
)
316 fprintf (file
, ", may aliases: ");
317 dump_may_aliases_for (file
, var
);
320 fprintf (file
, "\n");
324 /* Dump variable VAR and its may-aliases to stderr. */
327 debug_variable (tree var
)
329 dump_variable (stderr
, var
);
333 /* Dump various DFA statistics to FILE. */
336 dump_dfa_stats (FILE *file
)
338 struct dfa_stats_d dfa_stats
;
340 unsigned long size
, total
= 0;
341 const char * const fmt_str
= "%-30s%-13s%12s\n";
342 const char * const fmt_str_1
= "%-30s%13lu%11lu%c\n";
343 const char * const fmt_str_3
= "%-43s%11lu%c\n";
345 = lang_hooks
.decl_printable_name (current_function_decl
, 2);
347 collect_dfa_stats (&dfa_stats
);
349 fprintf (file
, "\nDFA Statistics for %s\n\n", funcname
);
351 fprintf (file
, "---------------------------------------------------------\n");
352 fprintf (file
, fmt_str
, "", " Number of ", "Memory");
353 fprintf (file
, fmt_str
, "", " instances ", "used ");
354 fprintf (file
, "---------------------------------------------------------\n");
356 size
= num_referenced_vars
* sizeof (tree
);
358 fprintf (file
, fmt_str_1
, "Referenced variables", (unsigned long)num_referenced_vars
,
359 SCALE (size
), LABEL (size
));
361 size
= dfa_stats
.num_stmt_anns
* sizeof (struct stmt_ann_d
);
363 fprintf (file
, fmt_str_1
, "Statements annotated", dfa_stats
.num_stmt_anns
,
364 SCALE (size
), LABEL (size
));
366 size
= dfa_stats
.num_var_anns
* sizeof (struct var_ann_d
);
368 fprintf (file
, fmt_str_1
, "Variables annotated", dfa_stats
.num_var_anns
,
369 SCALE (size
), LABEL (size
));
371 size
= dfa_stats
.num_uses
* sizeof (tree
*);
373 fprintf (file
, fmt_str_1
, "USE operands", dfa_stats
.num_uses
,
374 SCALE (size
), LABEL (size
));
376 size
= dfa_stats
.num_defs
* sizeof (tree
*);
378 fprintf (file
, fmt_str_1
, "DEF operands", dfa_stats
.num_defs
,
379 SCALE (size
), LABEL (size
));
381 size
= dfa_stats
.num_vuses
* sizeof (tree
*);
383 fprintf (file
, fmt_str_1
, "VUSE operands", dfa_stats
.num_vuses
,
384 SCALE (size
), LABEL (size
));
386 size
= dfa_stats
.num_v_may_defs
* sizeof (tree
*);
388 fprintf (file
, fmt_str_1
, "V_MAY_DEF operands", dfa_stats
.num_v_may_defs
,
389 SCALE (size
), LABEL (size
));
391 size
= dfa_stats
.num_v_must_defs
* sizeof (tree
*);
393 fprintf (file
, fmt_str_1
, "V_MUST_DEF operands", dfa_stats
.num_v_must_defs
,
394 SCALE (size
), LABEL (size
));
396 size
= dfa_stats
.num_phis
* sizeof (struct tree_phi_node
);
398 fprintf (file
, fmt_str_1
, "PHI nodes", dfa_stats
.num_phis
,
399 SCALE (size
), LABEL (size
));
401 size
= dfa_stats
.num_phi_args
* sizeof (struct phi_arg_d
);
403 fprintf (file
, fmt_str_1
, "PHI arguments", dfa_stats
.num_phi_args
,
404 SCALE (size
), LABEL (size
));
406 fprintf (file
, "---------------------------------------------------------\n");
407 fprintf (file
, fmt_str_3
, "Total memory used by DFA/SSA data", SCALE (total
),
409 fprintf (file
, "---------------------------------------------------------\n");
410 fprintf (file
, "\n");
412 if (dfa_stats
.num_phis
)
413 fprintf (file
, "Average number of arguments per PHI node: %.1f (max: %d)\n",
414 (float) dfa_stats
.num_phi_args
/ (float) dfa_stats
.num_phis
,
415 dfa_stats
.max_num_phi_args
);
417 fprintf (file
, "\n");
421 /* Dump DFA statistics on stderr. */
424 debug_dfa_stats (void)
426 dump_dfa_stats (stderr
);
430 /* Collect DFA statistics and store them in the structure pointed by
434 collect_dfa_stats (struct dfa_stats_d
*dfa_stats_p
)
436 struct pointer_set_t
*pset
;
438 block_stmt_iterator i
;
440 gcc_assert (dfa_stats_p
);
442 memset ((void *)dfa_stats_p
, 0, sizeof (struct dfa_stats_d
));
444 /* Walk all the trees in the function counting references. Start at
445 basic block 0, but don't stop at block boundaries. */
446 pset
= pointer_set_create ();
448 for (i
= bsi_start (BASIC_BLOCK (0)); !bsi_end_p (i
); bsi_next (&i
))
449 walk_tree (bsi_stmt_ptr (i
), collect_dfa_stats_r
, (void *) dfa_stats_p
,
452 pointer_set_destroy (pset
);
457 for (phi
= phi_nodes (bb
); phi
; phi
= PHI_CHAIN (phi
))
459 dfa_stats_p
->num_phis
++;
460 dfa_stats_p
->num_phi_args
+= PHI_NUM_ARGS (phi
);
461 if (PHI_NUM_ARGS (phi
) > dfa_stats_p
->max_num_phi_args
)
462 dfa_stats_p
->max_num_phi_args
= PHI_NUM_ARGS (phi
);
468 /* Callback for walk_tree to collect DFA statistics for a tree and its
472 collect_dfa_stats_r (tree
*tp
, int *walk_subtrees ATTRIBUTE_UNUSED
,
476 struct dfa_stats_d
*dfa_stats_p
= (struct dfa_stats_d
*)data
;
480 switch (ann_type (t
->common
.ann
))
484 dfa_stats_p
->num_stmt_anns
++;
485 dfa_stats_p
->num_defs
+= NUM_SSA_OPERANDS (t
, SSA_OP_DEF
);
486 dfa_stats_p
->num_uses
+= NUM_SSA_OPERANDS (t
, SSA_OP_USE
);
487 dfa_stats_p
->num_v_may_defs
+= NUM_SSA_OPERANDS (t
, SSA_OP_VMAYDEF
);
488 dfa_stats_p
->num_vuses
+= NUM_SSA_OPERANDS (t
, SSA_OP_VUSE
);
489 dfa_stats_p
->num_v_must_defs
+=
490 NUM_SSA_OPERANDS (t
, SSA_OP_VMUSTDEF
);
495 dfa_stats_p
->num_var_anns
++;
507 /*---------------------------------------------------------------------------
508 Miscellaneous helpers
509 ---------------------------------------------------------------------------*/
510 /* Callback for walk_tree. Used to collect variables referenced in
514 find_vars_r (tree
*tp
, int *walk_subtrees
, void *data
)
516 struct walk_state
*walk_state
= (struct walk_state
*) data
;
518 /* If T is a regular variable that the optimizers are interested
519 in, add it to the list of variables. */
521 add_referenced_var (*tp
, walk_state
);
523 /* Type, _DECL and constant nodes have no interesting children.
525 else if (IS_TYPE_OR_DECL_P (*tp
) || CONSTANT_CLASS_P (*tp
))
532 /* Add VAR to the list of dereferenced variables.
534 WALK_STATE contains a hash table used to avoid adding the same
535 variable more than once. Note that this function assumes that
536 VAR is a valid SSA variable. If WALK_STATE is NULL, no
537 duplicate checking is done. */
540 add_referenced_var (tree var
, struct walk_state
*walk_state
)
545 v_ann
= get_var_ann (var
);
548 slot
= htab_find_slot (walk_state
->vars_found
, (void *) var
, INSERT
);
552 if (slot
== NULL
|| *slot
== NULL
)
554 /* This is the first time we find this variable, add it to the
555 REFERENCED_VARS array and annotate it with attributes that are
556 intrinsic to the variable. */
558 *slot
= (void *) var
;
559 v_ann
->uid
= num_referenced_vars
;
560 VEC_safe_push (tree
, gc
, referenced_vars
, var
);
562 /* Global variables are always call-clobbered. */
563 if (is_global_var (var
))
564 mark_call_clobbered (var
);
566 /* Scan DECL_INITIAL for pointer variables as they may contain
567 address arithmetic referencing the address of other
569 if (DECL_INITIAL (var
)
570 /* Initializers of external variables are not useful to the
572 && !DECL_EXTERNAL (var
)
573 /* It's not necessary to walk the initial value of non-constant
574 public variables because it cannot be propagated by the
576 && (!TREE_PUBLIC (var
) || !TREE_CONSTANT (var
)))
577 walk_tree (&DECL_INITIAL (var
), find_vars_r
, walk_state
, 0);
582 /* Return the virtual variable associated to the non-scalar variable VAR. */
585 get_virtual_var (tree var
)
589 if (TREE_CODE (var
) == SSA_NAME
)
590 var
= SSA_NAME_VAR (var
);
592 while (TREE_CODE (var
) == REALPART_EXPR
|| TREE_CODE (var
) == IMAGPART_EXPR
593 || handled_component_p (var
))
594 var
= TREE_OPERAND (var
, 0);
596 /* Treating GIMPLE registers as virtual variables makes no sense.
597 Also complain if we couldn't extract a _DECL out of the original
599 gcc_assert (SSA_VAR_P (var
));
600 gcc_assert (!is_gimple_reg (var
));
605 /* Add a temporary variable to REFERENCED_VARS. This is similar to
606 add_referenced_var, but is used by passes that need to add new temps to
607 the REFERENCED_VARS array after the program has been scanned for
608 variables. The variable will just receive a new UID and be added
609 to the REFERENCED_VARS array without checking for duplicates. */
612 add_referenced_tmp_var (tree var
)
614 add_referenced_var (var
, NULL
);
618 /* Mark all the non-SSA variables found in STMT's operands to be
619 processed by update_ssa. */
622 mark_new_vars_to_rename (tree stmt
)
626 bitmap vars_in_vops_to_rename
;
627 bool found_exposed_symbol
= false;
628 int v_may_defs_before
, v_may_defs_after
;
629 int v_must_defs_before
, v_must_defs_after
;
631 vars_in_vops_to_rename
= BITMAP_ALLOC (NULL
);
633 /* Before re-scanning the statement for operands, mark the existing
634 virtual operands to be renamed again. We do this because when new
635 symbols are exposed, the virtual operands that were here before due to
636 aliasing will probably be removed by the call to get_stmt_operand.
637 Therefore, we need to flag them to be renamed beforehand.
639 We flag them in a separate bitmap because we don't really want to
640 rename them if there are not any newly exposed symbols in the
641 statement operands. */
642 v_may_defs_before
= NUM_SSA_OPERANDS (stmt
, SSA_OP_VMAYDEF
);
643 v_must_defs_before
= NUM_SSA_OPERANDS (stmt
, SSA_OP_VMUSTDEF
);
645 FOR_EACH_SSA_TREE_OPERAND (val
, stmt
, iter
,
646 SSA_OP_VMAYDEF
| SSA_OP_VUSE
| SSA_OP_VMUSTDEF
)
649 val
= SSA_NAME_VAR (val
);
650 bitmap_set_bit (vars_in_vops_to_rename
, var_ann (val
)->uid
);
653 /* Now force an operand re-scan on the statement and mark any newly
654 exposed variables. */
657 v_may_defs_after
= NUM_SSA_OPERANDS (stmt
, SSA_OP_VMAYDEF
);
658 v_must_defs_after
= NUM_SSA_OPERANDS (stmt
, SSA_OP_VMUSTDEF
);
660 FOR_EACH_SSA_TREE_OPERAND (val
, stmt
, iter
, SSA_OP_ALL_OPERANDS
)
663 found_exposed_symbol
= true;
664 mark_sym_for_renaming (val
);
667 /* If we found any newly exposed symbols, or if there are fewer VDEF
668 operands in the statement, add the variables we had set in
669 VARS_IN_VOPS_TO_RENAME to VARS_TO_RENAME. We need to check for
670 vanishing VDEFs because in those cases, the names that were formerly
671 generated by this statement are not going to be available anymore. */
672 if (found_exposed_symbol
673 || v_may_defs_before
> v_may_defs_after
674 || v_must_defs_before
> v_must_defs_after
)
675 mark_set_for_renaming (vars_in_vops_to_rename
);
677 BITMAP_FREE (vars_in_vops_to_rename
);
680 /* Find all variables within the gimplified statement that were not previously
681 visible to the function and add them to the referenced variables list. */
684 find_new_referenced_vars_1 (tree
*tp
, int *walk_subtrees
,
685 void *data ATTRIBUTE_UNUSED
)
689 if (TREE_CODE (t
) == VAR_DECL
&& !var_ann (t
))
691 add_referenced_tmp_var (t
);
692 mark_sym_for_renaming (t
);
695 if (IS_TYPE_OR_DECL_P (t
))
702 find_new_referenced_vars (tree
*stmt_p
)
704 walk_tree (stmt_p
, find_new_referenced_vars_1
, NULL
, NULL
);
708 /* If REF is a COMPONENT_REF for a structure that can have sub-variables, and
709 we know where REF is accessing, return the variable in REF that has the
710 sub-variables. If the return value is not NULL, POFFSET will be the
711 offset, in bits, of REF inside the return value, and PSIZE will be the
712 size, in bits, of REF inside the return value. */
715 okay_component_ref_for_subvars (tree ref
, HOST_WIDE_INT
*poffset
,
716 HOST_WIDE_INT
*psize
)
719 HOST_WIDE_INT bitsize
;
720 HOST_WIDE_INT bitpos
;
722 enum machine_mode mode
;
726 gcc_assert (!SSA_VAR_P (ref
));
728 *psize
= (unsigned int) -1;
730 if (ref_contains_array_ref (ref
))
732 ref
= get_inner_reference (ref
, &bitsize
, &bitpos
, &offset
, &mode
,
733 &unsignedp
, &volatilep
, false);
734 if (TREE_CODE (ref
) == INDIRECT_REF
)
736 else if (offset
== NULL
&& bitsize
!= -1 && SSA_VAR_P (ref
))
740 if (get_subvars_for_var (ref
) != NULL
)
743 else if (SSA_VAR_P (ref
))
745 if (get_subvars_for_var (ref
) != NULL
)