See <https://gcc.gnu.org/ml/gcc-patches/2015-05/msg01977.html> for
[gcc.git] / gcc / tree-dfa.c
1 /* Data flow functions for trees.
2 Copyright (C) 2001-2015 Free Software Foundation, Inc.
3 Contributed by Diego Novillo <dnovillo@redhat.com>
4
5 This file is part of GCC.
6
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.
11
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.
16
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/>. */
20
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"
77
78 /* Build and maintain data flow information for trees. */
79
80 /* Counters used to display DFA and SSA statistics. */
81 struct dfa_stats_d
82 {
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;
90 };
91
92
93 /* Local functions. */
94 static void collect_dfa_stats (struct dfa_stats_d *);
95
96
97 /*---------------------------------------------------------------------------
98 Dataflow analysis (DFA) routines
99 ---------------------------------------------------------------------------*/
100
101 /* Renumber all of the gimple stmt uids. */
102
103 void
104 renumber_gimple_stmt_uids (void)
105 {
106 basic_block bb;
107
108 set_gimple_stmt_max_uid (cfun, 0);
109 FOR_ALL_BB_FN (bb, cfun)
110 {
111 gimple_stmt_iterator bsi;
112 for (bsi = gsi_start_phis (bb); !gsi_end_p (bsi); gsi_next (&bsi))
113 {
114 gimple stmt = gsi_stmt (bsi);
115 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
116 }
117 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
118 {
119 gimple stmt = gsi_stmt (bsi);
120 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
121 }
122 }
123 }
124
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. */
127
128 void
129 renumber_gimple_stmt_uids_in_blocks (basic_block *blocks, int n_blocks)
130 {
131 int i;
132
133 set_gimple_stmt_max_uid (cfun, 0);
134 for (i = 0; i < n_blocks; i++)
135 {
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))
139 {
140 gimple stmt = gsi_stmt (bsi);
141 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
142 }
143 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
144 {
145 gimple stmt = gsi_stmt (bsi);
146 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
147 }
148 }
149 }
150
151
152
153 /*---------------------------------------------------------------------------
154 Debugging functions
155 ---------------------------------------------------------------------------*/
156
157 /* Dump variable VAR and its may-aliases to FILE. */
158
159 void
160 dump_variable (FILE *file, tree var)
161 {
162 if (TREE_CODE (var) == SSA_NAME)
163 {
164 if (POINTER_TYPE_P (TREE_TYPE (var)))
165 dump_points_to_info_for (file, var);
166 var = SSA_NAME_VAR (var);
167 }
168
169 if (var == NULL_TREE)
170 {
171 fprintf (file, "<nil>");
172 return;
173 }
174
175 print_generic_expr (file, var, dump_flags);
176
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));
180
181 fprintf (file, ", ");
182 print_generic_expr (file, TREE_TYPE (var), dump_flags);
183
184 if (TREE_ADDRESSABLE (var))
185 fprintf (file, ", is addressable");
186
187 if (is_global_var (var))
188 fprintf (file, ", is global");
189
190 if (TREE_THIS_VOLATILE (var))
191 fprintf (file, ", is volatile");
192
193 if (cfun && ssa_default_def (cfun, var))
194 {
195 fprintf (file, ", default def: ");
196 print_generic_expr (file, ssa_default_def (cfun, var), dump_flags);
197 }
198
199 if (DECL_INITIAL (var))
200 {
201 fprintf (file, ", initial: ");
202 print_generic_expr (file, DECL_INITIAL (var), dump_flags);
203 }
204
205 fprintf (file, "\n");
206 }
207
208
209 /* Dump variable VAR and its may-aliases to stderr. */
210
211 DEBUG_FUNCTION void
212 debug_variable (tree var)
213 {
214 dump_variable (stderr, var);
215 }
216
217
218 /* Dump various DFA statistics to FILE. */
219
220 void
221 dump_dfa_stats (FILE *file)
222 {
223 struct dfa_stats_d dfa_stats;
224
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);
231
232 collect_dfa_stats (&dfa_stats);
233
234 fprintf (file, "\nDFA Statistics for %s\n\n", funcname);
235
236 fprintf (file, "---------------------------------------------------------\n");
237 fprintf (file, fmt_str, "", " Number of ", "Memory");
238 fprintf (file, fmt_str, "", " instances ", "used ");
239 fprintf (file, "---------------------------------------------------------\n");
240
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));
245
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));
250
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));
255
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));
260
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));
265
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));
270
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");
276
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);
281
282 fprintf (file, "\n");
283 }
284
285
286 /* Dump DFA statistics on stderr. */
287
288 DEBUG_FUNCTION void
289 debug_dfa_stats (void)
290 {
291 dump_dfa_stats (stderr);
292 }
293
294
295 /* Collect DFA statistics and store them in the structure pointed to by
296 DFA_STATS_P. */
297
298 static void
299 collect_dfa_stats (struct dfa_stats_d *dfa_stats_p ATTRIBUTE_UNUSED)
300 {
301 basic_block bb;
302
303 gcc_assert (dfa_stats_p);
304
305 memset ((void *)dfa_stats_p, 0, sizeof (struct dfa_stats_d));
306
307 /* Walk all the statements in the function counting references. */
308 FOR_EACH_BB_FN (bb, cfun)
309 {
310 for (gphi_iterator si = gsi_start_phis (bb); !gsi_end_p (si);
311 gsi_next (&si))
312 {
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);
318 }
319
320 for (gimple_stmt_iterator si = gsi_start_bb (bb); !gsi_end_p (si);
321 gsi_next (&si))
322 {
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;
328 }
329 }
330 }
331
332
333 /*---------------------------------------------------------------------------
334 Miscellaneous helpers
335 ---------------------------------------------------------------------------*/
336
337 /* Lookup VAR UID in the default_defs hashtable and return the associated
338 variable. */
339
340 tree
341 ssa_default_def (struct function *fn, tree var)
342 {
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));
351 }
352
353 /* Insert the pair VAR's UID, DEF into the default_defs hashtable
354 of function FN. */
355
356 void
357 set_ssa_default_def (struct function *fn, tree var, tree def)
358 {
359 struct tree_decl_minimal ind;
360 struct tree_ssa_name in;
361
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)
368 {
369 tree *loc = DEFAULT_DEFS (fn)->find_slot_with_hash ((tree)&in,
370 DECL_UID (var),
371 NO_INSERT);
372 if (loc)
373 {
374 SSA_NAME_IS_DEFAULT_DEF (*(tree *)loc) = false;
375 DEFAULT_DEFS (fn)->clear_slot (loc);
376 }
377 return;
378 }
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);
382
383 /* Default definition might be changed by tail call optimization. */
384 if (*loc)
385 SSA_NAME_IS_DEFAULT_DEF (*loc) = false;
386
387 /* Mark DEF as the default definition for VAR. */
388 *loc = def;
389 SSA_NAME_IS_DEFAULT_DEF (def) = true;
390 }
391
392 /* Retrieve or create a default definition for VAR. */
393
394 tree
395 get_or_create_ssa_default_def (struct function *fn, tree var)
396 {
397 tree ddef = ssa_default_def (fn, var);
398 if (ddef == NULL_TREE)
399 {
400 ddef = make_ssa_name_fn (fn, var, gimple_build_nop ());
401 set_ssa_default_def (fn, var, ddef);
402 }
403 return ddef;
404 }
405
406
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. */
412
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)
417 {
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;
423
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)))
430 {
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));
436 }
437 if (size_tree != NULL_TREE
438 && TREE_CODE (size_tree) == INTEGER_CST)
439 bitsize = wi::to_offset (size_tree);
440
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;
444
445 /* Compute cumulative bit-offset for nested component-refs and array-refs,
446 and find the ultimate containing object. */
447 while (1)
448 {
449 switch (TREE_CODE (exp))
450 {
451 case BIT_FIELD_REF:
452 bit_offset += wi::to_offset (TREE_OPERAND (exp, 2));
453 break;
454
455 case COMPONENT_REF:
456 {
457 tree field = TREE_OPERAND (exp, 1);
458 tree this_offset = component_ref_field_offset (exp);
459
460 if (this_offset && TREE_CODE (this_offset) == INTEGER_CST)
461 {
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;
466
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)
472 {
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)
479 {
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
488 {
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;
494 }
495 }
496 }
497 }
498 else
499 {
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;
510 }
511 }
512 break;
513
514 case ARRAY_REF:
515 case ARRAY_RANGE_REF:
516 {
517 tree index = TREE_OPERAND (exp, 1);
518 tree low_bound, unit_size;
519
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))
526 {
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;
533
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;
538 }
539 else
540 {
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;
551
552 /* Remember that we have seen an array ref with a variable
553 index. */
554 seen_variable_array_ref = true;
555 }
556 }
557 break;
558
559 case REALPART_EXPR:
560 break;
561
562 case IMAGPART_EXPR:
563 bit_offset += bitsize;
564 break;
565
566 case VIEW_CONVERT_EXPR:
567 break;
568
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)))
574 {
575 exp = TREE_OPERAND (TMR_BASE (exp), 0);
576 bit_offset = 0;
577 maxsize = -1;
578 goto done;
579 }
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;
599
600 /* Hand back the decl for MEM[&decl, off]. */
601 if (TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR)
602 {
603 if (integer_zerop (TREE_OPERAND (exp, 1)))
604 exp = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
605 else
606 {
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))
611 {
612 bit_offset = off;
613 exp = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
614 }
615 }
616 }
617 goto done;
618
619 default:
620 goto done;
621 }
622
623 exp = TREE_OPERAND (exp, 0);
624 }
625
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;
634
635 done:
636 if (!wi::fits_shwi_p (bitsize) || wi::neg_p (bitsize))
637 {
638 *poffset = 0;
639 *psize = -1;
640 *pmax_size = -1;
641
642 return exp;
643 }
644
645 *psize = bitsize.to_shwi ();
646
647 if (!wi::fits_shwi_p (bit_offset))
648 {
649 *poffset = 0;
650 *pmax_size = -1;
651
652 return exp;
653 }
654
655 /* In case of a decl or constant base object we can do better. */
656
657 if (DECL_P (exp))
658 {
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;
665 }
666 else if (CONSTANT_CLASS_P (exp))
667 {
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);
675 }
676
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 ();
685
686 return exp;
687 }
688
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. */
695
696 tree
697 get_addr_base_and_unit_offset_1 (tree exp, HOST_WIDE_INT *poffset,
698 tree (*valueize) (tree))
699 {
700 HOST_WIDE_INT byte_offset = 0;
701
702 /* Compute cumulative byte-offset for nested component-refs and array-refs,
703 and find the ultimate containing object. */
704 while (1)
705 {
706 switch (TREE_CODE (exp))
707 {
708 case BIT_FIELD_REF:
709 {
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;
714 }
715 break;
716
717 case COMPONENT_REF:
718 {
719 tree field = TREE_OPERAND (exp, 1);
720 tree this_offset = component_ref_field_offset (exp);
721 HOST_WIDE_INT hthis_offset;
722
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;
728
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;
733 }
734 break;
735
736 case ARRAY_REF:
737 case ARRAY_RANGE_REF:
738 {
739 tree index = TREE_OPERAND (exp, 1);
740 tree low_bound, unit_size;
741
742 if (valueize
743 && TREE_CODE (index) == SSA_NAME)
744 index = (*valueize) (index);
745
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))
752 {
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 ();
758 }
759 else
760 return NULL_TREE;
761 }
762 break;
763
764 case REALPART_EXPR:
765 break;
766
767 case IMAGPART_EXPR:
768 byte_offset += TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (exp)));
769 break;
770
771 case VIEW_CONVERT_EXPR:
772 break;
773
774 case MEM_REF:
775 {
776 tree base = TREE_OPERAND (exp, 0);
777 if (valueize
778 && TREE_CODE (base) == SSA_NAME)
779 base = (*valueize) (base);
780
781 /* Hand back the decl for MEM[&decl, off]. */
782 if (TREE_CODE (base) == ADDR_EXPR)
783 {
784 if (!integer_zerop (TREE_OPERAND (exp, 1)))
785 {
786 offset_int off = mem_ref_offset (exp);
787 byte_offset += off.to_short_addr ();
788 }
789 exp = TREE_OPERAND (base, 0);
790 }
791 goto done;
792 }
793
794 case TARGET_MEM_REF:
795 {
796 tree base = TREE_OPERAND (exp, 0);
797 if (valueize
798 && TREE_CODE (base) == SSA_NAME)
799 base = (*valueize) (base);
800
801 /* Hand back the decl for MEM[&decl, off]. */
802 if (TREE_CODE (base) == ADDR_EXPR)
803 {
804 if (TMR_INDEX (exp) || TMR_INDEX2 (exp))
805 return NULL_TREE;
806 if (!integer_zerop (TMR_OFFSET (exp)))
807 {
808 offset_int off = mem_ref_offset (exp);
809 byte_offset += off.to_short_addr ();
810 }
811 exp = TREE_OPERAND (base, 0);
812 }
813 goto done;
814 }
815
816 default:
817 goto done;
818 }
819
820 exp = TREE_OPERAND (exp, 0);
821 }
822 done:
823
824 *poffset = byte_offset;
825 return exp;
826 }
827
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. */
832
833 tree
834 get_addr_base_and_unit_offset (tree exp, HOST_WIDE_INT *poffset)
835 {
836 return get_addr_base_and_unit_offset_1 (exp, poffset, NULL);
837 }
838
839 /* Returns true if STMT references an SSA_NAME that has
840 SSA_NAME_OCCURS_IN_ABNORMAL_PHI set, otherwise false. */
841
842 bool
843 stmt_references_abnormal_ssa_name (gimple stmt)
844 {
845 ssa_op_iter oi;
846 use_operand_p use_p;
847
848 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, oi, SSA_OP_USE)
849 {
850 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (USE_FROM_PTR (use_p)))
851 return true;
852 }
853
854 return false;
855 }
856
857 /* Pair of tree and a sorting index, for dump_enumerated_decls. */
858 struct GTY(()) numbered_tree_d
859 {
860 tree t;
861 int num;
862 };
863 typedef struct numbered_tree_d numbered_tree;
864
865
866 /* Compare two declarations references by their DECL_UID / sequence number.
867 Called via qsort. */
868
869 static int
870 compare_decls_by_uid (const void *pa, const void *pb)
871 {
872 const numbered_tree *nt_a = ((const numbered_tree *)pa);
873 const numbered_tree *nt_b = ((const numbered_tree *)pb);
874
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;
878 }
879
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)
883 {
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;
887
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;
895 }
896
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)
907 {
908 basic_block bb;
909 struct walk_stmt_info wi;
910 auto_vec<numbered_tree, 40> decl_list;
911
912 memset (&wi, '\0', sizeof (wi));
913 wi.info = (void *) &decl_list;
914 FOR_EACH_BB_FN (bb, cfun)
915 {
916 gimple_stmt_iterator gsi;
917
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);
921 }
922 decl_list.qsort (compare_decls_by_uid);
923 if (decl_list.length ())
924 {
925 unsigned ix;
926 numbered_tree *ntp;
927 tree last = NULL_TREE;
928
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)
932 {
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;
939 }
940 }
941 }