Branch data Line data Source code
1 : : /* Data flow functions for trees.
2 : : Copyright (C) 2001-2025 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 "backend.h"
25 : : #include "rtl.h"
26 : : #include "tree.h"
27 : : #include "gimple.h"
28 : : #include "tree-pass.h"
29 : : #include "ssa.h"
30 : : #include "tree-pretty-print.h"
31 : : #include "fold-const.h"
32 : : #include "stor-layout.h"
33 : : #include "langhooks.h"
34 : : #include "gimple-iterator.h"
35 : : #include "gimple-walk.h"
36 : : #include "tree-dfa.h"
37 : : #include "gimple-range.h"
38 : :
39 : : /* Build and maintain data flow information for trees. */
40 : :
41 : : /* Counters used to display DFA and SSA statistics. */
42 : : struct dfa_stats_d
43 : : {
44 : : long num_defs;
45 : : long num_uses;
46 : : long num_phis;
47 : : long num_phi_args;
48 : : size_t max_num_phi_args;
49 : : long num_vdefs;
50 : : long num_vuses;
51 : : };
52 : :
53 : :
54 : : /* Local functions. */
55 : : static void collect_dfa_stats (struct dfa_stats_d *);
56 : :
57 : :
58 : : /*---------------------------------------------------------------------------
59 : : Dataflow analysis (DFA) routines
60 : : ---------------------------------------------------------------------------*/
61 : :
62 : : /* Renumber the gimple stmt uids in one block. The caller is responsible
63 : : of calling set_gimple_stmt_max_uid (fun, 0) at some point. */
64 : :
65 : : void
66 : 69801681 : renumber_gimple_stmt_uids_in_block (struct function *fun, basic_block bb)
67 : : {
68 : 69801681 : gimple_stmt_iterator bsi;
69 : 95876421 : for (bsi = gsi_start_phis (bb); !gsi_end_p (bsi); gsi_next (&bsi))
70 : : {
71 : 26074740 : gimple *stmt = gsi_stmt (bsi);
72 : 26074740 : gimple_set_uid (stmt, inc_gimple_stmt_max_uid (fun));
73 : : }
74 : 541589313 : for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
75 : : {
76 : 401985951 : gimple *stmt = gsi_stmt (bsi);
77 : 401985951 : gimple_set_uid (stmt, inc_gimple_stmt_max_uid (fun));
78 : : }
79 : 69801681 : }
80 : :
81 : : /* Renumber all of the gimple stmt uids. */
82 : :
83 : : void
84 : 6184647 : renumber_gimple_stmt_uids (struct function *fun)
85 : : {
86 : 6184647 : basic_block bb;
87 : :
88 : 6184647 : set_gimple_stmt_max_uid (fun, 0);
89 : 71785326 : FOR_ALL_BB_FN (bb, fun)
90 : 65600679 : renumber_gimple_stmt_uids_in_block (fun, bb);
91 : 6184647 : }
92 : :
93 : : /* Like renumber_gimple_stmt_uids, but only do work on the basic blocks
94 : : in BLOCKS, of which there are N_BLOCKS. Also renumbers PHIs. */
95 : :
96 : : void
97 : 591826 : renumber_gimple_stmt_uids_in_blocks (basic_block *blocks, int n_blocks)
98 : : {
99 : 591826 : int i;
100 : :
101 : 591826 : set_gimple_stmt_max_uid (cfun, 0);
102 : 4476873 : for (i = 0; i < n_blocks; i++)
103 : 3885047 : renumber_gimple_stmt_uids_in_block (cfun, blocks[i]);
104 : 591826 : }
105 : :
106 : :
107 : :
108 : : /*---------------------------------------------------------------------------
109 : : Debugging functions
110 : : ---------------------------------------------------------------------------*/
111 : :
112 : : /* Dump variable VAR and its may-aliases to FILE. */
113 : :
114 : : void
115 : 326 : dump_variable (FILE *file, tree var)
116 : : {
117 : 326 : if (TREE_CODE (var) == SSA_NAME)
118 : : {
119 : 0 : if (POINTER_TYPE_P (TREE_TYPE (var)))
120 : 0 : dump_points_to_info_for (file, var);
121 : 0 : var = SSA_NAME_VAR (var);
122 : : }
123 : :
124 : : if (var == NULL_TREE)
125 : : {
126 : 0 : fprintf (file, "<nil>");
127 : 0 : return;
128 : : }
129 : :
130 : 326 : print_generic_expr (file, var, dump_flags);
131 : :
132 : 326 : fprintf (file, ", UID D.%u", (unsigned) DECL_UID (var));
133 : 326 : if (DECL_PT_UID (var) != DECL_UID (var))
134 : 0 : fprintf (file, ", PT-UID D.%u", (unsigned) DECL_PT_UID (var));
135 : :
136 : 326 : fprintf (file, ", ");
137 : 326 : print_generic_expr (file, TREE_TYPE (var), dump_flags);
138 : :
139 : 326 : if (TREE_ADDRESSABLE (var))
140 : 326 : fprintf (file, ", is addressable");
141 : :
142 : 326 : if (is_global_var (var))
143 : 63 : fprintf (file, ", is global");
144 : :
145 : 326 : if (TREE_THIS_VOLATILE (var))
146 : 0 : fprintf (file, ", is volatile");
147 : :
148 : 326 : if (cfun && ssa_default_def (cfun, var))
149 : : {
150 : 0 : fprintf (file, ", default def: ");
151 : 0 : print_generic_expr (file, ssa_default_def (cfun, var), dump_flags);
152 : : }
153 : :
154 : 326 : if (DECL_INITIAL (var))
155 : : {
156 : 63 : fprintf (file, ", initial: ");
157 : 63 : print_generic_expr (file, DECL_INITIAL (var), dump_flags);
158 : : }
159 : :
160 : 326 : fprintf (file, "\n");
161 : : }
162 : :
163 : :
164 : : /* Dump variable VAR and its may-aliases to stderr. */
165 : :
166 : : DEBUG_FUNCTION void
167 : 0 : debug_variable (tree var)
168 : : {
169 : 0 : dump_variable (stderr, var);
170 : 0 : }
171 : :
172 : :
173 : : /* Dump various DFA statistics to FILE. */
174 : :
175 : : void
176 : 489 : dump_dfa_stats (FILE *file)
177 : : {
178 : 489 : struct dfa_stats_d dfa_stats;
179 : :
180 : 489 : unsigned long size, total = 0;
181 : 489 : const char * const fmt_str = "%-30s%-13s%12s\n";
182 : 489 : const char * const fmt_str_1 = "%-30s%13lu" PRsa (11) "\n";
183 : 489 : const char * const fmt_str_3 = "%-43s" PRsa (11) "\n";
184 : 489 : const char *funcname
185 : 489 : = lang_hooks.decl_printable_name (current_function_decl, 2);
186 : :
187 : 489 : collect_dfa_stats (&dfa_stats);
188 : :
189 : 489 : fprintf (file, "\nDFA Statistics for %s\n\n", funcname);
190 : :
191 : 489 : fprintf (file, "---------------------------------------------------------\n");
192 : 489 : fprintf (file, fmt_str, "", " Number of ", "Memory");
193 : 489 : fprintf (file, fmt_str, "", " instances ", "used ");
194 : 489 : fprintf (file, "---------------------------------------------------------\n");
195 : :
196 : 489 : size = dfa_stats.num_uses * sizeof (tree *);
197 : 489 : total += size;
198 : 489 : fprintf (file, fmt_str_1, "USE operands", dfa_stats.num_uses,
199 : 0 : SIZE_AMOUNT (size));
200 : :
201 : 489 : size = dfa_stats.num_defs * sizeof (tree *);
202 : 489 : total += size;
203 : 489 : fprintf (file, fmt_str_1, "DEF operands", dfa_stats.num_defs,
204 : 0 : SIZE_AMOUNT (size));
205 : :
206 : 489 : size = dfa_stats.num_vuses * sizeof (tree *);
207 : 489 : total += size;
208 : 489 : fprintf (file, fmt_str_1, "VUSE operands", dfa_stats.num_vuses,
209 : 0 : SIZE_AMOUNT (size));
210 : :
211 : 489 : size = dfa_stats.num_vdefs * sizeof (tree *);
212 : 489 : total += size;
213 : 489 : fprintf (file, fmt_str_1, "VDEF operands", dfa_stats.num_vdefs,
214 : 0 : SIZE_AMOUNT (size));
215 : :
216 : 489 : size = dfa_stats.num_phis * sizeof (struct gphi);
217 : 489 : total += size;
218 : 489 : fprintf (file, fmt_str_1, "PHI nodes", dfa_stats.num_phis,
219 : 0 : SIZE_AMOUNT (size));
220 : :
221 : 489 : size = dfa_stats.num_phi_args * sizeof (struct phi_arg_d);
222 : 489 : total += size;
223 : 489 : fprintf (file, fmt_str_1, "PHI arguments", dfa_stats.num_phi_args,
224 : 0 : SIZE_AMOUNT (size));
225 : :
226 : 489 : fprintf (file, "---------------------------------------------------------\n");
227 : 504 : fprintf (file, fmt_str_3, "Total memory used by DFA/SSA data",
228 : 30 : SIZE_AMOUNT (total));
229 : 489 : fprintf (file, "---------------------------------------------------------\n");
230 : 489 : fprintf (file, "\n");
231 : :
232 : 489 : if (dfa_stats.num_phis)
233 : 482 : fprintf (file, "Average number of arguments per PHI node: %.1f (max: "
234 : : HOST_SIZE_T_PRINT_DEC ")\n",
235 : 482 : (float) dfa_stats.num_phi_args / (float) dfa_stats.num_phis,
236 : 482 : (fmt_size_t) dfa_stats.max_num_phi_args);
237 : :
238 : 489 : fprintf (file, "\n");
239 : 489 : }
240 : :
241 : :
242 : : /* Dump DFA statistics on stderr. */
243 : :
244 : : DEBUG_FUNCTION void
245 : 0 : debug_dfa_stats (void)
246 : : {
247 : 0 : dump_dfa_stats (stderr);
248 : 0 : }
249 : :
250 : :
251 : : /* Collect DFA statistics and store them in the structure pointed to by
252 : : DFA_STATS_P. */
253 : :
254 : : static void
255 : 489 : collect_dfa_stats (struct dfa_stats_d *dfa_stats_p ATTRIBUTE_UNUSED)
256 : : {
257 : 489 : basic_block bb;
258 : :
259 : 489 : gcc_assert (dfa_stats_p);
260 : :
261 : 489 : memset ((void *)dfa_stats_p, 0, sizeof (struct dfa_stats_d));
262 : :
263 : : /* Walk all the statements in the function counting references. */
264 : 8512 : FOR_EACH_BB_FN (bb, cfun)
265 : : {
266 : 13281 : for (gphi_iterator si = gsi_start_phis (bb); !gsi_end_p (si);
267 : 5258 : gsi_next (&si))
268 : : {
269 : 5258 : gphi *phi = si.phi ();
270 : 5258 : dfa_stats_p->num_phis++;
271 : 5258 : dfa_stats_p->num_phi_args += gimple_phi_num_args (phi);
272 : 5258 : if (gimple_phi_num_args (phi) > dfa_stats_p->max_num_phi_args)
273 : 673 : dfa_stats_p->max_num_phi_args = gimple_phi_num_args (phi);
274 : : }
275 : :
276 : 30482 : for (gimple_stmt_iterator si = gsi_start_bb (bb); !gsi_end_p (si);
277 : 14436 : gsi_next (&si))
278 : : {
279 : 14436 : gimple *stmt = gsi_stmt (si);
280 : 14436 : dfa_stats_p->num_defs += NUM_SSA_OPERANDS (stmt, SSA_OP_DEF);
281 : 14436 : dfa_stats_p->num_uses += NUM_SSA_OPERANDS (stmt, SSA_OP_USE);
282 : 26907 : dfa_stats_p->num_vdefs += gimple_vdef (stmt) ? 1 : 0;
283 : 26907 : dfa_stats_p->num_vuses += gimple_vuse (stmt) ? 1 : 0;
284 : : }
285 : : }
286 : 489 : }
287 : :
288 : :
289 : : /*---------------------------------------------------------------------------
290 : : Miscellaneous helpers
291 : : ---------------------------------------------------------------------------*/
292 : :
293 : : /* Lookup VAR UID in the default_defs hashtable and return the associated
294 : : variable. */
295 : :
296 : : tree
297 : 525039848 : ssa_default_def (struct function *fn, tree var)
298 : : {
299 : 525039848 : struct tree_decl_minimal ind;
300 : 525039848 : struct tree_ssa_name in;
301 : 525039848 : gcc_assert (VAR_P (var)
302 : : || TREE_CODE (var) == PARM_DECL
303 : : || TREE_CODE (var) == RESULT_DECL);
304 : :
305 : : /* Always NULL_TREE for rtl function dumps. */
306 : 525039848 : if (!fn->gimple_df)
307 : : return NULL_TREE;
308 : :
309 : 525039848 : in.var = (tree)&ind;
310 : 525039848 : ind.uid = DECL_UID (var);
311 : 525039848 : return DEFAULT_DEFS (fn)->find_with_hash ((tree)&in, DECL_UID (var));
312 : : }
313 : :
314 : : /* Insert the pair VAR's UID, DEF into the default_defs hashtable
315 : : of function FN. */
316 : :
317 : : void
318 : 11804972 : set_ssa_default_def (struct function *fn, tree var, tree def)
319 : : {
320 : 11804972 : struct tree_decl_minimal ind;
321 : 11804972 : struct tree_ssa_name in;
322 : :
323 : 11804972 : gcc_assert (VAR_P (var)
324 : : || TREE_CODE (var) == PARM_DECL
325 : : || TREE_CODE (var) == RESULT_DECL);
326 : 11804972 : in.var = (tree)&ind;
327 : 11804972 : ind.uid = DECL_UID (var);
328 : 11804972 : if (!def)
329 : : {
330 : 1243849 : tree *loc = DEFAULT_DEFS (fn)->find_slot_with_hash ((tree)&in,
331 : 1243849 : DECL_UID (var),
332 : : NO_INSERT);
333 : 1243849 : if (loc)
334 : : {
335 : 1243841 : SSA_NAME_IS_DEFAULT_DEF (*(tree *)loc) = false;
336 : 1243841 : DEFAULT_DEFS (fn)->clear_slot (loc);
337 : : }
338 : 1243849 : return;
339 : : }
340 : 10561123 : gcc_assert (TREE_CODE (def) == SSA_NAME && SSA_NAME_VAR (def) == var);
341 : 10561123 : tree *loc = DEFAULT_DEFS (fn)->find_slot_with_hash ((tree)&in,
342 : 10561123 : DECL_UID (var), INSERT);
343 : :
344 : : /* Default definition might be changed by tail call optimization. */
345 : 10561123 : if (*loc)
346 : 1036 : SSA_NAME_IS_DEFAULT_DEF (*loc) = false;
347 : :
348 : : /* Mark DEF as the default definition for VAR. */
349 : 10561123 : *loc = def;
350 : 10561123 : SSA_NAME_IS_DEFAULT_DEF (def) = true;
351 : : }
352 : :
353 : : /* Retrieve or create a default definition for VAR. */
354 : :
355 : : tree
356 : 25476103 : get_or_create_ssa_default_def (struct function *fn, tree var)
357 : : {
358 : 25476103 : tree ddef = ssa_default_def (fn, var);
359 : 25476103 : if (ddef == NULL_TREE)
360 : : {
361 : 10031637 : ddef = make_ssa_name_fn (fn, var, gimple_build_nop ());
362 : 10031637 : set_ssa_default_def (fn, var, ddef);
363 : : }
364 : 25476103 : return ddef;
365 : : }
366 : :
367 : :
368 : : /* If EXP is a handled component reference for a structure, return the
369 : : base variable. The access range is delimited by bit positions *POFFSET and
370 : : *POFFSET + *PMAX_SIZE. The access size is *PSIZE bits. If either
371 : : *PSIZE or *PMAX_SIZE is -1, they could not be determined. If *PSIZE
372 : : and *PMAX_SIZE are equal, the access is non-variable. If *PREVERSE is
373 : : true, the storage order of the reference is reversed. */
374 : :
375 : : tree
376 : 2807619400 : get_ref_base_and_extent (tree exp, poly_int64 *poffset,
377 : : poly_int64 *psize,
378 : : poly_int64 *pmax_size,
379 : : bool *preverse)
380 : : {
381 : 2807619400 : poly_offset_int bitsize = -1;
382 : 2807619400 : poly_offset_int maxsize;
383 : 2807619400 : tree size_tree = NULL_TREE;
384 : 2807619400 : poly_offset_int bit_offset = 0;
385 : 2807619400 : bool seen_variable_array_ref = false;
386 : :
387 : : /* First get the final access size and the storage order from just the
388 : : outermost expression. */
389 : 2807619400 : if (TREE_CODE (exp) == COMPONENT_REF)
390 : 1523230208 : size_tree = DECL_SIZE (TREE_OPERAND (exp, 1));
391 : 1284389192 : else if (TREE_CODE (exp) == BIT_FIELD_REF)
392 : 7405616 : size_tree = TREE_OPERAND (exp, 1);
393 : 1276983576 : else if (TREE_CODE (exp) == WITH_SIZE_EXPR)
394 : : {
395 : 174 : size_tree = TREE_OPERAND (exp, 1);
396 : 174 : exp = TREE_OPERAND (exp, 0);
397 : : }
398 : 1276983402 : else if (!VOID_TYPE_P (TREE_TYPE (exp)))
399 : : {
400 : 1240019937 : machine_mode mode = TYPE_MODE (TREE_TYPE (exp));
401 : 1240019937 : if (mode == BLKmode)
402 : 358599455 : size_tree = TYPE_SIZE (TREE_TYPE (exp));
403 : : else
404 : 1762840964 : bitsize = GET_MODE_BITSIZE (mode);
405 : : }
406 : 881420482 : if (size_tree != NULL_TREE
407 : 1889235453 : && poly_int_tree_p (size_tree))
408 : 1888629733 : bitsize = wi::to_poly_offset (size_tree);
409 : :
410 : 2807619400 : *preverse = reverse_storage_order_for_component_p (exp);
411 : :
412 : : /* Initially, maxsize is the same as the accessed element size.
413 : : In the following it will only grow (or become -1). */
414 : 2807619400 : maxsize = bitsize;
415 : :
416 : : /* Compute cumulative bit-offset for nested component-refs and array-refs,
417 : : and find the ultimate containing object. */
418 : 8935520856 : while (1)
419 : : {
420 : 5871570128 : switch (TREE_CODE (exp))
421 : : {
422 : 7405616 : case BIT_FIELD_REF:
423 : 7405616 : bit_offset += wi::to_poly_offset (TREE_OPERAND (exp, 2));
424 : 7405616 : break;
425 : :
426 : 2294987796 : case COMPONENT_REF:
427 : 2294987796 : {
428 : 2294987796 : tree field = TREE_OPERAND (exp, 1);
429 : 2294987796 : tree this_offset = component_ref_field_offset (exp);
430 : :
431 : 2294987796 : if (this_offset && poly_int_tree_p (this_offset))
432 : : {
433 : 2294984790 : poly_offset_int woffset = (wi::to_poly_offset (this_offset)
434 : 2294984790 : << LOG2_BITS_PER_UNIT);
435 : 2294984790 : woffset += wi::to_offset (DECL_FIELD_BIT_OFFSET (field));
436 : 2294984790 : bit_offset += woffset;
437 : :
438 : : /* If we had seen a variable array ref already and we just
439 : : referenced the last field of a struct or a union member
440 : : then we have to adjust maxsize by the padding at the end
441 : : of our field. */
442 : 2294984790 : if (seen_variable_array_ref)
443 : : {
444 : 19617325 : tree stype = TREE_TYPE (TREE_OPERAND (exp, 0));
445 : 19617325 : tree next = DECL_CHAIN (field);
446 : 34214039 : while (next && TREE_CODE (next) != FIELD_DECL)
447 : 14596714 : next = DECL_CHAIN (next);
448 : 19617325 : if (!next
449 : 3189833 : || TREE_CODE (stype) != RECORD_TYPE)
450 : : {
451 : 17129249 : tree fsize = DECL_SIZE (field);
452 : 17129249 : tree ssize = TYPE_SIZE (stype);
453 : 17129249 : if (fsize == NULL
454 : 10833246 : || !poly_int_tree_p (fsize)
455 : 10831773 : || ssize == NULL
456 : 27961022 : || !poly_int_tree_p (ssize))
457 : 6297476 : maxsize = -1;
458 : 10831773 : else if (known_size_p (maxsize))
459 : : {
460 : 10831631 : poly_offset_int tem
461 : 10831631 : = (wi::to_poly_offset (ssize)
462 : 10831631 : - wi::to_poly_offset (fsize));
463 : 21663262 : tem -= woffset;
464 : 10831631 : maxsize += tem;
465 : : }
466 : : }
467 : : /* An component ref with an adjacent field up in the
468 : : structure hierarchy constrains the size of any variable
469 : : array ref lower in the access hierarchy. */
470 : : else
471 : : seen_variable_array_ref = false;
472 : : }
473 : : }
474 : : else
475 : : {
476 : 3006 : tree csize = TYPE_SIZE (TREE_TYPE (TREE_OPERAND (exp, 0)));
477 : : /* We need to adjust maxsize to the whole structure bitsize.
478 : : But we can subtract any constant offset seen so far,
479 : : because that would get us out of the structure otherwise. */
480 : 3006 : if (known_size_p (maxsize)
481 : 2018 : && csize
482 : 5024 : && poly_int_tree_p (csize))
483 : 0 : maxsize = wi::to_poly_offset (csize) - bit_offset;
484 : : else
485 : 3006 : maxsize = -1;
486 : : }
487 : : }
488 : : break;
489 : :
490 : 744640623 : case ARRAY_REF:
491 : 744640623 : case ARRAY_RANGE_REF:
492 : 744640623 : {
493 : 744640623 : tree index = TREE_OPERAND (exp, 1);
494 : 744640623 : tree low_bound, unit_size;
495 : :
496 : : /* If the resulting bit-offset is constant, track it. */
497 : 744640623 : if (poly_int_tree_p (index)
498 : 650061382 : && (low_bound = array_ref_low_bound (exp),
499 : 650061382 : poly_int_tree_p (low_bound))
500 : 1394702005 : && (unit_size = array_ref_element_size (exp),
501 : 650061382 : TREE_CODE (unit_size) == INTEGER_CST))
502 : : {
503 : 649974366 : poly_offset_int woffset
504 : 649974366 : = wi::sext (wi::to_poly_offset (index)
505 : 1299948732 : - wi::to_poly_offset (low_bound),
506 : 649974366 : TYPE_PRECISION (sizetype));
507 : 649974366 : woffset *= wi::to_offset (unit_size);
508 : 649974366 : woffset <<= LOG2_BITS_PER_UNIT;
509 : 649974366 : bit_offset += woffset;
510 : :
511 : : /* An array ref with a constant index up in the structure
512 : : hierarchy will constrain the size of any variable array ref
513 : : lower in the access hierarchy. */
514 : 649974366 : seen_variable_array_ref = false;
515 : : }
516 : : else
517 : : {
518 : 94666257 : tree asize = TYPE_SIZE (TREE_TYPE (TREE_OPERAND (exp, 0)));
519 : : /* We need to adjust maxsize to the whole array bitsize.
520 : : But we can subtract any constant offset seen so far,
521 : : because that would get us outside of the array otherwise. */
522 : 94666257 : if (known_size_p (maxsize)
523 : 94422945 : && asize
524 : 167708017 : && poly_int_tree_p (asize))
525 : 71117366 : maxsize = wi::to_poly_offset (asize) - bit_offset;
526 : : else
527 : 23548891 : maxsize = -1;
528 : :
529 : : /* Remember that we have seen an array ref with a variable
530 : : index. */
531 : 94666257 : seen_variable_array_ref = true;
532 : :
533 : 94666257 : int_range_max vr;
534 : 94666257 : range_query *query;
535 : 94666257 : query = get_range_query (cfun);
536 : :
537 : 94666257 : if (TREE_CODE (index) == SSA_NAME
538 : 94135031 : && (low_bound = array_ref_low_bound (exp),
539 : 94135031 : poly_int_tree_p (low_bound))
540 : 94135031 : && (unit_size = array_ref_element_size (exp),
541 : 94135031 : TREE_CODE (unit_size) == INTEGER_CST)
542 : 93912833 : && query->range_of_expr (vr, index)
543 : 93912833 : && !vr.varying_p ()
544 : 149019680 : && !vr.undefined_p ())
545 : : {
546 : 54348658 : wide_int min = vr.lower_bound ();
547 : 54348658 : wide_int max = vr.upper_bound ();
548 : 54348658 : poly_offset_int lbound = wi::to_poly_offset (low_bound);
549 : : /* Try to constrain maxsize with range information. */
550 : 54348658 : offset_int omax
551 : 54348658 : = offset_int::from (max, TYPE_SIGN (TREE_TYPE (index)));
552 : 54348658 : if (wi::get_precision (max) <= ADDR_MAX_BITSIZE
553 : 108548799 : && known_lt (lbound, omax))
554 : : {
555 : 54177379 : poly_offset_int rmaxsize;
556 : 108354758 : rmaxsize = (omax - lbound + 1)
557 : 108354758 : * wi::to_offset (unit_size) << LOG2_BITS_PER_UNIT;
558 : 54177379 : if (!known_size_p (maxsize)
559 : 93916709 : || known_lt (rmaxsize, maxsize))
560 : : {
561 : : /* If we know an upper bound below the declared
562 : : one this is no longer variable. */
563 : 21483940 : if (known_size_p (maxsize))
564 : : seen_variable_array_ref = false;
565 : 21483940 : maxsize = rmaxsize;
566 : : }
567 : : }
568 : : /* Try to adjust bit_offset with range information. */
569 : 54348658 : offset_int omin
570 : 54348658 : = offset_int::from (min, TYPE_SIGN (TREE_TYPE (index)));
571 : 54348658 : if (wi::get_precision (min) <= ADDR_MAX_BITSIZE
572 : 108548799 : && known_le (lbound, omin))
573 : : {
574 : 47759843 : poly_offset_int woffset
575 : 47759843 : = wi::sext (omin - lbound,
576 : 47759843 : TYPE_PRECISION (sizetype));
577 : 47759843 : woffset *= wi::to_offset (unit_size);
578 : 47759843 : woffset <<= LOG2_BITS_PER_UNIT;
579 : 47759843 : bit_offset += woffset;
580 : 47759843 : if (known_size_p (maxsize))
581 : 47759843 : maxsize -= woffset;
582 : : }
583 : 54348658 : }
584 : 94666257 : }
585 : : }
586 : : break;
587 : :
588 : : case REALPART_EXPR:
589 : : break;
590 : :
591 : : case IMAGPART_EXPR:
592 : 3063950728 : bit_offset += bitsize;
593 : : break;
594 : :
595 : : case VIEW_CONVERT_EXPR:
596 : : break;
597 : :
598 : 46326220 : case TARGET_MEM_REF:
599 : : /* Via the variable index or index2 we can reach the
600 : : whole object. Still hand back the decl here. */
601 : 46326220 : if (TREE_CODE (TMR_BASE (exp)) == ADDR_EXPR
602 : 46326220 : && (TMR_INDEX (exp) || TMR_INDEX2 (exp)))
603 : : {
604 : 7421701 : exp = TREE_OPERAND (TMR_BASE (exp), 0);
605 : 7421701 : bit_offset = 0;
606 : 7421701 : maxsize = -1;
607 : 7421701 : goto done;
608 : : }
609 : : /* Fallthru. */
610 : 937778263 : case MEM_REF:
611 : : /* We need to deal with variable arrays ending structures such as
612 : : struct { int length; int a[1]; } x; x.a[d]
613 : : struct { struct { int a; int b; } a[1]; } x; x.a[d].a
614 : : struct { struct { int a[1]; } a[1]; } x; x.a[0][d], x.a[d][0]
615 : : struct { int len; union { int a[1]; struct X x; } u; } x; x.u.a[d]
616 : : where we do not know maxsize for variable index accesses to
617 : : the array. The simplest way to conservatively deal with this
618 : : is to punt in the case that offset + maxsize reaches the
619 : : base type boundary. This needs to include possible trailing
620 : : padding that is there for alignment purposes. */
621 : 937778263 : if (seen_variable_array_ref
622 : 32253517 : && known_size_p (maxsize)
623 : 957658793 : && (TYPE_SIZE (TREE_TYPE (exp)) == NULL_TREE
624 : 10557772 : || !poly_int_tree_p (TYPE_SIZE (TREE_TYPE (exp)))
625 : 9398463 : || (maybe_eq
626 : 9398463 : (bit_offset + maxsize,
627 : 927296196 : wi::to_poly_offset (TYPE_SIZE (TREE_TYPE (exp)))))))
628 : 19880530 : maxsize = -1;
629 : :
630 : : /* Hand back the decl for MEM[&decl, off]. */
631 : 937778263 : if (TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR)
632 : : {
633 : 321273233 : if (integer_zerop (TREE_OPERAND (exp, 1)))
634 : 154727693 : exp = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
635 : : else
636 : : {
637 : 166545540 : poly_offset_int off = mem_ref_offset (exp);
638 : 166545540 : off <<= LOG2_BITS_PER_UNIT;
639 : 166545540 : off += bit_offset;
640 : 166545540 : poly_int64 off_hwi;
641 : 166545540 : if (off.to_shwi (&off_hwi))
642 : : {
643 : 166543934 : bit_offset = off_hwi;
644 : 166543934 : exp = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
645 : : }
646 : : }
647 : : }
648 : 937778263 : goto done;
649 : :
650 : 1862419436 : default:
651 : 1862419436 : goto done;
652 : : }
653 : :
654 : 3063950728 : exp = TREE_OPERAND (exp, 0);
655 : 3063950728 : }
656 : :
657 : 2807619400 : done:
658 : 2807619400 : if (!bitsize.to_shwi (psize) || maybe_lt (*psize, 0))
659 : : {
660 : 37569208 : *poffset = 0;
661 : 37569208 : *psize = -1;
662 : 37569208 : *pmax_size = -1;
663 : :
664 : 37569208 : return exp;
665 : : }
666 : :
667 : : /* ??? Due to negative offsets in ARRAY_REF we can end up with
668 : : negative bit_offset here. We might want to store a zero offset
669 : : in this case. */
670 : 2770050192 : if (!bit_offset.to_shwi (poffset))
671 : : {
672 : 7038 : *poffset = 0;
673 : 7038 : *pmax_size = -1;
674 : :
675 : 7038 : return exp;
676 : : }
677 : :
678 : : /* In case of a decl or constant base object we can do better. */
679 : :
680 : 2770043154 : if (DECL_P (exp))
681 : : {
682 : 2127689896 : if (VAR_P (exp)
683 : 2127689896 : && ((flag_unconstrained_commons && DECL_COMMON (exp))
684 : 2073243494 : || (DECL_EXTERNAL (exp) && seen_variable_array_ref)))
685 : : {
686 : 506276 : tree sz_tree = TYPE_SIZE (TREE_TYPE (exp));
687 : : /* If size is unknown, or we have read to the end, assume there
688 : : may be more to the structure than we are told. */
689 : 506276 : if (TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE
690 : 506276 : || (seen_variable_array_ref
691 : 35435 : && (sz_tree == NULL_TREE
692 : 35435 : || !poly_int_tree_p (sz_tree)
693 : 35435 : || maybe_eq (bit_offset + maxsize,
694 : 36117 : wi::to_poly_offset (sz_tree)))))
695 : 505594 : maxsize = -1;
696 : : }
697 : : /* If maxsize is unknown adjust it according to the size of the
698 : : base decl. */
699 : 2127183620 : else if (!known_size_p (maxsize)
700 : 15430158 : && DECL_SIZE (exp)
701 : 2142609540 : && poly_int_tree_p (DECL_SIZE (exp)))
702 : 15425858 : maxsize = wi::to_poly_offset (DECL_SIZE (exp)) - bit_offset;
703 : : }
704 : 642353258 : else if (CONSTANT_CLASS_P (exp))
705 : : {
706 : : /* If maxsize is unknown adjust it according to the size of the
707 : : base type constant. */
708 : 6938402 : if (!known_size_p (maxsize)
709 : 27854 : && TYPE_SIZE (TREE_TYPE (exp))
710 : 6966256 : && poly_int_tree_p (TYPE_SIZE (TREE_TYPE (exp))))
711 : 27854 : maxsize = (wi::to_poly_offset (TYPE_SIZE (TREE_TYPE (exp)))
712 : 27854 : - bit_offset);
713 : : }
714 : :
715 : 2770043154 : if (!maxsize.to_shwi (pmax_size)
716 : 2770043154 : || maybe_lt (*pmax_size, 0)
717 : 5515383397 : || !endpoint_representable_p (*poffset, *pmax_size))
718 : 24702967 : *pmax_size = -1;
719 : :
720 : : /* Punt if *POFFSET + *PSIZE overflows in HOST_WIDE_INT, the callers don't
721 : : check for such overflows individually and assume it works. */
722 : 5540086308 : if (!endpoint_representable_p (*poffset, *psize))
723 : : {
724 : 56 : *poffset = 0;
725 : 56 : *psize = -1;
726 : 56 : *pmax_size = -1;
727 : :
728 : 56 : return exp;
729 : : }
730 : :
731 : : return exp;
732 : : }
733 : :
734 : : /* Like get_ref_base_and_extent, but for cases in which we only care
735 : : about constant-width accesses at constant offsets. Return null
736 : : if the access is anything else. */
737 : :
738 : : tree
739 : 45004014 : get_ref_base_and_extent_hwi (tree exp, HOST_WIDE_INT *poffset,
740 : : HOST_WIDE_INT *psize, bool *preverse)
741 : : {
742 : 45004014 : poly_int64 offset, size, max_size;
743 : 45004014 : HOST_WIDE_INT const_offset, const_size;
744 : 45004014 : bool reverse;
745 : 45004014 : tree decl = get_ref_base_and_extent (exp, &offset, &size, &max_size,
746 : : &reverse);
747 : 45004014 : if (!offset.is_constant (&const_offset)
748 : 45004014 : || !size.is_constant (&const_size)
749 : 45004014 : || const_offset < 0
750 : 45003258 : || !known_size_p (max_size)
751 : 44529269 : || maybe_ne (max_size, const_size))
752 : : return NULL_TREE;
753 : :
754 : 43635421 : *poffset = const_offset;
755 : 43635421 : *psize = const_size;
756 : 43635421 : *preverse = reverse;
757 : 43635421 : return decl;
758 : : }
759 : :
760 : : /* Returns the base object and a constant BITS_PER_UNIT offset in *POFFSET that
761 : : denotes the starting address of the memory access EXP.
762 : : Returns NULL_TREE if the offset is not constant or any component
763 : : is not BITS_PER_UNIT-aligned.
764 : : VALUEIZE if non-NULL is used to valueize SSA names. It should return
765 : : its argument or a constant if the argument is known to be constant. */
766 : :
767 : : tree
768 : 182826180 : get_addr_base_and_unit_offset_1 (tree exp, poly_int64 *poffset,
769 : : tree (*valueize) (tree))
770 : : {
771 : 182826180 : poly_int64 byte_offset = 0;
772 : :
773 : : /* Compute cumulative byte-offset for nested component-refs and array-refs,
774 : : and find the ultimate containing object. */
775 : 273408582 : while (1)
776 : : {
777 : 228117381 : switch (TREE_CODE (exp))
778 : : {
779 : 21960 : case BIT_FIELD_REF:
780 : 21960 : {
781 : 21960 : poly_int64 this_byte_offset;
782 : 21960 : poly_uint64 this_bit_offset;
783 : 21960 : if (!poly_int_tree_p (TREE_OPERAND (exp, 2), &this_bit_offset)
784 : 43920 : || !multiple_p (this_bit_offset, BITS_PER_UNIT,
785 : : &this_byte_offset))
786 : 0 : return NULL_TREE;
787 : 21960 : byte_offset += this_byte_offset;
788 : : }
789 : 21960 : break;
790 : :
791 : 41638276 : case COMPONENT_REF:
792 : 41638276 : {
793 : 41638276 : tree field = TREE_OPERAND (exp, 1);
794 : 41638276 : tree this_offset = component_ref_field_offset (exp);
795 : 41638276 : poly_int64 hthis_offset;
796 : :
797 : 41638276 : if (!this_offset
798 : 41638276 : || !poly_int_tree_p (this_offset, &hthis_offset)
799 : 83273650 : || (TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (field))
800 : : % BITS_PER_UNIT))
801 : 3604 : return NULL_TREE;
802 : :
803 : 41634672 : hthis_offset += (TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (field))
804 : 41634672 : / BITS_PER_UNIT);
805 : 41634672 : byte_offset += hthis_offset;
806 : : }
807 : 41634672 : break;
808 : :
809 : 6974664 : case ARRAY_REF:
810 : 6974664 : case ARRAY_RANGE_REF:
811 : 6974664 : {
812 : 6974664 : tree index = TREE_OPERAND (exp, 1);
813 : 6974664 : tree low_bound, unit_size;
814 : :
815 : 6974664 : if (valueize
816 : 1619636 : && TREE_CODE (index) == SSA_NAME)
817 : 999162 : index = (*valueize) (index);
818 : 6974664 : if (!poly_int_tree_p (index))
819 : 3628893 : return NULL_TREE;
820 : 3357216 : low_bound = array_ref_low_bound (exp);
821 : 3357216 : if (valueize
822 : 864830 : && TREE_CODE (low_bound) == SSA_NAME)
823 : 3547 : low_bound = (*valueize) (low_bound);
824 : 3357216 : if (!poly_int_tree_p (low_bound))
825 : : return NULL_TREE;
826 : 3357216 : unit_size = array_ref_element_size (exp);
827 : 3357216 : if (TREE_CODE (unit_size) != INTEGER_CST)
828 : : return NULL_TREE;
829 : :
830 : : /* If the resulting bit-offset is constant, track it. */
831 : 3345771 : poly_offset_int woffset
832 : 3345771 : = wi::sext (wi::to_poly_offset (index)
833 : 6691542 : - wi::to_poly_offset (low_bound),
834 : 3345771 : TYPE_PRECISION (sizetype));
835 : 3345771 : woffset *= wi::to_offset (unit_size);
836 : 3345771 : byte_offset += woffset.force_shwi ();
837 : : }
838 : 3345771 : break;
839 : :
840 : : case REALPART_EXPR:
841 : : break;
842 : :
843 : 21086 : case IMAGPART_EXPR:
844 : 21086 : byte_offset += TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (exp)));
845 : 21086 : break;
846 : :
847 : : case VIEW_CONVERT_EXPR:
848 : : break;
849 : :
850 : 21407370 : case MEM_REF:
851 : 21407370 : {
852 : 21407370 : tree base = TREE_OPERAND (exp, 0);
853 : 21407370 : if (valueize
854 : 7488298 : && TREE_CODE (base) == SSA_NAME)
855 : 7090313 : base = (*valueize) (base);
856 : :
857 : : /* Hand back the decl for MEM[&decl, off]. */
858 : 21407370 : if (TREE_CODE (base) == ADDR_EXPR)
859 : : {
860 : 8586469 : if (!integer_zerop (TREE_OPERAND (exp, 1)))
861 : : {
862 : 6311369 : poly_offset_int off = mem_ref_offset (exp);
863 : 6311369 : byte_offset += off.force_shwi ();
864 : : }
865 : 8586469 : exp = TREE_OPERAND (base, 0);
866 : : }
867 : 21407370 : goto done;
868 : : }
869 : :
870 : 615257 : case TARGET_MEM_REF:
871 : 615257 : {
872 : 615257 : tree base = TREE_OPERAND (exp, 0);
873 : 615257 : if (valueize
874 : 2033 : && TREE_CODE (base) == SSA_NAME)
875 : 1272 : base = (*valueize) (base);
876 : :
877 : : /* Hand back the decl for MEM[&decl, off]. */
878 : 615257 : if (TREE_CODE (base) == ADDR_EXPR)
879 : : {
880 : 7345 : if (TMR_INDEX (exp) || TMR_INDEX2 (exp))
881 : : return NULL_TREE;
882 : 0 : if (!integer_zerop (TMR_OFFSET (exp)))
883 : : {
884 : 0 : poly_offset_int off = mem_ref_offset (exp);
885 : 0 : byte_offset += off.force_shwi ();
886 : : }
887 : 0 : exp = TREE_OPERAND (base, 0);
888 : : }
889 : 607912 : goto done;
890 : : }
891 : :
892 : 157171056 : default:
893 : 157171056 : goto done;
894 : : }
895 : :
896 : 45291201 : exp = TREE_OPERAND (exp, 0);
897 : 45291201 : }
898 : 179186338 : done:
899 : :
900 : 179186338 : *poffset = byte_offset;
901 : 179186338 : return exp;
902 : : }
903 : :
904 : : /* Returns the base object and a constant BITS_PER_UNIT offset in *POFFSET that
905 : : denotes the starting address of the memory access EXP.
906 : : Returns NULL_TREE if the offset is not constant or any component
907 : : is not BITS_PER_UNIT-aligned. */
908 : :
909 : : tree
910 : 54745776 : get_addr_base_and_unit_offset (tree exp, poly_int64 *poffset)
911 : : {
912 : 54745776 : return get_addr_base_and_unit_offset_1 (exp, poffset, NULL);
913 : : }
914 : :
915 : : /* Returns true if STMT references an SSA_NAME that has
916 : : SSA_NAME_OCCURS_IN_ABNORMAL_PHI set, otherwise false. */
917 : :
918 : : bool
919 : 13941287 : stmt_references_abnormal_ssa_name (gimple *stmt)
920 : : {
921 : 13941287 : ssa_op_iter oi;
922 : 13941287 : use_operand_p use_p;
923 : :
924 : 31415001 : FOR_EACH_SSA_USE_OPERAND (use_p, stmt, oi, SSA_OP_USE)
925 : : {
926 : 17474350 : if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (USE_FROM_PTR (use_p)))
927 : : return true;
928 : : }
929 : :
930 : : return false;
931 : : }
932 : :
933 : : /* If STMT takes any abnormal PHI values as input, replace them with
934 : : local copies. */
935 : :
936 : : void
937 : 1797 : replace_abnormal_ssa_names (gimple *stmt)
938 : : {
939 : 1797 : ssa_op_iter oi;
940 : 1797 : use_operand_p use_p;
941 : :
942 : 3581 : FOR_EACH_SSA_USE_OPERAND (use_p, stmt, oi, SSA_OP_USE)
943 : : {
944 : 1784 : tree op = USE_FROM_PTR (use_p);
945 : 1784 : if (TREE_CODE (op) == SSA_NAME && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op))
946 : : {
947 : 20 : gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
948 : 20 : tree new_name = make_ssa_name (TREE_TYPE (op));
949 : 20 : gassign *assign = gimple_build_assign (new_name, op);
950 : 20 : gsi_insert_before (&gsi, assign, GSI_SAME_STMT);
951 : 20 : SET_USE (use_p, new_name);
952 : : }
953 : : }
954 : 1797 : }
955 : :
956 : : /* Pair of tree and a sorting index, for dump_enumerated_decls. */
957 : : struct GTY(()) numbered_tree
958 : : {
959 : : tree t;
960 : : int num;
961 : : };
962 : :
963 : :
964 : : /* Compare two declarations references by their DECL_UID / sequence number.
965 : : Called via qsort. */
966 : :
967 : : static int
968 : 362813 : compare_decls_by_uid (const void *pa, const void *pb)
969 : : {
970 : 362813 : const numbered_tree *nt_a = ((const numbered_tree *)pa);
971 : 362813 : const numbered_tree *nt_b = ((const numbered_tree *)pb);
972 : :
973 : 362813 : if (DECL_UID (nt_a->t) != DECL_UID (nt_b->t))
974 : 295068 : return DECL_UID (nt_a->t) - DECL_UID (nt_b->t);
975 : 67745 : return nt_a->num - nt_b->num;
976 : : }
977 : :
978 : : /* Called via walk_gimple_stmt / walk_gimple_op by dump_enumerated_decls. */
979 : : static tree
980 : 111604 : dump_enumerated_decls_push (tree *tp, int *walk_subtrees, void *data)
981 : : {
982 : 111604 : struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
983 : 111604 : vec<numbered_tree> *list = (vec<numbered_tree> *) wi->info;
984 : 111604 : numbered_tree nt;
985 : :
986 : 111604 : if (!DECL_P (*tp))
987 : : return NULL_TREE;
988 : 20408 : nt.t = *tp;
989 : 20408 : nt.num = list->length ();
990 : 20408 : list->safe_push (nt);
991 : 20408 : *walk_subtrees = 0;
992 : 20408 : return NULL_TREE;
993 : : }
994 : :
995 : : /* Find all the declarations used by the current function, sort them by uid,
996 : : and emit the sorted list. Each declaration is tagged with a sequence
997 : : number indicating when it was found during statement / tree walking,
998 : : so that TDF_NOUID comparisons of anonymous declarations are still
999 : : meaningful. Where a declaration was encountered more than once, we
1000 : : emit only the sequence number of the first encounter.
1001 : : FILE is the dump file where to output the list and FLAGS is as in
1002 : : print_generic_expr. */
1003 : : void
1004 : 3931 : dump_enumerated_decls (FILE *file, dump_flags_t flags)
1005 : : {
1006 : 3931 : if (!cfun->cfg)
1007 : 4 : return;
1008 : :
1009 : 3927 : basic_block bb;
1010 : 3927 : struct walk_stmt_info wi;
1011 : 3927 : auto_vec<numbered_tree, 40> decl_list;
1012 : :
1013 : 3927 : memset (&wi, '\0', sizeof (wi));
1014 : 3927 : wi.info = (void *) &decl_list;
1015 : 15078 : FOR_EACH_BB_FN (bb, cfun)
1016 : : {
1017 : 11151 : gimple_stmt_iterator gsi;
1018 : :
1019 : 74620 : for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1020 : 52318 : if (!is_gimple_debug (gsi_stmt (gsi)))
1021 : 34858 : walk_gimple_stmt (&gsi, NULL, dump_enumerated_decls_push, &wi);
1022 : : }
1023 : 3927 : decl_list.qsort (compare_decls_by_uid);
1024 : 3927 : if (decl_list.length ())
1025 : : {
1026 : 3532 : unsigned ix;
1027 : 3532 : numbered_tree *ntp;
1028 : 3532 : tree last = NULL_TREE;
1029 : :
1030 : 3532 : fprintf (file, "Declarations used by %s, sorted by DECL_UID:\n",
1031 : : current_function_name ());
1032 : 31399 : FOR_EACH_VEC_ELT (decl_list, ix, ntp)
1033 : : {
1034 : 20408 : if (ntp->t == last)
1035 : 7569 : continue;
1036 : 12839 : fprintf (file, "%d: ", ntp->num);
1037 : 12839 : print_generic_decl (file, ntp->t, flags);
1038 : 12839 : fprintf (file, "\n");
1039 : 12839 : last = ntp->t;
1040 : : }
1041 : : }
1042 : 3927 : }
|