]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/tree-dfa.c
dojump.h: New header file.
[thirdparty/gcc.git] / gcc / tree-dfa.c
CommitLineData
6de9cd9a 1/* Data flow functions for trees.
5624e564 2 Copyright (C) 2001-2015 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"
24#include "tm.h"
25#include "hashtab.h"
40e23961
MC
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"
6de9cd9a 35#include "tree.h"
40e23961 36#include "fold-const.h"
d8a2d370 37#include "stor-layout.h"
6de9cd9a 38#include "tm_p.h"
60393bbc 39#include "predict.h"
83685514 40#include "hard-reg-set.h"
6de9cd9a 41#include "function.h"
60393bbc
AM
42#include "dominance.h"
43#include "cfg.h"
44#include "basic-block.h"
45#include "langhooks.h"
46#include "flags.h"
cf835838 47#include "tree-pretty-print.h"
2fb9a547
AM
48#include "tree-ssa-alias.h"
49#include "internal-fn.h"
50#include "gimple-expr.h"
51#include "is-a.h"
726a989a 52#include "gimple.h"
5be5c238
AM
53#include "gimple-iterator.h"
54#include "gimple-walk.h"
442b4905
AM
55#include "gimple-ssa.h"
56#include "tree-phinodes.h"
57#include "ssa-iterators.h"
d8a2d370 58#include "stringpool.h"
442b4905 59#include "tree-ssanames.h"
36566b39
PK
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"
d8a2d370 72#include "expr.h"
442b4905 73#include "tree-dfa.h"
6de9cd9a 74#include "tree-inline.h"
6de9cd9a 75#include "tree-pass.h"
6de9cd9a
DN
76#include "params.h"
77
78/* Build and maintain data flow information for trees. */
79
80/* Counters used to display DFA and SSA statistics. */
81struct dfa_stats_d
82{
6de9cd9a
DN
83 long num_defs;
84 long num_uses;
85 long num_phis;
86 long num_phi_args;
726a989a 87 size_t max_num_phi_args;
38635499 88 long num_vdefs;
6de9cd9a
DN
89 long num_vuses;
90};
91
92
6de9cd9a
DN
93/* Local functions. */
94static void collect_dfa_stats (struct dfa_stats_d *);
6de9cd9a
DN
95
96
6de9cd9a
DN
97/*---------------------------------------------------------------------------
98 Dataflow analysis (DFA) routines
99---------------------------------------------------------------------------*/
6de9cd9a 100
908ff6a3
KZ
101/* Renumber all of the gimple stmt uids. */
102
b8698a0f 103void
908ff6a3
KZ
104renumber_gimple_stmt_uids (void)
105{
106 basic_block bb;
107
108 set_gimple_stmt_max_uid (cfun, 0);
04a90bec 109 FOR_ALL_BB_FN (bb, cfun)
908ff6a3 110 {
726a989a 111 gimple_stmt_iterator bsi;
8f984534
RB
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 }
726a989a 117 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
908ff6a3 118 {
726a989a
RB
119 gimple stmt = gsi_stmt (bsi);
120 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
908ff6a3
KZ
121 }
122 }
123}
124
2c08497a
BS
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
b8698a0f 128void
2c08497a
BS
129renumber_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
571325db 151
6de9cd9a
DN
152
153/*---------------------------------------------------------------------------
154 Debugging functions
155---------------------------------------------------------------------------*/
6de9cd9a
DN
156
157/* Dump variable VAR and its may-aliases to FILE. */
158
159void
160dump_variable (FILE *file, tree var)
161{
d8903b30
DN
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 }
6de9cd9a
DN
168
169 if (var == NULL_TREE)
170 {
171 fprintf (file, "<nil>");
172 return;
173 }
174
175 print_generic_expr (file, var, dump_flags);
6de9cd9a 176
ea53115f 177 fprintf (file, ", UID D.%u", (unsigned) DECL_UID (var));
25a6a873
RG
178 if (DECL_PT_UID (var) != DECL_UID (var))
179 fprintf (file, ", PT-UID D.%u", (unsigned) DECL_PT_UID (var));
6de9cd9a 180
1810f6ed
DN
181 fprintf (file, ", ");
182 print_generic_expr (file, TREE_TYPE (var), dump_flags);
183
c597ef4e
DN
184 if (TREE_ADDRESSABLE (var))
185 fprintf (file, ", is addressable");
b8698a0f 186
c597ef4e
DN
187 if (is_global_var (var))
188 fprintf (file, ", is global");
6de9cd9a 189
c04f07f4
DN
190 if (TREE_THIS_VOLATILE (var))
191 fprintf (file, ", is volatile");
192
32244553 193 if (cfun && ssa_default_def (cfun, var))
6de9cd9a
DN
194 {
195 fprintf (file, ", default def: ");
32244553 196 print_generic_expr (file, ssa_default_def (cfun, var), dump_flags);
6de9cd9a
DN
197 }
198
66350781
DN
199 if (DECL_INITIAL (var))
200 {
201 fprintf (file, ", initial: ");
202 print_generic_expr (file, DECL_INITIAL (var), dump_flags);
203 }
204
6de9cd9a
DN
205 fprintf (file, "\n");
206}
207
208
209/* Dump variable VAR and its may-aliases to stderr. */
210
24e47c76 211DEBUG_FUNCTION void
6de9cd9a
DN
212debug_variable (tree var)
213{
214 dump_variable (stderr, var);
215}
216
217
6de9cd9a
DN
218/* Dump various DFA statistics to FILE. */
219
220void
221dump_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
673fda6b 230 = lang_hooks.decl_printable_name (current_function_decl, 2);
6de9cd9a
DN
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
6de9cd9a
DN
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
38635499 256 size = dfa_stats.num_vdefs * sizeof (tree *);
a32b97a2 257 total += size;
38635499 258 fprintf (file, fmt_str_1, "VDEF operands", dfa_stats.num_vdefs,
6de9cd9a
DN
259 SCALE (size), LABEL (size));
260
538dd0b7 261 size = dfa_stats.num_phis * sizeof (struct gphi);
6de9cd9a
DN
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)
726a989a 278 fprintf (file, "Average number of arguments per PHI node: %.1f (max: %ld)\n",
6de9cd9a 279 (float) dfa_stats.num_phi_args / (float) dfa_stats.num_phis,
726a989a 280 (long) dfa_stats.max_num_phi_args);
6de9cd9a
DN
281
282 fprintf (file, "\n");
283}
284
285
286/* Dump DFA statistics on stderr. */
287
24e47c76 288DEBUG_FUNCTION void
6de9cd9a
DN
289debug_dfa_stats (void)
290{
291 dump_dfa_stats (stderr);
292}
293
294
206048bd 295/* Collect DFA statistics and store them in the structure pointed to by
6de9cd9a
DN
296 DFA_STATS_P. */
297
298static void
726a989a 299collect_dfa_stats (struct dfa_stats_d *dfa_stats_p ATTRIBUTE_UNUSED)
6de9cd9a 300{
6de9cd9a 301 basic_block bb;
6de9cd9a 302
1e128c5f 303 gcc_assert (dfa_stats_p);
6de9cd9a
DN
304
305 memset ((void *)dfa_stats_p, 0, sizeof (struct dfa_stats_d));
306
726a989a 307 /* Walk all the statements in the function counting references. */
11cd3bed 308 FOR_EACH_BB_FN (bb, cfun)
6de9cd9a 309 {
538dd0b7
DM
310 for (gphi_iterator si = gsi_start_phis (bb); !gsi_end_p (si);
311 gsi_next (&si))
6de9cd9a 312 {
538dd0b7 313 gphi *phi = si.phi ();
6de9cd9a 314 dfa_stats_p->num_phis++;
726a989a
RB
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);
6de9cd9a 318 }
6de9cd9a 319
538dd0b7
DM
320 for (gimple_stmt_iterator si = gsi_start_bb (bb); !gsi_end_p (si);
321 gsi_next (&si))
6de9cd9a 322 {
726a989a
RB
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);
5006671f
RG
326 dfa_stats_p->num_vdefs += gimple_vdef (stmt) ? 1 : 0;
327 dfa_stats_p->num_vuses += gimple_vuse (stmt) ? 1 : 0;
6de9cd9a
DN
328 }
329 }
6de9cd9a
DN
330}
331
332
333/*---------------------------------------------------------------------------
334 Miscellaneous helpers
335---------------------------------------------------------------------------*/
a3648cfc 336
86051306
JH
337/* Lookup VAR UID in the default_defs hashtable and return the associated
338 variable. */
339
b8698a0f 340tree
32244553 341ssa_default_def (struct function *fn, tree var)
86051306 342{
e445a2ff
RG
343 struct tree_decl_minimal ind;
344 struct tree_ssa_name in;
32244553
RG
345 gcc_assert (TREE_CODE (var) == VAR_DECL
346 || TREE_CODE (var) == PARM_DECL
347 || TREE_CODE (var) == RESULT_DECL);
e445a2ff
RG
348 in.var = (tree)&ind;
349 ind.uid = DECL_UID (var);
2a22f99c 350 return DEFAULT_DEFS (fn)->find_with_hash ((tree)&in, DECL_UID (var));
86051306
JH
351}
352
32244553
RG
353/* Insert the pair VAR's UID, DEF into the default_defs hashtable
354 of function FN. */
86051306
JH
355
356void
32244553 357set_ssa_default_def (struct function *fn, tree var, tree def)
b8698a0f 358{
e445a2ff
RG
359 struct tree_decl_minimal ind;
360 struct tree_ssa_name in;
86051306 361
32244553
RG
362 gcc_assert (TREE_CODE (var) == VAR_DECL
363 || TREE_CODE (var) == PARM_DECL
364 || TREE_CODE (var) == RESULT_DECL);
e445a2ff
RG
365 in.var = (tree)&ind;
366 ind.uid = DECL_UID (var);
367 if (!def)
86051306 368 {
2a22f99c
TS
369 tree *loc = DEFAULT_DEFS (fn)->find_slot_with_hash ((tree)&in,
370 DECL_UID (var),
371 NO_INSERT);
2044a4c3 372 if (loc)
01c59d23
RG
373 {
374 SSA_NAME_IS_DEFAULT_DEF (*(tree *)loc) = false;
2a22f99c 375 DEFAULT_DEFS (fn)->clear_slot (loc);
01c59d23 376 }
86051306
JH
377 return;
378 }
e445a2ff 379 gcc_assert (TREE_CODE (def) == SSA_NAME && SSA_NAME_VAR (def) == var);
2a22f99c
TS
380 tree *loc = DEFAULT_DEFS (fn)->find_slot_with_hash ((tree)&in,
381 DECL_UID (var), INSERT);
38635499 382
86051306 383 /* Default definition might be changed by tail call optimization. */
e445a2ff 384 if (*loc)
2a22f99c 385 SSA_NAME_IS_DEFAULT_DEF (*loc) = false;
cfaab3a9
DN
386
387 /* Mark DEF as the default definition for VAR. */
2a22f99c 388 *loc = def;
01c59d23 389 SSA_NAME_IS_DEFAULT_DEF (def) = true;
86051306
JH
390}
391
32244553
RG
392/* Retrieve or create a default definition for VAR. */
393
394tree
395get_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 {
f3a1fb91
MJ
400 ddef = make_ssa_name_fn (fn, var, gimple_build_nop ());
401 set_ssa_default_def (fn, var, ddef);
32244553
RG
402 }
403 return ddef;
404}
405
6de9cd9a 406
cfaab3a9 407/* If EXP is a handled component reference for a structure, return the
6bec9271
RG
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. */
c75ab022
DB
412
413tree
6bec9271
RG
414get_ref_base_and_extent (tree exp, HOST_WIDE_INT *poffset,
415 HOST_WIDE_INT *psize,
416 HOST_WIDE_INT *pmax_size)
c75ab022 417{
807e902e
KZ
418 offset_int bitsize = -1;
419 offset_int maxsize;
6bec9271 420 tree size_tree = NULL_TREE;
807e902e 421 offset_int bit_offset = 0;
00e85045 422 bool seen_variable_array_ref = false;
6bec9271 423
6bec9271
RG
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);
55b34b5f 429 else if (!VOID_TYPE_P (TREE_TYPE (exp)))
c75ab022 430 {
ef4bddc2 431 machine_mode mode = TYPE_MODE (TREE_TYPE (exp));
6bec9271
RG
432 if (mode == BLKmode)
433 size_tree = TYPE_SIZE (TREE_TYPE (exp));
434 else
50b6ee8b 435 bitsize = int (GET_MODE_PRECISION (mode));
c75ab022 436 }
5b5d7f31
JJ
437 if (size_tree != NULL_TREE
438 && TREE_CODE (size_tree) == INTEGER_CST)
807e902e 439 bitsize = wi::to_offset (size_tree);
6bec9271
RG
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:
807e902e 452 bit_offset += wi::to_offset (TREE_OPERAND (exp, 2));
6bec9271
RG
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
ca8d9092 460 if (this_offset && TREE_CODE (this_offset) == INTEGER_CST)
6bec9271 461 {
807e902e
KZ
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;
79441eca
RG
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. */
807e902e 471 if (seen_variable_array_ref && maxsize != -1)
79441eca
RG
472 {
473 tree stype = TREE_TYPE (TREE_OPERAND (exp, 0));
910ad8de 474 tree next = DECL_CHAIN (field);
79441eca 475 while (next && TREE_CODE (next) != FIELD_DECL)
910ad8de 476 next = DECL_CHAIN (next);
79441eca
RG
477 if (!next
478 || TREE_CODE (stype) != RECORD_TYPE)
479 {
480 tree fsize = DECL_SIZE_UNIT (field);
481 tree ssize = TYPE_SIZE_UNIT (stype);
5b5d7f31
JJ
482 if (fsize == NULL
483 || TREE_CODE (fsize) != INTEGER_CST
484 || ssize == NULL
485 || TREE_CODE (ssize) != INTEGER_CST)
807e902e 486 maxsize = -1;
79441eca 487 else
5b5d7f31 488 {
807e902e
KZ
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;
5b5d7f31
JJ
493 maxsize += tem;
494 }
79441eca
RG
495 }
496 }
6bec9271
RG
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.
fa10beec 502 But we can subtract any constant offset seen so far,
6bec9271 503 because that would get us out of the structure otherwise. */
807e902e 504 if (maxsize != -1
ca8d9092 505 && csize
5b5d7f31 506 && TREE_CODE (csize) == INTEGER_CST)
807e902e 507 maxsize = wi::to_offset (csize) - bit_offset;
6bec9271 508 else
807e902e 509 maxsize = -1;
6bec9271
RG
510 }
511 }
512 break;
513
514 case ARRAY_REF:
515 case ARRAY_RANGE_REF:
516 {
517 tree index = TREE_OPERAND (exp, 1);
821bb7f8 518 tree low_bound, unit_size;
6bec9271 519
c21c775a 520 /* If the resulting bit-offset is constant, track it. */
821bb7f8 521 if (TREE_CODE (index) == INTEGER_CST
821bb7f8 522 && (low_bound = array_ref_low_bound (exp),
b48e22b2 523 TREE_CODE (low_bound) == INTEGER_CST)
821bb7f8 524 && (unit_size = array_ref_element_size (exp),
ca8d9092 525 TREE_CODE (unit_size) == INTEGER_CST))
6bec9271 526 {
807e902e
KZ
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;
00e85045
RG
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;
6bec9271
RG
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.
fa10beec 543 But we can subtract any constant offset seen so far,
6bec9271 544 because that would get us outside of the array otherwise. */
807e902e 545 if (maxsize != -1
ca8d9092 546 && asize
5b5d7f31 547 && TREE_CODE (asize) == INTEGER_CST)
807e902e 548 maxsize = wi::to_offset (asize) - bit_offset;
6bec9271 549 else
807e902e 550 maxsize = -1;
00e85045
RG
551
552 /* Remember that we have seen an array ref with a variable
553 index. */
554 seen_variable_array_ref = true;
6bec9271
RG
555 }
556 }
557 break;
558
559 case REALPART_EXPR:
560 break;
561
562 case IMAGPART_EXPR:
5b5d7f31 563 bit_offset += bitsize;
6bec9271
RG
564 break;
565
566 case VIEW_CONVERT_EXPR:
6bec9271
RG
567 break;
568
4f94d87c
RB
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);
807e902e
KZ
576 bit_offset = 0;
577 maxsize = -1;
4f94d87c
RB
578 goto done;
579 }
580 /* Fallthru. */
70f34814 581 case MEM_REF:
4f94d87c
RB
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
807e902e 593 && maxsize != -1
5b5d7f31
JJ
594 && (TYPE_SIZE (TREE_TYPE (exp)) == NULL_TREE
595 || TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) != INTEGER_CST
596 || (bit_offset + maxsize
807e902e
KZ
597 == wi::to_offset (TYPE_SIZE (TREE_TYPE (exp))))))
598 maxsize = -1;
4f94d87c 599
70f34814
RG
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);
4b228e61
RG
605 else
606 {
807e902e
KZ
607 offset_int off = mem_ref_offset (exp);
608 off = wi::lshift (off, LOG2_BITS_PER_UNIT);
27bcd47c 609 off += bit_offset;
807e902e 610 if (wi::fits_shwi_p (off))
4b228e61 611 {
ca8d9092 612 bit_offset = off;
4f94d87c 613 exp = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
4b228e61
RG
614 }
615 }
616 }
617 goto done;
618
6bec9271
RG
619 default:
620 goto done;
621 }
622
623 exp = TREE_OPERAND (exp, 0);
624 }
6bec9271 625
4f94d87c
RB
626 /* We need to deal with variable arrays ending structures. */
627 if (seen_variable_array_ref
807e902e 628 && maxsize != -1
5b5d7f31
JJ
629 && (TYPE_SIZE (TREE_TYPE (exp)) == NULL_TREE
630 || TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) != INTEGER_CST
631 || (bit_offset + maxsize
807e902e
KZ
632 == wi::to_offset (TYPE_SIZE (TREE_TYPE (exp))))))
633 maxsize = -1;
4f94d87c
RB
634
635 done:
807e902e 636 if (!wi::fits_shwi_p (bitsize) || wi::neg_p (bitsize))
ca8d9092
EB
637 {
638 *poffset = 0;
5b5d7f31 639 *psize = -1;
ca8d9092
EB
640 *pmax_size = -1;
641
642 return exp;
643 }
644
5b5d7f31
JJ
645 *psize = bitsize.to_shwi ();
646
807e902e 647 if (!wi::fits_shwi_p (bit_offset))
5b5d7f31
JJ
648 {
649 *poffset = 0;
650 *pmax_size = -1;
651
652 return exp;
653 }
ca8d9092 654
90ff582f 655 /* In case of a decl or constant base object we can do better. */
0230277c
RG
656
657 if (DECL_P (exp))
658 {
659 /* If maxsize is unknown adjust it according to the size of the
660 base decl. */
807e902e 661 if (maxsize == -1
5b5d7f31
JJ
662 && DECL_SIZE (exp)
663 && TREE_CODE (DECL_SIZE (exp)) == INTEGER_CST)
807e902e 664 maxsize = wi::to_offset (DECL_SIZE (exp)) - bit_offset;
0230277c 665 }
90ff582f
RG
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. */
807e902e 670 if (maxsize == -1
5b5d7f31
JJ
671 && TYPE_SIZE (TREE_TYPE (exp))
672 && TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) == INTEGER_CST)
807e902e
KZ
673 maxsize = (wi::to_offset (TYPE_SIZE (TREE_TYPE (exp)))
674 - bit_offset);
90ff582f 675 }
00e85045 676
6bec9271
RG
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. */
5b5d7f31 680 *poffset = bit_offset.to_shwi ();
807e902e 681 if (!wi::fits_shwi_p (maxsize) || wi::neg_p (maxsize))
5b5d7f31
JJ
682 *pmax_size = -1;
683 else
684 *pmax_size = maxsize.to_shwi ();
6bec9271
RG
685
686 return exp;
c75ab022 687}
e9e0aa2c 688
f2918c18
AM
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
696tree
697get_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 }
822done:
823
824 *poffset = byte_offset;
825 return exp;
826}
827
70f34814
RG
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
833tree
834get_addr_base_and_unit_offset (tree exp, HOST_WIDE_INT *poffset)
835{
cfef45c8 836 return get_addr_base_and_unit_offset_1 (exp, poffset, NULL);
70f34814
RG
837}
838
2e58df6e
RG
839/* Returns true if STMT references an SSA_NAME that has
840 SSA_NAME_OCCURS_IN_ABNORMAL_PHI set, otherwise false. */
841
842bool
726a989a 843stmt_references_abnormal_ssa_name (gimple stmt)
2e58df6e
RG
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}
7ee2468b
SB
856
857/* Pair of tree and a sorting index, for dump_enumerated_decls. */
858struct GTY(()) numbered_tree_d
859{
860 tree t;
861 int num;
862};
863typedef struct numbered_tree_d numbered_tree;
864
7ee2468b
SB
865
866/* Compare two declarations references by their DECL_UID / sequence number.
867 Called via qsort. */
868
869static int
870compare_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. */
881static tree
882dump_enumerated_decls_push (tree *tp, int *walk_subtrees, void *data)
883{
884 struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
9771b263 885 vec<numbered_tree> *list = (vec<numbered_tree> *) wi->info;
7ee2468b
SB
886 numbered_tree nt;
887
888 if (!DECL_P (*tp))
889 return NULL_TREE;
890 nt.t = *tp;
9771b263
DN
891 nt.num = list->length ();
892 list->safe_push (nt);
7ee2468b
SB
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. */
905void
906dump_enumerated_decls (FILE *file, int flags)
907{
908 basic_block bb;
909 struct walk_stmt_info wi;
00f96dc9 910 auto_vec<numbered_tree, 40> decl_list;
7ee2468b
SB
911
912 memset (&wi, '\0', sizeof (wi));
9771b263 913 wi.info = (void *) &decl_list;
11cd3bed 914 FOR_EACH_BB_FN (bb, cfun)
7ee2468b
SB
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 }
9771b263
DN
922 decl_list.qsort (compare_decls_by_uid);
923 if (decl_list.length ())
7ee2468b
SB
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 ());
9771b263 931 FOR_EACH_VEC_ELT (decl_list, ix, ntp)
7ee2468b
SB
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 }
7ee2468b 941}