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)
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. */
24 #include "coretypes.h"
27 #include "pointer-set.h"
31 #include "hard-reg-set.h"
32 #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-pass.h"
50 /* Build and maintain data flow information for trees. */
52 /* Counters used to display DFA and SSA statistics. */
68 /* State information for find_vars_r. */
71 /* Hash table used to avoid adding the same variable more than once. */
76 /* Local functions. */
77 static void collect_dfa_stats (struct dfa_stats_d *);
78 static tree collect_dfa_stats_r (tree *, int *, void *);
79 static 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. */
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
107 find_referenced_vars (void)
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;
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);
129 struct tree_opt_pass pass_referenced_vars =
133 find_referenced_vars, /* execute */
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 */
147 /*---------------------------------------------------------------------------
149 ---------------------------------------------------------------------------*/
150 /* Create a new annotation for a _DECL node T. */
153 create_var_ann (tree 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;
171 /* Create a new annotation for a FUNCTION_DECL node T. */
174 create_function_ann (tree 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;
192 /* Create a new annotation for a statement node T. */
195 create_stmt_ann (tree t)
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;
215 /* Create a new annotation for a tree T. */
218 create_tree_ann (tree 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;
234 /* Build a temporary. Make sure and register it to be renamed. */
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;
246 add_referenced_tmp_var (t);
247 mark_sym_for_renaming (t);
255 /*---------------------------------------------------------------------------
257 ---------------------------------------------------------------------------*/
258 /* Dump the list of all the referenced variables in the current function to
262 dump_referenced_vars (FILE *file)
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. */
282 debug_referenced_vars (void)
284 dump_referenced_vars (stderr);
288 /* Dump sub-variables for VAR to FILE. */
291 dump_subvars_for (FILE *file, tree var)
293 subvar_t sv = get_subvars_for_var (var);
298 fprintf (file, "{ ");
300 for (; sv; sv = sv->next)
302 print_generic_expr (file, sv->var, dump_flags);
310 /* Dumb sub-variables for VAR to stderr. */
313 debug_subvars_for (tree var)
315 dump_subvars_for (stderr, var);
319 /* Dump variable VAR and its may-aliases to FILE. */
322 dump_variable (FILE *file, tree var)
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>");
339 print_generic_expr (file, var, dump_flags);
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. */
422 debug_variable (tree var)
424 dump_variable (stderr, var);
428 /* Dump various DFA statistics to FILE. */
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";
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);
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);
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);
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 *);
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 *);
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 *);
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 *);
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 *);
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);
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);
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),
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. */
519 debug_dfa_stats (void)
521 dump_dfa_stats (stderr);
525 /* Collect DFA statistics and store them in the structure pointed to by
529 collect_dfa_stats (struct dfa_stats_d *dfa_stats_p)
531 struct pointer_set_t *pset;
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,
548 pointer_set_destroy (pset);
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
568 collect_dfa_stats_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
572 struct dfa_stats_d *dfa_stats_p = (struct dfa_stats_d *)data;
576 switch (ann_type (t->common.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);
591 dfa_stats_p->num_var_anns++;
603 /*---------------------------------------------------------------------------
604 Miscellaneous helpers
605 ---------------------------------------------------------------------------*/
606 /* Callback for walk_tree. Used to collect variables referenced in
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. */
617 add_referenced_var (*tp, walk_state);
619 /* Type, _DECL and constant nodes have no interesting children.
621 else if (IS_TYPE_OR_DECL_P (*tp) || CONSTANT_CLASS_P (*tp))
628 /* Lookup UID in the referenced_vars hashtable and return the associated
629 variable or NULL if it is not there. */
632 referenced_var_lookup_if_exists (unsigned int uid)
634 struct int_tree_map *h, in;
636 h = (struct int_tree_map *) htab_find_with_hash (referenced_vars, &in, uid);
642 /* Lookup UID in the referenced_vars hashtable and return the associated
646 referenced_var_lookup (unsigned int uid)
648 struct int_tree_map *h, in;
650 h = (struct int_tree_map *) htab_find_with_hash (referenced_vars, &in, uid);
651 gcc_assert (h || uid == 0);
657 /* Insert the pair UID, TO into the referenced_vars hashtable. */
660 referenced_var_insert (unsigned int uid, tree to)
662 struct int_tree_map *h;
665 h = GGC_NEW (struct int_tree_map);
668 loc = htab_find_slot_with_hash (referenced_vars, h, uid, INSERT);
669 *(struct int_tree_map **) loc = h;
672 /* Lookup VAR UID in the default_defs hashtable and return the associated
676 default_def (tree var)
678 struct int_tree_map *h, in;
679 gcc_assert (SSA_VAR_P (var));
680 in.uid = DECL_UID (var);
681 h = (struct int_tree_map *) htab_find_with_hash (default_defs, &in,
688 /* Insert the pair VAR's UID, DEF into the default_defs hashtable. */
691 set_default_def (tree var, tree def)
693 struct int_tree_map in;
694 struct int_tree_map *h;
697 gcc_assert (SSA_VAR_P (var));
698 in.uid = DECL_UID (var);
699 if (!def && default_def (var))
701 loc = htab_find_slot_with_hash (default_defs, &in, DECL_UID (var), INSERT);
702 htab_remove_elt (default_defs, *loc);
705 gcc_assert (TREE_CODE (def) == SSA_NAME);
706 loc = htab_find_slot_with_hash (default_defs, &in, DECL_UID (var), INSERT);
707 /* Default definition might be changed by tail call optimization. */
710 h = GGC_NEW (struct int_tree_map);
711 h->uid = DECL_UID (var);
713 *(struct int_tree_map **) loc = h;
717 h = (struct int_tree_map *) *loc;
722 /* Add VAR to the list of dereferenced variables.
724 WALK_STATE contains a hash table used to avoid adding the same
725 variable more than once. Note that this function assumes that
726 VAR is a valid SSA variable. If WALK_STATE is NULL, no
727 duplicate checking is done. */
730 add_referenced_var (tree var, struct walk_state *walk_state)
735 v_ann = get_var_ann (var);
738 slot = htab_find_slot (walk_state->vars_found, (void *) var, INSERT);
742 if (slot == NULL || *slot == NULL)
744 /* This is the first time we find this variable, add it to the
745 REFERENCED_VARS array and annotate it with attributes that are
746 intrinsic to the variable. */
748 *slot = (void *) var;
750 referenced_var_insert (DECL_UID (var), var);
752 /* Tag's don't have DECL_INITIAL. */
756 /* Scan DECL_INITIAL for pointer variables as they may contain
757 address arithmetic referencing the address of other
759 if (DECL_INITIAL (var)
760 /* Initializers of external variables are not useful to the
762 && !DECL_EXTERNAL (var)
763 /* It's not necessary to walk the initial value of non-constant
764 variables because it cannot be propagated by the
766 && (TREE_CONSTANT (var) || TREE_READONLY (var)))
767 walk_tree (&DECL_INITIAL (var), find_vars_r, walk_state, 0);
772 /* Return the virtual variable associated to the non-scalar variable VAR. */
775 get_virtual_var (tree var)
779 if (TREE_CODE (var) == SSA_NAME)
780 var = SSA_NAME_VAR (var);
782 while (TREE_CODE (var) == REALPART_EXPR || TREE_CODE (var) == IMAGPART_EXPR
783 || handled_component_p (var))
784 var = TREE_OPERAND (var, 0);
786 /* Treating GIMPLE registers as virtual variables makes no sense.
787 Also complain if we couldn't extract a _DECL out of the original
789 gcc_assert (SSA_VAR_P (var));
790 gcc_assert (!is_gimple_reg (var));
795 /* Add a temporary variable to REFERENCED_VARS. This is similar to
796 add_referenced_var, but is used by passes that need to add new temps to
797 the REFERENCED_VARS array after the program has been scanned for
798 variables. The variable will just receive a new UID and be added
799 to the REFERENCED_VARS array without checking for duplicates. */
802 add_referenced_tmp_var (tree var)
804 add_referenced_var (var, NULL);
808 /* Mark all the non-SSA variables found in STMT's operands to be
809 processed by update_ssa. */
812 mark_new_vars_to_rename (tree stmt)
816 bitmap vars_in_vops_to_rename;
817 bool found_exposed_symbol = false;
818 int v_may_defs_before, v_may_defs_after;
819 int v_must_defs_before, v_must_defs_after;
821 if (TREE_CODE (stmt) == PHI_NODE)
825 vars_in_vops_to_rename = BITMAP_ALLOC (NULL);
827 /* Before re-scanning the statement for operands, mark the existing
828 virtual operands to be renamed again. We do this because when new
829 symbols are exposed, the virtual operands that were here before due to
830 aliasing will probably be removed by the call to get_stmt_operand.
831 Therefore, we need to flag them to be renamed beforehand.
833 We flag them in a separate bitmap because we don't really want to
834 rename them if there are not any newly exposed symbols in the
835 statement operands. */
836 v_may_defs_before = NUM_SSA_OPERANDS (stmt, SSA_OP_VMAYDEF);
837 v_must_defs_before = NUM_SSA_OPERANDS (stmt, SSA_OP_VMUSTDEF);
839 FOR_EACH_SSA_TREE_OPERAND (val, stmt, iter,
840 SSA_OP_VMAYDEF | SSA_OP_VUSE | SSA_OP_VMUSTDEF)
843 val = SSA_NAME_VAR (val);
844 bitmap_set_bit (vars_in_vops_to_rename, DECL_UID (val));
847 /* Now force an operand re-scan on the statement and mark any newly
848 exposed variables. */
851 v_may_defs_after = NUM_SSA_OPERANDS (stmt, SSA_OP_VMAYDEF);
852 v_must_defs_after = NUM_SSA_OPERANDS (stmt, SSA_OP_VMUSTDEF);
854 FOR_EACH_SSA_TREE_OPERAND (val, stmt, iter, SSA_OP_ALL_OPERANDS)
857 found_exposed_symbol = true;
858 mark_sym_for_renaming (val);
861 /* If we found any newly exposed symbols, or if there are fewer VDEF
862 operands in the statement, add the variables we had set in
863 VARS_IN_VOPS_TO_RENAME to VARS_TO_RENAME. We need to check for
864 vanishing VDEFs because in those cases, the names that were formerly
865 generated by this statement are not going to be available anymore. */
866 if (found_exposed_symbol
867 || v_may_defs_before > v_may_defs_after
868 || v_must_defs_before > v_must_defs_after)
869 mark_set_for_renaming (vars_in_vops_to_rename);
871 BITMAP_FREE (vars_in_vops_to_rename);
874 /* Find all variables within the gimplified statement that were not previously
875 visible to the function and add them to the referenced variables list. */
878 find_new_referenced_vars_1 (tree *tp, int *walk_subtrees,
879 void *data ATTRIBUTE_UNUSED)
883 if (TREE_CODE (t) == VAR_DECL && !var_ann (t))
885 add_referenced_tmp_var (t);
886 mark_sym_for_renaming (t);
889 if (IS_TYPE_OR_DECL_P (t))
896 find_new_referenced_vars (tree *stmt_p)
898 walk_tree (stmt_p, find_new_referenced_vars_1, NULL, NULL);
902 /* If REF is a handled component reference for a structure, return the
903 base variable. The access range is delimited by bit positions *POFFSET and
904 *POFFSET + *PMAX_SIZE. The access size is *PSIZE bits. If either
905 *PSIZE or *PMAX_SIZE is -1, they could not be determined. If *PSIZE
906 and *PMAX_SIZE are equal, the access is non-variable. */
909 get_ref_base_and_extent (tree exp, HOST_WIDE_INT *poffset,
910 HOST_WIDE_INT *psize,
911 HOST_WIDE_INT *pmax_size)
913 HOST_WIDE_INT bitsize = -1;
914 HOST_WIDE_INT maxsize = -1;
915 tree size_tree = NULL_TREE;
916 tree bit_offset = bitsize_zero_node;
917 bool seen_variable_array_ref = false;
919 gcc_assert (!SSA_VAR_P (exp));
921 /* First get the final access size from just the outermost expression. */
922 if (TREE_CODE (exp) == COMPONENT_REF)
923 size_tree = DECL_SIZE (TREE_OPERAND (exp, 1));
924 else if (TREE_CODE (exp) == BIT_FIELD_REF)
925 size_tree = TREE_OPERAND (exp, 1);
928 enum machine_mode mode = TYPE_MODE (TREE_TYPE (exp));
930 size_tree = TYPE_SIZE (TREE_TYPE (exp));
932 bitsize = GET_MODE_BITSIZE (mode);
934 if (size_tree != NULL_TREE)
936 if (! host_integerp (size_tree, 1))
939 bitsize = TREE_INT_CST_LOW (size_tree);
942 /* Initially, maxsize is the same as the accessed element size.
943 In the following it will only grow (or become -1). */
946 /* Compute cumulative bit-offset for nested component-refs and array-refs,
947 and find the ultimate containing object. */
950 switch (TREE_CODE (exp))
953 bit_offset = size_binop (PLUS_EXPR, bit_offset,
954 TREE_OPERAND (exp, 2));
959 tree field = TREE_OPERAND (exp, 1);
960 tree this_offset = component_ref_field_offset (exp);
962 if (this_offset && TREE_CODE (this_offset) == INTEGER_CST)
964 this_offset = size_binop (MULT_EXPR,
965 fold_convert (bitsizetype,
968 bit_offset = size_binop (PLUS_EXPR,
969 bit_offset, this_offset);
970 bit_offset = size_binop (PLUS_EXPR, bit_offset,
971 DECL_FIELD_BIT_OFFSET (field));
975 tree csize = TYPE_SIZE (TREE_TYPE (TREE_OPERAND (exp, 0)));
976 /* We need to adjust maxsize to the whole structure bitsize.
977 But we can subtract any constant offset seen sofar,
978 because that would get us out of the structure otherwise. */
980 && csize && host_integerp (csize, 1))
982 maxsize = (TREE_INT_CST_LOW (csize)
983 - TREE_INT_CST_LOW (bit_offset));
992 case ARRAY_RANGE_REF:
994 tree index = TREE_OPERAND (exp, 1);
995 tree low_bound = array_ref_low_bound (exp);
996 tree unit_size = array_ref_element_size (exp);
998 if (! integer_zerop (low_bound))
999 index = fold_build2 (MINUS_EXPR, TREE_TYPE (index),
1001 index = size_binop (MULT_EXPR,
1002 fold_convert (sizetype, index), unit_size);
1003 if (TREE_CODE (index) == INTEGER_CST)
1005 index = size_binop (MULT_EXPR,
1006 fold_convert (bitsizetype, index),
1008 bit_offset = size_binop (PLUS_EXPR, bit_offset, index);
1010 /* An array ref with a constant index up in the structure
1011 hierarchy will constrain the size of any variable array ref
1012 lower in the access hierarchy. */
1013 seen_variable_array_ref = false;
1017 tree asize = TYPE_SIZE (TREE_TYPE (TREE_OPERAND (exp, 0)));
1018 /* We need to adjust maxsize to the whole array bitsize.
1019 But we can subtract any constant offset seen sofar,
1020 because that would get us outside of the array otherwise. */
1022 && asize && host_integerp (asize, 1))
1024 maxsize = (TREE_INT_CST_LOW (asize)
1025 - TREE_INT_CST_LOW (bit_offset));
1030 /* Remember that we have seen an array ref with a variable
1032 seen_variable_array_ref = true;
1041 bit_offset = size_binop (PLUS_EXPR, bit_offset,
1042 bitsize_int (bitsize));
1045 case VIEW_CONVERT_EXPR:
1046 /* ??? We probably should give up here and bail out. */
1053 exp = TREE_OPERAND (exp, 0);
1057 /* We need to deal with variable arrays ending structures such as
1058 struct { int length; int a[1]; } x; x.a[d]
1059 struct { struct { int a; int b; } a[1]; } x; x.a[d].a
1060 struct { struct { int a[1]; } a[1]; } x; x.a[0][d], x.a[d][0]
1061 where we do not know maxsize for variable index accesses to
1062 the array. The simplest way to conservatively deal with this
1063 is to punt in the case that offset + maxsize reaches the
1064 base type boundary. */
1065 if (seen_variable_array_ref
1067 && host_integerp (TYPE_SIZE (TREE_TYPE (exp)), 1)
1068 && TREE_INT_CST_LOW (bit_offset) + maxsize
1069 == TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (exp))))
1072 /* ??? Due to negative offsets in ARRAY_REF we can end up with
1073 negative bit_offset here. We might want to store a zero offset
1075 *poffset = TREE_INT_CST_LOW (bit_offset);
1077 *pmax_size = maxsize;