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-simple.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. */
67 /* State information for find_vars_r. */
70 /* Hash table used to avoid adding the same variable more than once. */
75 /* Local functions. */
76 static void collect_dfa_stats (struct dfa_stats_d *);
77 static tree collect_dfa_stats_r (tree *, int *, void *);
78 static void add_immediate_use (tree, tree);
79 static tree find_vars_r (tree *, int *, void *);
80 static void add_referenced_var (tree, struct walk_state *);
81 static void compute_immediate_uses_for_phi (tree, bool (*)(tree));
82 static void compute_immediate_uses_for_stmt (tree, int, bool (*)(tree));
83 static void find_hidden_use_vars (tree);
84 static tree find_hidden_use_vars_r (tree *, int *, void *);
87 /* Global declarations. */
89 /* Array of all variables referenced in the function. */
90 varray_type referenced_vars;
93 /*---------------------------------------------------------------------------
94 Dataflow analysis (DFA) routines
95 ---------------------------------------------------------------------------*/
96 /* Find all the variables referenced in the function. This function
97 builds the global arrays REFERENCED_VARS and CALL_CLOBBERED_VARS.
99 Note that this function does not look for statement operands, it simply
100 determines what variables are referenced in the program and detects
101 various attributes for each variable used by alias analysis and the
105 find_referenced_vars (void)
109 block_stmt_iterator si;
110 struct walk_state walk_state;
113 /* This is the very first pass in preparation for building the SSA
114 form of the function, so initialize internal data structures now. */
117 /* Walk the lexical blocks in the function looking for variables that may
118 have been used to declare VLAs and for nested functions. Both
119 constructs create hidden uses of variables.
121 Note that at this point we may have multiple blocks hung off
122 DECL_INITIAL chained through the BLOCK_CHAIN field due to
123 how inlining works. Egad. */
124 block = DECL_INITIAL (current_function_decl);
127 find_hidden_use_vars (block);
128 block = BLOCK_CHAIN (block);
131 vars_found = htab_create (50, htab_hash_pointer, htab_eq_pointer, NULL);
132 memset (&walk_state, 0, sizeof (walk_state));
133 walk_state.vars_found = vars_found;
136 for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
138 tree *stmt_p = bsi_stmt_ptr (si);
139 walk_tree (stmt_p, find_vars_r, &walk_state, NULL);
142 htab_delete (vars_found);
145 struct tree_opt_pass pass_referenced_vars =
149 find_referenced_vars, /* execute */
152 0, /* static_pass_number */
154 PROP_gimple_leh | PROP_cfg, /* properties_required */
155 PROP_referenced_vars, /* properties_provided */
156 0, /* properties_destroyed */
157 0, /* todo_flags_start */
158 0, /* todo_flags_finish */
162 /* Compute immediate uses.
164 CALC_FOR is an optional function pointer which indicates whether
165 immediate uses information should be calculated for a given SSA
166 variable. If NULL, then information is computed for all
169 FLAGS is one of {TDFA_USE_OPS, TDFA_USE_VOPS}. It is used by
170 compute_immediate_uses_for_stmt to determine whether to look at
171 virtual and/or real operands while computing def-use chains. */
174 compute_immediate_uses (int flags, bool (*calc_for)(tree))
177 block_stmt_iterator si;
183 for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
184 compute_immediate_uses_for_phi (phi, calc_for);
186 for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
188 tree stmt = bsi_stmt (si);
189 get_stmt_operands (stmt);
190 compute_immediate_uses_for_stmt (stmt, flags, calc_for);
196 /* Invalidates dataflow information for a statement STMT. */
199 free_df_for_stmt (tree stmt)
201 stmt_ann_t ann = stmt_ann (stmt);
205 /* If we have a varray of immediate uses, then go ahead and release
207 if (ann->df->immediate_uses)
208 ggc_free (ann->df->immediate_uses);
210 /* Similarly for the main dataflow structure. */
217 /* Invalidate dataflow information for the whole function. */
223 block_stmt_iterator si;
229 for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
230 free_df_for_stmt (phi);
232 for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
234 tree stmt = bsi_stmt (si);
235 free_df_for_stmt (stmt);
241 /* Helper for compute_immediate_uses. Check all the USE and/or VUSE
242 operands in phi node PHI and add a def-use edge between their
243 defining statement and PHI. CALC_FOR is as in
244 compute_immediate_uses.
246 PHI nodes are easy, we only need to look at their arguments. */
249 compute_immediate_uses_for_phi (tree phi, bool (*calc_for)(tree))
253 #ifdef ENABLE_CHECKING
254 if (TREE_CODE (phi) != PHI_NODE)
258 for (i = 0; i < PHI_NUM_ARGS (phi); i++)
260 tree arg = PHI_ARG_DEF (phi, i);
262 if (TREE_CODE (arg) == SSA_NAME && (!calc_for || calc_for (arg)))
264 tree imm_rdef_stmt = SSA_NAME_DEF_STMT (PHI_ARG_DEF (phi, i));
265 if (!IS_EMPTY_STMT (imm_rdef_stmt))
266 add_immediate_use (imm_rdef_stmt, phi);
272 /* Another helper for compute_immediate_uses. Depending on the value
273 of FLAGS, check all the USE and/or VUSE operands in STMT and add a
274 def-use edge between their defining statement and STMT. CALC_FOR
275 is as in compute_immediate_uses. */
278 compute_immediate_uses_for_stmt (tree stmt, int flags, bool (*calc_for)(tree))
286 #ifdef ENABLE_CHECKING
287 /* PHI nodes are handled elsewhere. */
288 if (TREE_CODE (stmt) == PHI_NODE)
292 /* Look at USE_OPS or VUSE_OPS according to FLAGS. */
293 ann = stmt_ann (stmt);
294 if (flags & TDFA_USE_OPS)
296 uses = USE_OPS (ann);
297 for (i = 0; i < NUM_USES (uses); i++)
299 tree use = USE_OP (uses, i);
300 tree imm_stmt = SSA_NAME_DEF_STMT (use);
301 if (!IS_EMPTY_STMT (imm_stmt) && (!calc_for || calc_for (use)))
302 add_immediate_use (imm_stmt, stmt);
306 if (flags & TDFA_USE_VOPS)
308 vuses = VUSE_OPS (ann);
309 for (i = 0; i < NUM_VUSES (vuses); i++)
311 tree vuse = VUSE_OP (vuses, i);
312 tree imm_rdef_stmt = SSA_NAME_DEF_STMT (vuse);
313 if (!IS_EMPTY_STMT (imm_rdef_stmt) && (!calc_for || calc_for (vuse)))
314 add_immediate_use (imm_rdef_stmt, stmt);
317 vdefs = VDEF_OPS (ann);
318 for (i = 0; i < NUM_VDEFS (vdefs); i++)
320 tree vuse = VDEF_OP (vdefs, i);
321 tree imm_rdef_stmt = SSA_NAME_DEF_STMT (vuse);
322 if (!IS_EMPTY_STMT (imm_rdef_stmt) && (!calc_for || calc_for (vuse)))
323 add_immediate_use (imm_rdef_stmt, stmt);
329 /* Add statement USE_STMT to the list of statements that use definitions
333 add_immediate_use (tree stmt, tree use_stmt)
335 stmt_ann_t ann = get_stmt_ann (stmt);
336 struct dataflow_d *df;
341 df = ann->df = ggc_alloc (sizeof (struct dataflow_d));
342 memset ((void *) df, 0, sizeof (struct dataflow_d));
343 df->uses[0] = use_stmt;
349 df->uses[1] = use_stmt;
353 if (ann->df->immediate_uses == NULL)
354 VARRAY_TREE_INIT (ann->df->immediate_uses, 4, "immediate_uses");
356 VARRAY_PUSH_TREE (ann->df->immediate_uses, use_stmt);
360 /* If the immediate use of USE points to OLD, then redirect it to NEW. */
363 redirect_immediate_use (tree use, tree old, tree new)
365 tree imm_stmt = SSA_NAME_DEF_STMT (use);
366 struct dataflow_d *df = get_stmt_ann (imm_stmt)->df;
367 unsigned int num_uses = num_immediate_uses (df);
370 for (i = 0; i < num_uses; i++)
372 if (immediate_use (df, i) == old)
374 if (i == 0 || i == 1)
377 VARRAY_TREE (df->immediate_uses, i - 2) = new;
383 /* Redirect all immediate uses for operands in OLD so that they point
384 to NEW. This routine should have no knowledge of how immediate
388 redirect_immediate_uses (tree old, tree new)
390 stmt_ann_t ann = get_stmt_ann (old);
391 use_optype uses = USE_OPS (ann);
392 vuse_optype vuses = VUSE_OPS (ann);
393 vdef_optype vdefs = VDEF_OPS (ann);
396 /* Look at USE_OPS or VUSE_OPS according to FLAGS. */
397 for (i = 0; i < NUM_USES (uses); i++)
398 redirect_immediate_use (USE_OP (uses, i), old, new);
400 for (i = 0; i < NUM_VUSES (vuses); i++)
401 redirect_immediate_use (VUSE_OP (vuses, i), old, new);
403 for (i = 0; i < NUM_VDEFS (vdefs); i++)
404 redirect_immediate_use (VDEF_OP (vdefs, i), old, new);
408 /*---------------------------------------------------------------------------
410 ---------------------------------------------------------------------------*/
411 /* Create a new annotation for a _DECL node T. */
414 create_var_ann (tree t)
418 #if defined ENABLE_CHECKING
422 && t->common.ann->common.type != VAR_ANN))
426 ann = ggc_alloc (sizeof (*ann));
427 memset ((void *) ann, 0, sizeof (*ann));
429 ann->common.type = VAR_ANN;
431 t->common.ann = (tree_ann) ann;
437 /* Create a new annotation for a statement node T. */
440 create_stmt_ann (tree t)
444 #if defined ENABLE_CHECKING
445 if ((!is_gimple_stmt (t) && !is_essa_node (t))
447 && t->common.ann->common.type != STMT_ANN))
451 ann = ggc_alloc (sizeof (*ann));
452 memset ((void *) ann, 0, sizeof (*ann));
454 ann->common.type = STMT_ANN;
456 /* Since we just created the annotation, mark the statement modified. */
457 ann->modified = true;
459 t->common.ann = (tree_ann) ann;
465 /* Create a new annotation for an SSA name T. */
468 create_ssa_name_ann (tree t)
472 #if defined ENABLE_CHECKING
475 && t->common.ann->common.type != SSA_NAME_ANN))
479 ann = ggc_alloc (sizeof (*ann));
480 memset ((void *) ann, 0, sizeof (*ann));
482 ann->common.type = SSA_NAME_ANN;
483 t->common.ann = (tree_ann) ann;
490 /*---------------------------------------------------------------------------
492 ---------------------------------------------------------------------------*/
493 /* Dump the list of all the referenced variables in the current function to
497 dump_referenced_vars (FILE *file)
501 fprintf (file, "\nReferenced variables in %s: %u\n\n",
502 get_name (current_function_decl), (unsigned) num_referenced_vars);
504 for (i = 0; i < num_referenced_vars; i++)
506 tree var = referenced_var (i);
507 fprintf (file, "Variable: ");
508 dump_variable (file, var);
509 fprintf (file, "\n");
514 /* Dump the list of all the referenced variables to stderr. */
517 debug_referenced_vars (void)
519 dump_referenced_vars (stderr);
523 /* Dump variable VAR and its may-aliases to FILE. */
526 dump_variable (FILE *file, tree var)
530 if (var == NULL_TREE)
532 fprintf (file, "<nil>");
536 print_generic_expr (file, var, dump_flags);
538 if (TREE_CODE (var) == SSA_NAME)
539 var = SSA_NAME_VAR (var);
543 fprintf (file, ", UID %u", (unsigned) ann->uid);
545 if (ann->has_hidden_use)
546 fprintf (file, ", has hidden uses");
548 if (ann->type_mem_tag)
550 fprintf (file, ", type memory tag: ");
551 print_generic_expr (file, ann->type_mem_tag, dump_flags);
554 if (ann->is_alias_tag)
555 fprintf (file, ", is an alias tag");
557 if (needs_to_live_in_memory (var))
558 fprintf (file, ", is %s", TREE_STATIC (var) ? "static" : "global");
560 if (is_call_clobbered (var))
561 fprintf (file, ", call clobbered");
563 if (ann->default_def)
565 fprintf (file, ", default def: ");
566 print_generic_expr (file, ann->default_def, dump_flags);
569 if (ann->may_aliases)
571 fprintf (file, ", may aliases: ");
572 dump_may_aliases_for (file, var);
575 fprintf (file, "\n");
579 /* Dump variable VAR and its may-aliases to stderr. */
582 debug_variable (tree var)
584 dump_variable (stderr, var);
588 /* Dump def-use edges on FILE. */
591 dump_immediate_uses (FILE *file)
594 block_stmt_iterator si;
596 = (*lang_hooks.decl_printable_name) (current_function_decl, 2);
598 fprintf (file, "\nDef-use edges for function %s\n", funcname);
604 for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
605 dump_immediate_uses_for (file, phi);
607 for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
608 dump_immediate_uses_for (file, bsi_stmt (si));
611 fprintf (file, "\n");
615 /* Dump def-use edges on stderr. */
618 debug_immediate_uses (void)
620 dump_immediate_uses (stderr);
624 /* Dump all immediate uses for STMT on FILE. */
627 dump_immediate_uses_for (FILE *file, tree stmt)
629 dataflow_t df = get_immediate_uses (stmt);
630 int num_imm_uses = num_immediate_uses (df);
632 if (num_imm_uses > 0)
636 fprintf (file, "-> ");
637 print_generic_stmt (file, stmt, TDF_SLIM);
638 fprintf (file, "\n");
640 for (i = 0; i < num_imm_uses; i++)
642 fprintf (file, "\t");
643 print_generic_stmt (file, immediate_use (df, i), TDF_SLIM);
644 fprintf (file, "\n");
647 fprintf (file, "\n");
652 /* Dump immediate uses for STMT on stderr. */
655 debug_immediate_uses_for (tree stmt)
657 dump_immediate_uses_for (stderr, stmt);
661 /* Dump various DFA statistics to FILE. */
664 dump_dfa_stats (FILE *file)
666 struct dfa_stats_d dfa_stats;
668 unsigned long size, total = 0;
669 const char * const fmt_str = "%-30s%-13s%12s\n";
670 const char * const fmt_str_1 = "%-30s%13lu%11lu%c\n";
671 const char * const fmt_str_3 = "%-43s%11lu%c\n";
673 = (*lang_hooks.decl_printable_name) (current_function_decl, 2);
675 collect_dfa_stats (&dfa_stats);
677 fprintf (file, "\nDFA Statistics for %s\n\n", funcname);
679 fprintf (file, "---------------------------------------------------------\n");
680 fprintf (file, fmt_str, "", " Number of ", "Memory");
681 fprintf (file, fmt_str, "", " instances ", "used ");
682 fprintf (file, "---------------------------------------------------------\n");
684 size = num_referenced_vars * sizeof (tree);
686 fprintf (file, fmt_str_1, "Referenced variables", num_referenced_vars,
687 SCALE (size), LABEL (size));
689 size = dfa_stats.num_stmt_anns * sizeof (struct stmt_ann_d);
691 fprintf (file, fmt_str_1, "Statements annotated", dfa_stats.num_stmt_anns,
692 SCALE (size), LABEL (size));
694 size = dfa_stats.num_var_anns * sizeof (struct var_ann_d);
696 fprintf (file, fmt_str_1, "Variables annotated", dfa_stats.num_var_anns,
697 SCALE (size), LABEL (size));
699 size = dfa_stats.num_uses * sizeof (tree *);
701 fprintf (file, fmt_str_1, "USE operands", dfa_stats.num_uses,
702 SCALE (size), LABEL (size));
704 size = dfa_stats.num_defs * sizeof (tree *);
706 fprintf (file, fmt_str_1, "DEF operands", dfa_stats.num_defs,
707 SCALE (size), LABEL (size));
709 size = dfa_stats.num_vuses * sizeof (tree *);
711 fprintf (file, fmt_str_1, "VUSE operands", dfa_stats.num_vuses,
712 SCALE (size), LABEL (size));
714 size = dfa_stats.num_vdefs * sizeof (tree *);
716 fprintf (file, fmt_str_1, "VDEF operands", dfa_stats.num_vdefs,
717 SCALE (size), LABEL (size));
719 size = dfa_stats.num_phis * sizeof (struct tree_phi_node);
721 fprintf (file, fmt_str_1, "PHI nodes", dfa_stats.num_phis,
722 SCALE (size), LABEL (size));
724 size = dfa_stats.num_phi_args * sizeof (struct phi_arg_d);
726 fprintf (file, fmt_str_1, "PHI arguments", dfa_stats.num_phi_args,
727 SCALE (size), LABEL (size));
729 fprintf (file, "---------------------------------------------------------\n");
730 fprintf (file, fmt_str_3, "Total memory used by DFA/SSA data", SCALE (total),
732 fprintf (file, "---------------------------------------------------------\n");
733 fprintf (file, "\n");
735 if (dfa_stats.num_phis)
736 fprintf (file, "Average number of arguments per PHI node: %.1f (max: %d)\n",
737 (float) dfa_stats.num_phi_args / (float) dfa_stats.num_phis,
738 dfa_stats.max_num_phi_args);
740 fprintf (file, "\n");
744 /* Dump DFA statistics on stderr. */
747 debug_dfa_stats (void)
749 dump_dfa_stats (stderr);
753 /* Collect DFA statistics and store them in the structure pointed by
757 collect_dfa_stats (struct dfa_stats_d *dfa_stats_p)
761 block_stmt_iterator i;
763 if (dfa_stats_p == NULL)
766 memset ((void *)dfa_stats_p, 0, sizeof (struct dfa_stats_d));
768 /* Walk all the trees in the function counting references. Start at
769 basic block 0, but don't stop at block boundaries. */
770 htab = htab_create (30, htab_hash_pointer, htab_eq_pointer, NULL);
772 for (i = bsi_start (BASIC_BLOCK (0)); !bsi_end_p (i); bsi_next (&i))
773 walk_tree (bsi_stmt_ptr (i), collect_dfa_stats_r, (void *) dfa_stats_p,
781 for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
783 dfa_stats_p->num_phis++;
784 dfa_stats_p->num_phi_args += PHI_NUM_ARGS (phi);
785 if (PHI_NUM_ARGS (phi) > dfa_stats_p->max_num_phi_args)
786 dfa_stats_p->max_num_phi_args = PHI_NUM_ARGS (phi);
792 /* Callback for walk_tree to collect DFA statistics for a tree and its
796 collect_dfa_stats_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
800 struct dfa_stats_d *dfa_stats_p = (struct dfa_stats_d *)data;
804 switch (ann_type (t->common.ann))
808 stmt_ann_t ann = (stmt_ann_t) t->common.ann;
809 dfa_stats_p->num_stmt_anns++;
810 dfa_stats_p->num_defs += NUM_DEFS (DEF_OPS (ann));
811 dfa_stats_p->num_uses += NUM_USES (USE_OPS (ann));
812 dfa_stats_p->num_vdefs += NUM_VDEFS (VDEF_OPS (ann));
813 dfa_stats_p->num_vuses += NUM_VUSES (VUSE_OPS (ann));
818 dfa_stats_p->num_var_anns++;
830 /*---------------------------------------------------------------------------
831 Miscellaneous helpers
832 ---------------------------------------------------------------------------*/
833 /* Callback for walk_tree. Used to collect variables referenced in
837 find_vars_r (tree *tp, int *walk_subtrees, void *data)
840 struct walk_state *walk_state = (struct walk_state *)data;
844 /* If T is a regular variable that the optimizers are interested
845 in, add it to the list of variables. */
846 add_referenced_var (t, walk_state);
850 || TREE_CODE_CLASS (TREE_CODE (t)) == 'c')
852 /* Type, _DECL and constant nodes have no interesting children.
862 /* Add VAR to the list of dereferenced variables.
864 WALK_STATE contains a hash table used to avoid adding the same
865 variable more than once. Note that this function assumes that
866 VAR is a valid SSA variable. If WALK_STATE is NULL, no
867 duplicate checking is done. */
870 add_referenced_var (tree var, struct walk_state *walk_state)
875 v_ann = get_var_ann (var);
878 slot = htab_find_slot (walk_state->vars_found, (void *) var, INSERT);
882 if (slot == NULL || *slot == NULL)
884 /* This is the first time we find this variable, add it to the
885 REFERENCED_VARS array and annotate it with attributes that are
886 intrinsic to the variable. */
888 *slot = (void *) var;
889 v_ann->uid = num_referenced_vars;
890 VARRAY_PUSH_TREE (referenced_vars, var);
892 /* Global and static variables are call-clobbered, always. */
893 if (needs_to_live_in_memory (var))
894 mark_call_clobbered (var);
896 /* DECL_NONLOCAL variables should not be removed, as they are needed
897 to emit nested functions. */
898 if (DECL_NONLOCAL (var))
904 /* Return the virtual variable associated to the non-scalar variable VAR. */
907 get_virtual_var (tree var)
913 if (TREE_CODE (var) == SSA_NAME)
914 var = SSA_NAME_VAR (var);
916 code = TREE_CODE (var);
918 while (code == ARRAY_REF
919 || code == COMPONENT_REF
920 || code == REALPART_EXPR
921 || code == IMAGPART_EXPR)
923 var = TREE_OPERAND (var, 0);
924 code = TREE_CODE (var);
927 #ifdef ENABLE_CHECKING
928 /* Treating GIMPLE registers as virtual variables makes no sense.
929 Also complain if we couldn't extract a _DECL out of the original
932 || is_gimple_reg (var))
940 /* Mark variables in BLOCK that have hidden uses. A hidden use can
941 occur due to VLA declarations or nested functions. */
944 find_hidden_use_vars (tree block)
948 /* Check all the arrays declared in the block for VLAs.
949 While scanning the block's variables, also see if there is
950 a nested function at this scope. */
951 for (decl = BLOCK_VARS (block); decl; decl = TREE_CHAIN (decl))
954 walk_tree (&decl, find_hidden_use_vars_r, &inside_vla, NULL);
957 /* Now repeat the search in any sub-blocks. */
958 for (sub = BLOCK_SUBBLOCKS (block); sub; sub = TREE_CHAIN (sub))
959 find_hidden_use_vars (sub);
961 /* A VLA parameter may use a variable which as set from another
962 parameter to declare the size of the VLA. We need to mark the
963 variable as having a hidden use since it is used to declare the
964 VLA parameter and that declaration is not seen by the SSA code.
966 Note get_pending_sizes clears the PENDING_SIZES chain, so we
968 tem = get_pending_sizes ();
969 put_pending_sizes (tem);
970 for (; tem; tem = TREE_CHAIN (tem))
973 walk_tree (&TREE_VALUE (tem), find_hidden_use_vars_r, &inside_vla, NULL);
978 /* Callback for walk_tree used by find_hidden_use_vars to analyze each
979 variable in a lexical block. If the variable's size has a variable
980 size, then mark all objects needed to compute the variable's size
981 as having hidden uses. */
984 find_hidden_use_vars_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
985 void *data ATTRIBUTE_UNUSED)
987 int *inside_vla = (int *) data;
989 /* We need to look for hidden uses due to VLAs in variable
990 definitions. We originally used to look for these hidden
991 uses in the variable's type, but that's unreliable if the
992 type's size contains a SAVE_EXPR for a different function
993 context than the variable is used within. */
996 && ! really_constant_p (DECL_SIZE (*tp)))
997 || (DECL_SIZE_UNIT (*tp)
998 && ! really_constant_p (DECL_SIZE_UNIT (*tp)))))
1000 int save = *inside_vla;
1003 walk_tree (&DECL_SIZE (*tp), find_hidden_use_vars_r, inside_vla, NULL);
1004 walk_tree (&DECL_SIZE_UNIT (*tp), find_hidden_use_vars_r,
1008 else if (*inside_vla && SSA_VAR_P (*tp))
1009 set_has_hidden_use (*tp);
1015 /* Add a temporary variable to REFERENCED_VARS. This is similar to
1016 add_referenced_var, but is used by passes that need to add new temps to
1017 the REFERENCED_VARS array after the program has been scanned for
1018 variables. The variable will just receive a new UID and be added
1019 to the REFERENCED_VARS array without checking for duplicates. */
1022 add_referenced_tmp_var (tree var)
1024 add_referenced_var (var, NULL);
1028 /* Return true if VDEFS_AFTER contains fewer entries than VDEFS_BEFORE.
1029 Note that this assumes that both varrays are VDEF operands for the same
1033 vdefs_disappeared_p (vdef_optype vdefs_before, vdef_optype vdefs_after)
1035 /* If there was nothing before, nothing could've disappeared. */
1036 if (vdefs_before == NULL)
1039 /* All/some of them gone. */
1040 if (vdefs_after == NULL
1041 || NUM_VDEFS (vdefs_before) > NUM_VDEFS (vdefs_after))
1048 /* Add all the non-SSA variables found in STMT's operands to the bitmap
1052 mark_new_vars_to_rename (tree stmt, bitmap vars_to_rename)
1059 bitmap vars_in_vops_to_rename;
1060 bool found_exposed_symbol = false;
1061 vdef_optype vdefs_before, vdefs_after;
1064 vars_in_vops_to_rename = BITMAP_XMALLOC ();
1066 /* Before re-scanning the statement for operands, mark the existing
1067 virtual operands to be renamed again. We do this because when new
1068 symbols are exposed, the virtual operands that were here before due to
1069 aliasing will probably be removed by the call to get_stmt_operand.
1070 Therefore, we need to flag them to be renamed beforehand.
1072 We flag them in a separate bitmap because we don't really want to
1073 rename them if there are not any newly exposed symbols in the
1074 statement operands. */
1075 ann = stmt_ann (stmt);
1076 vdefs_before = vdefs = VDEF_OPS (ann);
1077 for (i = 0; i < NUM_VDEFS (vdefs); i++)
1079 tree var = VDEF_RESULT (vdefs, i);
1081 var = SSA_NAME_VAR (var);
1082 bitmap_set_bit (vars_in_vops_to_rename, var_ann (var)->uid);
1085 vuses = VUSE_OPS (ann);
1086 for (i = 0; i < NUM_VUSES (vuses); i++)
1088 tree var = VUSE_OP (vuses, i);
1090 var = SSA_NAME_VAR (var);
1091 bitmap_set_bit (vars_in_vops_to_rename, var_ann (var)->uid);
1094 /* Now force an operand re-scan on the statement and mark any newly
1095 exposed variables. */
1097 get_stmt_operands (stmt);
1099 defs = DEF_OPS (ann);
1100 for (i = 0; i < NUM_DEFS (defs); i++)
1102 tree var = DEF_OP (defs, i);
1105 found_exposed_symbol = true;
1106 bitmap_set_bit (vars_to_rename, var_ann (var)->uid);
1110 uses = USE_OPS (ann);
1111 for (i = 0; i < NUM_USES (uses); i++)
1113 tree var = USE_OP (uses, i);
1116 found_exposed_symbol = true;
1117 bitmap_set_bit (vars_to_rename, var_ann (var)->uid);
1121 vdefs_after = vdefs = VDEF_OPS (ann);
1122 for (i = 0; i < NUM_VDEFS (vdefs); i++)
1124 tree var = VDEF_RESULT (vdefs, i);
1127 found_exposed_symbol = true;
1128 bitmap_set_bit (vars_to_rename, var_ann (var)->uid);
1132 vuses = VUSE_OPS (ann);
1133 for (i = 0; i < NUM_VUSES (vuses); i++)
1135 tree var = VUSE_OP (vuses, i);
1138 found_exposed_symbol = true;
1139 bitmap_set_bit (vars_to_rename, var_ann (var)->uid);
1143 /* If we found any newly exposed symbols, or if there are fewer VDEF
1144 operands in the statement, add the variables we had set in
1145 VARS_IN_VOPS_TO_RENAME to VARS_TO_RENAME. We need to check for
1146 vanishing VDEFs because in those cases, the names that were formerly
1147 generated by this statement are not going to be available anymore. */
1148 if (found_exposed_symbol
1149 || vdefs_disappeared_p (vdefs_before, vdefs_after))
1150 bitmap_a_or_b (vars_to_rename, vars_to_rename, vars_in_vops_to_rename);
1152 BITMAP_XFREE (vars_in_vops_to_rename);