expmed.c (expand_divmod): Always use a comparison for a division by a large unsigned...
[official-gcc.git] / gcc / tree-dfa.c
blob1738dd0126602fc55081ad0ea8fe4427d0205016
1 /* Data flow functions for trees.
2 Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009
3 Free Software Foundation, Inc.
4 Contributed by Diego Novillo <dnovillo@redhat.com>
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
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 "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_var_anns;
56 long num_defs;
57 long num_uses;
58 long num_phis;
59 long num_phi_args;
60 size_t max_num_phi_args;
61 long num_vdefs;
62 long num_vuses;
66 /* Local functions. */
67 static void collect_dfa_stats (struct dfa_stats_d *);
68 static tree find_vars_r (tree *, int *, void *);
71 /*---------------------------------------------------------------------------
72 Dataflow analysis (DFA) routines
73 ---------------------------------------------------------------------------*/
74 /* Find all the variables referenced in the function. This function
75 builds the global arrays REFERENCED_VARS and CALL_CLOBBERED_VARS.
77 Note that this function does not look for statement operands, it simply
78 determines what variables are referenced in the program and detects
79 various attributes for each variable used by alias analysis and the
80 optimizer. */
82 static unsigned int
83 find_referenced_vars (void)
85 basic_block bb;
86 gimple_stmt_iterator si;
88 FOR_EACH_BB (bb)
90 for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
92 size_t i;
93 gimple stmt = gsi_stmt (si);
94 for (i = 0; i < gimple_num_ops (stmt); i++)
95 walk_tree (gimple_op_ptr (stmt, i), find_vars_r, NULL, NULL);
98 for (si = gsi_start_phis (bb); !gsi_end_p (si); gsi_next (&si))
100 gimple phi = gsi_stmt (si);
101 size_t i, len = gimple_phi_num_args (phi);
103 walk_tree (gimple_phi_result_ptr (phi), find_vars_r, NULL, NULL);
105 for (i = 0; i < len; i++)
107 tree arg = gimple_phi_arg_def (phi, i);
108 walk_tree (&arg, find_vars_r, NULL, NULL);
113 return 0;
116 struct gimple_opt_pass pass_referenced_vars =
119 GIMPLE_PASS,
120 NULL, /* name */
121 NULL, /* gate */
122 find_referenced_vars, /* execute */
123 NULL, /* sub */
124 NULL, /* next */
125 0, /* static_pass_number */
126 TV_FIND_REFERENCED_VARS, /* tv_id */
127 PROP_gimple_leh | PROP_cfg, /* properties_required */
128 PROP_referenced_vars, /* properties_provided */
129 0, /* properties_destroyed */
130 TODO_dump_func, /* todo_flags_start */
131 TODO_dump_func /* todo_flags_finish */
136 /*---------------------------------------------------------------------------
137 Manage annotations
138 ---------------------------------------------------------------------------*/
139 /* Create a new annotation for a _DECL node T. */
141 var_ann_t
142 create_var_ann (tree t)
144 var_ann_t ann;
146 gcc_assert (t);
147 gcc_assert (DECL_P (t));
148 gcc_assert (!t->base.ann || t->base.ann->common.type == VAR_ANN);
150 ann = GGC_CNEW (struct var_ann_d);
151 ann->common.type = VAR_ANN;
152 t->base.ann = (tree_ann_t) ann;
154 return ann;
157 /* Create a new annotation for a FUNCTION_DECL node T. */
159 function_ann_t
160 create_function_ann (tree t)
162 function_ann_t ann;
164 gcc_assert (t);
165 gcc_assert (TREE_CODE (t) == FUNCTION_DECL);
166 gcc_assert (!t->base.ann || t->base.ann->common.type == FUNCTION_ANN);
168 ann = (function_ann_t) ggc_alloc (sizeof (*ann));
169 memset ((void *) ann, 0, sizeof (*ann));
171 ann->common.type = FUNCTION_ANN;
173 t->base.ann = (tree_ann_t) ann;
175 return ann;
178 /* Renumber all of the gimple stmt uids. */
180 void
181 renumber_gimple_stmt_uids (void)
183 basic_block bb;
185 set_gimple_stmt_max_uid (cfun, 0);
186 FOR_ALL_BB (bb)
188 gimple_stmt_iterator bsi;
189 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
191 gimple stmt = gsi_stmt (bsi);
192 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
197 /* Create a new annotation for a tree T. */
199 tree_ann_common_t
200 create_tree_common_ann (tree t)
202 tree_ann_common_t ann;
204 gcc_assert (t);
205 gcc_assert (!t->base.ann || t->base.ann->common.type == TREE_ANN_COMMON);
207 ann = GGC_CNEW (struct tree_ann_common_d);
209 ann->type = TREE_ANN_COMMON;
210 ann->rn = -1;
211 t->base.ann = (tree_ann_t) ann;
213 return ann;
216 /* Build a temporary. Make sure and register it to be renamed. */
218 tree
219 make_rename_temp (tree type, const char *prefix)
221 tree t = create_tmp_var (type, prefix);
223 if (TREE_CODE (TREE_TYPE (t)) == COMPLEX_TYPE
224 || TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE)
225 DECL_GIMPLE_REG_P (t) = 1;
227 if (gimple_referenced_vars (cfun))
229 add_referenced_var (t);
230 mark_sym_for_renaming (t);
233 return t;
238 /*---------------------------------------------------------------------------
239 Debugging functions
240 ---------------------------------------------------------------------------*/
241 /* Dump the list of all the referenced variables in the current function to
242 FILE. */
244 void
245 dump_referenced_vars (FILE *file)
247 tree var;
248 referenced_var_iterator rvi;
250 fprintf (file, "\nReferenced variables in %s: %u\n\n",
251 get_name (current_function_decl), (unsigned) num_referenced_vars);
253 FOR_EACH_REFERENCED_VAR (var, rvi)
255 fprintf (file, "Variable: ");
256 dump_variable (file, var);
259 fprintf (file, "\n");
263 /* Dump the list of all the referenced variables to stderr. */
265 void
266 debug_referenced_vars (void)
268 dump_referenced_vars (stderr);
272 /* Dump variable VAR and its may-aliases to FILE. */
274 void
275 dump_variable (FILE *file, tree var)
277 var_ann_t ann;
279 if (TREE_CODE (var) == SSA_NAME)
281 if (POINTER_TYPE_P (TREE_TYPE (var)))
282 dump_points_to_info_for (file, var);
283 var = SSA_NAME_VAR (var);
286 if (var == NULL_TREE)
288 fprintf (file, "<nil>");
289 return;
292 print_generic_expr (file, var, dump_flags);
294 ann = var_ann (var);
296 fprintf (file, ", UID D.%u", (unsigned) DECL_UID (var));
298 fprintf (file, ", ");
299 print_generic_expr (file, TREE_TYPE (var), dump_flags);
301 if (TREE_ADDRESSABLE (var))
302 fprintf (file, ", is addressable");
304 if (is_global_var (var))
305 fprintf (file, ", is global");
307 if (TREE_THIS_VOLATILE (var))
308 fprintf (file, ", is volatile");
310 if (is_call_clobbered (var))
311 fprintf (file, ", call clobbered");
312 else if (is_call_used (var))
313 fprintf (file, ", call used");
315 if (ann->noalias_state == NO_ALIAS)
316 fprintf (file, ", NO_ALIAS (does not alias other NO_ALIAS symbols)");
317 else if (ann->noalias_state == NO_ALIAS_GLOBAL)
318 fprintf (file, ", NO_ALIAS_GLOBAL (does not alias other NO_ALIAS symbols"
319 " and global vars)");
320 else if (ann->noalias_state == NO_ALIAS_ANYTHING)
321 fprintf (file, ", NO_ALIAS_ANYTHING (does not alias any other symbols)");
323 if (gimple_default_def (cfun, var))
325 fprintf (file, ", default def: ");
326 print_generic_expr (file, gimple_default_def (cfun, var), dump_flags);
329 fprintf (file, "\n");
333 /* Dump variable VAR and its may-aliases to stderr. */
335 void
336 debug_variable (tree var)
338 dump_variable (stderr, var);
342 /* Dump various DFA statistics to FILE. */
344 void
345 dump_dfa_stats (FILE *file)
347 struct dfa_stats_d dfa_stats;
349 unsigned long size, total = 0;
350 const char * const fmt_str = "%-30s%-13s%12s\n";
351 const char * const fmt_str_1 = "%-30s%13lu%11lu%c\n";
352 const char * const fmt_str_3 = "%-43s%11lu%c\n";
353 const char *funcname
354 = lang_hooks.decl_printable_name (current_function_decl, 2);
356 collect_dfa_stats (&dfa_stats);
358 fprintf (file, "\nDFA Statistics for %s\n\n", funcname);
360 fprintf (file, "---------------------------------------------------------\n");
361 fprintf (file, fmt_str, "", " Number of ", "Memory");
362 fprintf (file, fmt_str, "", " instances ", "used ");
363 fprintf (file, "---------------------------------------------------------\n");
365 size = num_referenced_vars * sizeof (tree);
366 total += size;
367 fprintf (file, fmt_str_1, "Referenced variables", (unsigned long)num_referenced_vars,
368 SCALE (size), LABEL (size));
370 size = dfa_stats.num_var_anns * sizeof (struct var_ann_d);
371 total += size;
372 fprintf (file, fmt_str_1, "Variables annotated", dfa_stats.num_var_anns,
373 SCALE (size), LABEL (size));
375 size = dfa_stats.num_uses * sizeof (tree *);
376 total += size;
377 fprintf (file, fmt_str_1, "USE operands", dfa_stats.num_uses,
378 SCALE (size), LABEL (size));
380 size = dfa_stats.num_defs * sizeof (tree *);
381 total += size;
382 fprintf (file, fmt_str_1, "DEF operands", dfa_stats.num_defs,
383 SCALE (size), LABEL (size));
385 size = dfa_stats.num_vuses * sizeof (tree *);
386 total += size;
387 fprintf (file, fmt_str_1, "VUSE operands", dfa_stats.num_vuses,
388 SCALE (size), LABEL (size));
390 size = dfa_stats.num_vdefs * sizeof (tree *);
391 total += size;
392 fprintf (file, fmt_str_1, "VDEF operands", dfa_stats.num_vdefs,
393 SCALE (size), LABEL (size));
395 size = dfa_stats.num_phis * sizeof (struct gimple_statement_phi);
396 total += size;
397 fprintf (file, fmt_str_1, "PHI nodes", dfa_stats.num_phis,
398 SCALE (size), LABEL (size));
400 size = dfa_stats.num_phi_args * sizeof (struct phi_arg_d);
401 total += size;
402 fprintf (file, fmt_str_1, "PHI arguments", dfa_stats.num_phi_args,
403 SCALE (size), LABEL (size));
405 fprintf (file, "---------------------------------------------------------\n");
406 fprintf (file, fmt_str_3, "Total memory used by DFA/SSA data", SCALE (total),
407 LABEL (total));
408 fprintf (file, "---------------------------------------------------------\n");
409 fprintf (file, "\n");
411 if (dfa_stats.num_phis)
412 fprintf (file, "Average number of arguments per PHI node: %.1f (max: %ld)\n",
413 (float) dfa_stats.num_phi_args / (float) dfa_stats.num_phis,
414 (long) dfa_stats.max_num_phi_args);
416 fprintf (file, "\n");
420 /* Dump DFA statistics on stderr. */
422 void
423 debug_dfa_stats (void)
425 dump_dfa_stats (stderr);
429 /* Collect DFA statistics and store them in the structure pointed to by
430 DFA_STATS_P. */
432 static void
433 collect_dfa_stats (struct dfa_stats_d *dfa_stats_p ATTRIBUTE_UNUSED)
435 basic_block bb;
436 referenced_var_iterator vi;
437 tree var;
439 gcc_assert (dfa_stats_p);
441 memset ((void *)dfa_stats_p, 0, sizeof (struct dfa_stats_d));
443 /* Count all the variable annotations. */
444 FOR_EACH_REFERENCED_VAR (var, vi)
445 if (var_ann (var))
446 dfa_stats_p->num_var_anns++;
448 /* Walk all the statements in the function counting references. */
449 FOR_EACH_BB (bb)
451 gimple_stmt_iterator si;
453 for (si = gsi_start_phis (bb); !gsi_end_p (si); gsi_next (&si))
455 gimple phi = gsi_stmt (si);
456 dfa_stats_p->num_phis++;
457 dfa_stats_p->num_phi_args += gimple_phi_num_args (phi);
458 if (gimple_phi_num_args (phi) > dfa_stats_p->max_num_phi_args)
459 dfa_stats_p->max_num_phi_args = gimple_phi_num_args (phi);
462 for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
464 gimple stmt = gsi_stmt (si);
465 dfa_stats_p->num_defs += NUM_SSA_OPERANDS (stmt, SSA_OP_DEF);
466 dfa_stats_p->num_uses += NUM_SSA_OPERANDS (stmt, SSA_OP_USE);
467 dfa_stats_p->num_vdefs += gimple_vdef (stmt) ? 1 : 0;
468 dfa_stats_p->num_vuses += gimple_vuse (stmt) ? 1 : 0;
474 /*---------------------------------------------------------------------------
475 Miscellaneous helpers
476 ---------------------------------------------------------------------------*/
477 /* Callback for walk_tree. Used to collect variables referenced in
478 the function. */
480 static tree
481 find_vars_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
483 /* If we are reading the lto info back in, we need to rescan the
484 referenced vars. */
485 if (TREE_CODE (*tp) == SSA_NAME)
486 add_referenced_var (SSA_NAME_VAR (*tp));
488 /* If T is a regular variable that the optimizers are interested
489 in, add it to the list of variables. */
490 else if (SSA_VAR_P (*tp))
491 add_referenced_var (*tp);
493 /* Type, _DECL and constant nodes have no interesting children.
494 Ignore them. */
495 else if (IS_TYPE_OR_DECL_P (*tp) || CONSTANT_CLASS_P (*tp))
496 *walk_subtrees = 0;
498 return NULL_TREE;
501 /* Lookup UID in the referenced_vars hashtable and return the associated
502 variable. */
504 tree
505 referenced_var_lookup (unsigned int uid)
507 tree h;
508 struct tree_decl_minimal in;
509 in.uid = uid;
510 h = (tree) htab_find_with_hash (gimple_referenced_vars (cfun), &in, uid);
511 gcc_assert (h || uid == 0);
512 return h;
515 /* Check if TO is in the referenced_vars hash table and insert it if not.
516 Return true if it required insertion. */
518 bool
519 referenced_var_check_and_insert (tree to)
521 tree h, *loc;
522 struct tree_decl_minimal in;
523 unsigned int uid = DECL_UID (to);
525 in.uid = uid;
526 h = (tree) htab_find_with_hash (gimple_referenced_vars (cfun), &in, uid);
527 if (h)
529 /* DECL_UID has already been entered in the table. Verify that it is
530 the same entry as TO. See PR 27793. */
531 gcc_assert (h == to);
532 return false;
535 loc = (tree *) htab_find_slot_with_hash (gimple_referenced_vars (cfun),
536 &in, uid, INSERT);
537 *loc = to;
538 return true;
541 /* Lookup VAR UID in the default_defs hashtable and return the associated
542 variable. */
544 tree
545 gimple_default_def (struct function *fn, tree var)
547 struct tree_decl_minimal ind;
548 struct tree_ssa_name in;
549 gcc_assert (SSA_VAR_P (var));
550 in.var = (tree)&ind;
551 ind.uid = DECL_UID (var);
552 return (tree) htab_find_with_hash (DEFAULT_DEFS (fn), &in, DECL_UID (var));
555 /* Insert the pair VAR's UID, DEF into the default_defs hashtable. */
557 void
558 set_default_def (tree var, tree def)
560 struct tree_decl_minimal ind;
561 struct tree_ssa_name in;
562 void **loc;
564 gcc_assert (SSA_VAR_P (var));
565 in.var = (tree)&ind;
566 ind.uid = DECL_UID (var);
567 if (!def)
569 loc = htab_find_slot_with_hash (DEFAULT_DEFS (cfun), &in,
570 DECL_UID (var), INSERT);
571 gcc_assert (*loc);
572 htab_remove_elt (DEFAULT_DEFS (cfun), *loc);
573 return;
575 gcc_assert (TREE_CODE (def) == SSA_NAME && SSA_NAME_VAR (def) == var);
576 loc = htab_find_slot_with_hash (DEFAULT_DEFS (cfun), &in,
577 DECL_UID (var), INSERT);
579 /* Default definition might be changed by tail call optimization. */
580 if (*loc)
581 SSA_NAME_IS_DEFAULT_DEF (*(tree *) loc) = false;
582 *(tree *) loc = def;
584 /* Mark DEF as the default definition for VAR. */
585 SSA_NAME_IS_DEFAULT_DEF (def) = true;
588 /* Add VAR to the list of referenced variables if it isn't already there. */
590 bool
591 add_referenced_var (tree var)
593 var_ann_t v_ann;
595 v_ann = get_var_ann (var);
596 gcc_assert (DECL_P (var));
598 /* Insert VAR into the referenced_vars has table if it isn't present. */
599 if (referenced_var_check_and_insert (var))
601 /* Scan DECL_INITIAL for pointer variables as they may contain
602 address arithmetic referencing the address of other
603 variables. As we are only interested in directly referenced
604 globals or referenced locals restrict this to initializers
605 than can refer to local variables. */
606 if (DECL_INITIAL (var)
607 && DECL_CONTEXT (var) == current_function_decl)
608 walk_tree (&DECL_INITIAL (var), find_vars_r, NULL, 0);
610 return true;
613 return false;
616 /* Remove VAR from the list. */
618 void
619 remove_referenced_var (tree var)
621 var_ann_t v_ann;
622 struct tree_decl_minimal in;
623 void **loc;
624 unsigned int uid = DECL_UID (var);
626 /* Preserve var_anns of globals. */
627 if (!is_global_var (var)
628 && (v_ann = var_ann (var)))
630 ggc_free (v_ann);
631 var->base.ann = NULL;
633 gcc_assert (DECL_P (var));
634 in.uid = uid;
635 loc = htab_find_slot_with_hash (gimple_referenced_vars (cfun), &in, uid,
636 NO_INSERT);
637 htab_clear_slot (gimple_referenced_vars (cfun), loc);
641 /* Return the virtual variable associated to the non-scalar variable VAR. */
643 tree
644 get_virtual_var (tree var)
646 STRIP_NOPS (var);
648 if (TREE_CODE (var) == SSA_NAME)
649 var = SSA_NAME_VAR (var);
651 while (TREE_CODE (var) == REALPART_EXPR || TREE_CODE (var) == IMAGPART_EXPR
652 || handled_component_p (var))
653 var = TREE_OPERAND (var, 0);
655 /* Treating GIMPLE registers as virtual variables makes no sense.
656 Also complain if we couldn't extract a _DECL out of the original
657 expression. */
658 gcc_assert (SSA_VAR_P (var));
659 gcc_assert (!is_gimple_reg (var));
661 return var;
664 /* Mark all the naked symbols in STMT for SSA renaming.
666 NOTE: This function should only be used for brand new statements.
667 If the caller is modifying an existing statement, it should use the
668 combination push_stmt_changes/pop_stmt_changes. */
670 void
671 mark_symbols_for_renaming (gimple stmt)
673 tree op;
674 ssa_op_iter iter;
676 update_stmt (stmt);
678 /* Mark all the operands for renaming. */
679 FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_ALL_OPERANDS)
680 if (DECL_P (op))
681 mark_sym_for_renaming (op);
685 /* Find all variables within the gimplified statement that were not
686 previously visible to the function and add them to the referenced
687 variables list. */
689 static tree
690 find_new_referenced_vars_1 (tree *tp, int *walk_subtrees,
691 void *data ATTRIBUTE_UNUSED)
693 tree t = *tp;
695 if (TREE_CODE (t) == VAR_DECL && !var_ann (t))
697 add_referenced_var (t);
698 mark_sym_for_renaming (t);
701 if (IS_TYPE_OR_DECL_P (t))
702 *walk_subtrees = 0;
704 return NULL;
708 /* Find any new referenced variables in STMT. */
710 void
711 find_new_referenced_vars (gimple stmt)
713 walk_gimple_op (stmt, find_new_referenced_vars_1, NULL);
717 /* If EXP is a handled component reference for a structure, return the
718 base variable. The access range is delimited by bit positions *POFFSET and
719 *POFFSET + *PMAX_SIZE. The access size is *PSIZE bits. If either
720 *PSIZE or *PMAX_SIZE is -1, they could not be determined. If *PSIZE
721 and *PMAX_SIZE are equal, the access is non-variable. */
723 tree
724 get_ref_base_and_extent (tree exp, HOST_WIDE_INT *poffset,
725 HOST_WIDE_INT *psize,
726 HOST_WIDE_INT *pmax_size)
728 HOST_WIDE_INT bitsize = -1;
729 HOST_WIDE_INT maxsize = -1;
730 tree size_tree = NULL_TREE;
731 HOST_WIDE_INT bit_offset = 0;
732 bool seen_variable_array_ref = false;
733 bool seen_union = false;
735 /* First get the final access size from just the outermost expression. */
736 if (TREE_CODE (exp) == COMPONENT_REF)
737 size_tree = DECL_SIZE (TREE_OPERAND (exp, 1));
738 else if (TREE_CODE (exp) == BIT_FIELD_REF)
739 size_tree = TREE_OPERAND (exp, 1);
740 else
742 enum machine_mode mode = TYPE_MODE (TREE_TYPE (exp));
743 if (mode == BLKmode)
744 size_tree = TYPE_SIZE (TREE_TYPE (exp));
745 else
746 bitsize = GET_MODE_BITSIZE (mode);
748 if (size_tree != NULL_TREE)
750 if (! host_integerp (size_tree, 1))
751 bitsize = -1;
752 else
753 bitsize = TREE_INT_CST_LOW (size_tree);
756 /* Initially, maxsize is the same as the accessed element size.
757 In the following it will only grow (or become -1). */
758 maxsize = bitsize;
760 /* Compute cumulative bit-offset for nested component-refs and array-refs,
761 and find the ultimate containing object. */
762 while (1)
764 switch (TREE_CODE (exp))
766 case BIT_FIELD_REF:
767 bit_offset += tree_low_cst (TREE_OPERAND (exp, 2), 0);
768 break;
770 case COMPONENT_REF:
772 tree field = TREE_OPERAND (exp, 1);
773 tree this_offset = component_ref_field_offset (exp);
775 if (TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == UNION_TYPE)
776 seen_union = true;
778 if (this_offset && TREE_CODE (this_offset) == INTEGER_CST)
780 HOST_WIDE_INT hthis_offset = tree_low_cst (this_offset, 0);
782 hthis_offset *= BITS_PER_UNIT;
783 bit_offset += hthis_offset;
784 bit_offset += tree_low_cst (DECL_FIELD_BIT_OFFSET (field), 0);
786 else
788 tree csize = TYPE_SIZE (TREE_TYPE (TREE_OPERAND (exp, 0)));
789 /* We need to adjust maxsize to the whole structure bitsize.
790 But we can subtract any constant offset seen so far,
791 because that would get us out of the structure otherwise. */
792 if (maxsize != -1 && csize && host_integerp (csize, 1))
793 maxsize = TREE_INT_CST_LOW (csize) - bit_offset;
794 else
795 maxsize = -1;
798 break;
800 case ARRAY_REF:
801 case ARRAY_RANGE_REF:
803 tree index = TREE_OPERAND (exp, 1);
804 tree low_bound = array_ref_low_bound (exp);
805 tree unit_size = array_ref_element_size (exp);
807 /* If the resulting bit-offset is constant, track it. */
808 if (host_integerp (index, 0)
809 && host_integerp (low_bound, 0)
810 && host_integerp (unit_size, 1))
812 HOST_WIDE_INT hindex = tree_low_cst (index, 0);
814 hindex -= tree_low_cst (low_bound, 0);
815 hindex *= tree_low_cst (unit_size, 1);
816 hindex *= BITS_PER_UNIT;
817 bit_offset += hindex;
819 /* An array ref with a constant index up in the structure
820 hierarchy will constrain the size of any variable array ref
821 lower in the access hierarchy. */
822 seen_variable_array_ref = false;
824 else
826 tree asize = TYPE_SIZE (TREE_TYPE (TREE_OPERAND (exp, 0)));
827 /* We need to adjust maxsize to the whole array bitsize.
828 But we can subtract any constant offset seen so far,
829 because that would get us outside of the array otherwise. */
830 if (maxsize != -1 && asize && host_integerp (asize, 1))
831 maxsize = TREE_INT_CST_LOW (asize) - bit_offset;
832 else
833 maxsize = -1;
835 /* Remember that we have seen an array ref with a variable
836 index. */
837 seen_variable_array_ref = true;
840 break;
842 case REALPART_EXPR:
843 break;
845 case IMAGPART_EXPR:
846 bit_offset += bitsize;
847 break;
849 case VIEW_CONVERT_EXPR:
850 /* ??? We probably should give up here and bail out. */
851 break;
853 default:
854 goto done;
857 exp = TREE_OPERAND (exp, 0);
859 done:
861 /* We need to deal with variable arrays ending structures such as
862 struct { int length; int a[1]; } x; x.a[d]
863 struct { struct { int a; int b; } a[1]; } x; x.a[d].a
864 struct { struct { int a[1]; } a[1]; } x; x.a[0][d], x.a[d][0]
865 where we do not know maxsize for variable index accesses to
866 the array. The simplest way to conservatively deal with this
867 is to punt in the case that offset + maxsize reaches the
868 base type boundary.
870 Unfortunately this is difficult to determine reliably when unions are
871 involved and so we are conservative in such cases.
873 FIXME: This approach may be too conservative, we probably want to at least
874 check that the union is the last field/element at its level or even
875 propagate the calculated offsets back up the access chain and check
876 there. */
878 if (seen_variable_array_ref
879 && (seen_union
880 || (maxsize != -1
881 && host_integerp (TYPE_SIZE (TREE_TYPE (exp)), 1)
882 && bit_offset + maxsize
883 == (signed) TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (exp))))))
884 maxsize = -1;
886 /* ??? Due to negative offsets in ARRAY_REF we can end up with
887 negative bit_offset here. We might want to store a zero offset
888 in this case. */
889 *poffset = bit_offset;
890 *psize = bitsize;
891 *pmax_size = maxsize;
893 return exp;
896 /* Returns true if STMT references an SSA_NAME that has
897 SSA_NAME_OCCURS_IN_ABNORMAL_PHI set, otherwise false. */
899 bool
900 stmt_references_abnormal_ssa_name (gimple stmt)
902 ssa_op_iter oi;
903 use_operand_p use_p;
905 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, oi, SSA_OP_USE)
907 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (USE_FROM_PTR (use_p)))
908 return true;
911 return false;