PR target/65871
[official-gcc.git] / gcc / tree-dfa.c
blob8ee46dc81f490ab80e3ea7dba29d5dc40e140dcd
1 /* Data flow functions for trees.
2 Copyright (C) 2001-2015 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 3, 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 COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "hashtab.h"
26 #include "hash-set.h"
27 #include "machmode.h"
28 #include "vec.h"
29 #include "double-int.h"
30 #include "input.h"
31 #include "alias.h"
32 #include "symtab.h"
33 #include "wide-int.h"
34 #include "inchash.h"
35 #include "tree.h"
36 #include "fold-const.h"
37 #include "stor-layout.h"
38 #include "tm_p.h"
39 #include "predict.h"
40 #include "hard-reg-set.h"
41 #include "function.h"
42 #include "dominance.h"
43 #include "cfg.h"
44 #include "basic-block.h"
45 #include "langhooks.h"
46 #include "flags.h"
47 #include "tree-pretty-print.h"
48 #include "tree-ssa-alias.h"
49 #include "internal-fn.h"
50 #include "gimple-expr.h"
51 #include "is-a.h"
52 #include "gimple.h"
53 #include "gimple-iterator.h"
54 #include "gimple-walk.h"
55 #include "gimple-ssa.h"
56 #include "tree-phinodes.h"
57 #include "ssa-iterators.h"
58 #include "stringpool.h"
59 #include "tree-ssanames.h"
60 #include "rtl.h"
61 #include "statistics.h"
62 #include "real.h"
63 #include "fixed-value.h"
64 #include "insn-config.h"
65 #include "expmed.h"
66 #include "dojump.h"
67 #include "explow.h"
68 #include "calls.h"
69 #include "emit-rtl.h"
70 #include "varasm.h"
71 #include "stmt.h"
72 #include "expr.h"
73 #include "tree-dfa.h"
74 #include "tree-inline.h"
75 #include "tree-pass.h"
76 #include "params.h"
78 /* Build and maintain data flow information for trees. */
80 /* Counters used to display DFA and SSA statistics. */
81 struct dfa_stats_d
83 long num_defs;
84 long num_uses;
85 long num_phis;
86 long num_phi_args;
87 size_t max_num_phi_args;
88 long num_vdefs;
89 long num_vuses;
93 /* Local functions. */
94 static void collect_dfa_stats (struct dfa_stats_d *);
97 /*---------------------------------------------------------------------------
98 Dataflow analysis (DFA) routines
99 ---------------------------------------------------------------------------*/
101 /* Renumber all of the gimple stmt uids. */
103 void
104 renumber_gimple_stmt_uids (void)
106 basic_block bb;
108 set_gimple_stmt_max_uid (cfun, 0);
109 FOR_ALL_BB_FN (bb, cfun)
111 gimple_stmt_iterator bsi;
112 for (bsi = gsi_start_phis (bb); !gsi_end_p (bsi); gsi_next (&bsi))
114 gimple stmt = gsi_stmt (bsi);
115 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
117 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
119 gimple stmt = gsi_stmt (bsi);
120 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
125 /* Like renumber_gimple_stmt_uids, but only do work on the basic blocks
126 in BLOCKS, of which there are N_BLOCKS. Also renumbers PHIs. */
128 void
129 renumber_gimple_stmt_uids_in_blocks (basic_block *blocks, int n_blocks)
131 int i;
133 set_gimple_stmt_max_uid (cfun, 0);
134 for (i = 0; i < n_blocks; i++)
136 basic_block bb = blocks[i];
137 gimple_stmt_iterator bsi;
138 for (bsi = gsi_start_phis (bb); !gsi_end_p (bsi); gsi_next (&bsi))
140 gimple stmt = gsi_stmt (bsi);
141 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
143 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
145 gimple stmt = gsi_stmt (bsi);
146 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
153 /*---------------------------------------------------------------------------
154 Debugging functions
155 ---------------------------------------------------------------------------*/
157 /* Dump variable VAR and its may-aliases to FILE. */
159 void
160 dump_variable (FILE *file, tree var)
162 if (TREE_CODE (var) == SSA_NAME)
164 if (POINTER_TYPE_P (TREE_TYPE (var)))
165 dump_points_to_info_for (file, var);
166 var = SSA_NAME_VAR (var);
169 if (var == NULL_TREE)
171 fprintf (file, "<nil>");
172 return;
175 print_generic_expr (file, var, dump_flags);
177 fprintf (file, ", UID D.%u", (unsigned) DECL_UID (var));
178 if (DECL_PT_UID (var) != DECL_UID (var))
179 fprintf (file, ", PT-UID D.%u", (unsigned) DECL_PT_UID (var));
181 fprintf (file, ", ");
182 print_generic_expr (file, TREE_TYPE (var), dump_flags);
184 if (TREE_ADDRESSABLE (var))
185 fprintf (file, ", is addressable");
187 if (is_global_var (var))
188 fprintf (file, ", is global");
190 if (TREE_THIS_VOLATILE (var))
191 fprintf (file, ", is volatile");
193 if (cfun && ssa_default_def (cfun, var))
195 fprintf (file, ", default def: ");
196 print_generic_expr (file, ssa_default_def (cfun, var), dump_flags);
199 if (DECL_INITIAL (var))
201 fprintf (file, ", initial: ");
202 print_generic_expr (file, DECL_INITIAL (var), dump_flags);
205 fprintf (file, "\n");
209 /* Dump variable VAR and its may-aliases to stderr. */
211 DEBUG_FUNCTION void
212 debug_variable (tree var)
214 dump_variable (stderr, var);
218 /* Dump various DFA statistics to FILE. */
220 void
221 dump_dfa_stats (FILE *file)
223 struct dfa_stats_d dfa_stats;
225 unsigned long size, total = 0;
226 const char * const fmt_str = "%-30s%-13s%12s\n";
227 const char * const fmt_str_1 = "%-30s%13lu%11lu%c\n";
228 const char * const fmt_str_3 = "%-43s%11lu%c\n";
229 const char *funcname
230 = lang_hooks.decl_printable_name (current_function_decl, 2);
232 collect_dfa_stats (&dfa_stats);
234 fprintf (file, "\nDFA Statistics for %s\n\n", funcname);
236 fprintf (file, "---------------------------------------------------------\n");
237 fprintf (file, fmt_str, "", " Number of ", "Memory");
238 fprintf (file, fmt_str, "", " instances ", "used ");
239 fprintf (file, "---------------------------------------------------------\n");
241 size = dfa_stats.num_uses * sizeof (tree *);
242 total += size;
243 fprintf (file, fmt_str_1, "USE operands", dfa_stats.num_uses,
244 SCALE (size), LABEL (size));
246 size = dfa_stats.num_defs * sizeof (tree *);
247 total += size;
248 fprintf (file, fmt_str_1, "DEF operands", dfa_stats.num_defs,
249 SCALE (size), LABEL (size));
251 size = dfa_stats.num_vuses * sizeof (tree *);
252 total += size;
253 fprintf (file, fmt_str_1, "VUSE operands", dfa_stats.num_vuses,
254 SCALE (size), LABEL (size));
256 size = dfa_stats.num_vdefs * sizeof (tree *);
257 total += size;
258 fprintf (file, fmt_str_1, "VDEF operands", dfa_stats.num_vdefs,
259 SCALE (size), LABEL (size));
261 size = dfa_stats.num_phis * sizeof (struct gphi);
262 total += size;
263 fprintf (file, fmt_str_1, "PHI nodes", dfa_stats.num_phis,
264 SCALE (size), LABEL (size));
266 size = dfa_stats.num_phi_args * sizeof (struct phi_arg_d);
267 total += size;
268 fprintf (file, fmt_str_1, "PHI arguments", dfa_stats.num_phi_args,
269 SCALE (size), LABEL (size));
271 fprintf (file, "---------------------------------------------------------\n");
272 fprintf (file, fmt_str_3, "Total memory used by DFA/SSA data", SCALE (total),
273 LABEL (total));
274 fprintf (file, "---------------------------------------------------------\n");
275 fprintf (file, "\n");
277 if (dfa_stats.num_phis)
278 fprintf (file, "Average number of arguments per PHI node: %.1f (max: %ld)\n",
279 (float) dfa_stats.num_phi_args / (float) dfa_stats.num_phis,
280 (long) dfa_stats.max_num_phi_args);
282 fprintf (file, "\n");
286 /* Dump DFA statistics on stderr. */
288 DEBUG_FUNCTION void
289 debug_dfa_stats (void)
291 dump_dfa_stats (stderr);
295 /* Collect DFA statistics and store them in the structure pointed to by
296 DFA_STATS_P. */
298 static void
299 collect_dfa_stats (struct dfa_stats_d *dfa_stats_p ATTRIBUTE_UNUSED)
301 basic_block bb;
303 gcc_assert (dfa_stats_p);
305 memset ((void *)dfa_stats_p, 0, sizeof (struct dfa_stats_d));
307 /* Walk all the statements in the function counting references. */
308 FOR_EACH_BB_FN (bb, cfun)
310 for (gphi_iterator si = gsi_start_phis (bb); !gsi_end_p (si);
311 gsi_next (&si))
313 gphi *phi = si.phi ();
314 dfa_stats_p->num_phis++;
315 dfa_stats_p->num_phi_args += gimple_phi_num_args (phi);
316 if (gimple_phi_num_args (phi) > dfa_stats_p->max_num_phi_args)
317 dfa_stats_p->max_num_phi_args = gimple_phi_num_args (phi);
320 for (gimple_stmt_iterator si = gsi_start_bb (bb); !gsi_end_p (si);
321 gsi_next (&si))
323 gimple stmt = gsi_stmt (si);
324 dfa_stats_p->num_defs += NUM_SSA_OPERANDS (stmt, SSA_OP_DEF);
325 dfa_stats_p->num_uses += NUM_SSA_OPERANDS (stmt, SSA_OP_USE);
326 dfa_stats_p->num_vdefs += gimple_vdef (stmt) ? 1 : 0;
327 dfa_stats_p->num_vuses += gimple_vuse (stmt) ? 1 : 0;
333 /*---------------------------------------------------------------------------
334 Miscellaneous helpers
335 ---------------------------------------------------------------------------*/
337 /* Lookup VAR UID in the default_defs hashtable and return the associated
338 variable. */
340 tree
341 ssa_default_def (struct function *fn, tree var)
343 struct tree_decl_minimal ind;
344 struct tree_ssa_name in;
345 gcc_assert (TREE_CODE (var) == VAR_DECL
346 || TREE_CODE (var) == PARM_DECL
347 || TREE_CODE (var) == RESULT_DECL);
348 in.var = (tree)&ind;
349 ind.uid = DECL_UID (var);
350 return DEFAULT_DEFS (fn)->find_with_hash ((tree)&in, DECL_UID (var));
353 /* Insert the pair VAR's UID, DEF into the default_defs hashtable
354 of function FN. */
356 void
357 set_ssa_default_def (struct function *fn, tree var, tree def)
359 struct tree_decl_minimal ind;
360 struct tree_ssa_name in;
362 gcc_assert (TREE_CODE (var) == VAR_DECL
363 || TREE_CODE (var) == PARM_DECL
364 || TREE_CODE (var) == RESULT_DECL);
365 in.var = (tree)&ind;
366 ind.uid = DECL_UID (var);
367 if (!def)
369 tree *loc = DEFAULT_DEFS (fn)->find_slot_with_hash ((tree)&in,
370 DECL_UID (var),
371 NO_INSERT);
372 if (loc)
374 SSA_NAME_IS_DEFAULT_DEF (*(tree *)loc) = false;
375 DEFAULT_DEFS (fn)->clear_slot (loc);
377 return;
379 gcc_assert (TREE_CODE (def) == SSA_NAME && SSA_NAME_VAR (def) == var);
380 tree *loc = DEFAULT_DEFS (fn)->find_slot_with_hash ((tree)&in,
381 DECL_UID (var), INSERT);
383 /* Default definition might be changed by tail call optimization. */
384 if (*loc)
385 SSA_NAME_IS_DEFAULT_DEF (*loc) = false;
387 /* Mark DEF as the default definition for VAR. */
388 *loc = def;
389 SSA_NAME_IS_DEFAULT_DEF (def) = true;
392 /* Retrieve or create a default definition for VAR. */
394 tree
395 get_or_create_ssa_default_def (struct function *fn, tree var)
397 tree ddef = ssa_default_def (fn, var);
398 if (ddef == NULL_TREE)
400 ddef = make_ssa_name_fn (fn, var, gimple_build_nop ());
401 set_ssa_default_def (fn, var, ddef);
403 return ddef;
407 /* If EXP is a handled component reference for a structure, return the
408 base variable. The access range is delimited by bit positions *POFFSET and
409 *POFFSET + *PMAX_SIZE. The access size is *PSIZE bits. If either
410 *PSIZE or *PMAX_SIZE is -1, they could not be determined. If *PSIZE
411 and *PMAX_SIZE are equal, the access is non-variable. */
413 tree
414 get_ref_base_and_extent (tree exp, HOST_WIDE_INT *poffset,
415 HOST_WIDE_INT *psize,
416 HOST_WIDE_INT *pmax_size)
418 offset_int bitsize = -1;
419 offset_int maxsize;
420 tree size_tree = NULL_TREE;
421 offset_int bit_offset = 0;
422 bool seen_variable_array_ref = false;
424 /* First get the final access size from just the outermost expression. */
425 if (TREE_CODE (exp) == COMPONENT_REF)
426 size_tree = DECL_SIZE (TREE_OPERAND (exp, 1));
427 else if (TREE_CODE (exp) == BIT_FIELD_REF)
428 size_tree = TREE_OPERAND (exp, 1);
429 else if (!VOID_TYPE_P (TREE_TYPE (exp)))
431 machine_mode mode = TYPE_MODE (TREE_TYPE (exp));
432 if (mode == BLKmode)
433 size_tree = TYPE_SIZE (TREE_TYPE (exp));
434 else
435 bitsize = int (GET_MODE_PRECISION (mode));
437 if (size_tree != NULL_TREE
438 && TREE_CODE (size_tree) == INTEGER_CST)
439 bitsize = wi::to_offset (size_tree);
441 /* Initially, maxsize is the same as the accessed element size.
442 In the following it will only grow (or become -1). */
443 maxsize = bitsize;
445 /* Compute cumulative bit-offset for nested component-refs and array-refs,
446 and find the ultimate containing object. */
447 while (1)
449 switch (TREE_CODE (exp))
451 case BIT_FIELD_REF:
452 bit_offset += wi::to_offset (TREE_OPERAND (exp, 2));
453 break;
455 case COMPONENT_REF:
457 tree field = TREE_OPERAND (exp, 1);
458 tree this_offset = component_ref_field_offset (exp);
460 if (this_offset && TREE_CODE (this_offset) == INTEGER_CST)
462 offset_int woffset = wi::lshift (wi::to_offset (this_offset),
463 LOG2_BITS_PER_UNIT);
464 woffset += wi::to_offset (DECL_FIELD_BIT_OFFSET (field));
465 bit_offset += woffset;
467 /* If we had seen a variable array ref already and we just
468 referenced the last field of a struct or a union member
469 then we have to adjust maxsize by the padding at the end
470 of our field. */
471 if (seen_variable_array_ref && maxsize != -1)
473 tree stype = TREE_TYPE (TREE_OPERAND (exp, 0));
474 tree next = DECL_CHAIN (field);
475 while (next && TREE_CODE (next) != FIELD_DECL)
476 next = DECL_CHAIN (next);
477 if (!next
478 || TREE_CODE (stype) != RECORD_TYPE)
480 tree fsize = DECL_SIZE_UNIT (field);
481 tree ssize = TYPE_SIZE_UNIT (stype);
482 if (fsize == NULL
483 || TREE_CODE (fsize) != INTEGER_CST
484 || ssize == NULL
485 || TREE_CODE (ssize) != INTEGER_CST)
486 maxsize = -1;
487 else
489 offset_int tem = (wi::to_offset (ssize)
490 - wi::to_offset (fsize));
491 tem = wi::lshift (tem, LOG2_BITS_PER_UNIT);
492 tem -= woffset;
493 maxsize += tem;
498 else
500 tree csize = TYPE_SIZE (TREE_TYPE (TREE_OPERAND (exp, 0)));
501 /* We need to adjust maxsize to the whole structure bitsize.
502 But we can subtract any constant offset seen so far,
503 because that would get us out of the structure otherwise. */
504 if (maxsize != -1
505 && csize
506 && TREE_CODE (csize) == INTEGER_CST)
507 maxsize = wi::to_offset (csize) - bit_offset;
508 else
509 maxsize = -1;
512 break;
514 case ARRAY_REF:
515 case ARRAY_RANGE_REF:
517 tree index = TREE_OPERAND (exp, 1);
518 tree low_bound, unit_size;
520 /* If the resulting bit-offset is constant, track it. */
521 if (TREE_CODE (index) == INTEGER_CST
522 && (low_bound = array_ref_low_bound (exp),
523 TREE_CODE (low_bound) == INTEGER_CST)
524 && (unit_size = array_ref_element_size (exp),
525 TREE_CODE (unit_size) == INTEGER_CST))
527 offset_int woffset
528 = wi::sext (wi::to_offset (index) - wi::to_offset (low_bound),
529 TYPE_PRECISION (TREE_TYPE (index)));
530 woffset *= wi::to_offset (unit_size);
531 woffset = wi::lshift (woffset, LOG2_BITS_PER_UNIT);
532 bit_offset += woffset;
534 /* An array ref with a constant index up in the structure
535 hierarchy will constrain the size of any variable array ref
536 lower in the access hierarchy. */
537 seen_variable_array_ref = false;
539 else
541 tree asize = TYPE_SIZE (TREE_TYPE (TREE_OPERAND (exp, 0)));
542 /* We need to adjust maxsize to the whole array bitsize.
543 But we can subtract any constant offset seen so far,
544 because that would get us outside of the array otherwise. */
545 if (maxsize != -1
546 && asize
547 && TREE_CODE (asize) == INTEGER_CST)
548 maxsize = wi::to_offset (asize) - bit_offset;
549 else
550 maxsize = -1;
552 /* Remember that we have seen an array ref with a variable
553 index. */
554 seen_variable_array_ref = true;
557 break;
559 case REALPART_EXPR:
560 break;
562 case IMAGPART_EXPR:
563 bit_offset += bitsize;
564 break;
566 case VIEW_CONVERT_EXPR:
567 break;
569 case TARGET_MEM_REF:
570 /* Via the variable index or index2 we can reach the
571 whole object. Still hand back the decl here. */
572 if (TREE_CODE (TMR_BASE (exp)) == ADDR_EXPR
573 && (TMR_INDEX (exp) || TMR_INDEX2 (exp)))
575 exp = TREE_OPERAND (TMR_BASE (exp), 0);
576 bit_offset = 0;
577 maxsize = -1;
578 goto done;
580 /* Fallthru. */
581 case MEM_REF:
582 /* We need to deal with variable arrays ending structures such as
583 struct { int length; int a[1]; } x; x.a[d]
584 struct { struct { int a; int b; } a[1]; } x; x.a[d].a
585 struct { struct { int a[1]; } a[1]; } x; x.a[0][d], x.a[d][0]
586 struct { int len; union { int a[1]; struct X x; } u; } x; x.u.a[d]
587 where we do not know maxsize for variable index accesses to
588 the array. The simplest way to conservatively deal with this
589 is to punt in the case that offset + maxsize reaches the
590 base type boundary. This needs to include possible trailing
591 padding that is there for alignment purposes. */
592 if (seen_variable_array_ref
593 && maxsize != -1
594 && (TYPE_SIZE (TREE_TYPE (exp)) == NULL_TREE
595 || TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) != INTEGER_CST
596 || (bit_offset + maxsize
597 == wi::to_offset (TYPE_SIZE (TREE_TYPE (exp))))))
598 maxsize = -1;
600 /* Hand back the decl for MEM[&decl, off]. */
601 if (TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR)
603 if (integer_zerop (TREE_OPERAND (exp, 1)))
604 exp = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
605 else
607 offset_int off = mem_ref_offset (exp);
608 off = wi::lshift (off, LOG2_BITS_PER_UNIT);
609 off += bit_offset;
610 if (wi::fits_shwi_p (off))
612 bit_offset = off;
613 exp = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
617 goto done;
619 default:
620 goto done;
623 exp = TREE_OPERAND (exp, 0);
626 /* We need to deal with variable arrays ending structures. */
627 if (seen_variable_array_ref
628 && maxsize != -1
629 && (TYPE_SIZE (TREE_TYPE (exp)) == NULL_TREE
630 || TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) != INTEGER_CST
631 || (bit_offset + maxsize
632 == wi::to_offset (TYPE_SIZE (TREE_TYPE (exp))))))
633 maxsize = -1;
635 done:
636 if (!wi::fits_shwi_p (bitsize) || wi::neg_p (bitsize))
638 *poffset = 0;
639 *psize = -1;
640 *pmax_size = -1;
642 return exp;
645 *psize = bitsize.to_shwi ();
647 if (!wi::fits_shwi_p (bit_offset))
649 *poffset = 0;
650 *pmax_size = -1;
652 return exp;
655 /* In case of a decl or constant base object we can do better. */
657 if (DECL_P (exp))
659 /* If maxsize is unknown adjust it according to the size of the
660 base decl. */
661 if (maxsize == -1
662 && DECL_SIZE (exp)
663 && TREE_CODE (DECL_SIZE (exp)) == INTEGER_CST)
664 maxsize = wi::to_offset (DECL_SIZE (exp)) - bit_offset;
666 else if (CONSTANT_CLASS_P (exp))
668 /* If maxsize is unknown adjust it according to the size of the
669 base type constant. */
670 if (maxsize == -1
671 && TYPE_SIZE (TREE_TYPE (exp))
672 && TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) == INTEGER_CST)
673 maxsize = (wi::to_offset (TYPE_SIZE (TREE_TYPE (exp)))
674 - bit_offset);
677 /* ??? Due to negative offsets in ARRAY_REF we can end up with
678 negative bit_offset here. We might want to store a zero offset
679 in this case. */
680 *poffset = bit_offset.to_shwi ();
681 if (!wi::fits_shwi_p (maxsize) || wi::neg_p (maxsize))
682 *pmax_size = -1;
683 else
684 *pmax_size = maxsize.to_shwi ();
686 return exp;
689 /* Returns the base object and a constant BITS_PER_UNIT offset in *POFFSET that
690 denotes the starting address of the memory access EXP.
691 Returns NULL_TREE if the offset is not constant or any component
692 is not BITS_PER_UNIT-aligned.
693 VALUEIZE if non-NULL is used to valueize SSA names. It should return
694 its argument or a constant if the argument is known to be constant. */
696 tree
697 get_addr_base_and_unit_offset_1 (tree exp, HOST_WIDE_INT *poffset,
698 tree (*valueize) (tree))
700 HOST_WIDE_INT byte_offset = 0;
702 /* Compute cumulative byte-offset for nested component-refs and array-refs,
703 and find the ultimate containing object. */
704 while (1)
706 switch (TREE_CODE (exp))
708 case BIT_FIELD_REF:
710 HOST_WIDE_INT this_off = TREE_INT_CST_LOW (TREE_OPERAND (exp, 2));
711 if (this_off % BITS_PER_UNIT)
712 return NULL_TREE;
713 byte_offset += this_off / BITS_PER_UNIT;
715 break;
717 case COMPONENT_REF:
719 tree field = TREE_OPERAND (exp, 1);
720 tree this_offset = component_ref_field_offset (exp);
721 HOST_WIDE_INT hthis_offset;
723 if (!this_offset
724 || TREE_CODE (this_offset) != INTEGER_CST
725 || (TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (field))
726 % BITS_PER_UNIT))
727 return NULL_TREE;
729 hthis_offset = TREE_INT_CST_LOW (this_offset);
730 hthis_offset += (TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (field))
731 / BITS_PER_UNIT);
732 byte_offset += hthis_offset;
734 break;
736 case ARRAY_REF:
737 case ARRAY_RANGE_REF:
739 tree index = TREE_OPERAND (exp, 1);
740 tree low_bound, unit_size;
742 if (valueize
743 && TREE_CODE (index) == SSA_NAME)
744 index = (*valueize) (index);
746 /* If the resulting bit-offset is constant, track it. */
747 if (TREE_CODE (index) == INTEGER_CST
748 && (low_bound = array_ref_low_bound (exp),
749 TREE_CODE (low_bound) == INTEGER_CST)
750 && (unit_size = array_ref_element_size (exp),
751 TREE_CODE (unit_size) == INTEGER_CST))
753 offset_int woffset
754 = wi::sext (wi::to_offset (index) - wi::to_offset (low_bound),
755 TYPE_PRECISION (TREE_TYPE (index)));
756 woffset *= wi::to_offset (unit_size);
757 byte_offset += woffset.to_shwi ();
759 else
760 return NULL_TREE;
762 break;
764 case REALPART_EXPR:
765 break;
767 case IMAGPART_EXPR:
768 byte_offset += TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (exp)));
769 break;
771 case VIEW_CONVERT_EXPR:
772 break;
774 case MEM_REF:
776 tree base = TREE_OPERAND (exp, 0);
777 if (valueize
778 && TREE_CODE (base) == SSA_NAME)
779 base = (*valueize) (base);
781 /* Hand back the decl for MEM[&decl, off]. */
782 if (TREE_CODE (base) == ADDR_EXPR)
784 if (!integer_zerop (TREE_OPERAND (exp, 1)))
786 offset_int off = mem_ref_offset (exp);
787 byte_offset += off.to_short_addr ();
789 exp = TREE_OPERAND (base, 0);
791 goto done;
794 case TARGET_MEM_REF:
796 tree base = TREE_OPERAND (exp, 0);
797 if (valueize
798 && TREE_CODE (base) == SSA_NAME)
799 base = (*valueize) (base);
801 /* Hand back the decl for MEM[&decl, off]. */
802 if (TREE_CODE (base) == ADDR_EXPR)
804 if (TMR_INDEX (exp) || TMR_INDEX2 (exp))
805 return NULL_TREE;
806 if (!integer_zerop (TMR_OFFSET (exp)))
808 offset_int off = mem_ref_offset (exp);
809 byte_offset += off.to_short_addr ();
811 exp = TREE_OPERAND (base, 0);
813 goto done;
816 default:
817 goto done;
820 exp = TREE_OPERAND (exp, 0);
822 done:
824 *poffset = byte_offset;
825 return exp;
828 /* Returns the base object and a constant BITS_PER_UNIT offset in *POFFSET that
829 denotes the starting address of the memory access EXP.
830 Returns NULL_TREE if the offset is not constant or any component
831 is not BITS_PER_UNIT-aligned. */
833 tree
834 get_addr_base_and_unit_offset (tree exp, HOST_WIDE_INT *poffset)
836 return get_addr_base_and_unit_offset_1 (exp, poffset, NULL);
839 /* Returns true if STMT references an SSA_NAME that has
840 SSA_NAME_OCCURS_IN_ABNORMAL_PHI set, otherwise false. */
842 bool
843 stmt_references_abnormal_ssa_name (gimple stmt)
845 ssa_op_iter oi;
846 use_operand_p use_p;
848 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, oi, SSA_OP_USE)
850 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (USE_FROM_PTR (use_p)))
851 return true;
854 return false;
857 /* Pair of tree and a sorting index, for dump_enumerated_decls. */
858 struct GTY(()) numbered_tree_d
860 tree t;
861 int num;
863 typedef struct numbered_tree_d numbered_tree;
866 /* Compare two declarations references by their DECL_UID / sequence number.
867 Called via qsort. */
869 static int
870 compare_decls_by_uid (const void *pa, const void *pb)
872 const numbered_tree *nt_a = ((const numbered_tree *)pa);
873 const numbered_tree *nt_b = ((const numbered_tree *)pb);
875 if (DECL_UID (nt_a->t) != DECL_UID (nt_b->t))
876 return DECL_UID (nt_a->t) - DECL_UID (nt_b->t);
877 return nt_a->num - nt_b->num;
880 /* Called via walk_gimple_stmt / walk_gimple_op by dump_enumerated_decls. */
881 static tree
882 dump_enumerated_decls_push (tree *tp, int *walk_subtrees, void *data)
884 struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
885 vec<numbered_tree> *list = (vec<numbered_tree> *) wi->info;
886 numbered_tree nt;
888 if (!DECL_P (*tp))
889 return NULL_TREE;
890 nt.t = *tp;
891 nt.num = list->length ();
892 list->safe_push (nt);
893 *walk_subtrees = 0;
894 return NULL_TREE;
897 /* Find all the declarations used by the current function, sort them by uid,
898 and emit the sorted list. Each declaration is tagged with a sequence
899 number indicating when it was found during statement / tree walking,
900 so that TDF_NOUID comparisons of anonymous declarations are still
901 meaningful. Where a declaration was encountered more than once, we
902 emit only the sequence number of the first encounter.
903 FILE is the dump file where to output the list and FLAGS is as in
904 print_generic_expr. */
905 void
906 dump_enumerated_decls (FILE *file, int flags)
908 basic_block bb;
909 struct walk_stmt_info wi;
910 auto_vec<numbered_tree, 40> decl_list;
912 memset (&wi, '\0', sizeof (wi));
913 wi.info = (void *) &decl_list;
914 FOR_EACH_BB_FN (bb, cfun)
916 gimple_stmt_iterator gsi;
918 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
919 if (!is_gimple_debug (gsi_stmt (gsi)))
920 walk_gimple_stmt (&gsi, NULL, dump_enumerated_decls_push, &wi);
922 decl_list.qsort (compare_decls_by_uid);
923 if (decl_list.length ())
925 unsigned ix;
926 numbered_tree *ntp;
927 tree last = NULL_TREE;
929 fprintf (file, "Declarations used by %s, sorted by DECL_UID:\n",
930 current_function_name ());
931 FOR_EACH_VEC_ELT (decl_list, ix, ntp)
933 if (ntp->t == last)
934 continue;
935 fprintf (file, "%d: ", ntp->num);
936 print_generic_decl (file, ntp->t, flags);
937 fprintf (file, "\n");
938 last = ntp->t;