Branch data Line data Source code
1 : : /* Miscellaneous SSA utility functions.
2 : : Copyright (C) 2001-2024 Free Software Foundation, Inc.
3 : :
4 : : This file is part of GCC.
5 : :
6 : : GCC is free software; you can redistribute it and/or modify
7 : : it under the terms of the GNU General Public License as published by
8 : : the Free Software Foundation; either version 3, or (at your option)
9 : : any later version.
10 : :
11 : : GCC is distributed in the hope that it will be useful,
12 : : but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : : GNU General Public License for more details.
15 : :
16 : : You should have received a copy of the GNU General Public License
17 : : along with GCC; see the file COPYING3. If not see
18 : : <http://www.gnu.org/licenses/>. */
19 : :
20 : : #include "config.h"
21 : : #include "system.h"
22 : : #include "coretypes.h"
23 : : #include "backend.h"
24 : : #include "tree.h"
25 : : #include "gimple.h"
26 : : #include "cfghooks.h"
27 : : #include "tree-pass.h"
28 : : #include "ssa.h"
29 : : #include "gimple-pretty-print.h"
30 : : #include "diagnostic-core.h"
31 : : #include "fold-const.h"
32 : : #include "stor-layout.h"
33 : : #include "gimple-iterator.h"
34 : : #include "gimple-fold.h"
35 : : #include "gimplify.h"
36 : : #include "gimple-walk.h"
37 : : #include "tree-ssa-loop-manip.h"
38 : : #include "tree-into-ssa.h"
39 : : #include "tree-ssa.h"
40 : : #include "cfgloop.h"
41 : : #include "cfgexpand.h"
42 : : #include "tree-cfg.h"
43 : : #include "tree-dfa.h"
44 : : #include "stringpool.h"
45 : : #include "attribs.h"
46 : : #include "asan.h"
47 : :
48 : : /* Pointer map of variable mappings, keyed by edge. */
49 : : static hash_map<edge, auto_vec<edge_var_map> > *edge_var_maps;
50 : :
51 : :
52 : : /* Add a mapping with PHI RESULT and PHI DEF associated with edge E. */
53 : :
54 : : void
55 : 7338816 : redirect_edge_var_map_add (edge e, tree result, tree def, location_t locus)
56 : : {
57 : 7338816 : edge_var_map new_node;
58 : :
59 : 7338816 : if (edge_var_maps == NULL)
60 : 62109 : edge_var_maps = new hash_map<edge, auto_vec<edge_var_map> >;
61 : :
62 : 7338816 : auto_vec<edge_var_map> &slot = edge_var_maps->get_or_insert (e);
63 : 7338816 : new_node.def = def;
64 : 7338816 : new_node.result = result;
65 : 7338816 : new_node.locus = locus;
66 : :
67 : 7338816 : slot.safe_push (new_node);
68 : 7338816 : }
69 : :
70 : :
71 : : /* Clear the var mappings in edge E. */
72 : :
73 : : void
74 : 118615060 : redirect_edge_var_map_clear (edge e)
75 : : {
76 : 118615060 : if (!edge_var_maps)
77 : : return;
78 : :
79 : 104785636 : auto_vec<edge_var_map> *head = edge_var_maps->get (e);
80 : :
81 : 104785636 : if (head)
82 : 6309651 : head->release ();
83 : : }
84 : :
85 : :
86 : : /* Duplicate the redirected var mappings in OLDE in NEWE.
87 : :
88 : : This assumes a hash_map can have multiple edges mapping to the same
89 : : var_map (many to one mapping), since we don't remove the previous mappings.
90 : : */
91 : :
92 : : void
93 : 306536 : redirect_edge_var_map_dup (edge newe, edge olde)
94 : : {
95 : 306536 : if (!edge_var_maps)
96 : : return;
97 : :
98 : 281980 : auto_vec<edge_var_map> *new_head = &edge_var_maps->get_or_insert (newe);
99 : 281980 : auto_vec<edge_var_map> *old_head = edge_var_maps->get (olde);
100 : 281980 : if (!old_head)
101 : : return;
102 : :
103 : 3332 : new_head->safe_splice (*old_head);
104 : : }
105 : :
106 : :
107 : : /* Return the variable mappings for a given edge. If there is none, return
108 : : NULL. */
109 : :
110 : : vec<edge_var_map> *
111 : 4554582 : redirect_edge_var_map_vector (edge e)
112 : : {
113 : : /* Hey, what kind of idiot would... you'd be surprised. */
114 : 4554582 : if (!edge_var_maps)
115 : : return NULL;
116 : :
117 : 4541196 : auto_vec<edge_var_map> *slot = edge_var_maps->get (e);
118 : 4541196 : if (!slot)
119 : : return NULL;
120 : :
121 : : return slot;
122 : : }
123 : :
124 : : /* Clear the edge variable mappings. */
125 : :
126 : : void
127 : 769608765 : redirect_edge_var_map_empty (void)
128 : : {
129 : 769608765 : if (edge_var_maps)
130 : 222405802 : edge_var_maps->empty ();
131 : 769608765 : }
132 : :
133 : :
134 : : /* Remove the corresponding arguments from the PHI nodes in E's
135 : : destination block and redirect it to DEST. Return redirected edge.
136 : : The list of removed arguments is stored in a vector accessed
137 : : through edge_var_maps. */
138 : :
139 : : edge
140 : 55245709 : ssa_redirect_edge (edge e, basic_block dest)
141 : : {
142 : 55245709 : gphi_iterator gsi;
143 : 55245709 : gphi *phi;
144 : :
145 : 55245709 : redirect_edge_var_map_clear (e);
146 : :
147 : : /* Remove the appropriate PHI arguments in E's destination block.
148 : : If we are redirecting a copied edge the destination has not
149 : : got PHI argument space reserved nor an interesting argument. */
150 : 55245709 : if (! (e->dest->flags & BB_DUPLICATED))
151 : 61343800 : for (gsi = gsi_start_phis (e->dest); !gsi_end_p (gsi); gsi_next (&gsi))
152 : : {
153 : 7496777 : tree def;
154 : 7496777 : location_t locus;
155 : :
156 : 7496777 : phi = gsi.phi ();
157 : 7496777 : def = gimple_phi_arg_def (phi, e->dest_idx);
158 : 7496777 : locus = gimple_phi_arg_location (phi, e->dest_idx);
159 : :
160 : 7496777 : if (def == NULL_TREE)
161 : 1184643 : continue;
162 : :
163 : 6312134 : redirect_edge_var_map_add (e, gimple_phi_result (phi), def, locus);
164 : : }
165 : :
166 : 55245709 : e = redirect_edge_succ_nodup (e, dest);
167 : :
168 : 55245709 : return e;
169 : : }
170 : :
171 : :
172 : : /* Add PHI arguments queued in PENDING_STMT list on edge E to edge
173 : : E->dest. */
174 : :
175 : : void
176 : 2756510 : flush_pending_stmts (edge e)
177 : : {
178 : 2756510 : gphi *phi;
179 : 2756510 : edge_var_map *vm;
180 : 2756510 : int i;
181 : 2756510 : gphi_iterator gsi;
182 : :
183 : 2756510 : vec<edge_var_map> *v = redirect_edge_var_map_vector (e);
184 : 2756510 : if (!v)
185 : 279089 : return;
186 : :
187 : 2477421 : for (gsi = gsi_start_phis (e->dest), i = 0;
188 : 7154373 : !gsi_end_p (gsi) && v->iterate (i, &vm);
189 : 4676952 : gsi_next (&gsi), i++)
190 : : {
191 : 4676952 : tree def;
192 : :
193 : 4676952 : phi = gsi.phi ();
194 : 4676952 : def = redirect_edge_var_map_def (vm);
195 : 4676952 : add_phi_arg (phi, def, e, redirect_edge_var_map_location (vm));
196 : : }
197 : :
198 : 2477421 : redirect_edge_var_map_clear (e);
199 : : }
200 : :
201 : : /* Replace the LHS of STMT, an assignment, either a GIMPLE_ASSIGN or a
202 : : GIMPLE_CALL, with NLHS, in preparation for modifying the RHS to an
203 : : expression with a different value.
204 : :
205 : : This will update any annotations (say debug bind stmts) referring
206 : : to the original LHS, so that they use the RHS instead. This is
207 : : done even if NLHS and LHS are the same, for it is understood that
208 : : the RHS will be modified afterwards, and NLHS will not be assigned
209 : : an equivalent value.
210 : :
211 : : Adjusting any non-annotation uses of the LHS, if needed, is a
212 : : responsibility of the caller.
213 : :
214 : : The effect of this call should be pretty much the same as that of
215 : : inserting a copy of STMT before STMT, and then removing the
216 : : original stmt, at which time gsi_remove() would have update
217 : : annotations, but using this function saves all the inserting,
218 : : copying and removing. */
219 : :
220 : : void
221 : 65 : gimple_replace_ssa_lhs (gimple *stmt, tree nlhs)
222 : : {
223 : 65 : if (MAY_HAVE_DEBUG_BIND_STMTS)
224 : : {
225 : 1 : tree lhs = gimple_get_lhs (stmt);
226 : :
227 : 1 : gcc_assert (SSA_NAME_DEF_STMT (lhs) == stmt);
228 : :
229 : 1 : insert_debug_temp_for_var_def (NULL, lhs);
230 : : }
231 : :
232 : 65 : gimple_set_lhs (stmt, nlhs);
233 : 65 : }
234 : :
235 : :
236 : : /* Given a tree for an expression for which we might want to emit
237 : : locations or values in debug information (generally a variable, but
238 : : we might deal with other kinds of trees in the future), return the
239 : : tree that should be used as the variable of a DEBUG_BIND STMT or
240 : : VAR_LOCATION INSN or NOTE. Return NULL if VAR is not to be tracked. */
241 : :
242 : : tree
243 : 289863200 : target_for_debug_bind (tree var)
244 : : {
245 : 289865173 : if (!MAY_HAVE_DEBUG_BIND_STMTS)
246 : : return NULL_TREE;
247 : :
248 : 270607963 : if (TREE_CODE (var) == SSA_NAME)
249 : : {
250 : 13746232 : var = SSA_NAME_VAR (var);
251 : : if (var == NULL_TREE)
252 : : return NULL_TREE;
253 : : }
254 : :
255 : 223922447 : if ((!VAR_P (var) || VAR_DECL_IS_VIRTUAL_OPERAND (var))
256 : 278085840 : && TREE_CODE (var) != PARM_DECL)
257 : : return NULL_TREE;
258 : :
259 : 223736708 : if (DECL_HAS_VALUE_EXPR_P (var))
260 : 1973 : return target_for_debug_bind (DECL_VALUE_EXPR (var));
261 : :
262 : 223734735 : if (DECL_IGNORED_P (var))
263 : : return NULL_TREE;
264 : :
265 : : /* var-tracking only tracks registers. */
266 : 203482303 : if (!is_gimple_reg_type (TREE_TYPE (var)))
267 : 8155362 : return NULL_TREE;
268 : :
269 : : return var;
270 : : }
271 : :
272 : : /* Called via walk_tree, look for SSA_NAMEs that have already been
273 : : released. */
274 : :
275 : : tree
276 : 7368445 : find_released_ssa_name (tree *tp, int *walk_subtrees, void *data_)
277 : : {
278 : 7368445 : struct walk_stmt_info *wi = (struct walk_stmt_info *) data_;
279 : :
280 : 7368445 : if (wi && wi->is_lhs)
281 : : return NULL_TREE;
282 : :
283 : 7317405 : if (TREE_CODE (*tp) == SSA_NAME)
284 : : {
285 : 1234404 : if (SSA_NAME_IN_FREE_LIST (*tp))
286 : : return *tp;
287 : :
288 : 1230025 : *walk_subtrees = 0;
289 : : }
290 : 6083001 : else if (IS_TYPE_OR_DECL_P (*tp))
291 : 73396 : *walk_subtrees = 0;
292 : :
293 : : return NULL_TREE;
294 : : }
295 : :
296 : : /* Insert a DEBUG BIND stmt before the DEF of VAR if VAR is referenced
297 : : by other DEBUG stmts, and replace uses of the DEF with the
298 : : newly-created debug temp. */
299 : :
300 : : void
301 : 77595252 : insert_debug_temp_for_var_def (gimple_stmt_iterator *gsi, tree var)
302 : : {
303 : 77595252 : imm_use_iterator imm_iter;
304 : 77595252 : use_operand_p use_p;
305 : 77595252 : gimple *stmt;
306 : 77595252 : gimple *def_stmt = NULL;
307 : 77595252 : int usecount = 0;
308 : 77595252 : tree value = NULL;
309 : :
310 : 77595252 : if (!MAY_HAVE_DEBUG_BIND_STMTS)
311 : 74779931 : return;
312 : :
313 : : /* If this name has already been registered for replacement, do nothing
314 : : as anything that uses this name isn't in SSA form. */
315 : 77595252 : if (name_registered_for_update_p (var))
316 : : return;
317 : :
318 : : /* Check whether there are debug stmts that reference this variable and,
319 : : if there are, decide whether we should use a debug temp. */
320 : 84451187 : FOR_EACH_IMM_USE_FAST (use_p, imm_iter, var)
321 : : {
322 : 8056511 : stmt = USE_STMT (use_p);
323 : :
324 : 8056511 : if (!gimple_debug_bind_p (stmt))
325 : 4889937 : continue;
326 : :
327 : 3166574 : if (usecount++)
328 : : break;
329 : :
330 : 2815321 : if (gimple_debug_bind_get_value (stmt) != var)
331 : : {
332 : : /* Count this as an additional use, so as to make sure we
333 : : use a temp unless VAR's definition has a SINGLE_RHS that
334 : : can be shared. */
335 : : usecount++;
336 : : break;
337 : : }
338 : : }
339 : :
340 : 77261563 : if (!usecount)
341 : : return;
342 : :
343 : 2815321 : if (gsi)
344 : 2510701 : def_stmt = gsi_stmt (*gsi);
345 : : else
346 : 304620 : def_stmt = SSA_NAME_DEF_STMT (var);
347 : :
348 : : /* If we didn't get an insertion point, and the stmt has already
349 : : been removed, we won't be able to insert the debug bind stmt, so
350 : : we'll have to drop debug information. */
351 : 2815321 : if (gimple_code (def_stmt) == GIMPLE_PHI)
352 : : {
353 : 117246 : value = degenerate_phi_result (as_a <gphi *> (def_stmt));
354 : 117246 : if (value && walk_tree (&value, find_released_ssa_name, NULL, NULL))
355 : 36 : value = NULL;
356 : : /* error_mark_node is what fixup_noreturn_call changes PHI arguments
357 : : to. */
358 : 117210 : else if (value == error_mark_node)
359 : 0 : value = NULL;
360 : : }
361 : 2698075 : else if (gimple_clobber_p (def_stmt))
362 : : /* We can end up here when rewriting a decl into SSA and coming
363 : : along a clobber for the original decl. Turn that into
364 : : # DEBUG decl => NULL */
365 : 1224462 : value = NULL;
366 : 1473613 : else if (is_gimple_assign (def_stmt))
367 : : {
368 : 1454417 : bool no_value = false;
369 : :
370 : 1454417 : if (!dom_info_available_p (CDI_DOMINATORS))
371 : : {
372 : 55383 : struct walk_stmt_info wi;
373 : :
374 : 55383 : memset (&wi, 0, sizeof (wi));
375 : :
376 : : /* When removing blocks without following reverse dominance
377 : : order, we may sometimes encounter SSA_NAMEs that have
378 : : already been released, referenced in other SSA_DEFs that
379 : : we're about to release. Consider:
380 : :
381 : : <bb X>:
382 : : v_1 = foo;
383 : :
384 : : <bb Y>:
385 : : w_2 = v_1 + bar;
386 : : # DEBUG w => w_2
387 : :
388 : : If we deleted BB X first, propagating the value of w_2
389 : : won't do us any good. It's too late to recover their
390 : : original definition of v_1: when it was deleted, it was
391 : : only referenced in other DEFs, it couldn't possibly know
392 : : it should have been retained, and propagating every
393 : : single DEF just in case it might have to be propagated
394 : : into a DEBUG STMT would probably be too wasteful.
395 : :
396 : : When dominator information is not readily available, we
397 : : check for and accept some loss of debug information. But
398 : : if it is available, there's no excuse for us to remove
399 : : blocks in the wrong order, so we don't even check for
400 : : dead SSA NAMEs. SSA verification shall catch any
401 : : errors. */
402 : 48374 : if ((!gsi && !gimple_bb (def_stmt))
403 : 103757 : || walk_gimple_op (def_stmt, find_released_ssa_name, &wi))
404 : 4343 : no_value = true;
405 : : }
406 : :
407 : 55383 : if (!no_value)
408 : 1450074 : value = gimple_assign_rhs_to_tree (def_stmt);
409 : : }
410 : :
411 : 2815321 : if (value)
412 : : {
413 : : /* If there's a single use of VAR, and VAR is the entire debug
414 : : expression (usecount would have been incremented again
415 : : otherwise), then we can propagate VALUE into this single use,
416 : : avoiding the temp.
417 : :
418 : : We can also avoid using a temp if VALUE can be shared and
419 : : propagated into all uses, without generating expressions that
420 : : wouldn't be valid gimple RHSs.
421 : :
422 : : Other cases that would require unsharing or non-gimple RHSs
423 : : are deferred to a debug temp, although we could avoid temps
424 : : at the expense of duplication of expressions. */
425 : :
426 : 1472321 : if (usecount == 1
427 : 791274 : || gimple_code (def_stmt) == GIMPLE_PHI
428 : 786985 : || CONSTANT_CLASS_P (value)
429 : 2256653 : || is_gimple_reg (value))
430 : : ;
431 : : else
432 : : {
433 : 783200 : gdebug *def_temp;
434 : 783200 : tree vexpr = build_debug_expr_decl (TREE_TYPE (value));
435 : :
436 : 783200 : def_temp = gimple_build_debug_bind (vexpr,
437 : : unshare_expr (value),
438 : : def_stmt);
439 : :
440 : : /* FIXME: Is setting the mode really necessary? */
441 : 783200 : if (DECL_P (value))
442 : 7828 : SET_DECL_MODE (vexpr, DECL_MODE (value));
443 : : else
444 : 775372 : SET_DECL_MODE (vexpr, TYPE_MODE (TREE_TYPE (value)));
445 : :
446 : 783200 : if (gsi)
447 : 622794 : gsi_insert_before (gsi, def_temp, GSI_SAME_STMT);
448 : : else
449 : : {
450 : 160406 : gimple_stmt_iterator ngsi = gsi_for_stmt (def_stmt);
451 : 160406 : gsi_insert_before (&ngsi, def_temp, GSI_SAME_STMT);
452 : : }
453 : :
454 : 783200 : value = vexpr;
455 : : }
456 : : }
457 : :
458 : 7441318 : FOR_EACH_IMM_USE_STMT (stmt, imm_iter, var)
459 : : {
460 : 4625997 : if (!gimple_debug_bind_p (stmt))
461 : 440619 : continue;
462 : :
463 : 4185378 : if (value)
464 : : {
465 : 8285749 : FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
466 : 2761973 : SET_USE (use_p, unshare_expr (value));
467 : : /* If we didn't replace uses with a debug decl fold the
468 : : resulting expression. Otherwise we end up with invalid IL. */
469 : 2761803 : if (TREE_CODE (value) != DEBUG_EXPR_DECL)
470 : : {
471 : 701753 : gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
472 : 701753 : fold_stmt_inplace (&gsi);
473 : : }
474 : : }
475 : : else
476 : 1423575 : gimple_debug_bind_reset_value (stmt);
477 : :
478 : 4185378 : update_stmt (stmt);
479 : 2815321 : }
480 : : }
481 : :
482 : :
483 : : /* Insert a DEBUG BIND stmt before STMT for each DEF referenced by
484 : : other DEBUG stmts, and replace uses of the DEF with the
485 : : newly-created debug temp. */
486 : :
487 : : void
488 : 137101248 : insert_debug_temps_for_defs (gimple_stmt_iterator *gsi)
489 : : {
490 : 137101248 : gimple *stmt;
491 : 137101248 : ssa_op_iter op_iter;
492 : 137101248 : def_operand_p def_p;
493 : :
494 : 137101248 : if (!MAY_HAVE_DEBUG_BIND_STMTS)
495 : 39068555 : return;
496 : :
497 : 98032693 : stmt = gsi_stmt (*gsi);
498 : :
499 : 226873715 : FOR_EACH_PHI_OR_STMT_DEF (def_p, stmt, op_iter, SSA_OP_DEF)
500 : : {
501 : 30808329 : tree var = DEF_FROM_PTR (def_p);
502 : :
503 : 30808329 : if (TREE_CODE (var) != SSA_NAME)
504 : 118693 : continue;
505 : :
506 : 30689636 : insert_debug_temp_for_var_def (gsi, var);
507 : : }
508 : : }
509 : :
510 : : /* Reset all debug stmts that use SSA_NAME(s) defined in STMT. */
511 : :
512 : : void
513 : 5896 : reset_debug_uses (gimple *stmt)
514 : : {
515 : 5896 : ssa_op_iter op_iter;
516 : 5896 : def_operand_p def_p;
517 : 5896 : imm_use_iterator imm_iter;
518 : 5896 : gimple *use_stmt;
519 : :
520 : 5896 : if (!MAY_HAVE_DEBUG_BIND_STMTS)
521 : 248 : return;
522 : :
523 : 15048 : FOR_EACH_PHI_OR_STMT_DEF (def_p, stmt, op_iter, SSA_OP_DEF)
524 : : {
525 : 3752 : tree var = DEF_FROM_PTR (def_p);
526 : :
527 : 3752 : if (TREE_CODE (var) != SSA_NAME)
528 : 0 : continue;
529 : :
530 : 7926 : FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, var)
531 : : {
532 : 4174 : if (!gimple_debug_bind_p (use_stmt))
533 : 4113 : continue;
534 : :
535 : 61 : gimple_debug_bind_reset_value (use_stmt);
536 : 61 : update_stmt (use_stmt);
537 : 3752 : }
538 : : }
539 : : }
540 : :
541 : : /* Delete SSA DEFs for SSA versions in the TOREMOVE bitmap, removing
542 : : dominated stmts before their dominators, so that release_ssa_defs
543 : : stands a chance of propagating DEFs into debug bind stmts. */
544 : :
545 : : void
546 : 219508 : release_defs_bitset (bitmap toremove)
547 : : {
548 : 219508 : unsigned j;
549 : 219508 : bitmap_iterator bi;
550 : :
551 : : /* Performing a topological sort is probably overkill, this will
552 : : most likely run in slightly superlinear time, rather than the
553 : : pathological quadratic worst case.
554 : : But iterate from max SSA name version to min one because
555 : : that mimics allocation order during code generation behavior best.
556 : : Use an array for this which we compact on-the-fly with a NULL
557 : : marker moving towards the end of the vector. */
558 : 219508 : auto_vec<tree, 16> names;
559 : 219508 : names.reserve (bitmap_count_bits (toremove) + 1);
560 : 219508 : names.quick_push (NULL_TREE);
561 : 2378888 : EXECUTE_IF_SET_IN_BITMAP (toremove, 0, j, bi)
562 : 2159380 : names.quick_push (ssa_name (j));
563 : :
564 : 219508 : bitmap_tree_view (toremove);
565 : 671167 : while (!bitmap_empty_p (toremove))
566 : : {
567 : 232151 : j = names.length () - 1;
568 : 3066773 : for (unsigned i = names.length () - 1; names[i];)
569 : : {
570 : 2834622 : bool remove_now = true;
571 : 2834622 : tree var = names[i];
572 : 2834622 : gimple *stmt;
573 : 2834622 : imm_use_iterator uit;
574 : :
575 : 3383134 : FOR_EACH_IMM_USE_STMT (stmt, uit, var)
576 : : {
577 : 1223754 : ssa_op_iter dit;
578 : 1223754 : def_operand_p def_p;
579 : :
580 : : /* We can't propagate PHI nodes into debug stmts. */
581 : 1223754 : if (gimple_code (stmt) == GIMPLE_PHI
582 : 1223754 : || is_gimple_debug (stmt))
583 : 548512 : continue;
584 : :
585 : : /* If we find another definition to remove that uses
586 : : the one we're looking at, defer the removal of this
587 : : one, so that it can be propagated into debug stmts
588 : : after the other is. */
589 : 675242 : FOR_EACH_SSA_DEF_OPERAND (def_p, stmt, dit, SSA_OP_DEF)
590 : : {
591 : 675242 : tree odef = DEF_FROM_PTR (def_p);
592 : :
593 : 675242 : if (bitmap_bit_p (toremove, SSA_NAME_VERSION (odef)))
594 : : {
595 : : remove_now = false;
596 : : break;
597 : : }
598 : : }
599 : :
600 : 675242 : if (!remove_now)
601 : : break;
602 : 2834622 : }
603 : :
604 : 2834622 : if (remove_now)
605 : : {
606 : 2159380 : gimple *def = SSA_NAME_DEF_STMT (var);
607 : 2159380 : gimple_stmt_iterator gsi = gsi_for_stmt (def);
608 : :
609 : 2159380 : if (gimple_code (def) == GIMPLE_PHI)
610 : 529784 : remove_phi_node (&gsi, true);
611 : : else
612 : : {
613 : 1629596 : gsi_remove (&gsi, true);
614 : 1629596 : release_defs (def);
615 : : }
616 : 2159380 : bitmap_clear_bit (toremove, SSA_NAME_VERSION (var));
617 : : }
618 : : else
619 : 675242 : --i;
620 : 2834622 : if (--j != i)
621 : 2671585 : names[i] = names[j];
622 : : }
623 : : }
624 : 219508 : bitmap_list_view (toremove);
625 : 219508 : }
626 : :
627 : : /* Disable warnings about missing quoting in GCC diagnostics for
628 : : the verification errors. Their format strings don't follow GCC
629 : : diagnostic conventions and the calls are ultimately followed by
630 : : one to internal_error. */
631 : : #if __GNUC__ >= 10
632 : : # pragma GCC diagnostic push
633 : : # pragma GCC diagnostic ignored "-Wformat-diag"
634 : : #endif
635 : :
636 : : /* Verify virtual SSA form. */
637 : :
638 : : bool
639 : 2672538013 : verify_vssa (basic_block bb, tree current_vdef, sbitmap visited)
640 : : {
641 : 2672538013 : bool err = false;
642 : :
643 : 2672538013 : if (!bitmap_set_bit (visited, bb->index))
644 : : return false;
645 : :
646 : : /* Pick up the single virtual PHI def. */
647 : 2035918595 : gphi *phi = NULL;
648 : 2629454604 : for (gphi_iterator si = gsi_start_phis (bb); !gsi_end_p (si);
649 : 593536009 : gsi_next (&si))
650 : : {
651 : 593536009 : tree res = gimple_phi_result (si.phi ());
652 : 1476655715 : if (virtual_operand_p (res))
653 : : {
654 : 289583697 : if (phi)
655 : : {
656 : 0 : error ("multiple virtual PHI nodes in BB %d", bb->index);
657 : 0 : print_gimple_stmt (stderr, phi, 0);
658 : 0 : print_gimple_stmt (stderr, si.phi (), 0);
659 : 0 : err = true;
660 : : }
661 : : else
662 : : phi = si.phi ();
663 : : }
664 : : }
665 : 2035918595 : if (phi)
666 : : {
667 : 289583697 : current_vdef = gimple_phi_result (phi);
668 : 289583697 : if (TREE_CODE (current_vdef) != SSA_NAME)
669 : : {
670 : 0 : error ("virtual definition is not an SSA name");
671 : 0 : print_gimple_stmt (stderr, phi, 0);
672 : 0 : err = true;
673 : : }
674 : : }
675 : :
676 : : /* Verify stmts. */
677 : 14377270030 : for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
678 : 10305432840 : gsi_next (&gsi))
679 : : {
680 : 10305432840 : gimple *stmt = gsi_stmt (gsi);
681 : 15039102322 : tree vuse = gimple_vuse (stmt);
682 : 4676630326 : if (vuse)
683 : : {
684 : 3160497611 : if (vuse != current_vdef)
685 : : {
686 : 0 : error ("stmt with wrong VUSE");
687 : 0 : print_gimple_stmt (stderr, stmt, 0, TDF_VOPS);
688 : 0 : fprintf (stderr, "expected ");
689 : 0 : print_generic_expr (stderr, current_vdef);
690 : 0 : fprintf (stderr, "\n");
691 : 0 : err = true;
692 : : }
693 : 13465930451 : tree vdef = gimple_vdef (stmt);
694 : 3160497611 : if (vdef)
695 : : {
696 : 1972535765 : current_vdef = vdef;
697 : 1972535765 : if (TREE_CODE (current_vdef) != SSA_NAME)
698 : : {
699 : 0 : error ("virtual definition is not an SSA name");
700 : 0 : print_gimple_stmt (stderr, phi, 0);
701 : 0 : err = true;
702 : : }
703 : : }
704 : : }
705 : : }
706 : :
707 : : /* Verify destination PHI uses and recurse. */
708 : 2035918595 : edge_iterator ei;
709 : 2035918595 : edge e;
710 : 4503144476 : FOR_EACH_EDGE (e, ei, bb->succs)
711 : : {
712 : 2467225881 : gphi *phi = get_virtual_phi (e->dest);
713 : 2467225881 : if (phi
714 : 2467225881 : && PHI_ARG_DEF_FROM_EDGE (phi, e) != current_vdef)
715 : : {
716 : 0 : error ("PHI node with wrong VUSE on edge from BB %d",
717 : 0 : e->src->index);
718 : 0 : print_gimple_stmt (stderr, phi, 0, TDF_VOPS);
719 : 0 : fprintf (stderr, "expected ");
720 : 0 : print_generic_expr (stderr, current_vdef);
721 : 0 : fprintf (stderr, "\n");
722 : 0 : err = true;
723 : : }
724 : :
725 : : /* Recurse. */
726 : 2467225881 : err |= verify_vssa (e->dest, current_vdef, visited);
727 : : }
728 : :
729 : : return err;
730 : : }
731 : :
732 : : /* Return true if SSA_NAME is malformed and mark it visited.
733 : :
734 : : IS_VIRTUAL is true if this SSA_NAME was found inside a virtual
735 : : operand. */
736 : :
737 : : static bool
738 : 12353917889 : verify_ssa_name (tree ssa_name, bool is_virtual)
739 : : {
740 : 12353917889 : if (TREE_CODE (ssa_name) != SSA_NAME)
741 : : {
742 : 0 : error ("expected an SSA_NAME object");
743 : 0 : return true;
744 : : }
745 : :
746 : 12353917889 : if (SSA_NAME_IN_FREE_LIST (ssa_name))
747 : : {
748 : 0 : error ("found an SSA_NAME that had been released into the free pool");
749 : 0 : return true;
750 : : }
751 : :
752 : 12353917889 : if (SSA_NAME_VAR (ssa_name) != NULL_TREE
753 : 7431082755 : && TREE_TYPE (ssa_name) != TREE_TYPE (SSA_NAME_VAR (ssa_name)))
754 : : {
755 : 0 : error ("type mismatch between an SSA_NAME and its symbol");
756 : 0 : return true;
757 : : }
758 : :
759 : 12353917889 : if (is_virtual && !virtual_operand_p (ssa_name))
760 : : {
761 : 0 : error ("found a virtual definition for a GIMPLE register");
762 : 0 : return true;
763 : : }
764 : :
765 : 12353917889 : if (is_virtual && SSA_NAME_VAR (ssa_name) != gimple_vop (cfun))
766 : : {
767 : 0 : error ("virtual SSA name for non-VOP decl");
768 : 0 : return true;
769 : : }
770 : :
771 : 12353917889 : if (!is_virtual && virtual_operand_p (ssa_name))
772 : : {
773 : 0 : error ("found a real definition for a non-register");
774 : 0 : return true;
775 : : }
776 : :
777 : 12353917889 : if (SSA_NAME_IS_DEFAULT_DEF (ssa_name)
778 : 12353917889 : && !gimple_nop_p (SSA_NAME_DEF_STMT (ssa_name)))
779 : : {
780 : 0 : error ("found a default name with a non-empty defining statement");
781 : 0 : return true;
782 : : }
783 : :
784 : : return false;
785 : : }
786 : :
787 : :
788 : : /* Return true if the definition of SSA_NAME at block BB is malformed.
789 : :
790 : : STMT is the statement where SSA_NAME is created.
791 : :
792 : : DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME
793 : : version numbers. If DEFINITION_BLOCK[SSA_NAME_VERSION] is set,
794 : : it means that the block in that array slot contains the
795 : : definition of SSA_NAME.
796 : :
797 : : IS_VIRTUAL is true if SSA_NAME is created by a VDEF. */
798 : :
799 : : static bool
800 : 5249196304 : verify_def (basic_block bb, basic_block *definition_block, tree ssa_name,
801 : : gimple *stmt, bool is_virtual)
802 : : {
803 : 5249196304 : if (verify_ssa_name (ssa_name, is_virtual))
804 : 0 : goto err;
805 : :
806 : 5249196304 : if (SSA_NAME_VAR (ssa_name)
807 : 2891705828 : && TREE_CODE (SSA_NAME_VAR (ssa_name)) == RESULT_DECL
808 : 0 : && DECL_BY_REFERENCE (SSA_NAME_VAR (ssa_name)))
809 : : {
810 : 0 : error ("RESULT_DECL should be read only when DECL_BY_REFERENCE is set");
811 : 0 : goto err;
812 : : }
813 : :
814 : 5249196304 : if (definition_block[SSA_NAME_VERSION (ssa_name)])
815 : : {
816 : 0 : error ("SSA_NAME created in two different blocks %i and %i",
817 : 0 : definition_block[SSA_NAME_VERSION (ssa_name)]->index, bb->index);
818 : 0 : goto err;
819 : : }
820 : :
821 : 5249196304 : definition_block[SSA_NAME_VERSION (ssa_name)] = bb;
822 : :
823 : 5249196304 : if (SSA_NAME_DEF_STMT (ssa_name) != stmt)
824 : : {
825 : 0 : error ("SSA_NAME_DEF_STMT is wrong");
826 : 0 : fprintf (stderr, "Expected definition statement:\n");
827 : 0 : print_gimple_stmt (stderr, SSA_NAME_DEF_STMT (ssa_name), 4, TDF_VOPS);
828 : 0 : fprintf (stderr, "\nActual definition statement:\n");
829 : 0 : print_gimple_stmt (stderr, stmt, 4, TDF_VOPS);
830 : 0 : goto err;
831 : : }
832 : :
833 : : return false;
834 : :
835 : 0 : err:
836 : 0 : fprintf (stderr, "while verifying SSA_NAME ");
837 : 0 : print_generic_expr (stderr, ssa_name);
838 : 0 : fprintf (stderr, " in statement\n");
839 : 0 : print_gimple_stmt (stderr, stmt, 4, TDF_VOPS);
840 : :
841 : 0 : return true;
842 : : }
843 : :
844 : :
845 : : /* Return true if the use of SSA_NAME at statement STMT in block BB is
846 : : malformed.
847 : :
848 : : DEF_BB is the block where SSA_NAME was found to be created.
849 : :
850 : : IDOM contains immediate dominator information for the flowgraph.
851 : :
852 : : CHECK_ABNORMAL is true if the caller wants to check whether this use
853 : : is flowing through an abnormal edge (only used when checking PHI
854 : : arguments).
855 : :
856 : : If NAMES_DEFINED_IN_BB is not NULL, it contains a bitmap of ssa names
857 : : that are defined before STMT in basic block BB. */
858 : :
859 : : static bool
860 : 9860092810 : verify_use (basic_block bb, basic_block def_bb, use_operand_p use_p,
861 : : gimple *stmt, bool check_abnormal, bitmap names_defined_in_bb)
862 : : {
863 : 9860092810 : bool err = false;
864 : 9860092810 : tree ssa_name = USE_FROM_PTR (use_p);
865 : :
866 : 9860092810 : if (!TREE_VISITED (ssa_name))
867 : 5602858839 : if (verify_imm_links (stderr, ssa_name))
868 : 9860092810 : err = true;
869 : :
870 : 9860092810 : TREE_VISITED (ssa_name) = 1;
871 : :
872 : 9860092810 : if (gimple_nop_p (SSA_NAME_DEF_STMT (ssa_name))
873 : 9860092810 : && SSA_NAME_IS_DEFAULT_DEF (ssa_name))
874 : : ; /* Default definitions have empty statements. Nothing to do. */
875 : 8459274596 : else if (!def_bb)
876 : : {
877 : 0 : error ("missing definition");
878 : 0 : err = true;
879 : : }
880 : 8459274596 : else if (bb != def_bb
881 : 8459274596 : && !dominated_by_p (CDI_DOMINATORS, bb, def_bb))
882 : : {
883 : 0 : error ("definition in block %i does not dominate use in block %i",
884 : : def_bb->index, bb->index);
885 : 0 : err = true;
886 : : }
887 : 8459274596 : else if (bb == def_bb
888 : 8459274596 : && names_defined_in_bb != NULL
889 : 13591223464 : && !bitmap_bit_p (names_defined_in_bb, SSA_NAME_VERSION (ssa_name)))
890 : : {
891 : 0 : error ("definition in block %i follows the use", def_bb->index);
892 : 0 : err = true;
893 : : }
894 : :
895 : 9860092810 : if (check_abnormal
896 : 9867448193 : && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ssa_name))
897 : : {
898 : 0 : error ("SSA_NAME_OCCURS_IN_ABNORMAL_PHI should be set");
899 : 0 : err = true;
900 : : }
901 : :
902 : : /* Make sure the use is in an appropriate list by checking the previous
903 : : element to make sure it's the same. */
904 : 9860092810 : if (use_p->prev == NULL)
905 : : {
906 : 0 : error ("no immediate_use list");
907 : 0 : err = true;
908 : : }
909 : : else
910 : : {
911 : 9860092810 : tree listvar;
912 : 9860092810 : if (use_p->prev->use == NULL)
913 : 5602858839 : listvar = use_p->prev->loc.ssa_name;
914 : : else
915 : 4257233971 : listvar = USE_FROM_PTR (use_p->prev);
916 : 9860092810 : if (listvar != ssa_name)
917 : : {
918 : 0 : error ("wrong immediate use list");
919 : 0 : err = true;
920 : : }
921 : : }
922 : :
923 : 9860092810 : if (err)
924 : : {
925 : 0 : fprintf (stderr, "for SSA_NAME: ");
926 : 0 : print_generic_expr (stderr, ssa_name, TDF_VOPS);
927 : 0 : fprintf (stderr, " in statement:\n");
928 : 0 : print_gimple_stmt (stderr, stmt, 0, TDF_VOPS);
929 : : }
930 : :
931 : 9860092810 : return err;
932 : : }
933 : :
934 : :
935 : : /* Return true if any of the arguments for PHI node PHI at block BB is
936 : : malformed.
937 : :
938 : : DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME
939 : : version numbers. If DEFINITION_BLOCK[SSA_NAME_VERSION] is set,
940 : : it means that the block in that array slot contains the
941 : : definition of SSA_NAME. */
942 : :
943 : : static bool
944 : 593546991 : verify_phi_args (gphi *phi, basic_block bb, basic_block *definition_block)
945 : : {
946 : 593546991 : edge e;
947 : 593546991 : bool err = false;
948 : 593546991 : size_t i, phi_num_args = gimple_phi_num_args (phi);
949 : :
950 : 1187093982 : if (EDGE_COUNT (bb->preds) != phi_num_args)
951 : : {
952 : 0 : error ("incoming edge count does not match number of PHI arguments");
953 : 0 : err = true;
954 : 0 : goto error;
955 : : }
956 : :
957 : 2068489478 : for (i = 0; i < phi_num_args; i++)
958 : : {
959 : 1474942487 : use_operand_p op_p = gimple_phi_arg_imm_use_ptr (phi, i);
960 : 1474942487 : tree op = USE_FROM_PTR (op_p);
961 : :
962 : 1474942487 : e = EDGE_PRED (bb, i);
963 : :
964 : 1474942487 : if (op == NULL_TREE)
965 : : {
966 : 0 : error ("PHI argument is missing for edge %d->%d",
967 : 0 : e->src->index,
968 : 0 : e->dest->index);
969 : 0 : err = true;
970 : 0 : goto error;
971 : : }
972 : :
973 : 1474942487 : if (TREE_CODE (op) != SSA_NAME && !is_gimple_min_invariant (op))
974 : : {
975 : 0 : error ("PHI argument is not SSA_NAME, or invariant");
976 : 0 : err = true;
977 : : }
978 : :
979 : 1474942487 : if ((e->flags & EDGE_ABNORMAL) && TREE_CODE (op) != SSA_NAME)
980 : : {
981 : 0 : error ("PHI argument on abnormal edge is not SSA_NAME");
982 : 0 : err = true;
983 : : }
984 : :
985 : 1474942487 : if (TREE_CODE (op) == SSA_NAME)
986 : : {
987 : 2565484692 : err = verify_ssa_name (op, virtual_operand_p (gimple_phi_result (phi)));
988 : 1282742346 : err |= verify_use (e->src, definition_block[SSA_NAME_VERSION (op)],
989 : 1282742346 : op_p, phi, e->flags & EDGE_ABNORMAL, NULL);
990 : : }
991 : :
992 : 1474942487 : if (TREE_CODE (op) == ADDR_EXPR)
993 : : {
994 : 10802894 : tree base = TREE_OPERAND (op, 0);
995 : 14405610 : while (handled_component_p (base))
996 : 3602716 : base = TREE_OPERAND (base, 0);
997 : 10802894 : if ((VAR_P (base)
998 : : || TREE_CODE (base) == PARM_DECL
999 : : || TREE_CODE (base) == RESULT_DECL)
1000 : 4816444 : && !TREE_ADDRESSABLE (base))
1001 : : {
1002 : 0 : error ("address taken, but ADDRESSABLE bit not set");
1003 : 0 : err = true;
1004 : : }
1005 : : }
1006 : :
1007 : 1474942487 : if (e->dest != bb)
1008 : : {
1009 : 0 : error ("wrong edge %d->%d for PHI argument",
1010 : 0 : e->src->index, e->dest->index);
1011 : 0 : err = true;
1012 : : }
1013 : :
1014 : 1474942487 : if (err)
1015 : : {
1016 : 0 : fprintf (stderr, "PHI argument\n");
1017 : 0 : print_generic_stmt (stderr, op, TDF_VOPS);
1018 : 0 : goto error;
1019 : : }
1020 : : }
1021 : :
1022 : 593546991 : error:
1023 : 593546991 : if (err)
1024 : : {
1025 : 0 : fprintf (stderr, "for PHI node\n");
1026 : 0 : print_gimple_stmt (stderr, phi, 0, TDF_VOPS|TDF_MEMSYMS);
1027 : : }
1028 : :
1029 : :
1030 : 593546991 : return err;
1031 : : }
1032 : :
1033 : :
1034 : : /* Verify common invariants in the SSA web.
1035 : : TODO: verify the variable annotations. */
1036 : :
1037 : : DEBUG_FUNCTION void
1038 : 205416861 : verify_ssa (bool check_modified_stmt, bool check_ssa_operands)
1039 : : {
1040 : 205416861 : basic_block bb;
1041 : 410833722 : basic_block *definition_block = XCNEWVEC (basic_block, num_ssa_names);
1042 : 205416861 : ssa_op_iter iter;
1043 : 205416861 : tree op;
1044 : 205416861 : enum dom_state orig_dom_state = dom_info_state (CDI_DOMINATORS);
1045 : 205416861 : auto_bitmap names_defined_in_bb;
1046 : :
1047 : 205416861 : gcc_assert (!need_ssa_update_p (cfun));
1048 : :
1049 : 205416861 : timevar_push (TV_TREE_SSA_VERIFY);
1050 : :
1051 : 205416861 : {
1052 : : /* Keep track of SSA names present in the IL. */
1053 : 205416861 : size_t i;
1054 : 205416861 : tree name;
1055 : 205416861 : hash_map <void *, tree> ssa_info;
1056 : :
1057 : 7533029399 : FOR_EACH_SSA_NAME (i, name, cfun)
1058 : : {
1059 : 5821979239 : gimple *stmt;
1060 : 5821979239 : TREE_VISITED (name) = 0;
1061 : :
1062 : 11643958478 : verify_ssa_name (name, virtual_operand_p (name));
1063 : :
1064 : 5821979239 : stmt = SSA_NAME_DEF_STMT (name);
1065 : 5821979239 : if (!gimple_nop_p (stmt))
1066 : : {
1067 : 5249196304 : basic_block bb = gimple_bb (stmt);
1068 : 5249196304 : if (verify_def (bb, definition_block,
1069 : 5249196304 : name, stmt, virtual_operand_p (name)))
1070 : 0 : goto err;
1071 : : }
1072 : :
1073 : 5821979239 : void *info = NULL;
1074 : 5821979239 : if (POINTER_TYPE_P (TREE_TYPE (name)))
1075 : 1032156766 : info = SSA_NAME_PTR_INFO (name);
1076 : 4789822473 : else if (INTEGRAL_TYPE_P (TREE_TYPE (name)))
1077 : 1985749559 : info = SSA_NAME_RANGE_INFO (name);
1078 : 5821979239 : if (info)
1079 : : {
1080 : 1192204135 : bool existed;
1081 : 1192204135 : tree &val = ssa_info.get_or_insert (info, &existed);
1082 : 1192204135 : if (existed)
1083 : : {
1084 : 0 : error ("shared SSA name info");
1085 : 0 : print_generic_expr (stderr, val);
1086 : 0 : fprintf (stderr, " and ");
1087 : 0 : print_generic_expr (stderr, name);
1088 : 0 : fprintf (stderr, "\n");
1089 : 0 : goto err;
1090 : : }
1091 : : else
1092 : 1192204135 : val = name;
1093 : : }
1094 : : }
1095 : 0 : }
1096 : :
1097 : 205416861 : calculate_dominance_info (CDI_DOMINATORS);
1098 : :
1099 : : /* Now verify all the uses and make sure they agree with the definitions
1100 : : found in the previous pass. */
1101 : 1834875626 : FOR_EACH_BB_FN (bb, cfun)
1102 : : {
1103 : 1629458765 : edge e;
1104 : 1629458765 : edge_iterator ei;
1105 : :
1106 : : /* Make sure that all edges have a clear 'aux' field. */
1107 : 3895395966 : FOR_EACH_EDGE (e, ei, bb->preds)
1108 : : {
1109 : 2265937201 : if (e->aux)
1110 : : {
1111 : 0 : error ("AUX pointer initialized for edge %d->%d", e->src->index,
1112 : 0 : e->dest->index);
1113 : 0 : goto err;
1114 : : }
1115 : : }
1116 : :
1117 : : /* Verify the arguments for every PHI node in the block. */
1118 : 2223005756 : for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1119 : : {
1120 : 593546991 : gphi *phi = gsi.phi ();
1121 : 593546991 : if (verify_phi_args (phi, bb, definition_block))
1122 : 0 : goto err;
1123 : :
1124 : 593546991 : bitmap_set_bit (names_defined_in_bb,
1125 : 593546991 : SSA_NAME_VERSION (gimple_phi_result (phi)));
1126 : : }
1127 : :
1128 : : /* Now verify all the uses and vuses in every statement of the block. */
1129 : 13564505191 : for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
1130 : 10305587661 : gsi_next (&gsi))
1131 : : {
1132 : 10305587661 : gimple *stmt = gsi_stmt (gsi);
1133 : 10305587661 : use_operand_p use_p;
1134 : :
1135 : 20548426325 : if (check_modified_stmt && gimple_modified_p (stmt))
1136 : : {
1137 : 0 : error ("stmt (%p) marked modified after optimization pass: ",
1138 : : (void *)stmt);
1139 : 0 : print_gimple_stmt (stderr, stmt, 0, TDF_VOPS);
1140 : 0 : goto err;
1141 : : }
1142 : :
1143 : 10305587661 : if (check_ssa_operands && verify_ssa_operands (cfun, stmt))
1144 : : {
1145 : 0 : print_gimple_stmt (stderr, stmt, 0, TDF_VOPS);
1146 : 0 : goto err;
1147 : : }
1148 : :
1149 : 10305587661 : if (gimple_debug_bind_p (stmt)
1150 : 4853242242 : && !gimple_debug_bind_has_value_p (stmt))
1151 : 1529766394 : continue;
1152 : :
1153 : 17353171731 : FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE|SSA_OP_VUSE)
1154 : : {
1155 : 8577350464 : op = USE_FROM_PTR (use_p);
1156 : 8577350464 : if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
1157 : : use_p, stmt, false, names_defined_in_bb))
1158 : 0 : goto err;
1159 : : }
1160 : :
1161 : 13421102355 : FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_ALL_DEFS)
1162 : : {
1163 : 4645281088 : if (SSA_NAME_DEF_STMT (op) != stmt)
1164 : : {
1165 : 0 : error ("SSA_NAME_DEF_STMT is wrong");
1166 : 0 : fprintf (stderr, "Expected definition statement:\n");
1167 : 0 : print_gimple_stmt (stderr, stmt, 4, TDF_VOPS);
1168 : 0 : fprintf (stderr, "\nActual definition statement:\n");
1169 : 0 : print_gimple_stmt (stderr, SSA_NAME_DEF_STMT (op),
1170 : : 4, TDF_VOPS);
1171 : 0 : goto err;
1172 : : }
1173 : 4645281088 : bitmap_set_bit (names_defined_in_bb, SSA_NAME_VERSION (op));
1174 : : }
1175 : : }
1176 : :
1177 : 1629458765 : bitmap_clear (names_defined_in_bb);
1178 : : }
1179 : :
1180 : 205416861 : free (definition_block);
1181 : :
1182 : 205416861 : if (gimple_vop (cfun)
1183 : 205416861 : && ssa_default_def (cfun, gimple_vop (cfun)))
1184 : : {
1185 : 205312132 : auto_sbitmap visited (last_basic_block_for_fn (cfun) + 1);
1186 : 205312132 : bitmap_clear (visited);
1187 : 205312132 : if (verify_vssa (ENTRY_BLOCK_PTR_FOR_FN (cfun),
1188 : : ssa_default_def (cfun, gimple_vop (cfun)), visited))
1189 : 0 : goto err;
1190 : 205312132 : }
1191 : :
1192 : : /* Restore the dominance information to its prior known state, so
1193 : : that we do not perturb the compiler's subsequent behavior. */
1194 : 205416861 : if (orig_dom_state == DOM_NONE)
1195 : 66512011 : free_dominance_info (CDI_DOMINATORS);
1196 : : else
1197 : 138904850 : set_dom_info_availability (CDI_DOMINATORS, orig_dom_state);
1198 : :
1199 : 205416861 : timevar_pop (TV_TREE_SSA_VERIFY);
1200 : 205416861 : return;
1201 : :
1202 : 0 : err:
1203 : 0 : internal_error ("verify_ssa failed");
1204 : 205416861 : }
1205 : :
1206 : : #if __GNUC__ >= 10
1207 : : # pragma GCC diagnostic pop
1208 : : #endif
1209 : :
1210 : : /* Initialize global DFA and SSA structures.
1211 : : If SIZE is non-zero allocated ssa names array of a given size. */
1212 : :
1213 : : void
1214 : 3042738 : init_tree_ssa (struct function *fn, int size)
1215 : : {
1216 : 3042738 : fn->gimple_df = ggc_cleared_alloc<gimple_df> ();
1217 : 3042738 : fn->gimple_df->default_defs = hash_table<ssa_name_hasher>::create_ggc (20);
1218 : 3042738 : pt_solution_reset (&fn->gimple_df->escaped);
1219 : 3042738 : pt_solution_reset (&fn->gimple_df->escaped_return);
1220 : 3042738 : init_ssanames (fn, size);
1221 : 3042738 : }
1222 : :
1223 : : /* Deallocate memory associated with SSA data structures for FNDECL. */
1224 : :
1225 : : void
1226 : 2938978 : delete_tree_ssa (struct function *fn)
1227 : : {
1228 : 2938978 : fini_ssanames (fn);
1229 : :
1230 : : /* We no longer maintain the SSA operand cache at this point. */
1231 : 2938978 : if (ssa_operands_active (fn))
1232 : 2915806 : fini_ssa_operands (fn);
1233 : :
1234 : 2938978 : fn->gimple_df->default_defs->empty ();
1235 : 2938978 : fn->gimple_df->default_defs = NULL;
1236 : 2938978 : pt_solution_reset (&fn->gimple_df->escaped);
1237 : 2938978 : pt_solution_reset (&fn->gimple_df->escaped_return);
1238 : 2938978 : if (fn->gimple_df->decls_to_pointers != NULL)
1239 : 37969 : delete fn->gimple_df->decls_to_pointers;
1240 : 2938978 : fn->gimple_df->decls_to_pointers = NULL;
1241 : 2938978 : fn->gimple_df = NULL;
1242 : :
1243 : : /* We no longer need the edge variable maps. */
1244 : 2938978 : redirect_edge_var_map_empty ();
1245 : 2938978 : }
1246 : :
1247 : : /* Return true if EXPR is a useless type conversion, otherwise return
1248 : : false. */
1249 : :
1250 : : bool
1251 : 866033804 : tree_ssa_useless_type_conversion (tree expr)
1252 : : {
1253 : 866033804 : tree outer_type, inner_type;
1254 : :
1255 : : /* If we have an assignment that merely uses a NOP_EXPR to change
1256 : : the top of the RHS to the type of the LHS and the type conversion
1257 : : is "safe", then strip away the type conversion so that we can
1258 : : enter LHS = RHS into the const_and_copies table. */
1259 : 866033804 : if (!CONVERT_EXPR_P (expr)
1260 : 800526051 : && TREE_CODE (expr) != VIEW_CONVERT_EXPR
1261 : 799525671 : && TREE_CODE (expr) != NON_LVALUE_EXPR)
1262 : : return false;
1263 : :
1264 : 66984598 : outer_type = TREE_TYPE (expr);
1265 : 66984598 : inner_type = TREE_TYPE (TREE_OPERAND (expr, 0));
1266 : :
1267 : 66984598 : if (inner_type == error_mark_node)
1268 : : return false;
1269 : :
1270 : 66984567 : return useless_type_conversion_p (outer_type, inner_type);
1271 : : }
1272 : :
1273 : : /* Strip conversions from EXP according to
1274 : : tree_ssa_useless_type_conversion and return the resulting
1275 : : expression. */
1276 : :
1277 : : tree
1278 : 835099347 : tree_ssa_strip_useless_type_conversions (tree exp)
1279 : : {
1280 : 854125276 : while (tree_ssa_useless_type_conversion (exp))
1281 : 19025929 : exp = TREE_OPERAND (exp, 0);
1282 : 835099347 : return exp;
1283 : : }
1284 : :
1285 : : /* Return true if T, as SSA_NAME, has an implicit default defined value. */
1286 : :
1287 : : bool
1288 : 326846920 : ssa_defined_default_def_p (tree t)
1289 : : {
1290 : 326846920 : tree var = SSA_NAME_VAR (t);
1291 : :
1292 : 130527321 : if (!var)
1293 : : ;
1294 : : /* Parameters get their initial value from the function entry. */
1295 : 130527321 : else if (TREE_CODE (var) == PARM_DECL)
1296 : : return true;
1297 : : /* When returning by reference the return address is actually a hidden
1298 : : parameter. */
1299 : 101845878 : else if (TREE_CODE (var) == RESULT_DECL && DECL_BY_REFERENCE (var))
1300 : : return true;
1301 : : /* Hard register variables get their initial value from the ether. */
1302 : 101668007 : else if (VAR_P (var) && DECL_HARD_REGISTER (var))
1303 : 0 : return true;
1304 : :
1305 : : return false;
1306 : : }
1307 : :
1308 : :
1309 : : /* Return true if T, an SSA_NAME, has an undefined value. PARTIAL is what
1310 : : should be returned if the value is only partially undefined. */
1311 : :
1312 : : bool
1313 : 326608512 : ssa_undefined_value_p (tree t, bool partial)
1314 : : {
1315 : 326608512 : gimple *def_stmt;
1316 : :
1317 : 653217024 : gcc_checking_assert (!virtual_operand_p (t));
1318 : :
1319 : 326608512 : if (ssa_defined_default_def_p (t))
1320 : : return false;
1321 : :
1322 : : /* The value is undefined iff its definition statement is empty. */
1323 : 297751645 : def_stmt = SSA_NAME_DEF_STMT (t);
1324 : 297751645 : if (gimple_nop_p (def_stmt))
1325 : : return true;
1326 : :
1327 : : /* The value is undefined if the definition statement is a call
1328 : : to .DEFERRED_INIT function. */
1329 : 290172435 : if (gimple_call_internal_p (def_stmt, IFN_DEFERRED_INIT))
1330 : : return true;
1331 : :
1332 : : /* The value is partially undefined if the definition statement is
1333 : : a REALPART_EXPR or IMAGPART_EXPR and its operand is defined by
1334 : : the call to .DEFERRED_INIT function. This is for handling the
1335 : : following case:
1336 : :
1337 : : 1 typedef _Complex float C;
1338 : : 2 C foo (int cond)
1339 : : 3 {
1340 : : 4 C f;
1341 : : 5 __imag__ f = 0;
1342 : : 6 if (cond)
1343 : : 7 {
1344 : : 8 __real__ f = 1;
1345 : : 9 return f;
1346 : : 10 }
1347 : : 11 return f;
1348 : : 12 }
1349 : :
1350 : : with -ftrivial-auto-var-init, compiler will insert the following
1351 : : artificial initialization:
1352 : : f = .DEFERRED_INIT (f, 2);
1353 : : _1 = REALPART_EXPR <f>;
1354 : :
1355 : : we should treat the definition _1 = REALPART_EXPR <f> as undefined. */
1356 : 47352030 : if (partial && is_gimple_assign (def_stmt)
1357 : 326489314 : && (gimple_assign_rhs_code (def_stmt) == REALPART_EXPR
1358 : 36038047 : || gimple_assign_rhs_code (def_stmt) == IMAGPART_EXPR))
1359 : : {
1360 : 602789 : tree real_imag_part = TREE_OPERAND (gimple_assign_rhs1 (def_stmt), 0);
1361 : 602789 : if (TREE_CODE (real_imag_part) == SSA_NAME
1362 : 602789 : && gimple_call_internal_p (SSA_NAME_DEF_STMT (real_imag_part),
1363 : : IFN_DEFERRED_INIT))
1364 : : return true;
1365 : : }
1366 : :
1367 : : /* Check if the complex was not only partially defined. */
1368 : 47351944 : if (partial && is_gimple_assign (def_stmt)
1369 : 326489142 : && gimple_assign_rhs_code (def_stmt) == COMPLEX_EXPR)
1370 : : {
1371 : 17513 : tree rhs1, rhs2;
1372 : :
1373 : 17513 : rhs1 = gimple_assign_rhs1 (def_stmt);
1374 : 17513 : rhs2 = gimple_assign_rhs2 (def_stmt);
1375 : 17050 : return (TREE_CODE (rhs1) == SSA_NAME && ssa_undefined_value_p (rhs1))
1376 : 34522 : || (TREE_CODE (rhs2) == SSA_NAME && ssa_undefined_value_p (rhs2));
1377 : : }
1378 : : return false;
1379 : : }
1380 : :
1381 : :
1382 : : /* Return TRUE iff there are any non-PHI uses of VAR that dominate the
1383 : : end of BB. If we return TRUE and BB is a loop header, then VAR we
1384 : : be assumed to be defined within the loop, even if it is marked as
1385 : : maybe-undefined. */
1386 : :
1387 : : bool
1388 : 296464 : ssa_name_any_use_dominates_bb_p (tree var, basic_block bb)
1389 : : {
1390 : 296464 : imm_use_iterator iter;
1391 : 296464 : use_operand_p use_p;
1392 : 859356 : FOR_EACH_IMM_USE_FAST (use_p, iter, var)
1393 : : {
1394 : 585716 : if (is_a <gphi *> (USE_STMT (use_p))
1395 : 585716 : || is_gimple_debug (USE_STMT (use_p)))
1396 : 528900 : continue;
1397 : 56816 : basic_block dombb = gimple_bb (USE_STMT (use_p));
1398 : 56816 : if (dominated_by_p (CDI_DOMINATORS, bb, dombb))
1399 : : return true;
1400 : : }
1401 : :
1402 : : return false;
1403 : : }
1404 : :
1405 : : /* Mark as maybe_undef any SSA_NAMEs that are unsuitable as ivopts
1406 : : candidates for potentially involving undefined behavior. */
1407 : :
1408 : : void
1409 : 11019785 : mark_ssa_maybe_undefs (void)
1410 : : {
1411 : 11019785 : auto_vec<tree> queue;
1412 : :
1413 : : /* Scan all SSA_NAMEs, marking the definitely-undefined ones as
1414 : : maybe-undefined and queuing them for propagation, while clearing
1415 : : the mark on others. */
1416 : 11019785 : unsigned int i;
1417 : 11019785 : tree var;
1418 : 492965541 : FOR_EACH_SSA_NAME (i, var, cfun)
1419 : : {
1420 : 339004950 : if (SSA_NAME_IS_VIRTUAL_OPERAND (var)
1421 : 339004950 : || !ssa_undefined_value_p (var, false))
1422 : 333338053 : ssa_name_set_maybe_undef (var, false);
1423 : : else
1424 : : {
1425 : 5666897 : ssa_name_set_maybe_undef (var);
1426 : 5666897 : queue.safe_push (var);
1427 : 5666897 : if (dump_file && (dump_flags & TDF_DETAILS))
1428 : 32 : fprintf (dump_file, "marking _%i as maybe-undef\n",
1429 : 16 : SSA_NAME_VERSION (var));
1430 : : }
1431 : : }
1432 : :
1433 : : /* Now propagate maybe-undefined from a DEF to any other PHI that
1434 : : uses it, as long as there isn't any intervening use of DEF. */
1435 : 18338967 : while (!queue.is_empty ())
1436 : : {
1437 : 5938174 : var = queue.pop ();
1438 : 5938174 : imm_use_iterator iter;
1439 : 5938174 : use_operand_p use_p;
1440 : 7135186 : FOR_EACH_IMM_USE_FAST (use_p, iter, var)
1441 : : {
1442 : : /* Any uses of VAR that aren't PHI args imply VAR must be
1443 : : defined, otherwise undefined behavior would have been
1444 : : definitely invoked. Only PHI args may hold
1445 : : maybe-undefined values without invoking undefined
1446 : : behavior for that reason alone. */
1447 : 1197012 : if (!is_a <gphi *> (USE_STMT (use_p)))
1448 : 925735 : continue;
1449 : 459739 : gphi *phi = as_a <gphi *> (USE_STMT (use_p));
1450 : :
1451 : 459739 : tree def = gimple_phi_result (phi);
1452 : 459739 : if (ssa_name_maybe_undef_p (def))
1453 : 170259 : continue;
1454 : :
1455 : : /* Look for any uses of the maybe-unused SSA_NAME that
1456 : : dominates the block that reaches the incoming block
1457 : : corresponding to the PHI arg in which it is mentioned.
1458 : : That means we can assume the SSA_NAME is defined in that
1459 : : path, so we only mark a PHI result as maybe-undef if we
1460 : : find an unused reaching SSA_NAME. */
1461 : 289480 : int idx = phi_arg_index_from_use (use_p);
1462 : 289480 : basic_block bb = gimple_phi_arg_edge (phi, idx)->src;
1463 : 289480 : if (ssa_name_any_use_dominates_bb_p (var, bb))
1464 : 18203 : continue;
1465 : :
1466 : 271277 : ssa_name_set_maybe_undef (def);
1467 : 271277 : queue.safe_push (def);
1468 : 271277 : if (dump_file && (dump_flags & TDF_DETAILS))
1469 : 0 : fprintf (dump_file, "marking _%i as maybe-undef because of _%i\n",
1470 : 0 : SSA_NAME_VERSION (def), SSA_NAME_VERSION (var));
1471 : : }
1472 : : }
1473 : 11019785 : }
1474 : :
1475 : :
1476 : : /* If necessary, rewrite the base of the reference tree *TP from
1477 : : a MEM_REF to a plain or converted symbol. */
1478 : :
1479 : : static void
1480 : 22608002 : maybe_rewrite_mem_ref_base (tree *tp, bitmap suitable_for_renaming)
1481 : : {
1482 : 22608002 : tree sym;
1483 : :
1484 : 25618573 : while (handled_component_p (*tp))
1485 : 3010571 : tp = &TREE_OPERAND (*tp, 0);
1486 : 22608002 : if (TREE_CODE (*tp) == MEM_REF
1487 : 1590350 : && TREE_CODE (TREE_OPERAND (*tp, 0)) == ADDR_EXPR
1488 : 255374 : && (sym = TREE_OPERAND (TREE_OPERAND (*tp, 0), 0))
1489 : 255374 : && DECL_P (sym)
1490 : 254956 : && !TREE_ADDRESSABLE (sym)
1491 : 136962 : && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym))
1492 : 52703 : && is_gimple_reg_type (TREE_TYPE (*tp))
1493 : 22660693 : && ! VOID_TYPE_P (TREE_TYPE (*tp)))
1494 : : {
1495 : 52691 : if (VECTOR_TYPE_P (TREE_TYPE (sym))
1496 : 763 : && useless_type_conversion_p (TREE_TYPE (*tp),
1497 : 763 : TREE_TYPE (TREE_TYPE (sym)))
1498 : 52775 : && multiple_p (mem_ref_offset (*tp),
1499 : 84 : wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (*tp)))))
1500 : : {
1501 : 166 : *tp = build3 (BIT_FIELD_REF, TREE_TYPE (*tp), sym,
1502 : 83 : TYPE_SIZE (TREE_TYPE (*tp)),
1503 : : int_const_binop (MULT_EXPR,
1504 : 166 : bitsize_int (BITS_PER_UNIT),
1505 : 83 : TREE_OPERAND (*tp, 1)));
1506 : : }
1507 : 52608 : else if (TREE_CODE (TREE_TYPE (sym)) == COMPLEX_TYPE
1508 : 53613 : && useless_type_conversion_p (TREE_TYPE (*tp),
1509 : 1005 : TREE_TYPE (TREE_TYPE (sym))))
1510 : : {
1511 : 6 : *tp = build1 (integer_zerop (TREE_OPERAND (*tp, 1))
1512 : : ? REALPART_EXPR : IMAGPART_EXPR,
1513 : 4 : TREE_TYPE (*tp), sym);
1514 : : }
1515 : 52604 : else if (integer_zerop (TREE_OPERAND (*tp, 1))
1516 : 52604 : && DECL_SIZE (sym) == TYPE_SIZE (TREE_TYPE (*tp)))
1517 : : {
1518 : 52258 : if (!useless_type_conversion_p (TREE_TYPE (*tp),
1519 : 52258 : TREE_TYPE (sym)))
1520 : 13312 : *tp = build1 (VIEW_CONVERT_EXPR,
1521 : 13312 : TREE_TYPE (*tp), sym);
1522 : : else
1523 : 38946 : *tp = sym;
1524 : : }
1525 : 346 : else if (DECL_SIZE (sym)
1526 : 346 : && TREE_CODE (DECL_SIZE (sym)) == INTEGER_CST
1527 : 346 : && (known_subrange_p
1528 : 346 : (mem_ref_offset (*tp),
1529 : 346 : wi::to_offset (TYPE_SIZE_UNIT (TREE_TYPE (*tp))),
1530 : 346 : 0, wi::to_offset (DECL_SIZE_UNIT (sym))))
1531 : 346 : && (! INTEGRAL_TYPE_P (TREE_TYPE (*tp))
1532 : 341 : || (wi::to_offset (TYPE_SIZE (TREE_TYPE (*tp)))
1533 : 682 : == TYPE_PRECISION (TREE_TYPE (*tp))))
1534 : 346 : && (! INTEGRAL_TYPE_P (TREE_TYPE (sym))
1535 : 162 : || type_has_mode_precision_p (TREE_TYPE (sym)))
1536 : 692 : && wi::umod_trunc (wi::to_offset (TYPE_SIZE (TREE_TYPE (*tp))),
1537 : 692 : BITS_PER_UNIT) == 0)
1538 : : {
1539 : 692 : *tp = build3 (BIT_FIELD_REF, TREE_TYPE (*tp), sym,
1540 : 346 : TYPE_SIZE (TREE_TYPE (*tp)),
1541 : : wide_int_to_tree (bitsizetype,
1542 : 346 : mem_ref_offset (*tp)
1543 : 692 : << LOG2_BITS_PER_UNIT));
1544 : : }
1545 : : }
1546 : 22608002 : }
1547 : :
1548 : : /* For a tree REF return its base if it is the base of a MEM_REF
1549 : : that cannot be rewritten into SSA form. Otherwise return NULL_TREE. */
1550 : :
1551 : : static tree
1552 : 267696627 : non_rewritable_mem_ref_base (tree ref)
1553 : : {
1554 : 267696627 : tree base;
1555 : :
1556 : : /* A plain decl does not need it set. */
1557 : 267696627 : if (DECL_P (ref))
1558 : : return NULL_TREE;
1559 : :
1560 : 239849548 : switch (TREE_CODE (ref))
1561 : : {
1562 : 2379822 : case REALPART_EXPR:
1563 : 2379822 : case IMAGPART_EXPR:
1564 : 2379822 : case BIT_FIELD_REF:
1565 : 2379822 : if (DECL_P (TREE_OPERAND (ref, 0)))
1566 : : return NULL_TREE;
1567 : : break;
1568 : 2340451 : case VIEW_CONVERT_EXPR:
1569 : 2340451 : if (DECL_P (TREE_OPERAND (ref, 0)))
1570 : : {
1571 : 1095564 : if (TYPE_SIZE (TREE_TYPE (ref))
1572 : 1095564 : != TYPE_SIZE (TREE_TYPE (TREE_OPERAND (ref, 0))))
1573 : 551 : return TREE_OPERAND (ref, 0);
1574 : : return NULL_TREE;
1575 : : }
1576 : : break;
1577 : : /* We would need to rewrite ARRAY_REFs or COMPONENT_REFs and even
1578 : : more so multiple levels of handled components. */
1579 : 238277947 : default:;
1580 : : }
1581 : :
1582 : 238277947 : base = ref;
1583 : :
1584 : : /* But watch out for MEM_REFs we cannot lower to a
1585 : : VIEW_CONVERT_EXPR or a BIT_FIELD_REF. */
1586 : 238277947 : if (TREE_CODE (base) == MEM_REF
1587 : 238277947 : && TREE_CODE (TREE_OPERAND (base, 0)) == ADDR_EXPR)
1588 : : {
1589 : 4729176 : tree decl = TREE_OPERAND (TREE_OPERAND (base, 0), 0);
1590 : 4729176 : if (! DECL_P (decl))
1591 : : return NULL_TREE;
1592 : 4692346 : if (! is_gimple_reg_type (TREE_TYPE (base))
1593 : 4548389 : || VOID_TYPE_P (TREE_TYPE (base))
1594 : 9240735 : || TREE_THIS_VOLATILE (decl) != TREE_THIS_VOLATILE (base))
1595 : : return decl;
1596 : 4547516 : if ((VECTOR_TYPE_P (TREE_TYPE (decl))
1597 : 4546451 : || TREE_CODE (TREE_TYPE (decl)) == COMPLEX_TYPE)
1598 : 2351 : && useless_type_conversion_p (TREE_TYPE (base),
1599 : 2351 : TREE_TYPE (TREE_TYPE (decl)))
1600 : 266 : && known_ge (mem_ref_offset (base), 0)
1601 : 219 : && known_gt (wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (decl))),
1602 : : mem_ref_offset (base))
1603 : 4547729 : && multiple_p (mem_ref_offset (base),
1604 : 213 : wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (base)))))
1605 : 212 : return NULL_TREE;
1606 : : /* For same sizes and zero offset we can use a VIEW_CONVERT_EXPR. */
1607 : 4547304 : if (integer_zerop (TREE_OPERAND (base, 1))
1608 : 4547304 : && DECL_SIZE (decl) == TYPE_SIZE (TREE_TYPE (base)))
1609 : : return NULL_TREE;
1610 : : /* For integral typed extracts we can use a BIT_FIELD_REF. */
1611 : 4119605 : if (DECL_SIZE (decl)
1612 : 4115409 : && TREE_CODE (DECL_SIZE_UNIT (decl)) == INTEGER_CST
1613 : 4115409 : && (known_subrange_p
1614 : 4115409 : (mem_ref_offset (base),
1615 : 4115409 : wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (base))),
1616 : 4115409 : 0, wi::to_poly_offset (DECL_SIZE_UNIT (decl))))
1617 : : /* ??? We can't handle bitfield precision extracts without
1618 : : either using an alternate type for the BIT_FIELD_REF and
1619 : : then doing a conversion or possibly adjusting the offset
1620 : : according to endianness. */
1621 : 4113283 : && (! INTEGRAL_TYPE_P (TREE_TYPE (base))
1622 : 2433785 : || (wi::to_offset (TYPE_SIZE (TREE_TYPE (base)))
1623 : 4867570 : == TYPE_PRECISION (TREE_TYPE (base))))
1624 : : /* ??? Likewise for extracts from bitfields, we'd have
1625 : : to pun the base object to a size precision mode first. */
1626 : 4109457 : && (! INTEGRAL_TYPE_P (TREE_TYPE (decl))
1627 : 38087 : || type_has_mode_precision_p (TREE_TYPE (decl)))
1628 : 8196065 : && wi::umod_trunc (wi::to_offset (TYPE_SIZE (TREE_TYPE (base))),
1629 : 8152920 : BITS_PER_UNIT) == 0)
1630 : 4076460 : return NULL_TREE;
1631 : 43145 : return decl;
1632 : : }
1633 : :
1634 : : /* We cannot rewrite a decl in the base. */
1635 : 233548771 : base = get_base_address (ref);
1636 : 233548771 : if (DECL_P (base))
1637 : : return base;
1638 : :
1639 : : /* We cannot rewrite TARGET_MEM_REFs. */
1640 : 214810852 : else if (TREE_CODE (base) == TARGET_MEM_REF
1641 : 214810852 : && TREE_CODE (TREE_OPERAND (base, 0)) == ADDR_EXPR)
1642 : : {
1643 : 0 : tree decl = TREE_OPERAND (TREE_OPERAND (base, 0), 0);
1644 : 0 : if (! DECL_P (decl))
1645 : : return NULL_TREE;
1646 : : return decl;
1647 : : }
1648 : :
1649 : : return NULL_TREE;
1650 : : }
1651 : :
1652 : : /* For an lvalue tree LHS return true if it cannot be rewritten into SSA form.
1653 : : Otherwise return true. */
1654 : :
1655 : : static bool
1656 : 93975474 : non_rewritable_lvalue_p (tree lhs)
1657 : : {
1658 : : /* A plain decl is always rewritable. */
1659 : 93975474 : if (DECL_P (lhs))
1660 : : return false;
1661 : :
1662 : : /* We can re-write REALPART_EXPR and IMAGPART_EXPR sets in
1663 : : a reasonably efficient manner... */
1664 : 56548436 : if ((TREE_CODE (lhs) == REALPART_EXPR
1665 : 56548436 : || TREE_CODE (lhs) == IMAGPART_EXPR)
1666 : 56548436 : && DECL_P (TREE_OPERAND (lhs, 0)))
1667 : : return false;
1668 : :
1669 : : /* ??? The following could be relaxed allowing component
1670 : : references that do not change the access size. */
1671 : 56518831 : if (TREE_CODE (lhs) == MEM_REF
1672 : 56518831 : && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR)
1673 : : {
1674 : 6870229 : tree decl = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0);
1675 : :
1676 : : /* A decl that is wrapped inside a MEM-REF that covers
1677 : : it full is also rewritable. */
1678 : 6870229 : if (integer_zerop (TREE_OPERAND (lhs, 1))
1679 : 2933079 : && DECL_P (decl)
1680 : 2933079 : && DECL_SIZE (decl) == TYPE_SIZE (TREE_TYPE (lhs))
1681 : : /* If the dynamic type of the decl has larger precision than
1682 : : the decl itself we can't use the decls type for SSA rewriting. */
1683 : 1532931 : && ((! INTEGRAL_TYPE_P (TREE_TYPE (decl))
1684 : 9361 : || compare_tree_int (DECL_SIZE (decl),
1685 : 9361 : TYPE_PRECISION (TREE_TYPE (decl))) == 0)
1686 : 805 : || (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
1687 : 784 : && (TYPE_PRECISION (TREE_TYPE (decl))
1688 : 784 : >= TYPE_PRECISION (TREE_TYPE (lhs)))))
1689 : : /* Make sure we are not re-writing non-float copying into float
1690 : : copying as that can incur normalization. */
1691 : 1532806 : && (! FLOAT_TYPE_P (TREE_TYPE (decl))
1692 : 5468 : || types_compatible_p (TREE_TYPE (lhs), TREE_TYPE (decl)))
1693 : 8398451 : && (TREE_THIS_VOLATILE (decl) == TREE_THIS_VOLATILE (lhs)))
1694 : : return false;
1695 : :
1696 : : /* A vector-insert using a MEM_REF or ARRAY_REF is rewritable
1697 : : using a BIT_INSERT_EXPR. */
1698 : 5342742 : if (DECL_P (decl)
1699 : 5342736 : && VECTOR_TYPE_P (TREE_TYPE (decl))
1700 : 1742 : && TYPE_MODE (TREE_TYPE (decl)) != BLKmode
1701 : 260 : && known_ge (mem_ref_offset (lhs), 0)
1702 : 225 : && known_gt (wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (decl))),
1703 : : mem_ref_offset (lhs))
1704 : 225 : && multiple_p (mem_ref_offset (lhs),
1705 : 225 : wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (lhs))))
1706 : 10685478 : && known_ge (wi::to_poly_offset (TYPE_SIZE (TREE_TYPE (decl))),
1707 : : wi::to_poly_offset (TYPE_SIZE (TREE_TYPE (lhs)))))
1708 : : {
1709 : 224 : poly_uint64 lhs_bits, nelts;
1710 : 224 : if (poly_int_tree_p (TYPE_SIZE (TREE_TYPE (lhs)), &lhs_bits)
1711 : 226 : && multiple_p (lhs_bits,
1712 : : tree_to_uhwi
1713 : 224 : (TYPE_SIZE (TREE_TYPE (TREE_TYPE (decl)))),
1714 : : &nelts)
1715 : 250 : && valid_vector_subparts_p (nelts))
1716 : : {
1717 : 198 : if (known_eq (nelts, 1u))
1718 : 198 : return false;
1719 : : /* For sub-vector inserts the insert vector mode has to be
1720 : : supported. */
1721 : 143 : tree vtype = build_vector_type (TREE_TYPE (TREE_TYPE (decl)),
1722 : : nelts);
1723 : 143 : if (TYPE_MODE (vtype) != BLKmode)
1724 : : return false;
1725 : : }
1726 : : }
1727 : : }
1728 : :
1729 : : /* A vector-insert using a BIT_FIELD_REF is rewritable using
1730 : : BIT_INSERT_EXPR. */
1731 : 54991146 : if (TREE_CODE (lhs) == BIT_FIELD_REF
1732 : 20224 : && DECL_P (TREE_OPERAND (lhs, 0))
1733 : 13340 : && VECTOR_TYPE_P (TREE_TYPE (TREE_OPERAND (lhs, 0)))
1734 : 13260 : && TYPE_MODE (TREE_TYPE (TREE_OPERAND (lhs, 0))) != BLKmode
1735 : 1342 : && operand_equal_p (TYPE_SIZE_UNIT (TREE_TYPE (lhs)),
1736 : 1342 : TYPE_SIZE_UNIT
1737 : : (TREE_TYPE (TREE_TYPE (TREE_OPERAND (lhs, 0)))), 0)
1738 : 54992482 : && (tree_to_uhwi (TREE_OPERAND (lhs, 2))
1739 : 1336 : % tree_to_uhwi (TYPE_SIZE (TREE_TYPE (lhs)))) == 0)
1740 : : return false;
1741 : :
1742 : : return true;
1743 : : }
1744 : :
1745 : : /* When possible, clear TREE_ADDRESSABLE bit, set or clear DECL_NOT_GIMPLE_REG_P
1746 : : and mark the variable VAR for conversion into SSA. Return true when updating
1747 : : stmts is required. */
1748 : :
1749 : : static void
1750 : 96923743 : maybe_optimize_var (tree var, bitmap addresses_taken, bitmap not_reg_needs,
1751 : : bitmap suitable_for_renaming)
1752 : : {
1753 : : /* Global Variables, result decls cannot be changed. */
1754 : 96923743 : if (is_global_var (var)
1755 : 95431891 : || TREE_CODE (var) == RESULT_DECL
1756 : 192355634 : || bitmap_bit_p (addresses_taken, DECL_UID (var)))
1757 : 9380013 : return;
1758 : :
1759 : 87543730 : bool maybe_reg = false;
1760 : 87543730 : if (TREE_ADDRESSABLE (var))
1761 : : {
1762 : 1311467 : TREE_ADDRESSABLE (var) = 0;
1763 : 1311467 : maybe_reg = true;
1764 : 1311467 : if (dump_file)
1765 : : {
1766 : 78 : fprintf (dump_file, "No longer having address taken: ");
1767 : 78 : print_generic_expr (dump_file, var);
1768 : 78 : fprintf (dump_file, "\n");
1769 : : }
1770 : : }
1771 : :
1772 : : /* For register type decls if we do not have any partial defs
1773 : : we cannot express in SSA form mark them as DECL_NOT_GIMPLE_REG_P
1774 : : as to avoid SSA rewrite. For the others go ahead and mark
1775 : : them for renaming. */
1776 : 87543730 : if (is_gimple_reg_type (TREE_TYPE (var)))
1777 : : {
1778 : 72697139 : if (bitmap_bit_p (not_reg_needs, DECL_UID (var)))
1779 : : {
1780 : 31448 : DECL_NOT_GIMPLE_REG_P (var) = 1;
1781 : 31448 : if (dump_file)
1782 : : {
1783 : 5 : fprintf (dump_file, "Has partial defs: ");
1784 : 5 : print_generic_expr (dump_file, var);
1785 : 5 : fprintf (dump_file, "\n");
1786 : : }
1787 : : }
1788 : 72665691 : else if (TREE_CODE (TREE_TYPE (var)) == BITINT_TYPE
1789 : 36375 : && (cfun->curr_properties & PROP_gimple_lbitint) != 0
1790 : 72682637 : && TYPE_PRECISION (TREE_TYPE (var)) > MAX_FIXED_MODE_SIZE)
1791 : : {
1792 : : /* Don't rewrite large/huge _BitInt vars after _BitInt lowering
1793 : : into SSA form. */
1794 : 1084 : DECL_NOT_GIMPLE_REG_P (var) = 1;
1795 : 1084 : if (dump_file)
1796 : : {
1797 : 0 : fprintf (dump_file, "_BitInt var after its lowering: ");
1798 : 0 : print_generic_expr (dump_file, var);
1799 : 0 : fprintf (dump_file, "\n");
1800 : : }
1801 : : }
1802 : 72664607 : else if (DECL_NOT_GIMPLE_REG_P (var))
1803 : : {
1804 : 7438 : maybe_reg = true;
1805 : 7438 : DECL_NOT_GIMPLE_REG_P (var) = 0;
1806 : : }
1807 : 72697139 : if (maybe_reg)
1808 : : {
1809 : 511319 : if (is_gimple_reg (var))
1810 : : {
1811 : 504641 : if (dump_file)
1812 : : {
1813 : 16 : fprintf (dump_file, "Now a gimple register: ");
1814 : 16 : print_generic_expr (dump_file, var);
1815 : 16 : fprintf (dump_file, "\n");
1816 : : }
1817 : 504641 : bitmap_set_bit (suitable_for_renaming, DECL_UID (var));
1818 : : }
1819 : : else
1820 : 6678 : DECL_NOT_GIMPLE_REG_P (var) = 1;
1821 : : }
1822 : : }
1823 : : }
1824 : :
1825 : : /* Return true when STMT is ASAN mark where second argument is an address
1826 : : of a local variable. */
1827 : :
1828 : : static bool
1829 : 53186076 : is_asan_mark_p (gimple *stmt)
1830 : : {
1831 : 53186076 : if (!gimple_call_internal_p (stmt, IFN_ASAN_MARK))
1832 : : return false;
1833 : :
1834 : 42379 : tree addr = get_base_address (gimple_call_arg (stmt, 1));
1835 : 42379 : if (TREE_CODE (addr) == ADDR_EXPR
1836 : 42379 : && VAR_P (TREE_OPERAND (addr, 0)))
1837 : : {
1838 : 42175 : tree var = TREE_OPERAND (addr, 0);
1839 : 42175 : if (lookup_attribute (ASAN_USE_AFTER_SCOPE_ATTRIBUTE,
1840 : 42175 : DECL_ATTRIBUTES (var)))
1841 : : return false;
1842 : :
1843 : 38248 : unsigned addressable = TREE_ADDRESSABLE (var);
1844 : 38248 : TREE_ADDRESSABLE (var) = 0;
1845 : 38248 : bool r = is_gimple_reg (var);
1846 : 38248 : TREE_ADDRESSABLE (var) = addressable;
1847 : 38248 : return r;
1848 : : }
1849 : :
1850 : : return false;
1851 : : }
1852 : :
1853 : : /* Compute TREE_ADDRESSABLE and whether we have unhandled partial defs
1854 : : for local variables. */
1855 : :
1856 : : void
1857 : 11584039 : execute_update_addresses_taken (void)
1858 : : {
1859 : 11584039 : basic_block bb;
1860 : 11584039 : auto_bitmap addresses_taken;
1861 : 11584039 : auto_bitmap not_reg_needs;
1862 : 11584039 : auto_bitmap suitable_for_renaming;
1863 : 11584039 : bool optimistic_not_addressable = false;
1864 : 11584039 : tree var;
1865 : 11584039 : unsigned i;
1866 : :
1867 : 11584039 : timevar_push (TV_ADDRESS_TAKEN);
1868 : :
1869 : : /* Collect into ADDRESSES_TAKEN all variables whose address is taken within
1870 : : the function body. */
1871 : 109950982 : FOR_EACH_BB_FN (bb, cfun)
1872 : : {
1873 : 883660388 : for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
1874 : 686926502 : gsi_next (&gsi))
1875 : : {
1876 : 686926502 : gimple *stmt = gsi_stmt (gsi);
1877 : 686926502 : enum gimple_code code = gimple_code (stmt);
1878 : 686926502 : tree decl;
1879 : :
1880 : 686926502 : if (code == GIMPLE_CALL)
1881 : : {
1882 : 50863229 : if (optimize_atomic_compare_exchange_p (stmt))
1883 : : {
1884 : : /* For __atomic_compare_exchange_N if the second argument
1885 : : is &var, don't mark var addressable;
1886 : : if it becomes non-addressable, we'll rewrite it into
1887 : : ATOMIC_COMPARE_EXCHANGE call. */
1888 : 5869 : tree arg = gimple_call_arg (stmt, 1);
1889 : 5869 : gimple_call_set_arg (stmt, 1, null_pointer_node);
1890 : 5869 : gimple_ior_addresses_taken (addresses_taken, stmt);
1891 : 5869 : gimple_call_set_arg (stmt, 1, arg);
1892 : : /* Remember we have to check again below. */
1893 : 5869 : optimistic_not_addressable = true;
1894 : : }
1895 : 50857360 : else if (is_asan_mark_p (stmt)
1896 : 50857360 : || gimple_call_internal_p (stmt, IFN_GOMP_SIMT_ENTER))
1897 : : ;
1898 : : else
1899 : 50847726 : gimple_ior_addresses_taken (addresses_taken, stmt);
1900 : : }
1901 : : else
1902 : : /* Note all addresses taken by the stmt. */
1903 : 636063273 : gimple_ior_addresses_taken (addresses_taken, stmt);
1904 : :
1905 : : /* If we have a call or an assignment, see if the lhs contains
1906 : : a local decl that requires not to be a gimple register. */
1907 : 686926502 : if (code == GIMPLE_ASSIGN || code == GIMPLE_CALL)
1908 : : {
1909 : 284784348 : tree lhs = gimple_get_lhs (stmt);
1910 : 284784348 : if (lhs
1911 : 254456362 : && TREE_CODE (lhs) != SSA_NAME
1912 : 378738640 : && ((code == GIMPLE_CALL && ! DECL_P (lhs))
1913 : 93851725 : || non_rewritable_lvalue_p (lhs)))
1914 : : {
1915 : 55082784 : decl = get_base_address (lhs);
1916 : 55082784 : if (DECL_P (decl))
1917 : 38097217 : bitmap_set_bit (not_reg_needs, DECL_UID (decl));
1918 : : }
1919 : : }
1920 : :
1921 : 686926502 : if (gimple_assign_single_p (stmt))
1922 : : {
1923 : 159461339 : tree rhs = gimple_assign_rhs1 (stmt);
1924 : 159461339 : if ((decl = non_rewritable_mem_ref_base (rhs)))
1925 : 18818557 : bitmap_set_bit (not_reg_needs, DECL_UID (decl));
1926 : : }
1927 : :
1928 : 527465163 : else if (code == GIMPLE_CALL)
1929 : : {
1930 : 152041781 : for (i = 0; i < gimple_call_num_args (stmt); ++i)
1931 : : {
1932 : 101178552 : tree arg = gimple_call_arg (stmt, i);
1933 : 101178552 : if ((decl = non_rewritable_mem_ref_base (arg)))
1934 : 94181 : bitmap_set_bit (not_reg_needs, DECL_UID (decl));
1935 : : }
1936 : : }
1937 : :
1938 : 476601934 : else if (code == GIMPLE_ASM)
1939 : : {
1940 : 783999 : gasm *asm_stmt = as_a <gasm *> (stmt);
1941 : 1600866 : for (i = 0; i < gimple_asm_noutputs (asm_stmt); ++i)
1942 : : {
1943 : 816867 : tree link = gimple_asm_output_op (asm_stmt, i);
1944 : 816867 : tree lhs = TREE_VALUE (link);
1945 : 816867 : if (TREE_CODE (lhs) != SSA_NAME)
1946 : : {
1947 : 192544 : decl = get_base_address (lhs);
1948 : 192544 : if (DECL_P (decl)
1949 : 192544 : && (non_rewritable_lvalue_p (lhs)
1950 : : /* We cannot move required conversions from
1951 : : the lhs to the rhs in asm statements, so
1952 : : require we do not need any. */
1953 : 114156 : || !useless_type_conversion_p
1954 : 114156 : (TREE_TYPE (lhs), TREE_TYPE (decl))))
1955 : 10123 : bitmap_set_bit (not_reg_needs, DECL_UID (decl));
1956 : : }
1957 : : }
1958 : 1256870 : for (i = 0; i < gimple_asm_ninputs (asm_stmt); ++i)
1959 : : {
1960 : 472871 : tree link = gimple_asm_input_op (asm_stmt, i);
1961 : 472871 : if ((decl = non_rewritable_mem_ref_base (TREE_VALUE (link))))
1962 : 2294 : bitmap_set_bit (not_reg_needs, DECL_UID (decl));
1963 : : }
1964 : : }
1965 : : }
1966 : :
1967 : 131880456 : for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
1968 : 33513513 : gsi_next (&gsi))
1969 : : {
1970 : 33513513 : size_t i;
1971 : 33513513 : gphi *phi = gsi.phi ();
1972 : :
1973 : 118469813 : for (i = 0; i < gimple_phi_num_args (phi); i++)
1974 : : {
1975 : 84956300 : tree op = PHI_ARG_DEF (phi, i), var;
1976 : 84956300 : if (TREE_CODE (op) == ADDR_EXPR
1977 : 713677 : && (var = get_base_address (TREE_OPERAND (op, 0))) != NULL
1978 : 85669977 : && DECL_P (var))
1979 : 516205 : bitmap_set_bit (addresses_taken, DECL_UID (var));
1980 : : }
1981 : : }
1982 : : }
1983 : :
1984 : : /* We cannot iterate over all referenced vars because that can contain
1985 : : unused vars from BLOCK trees, which causes code generation differences
1986 : : for -g vs. -g0. */
1987 : 36064661 : for (var = DECL_ARGUMENTS (cfun->decl); var; var = DECL_CHAIN (var))
1988 : 24480622 : maybe_optimize_var (var, addresses_taken, not_reg_needs,
1989 : : suitable_for_renaming);
1990 : :
1991 : 84027160 : FOR_EACH_VEC_SAFE_ELT (cfun->local_decls, i, var)
1992 : 72443121 : maybe_optimize_var (var, addresses_taken, not_reg_needs,
1993 : : suitable_for_renaming);
1994 : :
1995 : : /* Operand caches need to be recomputed for operands referencing the updated
1996 : : variables and operands need to be rewritten to expose bare symbols. */
1997 : 11584039 : if (!bitmap_empty_p (suitable_for_renaming)
1998 : 11584039 : || optimistic_not_addressable)
1999 : : {
2000 : 5343482 : FOR_EACH_BB_FN (bb, cfun)
2001 : 46244267 : for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);)
2002 : : {
2003 : 35932503 : gimple *stmt = gsi_stmt (gsi);
2004 : :
2005 : : /* Re-write TARGET_MEM_REFs of symbols we want to
2006 : : rewrite into SSA form. */
2007 : 35932503 : if (gimple_assign_single_p (stmt))
2008 : : {
2009 : 11733531 : tree lhs = gimple_assign_lhs (stmt);
2010 : 11733531 : tree rhs, *rhsp = gimple_assign_rhs1_ptr (stmt);
2011 : 11733531 : tree sym;
2012 : :
2013 : : /* Rewrite LHS IMAG/REALPART_EXPR similar to
2014 : : gimplify_modify_expr_complex_part. */
2015 : 11733531 : if ((TREE_CODE (lhs) == IMAGPART_EXPR
2016 : 11733531 : || TREE_CODE (lhs) == REALPART_EXPR)
2017 : 2190 : && DECL_P (TREE_OPERAND (lhs, 0))
2018 : 11734980 : && bitmap_bit_p (suitable_for_renaming,
2019 : 1449 : DECL_UID (TREE_OPERAND (lhs, 0))))
2020 : : {
2021 : 1379 : tree other = make_ssa_name (TREE_TYPE (lhs));
2022 : 2068 : tree lrhs = build1 (TREE_CODE (lhs) == IMAGPART_EXPR
2023 : : ? REALPART_EXPR : IMAGPART_EXPR,
2024 : 1379 : TREE_TYPE (other),
2025 : 1379 : TREE_OPERAND (lhs, 0));
2026 : 1379 : suppress_warning (lrhs);
2027 : 1379 : gimple *load = gimple_build_assign (other, lrhs);
2028 : 1379 : location_t loc = gimple_location (stmt);
2029 : 1379 : gimple_set_location (load, loc);
2030 : 2758 : gimple_set_vuse (load, gimple_vuse (stmt));
2031 : 1379 : gsi_insert_before (&gsi, load, GSI_SAME_STMT);
2032 : 1379 : gimple_assign_set_lhs (stmt, TREE_OPERAND (lhs, 0));
2033 : 1379 : gimple_assign_set_rhs_with_ops
2034 : 2068 : (&gsi, COMPLEX_EXPR,
2035 : : TREE_CODE (lhs) == IMAGPART_EXPR
2036 : 689 : ? other : gimple_assign_rhs1 (stmt),
2037 : 1379 : TREE_CODE (lhs) == IMAGPART_EXPR
2038 : 690 : ? gimple_assign_rhs1 (stmt) : other, NULL_TREE);
2039 : 1379 : stmt = gsi_stmt (gsi);
2040 : 1379 : unlink_stmt_vdef (stmt);
2041 : 1379 : update_stmt (stmt);
2042 : 1379 : continue;
2043 : 1379 : }
2044 : :
2045 : : /* Rewrite a vector insert via a BIT_FIELD_REF on the LHS
2046 : : into a BIT_INSERT_EXPR. */
2047 : 11732152 : if (TREE_CODE (lhs) == BIT_FIELD_REF
2048 : 670 : && DECL_P (TREE_OPERAND (lhs, 0))
2049 : 614 : && bitmap_bit_p (suitable_for_renaming,
2050 : 614 : DECL_UID (TREE_OPERAND (lhs, 0)))
2051 : 536 : && VECTOR_TYPE_P (TREE_TYPE (TREE_OPERAND (lhs, 0)))
2052 : 536 : && TYPE_MODE (TREE_TYPE (TREE_OPERAND (lhs, 0))) != BLKmode
2053 : 536 : && operand_equal_p (TYPE_SIZE_UNIT (TREE_TYPE (lhs)),
2054 : 536 : TYPE_SIZE_UNIT (TREE_TYPE
2055 : : (TREE_TYPE (TREE_OPERAND (lhs, 0)))),
2056 : : 0)
2057 : 11732688 : && (tree_to_uhwi (TREE_OPERAND (lhs, 2))
2058 : 536 : % tree_to_uhwi (TYPE_SIZE (TREE_TYPE (lhs))) == 0))
2059 : : {
2060 : 536 : tree var = TREE_OPERAND (lhs, 0);
2061 : 536 : tree val = gimple_assign_rhs1 (stmt);
2062 : 536 : if (! types_compatible_p (TREE_TYPE (TREE_TYPE (var)),
2063 : 536 : TREE_TYPE (val)))
2064 : : {
2065 : 0 : tree tem = make_ssa_name (TREE_TYPE (TREE_TYPE (var)));
2066 : 0 : gimple *pun
2067 : 0 : = gimple_build_assign (tem,
2068 : : build1 (VIEW_CONVERT_EXPR,
2069 : 0 : TREE_TYPE (tem), val));
2070 : 0 : gsi_insert_before (&gsi, pun, GSI_SAME_STMT);
2071 : 0 : val = tem;
2072 : : }
2073 : 536 : tree bitpos = TREE_OPERAND (lhs, 2);
2074 : 536 : gimple_assign_set_lhs (stmt, var);
2075 : 536 : gimple_assign_set_rhs_with_ops
2076 : 536 : (&gsi, BIT_INSERT_EXPR, var, val, bitpos);
2077 : 536 : stmt = gsi_stmt (gsi);
2078 : 536 : unlink_stmt_vdef (stmt);
2079 : 536 : update_stmt (stmt);
2080 : 536 : continue;
2081 : 536 : }
2082 : :
2083 : : /* Rewrite a vector insert using a MEM_REF on the LHS
2084 : : into a BIT_INSERT_EXPR. */
2085 : 11731616 : if (TREE_CODE (lhs) == MEM_REF
2086 : 605189 : && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR
2087 : 201206 : && (sym = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0))
2088 : 201206 : && DECL_P (sym)
2089 : 201206 : && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym))
2090 : 6405 : && VECTOR_TYPE_P (TREE_TYPE (sym))
2091 : 130 : && TYPE_MODE (TREE_TYPE (sym)) != BLKmode
2092 : : /* If it is a full replacement we can do better below. */
2093 : 128 : && maybe_ne (wi::to_poly_offset
2094 : 128 : (TYPE_SIZE_UNIT (TREE_TYPE (lhs))),
2095 : : wi::to_poly_offset
2096 : 128 : (TYPE_SIZE_UNIT (TREE_TYPE (sym))))
2097 : 79 : && known_ge (mem_ref_offset (lhs), 0)
2098 : 79 : && known_gt (wi::to_poly_offset
2099 : : (TYPE_SIZE_UNIT (TREE_TYPE (sym))),
2100 : : mem_ref_offset (lhs))
2101 : 11731695 : && multiple_p (mem_ref_offset (lhs),
2102 : : wi::to_poly_offset
2103 : 11731616 : (TYPE_SIZE_UNIT (TREE_TYPE (lhs)))))
2104 : : {
2105 : 79 : tree val = gimple_assign_rhs1 (stmt);
2106 : 79 : if (! types_compatible_p (TREE_TYPE (val),
2107 : 79 : TREE_TYPE (TREE_TYPE (sym))))
2108 : : {
2109 : 56 : poly_uint64 lhs_bits, nelts;
2110 : 56 : tree temtype = TREE_TYPE (TREE_TYPE (sym));
2111 : 56 : if (poly_int_tree_p (TYPE_SIZE (TREE_TYPE (lhs)),
2112 : : &lhs_bits)
2113 : 56 : && multiple_p (lhs_bits,
2114 : : tree_to_uhwi
2115 : 56 : (TYPE_SIZE (TREE_TYPE
2116 : : (TREE_TYPE (sym)))),
2117 : : &nelts)
2118 : 56 : && maybe_ne (nelts, 1u)
2119 : 56 : && valid_vector_subparts_p (nelts))
2120 : 30 : temtype = build_vector_type (temtype, nelts);
2121 : 56 : tree tem = make_ssa_name (temtype);
2122 : 56 : gimple *pun
2123 : 56 : = gimple_build_assign (tem,
2124 : : build1 (VIEW_CONVERT_EXPR,
2125 : 56 : TREE_TYPE (tem), val));
2126 : 56 : gsi_insert_before (&gsi, pun, GSI_SAME_STMT);
2127 : 56 : val = tem;
2128 : : }
2129 : 79 : tree bitpos
2130 : 79 : = wide_int_to_tree (bitsizetype,
2131 : 79 : mem_ref_offset (lhs) * BITS_PER_UNIT);
2132 : 79 : gimple_assign_set_lhs (stmt, sym);
2133 : 79 : gimple_assign_set_rhs_with_ops
2134 : 79 : (&gsi, BIT_INSERT_EXPR, sym, val, bitpos);
2135 : 79 : stmt = gsi_stmt (gsi);
2136 : 79 : unlink_stmt_vdef (stmt);
2137 : 79 : update_stmt (stmt);
2138 : 79 : continue;
2139 : 79 : }
2140 : :
2141 : : /* We shouldn't have any fancy wrapping of
2142 : : component-refs on the LHS, but look through
2143 : : VIEW_CONVERT_EXPRs as that is easy. */
2144 : 11731537 : while (TREE_CODE (lhs) == VIEW_CONVERT_EXPR)
2145 : 0 : lhs = TREE_OPERAND (lhs, 0);
2146 : 11731537 : if (TREE_CODE (lhs) == MEM_REF
2147 : 605110 : && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR
2148 : 201127 : && integer_zerop (TREE_OPERAND (lhs, 1))
2149 : 136985 : && (sym = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0))
2150 : 136985 : && DECL_P (sym)
2151 : 136985 : && !TREE_ADDRESSABLE (sym)
2152 : 11795024 : && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym)))
2153 : : lhs = sym;
2154 : : else
2155 : 11725211 : lhs = gimple_assign_lhs (stmt);
2156 : :
2157 : : /* Rewrite the RHS and make sure the resulting assignment
2158 : : is validly typed. */
2159 : 11731537 : maybe_rewrite_mem_ref_base (rhsp, suitable_for_renaming);
2160 : 11731537 : rhs = gimple_assign_rhs1 (stmt);
2161 : 11731537 : if (gimple_assign_lhs (stmt) != lhs
2162 : 11737863 : && !useless_type_conversion_p (TREE_TYPE (lhs),
2163 : 6326 : TREE_TYPE (rhs)))
2164 : : {
2165 : 3292 : if (gimple_clobber_p (stmt))
2166 : : {
2167 : 5 : rhs = build_constructor (TREE_TYPE (lhs), NULL);
2168 : 5 : TREE_THIS_VOLATILE (rhs) = 1;
2169 : : }
2170 : : else
2171 : 3287 : rhs = fold_build1 (VIEW_CONVERT_EXPR,
2172 : : TREE_TYPE (lhs), rhs);
2173 : : }
2174 : 11731537 : if (gimple_assign_lhs (stmt) != lhs)
2175 : 6326 : gimple_assign_set_lhs (stmt, lhs);
2176 : :
2177 : 11731537 : if (gimple_assign_rhs1 (stmt) != rhs)
2178 : : {
2179 : 3292 : gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
2180 : 3292 : gimple_assign_set_rhs_from_tree (&gsi, rhs);
2181 : : }
2182 : : }
2183 : :
2184 : 24198972 : else if (gimple_code (stmt) == GIMPLE_CALL)
2185 : : {
2186 : 2334585 : unsigned i;
2187 : 2334585 : if (optimize_atomic_compare_exchange_p (stmt))
2188 : : {
2189 : 5869 : tree expected = gimple_call_arg (stmt, 1);
2190 : 5869 : tree decl = TREE_OPERAND (expected, 0);
2191 : 5869 : if (bitmap_bit_p (suitable_for_renaming, DECL_UID (decl)))
2192 : : {
2193 : 5753 : fold_builtin_atomic_compare_exchange (&gsi);
2194 : 5753 : continue;
2195 : : }
2196 : 116 : else if (!TREE_ADDRESSABLE (decl))
2197 : : /* If there are partial defs of the decl we may
2198 : : have cleared the addressable bit but set
2199 : : DECL_NOT_GIMPLE_REG_P. We have to restore
2200 : : TREE_ADDRESSABLE here. */
2201 : 36 : TREE_ADDRESSABLE (decl) = 1;
2202 : : }
2203 : 2328716 : else if (is_asan_mark_p (stmt))
2204 : : {
2205 : 332 : tree var = TREE_OPERAND (gimple_call_arg (stmt, 1), 0);
2206 : 332 : if (bitmap_bit_p (suitable_for_renaming, DECL_UID (var)))
2207 : : {
2208 : 284 : unlink_stmt_vdef (stmt);
2209 : 284 : if (asan_mark_p (stmt, ASAN_MARK_POISON))
2210 : : {
2211 : 147 : gcall *call
2212 : 147 : = gimple_build_call_internal (IFN_ASAN_POISON, 0);
2213 : 147 : gimple_call_set_lhs (call, var);
2214 : 147 : gsi_replace (&gsi, call, true);
2215 : : }
2216 : : else
2217 : : {
2218 : : /* In ASAN_MARK (UNPOISON, &b, ...) the variable
2219 : : is uninitialized. Avoid dependencies on
2220 : : previous out of scope value. */
2221 : 137 : tree clobber = build_clobber (TREE_TYPE (var));
2222 : 137 : gimple *g = gimple_build_assign (var, clobber);
2223 : 137 : gsi_replace (&gsi, g, true);
2224 : : }
2225 : 284 : continue;
2226 : 284 : }
2227 : : }
2228 : 2328384 : else if (gimple_call_internal_p (stmt, IFN_GOMP_SIMT_ENTER))
2229 : 0 : for (i = 1; i < gimple_call_num_args (stmt); i++)
2230 : : {
2231 : 0 : tree *argp = gimple_call_arg_ptr (stmt, i);
2232 : 0 : if (*argp == null_pointer_node)
2233 : 0 : continue;
2234 : 0 : gcc_assert (TREE_CODE (*argp) == ADDR_EXPR
2235 : : && VAR_P (TREE_OPERAND (*argp, 0)));
2236 : 0 : tree var = TREE_OPERAND (*argp, 0);
2237 : 0 : if (bitmap_bit_p (suitable_for_renaming, DECL_UID (var)))
2238 : 0 : *argp = null_pointer_node;
2239 : : }
2240 : 6547495 : for (i = 0; i < gimple_call_num_args (stmt); ++i)
2241 : : {
2242 : 4218947 : tree *argp = gimple_call_arg_ptr (stmt, i);
2243 : 4218947 : maybe_rewrite_mem_ref_base (argp, suitable_for_renaming);
2244 : : }
2245 : : }
2246 : :
2247 : 21864387 : else if (gimple_code (stmt) == GIMPLE_ASM)
2248 : : {
2249 : 18304 : gasm *asm_stmt = as_a <gasm *> (stmt);
2250 : 18304 : unsigned i;
2251 : 72151 : for (i = 0; i < gimple_asm_noutputs (asm_stmt); ++i)
2252 : : {
2253 : 53847 : tree link = gimple_asm_output_op (asm_stmt, i);
2254 : 53847 : maybe_rewrite_mem_ref_base (&TREE_VALUE (link),
2255 : : suitable_for_renaming);
2256 : : }
2257 : 38110 : for (i = 0; i < gimple_asm_ninputs (asm_stmt); ++i)
2258 : : {
2259 : 19806 : tree link = gimple_asm_input_op (asm_stmt, i);
2260 : 19806 : maybe_rewrite_mem_ref_base (&TREE_VALUE (link),
2261 : : suitable_for_renaming);
2262 : : }
2263 : : }
2264 : :
2265 : 21846083 : else if (gimple_debug_bind_p (stmt)
2266 : 16670344 : && gimple_debug_bind_has_value_p (stmt))
2267 : : {
2268 : 6583865 : tree *valuep = gimple_debug_bind_get_value_ptr (stmt);
2269 : 6583865 : tree decl;
2270 : 6583865 : maybe_rewrite_mem_ref_base (valuep, suitable_for_renaming);
2271 : 6583865 : decl = non_rewritable_mem_ref_base (*valuep);
2272 : 6583865 : if (decl
2273 : 6583865 : && bitmap_bit_p (suitable_for_renaming, DECL_UID (decl)))
2274 : 12 : gimple_debug_bind_reset_value (stmt);
2275 : : }
2276 : :
2277 : 48635927 : if (gimple_references_memory_p (stmt)
2278 : 31356344 : || is_gimple_debug (stmt))
2279 : 21238472 : update_stmt (stmt);
2280 : :
2281 : 35924472 : gsi_next (&gsi);
2282 : : }
2283 : :
2284 : : /* Update SSA form here, we are called as non-pass as well. */
2285 : 187600 : if (number_of_loops (cfun) > 1
2286 : 187600 : && loops_state_satisfies_p (LOOP_CLOSED_SSA))
2287 : 47 : rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
2288 : : else
2289 : 187553 : update_ssa (TODO_update_ssa);
2290 : : }
2291 : :
2292 : 11584039 : timevar_pop (TV_ADDRESS_TAKEN);
2293 : 11584039 : }
2294 : :
2295 : : namespace {
2296 : :
2297 : : const pass_data pass_data_update_address_taken =
2298 : : {
2299 : : GIMPLE_PASS, /* type */
2300 : : "addressables", /* name */
2301 : : OPTGROUP_NONE, /* optinfo_flags */
2302 : : TV_ADDRESS_TAKEN, /* tv_id */
2303 : : PROP_ssa, /* properties_required */
2304 : : 0, /* properties_provided */
2305 : : 0, /* properties_destroyed */
2306 : : 0, /* todo_flags_start */
2307 : : TODO_update_address_taken, /* todo_flags_finish */
2308 : : };
2309 : :
2310 : : class pass_update_address_taken : public gimple_opt_pass
2311 : : {
2312 : : public:
2313 : 0 : pass_update_address_taken (gcc::context *ctxt)
2314 : 0 : : gimple_opt_pass (pass_data_update_address_taken, ctxt)
2315 : : {}
2316 : :
2317 : : /* opt_pass methods: */
2318 : :
2319 : : }; // class pass_update_address_taken
2320 : :
2321 : : } // anon namespace
2322 : :
2323 : : gimple_opt_pass *
2324 : 0 : make_pass_update_address_taken (gcc::context *ctxt)
2325 : : {
2326 : 0 : return new pass_update_address_taken (ctxt);
2327 : : }
|