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
632 referenced_var_lookup (unsigned int uid
)
634 struct int_tree_map
*h
, in
;
636 h
= (struct int_tree_map
*) htab_find_with_hash (referenced_vars
, &in
, uid
);
637 gcc_assert (h
|| uid
== 0);
643 /* Insert the pair UID, TO into the referenced_vars hashtable. */
646 referenced_var_insert (unsigned int uid
, tree to
)
648 struct int_tree_map
*h
;
651 h
= GGC_NEW (struct int_tree_map
);
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
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
,
674 /* Insert the pair VAR's UID, DEF into the default_defs hashtable. */
677 set_default_def (tree var
, tree def
)
679 struct int_tree_map in
;
680 struct int_tree_map
*h
;
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
);
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. */
696 h
= GGC_NEW (struct int_tree_map
);
697 h
->uid
= DECL_UID (var
);
699 *(struct int_tree_map
**) loc
= h
;
703 h
= (struct int_tree_map
*) *loc
;
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. */
716 add_referenced_var (tree var
, struct walk_state
*walk_state
)
721 v_ann
= get_var_ann (var
);
724 slot
= htab_find_slot (walk_state
->vars_found
, (void *) var
, INSERT
);
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. */
734 *slot
= (void *) var
;
736 referenced_var_insert (DECL_UID (var
), var
);
738 /* Tag's don't have DECL_INITIAL. */
742 /* Scan DECL_INITIAL for pointer variables as they may contain
743 address arithmetic referencing the address of other
745 if (DECL_INITIAL (var
)
746 /* Initializers of external variables are not useful to the
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
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. */
761 get_virtual_var (tree 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
775 gcc_assert (SSA_VAR_P (var
));
776 gcc_assert (!is_gimple_reg (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. */
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. */
798 mark_new_vars_to_rename (tree stmt
)
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
)
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
)
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. */
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
)
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. */
864 find_new_referenced_vars_1 (tree
*tp
, int *walk_subtrees
,
865 void *data ATTRIBUTE_UNUSED
)
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
))
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. */
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);
914 enum machine_mode mode
= TYPE_MODE (TREE_TYPE (exp
));
916 size_tree
= TYPE_SIZE (TREE_TYPE (exp
));
918 bitsize
= GET_MODE_BITSIZE (mode
);
920 if (size_tree
!= NULL_TREE
)
922 if (! host_integerp (size_tree
, 1))
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). */
932 /* Compute cumulative bit-offset for nested component-refs and array-refs,
933 and find the ultimate containing object. */
936 switch (TREE_CODE (exp
))
939 bit_offset
= size_binop (PLUS_EXPR
, bit_offset
,
940 TREE_OPERAND (exp
, 2));
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
,
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
));
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. */
966 && csize
&& host_integerp (csize
, 1))
968 maxsize
= (TREE_INT_CST_LOW (csize
)
969 - TREE_INT_CST_LOW (bit_offset
));
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
),
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
),
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;
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. */
1008 && asize
&& host_integerp (asize
, 1))
1010 maxsize
= (TREE_INT_CST_LOW (asize
)
1011 - TREE_INT_CST_LOW (bit_offset
));
1016 /* Remember that we have seen an array ref with a variable
1018 seen_variable_array_ref
= true;
1027 bit_offset
= size_binop (PLUS_EXPR
, bit_offset
,
1028 bitsize_int (bitsize
));
1031 case VIEW_CONVERT_EXPR
:
1032 /* ??? We probably should give up here and bail out. */
1039 exp
= TREE_OPERAND (exp
, 0);
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
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
))))
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
1061 *poffset
= TREE_INT_CST_LOW (bit_offset
);
1063 *pmax_size
= maxsize
;