r113612@merlin: rearnsha | 2006-05-07 00:19:18 +0100
[official-gcc.git] / gcc / tree-dfa.c
blob9ff2bd50e006e5a44d09df92c8833dc0024129df
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 unsigned int
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);
126 return 0;
129 struct tree_opt_pass pass_referenced_vars =
131 NULL, /* name */
132 NULL, /* gate */
133 find_referenced_vars, /* execute */
134 NULL, /* sub */
135 NULL, /* next */
136 0, /* static_pass_number */
137 TV_FIND_REFERENCED_VARS, /* tv_id */
138 PROP_gimple_leh | PROP_cfg, /* properties_required */
139 PROP_referenced_vars, /* properties_provided */
140 0, /* properties_destroyed */
141 0, /* todo_flags_start */
142 0, /* todo_flags_finish */
143 0 /* letter */
147 /*---------------------------------------------------------------------------
148 Manage annotations
149 ---------------------------------------------------------------------------*/
150 /* Create a new annotation for a _DECL node T. */
152 var_ann_t
153 create_var_ann (tree t)
155 var_ann_t ann;
157 gcc_assert (t);
158 gcc_assert (DECL_P (t));
159 gcc_assert (!t->common.ann || t->common.ann->common.type == VAR_ANN);
161 ann = GGC_NEW (struct var_ann_d);
162 memset ((void *) ann, 0, sizeof (*ann));
164 ann->common.type = VAR_ANN;
166 t->common.ann = (tree_ann_t) ann;
168 return ann;
171 /* Create a new annotation for a FUNCTION_DECL node T. */
173 function_ann_t
174 create_function_ann (tree t)
176 function_ann_t ann;
178 gcc_assert (t);
179 gcc_assert (TREE_CODE (t) == FUNCTION_DECL);
180 gcc_assert (!t->common.ann || t->common.ann->common.type == FUNCTION_ANN);
182 ann = ggc_alloc (sizeof (*ann));
183 memset ((void *) ann, 0, sizeof (*ann));
185 ann->common.type = FUNCTION_ANN;
187 t->common.ann = (tree_ann_t) ann;
189 return ann;
192 /* Create a new annotation for a statement node T. */
194 stmt_ann_t
195 create_stmt_ann (tree t)
197 stmt_ann_t ann;
199 gcc_assert (is_gimple_stmt (t));
200 gcc_assert (!t->common.ann || t->common.ann->common.type == STMT_ANN);
202 ann = GGC_NEW (struct stmt_ann_d);
203 memset ((void *) ann, 0, sizeof (*ann));
205 ann->common.type = STMT_ANN;
207 /* Since we just created the annotation, mark the statement modified. */
208 ann->modified = true;
210 t->common.ann = (tree_ann_t) ann;
212 return ann;
215 /* Create a new annotation for a tree T. */
217 tree_ann_t
218 create_tree_ann (tree t)
220 tree_ann_t ann;
222 gcc_assert (t);
223 gcc_assert (!t->common.ann || t->common.ann->common.type == TREE_ANN_COMMON);
225 ann = GGC_NEW (union tree_ann_d);
226 memset ((void *) ann, 0, sizeof (*ann));
228 ann->common.type = TREE_ANN_COMMON;
229 t->common.ann = ann;
231 return ann;
234 /* Build a temporary. Make sure and register it to be renamed. */
236 tree
237 make_rename_temp (tree type, const char *prefix)
239 tree t = create_tmp_var (type, prefix);
241 if (TREE_CODE (type) == COMPLEX_TYPE)
242 DECL_COMPLEX_GIMPLE_REG_P (t) = 1;
244 if (referenced_vars)
246 add_referenced_tmp_var (t);
247 mark_sym_for_renaming (t);
250 return t;
255 /*---------------------------------------------------------------------------
256 Debugging functions
257 ---------------------------------------------------------------------------*/
258 /* Dump the list of all the referenced variables in the current function to
259 FILE. */
261 void
262 dump_referenced_vars (FILE *file)
264 tree var;
265 referenced_var_iterator rvi;
267 fprintf (file, "\nReferenced variables in %s: %u\n\n",
268 get_name (current_function_decl), (unsigned) num_referenced_vars);
270 FOR_EACH_REFERENCED_VAR (var, rvi)
272 fprintf (file, "Variable: ");
273 dump_variable (file, var);
274 fprintf (file, "\n");
279 /* Dump the list of all the referenced variables to stderr. */
281 void
282 debug_referenced_vars (void)
284 dump_referenced_vars (stderr);
288 /* Dump sub-variables for VAR to FILE. */
290 void
291 dump_subvars_for (FILE *file, tree var)
293 subvar_t sv = get_subvars_for_var (var);
295 if (!sv)
296 return;
298 fprintf (file, "{ ");
300 for (; sv; sv = sv->next)
302 print_generic_expr (file, sv->var, dump_flags);
303 fprintf (file, " ");
306 fprintf (file, "}");
310 /* Dumb sub-variables for VAR to stderr. */
312 void
313 debug_subvars_for (tree var)
315 dump_subvars_for (stderr, var);
319 /* Dump variable VAR and its may-aliases to FILE. */
321 void
322 dump_variable (FILE *file, tree var)
324 var_ann_t ann;
326 if (TREE_CODE (var) == SSA_NAME)
328 if (POINTER_TYPE_P (TREE_TYPE (var)))
329 dump_points_to_info_for (file, var);
330 var = SSA_NAME_VAR (var);
333 if (var == NULL_TREE)
335 fprintf (file, "<nil>");
336 return;
339 print_generic_expr (file, var, dump_flags);
341 ann = var_ann (var);
343 fprintf (file, ", UID %u", (unsigned) DECL_UID (var));
345 fprintf (file, ", ");
346 print_generic_expr (file, TREE_TYPE (var), dump_flags);
348 if (ann && ann->symbol_mem_tag)
350 fprintf (file, ", symbol memory tag: ");
351 print_generic_expr (file, ann->symbol_mem_tag, dump_flags);
354 if (ann && ann->is_aliased)
355 fprintf (file, ", is aliased");
357 if (TREE_ADDRESSABLE (var))
358 fprintf (file, ", is addressable");
360 if (is_global_var (var))
361 fprintf (file, ", is global");
363 if (TREE_THIS_VOLATILE (var))
364 fprintf (file, ", is volatile");
366 if (is_call_clobbered (var))
368 fprintf (file, ", call clobbered");
369 if (dump_flags & TDF_DETAILS)
371 var_ann_t va = var_ann (var);
372 unsigned int escape_mask = va->escape_mask;
374 fprintf (file, " (");
375 if (escape_mask & ESCAPE_STORED_IN_GLOBAL)
376 fprintf (file, ", stored in global");
377 if (escape_mask & ESCAPE_TO_ASM)
378 fprintf (file, ", goes through ASM");
379 if (escape_mask & ESCAPE_TO_CALL)
380 fprintf (file, ", passed to call");
381 if (escape_mask & ESCAPE_BAD_CAST)
382 fprintf (file, ", bad cast");
383 if (escape_mask & ESCAPE_TO_RETURN)
384 fprintf (file, ", returned from func");
385 if (escape_mask & ESCAPE_TO_PURE_CONST)
386 fprintf (file, ", passed to pure/const");
387 if (escape_mask & ESCAPE_IS_GLOBAL)
388 fprintf (file, ", is global var");
389 if (escape_mask & ESCAPE_IS_PARM)
390 fprintf (file, ", is incoming pointer");
391 if (escape_mask & ESCAPE_UNKNOWN)
392 fprintf (file, ", unknown escape");
393 fprintf (file, " )");
397 if (default_def (var))
399 fprintf (file, ", default def: ");
400 print_generic_expr (file, default_def (var), dump_flags);
403 if (may_aliases (var))
405 fprintf (file, ", may aliases: ");
406 dump_may_aliases_for (file, var);
409 if (get_subvars_for_var (var))
411 fprintf (file, ", sub-vars: ");
412 dump_subvars_for (file, var);
415 fprintf (file, "\n");
419 /* Dump variable VAR and its may-aliases to stderr. */
421 void
422 debug_variable (tree var)
424 dump_variable (stderr, var);
428 /* Dump various DFA statistics to FILE. */
430 void
431 dump_dfa_stats (FILE *file)
433 struct dfa_stats_d dfa_stats;
435 unsigned long size, total = 0;
436 const char * const fmt_str = "%-30s%-13s%12s\n";
437 const char * const fmt_str_1 = "%-30s%13lu%11lu%c\n";
438 const char * const fmt_str_3 = "%-43s%11lu%c\n";
439 const char *funcname
440 = lang_hooks.decl_printable_name (current_function_decl, 2);
442 collect_dfa_stats (&dfa_stats);
444 fprintf (file, "\nDFA Statistics for %s\n\n", funcname);
446 fprintf (file, "---------------------------------------------------------\n");
447 fprintf (file, fmt_str, "", " Number of ", "Memory");
448 fprintf (file, fmt_str, "", " instances ", "used ");
449 fprintf (file, "---------------------------------------------------------\n");
451 size = num_referenced_vars * sizeof (tree);
452 total += size;
453 fprintf (file, fmt_str_1, "Referenced variables", (unsigned long)num_referenced_vars,
454 SCALE (size), LABEL (size));
456 size = dfa_stats.num_stmt_anns * sizeof (struct stmt_ann_d);
457 total += size;
458 fprintf (file, fmt_str_1, "Statements annotated", dfa_stats.num_stmt_anns,
459 SCALE (size), LABEL (size));
461 size = dfa_stats.num_var_anns * sizeof (struct var_ann_d);
462 total += size;
463 fprintf (file, fmt_str_1, "Variables annotated", dfa_stats.num_var_anns,
464 SCALE (size), LABEL (size));
466 size = dfa_stats.num_uses * sizeof (tree *);
467 total += size;
468 fprintf (file, fmt_str_1, "USE operands", dfa_stats.num_uses,
469 SCALE (size), LABEL (size));
471 size = dfa_stats.num_defs * sizeof (tree *);
472 total += size;
473 fprintf (file, fmt_str_1, "DEF operands", dfa_stats.num_defs,
474 SCALE (size), LABEL (size));
476 size = dfa_stats.num_vuses * sizeof (tree *);
477 total += size;
478 fprintf (file, fmt_str_1, "VUSE operands", dfa_stats.num_vuses,
479 SCALE (size), LABEL (size));
481 size = dfa_stats.num_v_may_defs * sizeof (tree *);
482 total += size;
483 fprintf (file, fmt_str_1, "V_MAY_DEF operands", dfa_stats.num_v_may_defs,
484 SCALE (size), LABEL (size));
486 size = dfa_stats.num_v_must_defs * sizeof (tree *);
487 total += size;
488 fprintf (file, fmt_str_1, "V_MUST_DEF operands", dfa_stats.num_v_must_defs,
489 SCALE (size), LABEL (size));
491 size = dfa_stats.num_phis * sizeof (struct tree_phi_node);
492 total += size;
493 fprintf (file, fmt_str_1, "PHI nodes", dfa_stats.num_phis,
494 SCALE (size), LABEL (size));
496 size = dfa_stats.num_phi_args * sizeof (struct phi_arg_d);
497 total += size;
498 fprintf (file, fmt_str_1, "PHI arguments", dfa_stats.num_phi_args,
499 SCALE (size), LABEL (size));
501 fprintf (file, "---------------------------------------------------------\n");
502 fprintf (file, fmt_str_3, "Total memory used by DFA/SSA data", SCALE (total),
503 LABEL (total));
504 fprintf (file, "---------------------------------------------------------\n");
505 fprintf (file, "\n");
507 if (dfa_stats.num_phis)
508 fprintf (file, "Average number of arguments per PHI node: %.1f (max: %d)\n",
509 (float) dfa_stats.num_phi_args / (float) dfa_stats.num_phis,
510 dfa_stats.max_num_phi_args);
512 fprintf (file, "\n");
516 /* Dump DFA statistics on stderr. */
518 void
519 debug_dfa_stats (void)
521 dump_dfa_stats (stderr);
525 /* Collect DFA statistics and store them in the structure pointed to by
526 DFA_STATS_P. */
528 static void
529 collect_dfa_stats (struct dfa_stats_d *dfa_stats_p)
531 struct pointer_set_t *pset;
532 basic_block bb;
533 block_stmt_iterator i;
535 gcc_assert (dfa_stats_p);
537 memset ((void *)dfa_stats_p, 0, sizeof (struct dfa_stats_d));
539 /* Walk all the trees in the function counting references. Start at
540 basic block NUM_FIXED_BLOCKS, but don't stop at block boundaries. */
541 pset = pointer_set_create ();
543 for (i = bsi_start (BASIC_BLOCK (NUM_FIXED_BLOCKS));
544 !bsi_end_p (i); bsi_next (&i))
545 walk_tree (bsi_stmt_ptr (i), collect_dfa_stats_r, (void *) dfa_stats_p,
546 pset);
548 pointer_set_destroy (pset);
550 FOR_EACH_BB (bb)
552 tree phi;
553 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
555 dfa_stats_p->num_phis++;
556 dfa_stats_p->num_phi_args += PHI_NUM_ARGS (phi);
557 if (PHI_NUM_ARGS (phi) > dfa_stats_p->max_num_phi_args)
558 dfa_stats_p->max_num_phi_args = PHI_NUM_ARGS (phi);
564 /* Callback for walk_tree to collect DFA statistics for a tree and its
565 children. */
567 static tree
568 collect_dfa_stats_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
569 void *data)
571 tree t = *tp;
572 struct dfa_stats_d *dfa_stats_p = (struct dfa_stats_d *)data;
574 if (t->common.ann)
576 switch (ann_type (t->common.ann))
578 case STMT_ANN:
580 dfa_stats_p->num_stmt_anns++;
581 dfa_stats_p->num_defs += NUM_SSA_OPERANDS (t, SSA_OP_DEF);
582 dfa_stats_p->num_uses += NUM_SSA_OPERANDS (t, SSA_OP_USE);
583 dfa_stats_p->num_v_may_defs += NUM_SSA_OPERANDS (t, SSA_OP_VMAYDEF);
584 dfa_stats_p->num_vuses += NUM_SSA_OPERANDS (t, SSA_OP_VUSE);
585 dfa_stats_p->num_v_must_defs +=
586 NUM_SSA_OPERANDS (t, SSA_OP_VMUSTDEF);
587 break;
590 case VAR_ANN:
591 dfa_stats_p->num_var_anns++;
592 break;
594 default:
595 break;
599 return NULL;
603 /*---------------------------------------------------------------------------
604 Miscellaneous helpers
605 ---------------------------------------------------------------------------*/
606 /* Callback for walk_tree. Used to collect variables referenced in
607 the function. */
609 static tree
610 find_vars_r (tree *tp, int *walk_subtrees, void *data)
612 struct walk_state *walk_state = (struct walk_state *) data;
614 /* If T is a regular variable that the optimizers are interested
615 in, add it to the list of variables. */
616 if (SSA_VAR_P (*tp))
617 add_referenced_var (*tp, walk_state);
619 /* Type, _DECL and constant nodes have no interesting children.
620 Ignore them. */
621 else if (IS_TYPE_OR_DECL_P (*tp) || CONSTANT_CLASS_P (*tp))
622 *walk_subtrees = 0;
624 return NULL_TREE;
628 /* Lookup UID in the referenced_vars hashtable and return the associated
629 variable. */
631 tree
632 referenced_var_lookup (unsigned int uid)
634 struct int_tree_map *h, in;
635 in.uid = uid;
636 h = (struct int_tree_map *) htab_find_with_hash (referenced_vars, &in, uid);
637 gcc_assert (h || uid == 0);
638 if (h)
639 return h->to;
640 return NULL_TREE;
643 /* Insert the pair UID, TO into the referenced_vars hashtable. */
645 static void
646 referenced_var_insert (unsigned int uid, tree to)
648 struct int_tree_map *h;
649 void **loc;
651 h = GGC_NEW (struct int_tree_map);
652 h->uid = uid;
653 h->to = to;
654 loc = htab_find_slot_with_hash (referenced_vars, h, uid, INSERT);
655 *(struct int_tree_map **) loc = h;
658 /* Lookup VAR UID in the default_defs hashtable and return the associated
659 variable. */
661 tree
662 default_def (tree var)
664 struct int_tree_map *h, in;
665 gcc_assert (SSA_VAR_P (var));
666 in.uid = DECL_UID (var);
667 h = (struct int_tree_map *) htab_find_with_hash (default_defs, &in,
668 DECL_UID (var));
669 if (h)
670 return h->to;
671 return NULL_TREE;
674 /* Insert the pair VAR's UID, DEF into the default_defs hashtable. */
676 void
677 set_default_def (tree var, tree def)
679 struct int_tree_map in;
680 struct int_tree_map *h;
681 void **loc;
683 gcc_assert (SSA_VAR_P (var));
684 in.uid = DECL_UID (var);
685 if (!def && default_def (var))
687 loc = htab_find_slot_with_hash (default_defs, &in, DECL_UID (var), INSERT);
688 htab_remove_elt (default_defs, *loc);
689 return;
691 gcc_assert (TREE_CODE (def) == SSA_NAME);
692 loc = htab_find_slot_with_hash (default_defs, &in, DECL_UID (var), INSERT);
693 /* Default definition might be changed by tail call optimization. */
694 if (!*loc)
696 h = GGC_NEW (struct int_tree_map);
697 h->uid = DECL_UID (var);
698 h->to = def;
699 *(struct int_tree_map **) loc = h;
701 else
703 h = (struct int_tree_map *) *loc;
704 h->to = def;
708 /* Add VAR to the list of dereferenced variables.
710 WALK_STATE contains a hash table used to avoid adding the same
711 variable more than once. Note that this function assumes that
712 VAR is a valid SSA variable. If WALK_STATE is NULL, no
713 duplicate checking is done. */
715 static void
716 add_referenced_var (tree var, struct walk_state *walk_state)
718 void **slot;
719 var_ann_t v_ann;
721 v_ann = get_var_ann (var);
723 if (walk_state)
724 slot = htab_find_slot (walk_state->vars_found, (void *) var, INSERT);
725 else
726 slot = NULL;
728 if (slot == NULL || *slot == NULL)
730 /* This is the first time we find this variable, add it to the
731 REFERENCED_VARS array and annotate it with attributes that are
732 intrinsic to the variable. */
733 if (slot)
734 *slot = (void *) var;
736 referenced_var_insert (DECL_UID (var), var);
738 /* Tag's don't have DECL_INITIAL. */
739 if (MTAG_P (var))
740 return;
742 /* Scan DECL_INITIAL for pointer variables as they may contain
743 address arithmetic referencing the address of other
744 variables. */
745 if (DECL_INITIAL (var)
746 /* Initializers of external variables are not useful to the
747 optimizers. */
748 && !DECL_EXTERNAL (var)
749 /* It's not necessary to walk the initial value of non-constant
750 variables because it cannot be propagated by the
751 optimizers. */
752 && (TREE_CONSTANT (var) || TREE_READONLY (var)))
753 walk_tree (&DECL_INITIAL (var), find_vars_r, walk_state, 0);
758 /* Return the virtual variable associated to the non-scalar variable VAR. */
760 tree
761 get_virtual_var (tree var)
763 STRIP_NOPS (var);
765 if (TREE_CODE (var) == SSA_NAME)
766 var = SSA_NAME_VAR (var);
768 while (TREE_CODE (var) == REALPART_EXPR || TREE_CODE (var) == IMAGPART_EXPR
769 || handled_component_p (var))
770 var = TREE_OPERAND (var, 0);
772 /* Treating GIMPLE registers as virtual variables makes no sense.
773 Also complain if we couldn't extract a _DECL out of the original
774 expression. */
775 gcc_assert (SSA_VAR_P (var));
776 gcc_assert (!is_gimple_reg (var));
778 return var;
781 /* Add a temporary variable to REFERENCED_VARS. This is similar to
782 add_referenced_var, but is used by passes that need to add new temps to
783 the REFERENCED_VARS array after the program has been scanned for
784 variables. The variable will just receive a new UID and be added
785 to the REFERENCED_VARS array without checking for duplicates. */
787 void
788 add_referenced_tmp_var (tree var)
790 add_referenced_var (var, NULL);
794 /* Mark all the non-SSA variables found in STMT's operands to be
795 processed by update_ssa. */
797 void
798 mark_new_vars_to_rename (tree stmt)
800 ssa_op_iter iter;
801 tree val;
802 bitmap vars_in_vops_to_rename;
803 bool found_exposed_symbol = false;
804 int v_may_defs_before, v_may_defs_after;
805 int v_must_defs_before, v_must_defs_after;
807 if (TREE_CODE (stmt) == PHI_NODE)
808 return;
810 get_stmt_ann (stmt);
811 vars_in_vops_to_rename = BITMAP_ALLOC (NULL);
813 /* Before re-scanning the statement for operands, mark the existing
814 virtual operands to be renamed again. We do this because when new
815 symbols are exposed, the virtual operands that were here before due to
816 aliasing will probably be removed by the call to get_stmt_operand.
817 Therefore, we need to flag them to be renamed beforehand.
819 We flag them in a separate bitmap because we don't really want to
820 rename them if there are not any newly exposed symbols in the
821 statement operands. */
822 v_may_defs_before = NUM_SSA_OPERANDS (stmt, SSA_OP_VMAYDEF);
823 v_must_defs_before = NUM_SSA_OPERANDS (stmt, SSA_OP_VMUSTDEF);
825 FOR_EACH_SSA_TREE_OPERAND (val, stmt, iter,
826 SSA_OP_VMAYDEF | SSA_OP_VUSE | SSA_OP_VMUSTDEF)
828 if (!DECL_P (val))
829 val = SSA_NAME_VAR (val);
830 bitmap_set_bit (vars_in_vops_to_rename, DECL_UID (val));
833 /* Now force an operand re-scan on the statement and mark any newly
834 exposed variables. */
835 update_stmt (stmt);
837 v_may_defs_after = NUM_SSA_OPERANDS (stmt, SSA_OP_VMAYDEF);
838 v_must_defs_after = NUM_SSA_OPERANDS (stmt, SSA_OP_VMUSTDEF);
840 FOR_EACH_SSA_TREE_OPERAND (val, stmt, iter, SSA_OP_ALL_OPERANDS)
841 if (DECL_P (val))
843 found_exposed_symbol = true;
844 mark_sym_for_renaming (val);
847 /* If we found any newly exposed symbols, or if there are fewer VDEF
848 operands in the statement, add the variables we had set in
849 VARS_IN_VOPS_TO_RENAME to VARS_TO_RENAME. We need to check for
850 vanishing VDEFs because in those cases, the names that were formerly
851 generated by this statement are not going to be available anymore. */
852 if (found_exposed_symbol
853 || v_may_defs_before > v_may_defs_after
854 || v_must_defs_before > v_must_defs_after)
855 mark_set_for_renaming (vars_in_vops_to_rename);
857 BITMAP_FREE (vars_in_vops_to_rename);
860 /* Find all variables within the gimplified statement that were not previously
861 visible to the function and add them to the referenced variables list. */
863 static tree
864 find_new_referenced_vars_1 (tree *tp, int *walk_subtrees,
865 void *data ATTRIBUTE_UNUSED)
867 tree t = *tp;
869 if (TREE_CODE (t) == VAR_DECL && !var_ann (t))
871 add_referenced_tmp_var (t);
872 mark_sym_for_renaming (t);
875 if (IS_TYPE_OR_DECL_P (t))
876 *walk_subtrees = 0;
878 return NULL;
881 void
882 find_new_referenced_vars (tree *stmt_p)
884 walk_tree (stmt_p, find_new_referenced_vars_1, NULL, NULL);
888 /* If REF is a handled component reference for a structure, return the
889 base variable. The access range is delimited by bit positions *POFFSET and
890 *POFFSET + *PMAX_SIZE. The access size is *PSIZE bits. If either
891 *PSIZE or *PMAX_SIZE is -1, they could not be determined. If *PSIZE
892 and *PMAX_SIZE are equal, the access is non-variable. */
894 tree
895 get_ref_base_and_extent (tree exp, HOST_WIDE_INT *poffset,
896 HOST_WIDE_INT *psize,
897 HOST_WIDE_INT *pmax_size)
899 HOST_WIDE_INT bitsize = -1;
900 HOST_WIDE_INT maxsize = -1;
901 tree size_tree = NULL_TREE;
902 tree bit_offset = bitsize_zero_node;
903 bool seen_variable_array_ref = false;
905 gcc_assert (!SSA_VAR_P (exp));
907 /* First get the final access size from just the outermost expression. */
908 if (TREE_CODE (exp) == COMPONENT_REF)
909 size_tree = DECL_SIZE (TREE_OPERAND (exp, 1));
910 else if (TREE_CODE (exp) == BIT_FIELD_REF)
911 size_tree = TREE_OPERAND (exp, 1);
912 else
914 enum machine_mode mode = TYPE_MODE (TREE_TYPE (exp));
915 if (mode == BLKmode)
916 size_tree = TYPE_SIZE (TREE_TYPE (exp));
917 else
918 bitsize = GET_MODE_BITSIZE (mode);
920 if (size_tree != NULL_TREE)
922 if (! host_integerp (size_tree, 1))
923 bitsize = -1;
924 else
925 bitsize = TREE_INT_CST_LOW (size_tree);
928 /* Initially, maxsize is the same as the accessed element size.
929 In the following it will only grow (or become -1). */
930 maxsize = bitsize;
932 /* Compute cumulative bit-offset for nested component-refs and array-refs,
933 and find the ultimate containing object. */
934 while (1)
936 switch (TREE_CODE (exp))
938 case BIT_FIELD_REF:
939 bit_offset = size_binop (PLUS_EXPR, bit_offset,
940 TREE_OPERAND (exp, 2));
941 break;
943 case COMPONENT_REF:
945 tree field = TREE_OPERAND (exp, 1);
946 tree this_offset = component_ref_field_offset (exp);
948 if (this_offset && TREE_CODE (this_offset) == INTEGER_CST)
950 this_offset = size_binop (MULT_EXPR,
951 fold_convert (bitsizetype,
952 this_offset),
953 bitsize_unit_node);
954 bit_offset = size_binop (PLUS_EXPR,
955 bit_offset, this_offset);
956 bit_offset = size_binop (PLUS_EXPR, bit_offset,
957 DECL_FIELD_BIT_OFFSET (field));
959 else
961 tree csize = TYPE_SIZE (TREE_TYPE (TREE_OPERAND (exp, 0)));
962 /* We need to adjust maxsize to the whole structure bitsize.
963 But we can subtract any constant offset seen sofar,
964 because that would get us out of the structure otherwise. */
965 if (maxsize != -1
966 && csize && host_integerp (csize, 1))
968 maxsize = (TREE_INT_CST_LOW (csize)
969 - TREE_INT_CST_LOW (bit_offset));
971 else
972 maxsize = -1;
975 break;
977 case ARRAY_REF:
978 case ARRAY_RANGE_REF:
980 tree index = TREE_OPERAND (exp, 1);
981 tree low_bound = array_ref_low_bound (exp);
982 tree unit_size = array_ref_element_size (exp);
984 if (! integer_zerop (low_bound))
985 index = fold_build2 (MINUS_EXPR, TREE_TYPE (index),
986 index, low_bound);
987 index = size_binop (MULT_EXPR,
988 fold_convert (sizetype, index), unit_size);
989 if (TREE_CODE (index) == INTEGER_CST)
991 index = size_binop (MULT_EXPR,
992 fold_convert (bitsizetype, index),
993 bitsize_unit_node);
994 bit_offset = size_binop (PLUS_EXPR, bit_offset, index);
996 /* An array ref with a constant index up in the structure
997 hierarchy will constrain the size of any variable array ref
998 lower in the access hierarchy. */
999 seen_variable_array_ref = false;
1001 else
1003 tree asize = TYPE_SIZE (TREE_TYPE (TREE_OPERAND (exp, 0)));
1004 /* We need to adjust maxsize to the whole array bitsize.
1005 But we can subtract any constant offset seen sofar,
1006 because that would get us outside of the array otherwise. */
1007 if (maxsize != -1
1008 && asize && host_integerp (asize, 1))
1010 maxsize = (TREE_INT_CST_LOW (asize)
1011 - TREE_INT_CST_LOW (bit_offset));
1013 else
1014 maxsize = -1;
1016 /* Remember that we have seen an array ref with a variable
1017 index. */
1018 seen_variable_array_ref = true;
1021 break;
1023 case REALPART_EXPR:
1024 break;
1026 case IMAGPART_EXPR:
1027 bit_offset = size_binop (PLUS_EXPR, bit_offset,
1028 bitsize_int (bitsize));
1029 break;
1031 case VIEW_CONVERT_EXPR:
1032 /* ??? We probably should give up here and bail out. */
1033 break;
1035 default:
1036 goto done;
1039 exp = TREE_OPERAND (exp, 0);
1041 done:
1043 /* We need to deal with variable arrays ending structures such as
1044 struct { int length; int a[1]; } x; x.a[d]
1045 struct { struct { int a; int b; } a[1]; } x; x.a[d].a
1046 struct { struct { int a[1]; } a[1]; } x; x.a[0][d], x.a[d][0]
1047 where we do not know maxsize for variable index accesses to
1048 the array. The simplest way to conservatively deal with this
1049 is to punt in the case that offset + maxsize reaches the
1050 base type boundary. */
1051 if (seen_variable_array_ref
1052 && maxsize != -1
1053 && host_integerp (TYPE_SIZE (TREE_TYPE (exp)), 1)
1054 && TREE_INT_CST_LOW (bit_offset) + maxsize
1055 == TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (exp))))
1056 maxsize = -1;
1058 /* ??? Due to negative offsets in ARRAY_REF we can end up with
1059 negative bit_offset here. We might want to store a zero offset
1060 in this case. */
1061 *poffset = TREE_INT_CST_LOW (bit_offset);
1062 *psize = bitsize;
1063 *pmax_size = maxsize;
1065 return exp;