Merge from mainline
[official-gcc.git] / gcc / tree-dfa.c
blobc2421e6c6e45df3bc7105dc97e65a1ea968669b1
1 /* Data flow functions for trees.
2 Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
3 Contributed by Diego Novillo <dnovillo@redhat.com>
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
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, 51 Franklin Street, Fifth Floor,
20 Boston, MA 02110-1301, USA. */
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "hashtab.h"
27 #include "pointer-set.h"
28 #include "tree.h"
29 #include "rtl.h"
30 #include "tm_p.h"
31 #include "hard-reg-set.h"
32 #include "basic-block.h"
33 #include "output.h"
34 #include "timevar.h"
35 #include "expr.h"
36 #include "ggc.h"
37 #include "langhooks.h"
38 #include "flags.h"
39 #include "function.h"
40 #include "diagnostic.h"
41 #include "tree-dump.h"
42 #include "tree-gimple.h"
43 #include "tree-flow.h"
44 #include "tree-inline.h"
45 #include "tree-pass.h"
46 #include "convert.h"
47 #include "params.h"
48 #include "cgraph.h"
50 /* Build and maintain data flow information for trees. */
52 /* Counters used to display DFA and SSA statistics. */
53 struct dfa_stats_d
55 long num_stmt_anns;
56 long num_var_anns;
57 long num_defs;
58 long num_uses;
59 long num_phis;
60 long num_phi_args;
61 int max_num_phi_args;
62 long num_v_may_defs;
63 long num_vuses;
64 long num_v_must_defs;
68 /* State information for find_vars_r. */
69 struct walk_state
71 /* Hash table used to avoid adding the same variable more than once. */
72 htab_t vars_found;
76 /* Local functions. */
77 static void collect_dfa_stats (struct dfa_stats_d *);
78 static tree collect_dfa_stats_r (tree *, int *, void *);
79 static tree find_vars_r (tree *, int *, void *);
80 static void add_referenced_var (tree, struct walk_state *);
83 /* Global declarations. */
85 /* Array of all variables referenced in the function. */
86 htab_t referenced_vars;
88 /* Default definition for this symbols. If set for symbol, it
89 means that the first reference to this variable in the function is a
90 USE or a VUSE. In those cases, the SSA renamer creates an SSA name
91 for this variable with an empty defining statement. */
92 htab_t default_defs;
95 /*---------------------------------------------------------------------------
96 Dataflow analysis (DFA) routines
97 ---------------------------------------------------------------------------*/
98 /* Find all the variables referenced in the function. This function
99 builds the global arrays REFERENCED_VARS and CALL_CLOBBERED_VARS.
101 Note that this function does not look for statement operands, it simply
102 determines what variables are referenced in the program and detects
103 various attributes for each variable used by alias analysis and the
104 optimizer. */
106 static void
107 find_referenced_vars (void)
109 htab_t vars_found;
110 basic_block bb;
111 block_stmt_iterator si;
112 struct walk_state walk_state;
114 vars_found = htab_create (50, htab_hash_pointer, htab_eq_pointer, NULL);
115 memset (&walk_state, 0, sizeof (walk_state));
116 walk_state.vars_found = vars_found;
118 FOR_EACH_BB (bb)
119 for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
121 tree *stmt_p = bsi_stmt_ptr (si);
122 walk_tree (stmt_p, find_vars_r, &walk_state, NULL);
125 htab_delete (vars_found);
128 struct tree_opt_pass pass_referenced_vars =
130 NULL, /* name */
131 NULL, /* gate */
132 find_referenced_vars, /* execute */
133 NULL, /* sub */
134 NULL, /* next */
135 0, /* static_pass_number */
136 TV_FIND_REFERENCED_VARS, /* tv_id */
137 PROP_gimple_leh | PROP_cfg, /* properties_required */
138 PROP_referenced_vars, /* properties_provided */
139 0, /* properties_destroyed */
140 0, /* todo_flags_start */
141 0, /* todo_flags_finish */
142 0 /* letter */
146 /*---------------------------------------------------------------------------
147 Manage annotations
148 ---------------------------------------------------------------------------*/
149 /* Create a new annotation for a _DECL node T. */
151 var_ann_t
152 create_var_ann (tree t)
154 var_ann_t ann;
156 gcc_assert (t);
157 gcc_assert (DECL_P (t));
158 gcc_assert (!t->common.ann || t->common.ann->common.type == VAR_ANN);
160 ann = GGC_NEW (struct var_ann_d);
161 memset ((void *) ann, 0, sizeof (*ann));
163 ann->common.type = VAR_ANN;
165 t->common.ann = (tree_ann_t) ann;
167 return ann;
170 /* Create a new annotation for a FUNCTION_DECL node T. */
172 function_ann_t
173 create_function_ann (tree t)
175 function_ann_t ann;
177 gcc_assert (t);
178 gcc_assert (TREE_CODE (t) == FUNCTION_DECL);
179 gcc_assert (!t->common.ann || t->common.ann->common.type == FUNCTION_ANN);
181 ann = ggc_alloc (sizeof (*ann));
182 memset ((void *) ann, 0, sizeof (*ann));
184 ann->common.type = FUNCTION_ANN;
186 t->common.ann = (tree_ann_t) ann;
188 return ann;
191 /* Create a new annotation for a statement node T. */
193 stmt_ann_t
194 create_stmt_ann (tree t)
196 stmt_ann_t ann;
198 gcc_assert (is_gimple_stmt (t));
199 gcc_assert (!t->common.ann || t->common.ann->common.type == STMT_ANN);
201 ann = GGC_NEW (struct stmt_ann_d);
202 memset ((void *) ann, 0, sizeof (*ann));
204 ann->common.type = STMT_ANN;
206 /* Since we just created the annotation, mark the statement modified. */
207 ann->modified = true;
209 t->common.ann = (tree_ann_t) ann;
211 return ann;
214 /* Create a new annotation for a tree T. */
216 tree_ann_t
217 create_tree_ann (tree t)
219 tree_ann_t ann;
221 gcc_assert (t);
222 gcc_assert (!t->common.ann || t->common.ann->common.type == TREE_ANN_COMMON);
224 ann = GGC_NEW (union tree_ann_d);
225 memset ((void *) ann, 0, sizeof (*ann));
227 ann->common.type = TREE_ANN_COMMON;
228 t->common.ann = ann;
230 return ann;
233 /* Build a temporary. Make sure and register it to be renamed. */
235 tree
236 make_rename_temp (tree type, const char *prefix)
238 tree t = create_tmp_var (type, prefix);
240 if (TREE_CODE (type) == COMPLEX_TYPE)
241 DECL_COMPLEX_GIMPLE_REG_P (t) = 1;
243 if (referenced_vars)
245 add_referenced_tmp_var (t);
246 mark_sym_for_renaming (t);
249 return t;
254 /*---------------------------------------------------------------------------
255 Debugging functions
256 ---------------------------------------------------------------------------*/
257 /* Dump the list of all the referenced variables in the current function to
258 FILE. */
260 void
261 dump_referenced_vars (FILE *file)
263 tree var;
264 referenced_var_iterator rvi;
266 fprintf (file, "\nReferenced variables in %s: %u\n\n",
267 get_name (current_function_decl), (unsigned) num_referenced_vars);
269 FOR_EACH_REFERENCED_VAR (var, rvi)
271 fprintf (file, "Variable: ");
272 dump_variable (file, var);
273 fprintf (file, "\n");
278 /* Dump the list of all the referenced variables to stderr. */
280 void
281 debug_referenced_vars (void)
283 dump_referenced_vars (stderr);
287 /* Dump sub-variables for VAR to FILE. */
289 void
290 dump_subvars_for (FILE *file, tree var)
292 subvar_t sv = get_subvars_for_var (var);
294 if (!sv)
295 return;
297 fprintf (file, "{ ");
299 for (; sv; sv = sv->next)
301 print_generic_expr (file, sv->var, dump_flags);
302 fprintf (file, " ");
305 fprintf (file, "}");
309 /* Dumb sub-variables for VAR to stderr. */
311 void
312 debug_subvars_for (tree var)
314 dump_subvars_for (stderr, var);
318 /* Dump variable VAR and its may-aliases to FILE. */
320 void
321 dump_variable (FILE *file, tree var)
323 var_ann_t ann;
325 if (TREE_CODE (var) == SSA_NAME)
327 if (POINTER_TYPE_P (TREE_TYPE (var)))
328 dump_points_to_info_for (file, var);
329 var = SSA_NAME_VAR (var);
332 if (var == NULL_TREE)
334 fprintf (file, "<nil>");
335 return;
338 print_generic_expr (file, var, dump_flags);
340 ann = var_ann (var);
342 fprintf (file, ", UID %u", (unsigned) DECL_UID (var));
344 fprintf (file, ", ");
345 print_generic_expr (file, TREE_TYPE (var), dump_flags);
347 if (ann && ann->type_mem_tag)
349 fprintf (file, ", type memory tag: ");
350 print_generic_expr (file, ann->type_mem_tag, dump_flags);
353 if (ann && ann->is_alias_tag)
354 fprintf (file, ", is an alias tag");
356 if (TREE_ADDRESSABLE (var))
357 fprintf (file, ", is addressable");
359 if (is_global_var (var))
360 fprintf (file, ", is global");
362 if (TREE_THIS_VOLATILE (var))
363 fprintf (file, ", is volatile");
365 if (is_call_clobbered (var))
367 fprintf (file, ", call clobbered");
368 if (dump_flags & TDF_DETAILS)
370 var_ann_t va = var_ann (var);
371 unsigned int escape_mask = va->escape_mask;
373 fprintf (file, " (");
374 if (escape_mask & ESCAPE_STORED_IN_GLOBAL)
375 fprintf (file, ", stored in global");
376 if (escape_mask & ESCAPE_TO_ASM)
377 fprintf (file, ", goes through ASM");
378 if (escape_mask & ESCAPE_TO_CALL)
379 fprintf (file, ", passed to call");
380 if (escape_mask & ESCAPE_BAD_CAST)
381 fprintf (file, ", bad cast");
382 if (escape_mask & ESCAPE_TO_RETURN)
383 fprintf (file, ", returned from func");
384 if (escape_mask & ESCAPE_TO_PURE_CONST)
385 fprintf (file, ", passed to pure/const");
386 if (escape_mask & ESCAPE_IS_GLOBAL)
387 fprintf (file, ", is global var");
388 if (escape_mask & ESCAPE_IS_PARM)
389 fprintf (file, ", is incoming pointer");
390 if (escape_mask & ESCAPE_UNKNOWN)
391 fprintf (file, ", unknown escape");
392 fprintf (file, " )");
396 if (default_def (var))
398 fprintf (file, ", default def: ");
399 print_generic_expr (file, default_def (var), dump_flags);
402 if (may_aliases (var))
404 fprintf (file, ", may aliases: ");
405 dump_may_aliases_for (file, var);
408 if (get_subvars_for_var (var))
410 fprintf (file, ", sub-vars: ");
411 dump_subvars_for (file, var);
414 fprintf (file, "\n");
418 /* Dump variable VAR and its may-aliases to stderr. */
420 void
421 debug_variable (tree var)
423 dump_variable (stderr, var);
427 /* Dump various DFA statistics to FILE. */
429 void
430 dump_dfa_stats (FILE *file)
432 struct dfa_stats_d dfa_stats;
434 unsigned long size, total = 0;
435 const char * const fmt_str = "%-30s%-13s%12s\n";
436 const char * const fmt_str_1 = "%-30s%13lu%11lu%c\n";
437 const char * const fmt_str_3 = "%-43s%11lu%c\n";
438 const char *funcname
439 = lang_hooks.decl_printable_name (current_function_decl, 2);
441 collect_dfa_stats (&dfa_stats);
443 fprintf (file, "\nDFA Statistics for %s\n\n", funcname);
445 fprintf (file, "---------------------------------------------------------\n");
446 fprintf (file, fmt_str, "", " Number of ", "Memory");
447 fprintf (file, fmt_str, "", " instances ", "used ");
448 fprintf (file, "---------------------------------------------------------\n");
450 size = num_referenced_vars * sizeof (tree);
451 total += size;
452 fprintf (file, fmt_str_1, "Referenced variables", (unsigned long)num_referenced_vars,
453 SCALE (size), LABEL (size));
455 size = dfa_stats.num_stmt_anns * sizeof (struct stmt_ann_d);
456 total += size;
457 fprintf (file, fmt_str_1, "Statements annotated", dfa_stats.num_stmt_anns,
458 SCALE (size), LABEL (size));
460 size = dfa_stats.num_var_anns * sizeof (struct var_ann_d);
461 total += size;
462 fprintf (file, fmt_str_1, "Variables annotated", dfa_stats.num_var_anns,
463 SCALE (size), LABEL (size));
465 size = dfa_stats.num_uses * sizeof (tree *);
466 total += size;
467 fprintf (file, fmt_str_1, "USE operands", dfa_stats.num_uses,
468 SCALE (size), LABEL (size));
470 size = dfa_stats.num_defs * sizeof (tree *);
471 total += size;
472 fprintf (file, fmt_str_1, "DEF operands", dfa_stats.num_defs,
473 SCALE (size), LABEL (size));
475 size = dfa_stats.num_vuses * sizeof (tree *);
476 total += size;
477 fprintf (file, fmt_str_1, "VUSE operands", dfa_stats.num_vuses,
478 SCALE (size), LABEL (size));
480 size = dfa_stats.num_v_may_defs * sizeof (tree *);
481 total += size;
482 fprintf (file, fmt_str_1, "V_MAY_DEF operands", dfa_stats.num_v_may_defs,
483 SCALE (size), LABEL (size));
485 size = dfa_stats.num_v_must_defs * sizeof (tree *);
486 total += size;
487 fprintf (file, fmt_str_1, "V_MUST_DEF operands", dfa_stats.num_v_must_defs,
488 SCALE (size), LABEL (size));
490 size = dfa_stats.num_phis * sizeof (struct tree_phi_node);
491 total += size;
492 fprintf (file, fmt_str_1, "PHI nodes", dfa_stats.num_phis,
493 SCALE (size), LABEL (size));
495 size = dfa_stats.num_phi_args * sizeof (struct phi_arg_d);
496 total += size;
497 fprintf (file, fmt_str_1, "PHI arguments", dfa_stats.num_phi_args,
498 SCALE (size), LABEL (size));
500 fprintf (file, "---------------------------------------------------------\n");
501 fprintf (file, fmt_str_3, "Total memory used by DFA/SSA data", SCALE (total),
502 LABEL (total));
503 fprintf (file, "---------------------------------------------------------\n");
504 fprintf (file, "\n");
506 if (dfa_stats.num_phis)
507 fprintf (file, "Average number of arguments per PHI node: %.1f (max: %d)\n",
508 (float) dfa_stats.num_phi_args / (float) dfa_stats.num_phis,
509 dfa_stats.max_num_phi_args);
511 fprintf (file, "\n");
515 /* Dump DFA statistics on stderr. */
517 void
518 debug_dfa_stats (void)
520 dump_dfa_stats (stderr);
524 /* Collect DFA statistics and store them in the structure pointed to by
525 DFA_STATS_P. */
527 static void
528 collect_dfa_stats (struct dfa_stats_d *dfa_stats_p)
530 struct pointer_set_t *pset;
531 basic_block bb;
532 block_stmt_iterator i;
534 gcc_assert (dfa_stats_p);
536 memset ((void *)dfa_stats_p, 0, sizeof (struct dfa_stats_d));
538 /* Walk all the trees in the function counting references. Start at
539 basic block NUM_FIXED_BLOCKS, but don't stop at block boundaries. */
540 pset = pointer_set_create ();
542 for (i = bsi_start (BASIC_BLOCK (NUM_FIXED_BLOCKS));
543 !bsi_end_p (i); bsi_next (&i))
544 walk_tree (bsi_stmt_ptr (i), collect_dfa_stats_r, (void *) dfa_stats_p,
545 pset);
547 pointer_set_destroy (pset);
549 FOR_EACH_BB (bb)
551 tree phi;
552 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
554 dfa_stats_p->num_phis++;
555 dfa_stats_p->num_phi_args += PHI_NUM_ARGS (phi);
556 if (PHI_NUM_ARGS (phi) > dfa_stats_p->max_num_phi_args)
557 dfa_stats_p->max_num_phi_args = PHI_NUM_ARGS (phi);
563 /* Callback for walk_tree to collect DFA statistics for a tree and its
564 children. */
566 static tree
567 collect_dfa_stats_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
568 void *data)
570 tree t = *tp;
571 struct dfa_stats_d *dfa_stats_p = (struct dfa_stats_d *)data;
573 if (t->common.ann)
575 switch (ann_type (t->common.ann))
577 case STMT_ANN:
579 dfa_stats_p->num_stmt_anns++;
580 dfa_stats_p->num_defs += NUM_SSA_OPERANDS (t, SSA_OP_DEF);
581 dfa_stats_p->num_uses += NUM_SSA_OPERANDS (t, SSA_OP_USE);
582 dfa_stats_p->num_v_may_defs += NUM_SSA_OPERANDS (t, SSA_OP_VMAYDEF);
583 dfa_stats_p->num_vuses += NUM_SSA_OPERANDS (t, SSA_OP_VUSE);
584 dfa_stats_p->num_v_must_defs +=
585 NUM_SSA_OPERANDS (t, SSA_OP_VMUSTDEF);
586 break;
589 case VAR_ANN:
590 dfa_stats_p->num_var_anns++;
591 break;
593 default:
594 break;
598 return NULL;
602 /*---------------------------------------------------------------------------
603 Miscellaneous helpers
604 ---------------------------------------------------------------------------*/
605 /* Callback for walk_tree. Used to collect variables referenced in
606 the function. */
608 static tree
609 find_vars_r (tree *tp, int *walk_subtrees, void *data)
611 struct walk_state *walk_state = (struct walk_state *) data;
613 /* If T is a regular variable that the optimizers are interested
614 in, add it to the list of variables. */
615 if (SSA_VAR_P (*tp))
616 add_referenced_var (*tp, walk_state);
618 /* Type, _DECL and constant nodes have no interesting children.
619 Ignore them. */
620 else if (IS_TYPE_OR_DECL_P (*tp) || CONSTANT_CLASS_P (*tp))
621 *walk_subtrees = 0;
623 return NULL_TREE;
627 /* Lookup UID in the referenced_vars hashtable and return the associated
628 variable or NULL if it is not there. */
630 tree
631 referenced_var_lookup_if_exists (unsigned int uid)
633 struct int_tree_map *h, in;
634 in.uid = uid;
635 h = (struct int_tree_map *) htab_find_with_hash (referenced_vars, &in, uid);
636 if (h)
637 return h->to;
638 return NULL_TREE;
641 /* Lookup UID in the referenced_vars hashtable and return the associated
642 variable. */
644 tree
645 referenced_var_lookup (unsigned int uid)
647 struct int_tree_map *h, in;
648 in.uid = uid;
649 h = (struct int_tree_map *) htab_find_with_hash (referenced_vars, &in, uid);
650 gcc_assert (h || uid == 0);
651 if (h)
652 return h->to;
653 return NULL_TREE;
656 /* Insert the pair UID, TO into the referenced_vars hashtable. */
658 static void
659 referenced_var_insert (unsigned int uid, tree to)
661 struct int_tree_map *h;
662 void **loc;
664 h = GGC_NEW (struct int_tree_map);
665 h->uid = uid;
666 h->to = to;
667 loc = htab_find_slot_with_hash (referenced_vars, h, uid, INSERT);
668 *(struct int_tree_map **) loc = h;
671 /* Lookup VAR UID in the default_defs hashtable and return the associated
672 variable. */
674 tree
675 default_def (tree var)
677 struct int_tree_map *h, in;
678 gcc_assert (SSA_VAR_P (var));
679 in.uid = DECL_UID (var);
680 h = (struct int_tree_map *) htab_find_with_hash (default_defs, &in,
681 DECL_UID (var));
682 if (h)
683 return h->to;
684 return NULL_TREE;
687 /* Insert the pair VAR's UID, DEF into the default_defs hashtable. */
689 void
690 set_default_def (tree var, tree def)
692 struct int_tree_map in;
693 struct int_tree_map *h;
694 void **loc;
696 gcc_assert (SSA_VAR_P (var));
697 in.uid = DECL_UID (var);
698 if (!def && default_def (var))
700 loc = htab_find_slot_with_hash (default_defs, &in, DECL_UID (var), INSERT);
701 htab_remove_elt (default_defs, *loc);
702 return;
704 gcc_assert (TREE_CODE (def) == SSA_NAME);
705 loc = htab_find_slot_with_hash (default_defs, &in, DECL_UID (var), INSERT);
706 /* Default definition might be changed by tail call optimization. */
707 if (!*loc)
709 h = GGC_NEW (struct int_tree_map);
710 h->uid = DECL_UID (var);
711 h->to = def;
712 *(struct int_tree_map **) loc = h;
714 else
716 h = (struct int_tree_map *) *loc;
717 h->to = def;
721 /* Add VAR to the list of dereferenced variables.
723 WALK_STATE contains a hash table used to avoid adding the same
724 variable more than once. Note that this function assumes that
725 VAR is a valid SSA variable. If WALK_STATE is NULL, no
726 duplicate checking is done. */
728 static void
729 add_referenced_var (tree var, struct walk_state *walk_state)
731 void **slot;
732 var_ann_t v_ann;
734 v_ann = get_var_ann (var);
736 if (walk_state)
737 slot = htab_find_slot (walk_state->vars_found, (void *) var, INSERT);
738 else
739 slot = NULL;
741 if (slot == NULL || *slot == NULL)
743 /* This is the first time we find this variable, add it to the
744 REFERENCED_VARS array and annotate it with attributes that are
745 intrinsic to the variable. */
746 if (slot)
747 *slot = (void *) var;
749 referenced_var_insert (DECL_UID (var), var);
751 /* Tag's don't have DECL_INITIAL. */
752 if (MTAG_P (var))
753 return;
755 /* Tag's don't have DECL_INITIAL. */
756 if (MTAG_P (var))
757 return;
759 /* Scan DECL_INITIAL for pointer variables as they may contain
760 address arithmetic referencing the address of other
761 variables. */
762 if (DECL_INITIAL (var)
763 /* Initializers of external variables are not useful to the
764 optimizers. */
765 && !DECL_EXTERNAL (var)
766 /* It's not necessary to walk the initial value of non-constant
767 variables because it cannot be propagated by the
768 optimizers. */
769 && (TREE_CONSTANT (var) || TREE_READONLY (var)))
770 walk_tree (&DECL_INITIAL (var), find_vars_r, walk_state, 0);
775 /* Return the virtual variable associated to the non-scalar variable VAR. */
777 tree
778 get_virtual_var (tree var)
780 STRIP_NOPS (var);
782 if (TREE_CODE (var) == SSA_NAME)
783 var = SSA_NAME_VAR (var);
785 while (TREE_CODE (var) == REALPART_EXPR || TREE_CODE (var) == IMAGPART_EXPR
786 || handled_component_p (var))
787 var = TREE_OPERAND (var, 0);
789 /* Treating GIMPLE registers as virtual variables makes no sense.
790 Also complain if we couldn't extract a _DECL out of the original
791 expression. */
792 gcc_assert (SSA_VAR_P (var));
793 gcc_assert (!is_gimple_reg (var));
795 return var;
798 /* Add a temporary variable to REFERENCED_VARS. This is similar to
799 add_referenced_var, but is used by passes that need to add new temps to
800 the REFERENCED_VARS array after the program has been scanned for
801 variables. The variable will just receive a new UID and be added
802 to the REFERENCED_VARS array without checking for duplicates. */
804 void
805 add_referenced_tmp_var (tree var)
807 add_referenced_var (var, NULL);
811 /* Mark all the non-SSA variables found in STMT's operands to be
812 processed by update_ssa. */
814 void
815 mark_new_vars_to_rename (tree stmt)
817 ssa_op_iter iter;
818 tree val;
819 bitmap vars_in_vops_to_rename;
820 bool found_exposed_symbol = false;
821 int v_may_defs_before, v_may_defs_after;
822 int v_must_defs_before, v_must_defs_after;
824 if (TREE_CODE (stmt) == PHI_NODE)
825 return;
827 get_stmt_ann (stmt);
828 vars_in_vops_to_rename = BITMAP_ALLOC (NULL);
830 /* Before re-scanning the statement for operands, mark the existing
831 virtual operands to be renamed again. We do this because when new
832 symbols are exposed, the virtual operands that were here before due to
833 aliasing will probably be removed by the call to get_stmt_operand.
834 Therefore, we need to flag them to be renamed beforehand.
836 We flag them in a separate bitmap because we don't really want to
837 rename them if there are not any newly exposed symbols in the
838 statement operands. */
839 v_may_defs_before = NUM_SSA_OPERANDS (stmt, SSA_OP_VMAYDEF);
840 v_must_defs_before = NUM_SSA_OPERANDS (stmt, SSA_OP_VMUSTDEF);
842 FOR_EACH_SSA_TREE_OPERAND (val, stmt, iter,
843 SSA_OP_VMAYDEF | SSA_OP_VUSE | SSA_OP_VMUSTDEF)
845 if (!DECL_P (val))
846 val = SSA_NAME_VAR (val);
847 bitmap_set_bit (vars_in_vops_to_rename, DECL_UID (val));
850 /* Now force an operand re-scan on the statement and mark any newly
851 exposed variables. */
852 update_stmt (stmt);
854 v_may_defs_after = NUM_SSA_OPERANDS (stmt, SSA_OP_VMAYDEF);
855 v_must_defs_after = NUM_SSA_OPERANDS (stmt, SSA_OP_VMUSTDEF);
857 FOR_EACH_SSA_TREE_OPERAND (val, stmt, iter, SSA_OP_ALL_OPERANDS)
858 if (DECL_P (val))
860 found_exposed_symbol = true;
861 mark_sym_for_renaming (val);
864 /* If we found any newly exposed symbols, or if there are fewer VDEF
865 operands in the statement, add the variables we had set in
866 VARS_IN_VOPS_TO_RENAME to VARS_TO_RENAME. We need to check for
867 vanishing VDEFs because in those cases, the names that were formerly
868 generated by this statement are not going to be available anymore. */
869 if (found_exposed_symbol
870 || v_may_defs_before > v_may_defs_after
871 || v_must_defs_before > v_must_defs_after)
872 mark_set_for_renaming (vars_in_vops_to_rename);
874 BITMAP_FREE (vars_in_vops_to_rename);
877 /* Find all variables within the gimplified statement that were not previously
878 visible to the function and add them to the referenced variables list. */
880 static tree
881 find_new_referenced_vars_1 (tree *tp, int *walk_subtrees,
882 void *data ATTRIBUTE_UNUSED)
884 tree t = *tp;
886 if (TREE_CODE (t) == VAR_DECL && !var_ann (t))
888 add_referenced_tmp_var (t);
889 mark_sym_for_renaming (t);
892 if (IS_TYPE_OR_DECL_P (t))
893 *walk_subtrees = 0;
895 return NULL;
898 void
899 find_new_referenced_vars (tree *stmt_p)
901 walk_tree (stmt_p, find_new_referenced_vars_1, NULL, NULL);
905 /* If REF is a handled component reference for a structure, return the
906 base variable. The access range is delimited by bit positions *POFFSET and
907 *POFFSET + *PMAX_SIZE. The access size is *PSIZE bits. If either
908 *PSIZE or *PMAX_SIZE is -1, they could not be determined. If *PSIZE
909 and *PMAX_SIZE are equal, the access is non-variable. */
911 tree
912 get_ref_base_and_extent (tree exp, HOST_WIDE_INT *poffset,
913 HOST_WIDE_INT *psize,
914 HOST_WIDE_INT *pmax_size)
916 HOST_WIDE_INT bitsize = -1;
917 HOST_WIDE_INT maxsize = -1;
918 tree size_tree = NULL_TREE;
919 tree bit_offset = bitsize_zero_node;
920 bool seen_variable_array_ref = false;
922 gcc_assert (!SSA_VAR_P (exp));
924 /* First get the final access size from just the outermost expression. */
925 if (TREE_CODE (exp) == COMPONENT_REF)
926 size_tree = DECL_SIZE (TREE_OPERAND (exp, 1));
927 else if (TREE_CODE (exp) == BIT_FIELD_REF)
928 size_tree = TREE_OPERAND (exp, 1);
929 else
931 enum machine_mode mode = TYPE_MODE (TREE_TYPE (exp));
932 if (mode == BLKmode)
933 size_tree = TYPE_SIZE (TREE_TYPE (exp));
934 else
935 bitsize = GET_MODE_BITSIZE (mode);
937 if (size_tree != NULL_TREE)
939 if (! host_integerp (size_tree, 1))
940 bitsize = -1;
941 else
942 bitsize = TREE_INT_CST_LOW (size_tree);
945 /* Initially, maxsize is the same as the accessed element size.
946 In the following it will only grow (or become -1). */
947 maxsize = bitsize;
949 /* Compute cumulative bit-offset for nested component-refs and array-refs,
950 and find the ultimate containing object. */
951 while (1)
953 switch (TREE_CODE (exp))
955 case BIT_FIELD_REF:
956 bit_offset = size_binop (PLUS_EXPR, bit_offset,
957 TREE_OPERAND (exp, 2));
958 break;
960 case COMPONENT_REF:
962 tree field = TREE_OPERAND (exp, 1);
963 tree this_offset = component_ref_field_offset (exp);
965 if (this_offset && TREE_CODE (this_offset) == INTEGER_CST)
967 this_offset = size_binop (MULT_EXPR,
968 fold_convert (bitsizetype,
969 this_offset),
970 bitsize_unit_node);
971 bit_offset = size_binop (PLUS_EXPR,
972 bit_offset, this_offset);
973 bit_offset = size_binop (PLUS_EXPR, bit_offset,
974 DECL_FIELD_BIT_OFFSET (field));
976 else
978 tree csize = TYPE_SIZE (TREE_TYPE (TREE_OPERAND (exp, 0)));
979 /* We need to adjust maxsize to the whole structure bitsize.
980 But we can subtract any constant offset seen sofar,
981 because that would get us out of the structure otherwise. */
982 if (maxsize != -1
983 && csize && host_integerp (csize, 1))
985 maxsize = (TREE_INT_CST_LOW (csize)
986 - TREE_INT_CST_LOW (bit_offset));
988 else
989 maxsize = -1;
992 break;
994 case ARRAY_REF:
995 case ARRAY_RANGE_REF:
997 tree index = TREE_OPERAND (exp, 1);
998 tree low_bound = array_ref_low_bound (exp);
999 tree unit_size = array_ref_element_size (exp);
1001 if (! integer_zerop (low_bound))
1002 index = fold_build2 (MINUS_EXPR, TREE_TYPE (index),
1003 index, low_bound);
1004 index = size_binop (MULT_EXPR,
1005 fold_convert (sizetype, index), unit_size);
1006 if (TREE_CODE (index) == INTEGER_CST)
1008 index = size_binop (MULT_EXPR,
1009 fold_convert (bitsizetype, index),
1010 bitsize_unit_node);
1011 bit_offset = size_binop (PLUS_EXPR, bit_offset, index);
1013 /* An array ref with a constant index up in the structure
1014 hierarchy will constrain the size of any variable array ref
1015 lower in the access hierarchy. */
1016 seen_variable_array_ref = false;
1018 else
1020 tree asize = TYPE_SIZE (TREE_TYPE (TREE_OPERAND (exp, 0)));
1021 /* We need to adjust maxsize to the whole array bitsize.
1022 But we can subtract any constant offset seen sofar,
1023 because that would get us outside of the array otherwise. */
1024 if (maxsize != -1
1025 && asize && host_integerp (asize, 1))
1027 maxsize = (TREE_INT_CST_LOW (asize)
1028 - TREE_INT_CST_LOW (bit_offset));
1030 else
1031 maxsize = -1;
1033 /* Remember that we have seen an array ref with a variable
1034 index. */
1035 seen_variable_array_ref = true;
1038 break;
1040 case REALPART_EXPR:
1041 break;
1043 case IMAGPART_EXPR:
1044 bit_offset = size_binop (PLUS_EXPR, bit_offset,
1045 bitsize_int (bitsize));
1046 break;
1048 case VIEW_CONVERT_EXPR:
1049 /* ??? We probably should give up here and bail out. */
1050 break;
1052 default:
1053 goto done;
1056 exp = TREE_OPERAND (exp, 0);
1058 done:
1060 /* We need to deal with variable arrays ending structures such as
1061 struct { int length; int a[1]; } x; x.a[d]
1062 struct { struct { int a; int b; } a[1]; } x; x.a[d].a
1063 struct { struct { int a[1]; } a[1]; } x; x.a[0][d], x.a[d][0]
1064 where we do not know maxsize for variable index accesses to
1065 the array. The simplest way to conservatively deal with this
1066 is to punt in the case that offset + maxsize reaches the
1067 base type boundary. */
1068 if (seen_variable_array_ref
1069 && maxsize != -1
1070 && host_integerp (TYPE_SIZE (TREE_TYPE (exp)), 1)
1071 && TREE_INT_CST_LOW (bit_offset) + maxsize
1072 == TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (exp))))
1073 maxsize = -1;
1075 /* ??? Due to negative offsets in ARRAY_REF we can end up with
1076 negative bit_offset here. We might want to store a zero offset
1077 in this case. */
1078 *poffset = TREE_INT_CST_LOW (bit_offset);
1079 *psize = bitsize;
1080 *pmax_size = maxsize;
1082 return exp;