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. */
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 /* Build a temporary. Make sure and register it to be renamed. */
468 make_rename_temp (tree type, const char *prefix)
470 tree t = create_tmp_var (type, prefix);
471 add_referenced_tmp_var (t);
472 bitmap_set_bit (vars_to_rename, var_ann (t)->uid);
478 /*---------------------------------------------------------------------------
480 ---------------------------------------------------------------------------*/
481 /* Dump the list of all the referenced variables in the current function to
485 dump_referenced_vars (FILE *file)
489 fprintf (file, "\nReferenced variables in %s: %u\n\n",
490 get_name (current_function_decl), (unsigned) num_referenced_vars);
492 for (i = 0; i < num_referenced_vars; i++)
494 tree var = referenced_var (i);
495 fprintf (file, "Variable: ");
496 dump_variable (file, var);
497 fprintf (file, "\n");
502 /* Dump the list of all the referenced variables to stderr. */
505 debug_referenced_vars (void)
507 dump_referenced_vars (stderr);
511 /* Dump variable VAR and its may-aliases to FILE. */
514 dump_variable (FILE *file, tree var)
518 if (var == NULL_TREE)
520 fprintf (file, "<nil>");
524 print_generic_expr (file, var, dump_flags);
526 if (TREE_CODE (var) == SSA_NAME)
527 var = SSA_NAME_VAR (var);
531 fprintf (file, ", UID %u", (unsigned) ann->uid);
533 if (ann->has_hidden_use)
534 fprintf (file, ", has hidden uses");
536 if (ann->type_mem_tag)
538 fprintf (file, ", type memory tag: ");
539 print_generic_expr (file, ann->type_mem_tag, dump_flags);
542 if (ann->is_alias_tag)
543 fprintf (file, ", is an alias tag");
545 if (needs_to_live_in_memory (var))
546 fprintf (file, ", is %s", TREE_STATIC (var) ? "static" : "global");
548 if (is_call_clobbered (var))
549 fprintf (file, ", call clobbered");
551 if (ann->default_def)
553 fprintf (file, ", default def: ");
554 print_generic_expr (file, ann->default_def, dump_flags);
557 if (ann->may_aliases)
559 fprintf (file, ", may aliases: ");
560 dump_may_aliases_for (file, var);
563 fprintf (file, "\n");
567 /* Dump variable VAR and its may-aliases to stderr. */
570 debug_variable (tree var)
572 dump_variable (stderr, var);
576 /* Dump def-use edges on FILE. */
579 dump_immediate_uses (FILE *file)
582 block_stmt_iterator si;
584 = lang_hooks.decl_printable_name (current_function_decl, 2);
586 fprintf (file, "\nDef-use edges for function %s\n", funcname);
592 for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
593 dump_immediate_uses_for (file, phi);
595 for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
596 dump_immediate_uses_for (file, bsi_stmt (si));
599 fprintf (file, "\n");
603 /* Dump def-use edges on stderr. */
606 debug_immediate_uses (void)
608 dump_immediate_uses (stderr);
612 /* Dump all immediate uses for STMT on FILE. */
615 dump_immediate_uses_for (FILE *file, tree stmt)
617 dataflow_t df = get_immediate_uses (stmt);
618 int num_imm_uses = num_immediate_uses (df);
620 if (num_imm_uses > 0)
624 fprintf (file, "-> ");
625 print_generic_stmt (file, stmt, TDF_SLIM);
626 fprintf (file, "\n");
628 for (i = 0; i < num_imm_uses; i++)
630 fprintf (file, "\t");
631 print_generic_stmt (file, immediate_use (df, i), TDF_SLIM);
632 fprintf (file, "\n");
635 fprintf (file, "\n");
640 /* Dump immediate uses for STMT on stderr. */
643 debug_immediate_uses_for (tree stmt)
645 dump_immediate_uses_for (stderr, stmt);
649 /* Dump various DFA statistics to FILE. */
652 dump_dfa_stats (FILE *file)
654 struct dfa_stats_d dfa_stats;
656 unsigned long size, total = 0;
657 const char * const fmt_str = "%-30s%-13s%12s\n";
658 const char * const fmt_str_1 = "%-30s%13lu%11lu%c\n";
659 const char * const fmt_str_3 = "%-43s%11lu%c\n";
661 = lang_hooks.decl_printable_name (current_function_decl, 2);
663 collect_dfa_stats (&dfa_stats);
665 fprintf (file, "\nDFA Statistics for %s\n\n", funcname);
667 fprintf (file, "---------------------------------------------------------\n");
668 fprintf (file, fmt_str, "", " Number of ", "Memory");
669 fprintf (file, fmt_str, "", " instances ", "used ");
670 fprintf (file, "---------------------------------------------------------\n");
672 size = num_referenced_vars * sizeof (tree);
674 fprintf (file, fmt_str_1, "Referenced variables", num_referenced_vars,
675 SCALE (size), LABEL (size));
677 size = dfa_stats.num_stmt_anns * sizeof (struct stmt_ann_d);
679 fprintf (file, fmt_str_1, "Statements annotated", dfa_stats.num_stmt_anns,
680 SCALE (size), LABEL (size));
682 size = dfa_stats.num_var_anns * sizeof (struct var_ann_d);
684 fprintf (file, fmt_str_1, "Variables annotated", dfa_stats.num_var_anns,
685 SCALE (size), LABEL (size));
687 size = dfa_stats.num_uses * sizeof (tree *);
689 fprintf (file, fmt_str_1, "USE operands", dfa_stats.num_uses,
690 SCALE (size), LABEL (size));
692 size = dfa_stats.num_defs * sizeof (tree *);
694 fprintf (file, fmt_str_1, "DEF operands", dfa_stats.num_defs,
695 SCALE (size), LABEL (size));
697 size = dfa_stats.num_vuses * sizeof (tree *);
699 fprintf (file, fmt_str_1, "VUSE operands", dfa_stats.num_vuses,
700 SCALE (size), LABEL (size));
702 size = dfa_stats.num_vdefs * sizeof (tree *);
704 fprintf (file, fmt_str_1, "VDEF operands", dfa_stats.num_vdefs,
705 SCALE (size), LABEL (size));
707 size = dfa_stats.num_phis * sizeof (struct tree_phi_node);
709 fprintf (file, fmt_str_1, "PHI nodes", dfa_stats.num_phis,
710 SCALE (size), LABEL (size));
712 size = dfa_stats.num_phi_args * sizeof (struct phi_arg_d);
714 fprintf (file, fmt_str_1, "PHI arguments", dfa_stats.num_phi_args,
715 SCALE (size), LABEL (size));
717 fprintf (file, "---------------------------------------------------------\n");
718 fprintf (file, fmt_str_3, "Total memory used by DFA/SSA data", SCALE (total),
720 fprintf (file, "---------------------------------------------------------\n");
721 fprintf (file, "\n");
723 if (dfa_stats.num_phis)
724 fprintf (file, "Average number of arguments per PHI node: %.1f (max: %d)\n",
725 (float) dfa_stats.num_phi_args / (float) dfa_stats.num_phis,
726 dfa_stats.max_num_phi_args);
728 fprintf (file, "\n");
732 /* Dump DFA statistics on stderr. */
735 debug_dfa_stats (void)
737 dump_dfa_stats (stderr);
741 /* Collect DFA statistics and store them in the structure pointed by
745 collect_dfa_stats (struct dfa_stats_d *dfa_stats_p)
749 block_stmt_iterator i;
751 if (dfa_stats_p == NULL)
754 memset ((void *)dfa_stats_p, 0, sizeof (struct dfa_stats_d));
756 /* Walk all the trees in the function counting references. Start at
757 basic block 0, but don't stop at block boundaries. */
758 htab = htab_create (30, htab_hash_pointer, htab_eq_pointer, NULL);
760 for (i = bsi_start (BASIC_BLOCK (0)); !bsi_end_p (i); bsi_next (&i))
761 walk_tree (bsi_stmt_ptr (i), collect_dfa_stats_r, (void *) dfa_stats_p,
769 for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
771 dfa_stats_p->num_phis++;
772 dfa_stats_p->num_phi_args += PHI_NUM_ARGS (phi);
773 if (PHI_NUM_ARGS (phi) > dfa_stats_p->max_num_phi_args)
774 dfa_stats_p->max_num_phi_args = PHI_NUM_ARGS (phi);
780 /* Callback for walk_tree to collect DFA statistics for a tree and its
784 collect_dfa_stats_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
788 struct dfa_stats_d *dfa_stats_p = (struct dfa_stats_d *)data;
792 switch (ann_type (t->common.ann))
796 stmt_ann_t ann = (stmt_ann_t) t->common.ann;
797 dfa_stats_p->num_stmt_anns++;
798 dfa_stats_p->num_defs += NUM_DEFS (DEF_OPS (ann));
799 dfa_stats_p->num_uses += NUM_USES (USE_OPS (ann));
800 dfa_stats_p->num_vdefs += NUM_VDEFS (VDEF_OPS (ann));
801 dfa_stats_p->num_vuses += NUM_VUSES (VUSE_OPS (ann));
806 dfa_stats_p->num_var_anns++;
818 /*---------------------------------------------------------------------------
819 Miscellaneous helpers
820 ---------------------------------------------------------------------------*/
821 /* Callback for walk_tree. Used to collect variables referenced in
825 find_vars_r (tree *tp, int *walk_subtrees, void *data)
828 struct walk_state *walk_state = (struct walk_state *)data;
832 /* If T is a regular variable that the optimizers are interested
833 in, add it to the list of variables. */
834 add_referenced_var (t, walk_state);
838 || TREE_CODE_CLASS (TREE_CODE (t)) == 'c')
840 /* Type, _DECL and constant nodes have no interesting children.
850 /* Add VAR to the list of dereferenced variables.
852 WALK_STATE contains a hash table used to avoid adding the same
853 variable more than once. Note that this function assumes that
854 VAR is a valid SSA variable. If WALK_STATE is NULL, no
855 duplicate checking is done. */
858 add_referenced_var (tree var, struct walk_state *walk_state)
863 v_ann = get_var_ann (var);
866 slot = htab_find_slot (walk_state->vars_found, (void *) var, INSERT);
870 if (slot == NULL || *slot == NULL)
872 /* This is the first time we find this variable, add it to the
873 REFERENCED_VARS array and annotate it with attributes that are
874 intrinsic to the variable. */
876 *slot = (void *) var;
877 v_ann->uid = num_referenced_vars;
878 VARRAY_PUSH_TREE (referenced_vars, var);
880 /* Global and static variables are call-clobbered, always. */
881 if (needs_to_live_in_memory (var))
882 mark_call_clobbered (var);
884 /* DECL_NONLOCAL variables should not be removed, as they are needed
885 to emit nested functions. */
886 if (DECL_NONLOCAL (var))
892 /* Return the virtual variable associated to the non-scalar variable VAR. */
895 get_virtual_var (tree var)
901 if (TREE_CODE (var) == SSA_NAME)
902 var = SSA_NAME_VAR (var);
904 code = TREE_CODE (var);
906 while (code == ARRAY_REF
907 || code == COMPONENT_REF
908 || code == REALPART_EXPR
909 || code == IMAGPART_EXPR)
911 var = TREE_OPERAND (var, 0);
912 code = TREE_CODE (var);
915 #ifdef ENABLE_CHECKING
916 /* Treating GIMPLE registers as virtual variables makes no sense.
917 Also complain if we couldn't extract a _DECL out of the original
920 || is_gimple_reg (var))
928 /* Mark variables in BLOCK that have hidden uses. A hidden use can
929 occur due to VLA declarations or nested functions. */
932 find_hidden_use_vars (tree block)
936 /* Check all the arrays declared in the block for VLAs.
937 While scanning the block's variables, also see if there is
938 a nested function at this scope. */
939 for (decl = BLOCK_VARS (block); decl; decl = TREE_CHAIN (decl))
942 walk_tree (&decl, find_hidden_use_vars_r, &inside_vla, NULL);
945 /* Now repeat the search in any sub-blocks. */
946 for (sub = BLOCK_SUBBLOCKS (block); sub; sub = TREE_CHAIN (sub))
947 find_hidden_use_vars (sub);
949 /* A VLA parameter may use a variable which as set from another
950 parameter to declare the size of the VLA. We need to mark the
951 variable as having a hidden use since it is used to declare the
952 VLA parameter and that declaration is not seen by the SSA code.
954 Note get_pending_sizes clears the PENDING_SIZES chain, so we
956 tem = get_pending_sizes ();
957 put_pending_sizes (tem);
958 for (; tem; tem = TREE_CHAIN (tem))
961 walk_tree (&TREE_VALUE (tem), find_hidden_use_vars_r, &inside_vla, NULL);
966 /* Callback for walk_tree used by find_hidden_use_vars to analyze each
967 variable in a lexical block. If the variable's size has a variable
968 size, then mark all objects needed to compute the variable's size
969 as having hidden uses. */
972 find_hidden_use_vars_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
973 void *data ATTRIBUTE_UNUSED)
975 int *inside_vla = (int *) data;
977 /* We need to look for hidden uses due to VLAs in variable
978 definitions. We originally used to look for these hidden
979 uses in the variable's type, but that's unreliable if the
980 type's size contains a SAVE_EXPR for a different function
981 context than the variable is used within. */
984 && ! really_constant_p (DECL_SIZE (*tp)))
985 || (DECL_SIZE_UNIT (*tp)
986 && ! really_constant_p (DECL_SIZE_UNIT (*tp)))))
988 int save = *inside_vla;
991 walk_tree (&DECL_SIZE (*tp), find_hidden_use_vars_r, inside_vla, NULL);
992 walk_tree (&DECL_SIZE_UNIT (*tp), find_hidden_use_vars_r,
996 else if (*inside_vla && SSA_VAR_P (*tp))
997 set_has_hidden_use (*tp);
1003 /* Add a temporary variable to REFERENCED_VARS. This is similar to
1004 add_referenced_var, but is used by passes that need to add new temps to
1005 the REFERENCED_VARS array after the program has been scanned for
1006 variables. The variable will just receive a new UID and be added
1007 to the REFERENCED_VARS array without checking for duplicates. */
1010 add_referenced_tmp_var (tree var)
1012 add_referenced_var (var, NULL);
1016 /* Return true if VDEFS_AFTER contains fewer entries than VDEFS_BEFORE.
1017 Note that this assumes that both varrays are VDEF operands for the same
1021 vdefs_disappeared_p (vdef_optype vdefs_before, vdef_optype vdefs_after)
1023 /* If there was nothing before, nothing could've disappeared. */
1024 if (vdefs_before == NULL)
1027 /* All/some of them gone. */
1028 if (vdefs_after == NULL
1029 || NUM_VDEFS (vdefs_before) > NUM_VDEFS (vdefs_after))
1036 /* Add all the non-SSA variables found in STMT's operands to the bitmap
1040 mark_new_vars_to_rename (tree stmt, bitmap vars_to_rename)
1047 bitmap vars_in_vops_to_rename;
1048 bool found_exposed_symbol = false;
1049 vdef_optype vdefs_before, vdefs_after;
1052 vars_in_vops_to_rename = BITMAP_XMALLOC ();
1054 /* Before re-scanning the statement for operands, mark the existing
1055 virtual operands to be renamed again. We do this because when new
1056 symbols are exposed, the virtual operands that were here before due to
1057 aliasing will probably be removed by the call to get_stmt_operand.
1058 Therefore, we need to flag them to be renamed beforehand.
1060 We flag them in a separate bitmap because we don't really want to
1061 rename them if there are not any newly exposed symbols in the
1062 statement operands. */
1063 ann = stmt_ann (stmt);
1064 vdefs_before = vdefs = VDEF_OPS (ann);
1065 for (i = 0; i < NUM_VDEFS (vdefs); i++)
1067 tree var = VDEF_RESULT (vdefs, i);
1069 var = SSA_NAME_VAR (var);
1070 bitmap_set_bit (vars_in_vops_to_rename, var_ann (var)->uid);
1073 vuses = VUSE_OPS (ann);
1074 for (i = 0; i < NUM_VUSES (vuses); i++)
1076 tree var = VUSE_OP (vuses, i);
1078 var = SSA_NAME_VAR (var);
1079 bitmap_set_bit (vars_in_vops_to_rename, var_ann (var)->uid);
1082 /* Now force an operand re-scan on the statement and mark any newly
1083 exposed variables. */
1085 get_stmt_operands (stmt);
1087 defs = DEF_OPS (ann);
1088 for (i = 0; i < NUM_DEFS (defs); i++)
1090 tree var = DEF_OP (defs, i);
1093 found_exposed_symbol = true;
1094 bitmap_set_bit (vars_to_rename, var_ann (var)->uid);
1098 uses = USE_OPS (ann);
1099 for (i = 0; i < NUM_USES (uses); i++)
1101 tree var = USE_OP (uses, i);
1104 found_exposed_symbol = true;
1105 bitmap_set_bit (vars_to_rename, var_ann (var)->uid);
1109 vdefs_after = vdefs = VDEF_OPS (ann);
1110 for (i = 0; i < NUM_VDEFS (vdefs); i++)
1112 tree var = VDEF_RESULT (vdefs, i);
1115 found_exposed_symbol = true;
1116 bitmap_set_bit (vars_to_rename, var_ann (var)->uid);
1120 vuses = VUSE_OPS (ann);
1121 for (i = 0; i < NUM_VUSES (vuses); i++)
1123 tree var = VUSE_OP (vuses, i);
1126 found_exposed_symbol = true;
1127 bitmap_set_bit (vars_to_rename, var_ann (var)->uid);
1131 /* If we found any newly exposed symbols, or if there are fewer VDEF
1132 operands in the statement, add the variables we had set in
1133 VARS_IN_VOPS_TO_RENAME to VARS_TO_RENAME. We need to check for
1134 vanishing VDEFs because in those cases, the names that were formerly
1135 generated by this statement are not going to be available anymore. */
1136 if (found_exposed_symbol
1137 || vdefs_disappeared_p (vdefs_before, vdefs_after))
1138 bitmap_a_or_b (vars_to_rename, vars_to_rename, vars_in_vops_to_rename);
1140 BITMAP_XFREE (vars_in_vops_to_rename);