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);
506 add_referenced_tmp_var (t);
507 bitmap_set_bit (vars_to_rename, var_ann (t)->uid);
514 /*---------------------------------------------------------------------------
516 ---------------------------------------------------------------------------*/
517 /* Dump the list of all the referenced variables in the current function to
521 dump_referenced_vars (FILE *file)
525 fprintf (file, "\nReferenced variables in %s: %u\n\n",
526 get_name (current_function_decl), (unsigned) num_referenced_vars);
528 for (i = 0; i < num_referenced_vars; i++)
530 tree var = referenced_var (i);
531 fprintf (file, "Variable: ");
532 dump_variable (file, var);
533 fprintf (file, "\n");
538 /* Dump the list of all the referenced variables to stderr. */
541 debug_referenced_vars (void)
543 dump_referenced_vars (stderr);
547 /* Dump variable VAR and its may-aliases to FILE. */
550 dump_variable (FILE *file, tree var)
554 if (TREE_CODE (var) == SSA_NAME)
556 if (POINTER_TYPE_P (TREE_TYPE (var)))
557 dump_points_to_info_for (file, var);
558 var = SSA_NAME_VAR (var);
561 if (var == NULL_TREE)
563 fprintf (file, "<nil>");
567 print_generic_expr (file, var, dump_flags);
571 fprintf (file, ", UID %u", (unsigned) ann->uid);
573 if (ann->has_hidden_use)
574 fprintf (file, ", has hidden uses");
576 if (ann->type_mem_tag)
578 fprintf (file, ", type memory tag: ");
579 print_generic_expr (file, ann->type_mem_tag, dump_flags);
582 if (ann->is_alias_tag)
583 fprintf (file, ", is an alias tag");
585 if (needs_to_live_in_memory (var))
586 fprintf (file, ", is %s", TREE_STATIC (var) ? "static" : "global");
588 if (is_call_clobbered (var))
589 fprintf (file, ", call clobbered");
591 if (ann->default_def)
593 fprintf (file, ", default def: ");
594 print_generic_expr (file, ann->default_def, dump_flags);
597 if (ann->may_aliases)
599 fprintf (file, ", may aliases: ");
600 dump_may_aliases_for (file, var);
603 fprintf (file, "\n");
607 /* Dump variable VAR and its may-aliases to stderr. */
610 debug_variable (tree var)
612 dump_variable (stderr, var);
616 /* Dump def-use edges on FILE. */
619 dump_immediate_uses (FILE *file)
622 block_stmt_iterator si;
624 = lang_hooks.decl_printable_name (current_function_decl, 2);
626 fprintf (file, "\nDef-use edges for function %s\n", funcname);
632 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
633 dump_immediate_uses_for (file, phi);
635 for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
636 dump_immediate_uses_for (file, bsi_stmt (si));
639 fprintf (file, "\n");
643 /* Dump def-use edges on stderr. */
646 debug_immediate_uses (void)
648 dump_immediate_uses (stderr);
652 /* Dump all immediate uses for STMT on FILE. */
655 dump_immediate_uses_for (FILE *file, tree stmt)
657 dataflow_t df = get_immediate_uses (stmt);
658 int num_imm_uses = num_immediate_uses (df);
660 if (num_imm_uses > 0)
664 fprintf (file, "-> ");
665 print_generic_stmt (file, stmt, TDF_SLIM);
666 fprintf (file, "\n");
668 for (i = 0; i < num_imm_uses; i++)
670 fprintf (file, "\t");
671 print_generic_stmt (file, immediate_use (df, i), TDF_SLIM);
672 fprintf (file, "\n");
675 fprintf (file, "\n");
680 /* Dump immediate uses for STMT on stderr. */
683 debug_immediate_uses_for (tree stmt)
685 dump_immediate_uses_for (stderr, stmt);
689 /* Dump various DFA statistics to FILE. */
692 dump_dfa_stats (FILE *file)
694 struct dfa_stats_d dfa_stats;
696 unsigned long size, total = 0;
697 const char * const fmt_str = "%-30s%-13s%12s\n";
698 const char * const fmt_str_1 = "%-30s%13lu%11lu%c\n";
699 const char * const fmt_str_3 = "%-43s%11lu%c\n";
701 = lang_hooks.decl_printable_name (current_function_decl, 2);
703 collect_dfa_stats (&dfa_stats);
705 fprintf (file, "\nDFA Statistics for %s\n\n", funcname);
707 fprintf (file, "---------------------------------------------------------\n");
708 fprintf (file, fmt_str, "", " Number of ", "Memory");
709 fprintf (file, fmt_str, "", " instances ", "used ");
710 fprintf (file, "---------------------------------------------------------\n");
712 size = num_referenced_vars * sizeof (tree);
714 fprintf (file, fmt_str_1, "Referenced variables", num_referenced_vars,
715 SCALE (size), LABEL (size));
717 size = dfa_stats.num_stmt_anns * sizeof (struct stmt_ann_d);
719 fprintf (file, fmt_str_1, "Statements annotated", dfa_stats.num_stmt_anns,
720 SCALE (size), LABEL (size));
722 size = dfa_stats.num_var_anns * sizeof (struct var_ann_d);
724 fprintf (file, fmt_str_1, "Variables annotated", dfa_stats.num_var_anns,
725 SCALE (size), LABEL (size));
727 size = dfa_stats.num_uses * sizeof (tree *);
729 fprintf (file, fmt_str_1, "USE operands", dfa_stats.num_uses,
730 SCALE (size), LABEL (size));
732 size = dfa_stats.num_defs * sizeof (tree *);
734 fprintf (file, fmt_str_1, "DEF operands", dfa_stats.num_defs,
735 SCALE (size), LABEL (size));
737 size = dfa_stats.num_vuses * sizeof (tree *);
739 fprintf (file, fmt_str_1, "VUSE operands", dfa_stats.num_vuses,
740 SCALE (size), LABEL (size));
742 size = dfa_stats.num_v_may_defs * sizeof (tree *);
744 fprintf (file, fmt_str_1, "V_MAY_DEF operands", dfa_stats.num_v_may_defs,
745 SCALE (size), LABEL (size));
747 size = dfa_stats.num_v_must_defs * sizeof (tree *);
749 fprintf (file, fmt_str_1, "V_MUST_DEF operands", dfa_stats.num_v_must_defs,
750 SCALE (size), LABEL (size));
752 size = dfa_stats.num_phis * sizeof (struct tree_phi_node);
754 fprintf (file, fmt_str_1, "PHI nodes", dfa_stats.num_phis,
755 SCALE (size), LABEL (size));
757 size = dfa_stats.num_phi_args * sizeof (struct phi_arg_d);
759 fprintf (file, fmt_str_1, "PHI arguments", dfa_stats.num_phi_args,
760 SCALE (size), LABEL (size));
762 fprintf (file, "---------------------------------------------------------\n");
763 fprintf (file, fmt_str_3, "Total memory used by DFA/SSA data", SCALE (total),
765 fprintf (file, "---------------------------------------------------------\n");
766 fprintf (file, "\n");
768 if (dfa_stats.num_phis)
769 fprintf (file, "Average number of arguments per PHI node: %.1f (max: %d)\n",
770 (float) dfa_stats.num_phi_args / (float) dfa_stats.num_phis,
771 dfa_stats.max_num_phi_args);
773 fprintf (file, "\n");
777 /* Dump DFA statistics on stderr. */
780 debug_dfa_stats (void)
782 dump_dfa_stats (stderr);
786 /* Collect DFA statistics and store them in the structure pointed by
790 collect_dfa_stats (struct dfa_stats_d *dfa_stats_p)
794 block_stmt_iterator i;
796 if (dfa_stats_p == NULL)
799 memset ((void *)dfa_stats_p, 0, sizeof (struct dfa_stats_d));
801 /* Walk all the trees in the function counting references. Start at
802 basic block 0, but don't stop at block boundaries. */
803 htab = htab_create (30, htab_hash_pointer, htab_eq_pointer, NULL);
805 for (i = bsi_start (BASIC_BLOCK (0)); !bsi_end_p (i); bsi_next (&i))
806 walk_tree (bsi_stmt_ptr (i), collect_dfa_stats_r, (void *) dfa_stats_p,
814 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
816 dfa_stats_p->num_phis++;
817 dfa_stats_p->num_phi_args += PHI_NUM_ARGS (phi);
818 if (PHI_NUM_ARGS (phi) > dfa_stats_p->max_num_phi_args)
819 dfa_stats_p->max_num_phi_args = PHI_NUM_ARGS (phi);
825 /* Callback for walk_tree to collect DFA statistics for a tree and its
829 collect_dfa_stats_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
833 struct dfa_stats_d *dfa_stats_p = (struct dfa_stats_d *)data;
837 switch (ann_type (t->common.ann))
841 stmt_ann_t ann = (stmt_ann_t) t->common.ann;
842 dfa_stats_p->num_stmt_anns++;
843 dfa_stats_p->num_defs += NUM_DEFS (DEF_OPS (ann));
844 dfa_stats_p->num_uses += NUM_USES (USE_OPS (ann));
845 dfa_stats_p->num_v_may_defs +=
846 NUM_V_MAY_DEFS (V_MAY_DEF_OPS (ann));
847 dfa_stats_p->num_vuses += NUM_VUSES (VUSE_OPS (ann));
848 dfa_stats_p->num_v_must_defs +=
849 NUM_V_MUST_DEFS (V_MUST_DEF_OPS (ann));
854 dfa_stats_p->num_var_anns++;
866 /*---------------------------------------------------------------------------
867 Miscellaneous helpers
868 ---------------------------------------------------------------------------*/
869 /* Callback for walk_tree. Used to collect variables referenced in
873 find_vars_r (tree *tp, int *walk_subtrees, void *data)
875 struct walk_state *walk_state = (struct walk_state *) data;
877 /* If T is a regular variable that the optimizers are interested
878 in, add it to the list of variables. */
880 add_referenced_var (*tp, walk_state);
882 /* Type, _DECL and constant nodes have no interesting children.
884 else if (DECL_P (*tp)
886 || TREE_CODE_CLASS (TREE_CODE (*tp)) == 'c')
893 /* Add VAR to the list of dereferenced variables.
895 WALK_STATE contains a hash table used to avoid adding the same
896 variable more than once. Note that this function assumes that
897 VAR is a valid SSA variable. If WALK_STATE is NULL, no
898 duplicate checking is done. */
901 add_referenced_var (tree var, struct walk_state *walk_state)
906 v_ann = get_var_ann (var);
909 slot = htab_find_slot (walk_state->vars_found, (void *) var, INSERT);
913 if (slot == NULL || *slot == NULL)
915 /* This is the first time we find this variable, add it to the
916 REFERENCED_VARS array and annotate it with attributes that are
917 intrinsic to the variable. */
919 *slot = (void *) var;
920 v_ann->uid = num_referenced_vars;
921 VARRAY_PUSH_TREE (referenced_vars, var);
923 /* Global and static variables are call-clobbered, always. */
924 if (needs_to_live_in_memory (var))
925 mark_call_clobbered (var);
927 /* DECL_NONLOCAL variables should not be removed, as they are needed
928 to emit nested functions. */
929 if (DECL_NONLOCAL (var))
935 /* Return the virtual variable associated to the non-scalar variable VAR. */
938 get_virtual_var (tree var)
942 if (TREE_CODE (var) == SSA_NAME)
943 var = SSA_NAME_VAR (var);
945 while (TREE_CODE (var) == REALPART_EXPR || TREE_CODE (var) == IMAGPART_EXPR
946 || handled_component_p (var))
947 var = TREE_OPERAND (var, 0);
949 #ifdef ENABLE_CHECKING
950 /* Treating GIMPLE registers as virtual variables makes no sense.
951 Also complain if we couldn't extract a _DECL out of the original
954 || is_gimple_reg (var))
962 /* Mark variables in BLOCK that have hidden uses. A hidden use can
963 occur due to VLA declarations or nested functions. */
966 find_hidden_use_vars (tree block)
970 /* Check all the arrays declared in the block for VLAs.
971 While scanning the block's variables, also see if there is
972 a nested function at this scope. */
973 for (decl = BLOCK_VARS (block); decl; decl = TREE_CHAIN (decl))
976 walk_tree (&decl, find_hidden_use_vars_r, &inside_vla, NULL);
979 /* Now repeat the search in any sub-blocks. */
980 for (sub = BLOCK_SUBBLOCKS (block); sub; sub = TREE_CHAIN (sub))
981 find_hidden_use_vars (sub);
983 /* A VLA parameter may use a variable which as set from another
984 parameter to declare the size of the VLA. We need to mark the
985 variable as having a hidden use since it is used to declare the
986 VLA parameter and that declaration is not seen by the SSA code.
988 Note get_pending_sizes clears the PENDING_SIZES chain, so we
990 tem = get_pending_sizes ();
991 put_pending_sizes (tem);
992 for (; tem; tem = TREE_CHAIN (tem))
995 walk_tree (&TREE_VALUE (tem), find_hidden_use_vars_r, &inside_vla, NULL);
1000 /* Callback for walk_tree used by find_hidden_use_vars to analyze each
1001 variable in a lexical block. If the variable's size has a variable
1002 size, then mark all objects needed to compute the variable's size
1003 as having hidden uses. */
1006 find_hidden_use_vars_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
1007 void *data ATTRIBUTE_UNUSED)
1009 int *inside_vla = (int *) data;
1011 /* We need to look for hidden uses due to VLAs in variable
1012 definitions. We originally used to look for these hidden
1013 uses in the variable's type, but that's unreliable if the
1014 type's size contains a SAVE_EXPR for a different function
1015 context than the variable is used within. */
1017 && ((DECL_SIZE (*tp)
1018 && ! really_constant_p (DECL_SIZE (*tp)))
1019 || (DECL_SIZE_UNIT (*tp)
1020 && ! really_constant_p (DECL_SIZE_UNIT (*tp)))))
1022 int save = *inside_vla;
1025 walk_tree (&DECL_SIZE (*tp), find_hidden_use_vars_r, inside_vla, NULL);
1026 walk_tree (&DECL_SIZE_UNIT (*tp), find_hidden_use_vars_r,
1030 else if (*inside_vla && SSA_VAR_P (*tp))
1031 set_has_hidden_use (*tp);
1037 /* Add a temporary variable to REFERENCED_VARS. This is similar to
1038 add_referenced_var, but is used by passes that need to add new temps to
1039 the REFERENCED_VARS array after the program has been scanned for
1040 variables. The variable will just receive a new UID and be added
1041 to the REFERENCED_VARS array without checking for duplicates. */
1044 add_referenced_tmp_var (tree var)
1046 add_referenced_var (var, NULL);
1049 /* Return true if V_MAY_DEFS_AFTER contains fewer entries than
1050 V_MAY_DEFS_BEFORE. Note that this assumes that both varrays
1051 are V_MAY_DEF operands for the same statement. */
1054 v_may_defs_disappeared_p (v_may_def_optype v_may_defs_before,
1055 v_may_def_optype v_may_defs_after)
1057 /* If there was nothing before, nothing could've disappeared. */
1058 if (v_may_defs_before == NULL)
1061 /* All/some of them gone. */
1062 if (v_may_defs_after == NULL
1063 || NUM_V_MAY_DEFS (v_may_defs_before) >
1064 NUM_V_MAY_DEFS (v_may_defs_after))
1070 /* Return true if V_MUST_DEFS_AFTER contains fewer entries than
1071 V_MUST_DEFS_BEFORE. Note that this assumes that both varrays
1072 are V_MUST_DEF operands for the same statement. */
1075 v_must_defs_disappeared_p (v_must_def_optype v_must_defs_before,
1076 v_must_def_optype v_must_defs_after)
1078 /* If there was nothing before, nothing could've disappeared. */
1079 if (v_must_defs_before == NULL)
1082 /* All/some of them gone. */
1083 if (v_must_defs_after == NULL
1084 || NUM_V_MUST_DEFS (v_must_defs_before) >
1085 NUM_V_MUST_DEFS (v_must_defs_after))
1092 /* Add all the non-SSA variables found in STMT's operands to the bitmap
1096 mark_new_vars_to_rename (tree stmt, bitmap vars_to_rename)
1100 v_may_def_optype v_may_defs;
1102 v_must_def_optype v_must_defs;
1104 bitmap vars_in_vops_to_rename;
1105 bool found_exposed_symbol = false;
1106 v_may_def_optype v_may_defs_before, v_may_defs_after;
1107 v_must_def_optype v_must_defs_before, v_must_defs_after;
1110 vars_in_vops_to_rename = BITMAP_XMALLOC ();
1112 /* Before re-scanning the statement for operands, mark the existing
1113 virtual operands to be renamed again. We do this because when new
1114 symbols are exposed, the virtual operands that were here before due to
1115 aliasing will probably be removed by the call to get_stmt_operand.
1116 Therefore, we need to flag them to be renamed beforehand.
1118 We flag them in a separate bitmap because we don't really want to
1119 rename them if there are not any newly exposed symbols in the
1120 statement operands. */
1121 ann = stmt_ann (stmt);
1122 v_may_defs_before = v_may_defs = V_MAY_DEF_OPS (ann);
1123 for (i = 0; i < NUM_V_MAY_DEFS (v_may_defs); i++)
1125 tree var = V_MAY_DEF_RESULT (v_may_defs, i);
1127 var = SSA_NAME_VAR (var);
1128 bitmap_set_bit (vars_in_vops_to_rename, var_ann (var)->uid);
1131 vuses = VUSE_OPS (ann);
1132 for (i = 0; i < NUM_VUSES (vuses); i++)
1134 tree var = VUSE_OP (vuses, i);
1136 var = SSA_NAME_VAR (var);
1137 bitmap_set_bit (vars_in_vops_to_rename, var_ann (var)->uid);
1140 v_must_defs_before = v_must_defs = V_MUST_DEF_OPS (ann);
1141 for (i = 0; i < NUM_V_MUST_DEFS (v_must_defs); i++)
1143 tree var = V_MUST_DEF_OP (v_must_defs, i);
1145 var = SSA_NAME_VAR (var);
1146 bitmap_set_bit (vars_in_vops_to_rename, var_ann (var)->uid);
1149 /* Now force an operand re-scan on the statement and mark any newly
1150 exposed variables. */
1152 get_stmt_operands (stmt);
1154 defs = DEF_OPS (ann);
1155 for (i = 0; i < NUM_DEFS (defs); i++)
1157 tree var = DEF_OP (defs, i);
1160 found_exposed_symbol = true;
1161 bitmap_set_bit (vars_to_rename, var_ann (var)->uid);
1165 uses = USE_OPS (ann);
1166 for (i = 0; i < NUM_USES (uses); i++)
1168 tree var = USE_OP (uses, i);
1171 found_exposed_symbol = true;
1172 bitmap_set_bit (vars_to_rename, var_ann (var)->uid);
1176 v_may_defs_after = v_may_defs = V_MAY_DEF_OPS (ann);
1177 for (i = 0; i < NUM_V_MAY_DEFS (v_may_defs); i++)
1179 tree var = V_MAY_DEF_RESULT (v_may_defs, i);
1182 found_exposed_symbol = true;
1183 bitmap_set_bit (vars_to_rename, var_ann (var)->uid);
1187 vuses = VUSE_OPS (ann);
1188 for (i = 0; i < NUM_VUSES (vuses); i++)
1190 tree var = VUSE_OP (vuses, i);
1193 found_exposed_symbol = true;
1194 bitmap_set_bit (vars_to_rename, var_ann (var)->uid);
1198 v_must_defs_after = v_must_defs = V_MUST_DEF_OPS (ann);
1199 for (i = 0; i < NUM_V_MUST_DEFS (v_must_defs); i++)
1201 tree var = V_MUST_DEF_OP (v_must_defs, i);
1204 found_exposed_symbol = true;
1205 bitmap_set_bit (vars_to_rename, var_ann (var)->uid);
1209 /* If we found any newly exposed symbols, or if there are fewer VDEF
1210 operands in the statement, add the variables we had set in
1211 VARS_IN_VOPS_TO_RENAME to VARS_TO_RENAME. We need to check for
1212 vanishing VDEFs because in those cases, the names that were formerly
1213 generated by this statement are not going to be available anymore. */
1214 if (found_exposed_symbol
1215 || v_may_defs_disappeared_p (v_may_defs_before, v_may_defs_after)
1216 || v_must_defs_disappeared_p (v_must_defs_before, v_must_defs_after))
1217 bitmap_a_or_b (vars_to_rename, vars_to_rename, vars_in_vops_to_rename);
1219 BITMAP_XFREE (vars_in_vops_to_rename);