]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/tree-dfa.c
poly_int: get_ref_base_and_extent
[thirdparty/gcc.git] / gcc / tree-dfa.c
CommitLineData
6de9cd9a 1/* Data flow functions for trees.
cbe34bb5 2 Copyright (C) 2001-2017 Free Software Foundation, Inc.
6de9cd9a
DN
3 Contributed by Diego Novillo <dnovillo@redhat.com>
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9dcd6f09 9the Free Software Foundation; either version 3, or (at your option)
6de9cd9a
DN
10any later version.
11
12GCC is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
9dcd6f09
NC
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
6de9cd9a
DN
20
21#include "config.h"
22#include "system.h"
23#include "coretypes.h"
c7131fb2 24#include "backend.h"
957060b5 25#include "rtl.h"
6de9cd9a 26#include "tree.h"
c7131fb2 27#include "gimple.h"
957060b5 28#include "tree-pass.h"
c7131fb2 29#include "ssa.h"
957060b5 30#include "tree-pretty-print.h"
40e23961 31#include "fold-const.h"
d8a2d370 32#include "stor-layout.h"
60393bbc 33#include "langhooks.h"
5be5c238
AM
34#include "gimple-iterator.h"
35#include "gimple-walk.h"
442b4905 36#include "tree-dfa.h"
6de9cd9a
DN
37
38/* Build and maintain data flow information for trees. */
39
40/* Counters used to display DFA and SSA statistics. */
41struct dfa_stats_d
42{
6de9cd9a
DN
43 long num_defs;
44 long num_uses;
45 long num_phis;
46 long num_phi_args;
726a989a 47 size_t max_num_phi_args;
38635499 48 long num_vdefs;
6de9cd9a
DN
49 long num_vuses;
50};
51
52
6de9cd9a
DN
53/* Local functions. */
54static void collect_dfa_stats (struct dfa_stats_d *);
6de9cd9a
DN
55
56
6de9cd9a
DN
57/*---------------------------------------------------------------------------
58 Dataflow analysis (DFA) routines
59---------------------------------------------------------------------------*/
6de9cd9a 60
908ff6a3
KZ
61/* Renumber all of the gimple stmt uids. */
62
b8698a0f 63void
908ff6a3
KZ
64renumber_gimple_stmt_uids (void)
65{
66 basic_block bb;
67
68 set_gimple_stmt_max_uid (cfun, 0);
04a90bec 69 FOR_ALL_BB_FN (bb, cfun)
908ff6a3 70 {
726a989a 71 gimple_stmt_iterator bsi;
8f984534
RB
72 for (bsi = gsi_start_phis (bb); !gsi_end_p (bsi); gsi_next (&bsi))
73 {
355fe088 74 gimple *stmt = gsi_stmt (bsi);
8f984534
RB
75 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
76 }
726a989a 77 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
908ff6a3 78 {
355fe088 79 gimple *stmt = gsi_stmt (bsi);
726a989a 80 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
908ff6a3
KZ
81 }
82 }
83}
84
2c08497a
BS
85/* Like renumber_gimple_stmt_uids, but only do work on the basic blocks
86 in BLOCKS, of which there are N_BLOCKS. Also renumbers PHIs. */
87
b8698a0f 88void
2c08497a
BS
89renumber_gimple_stmt_uids_in_blocks (basic_block *blocks, int n_blocks)
90{
91 int i;
92
93 set_gimple_stmt_max_uid (cfun, 0);
94 for (i = 0; i < n_blocks; i++)
95 {
96 basic_block bb = blocks[i];
97 gimple_stmt_iterator bsi;
98 for (bsi = gsi_start_phis (bb); !gsi_end_p (bsi); gsi_next (&bsi))
99 {
355fe088 100 gimple *stmt = gsi_stmt (bsi);
2c08497a
BS
101 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
102 }
103 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
104 {
355fe088 105 gimple *stmt = gsi_stmt (bsi);
2c08497a
BS
106 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
107 }
108 }
109}
110
571325db 111
6de9cd9a
DN
112
113/*---------------------------------------------------------------------------
114 Debugging functions
115---------------------------------------------------------------------------*/
6de9cd9a
DN
116
117/* Dump variable VAR and its may-aliases to FILE. */
118
119void
120dump_variable (FILE *file, tree var)
121{
d8903b30
DN
122 if (TREE_CODE (var) == SSA_NAME)
123 {
124 if (POINTER_TYPE_P (TREE_TYPE (var)))
125 dump_points_to_info_for (file, var);
126 var = SSA_NAME_VAR (var);
127 }
6de9cd9a
DN
128
129 if (var == NULL_TREE)
130 {
131 fprintf (file, "<nil>");
132 return;
133 }
134
135 print_generic_expr (file, var, dump_flags);
6de9cd9a 136
ea53115f 137 fprintf (file, ", UID D.%u", (unsigned) DECL_UID (var));
25a6a873
RG
138 if (DECL_PT_UID (var) != DECL_UID (var))
139 fprintf (file, ", PT-UID D.%u", (unsigned) DECL_PT_UID (var));
6de9cd9a 140
1810f6ed
DN
141 fprintf (file, ", ");
142 print_generic_expr (file, TREE_TYPE (var), dump_flags);
143
c597ef4e
DN
144 if (TREE_ADDRESSABLE (var))
145 fprintf (file, ", is addressable");
b8698a0f 146
c597ef4e
DN
147 if (is_global_var (var))
148 fprintf (file, ", is global");
6de9cd9a 149
c04f07f4
DN
150 if (TREE_THIS_VOLATILE (var))
151 fprintf (file, ", is volatile");
152
32244553 153 if (cfun && ssa_default_def (cfun, var))
6de9cd9a
DN
154 {
155 fprintf (file, ", default def: ");
32244553 156 print_generic_expr (file, ssa_default_def (cfun, var), dump_flags);
6de9cd9a
DN
157 }
158
66350781
DN
159 if (DECL_INITIAL (var))
160 {
161 fprintf (file, ", initial: ");
162 print_generic_expr (file, DECL_INITIAL (var), dump_flags);
163 }
164
6de9cd9a
DN
165 fprintf (file, "\n");
166}
167
168
169/* Dump variable VAR and its may-aliases to stderr. */
170
24e47c76 171DEBUG_FUNCTION void
6de9cd9a
DN
172debug_variable (tree var)
173{
174 dump_variable (stderr, var);
175}
176
177
6de9cd9a
DN
178/* Dump various DFA statistics to FILE. */
179
180void
181dump_dfa_stats (FILE *file)
182{
183 struct dfa_stats_d dfa_stats;
184
185 unsigned long size, total = 0;
186 const char * const fmt_str = "%-30s%-13s%12s\n";
187 const char * const fmt_str_1 = "%-30s%13lu%11lu%c\n";
188 const char * const fmt_str_3 = "%-43s%11lu%c\n";
189 const char *funcname
673fda6b 190 = lang_hooks.decl_printable_name (current_function_decl, 2);
6de9cd9a
DN
191
192 collect_dfa_stats (&dfa_stats);
193
194 fprintf (file, "\nDFA Statistics for %s\n\n", funcname);
195
196 fprintf (file, "---------------------------------------------------------\n");
197 fprintf (file, fmt_str, "", " Number of ", "Memory");
198 fprintf (file, fmt_str, "", " instances ", "used ");
199 fprintf (file, "---------------------------------------------------------\n");
200
6de9cd9a
DN
201 size = dfa_stats.num_uses * sizeof (tree *);
202 total += size;
203 fprintf (file, fmt_str_1, "USE operands", dfa_stats.num_uses,
204 SCALE (size), LABEL (size));
205
206 size = dfa_stats.num_defs * sizeof (tree *);
207 total += size;
208 fprintf (file, fmt_str_1, "DEF operands", dfa_stats.num_defs,
209 SCALE (size), LABEL (size));
210
211 size = dfa_stats.num_vuses * sizeof (tree *);
212 total += size;
213 fprintf (file, fmt_str_1, "VUSE operands", dfa_stats.num_vuses,
214 SCALE (size), LABEL (size));
215
38635499 216 size = dfa_stats.num_vdefs * sizeof (tree *);
a32b97a2 217 total += size;
38635499 218 fprintf (file, fmt_str_1, "VDEF operands", dfa_stats.num_vdefs,
6de9cd9a
DN
219 SCALE (size), LABEL (size));
220
538dd0b7 221 size = dfa_stats.num_phis * sizeof (struct gphi);
6de9cd9a
DN
222 total += size;
223 fprintf (file, fmt_str_1, "PHI nodes", dfa_stats.num_phis,
224 SCALE (size), LABEL (size));
225
226 size = dfa_stats.num_phi_args * sizeof (struct phi_arg_d);
227 total += size;
228 fprintf (file, fmt_str_1, "PHI arguments", dfa_stats.num_phi_args,
229 SCALE (size), LABEL (size));
230
231 fprintf (file, "---------------------------------------------------------\n");
232 fprintf (file, fmt_str_3, "Total memory used by DFA/SSA data", SCALE (total),
233 LABEL (total));
234 fprintf (file, "---------------------------------------------------------\n");
235 fprintf (file, "\n");
236
237 if (dfa_stats.num_phis)
726a989a 238 fprintf (file, "Average number of arguments per PHI node: %.1f (max: %ld)\n",
6de9cd9a 239 (float) dfa_stats.num_phi_args / (float) dfa_stats.num_phis,
726a989a 240 (long) dfa_stats.max_num_phi_args);
6de9cd9a
DN
241
242 fprintf (file, "\n");
243}
244
245
246/* Dump DFA statistics on stderr. */
247
24e47c76 248DEBUG_FUNCTION void
6de9cd9a
DN
249debug_dfa_stats (void)
250{
251 dump_dfa_stats (stderr);
252}
253
254
206048bd 255/* Collect DFA statistics and store them in the structure pointed to by
6de9cd9a
DN
256 DFA_STATS_P. */
257
258static void
726a989a 259collect_dfa_stats (struct dfa_stats_d *dfa_stats_p ATTRIBUTE_UNUSED)
6de9cd9a 260{
6de9cd9a 261 basic_block bb;
6de9cd9a 262
1e128c5f 263 gcc_assert (dfa_stats_p);
6de9cd9a
DN
264
265 memset ((void *)dfa_stats_p, 0, sizeof (struct dfa_stats_d));
266
726a989a 267 /* Walk all the statements in the function counting references. */
11cd3bed 268 FOR_EACH_BB_FN (bb, cfun)
6de9cd9a 269 {
538dd0b7
DM
270 for (gphi_iterator si = gsi_start_phis (bb); !gsi_end_p (si);
271 gsi_next (&si))
6de9cd9a 272 {
538dd0b7 273 gphi *phi = si.phi ();
6de9cd9a 274 dfa_stats_p->num_phis++;
726a989a
RB
275 dfa_stats_p->num_phi_args += gimple_phi_num_args (phi);
276 if (gimple_phi_num_args (phi) > dfa_stats_p->max_num_phi_args)
277 dfa_stats_p->max_num_phi_args = gimple_phi_num_args (phi);
6de9cd9a 278 }
6de9cd9a 279
538dd0b7
DM
280 for (gimple_stmt_iterator si = gsi_start_bb (bb); !gsi_end_p (si);
281 gsi_next (&si))
6de9cd9a 282 {
355fe088 283 gimple *stmt = gsi_stmt (si);
726a989a
RB
284 dfa_stats_p->num_defs += NUM_SSA_OPERANDS (stmt, SSA_OP_DEF);
285 dfa_stats_p->num_uses += NUM_SSA_OPERANDS (stmt, SSA_OP_USE);
5006671f
RG
286 dfa_stats_p->num_vdefs += gimple_vdef (stmt) ? 1 : 0;
287 dfa_stats_p->num_vuses += gimple_vuse (stmt) ? 1 : 0;
6de9cd9a
DN
288 }
289 }
6de9cd9a
DN
290}
291
292
293/*---------------------------------------------------------------------------
294 Miscellaneous helpers
295---------------------------------------------------------------------------*/
a3648cfc 296
86051306
JH
297/* Lookup VAR UID in the default_defs hashtable and return the associated
298 variable. */
299
b8698a0f 300tree
32244553 301ssa_default_def (struct function *fn, tree var)
86051306 302{
e445a2ff
RG
303 struct tree_decl_minimal ind;
304 struct tree_ssa_name in;
8813a647 305 gcc_assert (VAR_P (var)
32244553
RG
306 || TREE_CODE (var) == PARM_DECL
307 || TREE_CODE (var) == RESULT_DECL);
51b86113
DM
308
309 /* Always NULL_TREE for rtl function dumps. */
310 if (!fn->gimple_df)
311 return NULL_TREE;
312
e445a2ff
RG
313 in.var = (tree)&ind;
314 ind.uid = DECL_UID (var);
2a22f99c 315 return DEFAULT_DEFS (fn)->find_with_hash ((tree)&in, DECL_UID (var));
86051306
JH
316}
317
32244553
RG
318/* Insert the pair VAR's UID, DEF into the default_defs hashtable
319 of function FN. */
86051306
JH
320
321void
32244553 322set_ssa_default_def (struct function *fn, tree var, tree def)
b8698a0f 323{
e445a2ff
RG
324 struct tree_decl_minimal ind;
325 struct tree_ssa_name in;
86051306 326
8813a647 327 gcc_assert (VAR_P (var)
32244553
RG
328 || TREE_CODE (var) == PARM_DECL
329 || TREE_CODE (var) == RESULT_DECL);
e445a2ff
RG
330 in.var = (tree)&ind;
331 ind.uid = DECL_UID (var);
332 if (!def)
86051306 333 {
2a22f99c
TS
334 tree *loc = DEFAULT_DEFS (fn)->find_slot_with_hash ((tree)&in,
335 DECL_UID (var),
336 NO_INSERT);
2044a4c3 337 if (loc)
01c59d23
RG
338 {
339 SSA_NAME_IS_DEFAULT_DEF (*(tree *)loc) = false;
2a22f99c 340 DEFAULT_DEFS (fn)->clear_slot (loc);
01c59d23 341 }
86051306
JH
342 return;
343 }
e445a2ff 344 gcc_assert (TREE_CODE (def) == SSA_NAME && SSA_NAME_VAR (def) == var);
2a22f99c
TS
345 tree *loc = DEFAULT_DEFS (fn)->find_slot_with_hash ((tree)&in,
346 DECL_UID (var), INSERT);
38635499 347
86051306 348 /* Default definition might be changed by tail call optimization. */
e445a2ff 349 if (*loc)
2a22f99c 350 SSA_NAME_IS_DEFAULT_DEF (*loc) = false;
cfaab3a9
DN
351
352 /* Mark DEF as the default definition for VAR. */
2a22f99c 353 *loc = def;
01c59d23 354 SSA_NAME_IS_DEFAULT_DEF (def) = true;
86051306
JH
355}
356
32244553
RG
357/* Retrieve or create a default definition for VAR. */
358
359tree
360get_or_create_ssa_default_def (struct function *fn, tree var)
361{
362 tree ddef = ssa_default_def (fn, var);
363 if (ddef == NULL_TREE)
364 {
f3a1fb91
MJ
365 ddef = make_ssa_name_fn (fn, var, gimple_build_nop ());
366 set_ssa_default_def (fn, var, ddef);
32244553
RG
367 }
368 return ddef;
369}
370
6de9cd9a 371
cfaab3a9 372/* If EXP is a handled component reference for a structure, return the
6bec9271
RG
373 base variable. The access range is delimited by bit positions *POFFSET and
374 *POFFSET + *PMAX_SIZE. The access size is *PSIZE bits. If either
375 *PSIZE or *PMAX_SIZE is -1, they could not be determined. If *PSIZE
ee45a32d
EB
376 and *PMAX_SIZE are equal, the access is non-variable. If *PREVERSE is
377 true, the storage order of the reference is reversed. */
c75ab022
DB
378
379tree
588db50c
RS
380get_ref_base_and_extent (tree exp, poly_int64_pod *poffset,
381 poly_int64_pod *psize,
382 poly_int64_pod *pmax_size,
ee45a32d 383 bool *preverse)
c75ab022 384{
588db50c
RS
385 poly_offset_int bitsize = -1;
386 poly_offset_int maxsize;
6bec9271 387 tree size_tree = NULL_TREE;
588db50c 388 poly_offset_int bit_offset = 0;
00e85045 389 bool seen_variable_array_ref = false;
6bec9271 390
ee45a32d
EB
391 /* First get the final access size and the storage order from just the
392 outermost expression. */
6bec9271
RG
393 if (TREE_CODE (exp) == COMPONENT_REF)
394 size_tree = DECL_SIZE (TREE_OPERAND (exp, 1));
395 else if (TREE_CODE (exp) == BIT_FIELD_REF)
396 size_tree = TREE_OPERAND (exp, 1);
55b34b5f 397 else if (!VOID_TYPE_P (TREE_TYPE (exp)))
c75ab022 398 {
ef4bddc2 399 machine_mode mode = TYPE_MODE (TREE_TYPE (exp));
6bec9271
RG
400 if (mode == BLKmode)
401 size_tree = TYPE_SIZE (TREE_TYPE (exp));
402 else
588db50c 403 bitsize = GET_MODE_BITSIZE (mode);
c75ab022 404 }
5b5d7f31 405 if (size_tree != NULL_TREE
588db50c
RS
406 && poly_int_tree_p (size_tree))
407 bitsize = wi::to_poly_offset (size_tree);
6bec9271 408
ee45a32d
EB
409 *preverse = reverse_storage_order_for_component_p (exp);
410
6bec9271
RG
411 /* Initially, maxsize is the same as the accessed element size.
412 In the following it will only grow (or become -1). */
413 maxsize = bitsize;
414
415 /* Compute cumulative bit-offset for nested component-refs and array-refs,
416 and find the ultimate containing object. */
417 while (1)
418 {
419 switch (TREE_CODE (exp))
420 {
421 case BIT_FIELD_REF:
588db50c 422 bit_offset += wi::to_poly_offset (TREE_OPERAND (exp, 2));
6bec9271
RG
423 break;
424
425 case COMPONENT_REF:
426 {
427 tree field = TREE_OPERAND (exp, 1);
428 tree this_offset = component_ref_field_offset (exp);
429
588db50c 430 if (this_offset && poly_int_tree_p (this_offset))
6bec9271 431 {
588db50c
RS
432 poly_offset_int woffset = (wi::to_poly_offset (this_offset)
433 << LOG2_BITS_PER_UNIT);
807e902e
KZ
434 woffset += wi::to_offset (DECL_FIELD_BIT_OFFSET (field));
435 bit_offset += woffset;
79441eca
RG
436
437 /* If we had seen a variable array ref already and we just
438 referenced the last field of a struct or a union member
439 then we have to adjust maxsize by the padding at the end
440 of our field. */
588db50c 441 if (seen_variable_array_ref && known_size_p (maxsize))
79441eca
RG
442 {
443 tree stype = TREE_TYPE (TREE_OPERAND (exp, 0));
910ad8de 444 tree next = DECL_CHAIN (field);
79441eca 445 while (next && TREE_CODE (next) != FIELD_DECL)
910ad8de 446 next = DECL_CHAIN (next);
79441eca
RG
447 if (!next
448 || TREE_CODE (stype) != RECORD_TYPE)
449 {
450 tree fsize = DECL_SIZE_UNIT (field);
451 tree ssize = TYPE_SIZE_UNIT (stype);
5b5d7f31 452 if (fsize == NULL
588db50c 453 || !poly_int_tree_p (fsize)
5b5d7f31 454 || ssize == NULL
588db50c 455 || !poly_int_tree_p (ssize))
807e902e 456 maxsize = -1;
79441eca 457 else
5b5d7f31 458 {
588db50c
RS
459 poly_offset_int tem
460 = (wi::to_poly_offset (ssize)
461 - wi::to_poly_offset (fsize));
8de73453 462 tem <<= LOG2_BITS_PER_UNIT;
807e902e 463 tem -= woffset;
5b5d7f31
JJ
464 maxsize += tem;
465 }
79441eca
RG
466 }
467 }
6bec9271
RG
468 }
469 else
470 {
471 tree csize = TYPE_SIZE (TREE_TYPE (TREE_OPERAND (exp, 0)));
472 /* We need to adjust maxsize to the whole structure bitsize.
fa10beec 473 But we can subtract any constant offset seen so far,
6bec9271 474 because that would get us out of the structure otherwise. */
588db50c 475 if (known_size_p (maxsize)
ca8d9092 476 && csize
588db50c
RS
477 && poly_int_tree_p (csize))
478 maxsize = wi::to_poly_offset (csize) - bit_offset;
6bec9271 479 else
807e902e 480 maxsize = -1;
6bec9271
RG
481 }
482 }
483 break;
484
485 case ARRAY_REF:
486 case ARRAY_RANGE_REF:
487 {
488 tree index = TREE_OPERAND (exp, 1);
821bb7f8 489 tree low_bound, unit_size;
6bec9271 490
c21c775a 491 /* If the resulting bit-offset is constant, track it. */
588db50c 492 if (poly_int_tree_p (index)
821bb7f8 493 && (low_bound = array_ref_low_bound (exp),
588db50c 494 poly_int_tree_p (low_bound))
821bb7f8 495 && (unit_size = array_ref_element_size (exp),
ca8d9092 496 TREE_CODE (unit_size) == INTEGER_CST))
6bec9271 497 {
588db50c
RS
498 poly_offset_int woffset
499 = wi::sext (wi::to_poly_offset (index)
500 - wi::to_poly_offset (low_bound),
807e902e
KZ
501 TYPE_PRECISION (TREE_TYPE (index)));
502 woffset *= wi::to_offset (unit_size);
8de73453 503 woffset <<= LOG2_BITS_PER_UNIT;
807e902e 504 bit_offset += woffset;
00e85045
RG
505
506 /* An array ref with a constant index up in the structure
507 hierarchy will constrain the size of any variable array ref
508 lower in the access hierarchy. */
509 seen_variable_array_ref = false;
6bec9271
RG
510 }
511 else
512 {
513 tree asize = TYPE_SIZE (TREE_TYPE (TREE_OPERAND (exp, 0)));
514 /* We need to adjust maxsize to the whole array bitsize.
fa10beec 515 But we can subtract any constant offset seen so far,
6bec9271 516 because that would get us outside of the array otherwise. */
588db50c 517 if (known_size_p (maxsize)
ca8d9092 518 && asize
588db50c
RS
519 && poly_int_tree_p (asize))
520 maxsize = wi::to_poly_offset (asize) - bit_offset;
6bec9271 521 else
807e902e 522 maxsize = -1;
00e85045
RG
523
524 /* Remember that we have seen an array ref with a variable
525 index. */
526 seen_variable_array_ref = true;
6bec9271
RG
527 }
528 }
529 break;
530
531 case REALPART_EXPR:
532 break;
533
534 case IMAGPART_EXPR:
5b5d7f31 535 bit_offset += bitsize;
6bec9271
RG
536 break;
537
538 case VIEW_CONVERT_EXPR:
6bec9271
RG
539 break;
540
4f94d87c
RB
541 case TARGET_MEM_REF:
542 /* Via the variable index or index2 we can reach the
543 whole object. Still hand back the decl here. */
544 if (TREE_CODE (TMR_BASE (exp)) == ADDR_EXPR
545 && (TMR_INDEX (exp) || TMR_INDEX2 (exp)))
546 {
547 exp = TREE_OPERAND (TMR_BASE (exp), 0);
807e902e
KZ
548 bit_offset = 0;
549 maxsize = -1;
4f94d87c
RB
550 goto done;
551 }
552 /* Fallthru. */
70f34814 553 case MEM_REF:
4f94d87c
RB
554 /* We need to deal with variable arrays ending structures such as
555 struct { int length; int a[1]; } x; x.a[d]
556 struct { struct { int a; int b; } a[1]; } x; x.a[d].a
557 struct { struct { int a[1]; } a[1]; } x; x.a[0][d], x.a[d][0]
558 struct { int len; union { int a[1]; struct X x; } u; } x; x.u.a[d]
559 where we do not know maxsize for variable index accesses to
560 the array. The simplest way to conservatively deal with this
561 is to punt in the case that offset + maxsize reaches the
562 base type boundary. This needs to include possible trailing
563 padding that is there for alignment purposes. */
564 if (seen_variable_array_ref
588db50c 565 && known_size_p (maxsize)
5b5d7f31 566 && (TYPE_SIZE (TREE_TYPE (exp)) == NULL_TREE
588db50c
RS
567 || !poly_int_tree_p (TYPE_SIZE (TREE_TYPE (exp)))
568 || (maybe_eq
569 (bit_offset + maxsize,
570 wi::to_poly_offset (TYPE_SIZE (TREE_TYPE (exp)))))))
807e902e 571 maxsize = -1;
4f94d87c 572
70f34814
RG
573 /* Hand back the decl for MEM[&decl, off]. */
574 if (TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR)
575 {
576 if (integer_zerop (TREE_OPERAND (exp, 1)))
577 exp = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
4b228e61
RG
578 else
579 {
588db50c 580 poly_offset_int off = mem_ref_offset (exp);
8de73453 581 off <<= LOG2_BITS_PER_UNIT;
27bcd47c 582 off += bit_offset;
588db50c
RS
583 poly_int64 off_hwi;
584 if (off.to_shwi (&off_hwi))
4b228e61 585 {
588db50c 586 bit_offset = off_hwi;
4f94d87c 587 exp = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
4b228e61
RG
588 }
589 }
590 }
591 goto done;
592
6bec9271
RG
593 default:
594 goto done;
595 }
596
597 exp = TREE_OPERAND (exp, 0);
598 }
6bec9271 599
4f94d87c 600 done:
588db50c 601 if (!bitsize.to_shwi (psize) || maybe_lt (*psize, 0))
ca8d9092
EB
602 {
603 *poffset = 0;
5b5d7f31 604 *psize = -1;
ca8d9092
EB
605 *pmax_size = -1;
606
607 return exp;
608 }
609
588db50c
RS
610 /* ??? Due to negative offsets in ARRAY_REF we can end up with
611 negative bit_offset here. We might want to store a zero offset
612 in this case. */
613 if (!bit_offset.to_shwi (poffset))
5b5d7f31
JJ
614 {
615 *poffset = 0;
616 *pmax_size = -1;
617
618 return exp;
619 }
ca8d9092 620
90ff582f 621 /* In case of a decl or constant base object we can do better. */
0230277c
RG
622
623 if (DECL_P (exp))
624 {
8813a647 625 if (flag_unconstrained_commons && VAR_P (exp) && DECL_COMMON (exp))
71017a7b
AL
626 {
627 tree sz_tree = TYPE_SIZE (TREE_TYPE (exp));
628 /* If size is unknown, or we have read to the end, assume there
629 may be more to the structure than we are told. */
630 if (TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE
631 || (seen_variable_array_ref
632 && (sz_tree == NULL_TREE
588db50c
RS
633 || !poly_int_tree_p (sz_tree)
634 || maybe_eq (bit_offset + maxsize,
635 wi::to_poly_offset (sz_tree)))))
71017a7b
AL
636 maxsize = -1;
637 }
0230277c
RG
638 /* If maxsize is unknown adjust it according to the size of the
639 base decl. */
588db50c
RS
640 else if (!known_size_p (maxsize)
641 && DECL_SIZE (exp)
642 && poly_int_tree_p (DECL_SIZE (exp)))
643 maxsize = wi::to_poly_offset (DECL_SIZE (exp)) - bit_offset;
0230277c 644 }
90ff582f
RG
645 else if (CONSTANT_CLASS_P (exp))
646 {
647 /* If maxsize is unknown adjust it according to the size of the
648 base type constant. */
588db50c 649 if (!known_size_p (maxsize)
5b5d7f31 650 && TYPE_SIZE (TREE_TYPE (exp))
588db50c
RS
651 && poly_int_tree_p (TYPE_SIZE (TREE_TYPE (exp))))
652 maxsize = (wi::to_poly_offset (TYPE_SIZE (TREE_TYPE (exp)))
807e902e 653 - bit_offset);
90ff582f 654 }
00e85045 655
588db50c
RS
656 if (!maxsize.to_shwi (pmax_size)
657 || maybe_lt (*pmax_size, 0)
658 || !endpoint_representable_p (*poffset, *pmax_size))
5b5d7f31 659 *pmax_size = -1;
476dec78
JJ
660
661 /* Punt if *POFFSET + *PSIZE overflows in HOST_WIDE_INT, the callers don't
662 check for such overflows individually and assume it works. */
588db50c 663 if (!endpoint_representable_p (*poffset, *psize))
476dec78
JJ
664 {
665 *poffset = 0;
666 *psize = -1;
667 *pmax_size = -1;
668
669 return exp;
670 }
6bec9271
RG
671
672 return exp;
c75ab022 673}
e9e0aa2c 674
588db50c
RS
675/* Like get_ref_base_and_extent, but for cases in which we only care
676 about constant-width accesses at constant offsets. Return null
677 if the access is anything else. */
678
679tree
680get_ref_base_and_extent_hwi (tree exp, HOST_WIDE_INT *poffset,
681 HOST_WIDE_INT *psize, bool *preverse)
682{
683 poly_int64 offset, size, max_size;
684 HOST_WIDE_INT const_offset, const_size;
685 bool reverse;
686 tree decl = get_ref_base_and_extent (exp, &offset, &size, &max_size,
687 &reverse);
688 if (!offset.is_constant (&const_offset)
689 || !size.is_constant (&const_size)
690 || const_offset < 0
691 || !known_size_p (max_size)
692 || maybe_ne (max_size, const_size))
693 return NULL_TREE;
694
695 *poffset = const_offset;
696 *psize = const_size;
697 *preverse = reverse;
698 return decl;
699}
700
f2918c18
AM
701/* Returns the base object and a constant BITS_PER_UNIT offset in *POFFSET that
702 denotes the starting address of the memory access EXP.
703 Returns NULL_TREE if the offset is not constant or any component
704 is not BITS_PER_UNIT-aligned.
705 VALUEIZE if non-NULL is used to valueize SSA names. It should return
706 its argument or a constant if the argument is known to be constant. */
707
708tree
709get_addr_base_and_unit_offset_1 (tree exp, HOST_WIDE_INT *poffset,
710 tree (*valueize) (tree))
711{
712 HOST_WIDE_INT byte_offset = 0;
713
714 /* Compute cumulative byte-offset for nested component-refs and array-refs,
715 and find the ultimate containing object. */
716 while (1)
717 {
718 switch (TREE_CODE (exp))
719 {
720 case BIT_FIELD_REF:
721 {
722 HOST_WIDE_INT this_off = TREE_INT_CST_LOW (TREE_OPERAND (exp, 2));
723 if (this_off % BITS_PER_UNIT)
724 return NULL_TREE;
725 byte_offset += this_off / BITS_PER_UNIT;
726 }
727 break;
728
729 case COMPONENT_REF:
730 {
731 tree field = TREE_OPERAND (exp, 1);
732 tree this_offset = component_ref_field_offset (exp);
733 HOST_WIDE_INT hthis_offset;
734
735 if (!this_offset
736 || TREE_CODE (this_offset) != INTEGER_CST
737 || (TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (field))
738 % BITS_PER_UNIT))
739 return NULL_TREE;
740
741 hthis_offset = TREE_INT_CST_LOW (this_offset);
742 hthis_offset += (TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (field))
743 / BITS_PER_UNIT);
744 byte_offset += hthis_offset;
745 }
746 break;
747
748 case ARRAY_REF:
749 case ARRAY_RANGE_REF:
750 {
751 tree index = TREE_OPERAND (exp, 1);
752 tree low_bound, unit_size;
753
754 if (valueize
755 && TREE_CODE (index) == SSA_NAME)
756 index = (*valueize) (index);
757
758 /* If the resulting bit-offset is constant, track it. */
759 if (TREE_CODE (index) == INTEGER_CST
760 && (low_bound = array_ref_low_bound (exp),
761 TREE_CODE (low_bound) == INTEGER_CST)
762 && (unit_size = array_ref_element_size (exp),
763 TREE_CODE (unit_size) == INTEGER_CST))
764 {
765 offset_int woffset
766 = wi::sext (wi::to_offset (index) - wi::to_offset (low_bound),
767 TYPE_PRECISION (TREE_TYPE (index)));
768 woffset *= wi::to_offset (unit_size);
769 byte_offset += woffset.to_shwi ();
770 }
771 else
772 return NULL_TREE;
773 }
774 break;
775
776 case REALPART_EXPR:
777 break;
778
779 case IMAGPART_EXPR:
780 byte_offset += TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (exp)));
781 break;
782
783 case VIEW_CONVERT_EXPR:
784 break;
785
786 case MEM_REF:
787 {
788 tree base = TREE_OPERAND (exp, 0);
789 if (valueize
790 && TREE_CODE (base) == SSA_NAME)
791 base = (*valueize) (base);
792
793 /* Hand back the decl for MEM[&decl, off]. */
794 if (TREE_CODE (base) == ADDR_EXPR)
795 {
796 if (!integer_zerop (TREE_OPERAND (exp, 1)))
797 {
798 offset_int off = mem_ref_offset (exp);
799 byte_offset += off.to_short_addr ();
800 }
801 exp = TREE_OPERAND (base, 0);
802 }
803 goto done;
804 }
805
806 case TARGET_MEM_REF:
807 {
808 tree base = TREE_OPERAND (exp, 0);
809 if (valueize
810 && TREE_CODE (base) == SSA_NAME)
811 base = (*valueize) (base);
812
813 /* Hand back the decl for MEM[&decl, off]. */
814 if (TREE_CODE (base) == ADDR_EXPR)
815 {
816 if (TMR_INDEX (exp) || TMR_INDEX2 (exp))
817 return NULL_TREE;
818 if (!integer_zerop (TMR_OFFSET (exp)))
819 {
820 offset_int off = mem_ref_offset (exp);
821 byte_offset += off.to_short_addr ();
822 }
823 exp = TREE_OPERAND (base, 0);
824 }
825 goto done;
826 }
827
828 default:
829 goto done;
830 }
831
832 exp = TREE_OPERAND (exp, 0);
833 }
834done:
835
836 *poffset = byte_offset;
837 return exp;
838}
839
70f34814
RG
840/* Returns the base object and a constant BITS_PER_UNIT offset in *POFFSET that
841 denotes the starting address of the memory access EXP.
842 Returns NULL_TREE if the offset is not constant or any component
843 is not BITS_PER_UNIT-aligned. */
844
845tree
846get_addr_base_and_unit_offset (tree exp, HOST_WIDE_INT *poffset)
847{
cfef45c8 848 return get_addr_base_and_unit_offset_1 (exp, poffset, NULL);
70f34814
RG
849}
850
2e58df6e
RG
851/* Returns true if STMT references an SSA_NAME that has
852 SSA_NAME_OCCURS_IN_ABNORMAL_PHI set, otherwise false. */
853
854bool
355fe088 855stmt_references_abnormal_ssa_name (gimple *stmt)
2e58df6e
RG
856{
857 ssa_op_iter oi;
858 use_operand_p use_p;
859
860 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, oi, SSA_OP_USE)
861 {
862 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (USE_FROM_PTR (use_p)))
863 return true;
864 }
865
866 return false;
867}
7ee2468b 868
cf8be00d
RS
869/* If STMT takes any abnormal PHI values as input, replace them with
870 local copies. */
871
872void
873replace_abnormal_ssa_names (gimple *stmt)
874{
875 ssa_op_iter oi;
876 use_operand_p use_p;
877
878 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, oi, SSA_OP_USE)
879 {
880 tree op = USE_FROM_PTR (use_p);
881 if (TREE_CODE (op) == SSA_NAME && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op))
882 {
883 gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
884 tree new_name = make_ssa_name (TREE_TYPE (op));
885 gassign *assign = gimple_build_assign (new_name, op);
886 gsi_insert_before (&gsi, assign, GSI_SAME_STMT);
887 SET_USE (use_p, new_name);
888 }
889 }
890}
891
7ee2468b 892/* Pair of tree and a sorting index, for dump_enumerated_decls. */
a79683d5 893struct GTY(()) numbered_tree
7ee2468b
SB
894{
895 tree t;
896 int num;
897};
7ee2468b 898
7ee2468b
SB
899
900/* Compare two declarations references by their DECL_UID / sequence number.
901 Called via qsort. */
902
903static int
904compare_decls_by_uid (const void *pa, const void *pb)
905{
906 const numbered_tree *nt_a = ((const numbered_tree *)pa);
907 const numbered_tree *nt_b = ((const numbered_tree *)pb);
908
909 if (DECL_UID (nt_a->t) != DECL_UID (nt_b->t))
910 return DECL_UID (nt_a->t) - DECL_UID (nt_b->t);
911 return nt_a->num - nt_b->num;
912}
913
914/* Called via walk_gimple_stmt / walk_gimple_op by dump_enumerated_decls. */
915static tree
916dump_enumerated_decls_push (tree *tp, int *walk_subtrees, void *data)
917{
918 struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
9771b263 919 vec<numbered_tree> *list = (vec<numbered_tree> *) wi->info;
7ee2468b
SB
920 numbered_tree nt;
921
922 if (!DECL_P (*tp))
923 return NULL_TREE;
924 nt.t = *tp;
9771b263
DN
925 nt.num = list->length ();
926 list->safe_push (nt);
7ee2468b
SB
927 *walk_subtrees = 0;
928 return NULL_TREE;
929}
930
931/* Find all the declarations used by the current function, sort them by uid,
932 and emit the sorted list. Each declaration is tagged with a sequence
933 number indicating when it was found during statement / tree walking,
934 so that TDF_NOUID comparisons of anonymous declarations are still
935 meaningful. Where a declaration was encountered more than once, we
936 emit only the sequence number of the first encounter.
937 FILE is the dump file where to output the list and FLAGS is as in
938 print_generic_expr. */
939void
1a817418 940dump_enumerated_decls (FILE *file, dump_flags_t flags)
7ee2468b
SB
941{
942 basic_block bb;
943 struct walk_stmt_info wi;
00f96dc9 944 auto_vec<numbered_tree, 40> decl_list;
7ee2468b
SB
945
946 memset (&wi, '\0', sizeof (wi));
9771b263 947 wi.info = (void *) &decl_list;
11cd3bed 948 FOR_EACH_BB_FN (bb, cfun)
7ee2468b
SB
949 {
950 gimple_stmt_iterator gsi;
951
952 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
953 if (!is_gimple_debug (gsi_stmt (gsi)))
954 walk_gimple_stmt (&gsi, NULL, dump_enumerated_decls_push, &wi);
955 }
9771b263
DN
956 decl_list.qsort (compare_decls_by_uid);
957 if (decl_list.length ())
7ee2468b
SB
958 {
959 unsigned ix;
960 numbered_tree *ntp;
961 tree last = NULL_TREE;
962
963 fprintf (file, "Declarations used by %s, sorted by DECL_UID:\n",
964 current_function_name ());
9771b263 965 FOR_EACH_VEC_ELT (decl_list, ix, ntp)
7ee2468b
SB
966 {
967 if (ntp->t == last)
968 continue;
969 fprintf (file, "%d: ", ntp->num);
970 print_generic_decl (file, ntp->t, flags);
971 fprintf (file, "\n");
972 last = ntp->t;
973 }
974 }
7ee2468b 975}