1 /* Data flow functions for trees.
2 Copyright (C) 2001, 2002, 2003, 2004 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"
30 #include "hard-reg-set.h"
31 #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-alias-common.h"
46 #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 void add_immediate_use (tree, tree);
80 static tree find_vars_r (tree *, int *, void *);
81 static void add_referenced_var (tree, struct walk_state *);
82 static void compute_immediate_uses_for_phi (tree, bool (*)(tree));
83 static void compute_immediate_uses_for_stmt (tree, int, bool (*)(tree));
84 static void find_hidden_use_vars (tree);
85 static tree find_hidden_use_vars_r (tree *, int *, void *);
88 /* Global declarations. */
90 /* Array of all variables referenced in the function. */
91 varray_type referenced_vars;
94 /*---------------------------------------------------------------------------
95 Dataflow analysis (DFA) routines
96 ---------------------------------------------------------------------------*/
97 /* Find all the variables referenced in the function. This function
98 builds the global arrays REFERENCED_VARS and CALL_CLOBBERED_VARS.
100 Note that this function does not look for statement operands, it simply
101 determines what variables are referenced in the program and detects
102 various attributes for each variable used by alias analysis and the
106 find_referenced_vars (void)
110 block_stmt_iterator si;
111 struct walk_state walk_state;
114 /* Walk the lexical blocks in the function looking for variables that may
115 have been used to declare VLAs and for nested functions. Both
116 constructs create hidden uses of variables.
118 Note that at this point we may have multiple blocks hung off
119 DECL_INITIAL chained through the BLOCK_CHAIN field due to
120 how inlining works. Egad. */
121 block = DECL_INITIAL (current_function_decl);
124 find_hidden_use_vars (block);
125 block = BLOCK_CHAIN (block);
128 vars_found = htab_create (50, htab_hash_pointer, htab_eq_pointer, NULL);
129 memset (&walk_state, 0, sizeof (walk_state));
130 walk_state.vars_found = vars_found;
133 for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
135 tree *stmt_p = bsi_stmt_ptr (si);
136 walk_tree (stmt_p, find_vars_r, &walk_state, NULL);
139 htab_delete (vars_found);
142 struct tree_opt_pass pass_referenced_vars =
146 find_referenced_vars, /* execute */
149 0, /* static_pass_number */
151 PROP_gimple_leh | PROP_cfg, /* properties_required */
152 PROP_referenced_vars, /* properties_provided */
153 0, /* properties_destroyed */
154 0, /* todo_flags_start */
155 0, /* todo_flags_finish */
159 /* Compute immediate uses.
161 CALC_FOR is an optional function pointer which indicates whether
162 immediate uses information should be calculated for a given SSA
163 variable. If NULL, then information is computed for all
166 FLAGS is one of {TDFA_USE_OPS, TDFA_USE_VOPS}. It is used by
167 compute_immediate_uses_for_stmt to determine whether to look at
168 virtual and/or real operands while computing def-use chains. */
171 compute_immediate_uses (int flags, bool (*calc_for)(tree))
174 block_stmt_iterator si;
180 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
182 if (is_gimple_reg (PHI_RESULT (phi)))
184 if (!(flags & TDFA_USE_OPS))
189 if (!(flags & TDFA_USE_VOPS))
193 compute_immediate_uses_for_phi (phi, calc_for);
196 for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
198 tree stmt = bsi_stmt (si);
199 get_stmt_operands (stmt);
200 compute_immediate_uses_for_stmt (stmt, flags, calc_for);
206 /* Invalidates dataflow information for a statement STMT. */
209 free_df_for_stmt (tree stmt)
211 stmt_ann_t ann = stmt_ann (stmt);
215 /* If we have a varray of immediate uses, then go ahead and release
217 if (ann->df->immediate_uses)
218 ggc_free (ann->df->immediate_uses);
220 /* Similarly for the main dataflow structure. */
227 /* Invalidate dataflow information for the whole function. */
233 block_stmt_iterator si;
239 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
240 free_df_for_stmt (phi);
242 for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
244 tree stmt = bsi_stmt (si);
245 free_df_for_stmt (stmt);
251 /* Helper for compute_immediate_uses. Check all the USE and/or VUSE
252 operands in phi node PHI and add a def-use edge between their
253 defining statement and PHI. CALC_FOR is as in
254 compute_immediate_uses.
256 PHI nodes are easy, we only need to look at their arguments. */
259 compute_immediate_uses_for_phi (tree phi, bool (*calc_for)(tree))
263 #ifdef ENABLE_CHECKING
264 if (TREE_CODE (phi) != PHI_NODE)
268 for (i = 0; i < PHI_NUM_ARGS (phi); i++)
270 tree arg = PHI_ARG_DEF (phi, i);
272 if (TREE_CODE (arg) == SSA_NAME && (!calc_for || calc_for (arg)))
274 tree imm_rdef_stmt = SSA_NAME_DEF_STMT (PHI_ARG_DEF (phi, i));
275 if (!IS_EMPTY_STMT (imm_rdef_stmt))
276 add_immediate_use (imm_rdef_stmt, phi);
282 /* Another helper for compute_immediate_uses. Depending on the value
283 of FLAGS, check all the USE and/or VUSE operands in STMT and add a
284 def-use edge between their defining statement and STMT. CALC_FOR
285 is as in compute_immediate_uses. */
288 compute_immediate_uses_for_stmt (tree stmt, int flags, bool (*calc_for)(tree))
293 v_may_def_optype v_may_defs;
296 #ifdef ENABLE_CHECKING
297 /* PHI nodes are handled elsewhere. */
298 if (TREE_CODE (stmt) == PHI_NODE)
302 /* Look at USE_OPS or VUSE_OPS according to FLAGS. */
303 ann = stmt_ann (stmt);
304 if (flags & TDFA_USE_OPS)
306 uses = USE_OPS (ann);
307 for (i = 0; i < NUM_USES (uses); i++)
309 tree use = USE_OP (uses, i);
310 tree imm_stmt = SSA_NAME_DEF_STMT (use);
311 if (!IS_EMPTY_STMT (imm_stmt) && (!calc_for || calc_for (use)))
312 add_immediate_use (imm_stmt, stmt);
316 if (flags & TDFA_USE_VOPS)
318 vuses = VUSE_OPS (ann);
319 for (i = 0; i < NUM_VUSES (vuses); i++)
321 tree vuse = VUSE_OP (vuses, i);
322 tree imm_rdef_stmt = SSA_NAME_DEF_STMT (vuse);
323 if (!IS_EMPTY_STMT (imm_rdef_stmt) && (!calc_for || calc_for (vuse)))
324 add_immediate_use (imm_rdef_stmt, stmt);
327 v_may_defs = V_MAY_DEF_OPS (ann);
328 for (i = 0; i < NUM_V_MAY_DEFS (v_may_defs); i++)
330 tree vuse = V_MAY_DEF_OP (v_may_defs, i);
331 tree imm_rdef_stmt = SSA_NAME_DEF_STMT (vuse);
332 if (!IS_EMPTY_STMT (imm_rdef_stmt) && (!calc_for || calc_for (vuse)))
333 add_immediate_use (imm_rdef_stmt, stmt);
339 /* Add statement USE_STMT to the list of statements that use definitions
343 add_immediate_use (tree stmt, tree use_stmt)
345 stmt_ann_t ann = get_stmt_ann (stmt);
346 struct dataflow_d *df;
351 df = ann->df = ggc_alloc (sizeof (struct dataflow_d));
352 memset ((void *) df, 0, sizeof (struct dataflow_d));
353 df->uses[0] = use_stmt;
359 df->uses[1] = use_stmt;
363 if (ann->df->immediate_uses == NULL)
364 VARRAY_TREE_INIT (ann->df->immediate_uses, 4, "immediate_uses");
366 VARRAY_PUSH_TREE (ann->df->immediate_uses, use_stmt);
370 /* If the immediate use of USE points to OLD, then redirect it to NEW. */
373 redirect_immediate_use (tree use, tree old, tree new)
375 tree imm_stmt = SSA_NAME_DEF_STMT (use);
376 struct dataflow_d *df = get_stmt_ann (imm_stmt)->df;
377 unsigned int num_uses = num_immediate_uses (df);
380 for (i = 0; i < num_uses; i++)
382 if (immediate_use (df, i) == old)
384 if (i == 0 || i == 1)
387 VARRAY_TREE (df->immediate_uses, i - 2) = new;
393 /* Redirect all immediate uses for operands in OLD so that they point
394 to NEW. This routine should have no knowledge of how immediate
398 redirect_immediate_uses (tree old, tree new)
400 stmt_ann_t ann = get_stmt_ann (old);
401 use_optype uses = USE_OPS (ann);
402 vuse_optype vuses = VUSE_OPS (ann);
403 v_may_def_optype v_may_defs = V_MAY_DEF_OPS (ann);
406 /* Look at USE_OPS or VUSE_OPS according to FLAGS. */
407 for (i = 0; i < NUM_USES (uses); i++)
408 redirect_immediate_use (USE_OP (uses, i), old, new);
410 for (i = 0; i < NUM_VUSES (vuses); i++)
411 redirect_immediate_use (VUSE_OP (vuses, i), old, new);
413 for (i = 0; i < NUM_V_MAY_DEFS (v_may_defs); i++)
414 redirect_immediate_use (V_MAY_DEF_OP (v_may_defs, i), old, new);
418 /*---------------------------------------------------------------------------
420 ---------------------------------------------------------------------------*/
421 /* Create a new annotation for a _DECL node T. */
424 create_var_ann (tree t)
428 #if defined ENABLE_CHECKING
432 && t->common.ann->common.type != VAR_ANN))
436 ann = ggc_alloc (sizeof (*ann));
437 memset ((void *) ann, 0, sizeof (*ann));
439 ann->common.type = VAR_ANN;
441 t->common.ann = (tree_ann_t) ann;
447 /* Create a new annotation for a statement node T. */
450 create_stmt_ann (tree t)
454 #if defined ENABLE_CHECKING
455 if ((!is_gimple_stmt (t))
457 && t->common.ann->common.type != STMT_ANN))
461 ann = ggc_alloc (sizeof (*ann));
462 memset ((void *) ann, 0, sizeof (*ann));
464 ann->common.type = STMT_ANN;
466 /* Since we just created the annotation, mark the statement modified. */
467 ann->modified = true;
469 t->common.ann = (tree_ann_t) ann;
475 /* Create a new annotation for a tree T. */
478 create_tree_ann (tree t)
482 #if defined ENABLE_CHECKING
485 && t->common.ann->common.type != TREE_ANN_COMMON))
489 ann = ggc_alloc (sizeof (*ann));
490 memset ((void *) ann, 0, sizeof (*ann));
492 ann->common.type = TREE_ANN_COMMON;
498 /* Build a temporary. Make sure and register it to be renamed. */
501 make_rename_temp (tree type, const char *prefix)
503 tree t = create_tmp_var (type, prefix);
504 add_referenced_tmp_var (t);
505 bitmap_set_bit (vars_to_rename, var_ann (t)->uid);
511 /*---------------------------------------------------------------------------
513 ---------------------------------------------------------------------------*/
514 /* Dump the list of all the referenced variables in the current function to
518 dump_referenced_vars (FILE *file)
522 fprintf (file, "\nReferenced variables in %s: %u\n\n",
523 get_name (current_function_decl), (unsigned) num_referenced_vars);
525 for (i = 0; i < num_referenced_vars; i++)
527 tree var = referenced_var (i);
528 fprintf (file, "Variable: ");
529 dump_variable (file, var);
530 fprintf (file, "\n");
535 /* Dump the list of all the referenced variables to stderr. */
538 debug_referenced_vars (void)
540 dump_referenced_vars (stderr);
544 /* Dump variable VAR and its may-aliases to FILE. */
547 dump_variable (FILE *file, tree var)
551 if (TREE_CODE (var) == SSA_NAME)
553 if (POINTER_TYPE_P (TREE_TYPE (var)))
554 dump_points_to_info_for (file, var);
555 var = SSA_NAME_VAR (var);
558 if (var == NULL_TREE)
560 fprintf (file, "<nil>");
564 print_generic_expr (file, var, dump_flags);
568 fprintf (file, ", UID %u", (unsigned) ann->uid);
570 if (ann->has_hidden_use)
571 fprintf (file, ", has hidden uses");
573 if (ann->type_mem_tag)
575 fprintf (file, ", type memory tag: ");
576 print_generic_expr (file, ann->type_mem_tag, dump_flags);
579 if (ann->is_alias_tag)
580 fprintf (file, ", is an alias tag");
582 if (needs_to_live_in_memory (var))
583 fprintf (file, ", is %s", TREE_STATIC (var) ? "static" : "global");
585 if (is_call_clobbered (var))
586 fprintf (file, ", call clobbered");
588 if (ann->default_def)
590 fprintf (file, ", default def: ");
591 print_generic_expr (file, ann->default_def, dump_flags);
594 if (ann->may_aliases)
596 fprintf (file, ", may aliases: ");
597 dump_may_aliases_for (file, var);
600 fprintf (file, "\n");
604 /* Dump variable VAR and its may-aliases to stderr. */
607 debug_variable (tree var)
609 dump_variable (stderr, var);
613 /* Dump def-use edges on FILE. */
616 dump_immediate_uses (FILE *file)
619 block_stmt_iterator si;
621 = lang_hooks.decl_printable_name (current_function_decl, 2);
623 fprintf (file, "\nDef-use edges for function %s\n", funcname);
629 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
630 dump_immediate_uses_for (file, phi);
632 for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
633 dump_immediate_uses_for (file, bsi_stmt (si));
636 fprintf (file, "\n");
640 /* Dump def-use edges on stderr. */
643 debug_immediate_uses (void)
645 dump_immediate_uses (stderr);
649 /* Dump all immediate uses for STMT on FILE. */
652 dump_immediate_uses_for (FILE *file, tree stmt)
654 dataflow_t df = get_immediate_uses (stmt);
655 int num_imm_uses = num_immediate_uses (df);
657 if (num_imm_uses > 0)
661 fprintf (file, "-> ");
662 print_generic_stmt (file, stmt, TDF_SLIM);
663 fprintf (file, "\n");
665 for (i = 0; i < num_imm_uses; i++)
667 fprintf (file, "\t");
668 print_generic_stmt (file, immediate_use (df, i), TDF_SLIM);
669 fprintf (file, "\n");
672 fprintf (file, "\n");
677 /* Dump immediate uses for STMT on stderr. */
680 debug_immediate_uses_for (tree stmt)
682 dump_immediate_uses_for (stderr, stmt);
686 /* Dump various DFA statistics to FILE. */
689 dump_dfa_stats (FILE *file)
691 struct dfa_stats_d dfa_stats;
693 unsigned long size, total = 0;
694 const char * const fmt_str = "%-30s%-13s%12s\n";
695 const char * const fmt_str_1 = "%-30s%13lu%11lu%c\n";
696 const char * const fmt_str_3 = "%-43s%11lu%c\n";
698 = lang_hooks.decl_printable_name (current_function_decl, 2);
700 collect_dfa_stats (&dfa_stats);
702 fprintf (file, "\nDFA Statistics for %s\n\n", funcname);
704 fprintf (file, "---------------------------------------------------------\n");
705 fprintf (file, fmt_str, "", " Number of ", "Memory");
706 fprintf (file, fmt_str, "", " instances ", "used ");
707 fprintf (file, "---------------------------------------------------------\n");
709 size = num_referenced_vars * sizeof (tree);
711 fprintf (file, fmt_str_1, "Referenced variables", num_referenced_vars,
712 SCALE (size), LABEL (size));
714 size = dfa_stats.num_stmt_anns * sizeof (struct stmt_ann_d);
716 fprintf (file, fmt_str_1, "Statements annotated", dfa_stats.num_stmt_anns,
717 SCALE (size), LABEL (size));
719 size = dfa_stats.num_var_anns * sizeof (struct var_ann_d);
721 fprintf (file, fmt_str_1, "Variables annotated", dfa_stats.num_var_anns,
722 SCALE (size), LABEL (size));
724 size = dfa_stats.num_uses * sizeof (tree *);
726 fprintf (file, fmt_str_1, "USE operands", dfa_stats.num_uses,
727 SCALE (size), LABEL (size));
729 size = dfa_stats.num_defs * sizeof (tree *);
731 fprintf (file, fmt_str_1, "DEF operands", dfa_stats.num_defs,
732 SCALE (size), LABEL (size));
734 size = dfa_stats.num_vuses * sizeof (tree *);
736 fprintf (file, fmt_str_1, "VUSE operands", dfa_stats.num_vuses,
737 SCALE (size), LABEL (size));
739 size = dfa_stats.num_v_may_defs * sizeof (tree *);
741 fprintf (file, fmt_str_1, "V_MAY_DEF operands", dfa_stats.num_v_may_defs,
742 SCALE (size), LABEL (size));
744 size = dfa_stats.num_v_must_defs * sizeof (tree *);
746 fprintf (file, fmt_str_1, "V_MUST_DEF operands", dfa_stats.num_v_must_defs,
747 SCALE (size), LABEL (size));
749 size = dfa_stats.num_phis * sizeof (struct tree_phi_node);
751 fprintf (file, fmt_str_1, "PHI nodes", dfa_stats.num_phis,
752 SCALE (size), LABEL (size));
754 size = dfa_stats.num_phi_args * sizeof (struct phi_arg_d);
756 fprintf (file, fmt_str_1, "PHI arguments", dfa_stats.num_phi_args,
757 SCALE (size), LABEL (size));
759 fprintf (file, "---------------------------------------------------------\n");
760 fprintf (file, fmt_str_3, "Total memory used by DFA/SSA data", SCALE (total),
762 fprintf (file, "---------------------------------------------------------\n");
763 fprintf (file, "\n");
765 if (dfa_stats.num_phis)
766 fprintf (file, "Average number of arguments per PHI node: %.1f (max: %d)\n",
767 (float) dfa_stats.num_phi_args / (float) dfa_stats.num_phis,
768 dfa_stats.max_num_phi_args);
770 fprintf (file, "\n");
774 /* Dump DFA statistics on stderr. */
777 debug_dfa_stats (void)
779 dump_dfa_stats (stderr);
783 /* Collect DFA statistics and store them in the structure pointed by
787 collect_dfa_stats (struct dfa_stats_d *dfa_stats_p)
791 block_stmt_iterator i;
793 if (dfa_stats_p == NULL)
796 memset ((void *)dfa_stats_p, 0, sizeof (struct dfa_stats_d));
798 /* Walk all the trees in the function counting references. Start at
799 basic block 0, but don't stop at block boundaries. */
800 htab = htab_create (30, htab_hash_pointer, htab_eq_pointer, NULL);
802 for (i = bsi_start (BASIC_BLOCK (0)); !bsi_end_p (i); bsi_next (&i))
803 walk_tree (bsi_stmt_ptr (i), collect_dfa_stats_r, (void *) dfa_stats_p,
811 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
813 dfa_stats_p->num_phis++;
814 dfa_stats_p->num_phi_args += PHI_NUM_ARGS (phi);
815 if (PHI_NUM_ARGS (phi) > dfa_stats_p->max_num_phi_args)
816 dfa_stats_p->max_num_phi_args = PHI_NUM_ARGS (phi);
822 /* Callback for walk_tree to collect DFA statistics for a tree and its
826 collect_dfa_stats_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
830 struct dfa_stats_d *dfa_stats_p = (struct dfa_stats_d *)data;
834 switch (ann_type (t->common.ann))
838 stmt_ann_t ann = (stmt_ann_t) t->common.ann;
839 dfa_stats_p->num_stmt_anns++;
840 dfa_stats_p->num_defs += NUM_DEFS (DEF_OPS (ann));
841 dfa_stats_p->num_uses += NUM_USES (USE_OPS (ann));
842 dfa_stats_p->num_v_may_defs +=
843 NUM_V_MAY_DEFS (V_MAY_DEF_OPS (ann));
844 dfa_stats_p->num_vuses += NUM_VUSES (VUSE_OPS (ann));
845 dfa_stats_p->num_v_must_defs +=
846 NUM_V_MUST_DEFS (V_MUST_DEF_OPS (ann));
851 dfa_stats_p->num_var_anns++;
863 /*---------------------------------------------------------------------------
864 Miscellaneous helpers
865 ---------------------------------------------------------------------------*/
866 /* Callback for walk_tree. Used to collect variables referenced in
870 find_vars_r (tree *tp, int *walk_subtrees, void *data)
872 struct walk_state *walk_state = (struct walk_state *) data;
874 /* If T is a regular variable that the optimizers are interested
875 in, add it to the list of variables. */
877 add_referenced_var (*tp, walk_state);
879 /* Type, _DECL and constant nodes have no interesting children.
881 else if (DECL_P (*tp)
883 || TREE_CODE_CLASS (TREE_CODE (*tp)) == 'c')
890 /* Add VAR to the list of dereferenced variables.
892 WALK_STATE contains a hash table used to avoid adding the same
893 variable more than once. Note that this function assumes that
894 VAR is a valid SSA variable. If WALK_STATE is NULL, no
895 duplicate checking is done. */
898 add_referenced_var (tree var, struct walk_state *walk_state)
903 v_ann = get_var_ann (var);
906 slot = htab_find_slot (walk_state->vars_found, (void *) var, INSERT);
910 if (slot == NULL || *slot == NULL)
912 /* This is the first time we find this variable, add it to the
913 REFERENCED_VARS array and annotate it with attributes that are
914 intrinsic to the variable. */
916 *slot = (void *) var;
917 v_ann->uid = num_referenced_vars;
918 VARRAY_PUSH_TREE (referenced_vars, var);
920 /* Global and static variables are call-clobbered, always. */
921 if (needs_to_live_in_memory (var))
922 mark_call_clobbered (var);
924 /* DECL_NONLOCAL variables should not be removed, as they are needed
925 to emit nested functions. */
926 if (DECL_NONLOCAL (var))
932 /* Return the virtual variable associated to the non-scalar variable VAR. */
935 get_virtual_var (tree var)
939 if (TREE_CODE (var) == SSA_NAME)
940 var = SSA_NAME_VAR (var);
942 while (TREE_CODE (var) == REALPART_EXPR || TREE_CODE (var) == IMAGPART_EXPR
943 || handled_component_p (var))
944 var = TREE_OPERAND (var, 0);
946 #ifdef ENABLE_CHECKING
947 /* Treating GIMPLE registers as virtual variables makes no sense.
948 Also complain if we couldn't extract a _DECL out of the original
951 || is_gimple_reg (var))
959 /* Mark variables in BLOCK that have hidden uses. A hidden use can
960 occur due to VLA declarations or nested functions. */
963 find_hidden_use_vars (tree block)
967 /* Check all the arrays declared in the block for VLAs.
968 While scanning the block's variables, also see if there is
969 a nested function at this scope. */
970 for (decl = BLOCK_VARS (block); decl; decl = TREE_CHAIN (decl))
973 walk_tree (&decl, find_hidden_use_vars_r, &inside_vla, NULL);
976 /* Now repeat the search in any sub-blocks. */
977 for (sub = BLOCK_SUBBLOCKS (block); sub; sub = TREE_CHAIN (sub))
978 find_hidden_use_vars (sub);
980 /* A VLA parameter may use a variable which as set from another
981 parameter to declare the size of the VLA. We need to mark the
982 variable as having a hidden use since it is used to declare the
983 VLA parameter and that declaration is not seen by the SSA code.
985 Note get_pending_sizes clears the PENDING_SIZES chain, so we
987 tem = get_pending_sizes ();
988 put_pending_sizes (tem);
989 for (; tem; tem = TREE_CHAIN (tem))
992 walk_tree (&TREE_VALUE (tem), find_hidden_use_vars_r, &inside_vla, NULL);
997 /* Callback for walk_tree used by find_hidden_use_vars to analyze each
998 variable in a lexical block. If the variable's size has a variable
999 size, then mark all objects needed to compute the variable's size
1000 as having hidden uses. */
1003 find_hidden_use_vars_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
1004 void *data ATTRIBUTE_UNUSED)
1006 int *inside_vla = (int *) data;
1008 /* We need to look for hidden uses due to VLAs in variable
1009 definitions. We originally used to look for these hidden
1010 uses in the variable's type, but that's unreliable if the
1011 type's size contains a SAVE_EXPR for a different function
1012 context than the variable is used within. */
1014 && ((DECL_SIZE (*tp)
1015 && ! really_constant_p (DECL_SIZE (*tp)))
1016 || (DECL_SIZE_UNIT (*tp)
1017 && ! really_constant_p (DECL_SIZE_UNIT (*tp)))))
1019 int save = *inside_vla;
1022 walk_tree (&DECL_SIZE (*tp), find_hidden_use_vars_r, inside_vla, NULL);
1023 walk_tree (&DECL_SIZE_UNIT (*tp), find_hidden_use_vars_r,
1027 else if (*inside_vla && SSA_VAR_P (*tp))
1028 set_has_hidden_use (*tp);
1034 /* Add a temporary variable to REFERENCED_VARS. This is similar to
1035 add_referenced_var, but is used by passes that need to add new temps to
1036 the REFERENCED_VARS array after the program has been scanned for
1037 variables. The variable will just receive a new UID and be added
1038 to the REFERENCED_VARS array without checking for duplicates. */
1041 add_referenced_tmp_var (tree var)
1043 add_referenced_var (var, NULL);
1046 /* Return true if V_MAY_DEFS_AFTER contains fewer entries than
1047 V_MAY_DEFS_BEFORE. Note that this assumes that both varrays
1048 are V_MAY_DEF operands for the same statement. */
1051 v_may_defs_disappeared_p (v_may_def_optype v_may_defs_before,
1052 v_may_def_optype v_may_defs_after)
1054 /* If there was nothing before, nothing could've disappeared. */
1055 if (v_may_defs_before == NULL)
1058 /* All/some of them gone. */
1059 if (v_may_defs_after == NULL
1060 || NUM_V_MAY_DEFS (v_may_defs_before) >
1061 NUM_V_MAY_DEFS (v_may_defs_after))
1067 /* Return true if V_MUST_DEFS_AFTER contains fewer entries than
1068 V_MUST_DEFS_BEFORE. Note that this assumes that both varrays
1069 are V_MUST_DEF operands for the same statement. */
1072 v_must_defs_disappeared_p (v_must_def_optype v_must_defs_before,
1073 v_must_def_optype v_must_defs_after)
1075 /* If there was nothing before, nothing could've disappeared. */
1076 if (v_must_defs_before == NULL)
1079 /* All/some of them gone. */
1080 if (v_must_defs_after == NULL
1081 || NUM_V_MUST_DEFS (v_must_defs_before) >
1082 NUM_V_MUST_DEFS (v_must_defs_after))
1089 /* Add all the non-SSA variables found in STMT's operands to the bitmap
1093 mark_new_vars_to_rename (tree stmt, bitmap vars_to_rename)
1097 v_may_def_optype v_may_defs;
1099 v_must_def_optype v_must_defs;
1101 bitmap vars_in_vops_to_rename;
1102 bool found_exposed_symbol = false;
1103 v_may_def_optype v_may_defs_before, v_may_defs_after;
1104 v_must_def_optype v_must_defs_before, v_must_defs_after;
1107 vars_in_vops_to_rename = BITMAP_XMALLOC ();
1109 /* Before re-scanning the statement for operands, mark the existing
1110 virtual operands to be renamed again. We do this because when new
1111 symbols are exposed, the virtual operands that were here before due to
1112 aliasing will probably be removed by the call to get_stmt_operand.
1113 Therefore, we need to flag them to be renamed beforehand.
1115 We flag them in a separate bitmap because we don't really want to
1116 rename them if there are not any newly exposed symbols in the
1117 statement operands. */
1118 ann = stmt_ann (stmt);
1119 v_may_defs_before = v_may_defs = V_MAY_DEF_OPS (ann);
1120 for (i = 0; i < NUM_V_MAY_DEFS (v_may_defs); i++)
1122 tree var = V_MAY_DEF_RESULT (v_may_defs, i);
1124 var = SSA_NAME_VAR (var);
1125 bitmap_set_bit (vars_in_vops_to_rename, var_ann (var)->uid);
1128 vuses = VUSE_OPS (ann);
1129 for (i = 0; i < NUM_VUSES (vuses); i++)
1131 tree var = VUSE_OP (vuses, i);
1133 var = SSA_NAME_VAR (var);
1134 bitmap_set_bit (vars_in_vops_to_rename, var_ann (var)->uid);
1137 v_must_defs_before = v_must_defs = V_MUST_DEF_OPS (ann);
1138 for (i = 0; i < NUM_V_MUST_DEFS (v_must_defs); i++)
1140 tree var = V_MUST_DEF_OP (v_must_defs, i);
1142 var = SSA_NAME_VAR (var);
1143 bitmap_set_bit (vars_in_vops_to_rename, var_ann (var)->uid);
1146 /* Now force an operand re-scan on the statement and mark any newly
1147 exposed variables. */
1149 get_stmt_operands (stmt);
1151 defs = DEF_OPS (ann);
1152 for (i = 0; i < NUM_DEFS (defs); i++)
1154 tree var = DEF_OP (defs, i);
1157 found_exposed_symbol = true;
1158 bitmap_set_bit (vars_to_rename, var_ann (var)->uid);
1162 uses = USE_OPS (ann);
1163 for (i = 0; i < NUM_USES (uses); i++)
1165 tree var = USE_OP (uses, i);
1168 found_exposed_symbol = true;
1169 bitmap_set_bit (vars_to_rename, var_ann (var)->uid);
1173 v_may_defs_after = v_may_defs = V_MAY_DEF_OPS (ann);
1174 for (i = 0; i < NUM_V_MAY_DEFS (v_may_defs); i++)
1176 tree var = V_MAY_DEF_RESULT (v_may_defs, i);
1179 found_exposed_symbol = true;
1180 bitmap_set_bit (vars_to_rename, var_ann (var)->uid);
1184 vuses = VUSE_OPS (ann);
1185 for (i = 0; i < NUM_VUSES (vuses); i++)
1187 tree var = VUSE_OP (vuses, i);
1190 found_exposed_symbol = true;
1191 bitmap_set_bit (vars_to_rename, var_ann (var)->uid);
1195 v_must_defs_after = v_must_defs = V_MUST_DEF_OPS (ann);
1196 for (i = 0; i < NUM_V_MUST_DEFS (v_must_defs); i++)
1198 tree var = V_MUST_DEF_OP (v_must_defs, i);
1201 found_exposed_symbol = true;
1202 bitmap_set_bit (vars_to_rename, var_ann (var)->uid);
1206 /* If we found any newly exposed symbols, or if there are fewer VDEF
1207 operands in the statement, add the variables we had set in
1208 VARS_IN_VOPS_TO_RENAME to VARS_TO_RENAME. We need to check for
1209 vanishing VDEFs because in those cases, the names that were formerly
1210 generated by this statement are not going to be available anymore. */
1211 if (found_exposed_symbol
1212 || v_may_defs_disappeared_p (v_may_defs_before, v_may_defs_after)
1213 || v_must_defs_disappeared_p (v_must_defs_before, v_must_defs_after))
1214 bitmap_a_or_b (vars_to_rename, vars_to_rename, vars_in_vops_to_rename);
1216 BITMAP_XFREE (vars_in_vops_to_rename);