Line data Source code
1 : /* Miscellaneous SSA utility functions.
2 : Copyright (C) 2001-2026 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 12027882 : redirect_edge_var_map_add (edge e, tree result, tree def, location_t locus)
56 : {
57 12027882 : edge_var_map new_node;
58 :
59 12027882 : if (edge_var_maps == NULL)
60 68248 : edge_var_maps = new hash_map<edge, auto_vec<edge_var_map> >;
61 :
62 12027882 : auto_vec<edge_var_map> &slot = edge_var_maps->get_or_insert (e);
63 12027882 : new_node.def = def;
64 12027882 : new_node.result = result;
65 12027882 : new_node.locus = locus;
66 :
67 12027882 : slot.safe_push (new_node);
68 12027882 : }
69 :
70 :
71 : /* Clear the var mappings in edge E. */
72 :
73 : void
74 140553126 : redirect_edge_var_map_clear (edge e)
75 : {
76 140553126 : if (!edge_var_maps)
77 : return;
78 :
79 124945015 : auto_vec<edge_var_map> *head = edge_var_maps->get (e);
80 :
81 124945015 : if (head)
82 10568457 : 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 420906 : redirect_edge_var_map_dup (edge newe, edge olde)
94 : {
95 420906 : if (!edge_var_maps)
96 : return;
97 :
98 392029 : auto_vec<edge_var_map> *new_head = &edge_var_maps->get_or_insert (newe);
99 392029 : auto_vec<edge_var_map> *old_head = edge_var_maps->get (olde);
100 392029 : if (!old_head)
101 : return;
102 :
103 7859 : 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 8302010 : redirect_edge_var_map_vector (edge e)
112 : {
113 : /* Hey, what kind of idiot would... you'd be surprised. */
114 8302010 : if (!edge_var_maps)
115 : return NULL;
116 :
117 8275182 : auto_vec<edge_var_map> *slot = edge_var_maps->get (e);
118 8275182 : if (!slot)
119 : return NULL;
120 :
121 : return slot;
122 : }
123 :
124 : /* Clear the edge variable mappings. */
125 :
126 : void
127 972775337 : redirect_edge_var_map_empty (void)
128 : {
129 972775337 : if (edge_var_maps)
130 245318884 : edge_var_maps->empty ();
131 972775337 : }
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 64004215 : ssa_redirect_edge (edge e, basic_block dest)
141 : {
142 64004215 : gphi_iterator gsi;
143 64004215 : gphi *phi;
144 :
145 64004215 : 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 64004215 : if (! (e->dest->flags & BB_DUPLICATED))
151 74750496 : for (gsi = gsi_start_phis (e->dest); !gsi_end_p (gsi); gsi_next (&gsi))
152 : {
153 12655384 : tree def;
154 12655384 : location_t locus;
155 :
156 12655384 : phi = gsi.phi ();
157 12655384 : def = gimple_phi_arg_def (phi, e->dest_idx);
158 12655384 : locus = gimple_phi_arg_location (phi, e->dest_idx);
159 :
160 12655384 : if (def == NULL_TREE)
161 1525682 : continue;
162 :
163 11129702 : redirect_edge_var_map_add (e, gimple_phi_result (phi), def, locus);
164 : }
165 :
166 64004215 : e = redirect_edge_succ_nodup (e, dest);
167 :
168 64004215 : 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 3346212 : flush_pending_stmts (edge e)
177 : {
178 3346212 : gphi *phi;
179 3346212 : edge_var_map *vm;
180 3346212 : int i;
181 3346212 : gphi_iterator gsi;
182 :
183 3346212 : vec<edge_var_map> *v = redirect_edge_var_map_vector (e);
184 3346212 : if (!v)
185 342594 : return;
186 :
187 3003618 : for (gsi = gsi_start_phis (e->dest), i = 0;
188 8291584 : !gsi_end_p (gsi) && v->iterate (i, &vm);
189 5287966 : gsi_next (&gsi), i++)
190 : {
191 5287966 : tree def;
192 :
193 5287966 : phi = gsi.phi ();
194 5287966 : def = redirect_edge_var_map_def (vm);
195 5287966 : add_phi_arg (phi, def, e, redirect_edge_var_map_location (vm));
196 : }
197 :
198 3003618 : 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 63 : gimple_replace_ssa_lhs (gimple *stmt, tree nlhs)
222 : {
223 63 : if (MAY_HAVE_DEBUG_BIND_STMTS)
224 : {
225 0 : tree lhs = gimple_get_lhs (stmt);
226 :
227 0 : gcc_assert (SSA_NAME_DEF_STMT (lhs) == stmt);
228 :
229 0 : insert_debug_temp_for_var_def (NULL, lhs);
230 : }
231 :
232 63 : gimple_set_lhs (stmt, nlhs);
233 63 : }
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 349487818 : target_for_debug_bind (tree var)
244 : {
245 349489851 : if (!MAY_HAVE_DEBUG_BIND_STMTS)
246 : return NULL_TREE;
247 :
248 328346197 : if (TREE_CODE (var) == SSA_NAME)
249 : {
250 16120124 : var = SSA_NAME_VAR (var);
251 : if (var == NULL_TREE)
252 : return NULL_TREE;
253 : }
254 :
255 275762292 : if ((!VAR_P (var) || VAR_DECL_IS_VIRTUAL_OPERAND (var))
256 336261772 : && TREE_CODE (var) != PARM_DECL)
257 : return NULL_TREE;
258 :
259 275502256 : if (DECL_HAS_VALUE_EXPR_P (var))
260 2033 : return target_for_debug_bind (DECL_VALUE_EXPR (var));
261 :
262 275500223 : if (DECL_IGNORED_P (var))
263 : return NULL_TREE;
264 :
265 : /* var-tracking only tracks registers. */
266 253610354 : if (!is_gimple_reg_type (TREE_TYPE (var)))
267 8912085 : 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 11007962 : find_released_ssa_name (tree *tp, int *walk_subtrees, void *data_)
277 : {
278 11007962 : struct walk_stmt_info *wi = (struct walk_stmt_info *) data_;
279 :
280 11007962 : if (wi && wi->is_lhs)
281 : return NULL_TREE;
282 :
283 10979498 : if (TREE_CODE (*tp) == SSA_NAME)
284 : {
285 1774660 : if (SSA_NAME_IN_FREE_LIST (*tp))
286 : return *tp;
287 :
288 1765017 : *walk_subtrees = 0;
289 : }
290 9204838 : else if (IS_TYPE_OR_DECL_P (*tp))
291 37039 : *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 89074108 : insert_debug_temp_for_var_def (gimple_stmt_iterator *gsi, tree var)
302 : {
303 89074108 : imm_use_iterator imm_iter;
304 89074108 : use_operand_p use_p;
305 89074108 : gimple *stmt;
306 89074108 : gimple *def_stmt = NULL;
307 89074108 : int usecount = 0;
308 89074108 : tree value = NULL;
309 :
310 89074108 : if (!MAY_HAVE_DEBUG_BIND_STMTS)
311 85691364 : 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 89074108 : 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 187489391 : FOR_EACH_IMM_USE_FAST (use_p, imm_iter, var)
321 : {
322 11498733 : stmt = USE_STMT (use_p);
323 :
324 11498733 : if (!gimple_debug_bind_p (stmt))
325 7646953 : continue;
326 :
327 3851780 : if (usecount++)
328 : break;
329 :
330 3382744 : 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 88567790 : }
339 :
340 88567790 : if (!usecount)
341 : return;
342 :
343 3382744 : if (gsi)
344 2977622 : def_stmt = gsi_stmt (*gsi);
345 : else
346 405122 : 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 3382744 : if (gimple_code (def_stmt) == GIMPLE_PHI)
352 : {
353 163453 : value = degenerate_phi_result (as_a <gphi *> (def_stmt));
354 163453 : if (value && walk_tree (&value, find_released_ssa_name, NULL, NULL))
355 132 : value = NULL;
356 : /* error_mark_node is what fixup_noreturn_call changes PHI arguments
357 : to. */
358 163321 : else if (value == error_mark_node)
359 0 : value = NULL;
360 : }
361 3219291 : 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 1274499 : value = NULL;
366 1944792 : else if (is_gimple_assign (def_stmt))
367 : {
368 1882935 : bool no_value = false;
369 :
370 1882935 : if (!dom_info_available_p (CDI_DOMINATORS))
371 : {
372 37975 : struct walk_stmt_info wi;
373 :
374 37975 : 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 37942 : if ((!gsi && !gimple_bb (def_stmt))
403 75917 : || walk_gimple_op (def_stmt, find_released_ssa_name, &wi))
404 9511 : no_value = true;
405 : }
406 :
407 37975 : if (!no_value)
408 1873424 : value = gimple_assign_rhs_to_tree (def_stmt);
409 : }
410 :
411 3382744 : 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 1900911 : if (usecount == 1
427 1043023 : || gimple_code (def_stmt) == GIMPLE_PHI
428 1034599 : || CONSTANT_CLASS_P (value)
429 2934396 : || is_gimple_reg (value))
430 : ;
431 : else
432 : {
433 1032033 : gdebug *def_temp;
434 1032033 : tree vexpr = build_debug_expr_decl (TREE_TYPE (value));
435 :
436 1032033 : def_temp = gimple_build_debug_bind (vexpr,
437 : unshare_expr (value),
438 : def_stmt);
439 :
440 : /* FIXME: Is setting the mode really necessary? */
441 1032033 : if (DECL_P (value))
442 2797 : SET_DECL_MODE (vexpr, DECL_MODE (value));
443 : else
444 1029236 : SET_DECL_MODE (vexpr, TYPE_MODE (TREE_TYPE (value)));
445 :
446 1032033 : if (gsi)
447 819631 : gsi_insert_before (gsi, def_temp, GSI_SAME_STMT);
448 : else
449 : {
450 212402 : gimple_stmt_iterator ngsi = gsi_for_stmt (def_stmt);
451 212402 : gsi_insert_before (&ngsi, def_temp, GSI_SAME_STMT);
452 : }
453 :
454 1032033 : value = vexpr;
455 : }
456 : }
457 :
458 13047120 : FOR_EACH_IMM_USE_STMT (stmt, imm_iter, var)
459 : {
460 6281632 : if (!gimple_debug_bind_p (stmt))
461 861843 : continue;
462 :
463 5419789 : if (value)
464 : {
465 11390494 : FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
466 3796983 : 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 3796528 : if (TREE_CODE (value) != DEBUG_EXPR_DECL)
470 : {
471 890029 : gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
472 890029 : fold_stmt_inplace (&gsi);
473 : }
474 : }
475 : else
476 1623261 : gimple_debug_bind_reset_value (stmt);
477 :
478 5419789 : update_stmt (stmt);
479 3382744 : }
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 161815441 : insert_debug_temps_for_defs (gimple_stmt_iterator *gsi)
489 : {
490 161815441 : gimple *stmt;
491 161815441 : ssa_op_iter op_iter;
492 161815441 : def_operand_p def_p;
493 :
494 161815441 : if (!MAY_HAVE_DEBUG_BIND_STMTS)
495 44541150 : return;
496 :
497 117274291 : stmt = gsi_stmt (*gsi);
498 :
499 269530528 : FOR_EACH_PHI_OR_STMT_DEF (def_p, stmt, op_iter, SSA_OP_DEF)
500 : {
501 34981946 : tree var = DEF_FROM_PTR (def_p);
502 :
503 34981946 : if (TREE_CODE (var) != SSA_NAME)
504 180841 : continue;
505 :
506 34801105 : 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 7167 : reset_debug_uses (gimple *stmt)
514 : {
515 7167 : ssa_op_iter op_iter;
516 7167 : def_operand_p def_p;
517 7167 : imm_use_iterator imm_iter;
518 7167 : gimple *use_stmt;
519 :
520 7167 : if (!MAY_HAVE_DEBUG_BIND_STMTS)
521 177 : return;
522 :
523 18627 : FOR_EACH_PHI_OR_STMT_DEF (def_p, stmt, op_iter, SSA_OP_DEF)
524 : {
525 4647 : tree var = DEF_FROM_PTR (def_p);
526 :
527 4647 : if (TREE_CODE (var) != SSA_NAME)
528 0 : continue;
529 :
530 14517 : FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, var)
531 : {
532 5223 : if (!gimple_debug_bind_p (use_stmt))
533 5141 : continue;
534 :
535 82 : gimple_debug_bind_reset_value (use_stmt);
536 82 : update_stmt (use_stmt);
537 4647 : }
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 241428 : release_defs_bitset (bitmap toremove)
547 : {
548 241428 : unsigned j;
549 241428 : 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 241428 : auto_vec<tree, 16> names;
559 241428 : names.reserve (bitmap_count_bits (toremove) + 1);
560 241428 : names.quick_push (NULL_TREE);
561 2702752 : EXECUTE_IF_SET_IN_BITMAP (toremove, 0, j, bi)
562 2461324 : names.quick_push (ssa_name (j));
563 :
564 241428 : bitmap_tree_view (toremove);
565 746112 : while (!bitmap_empty_p (toremove))
566 : {
567 263256 : j = names.length () - 1;
568 3513090 : for (unsigned i = names.length () - 1; names[i];)
569 : {
570 3249834 : bool remove_now = true;
571 3249834 : tree var = names[i];
572 3249834 : gimple *stmt;
573 3249834 : imm_use_iterator uit;
574 :
575 7179483 : FOR_EACH_IMM_USE_STMT (stmt, uit, var)
576 : {
577 1468325 : ssa_op_iter dit;
578 1468325 : def_operand_p def_p;
579 :
580 : /* We can't propagate PHI nodes into debug stmts. */
581 1468325 : if (gimple_code (stmt) == GIMPLE_PHI
582 1468325 : || is_gimple_debug (stmt))
583 679815 : 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 788510 : FOR_EACH_SSA_DEF_OPERAND (def_p, stmt, dit, SSA_OP_DEF)
590 : {
591 788510 : tree odef = DEF_FROM_PTR (def_p);
592 :
593 788510 : if (bitmap_bit_p (toremove, SSA_NAME_VERSION (odef)))
594 : {
595 : remove_now = false;
596 : break;
597 : }
598 : }
599 :
600 788510 : if (!remove_now)
601 : break;
602 3249834 : }
603 :
604 3249834 : if (remove_now)
605 : {
606 2461324 : gimple *def = SSA_NAME_DEF_STMT (var);
607 2461324 : gimple_stmt_iterator gsi = gsi_for_stmt (def);
608 :
609 2461324 : if (gimple_code (def) == GIMPLE_PHI)
610 627224 : remove_phi_node (&gsi, true);
611 : else
612 : {
613 1834100 : gsi_remove (&gsi, true);
614 1834100 : release_defs (def);
615 : }
616 2461324 : bitmap_clear_bit (toremove, SSA_NAME_VERSION (var));
617 : }
618 : else
619 788510 : --i;
620 3249834 : if (--j != i)
621 3063669 : names[i] = names[j];
622 : }
623 : }
624 241428 : bitmap_list_view (toremove);
625 241428 : }
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 2939714065 : verify_vssa (basic_block bb, tree current_vdef, sbitmap visited)
640 : {
641 2939714065 : bool err = false;
642 :
643 2939714065 : if (!bitmap_set_bit (visited, bb->index))
644 : return false;
645 :
646 : /* Pick up the single virtual PHI def. */
647 2241408615 : gphi *phi = NULL;
648 2895399522 : for (gphi_iterator si = gsi_start_phis (bb); !gsi_end_p (si);
649 653990907 : gsi_next (&si))
650 : {
651 653990907 : tree res = gimple_phi_result (si.phi ());
652 1613624967 : if (virtual_operand_p (res))
653 : {
654 305643153 : 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 2241408615 : if (phi)
666 : {
667 305643153 : current_vdef = gimple_phi_result (phi);
668 305643153 : 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 16582058869 : for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
678 12099241639 : gsi_next (&gsi))
679 : {
680 12099241639 : gimple *stmt = gsi_stmt (gsi);
681 17272068466 : tree vuse = gimple_vuse (stmt);
682 5112581670 : if (vuse)
683 : {
684 3416140952 : 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 15515382591 : tree vdef = gimple_vdef (stmt);
694 3416140952 : if (vdef)
695 : {
696 2125598689 : current_vdef = vdef;
697 2125598689 : 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 2241408615 : edge_iterator ei;
709 2241408615 : edge e;
710 4960493300 : FOR_EACH_EDGE (e, ei, bb->succs)
711 : {
712 2719084685 : gphi *phi = get_virtual_phi (e->dest);
713 2719084685 : if (phi
714 2719084685 : && 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 2719084685 : 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 13499208260 : verify_ssa_name (tree ssa_name, bool is_virtual)
739 : {
740 13499208260 : if (TREE_CODE (ssa_name) != SSA_NAME)
741 : {
742 0 : error ("expected an SSA_NAME object");
743 0 : return true;
744 : }
745 :
746 13499208260 : 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 13499208260 : if (SSA_NAME_VAR (ssa_name) != NULL_TREE
753 8055563034 : && 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 13499208260 : 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 13499208260 : 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 13499208260 : 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 13499208260 : if (SSA_NAME_IS_DEFAULT_DEF (ssa_name)
778 13499208260 : && !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 5731990811 : verify_def (basic_block bb, basic_block *definition_block, tree ssa_name,
801 : gimple *stmt, bool is_virtual)
802 : {
803 5731990811 : if (verify_ssa_name (ssa_name, is_virtual))
804 0 : goto err;
805 :
806 5731990811 : if (SSA_NAME_VAR (ssa_name)
807 3137610845 : && 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 5731990811 : 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 5731990811 : definition_block[SSA_NAME_VERSION (ssa_name)] = bb;
822 :
823 5731990811 : 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 10981093127 : 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 10981093127 : bool err = false;
864 10981093127 : tree ssa_name = USE_FROM_PTR (use_p);
865 :
866 10981093127 : if (!TREE_VISITED (ssa_name))
867 6111791841 : if (verify_imm_links (stderr, ssa_name))
868 10981093127 : err = true;
869 :
870 10981093127 : TREE_VISITED (ssa_name) = 1;
871 :
872 10981093127 : if (gimple_nop_p (SSA_NAME_DEF_STMT (ssa_name))
873 10981093127 : && SSA_NAME_IS_DEFAULT_DEF (ssa_name))
874 : ; /* Default definitions have empty statements. Nothing to do. */
875 9430841529 : else if (!def_bb)
876 : {
877 0 : error ("missing definition");
878 0 : err = true;
879 : }
880 9430841529 : else if (bb != def_bb
881 9430841529 : && !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 9430841529 : else if (bb == def_bb
888 9430841529 : && names_defined_in_bb != NULL
889 15054730897 : && !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 10981093127 : if (check_abnormal
896 10988807892 : && !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 10981093127 : if (use_p->prev == NULL)
905 : {
906 0 : error ("no immediate_use list");
907 0 : err = true;
908 : }
909 : else
910 : {
911 10981093127 : tree listvar;
912 10981093127 : if (use_p->prev->use == NULL)
913 6111791841 : listvar = use_p->prev->loc.ssa_name;
914 : else
915 4869301286 : listvar = USE_FROM_PTR (use_p->prev);
916 10981093127 : if (listvar != ssa_name)
917 : {
918 0 : error ("wrong immediate use list");
919 0 : err = true;
920 : }
921 : }
922 :
923 10981093127 : 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 10981093127 : 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 654002012 : verify_phi_args (gphi *phi, basic_block bb, basic_block *definition_block)
945 : {
946 654002012 : edge e;
947 654002012 : bool err = false;
948 654002012 : size_t i, phi_num_args = gimple_phi_num_args (phi);
949 :
950 1308004024 : 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 2313394214 : for (i = 0; i < phi_num_args; i++)
958 : {
959 1659392202 : use_operand_p op_p = gimple_phi_arg_imm_use_ptr (phi, i);
960 1659392202 : tree op = USE_FROM_PTR (op_p);
961 :
962 1659392202 : e = EDGE_PRED (bb, i);
963 :
964 1659392202 : 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 1659392202 : 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 1659392202 : 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 1659392202 : if (TREE_CODE (op) == SSA_NAME)
986 : {
987 2864393554 : err = verify_ssa_name (op, virtual_operand_p (gimple_phi_result (phi)));
988 1432196777 : err |= verify_use (e->src, definition_block[SSA_NAME_VERSION (op)],
989 1432196777 : op_p, phi, e->flags & EDGE_ABNORMAL, NULL);
990 : }
991 :
992 1659392202 : if (TREE_CODE (op) == ADDR_EXPR)
993 : {
994 11986144 : tree base = TREE_OPERAND (op, 0);
995 16050955 : while (handled_component_p (base))
996 4064811 : base = TREE_OPERAND (base, 0);
997 11986144 : if ((VAR_P (base)
998 : || TREE_CODE (base) == PARM_DECL
999 : || TREE_CODE (base) == RESULT_DECL)
1000 5483834 : && !TREE_ADDRESSABLE (base))
1001 : {
1002 0 : error ("address taken, but ADDRESSABLE bit not set");
1003 0 : err = true;
1004 : }
1005 : }
1006 :
1007 1659392202 : 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 1659392202 : 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 654002012 : error:
1023 654002012 : 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 654002012 : 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 220735797 : verify_ssa (bool check_modified_stmt, bool check_ssa_operands)
1039 : {
1040 220735797 : basic_block bb;
1041 441471594 : basic_block *definition_block = XCNEWVEC (basic_block, num_ssa_names);
1042 220735797 : ssa_op_iter iter;
1043 220735797 : tree op;
1044 220735797 : enum dom_state orig_dom_state = dom_info_state (CDI_DOMINATORS);
1045 220735797 : auto_bitmap names_defined_in_bb;
1046 :
1047 220735797 : gcc_assert (!need_ssa_update_p (cfun));
1048 :
1049 220735797 : timevar_push (TV_TREE_SSA_VERIFY);
1050 :
1051 220735797 : {
1052 : /* Keep track of SSA names present in the IL. */
1053 220735797 : size_t i;
1054 220735797 : tree name;
1055 220735797 : hash_map <void *, tree> ssa_info;
1056 :
1057 8399727901 : FOR_EACH_SSA_NAME (i, name, cfun)
1058 : {
1059 6335020672 : gimple *stmt;
1060 6335020672 : TREE_VISITED (name) = 0;
1061 :
1062 12670041344 : verify_ssa_name (name, virtual_operand_p (name));
1063 :
1064 6335020672 : stmt = SSA_NAME_DEF_STMT (name);
1065 6335020672 : if (!gimple_nop_p (stmt))
1066 : {
1067 5731990811 : basic_block bb = gimple_bb (stmt);
1068 5731990811 : if (verify_def (bb, definition_block,
1069 5731990811 : name, stmt, virtual_operand_p (name)))
1070 0 : goto err;
1071 : }
1072 :
1073 6335020672 : void *info = NULL;
1074 6335020672 : if (POINTER_TYPE_P (TREE_TYPE (name)))
1075 1133689930 : info = SSA_NAME_PTR_INFO (name);
1076 5201330742 : else if (INTEGRAL_TYPE_P (TREE_TYPE (name)))
1077 2193654995 : info = SSA_NAME_RANGE_INFO (name);
1078 6335020672 : if (info)
1079 : {
1080 1332509139 : bool existed;
1081 1332509139 : tree &val = ssa_info.get_or_insert (info, &existed);
1082 1332509139 : 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 1332509139 : val = name;
1093 : }
1094 : }
1095 0 : }
1096 :
1097 220735797 : 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 2025262426 : FOR_EACH_BB_FN (bb, cfun)
1102 : {
1103 1804526629 : edge e;
1104 1804526629 : edge_iterator ei;
1105 :
1106 : /* Make sure that all edges have a clear 'aux' field. */
1107 4307214474 : FOR_EACH_EDGE (e, ei, bb->preds)
1108 : {
1109 2502687845 : 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 2458528641 : for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1119 : {
1120 654002012 : gphi *phi = gsi.phi ();
1121 654002012 : if (verify_phi_args (phi, bb, definition_block))
1122 0 : goto err;
1123 :
1124 654002012 : bitmap_set_bit (names_defined_in_bb,
1125 654002012 : SSA_NAME_VERSION (gimple_phi_result (phi)));
1126 : }
1127 :
1128 : /* Now verify all the uses and vuses in every statement of the block. */
1129 15708449135 : for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
1130 12099395877 : gsi_next (&gsi))
1131 : {
1132 12099395877 : gimple *stmt = gsi_stmt (gsi);
1133 12099395877 : use_operand_p use_p;
1134 :
1135 24130657521 : 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 12099395877 : 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 12099395877 : if (gimple_debug_bind_p (stmt)
1150 6115162455 : && !gimple_debug_bind_has_value_p (stmt))
1151 2029443369 : continue;
1152 :
1153 19618848858 : FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE|SSA_OP_VUSE)
1154 : {
1155 9548896350 : op = USE_FROM_PTR (use_p);
1156 9548896350 : 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 15136124624 : FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_ALL_DEFS)
1162 : {
1163 5066172116 : 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 5066172116 : bitmap_set_bit (names_defined_in_bb, SSA_NAME_VERSION (op));
1174 : }
1175 : }
1176 :
1177 1804526629 : bitmap_clear (names_defined_in_bb);
1178 : }
1179 :
1180 220735797 : free (definition_block);
1181 :
1182 220735797 : if (gimple_vop (cfun)
1183 220735797 : && ssa_default_def (cfun, gimple_vop (cfun)))
1184 : {
1185 220629380 : auto_sbitmap visited (last_basic_block_for_fn (cfun) + 1);
1186 220629380 : bitmap_clear (visited);
1187 220629380 : if (verify_vssa (ENTRY_BLOCK_PTR_FOR_FN (cfun),
1188 : ssa_default_def (cfun, gimple_vop (cfun)), visited))
1189 0 : goto err;
1190 220629380 : }
1191 :
1192 : /* Restore the dominance information to its prior known state, so
1193 : that we do not perturb the compiler's subsequent behavior. */
1194 220735797 : if (orig_dom_state == DOM_NONE)
1195 71734106 : free_dominance_info (CDI_DOMINATORS);
1196 : else
1197 149001691 : set_dom_info_availability (CDI_DOMINATORS, orig_dom_state);
1198 :
1199 220735797 : timevar_pop (TV_TREE_SSA_VERIFY);
1200 220735797 : return;
1201 :
1202 0 : err:
1203 0 : internal_error ("verify_ssa failed");
1204 220735797 : }
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 3257665 : init_tree_ssa (struct function *fn, int size)
1215 : {
1216 3257665 : fn->gimple_df = ggc_cleared_alloc<gimple_df> ();
1217 3257665 : fn->gimple_df->default_defs = hash_table<ssa_name_hasher>::create_ggc (20);
1218 3257665 : pt_solution_reset (&fn->gimple_df->escaped);
1219 3257665 : pt_solution_reset (&fn->gimple_df->escaped_return);
1220 3257665 : init_ssanames (fn, size);
1221 3257665 : }
1222 :
1223 : /* Deallocate memory associated with SSA data structures for FNDECL. */
1224 :
1225 : void
1226 3152021 : delete_tree_ssa (struct function *fn)
1227 : {
1228 3152021 : fini_ssanames (fn);
1229 :
1230 : /* We no longer maintain the SSA operand cache at this point. */
1231 3152021 : if (ssa_operands_active (fn))
1232 3128378 : fini_ssa_operands (fn);
1233 :
1234 3152021 : fn->gimple_df->default_defs->empty ();
1235 3152021 : fn->gimple_df->default_defs = NULL;
1236 3152021 : pt_solution_reset (&fn->gimple_df->escaped);
1237 3152021 : pt_solution_reset (&fn->gimple_df->escaped_return);
1238 3152021 : if (fn->gimple_df->decls_to_pointers != NULL)
1239 39736 : delete fn->gimple_df->decls_to_pointers;
1240 3152021 : fn->gimple_df->decls_to_pointers = NULL;
1241 3152021 : fn->gimple_df = NULL;
1242 :
1243 : /* We no longer need the edge variable maps. */
1244 3152021 : redirect_edge_var_map_empty ();
1245 3152021 : }
1246 :
1247 : /* Return true if EXPR is a useless type conversion, otherwise return
1248 : false. */
1249 :
1250 : bool
1251 950475439 : tree_ssa_useless_type_conversion (tree expr)
1252 : {
1253 950475439 : 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 950475439 : if (!CONVERT_EXPR_P (expr)
1260 878460279 : && TREE_CODE (expr) != VIEW_CONVERT_EXPR
1261 877430609 : && TREE_CODE (expr) != NON_LVALUE_EXPR)
1262 : return false;
1263 :
1264 73597264 : outer_type = TREE_TYPE (expr);
1265 73597264 : inner_type = TREE_TYPE (TREE_OPERAND (expr, 0));
1266 :
1267 73597264 : if (inner_type == error_mark_node)
1268 : return false;
1269 :
1270 73597221 : 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 916334899 : tree_ssa_strip_useless_type_conversions (tree exp)
1279 : {
1280 937650070 : while (tree_ssa_useless_type_conversion (exp))
1281 21315171 : exp = TREE_OPERAND (exp, 0);
1282 916334899 : return exp;
1283 : }
1284 :
1285 : /* Return true if T, as SSA_NAME, has an implicit default defined value. */
1286 :
1287 : bool
1288 367019742 : ssa_defined_default_def_p (tree t)
1289 : {
1290 367019742 : tree var = SSA_NAME_VAR (t);
1291 :
1292 146166037 : if (!var)
1293 : ;
1294 : /* Parameters get their initial value from the function entry. */
1295 146166037 : 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 113536373 : 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 113333382 : 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 364710887 : ssa_undefined_value_p (tree t, bool partial)
1314 : {
1315 364710887 : gimple *def_stmt;
1316 :
1317 729421774 : gcc_checking_assert (!virtual_operand_p (t));
1318 :
1319 364710887 : if (ssa_defined_default_def_p (t))
1320 : return false;
1321 :
1322 : /* The value is undefined iff its definition statement is empty. */
1323 333927257 : def_stmt = SSA_NAME_DEF_STMT (t);
1324 333927257 : 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 327611129 : 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 51807097 : if (partial && is_gimple_assign (def_stmt)
1357 367158860 : && (gimple_assign_rhs_code (def_stmt) == REALPART_EXPR
1358 39296103 : || gimple_assign_rhs_code (def_stmt) == IMAGPART_EXPR))
1359 : {
1360 603728 : tree real_imag_part = TREE_OPERAND (gimple_assign_rhs1 (def_stmt), 0);
1361 603728 : if (TREE_CODE (real_imag_part) == SSA_NAME
1362 603728 : && 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 51806952 : if (partial && is_gimple_assign (def_stmt)
1369 367158570 : && gimple_assign_rhs_code (def_stmt) == COMPLEX_EXPR)
1370 : {
1371 17477 : tree rhs1, rhs2;
1372 :
1373 17477 : rhs1 = gimple_assign_rhs1 (def_stmt);
1374 17477 : rhs2 = gimple_assign_rhs2 (def_stmt);
1375 17141 : return (TREE_CODE (rhs1) == SSA_NAME && ssa_undefined_value_p (rhs1))
1376 34577 : || (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 319990 : ssa_name_any_use_dominates_bb_p (tree var, basic_block bb)
1389 : {
1390 319990 : imm_use_iterator iter;
1391 319990 : use_operand_p use_p;
1392 1296540 : FOR_EACH_IMM_USE_FAST (use_p, iter, var)
1393 : {
1394 679283 : if (is_a <gphi *> (USE_STMT (use_p))
1395 679283 : || is_gimple_debug (USE_STMT (use_p)))
1396 615540 : continue;
1397 63743 : basic_block dombb = gimple_bb (USE_STMT (use_p));
1398 63743 : if (dominated_by_p (CDI_DOMINATORS, bb, dombb))
1399 22723 : return true;
1400 22723 : }
1401 :
1402 297267 : 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 11823840 : mark_ssa_maybe_undefs (void)
1410 : {
1411 11823840 : 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 11823840 : unsigned int i;
1417 11823840 : tree var;
1418 558216527 : FOR_EACH_SSA_NAME (i, var, cfun)
1419 : {
1420 367503930 : if (SSA_NAME_IS_VIRTUAL_OPERAND (var)
1421 367503930 : || !ssa_undefined_value_p (var, false))
1422 363219816 : ssa_name_set_maybe_undef (var, false);
1423 : else
1424 : {
1425 4284114 : ssa_name_set_maybe_undef (var);
1426 4284114 : queue.safe_push (var);
1427 4284114 : if (dump_file && (dump_flags & TDF_DETAILS))
1428 42 : fprintf (dump_file, "marking _%i as maybe-undef\n",
1429 21 : 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 17430582 : while (!queue.is_empty ())
1436 : {
1437 4578301 : var = queue.pop ();
1438 4578301 : imm_use_iterator iter;
1439 4578301 : use_operand_p use_p;
1440 10544861 : 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 1388259 : if (!is_a <gphi *> (USE_STMT (use_p)))
1448 1094072 : continue;
1449 500038 : gphi *phi = as_a <gphi *> (USE_STMT (use_p));
1450 :
1451 500038 : tree def = gimple_phi_result (phi);
1452 500038 : if (ssa_name_maybe_undef_p (def))
1453 188663 : 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 311375 : int idx = phi_arg_index_from_use (use_p);
1462 311375 : basic_block bb = gimple_phi_arg_edge (phi, idx)->src;
1463 311375 : if (ssa_name_any_use_dominates_bb_p (var, bb))
1464 17188 : continue;
1465 :
1466 294187 : ssa_name_set_maybe_undef (def);
1467 294187 : queue.safe_push (def);
1468 294187 : 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 4578301 : }
1472 : }
1473 11823840 : }
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 30264299 : maybe_rewrite_mem_ref_base (tree *tp, bitmap suitable_for_renaming)
1481 : {
1482 30264299 : tree sym;
1483 :
1484 34266750 : while (handled_component_p (*tp))
1485 4002451 : tp = &TREE_OPERAND (*tp, 0);
1486 30264299 : if (TREE_CODE (*tp) == MEM_REF
1487 2081312 : && TREE_CODE (TREE_OPERAND (*tp, 0)) == ADDR_EXPR
1488 380469 : && (sym = TREE_OPERAND (TREE_OPERAND (*tp, 0), 0))
1489 380469 : && DECL_P (sym)
1490 379929 : && !TREE_ADDRESSABLE (sym)
1491 191448 : && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym))
1492 55262 : && is_gimple_reg_type (TREE_TYPE (*tp))
1493 30319551 : && ! VOID_TYPE_P (TREE_TYPE (*tp)))
1494 : {
1495 55252 : if (VECTOR_TYPE_P (TREE_TYPE (sym))
1496 654 : && useless_type_conversion_p (TREE_TYPE (*tp),
1497 654 : TREE_TYPE (TREE_TYPE (sym)))
1498 55336 : && 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 55169 : else if (TREE_CODE (TREE_TYPE (sym)) == COMPLEX_TYPE
1508 1050 : && useless_type_conversion_p (TREE_TYPE (*tp),
1509 1050 : TREE_TYPE (TREE_TYPE (sym)))
1510 55174 : && (integer_zerop (TREE_OPERAND (*tp, 1))
1511 3 : || tree_int_cst_equal (TREE_OPERAND (*tp, 1),
1512 3 : TYPE_SIZE_UNIT (TREE_TYPE (*tp)))))
1513 : {
1514 6 : *tp = build1 (integer_zerop (TREE_OPERAND (*tp, 1))
1515 : ? REALPART_EXPR : IMAGPART_EXPR,
1516 4 : TREE_TYPE (*tp), sym);
1517 : }
1518 55165 : else if (integer_zerop (TREE_OPERAND (*tp, 1))
1519 55165 : && DECL_SIZE (sym) == TYPE_SIZE (TREE_TYPE (*tp)))
1520 : {
1521 54807 : if (!useless_type_conversion_p (TREE_TYPE (*tp),
1522 54807 : TREE_TYPE (sym)))
1523 12334 : *tp = build1 (VIEW_CONVERT_EXPR,
1524 12334 : TREE_TYPE (*tp), sym);
1525 : else
1526 42473 : *tp = sym;
1527 : }
1528 358 : else if (DECL_SIZE (sym)
1529 358 : && TREE_CODE (DECL_SIZE (sym)) == INTEGER_CST
1530 358 : && (known_subrange_p
1531 358 : (mem_ref_offset (*tp),
1532 358 : wi::to_offset (TYPE_SIZE_UNIT (TREE_TYPE (*tp))),
1533 358 : 0, wi::to_offset (DECL_SIZE_UNIT (sym))))
1534 358 : && (! INTEGRAL_TYPE_P (TREE_TYPE (*tp))
1535 344 : || (wi::to_offset (TYPE_SIZE (TREE_TYPE (*tp)))
1536 688 : == TYPE_PRECISION (TREE_TYPE (*tp))))
1537 358 : && (! INTEGRAL_TYPE_P (TREE_TYPE (sym))
1538 168 : || type_has_mode_precision_p (TREE_TYPE (sym)))
1539 716 : && wi::umod_trunc (wi::to_offset (TYPE_SIZE (TREE_TYPE (*tp))),
1540 716 : BITS_PER_UNIT) == 0)
1541 : {
1542 716 : *tp = build3 (BIT_FIELD_REF, TREE_TYPE (*tp), sym,
1543 358 : TYPE_SIZE (TREE_TYPE (*tp)),
1544 : wide_int_to_tree (bitsizetype,
1545 358 : mem_ref_offset (*tp)
1546 716 : << LOG2_BITS_PER_UNIT));
1547 : }
1548 : }
1549 30264299 : }
1550 :
1551 : /* For a tree REF return its base if it is the base of a MEM_REF
1552 : that cannot be rewritten into SSA form. Otherwise return NULL_TREE. */
1553 :
1554 : static tree
1555 296850597 : non_rewritable_mem_ref_base (tree ref)
1556 : {
1557 296850597 : tree base;
1558 :
1559 : /* A plain decl does not need it set. */
1560 296850597 : if (DECL_P (ref))
1561 : return NULL_TREE;
1562 :
1563 266263442 : switch (TREE_CODE (ref))
1564 : {
1565 2483910 : case REALPART_EXPR:
1566 2483910 : case IMAGPART_EXPR:
1567 2483910 : case BIT_FIELD_REF:
1568 2483910 : if (DECL_P (TREE_OPERAND (ref, 0)))
1569 : return NULL_TREE;
1570 : break;
1571 2410490 : case VIEW_CONVERT_EXPR:
1572 2410490 : if (DECL_P (TREE_OPERAND (ref, 0)))
1573 : {
1574 1096777 : if (TYPE_SIZE (TREE_TYPE (ref))
1575 1096777 : != TYPE_SIZE (TREE_TYPE (TREE_OPERAND (ref, 0))))
1576 676 : return TREE_OPERAND (ref, 0);
1577 : return NULL_TREE;
1578 : }
1579 : break;
1580 : /* We would need to rewrite ARRAY_REFs or COMPONENT_REFs and even
1581 : more so multiple levels of handled components. */
1582 264706530 : default:;
1583 : }
1584 :
1585 264706530 : base = ref;
1586 :
1587 : /* But watch out for MEM_REFs we cannot lower to a
1588 : VIEW_CONVERT_EXPR or a BIT_FIELD_REF. */
1589 264706530 : if (TREE_CODE (base) == MEM_REF
1590 264706530 : && TREE_CODE (TREE_OPERAND (base, 0)) == ADDR_EXPR)
1591 : {
1592 6108581 : tree decl = TREE_OPERAND (TREE_OPERAND (base, 0), 0);
1593 6108581 : if (! DECL_P (decl))
1594 : return NULL_TREE;
1595 6074701 : if (! is_gimple_reg_type (TREE_TYPE (base))
1596 5906904 : || VOID_TYPE_P (TREE_TYPE (base))
1597 11981605 : || TREE_THIS_VOLATILE (decl) != TREE_THIS_VOLATILE (base))
1598 : return decl;
1599 5905680 : if ((VECTOR_TYPE_P (TREE_TYPE (decl))
1600 5903998 : || TREE_CODE (TREE_TYPE (decl)) == COMPLEX_TYPE)
1601 3069 : && useless_type_conversion_p (TREE_TYPE (base),
1602 3069 : TREE_TYPE (TREE_TYPE (decl)))
1603 267 : && known_ge (mem_ref_offset (base), 0)
1604 220 : && known_gt (wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (decl))),
1605 : mem_ref_offset (base))
1606 5905894 : && multiple_p (mem_ref_offset (base),
1607 214 : wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (base)))))
1608 212 : return NULL_TREE;
1609 : /* For same sizes and zero offset we can use a VIEW_CONVERT_EXPR. */
1610 5905468 : if (integer_zerop (TREE_OPERAND (base, 1))
1611 5905468 : && DECL_SIZE (decl) == TYPE_SIZE (TREE_TYPE (base)))
1612 : return NULL_TREE;
1613 : /* For integral typed extracts we can use a BIT_FIELD_REF. */
1614 5295848 : if (DECL_SIZE (decl)
1615 5291319 : && TREE_CODE (DECL_SIZE_UNIT (decl)) == INTEGER_CST
1616 5291319 : && (known_subrange_p
1617 5291319 : (mem_ref_offset (base),
1618 5291319 : wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (base))),
1619 5291319 : 0, wi::to_poly_offset (DECL_SIZE_UNIT (decl))))
1620 : /* ??? We can't handle bitfield precision extracts without
1621 : either using an alternate type for the BIT_FIELD_REF and
1622 : then doing a conversion or possibly adjusting the offset
1623 : according to endianness. */
1624 5288895 : && (! INTEGRAL_TYPE_P (TREE_TYPE (base))
1625 2735486 : || (wi::to_offset (TYPE_SIZE (TREE_TYPE (base)))
1626 5470972 : == TYPE_PRECISION (TREE_TYPE (base))))
1627 : /* ??? Likewise for extracts from bitfields, we'd have
1628 : to pun the base object to a size precision mode first. */
1629 5283542 : && (! INTEGRAL_TYPE_P (TREE_TYPE (decl))
1630 39505 : || type_has_mode_precision_p (TREE_TYPE (decl)))
1631 10545491 : && wi::umod_trunc (wi::to_offset (TYPE_SIZE (TREE_TYPE (base))),
1632 10499286 : BITS_PER_UNIT) == 0)
1633 5249643 : return NULL_TREE;
1634 46205 : return decl;
1635 : }
1636 :
1637 : /* We cannot rewrite a decl in the base. */
1638 258597949 : base = get_base_address (ref);
1639 258597949 : if (DECL_P (base))
1640 : return base;
1641 :
1642 : /* We cannot rewrite TARGET_MEM_REFs. */
1643 238887731 : else if (TREE_CODE (base) == TARGET_MEM_REF
1644 238887731 : && TREE_CODE (TREE_OPERAND (base, 0)) == ADDR_EXPR)
1645 : {
1646 0 : tree decl = TREE_OPERAND (TREE_OPERAND (base, 0), 0);
1647 0 : if (! DECL_P (decl))
1648 : return NULL_TREE;
1649 : return decl;
1650 : }
1651 :
1652 : return NULL_TREE;
1653 : }
1654 :
1655 : /* For an lvalue tree LHS return true if it cannot be rewritten into SSA form.
1656 : Otherwise return true. */
1657 :
1658 : static bool
1659 102378674 : non_rewritable_lvalue_p (tree lhs)
1660 : {
1661 : /* A plain decl is always rewritable. */
1662 102378674 : if (DECL_P (lhs))
1663 : return false;
1664 :
1665 : /* We can re-write REALPART_EXPR and IMAGPART_EXPR sets in
1666 : a reasonably efficient manner... */
1667 60004002 : if ((TREE_CODE (lhs) == REALPART_EXPR
1668 60004002 : || TREE_CODE (lhs) == IMAGPART_EXPR)
1669 60004002 : && DECL_P (TREE_OPERAND (lhs, 0)))
1670 : return false;
1671 :
1672 : /* ??? The following could be relaxed allowing component
1673 : references that do not change the access size. */
1674 59972946 : if (TREE_CODE (lhs) == MEM_REF
1675 59972946 : && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR)
1676 : {
1677 7105681 : tree decl = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0);
1678 :
1679 : /* A decl that is wrapped inside a MEM-REF that covers
1680 : it full is also rewritable. */
1681 7105681 : if (integer_zerop (TREE_OPERAND (lhs, 1))
1682 2072682 : && DECL_P (decl)
1683 2072622 : && DECL_SIZE (decl) == TYPE_SIZE (TREE_TYPE (lhs))
1684 : /* If the dynamic type of the decl has larger precision than
1685 : the decl itself we can't use the decls type for SSA rewriting. */
1686 534479 : && ((! INTEGRAL_TYPE_P (TREE_TYPE (decl))
1687 13576 : || compare_tree_int (DECL_SIZE (decl),
1688 13576 : TYPE_PRECISION (TREE_TYPE (decl))) == 0)
1689 814 : || (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
1690 793 : && (TYPE_PRECISION (TREE_TYPE (decl))
1691 793 : >= TYPE_PRECISION (TREE_TYPE (lhs)))))
1692 : /* Make sure we are not re-writing non-float copying into float
1693 : copying as that can incur normalization. */
1694 534326 : && (! FLOAT_TYPE_P (TREE_TYPE (decl))
1695 4962 : || types_compatible_p (TREE_TYPE (lhs), TREE_TYPE (decl)))
1696 7635752 : && (TREE_THIS_VOLATILE (decl) == TREE_THIS_VOLATILE (lhs)))
1697 : return false;
1698 :
1699 : /* A vector-insert using a MEM_REF or ARRAY_REF is rewritable
1700 : using a BIT_INSERT_EXPR. */
1701 6576096 : if (DECL_P (decl)
1702 6576030 : && VECTOR_TYPE_P (TREE_TYPE (decl))
1703 1699 : && TYPE_MODE (TREE_TYPE (decl)) != BLKmode
1704 273 : && known_ge (mem_ref_offset (lhs), 0)
1705 238 : && known_gt (wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (decl))),
1706 : mem_ref_offset (lhs))
1707 238 : && multiple_p (mem_ref_offset (lhs),
1708 238 : wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (lhs))))
1709 13152126 : && known_ge (wi::to_poly_offset (TYPE_SIZE (TREE_TYPE (decl))),
1710 : wi::to_poly_offset (TYPE_SIZE (TREE_TYPE (lhs)))))
1711 : {
1712 237 : poly_uint64 lhs_bits, nelts;
1713 237 : if (poly_int_tree_p (TYPE_SIZE (TREE_TYPE (lhs)), &lhs_bits)
1714 239 : && multiple_p (lhs_bits,
1715 : tree_to_uhwi
1716 237 : (TYPE_SIZE (TREE_TYPE (TREE_TYPE (decl)))),
1717 : &nelts)
1718 257 : && valid_vector_subparts_p (nelts))
1719 : {
1720 217 : if (known_eq (nelts, 1u))
1721 217 : return false;
1722 : /* For sub-vector inserts the insert vector mode has to be
1723 : supported. */
1724 159 : tree vtype = build_vector_type (TREE_TYPE (TREE_TYPE (decl)),
1725 159 : nelts);
1726 159 : if (TYPE_MODE (vtype) != BLKmode)
1727 : return false;
1728 : }
1729 : }
1730 : }
1731 :
1732 : /* A vector-insert using a BIT_FIELD_REF is rewritable using
1733 : BIT_INSERT_EXPR. */
1734 59443144 : if (TREE_CODE (lhs) == BIT_FIELD_REF
1735 18996 : && DECL_P (TREE_OPERAND (lhs, 0))
1736 13349 : && VECTOR_TYPE_P (TREE_TYPE (TREE_OPERAND (lhs, 0)))
1737 13295 : && TYPE_MODE (TREE_TYPE (TREE_OPERAND (lhs, 0))) != BLKmode
1738 1510 : && operand_equal_p (TYPE_SIZE_UNIT (TREE_TYPE (lhs)),
1739 1510 : TYPE_SIZE_UNIT
1740 : (TREE_TYPE (TREE_TYPE (TREE_OPERAND (lhs, 0)))), 0)
1741 59444653 : && (tree_to_uhwi (TREE_OPERAND (lhs, 2))
1742 1509 : % tree_to_uhwi (TYPE_SIZE (TREE_TYPE (lhs)))) == 0)
1743 : return false;
1744 :
1745 : return true;
1746 : }
1747 :
1748 : /* When possible, clear TREE_ADDRESSABLE bit, set or clear DECL_NOT_GIMPLE_REG_P
1749 : and mark the variable VAR for conversion into SSA. Return true when updating
1750 : stmts is required. */
1751 :
1752 : static void
1753 105677759 : maybe_optimize_var (tree var, bitmap addresses_taken, bitmap not_reg_needs,
1754 : bitmap suitable_for_renaming)
1755 : {
1756 : /* Global Variables, result decls cannot be changed. */
1757 105677759 : if (is_global_var (var)
1758 104056117 : || TREE_CODE (var) == RESULT_DECL
1759 209733876 : || bitmap_bit_p (addresses_taken, DECL_UID (var)))
1760 10386576 : return;
1761 :
1762 95291183 : bool maybe_reg = false;
1763 95291183 : if (TREE_ADDRESSABLE (var))
1764 : {
1765 1511807 : TREE_ADDRESSABLE (var) = 0;
1766 1511807 : maybe_reg = true;
1767 1511807 : if (dump_file)
1768 : {
1769 69 : fprintf (dump_file, "No longer having address taken: ");
1770 69 : print_generic_expr (dump_file, var);
1771 69 : fprintf (dump_file, "\n");
1772 : }
1773 : }
1774 :
1775 : /* For register type decls if we do not have any partial defs
1776 : we cannot express in SSA form mark them as DECL_NOT_GIMPLE_REG_P
1777 : as to avoid SSA rewrite. For the others go ahead and mark
1778 : them for renaming. */
1779 95291183 : if (is_gimple_reg_type (TREE_TYPE (var)))
1780 : {
1781 79795148 : if (bitmap_bit_p (not_reg_needs, DECL_UID (var)))
1782 : {
1783 32238 : DECL_NOT_GIMPLE_REG_P (var) = 1;
1784 32238 : if (dump_file)
1785 : {
1786 4 : fprintf (dump_file, "Has partial defs: ");
1787 4 : print_generic_expr (dump_file, var);
1788 4 : fprintf (dump_file, "\n");
1789 : }
1790 : }
1791 79762910 : else if (TREE_CODE (TREE_TYPE (var)) == BITINT_TYPE
1792 37445 : && (cfun->curr_properties & PROP_gimple_lbitint) != 0
1793 79780680 : && TYPE_PRECISION (TREE_TYPE (var)) > MAX_FIXED_MODE_SIZE)
1794 : {
1795 : /* Don't rewrite large/huge _BitInt vars after _BitInt lowering
1796 : into SSA form. */
1797 1266 : DECL_NOT_GIMPLE_REG_P (var) = 1;
1798 1266 : if (dump_file)
1799 : {
1800 0 : fprintf (dump_file, "_BitInt var after its lowering: ");
1801 0 : print_generic_expr (dump_file, var);
1802 0 : fprintf (dump_file, "\n");
1803 : }
1804 : }
1805 79761644 : else if (DECL_NOT_GIMPLE_REG_P (var))
1806 : {
1807 7857 : maybe_reg = true;
1808 7857 : DECL_NOT_GIMPLE_REG_P (var) = 0;
1809 : }
1810 79795148 : if (maybe_reg)
1811 : {
1812 550081 : if (is_gimple_reg (var))
1813 : {
1814 542783 : if (dump_file)
1815 : {
1816 16 : fprintf (dump_file, "Now a gimple register: ");
1817 16 : print_generic_expr (dump_file, var);
1818 16 : fprintf (dump_file, "\n");
1819 : }
1820 542783 : bitmap_set_bit (suitable_for_renaming, DECL_UID (var));
1821 : }
1822 : else
1823 7298 : DECL_NOT_GIMPLE_REG_P (var) = 1;
1824 : }
1825 : }
1826 : }
1827 :
1828 : /* Return true when STMT is ASAN mark where second argument is an address
1829 : of a local variable. */
1830 :
1831 : static bool
1832 59125765 : is_asan_mark_p (gimple *stmt)
1833 : {
1834 59125765 : if (!gimple_call_internal_p (stmt, IFN_ASAN_MARK))
1835 : return false;
1836 :
1837 55353 : tree addr = get_base_address (gimple_call_arg (stmt, 1));
1838 55353 : if (TREE_CODE (addr) == ADDR_EXPR
1839 55353 : && VAR_P (TREE_OPERAND (addr, 0)))
1840 : {
1841 55149 : tree var = TREE_OPERAND (addr, 0);
1842 55149 : if (lookup_attribute (ASAN_USE_AFTER_SCOPE_ATTRIBUTE,
1843 55149 : DECL_ATTRIBUTES (var)))
1844 : return false;
1845 :
1846 51278 : unsigned addressable = TREE_ADDRESSABLE (var);
1847 51278 : TREE_ADDRESSABLE (var) = 0;
1848 51278 : bool r = is_gimple_reg (var);
1849 51278 : TREE_ADDRESSABLE (var) = addressable;
1850 51278 : return r;
1851 : }
1852 :
1853 : return false;
1854 : }
1855 :
1856 : /* Compute TREE_ADDRESSABLE and whether we have unhandled partial defs
1857 : for local variables. */
1858 :
1859 : void
1860 12460035 : execute_update_addresses_taken (void)
1861 : {
1862 12460035 : basic_block bb;
1863 12460035 : auto_bitmap addresses_taken;
1864 12460035 : auto_bitmap not_reg_needs;
1865 12460035 : auto_bitmap suitable_for_renaming;
1866 12460035 : bool optimistic_not_addressable = false;
1867 12460035 : tree var;
1868 12460035 : unsigned i;
1869 :
1870 12460035 : timevar_push (TV_ADDRESS_TAKEN);
1871 :
1872 : /* Collect into ADDRESSES_TAKEN all variables whose address is taken within
1873 : the function body. */
1874 122862400 : FOR_EACH_BB_FN (bb, cfun)
1875 : {
1876 1045734369 : for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
1877 824929639 : gsi_next (&gsi))
1878 : {
1879 824929639 : gimple *stmt = gsi_stmt (gsi);
1880 824929639 : enum gimple_code code = gimple_code (stmt);
1881 824929639 : tree decl;
1882 :
1883 824929639 : if (code == GIMPLE_CALL)
1884 : {
1885 56161726 : if (optimize_atomic_compare_exchange_p (stmt))
1886 : {
1887 : /* For __atomic_compare_exchange_N if the second argument
1888 : is &var, don't mark var addressable;
1889 : if it becomes non-addressable, we'll rewrite it into
1890 : ATOMIC_COMPARE_EXCHANGE call. */
1891 5780 : tree arg = gimple_call_arg (stmt, 1);
1892 5780 : gimple_call_set_arg (stmt, 1, null_pointer_node);
1893 5780 : gimple_ior_addresses_taken (addresses_taken, stmt);
1894 5780 : gimple_call_set_arg (stmt, 1, arg);
1895 : /* Remember we have to check again below. */
1896 5780 : optimistic_not_addressable = true;
1897 : }
1898 56155946 : else if (is_asan_mark_p (stmt)
1899 56155946 : || gimple_call_internal_p (stmt, IFN_GOMP_SIMT_ENTER))
1900 : ;
1901 : else
1902 56134887 : gimple_ior_addresses_taken (addresses_taken, stmt);
1903 : }
1904 : else
1905 : /* Note all addresses taken by the stmt. */
1906 768767913 : gimple_ior_addresses_taken (addresses_taken, stmt);
1907 :
1908 : /* If we have a call or an assignment, see if the lhs contains
1909 : a local decl that requires not to be a gimple register. */
1910 824929639 : if (code == GIMPLE_ASSIGN || code == GIMPLE_CALL)
1911 : {
1912 315450273 : tree lhs = gimple_get_lhs (stmt);
1913 315450273 : if (lhs
1914 281639431 : && TREE_CODE (lhs) != SSA_NAME
1915 417831193 : && ((code == GIMPLE_CALL && ! DECL_P (lhs))
1916 102271437 : || non_rewritable_lvalue_p (lhs)))
1917 : {
1918 59538805 : decl = get_base_address (lhs);
1919 59538805 : if (DECL_P (decl))
1920 41403250 : bitmap_set_bit (not_reg_needs, DECL_UID (decl));
1921 : }
1922 : }
1923 :
1924 824929639 : if (gimple_assign_single_p (stmt))
1925 : {
1926 174855842 : tree rhs = gimple_assign_rhs1 (stmt);
1927 174855842 : if ((decl = non_rewritable_mem_ref_base (rhs)))
1928 19719876 : bitmap_set_bit (not_reg_needs, DECL_UID (decl));
1929 : }
1930 :
1931 650073797 : else if (code == GIMPLE_CALL)
1932 : {
1933 166513989 : for (i = 0; i < gimple_call_num_args (stmt); ++i)
1934 : {
1935 110352263 : tree arg = gimple_call_arg (stmt, i);
1936 110352263 : if ((decl = non_rewritable_mem_ref_base (arg)))
1937 161535 : bitmap_set_bit (not_reg_needs, DECL_UID (decl));
1938 : }
1939 : }
1940 :
1941 593912071 : else if (code == GIMPLE_ASM)
1942 : {
1943 725381 : gasm *asm_stmt = as_a <gasm *> (stmt);
1944 1370345 : for (i = 0; i < gimple_asm_noutputs (asm_stmt); ++i)
1945 : {
1946 644964 : tree link = gimple_asm_output_op (asm_stmt, i);
1947 644964 : tree lhs = TREE_VALUE (link);
1948 644964 : if (TREE_CODE (lhs) != SSA_NAME)
1949 : {
1950 163083 : decl = get_base_address (lhs);
1951 163083 : if (DECL_P (decl)
1952 163083 : && (non_rewritable_lvalue_p (lhs)
1953 : /* We cannot move required conversions from
1954 : the lhs to the rhs in asm statements, so
1955 : require we do not need any. */
1956 94924 : || !useless_type_conversion_p
1957 94924 : (TREE_TYPE (lhs), TREE_TYPE (decl))))
1958 12859 : bitmap_set_bit (not_reg_needs, DECL_UID (decl));
1959 : }
1960 : }
1961 1145921 : for (i = 0; i < gimple_asm_ninputs (asm_stmt); ++i)
1962 : {
1963 420540 : tree link = gimple_asm_input_op (asm_stmt, i);
1964 420540 : if ((decl = non_rewritable_mem_ref_base (TREE_VALUE (link))))
1965 3418 : bitmap_set_bit (not_reg_needs, DECL_UID (decl));
1966 : }
1967 : }
1968 : }
1969 :
1970 148089294 : for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
1971 37686929 : gsi_next (&gsi))
1972 : {
1973 37686929 : size_t i;
1974 37686929 : gphi *phi = gsi.phi ();
1975 :
1976 135524843 : for (i = 0; i < gimple_phi_num_args (phi); i++)
1977 : {
1978 97837914 : tree op = PHI_ARG_DEF (phi, i), var;
1979 97837914 : if (TREE_CODE (op) == ADDR_EXPR
1980 811654 : && (var = get_base_address (TREE_OPERAND (op, 0))) != NULL
1981 98649568 : && DECL_P (var))
1982 608790 : bitmap_set_bit (addresses_taken, DECL_UID (var));
1983 : }
1984 : }
1985 : }
1986 :
1987 : /* We cannot iterate over all referenced vars because that can contain
1988 : unused vars from BLOCK trees, which causes code generation differences
1989 : for -g vs. -g0. */
1990 38631223 : for (var = DECL_ARGUMENTS (cfun->decl); var; var = DECL_CHAIN (var))
1991 26171188 : maybe_optimize_var (var, addresses_taken, not_reg_needs,
1992 : suitable_for_renaming);
1993 :
1994 91966606 : FOR_EACH_VEC_SAFE_ELT (cfun->local_decls, i, var)
1995 79506571 : maybe_optimize_var (var, addresses_taken, not_reg_needs,
1996 : suitable_for_renaming);
1997 :
1998 : /* Operand caches need to be recomputed for operands referencing the updated
1999 : variables and operands need to be rewritten to expose bare symbols. */
2000 12460035 : if (!bitmap_empty_p (suitable_for_renaming)
2001 12460035 : || optimistic_not_addressable)
2002 : {
2003 6867113 : FOR_EACH_BB_FN (bb, cfun)
2004 64264639 : for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);)
2005 : {
2006 50972329 : gimple *stmt = gsi_stmt (gsi);
2007 :
2008 : /* Re-write TARGET_MEM_REFs of symbols we want to
2009 : rewrite into SSA form. */
2010 50972329 : if (gimple_assign_single_p (stmt))
2011 : {
2012 13957400 : tree lhs = gimple_assign_lhs (stmt);
2013 13957400 : tree rhs, *rhsp = gimple_assign_rhs1_ptr (stmt);
2014 13957400 : tree sym;
2015 :
2016 : /* Rewrite LHS IMAG/REALPART_EXPR similar to
2017 : gimplify_modify_expr_complex_part. */
2018 13957400 : if ((TREE_CODE (lhs) == IMAGPART_EXPR
2019 13957400 : || TREE_CODE (lhs) == REALPART_EXPR)
2020 2215 : && DECL_P (TREE_OPERAND (lhs, 0))
2021 13958882 : && bitmap_bit_p (suitable_for_renaming,
2022 1482 : DECL_UID (TREE_OPERAND (lhs, 0))))
2023 : {
2024 1408 : tree other = make_ssa_name (TREE_TYPE (lhs));
2025 2121 : tree lrhs = build1 (TREE_CODE (lhs) == IMAGPART_EXPR
2026 : ? REALPART_EXPR : IMAGPART_EXPR,
2027 1408 : TREE_TYPE (other),
2028 1408 : TREE_OPERAND (lhs, 0));
2029 1408 : suppress_warning (lrhs);
2030 1408 : gimple *load = gimple_build_assign (other, lrhs);
2031 1408 : location_t loc = gimple_location (stmt);
2032 1408 : gimple_set_location (load, loc);
2033 2816 : gimple_set_vuse (load, gimple_vuse (stmt));
2034 1408 : gsi_insert_before (&gsi, load, GSI_SAME_STMT);
2035 1408 : gimple_assign_set_lhs (stmt, TREE_OPERAND (lhs, 0));
2036 1408 : gimple_assign_set_rhs_with_ops
2037 2121 : (&gsi, COMPLEX_EXPR,
2038 : TREE_CODE (lhs) == IMAGPART_EXPR
2039 713 : ? other : gimple_assign_rhs1 (stmt),
2040 1408 : TREE_CODE (lhs) == IMAGPART_EXPR
2041 695 : ? gimple_assign_rhs1 (stmt) : other, NULL_TREE);
2042 1408 : stmt = gsi_stmt (gsi);
2043 1408 : unlink_stmt_vdef (stmt);
2044 1408 : update_stmt (stmt);
2045 1408 : continue;
2046 1408 : }
2047 :
2048 : /* Rewrite a vector insert via a BIT_FIELD_REF on the LHS
2049 : into a BIT_INSERT_EXPR. */
2050 13955992 : if (TREE_CODE (lhs) == BIT_FIELD_REF
2051 803 : && DECL_P (TREE_OPERAND (lhs, 0))
2052 745 : && bitmap_bit_p (suitable_for_renaming,
2053 745 : DECL_UID (TREE_OPERAND (lhs, 0)))
2054 626 : && VECTOR_TYPE_P (TREE_TYPE (TREE_OPERAND (lhs, 0)))
2055 626 : && TYPE_MODE (TREE_TYPE (TREE_OPERAND (lhs, 0))) != BLKmode
2056 626 : && operand_equal_p (TYPE_SIZE_UNIT (TREE_TYPE (lhs)),
2057 626 : TYPE_SIZE_UNIT (TREE_TYPE
2058 : (TREE_TYPE (TREE_OPERAND (lhs, 0)))),
2059 : 0)
2060 13956618 : && (tree_to_uhwi (TREE_OPERAND (lhs, 2))
2061 626 : % tree_to_uhwi (TYPE_SIZE (TREE_TYPE (lhs))) == 0))
2062 : {
2063 626 : tree var = TREE_OPERAND (lhs, 0);
2064 626 : tree val = gimple_assign_rhs1 (stmt);
2065 626 : if (! types_compatible_p (TREE_TYPE (TREE_TYPE (var)),
2066 626 : TREE_TYPE (val)))
2067 : {
2068 0 : tree tem = make_ssa_name (TREE_TYPE (TREE_TYPE (var)));
2069 0 : gimple *pun
2070 0 : = gimple_build_assign (tem,
2071 : build1 (VIEW_CONVERT_EXPR,
2072 0 : TREE_TYPE (tem), val));
2073 0 : gsi_insert_before (&gsi, pun, GSI_SAME_STMT);
2074 0 : val = tem;
2075 : }
2076 626 : tree bitpos = TREE_OPERAND (lhs, 2);
2077 626 : gimple_assign_set_lhs (stmt, var);
2078 626 : gimple_assign_set_rhs_with_ops
2079 626 : (&gsi, BIT_INSERT_EXPR, var, val, bitpos);
2080 626 : stmt = gsi_stmt (gsi);
2081 626 : unlink_stmt_vdef (stmt);
2082 626 : update_stmt (stmt);
2083 626 : continue;
2084 626 : }
2085 :
2086 : /* Rewrite a vector insert using a MEM_REF on the LHS
2087 : into a BIT_INSERT_EXPR. */
2088 13955366 : if (TREE_CODE (lhs) == MEM_REF
2089 615746 : && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR
2090 137181 : && (sym = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0))
2091 137181 : && DECL_P (sym)
2092 137181 : && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym))
2093 8512 : && VECTOR_TYPE_P (TREE_TYPE (sym))
2094 138 : && TYPE_MODE (TREE_TYPE (sym)) != BLKmode
2095 : /* If it is a full replacement we can do better below. */
2096 136 : && maybe_ne (wi::to_poly_offset
2097 136 : (TYPE_SIZE_UNIT (TREE_TYPE (lhs))),
2098 : wi::to_poly_offset
2099 136 : (TYPE_SIZE_UNIT (TREE_TYPE (sym))))
2100 82 : && known_ge (mem_ref_offset (lhs), 0)
2101 82 : && known_gt (wi::to_poly_offset
2102 : (TYPE_SIZE_UNIT (TREE_TYPE (sym))),
2103 : mem_ref_offset (lhs))
2104 13955448 : && multiple_p (mem_ref_offset (lhs),
2105 : wi::to_poly_offset
2106 13955366 : (TYPE_SIZE_UNIT (TREE_TYPE (lhs)))))
2107 : {
2108 82 : tree val = gimple_assign_rhs1 (stmt);
2109 82 : if (! types_compatible_p (TREE_TYPE (val),
2110 82 : TREE_TYPE (TREE_TYPE (sym))))
2111 : {
2112 56 : poly_uint64 lhs_bits, nelts;
2113 56 : tree temtype = TREE_TYPE (TREE_TYPE (sym));
2114 56 : if (poly_int_tree_p (TYPE_SIZE (TREE_TYPE (lhs)),
2115 : &lhs_bits)
2116 56 : && multiple_p (lhs_bits,
2117 : tree_to_uhwi
2118 56 : (TYPE_SIZE (TREE_TYPE
2119 : (TREE_TYPE (sym)))),
2120 : &nelts)
2121 56 : && maybe_ne (nelts, 1u)
2122 56 : && valid_vector_subparts_p (nelts))
2123 30 : temtype = build_vector_type (temtype, nelts);
2124 56 : tree tem = make_ssa_name (temtype);
2125 56 : gimple *pun
2126 56 : = gimple_build_assign (tem,
2127 : build1 (VIEW_CONVERT_EXPR,
2128 56 : TREE_TYPE (tem), val));
2129 56 : gsi_insert_before (&gsi, pun, GSI_SAME_STMT);
2130 56 : val = tem;
2131 : }
2132 82 : tree bitpos
2133 82 : = wide_int_to_tree (bitsizetype,
2134 82 : mem_ref_offset (lhs) * BITS_PER_UNIT);
2135 82 : gimple_assign_set_lhs (stmt, sym);
2136 82 : gimple_assign_set_rhs_with_ops
2137 82 : (&gsi, BIT_INSERT_EXPR, sym, val, bitpos);
2138 82 : stmt = gsi_stmt (gsi);
2139 82 : unlink_stmt_vdef (stmt);
2140 82 : update_stmt (stmt);
2141 82 : continue;
2142 82 : }
2143 :
2144 : /* We shouldn't have any fancy wrapping of
2145 : component-refs on the LHS, but look through
2146 : VIEW_CONVERT_EXPRs as that is easy. */
2147 13955294 : while (TREE_CODE (lhs) == VIEW_CONVERT_EXPR)
2148 10 : lhs = TREE_OPERAND (lhs, 0);
2149 13955284 : if (TREE_CODE (lhs) == MEM_REF
2150 615669 : && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR
2151 137099 : && integer_zerop (TREE_OPERAND (lhs, 1))
2152 57664 : && (sym = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0))
2153 57664 : && DECL_P (sym)
2154 57664 : && !TREE_ADDRESSABLE (sym)
2155 13990680 : && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym)))
2156 : lhs = sym;
2157 : else
2158 13946854 : lhs = gimple_assign_lhs (stmt);
2159 :
2160 : /* Rewrite the RHS and make sure the resulting assignment
2161 : is validly typed. */
2162 13955284 : maybe_rewrite_mem_ref_base (rhsp, suitable_for_renaming);
2163 13955284 : rhs = gimple_assign_rhs1 (stmt);
2164 13955284 : if (gimple_assign_lhs (stmt) != lhs
2165 13963714 : && !useless_type_conversion_p (TREE_TYPE (lhs),
2166 8430 : TREE_TYPE (rhs)))
2167 : {
2168 3883 : if (gimple_clobber_p (stmt))
2169 : {
2170 11 : rhs = build_constructor (TREE_TYPE (lhs), NULL);
2171 11 : TREE_THIS_VOLATILE (rhs) = 1;
2172 : }
2173 : else
2174 3872 : rhs = fold_build1 (VIEW_CONVERT_EXPR,
2175 : TREE_TYPE (lhs), rhs);
2176 : }
2177 13955284 : if (gimple_assign_lhs (stmt) != lhs)
2178 8430 : gimple_assign_set_lhs (stmt, lhs);
2179 :
2180 13955284 : if (gimple_assign_rhs1 (stmt) != rhs)
2181 : {
2182 3883 : gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
2183 3883 : gimple_assign_set_rhs_from_tree (&gsi, rhs);
2184 : }
2185 : }
2186 :
2187 37014929 : else if (gimple_code (stmt) == GIMPLE_CALL)
2188 : {
2189 2975599 : unsigned i;
2190 2975599 : if (optimize_atomic_compare_exchange_p (stmt))
2191 : {
2192 5780 : tree expected = gimple_call_arg (stmt, 1);
2193 5780 : tree decl = TREE_OPERAND (expected, 0);
2194 5780 : if (bitmap_bit_p (suitable_for_renaming, DECL_UID (decl)))
2195 : {
2196 5705 : fold_builtin_atomic_compare_exchange (&gsi);
2197 5705 : continue;
2198 : }
2199 75 : else if (!TREE_ADDRESSABLE (decl))
2200 : /* If there are partial defs of the decl we may
2201 : have cleared the addressable bit but set
2202 : DECL_NOT_GIMPLE_REG_P. We have to restore
2203 : TREE_ADDRESSABLE here. */
2204 27 : TREE_ADDRESSABLE (decl) = 1;
2205 : }
2206 2969819 : else if (is_asan_mark_p (stmt))
2207 : {
2208 714 : tree var = TREE_OPERAND (gimple_call_arg (stmt, 1), 0);
2209 714 : if (bitmap_bit_p (suitable_for_renaming, DECL_UID (var)))
2210 : {
2211 663 : unlink_stmt_vdef (stmt);
2212 663 : if (asan_mark_p (stmt, ASAN_MARK_POISON))
2213 : {
2214 352 : gcall *call
2215 352 : = gimple_build_call_internal (IFN_ASAN_POISON, 0);
2216 352 : gimple_call_set_lhs (call, var);
2217 352 : gsi_replace (&gsi, call, true);
2218 : }
2219 : else
2220 : {
2221 : /* In ASAN_MARK (UNPOISON, &b, ...) the variable
2222 : is uninitialized. Avoid dependencies on
2223 : previous out of scope value. */
2224 311 : tree clobber = build_clobber (TREE_TYPE (var));
2225 311 : gimple *g = gimple_build_assign (var, clobber);
2226 311 : gsi_replace (&gsi, g, true);
2227 : }
2228 663 : continue;
2229 663 : }
2230 : }
2231 2969105 : else if (gimple_call_internal_p (stmt, IFN_GOMP_SIMT_ENTER))
2232 0 : for (i = 1; i < gimple_call_num_args (stmt); i++)
2233 : {
2234 0 : tree *argp = gimple_call_arg_ptr (stmt, i);
2235 0 : if (*argp == null_pointer_node)
2236 0 : continue;
2237 0 : gcc_assert (TREE_CODE (*argp) == ADDR_EXPR
2238 : && VAR_P (TREE_OPERAND (*argp, 0)));
2239 0 : tree var = TREE_OPERAND (*argp, 0);
2240 0 : if (bitmap_bit_p (suitable_for_renaming, DECL_UID (var)))
2241 0 : *argp = null_pointer_node;
2242 : }
2243 8005542 : for (i = 0; i < gimple_call_num_args (stmt); ++i)
2244 : {
2245 5036311 : tree *argp = gimple_call_arg_ptr (stmt, i);
2246 5036311 : maybe_rewrite_mem_ref_base (argp, suitable_for_renaming);
2247 : }
2248 : }
2249 :
2250 34039330 : else if (gimple_code (stmt) == GIMPLE_ASM)
2251 : {
2252 10868 : gasm *asm_stmt = as_a <gasm *> (stmt);
2253 10868 : unsigned i;
2254 47699 : for (i = 0; i < gimple_asm_noutputs (asm_stmt); ++i)
2255 : {
2256 36831 : tree link = gimple_asm_output_op (asm_stmt, i);
2257 36831 : maybe_rewrite_mem_ref_base (&TREE_VALUE (link),
2258 : suitable_for_renaming);
2259 : }
2260 24789 : for (i = 0; i < gimple_asm_ninputs (asm_stmt); ++i)
2261 : {
2262 13921 : tree link = gimple_asm_input_op (asm_stmt, i);
2263 13921 : maybe_rewrite_mem_ref_base (&TREE_VALUE (link),
2264 : suitable_for_renaming);
2265 : }
2266 : }
2267 :
2268 34028462 : else if (gimple_debug_bind_p (stmt)
2269 27183392 : && gimple_debug_bind_has_value_p (stmt))
2270 : {
2271 11221952 : tree *valuep = gimple_debug_bind_get_value_ptr (stmt);
2272 11221952 : tree decl;
2273 11221952 : maybe_rewrite_mem_ref_base (valuep, suitable_for_renaming);
2274 11221952 : decl = non_rewritable_mem_ref_base (*valuep);
2275 11221952 : if (decl
2276 11221952 : && bitmap_bit_p (suitable_for_renaming, DECL_UID (decl)))
2277 10 : gimple_debug_bind_reset_value (stmt);
2278 : }
2279 :
2280 65383868 : if (gimple_references_memory_p (stmt)
2281 44379329 : || is_gimple_debug (stmt))
2282 33767908 : update_stmt (stmt);
2283 :
2284 50963845 : gsi_next (&gsi);
2285 : }
2286 :
2287 : /* Update SSA form here, we are called as non-pass as well. */
2288 220958 : if (number_of_loops (cfun) > 1
2289 220958 : && loops_state_satisfies_p (LOOP_CLOSED_SSA))
2290 65 : rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
2291 : else
2292 220893 : update_ssa (TODO_update_ssa);
2293 : }
2294 :
2295 12460035 : timevar_pop (TV_ADDRESS_TAKEN);
2296 12460035 : }
2297 :
2298 : namespace {
2299 :
2300 : const pass_data pass_data_update_address_taken =
2301 : {
2302 : GIMPLE_PASS, /* type */
2303 : "addressables", /* name */
2304 : OPTGROUP_NONE, /* optinfo_flags */
2305 : TV_ADDRESS_TAKEN, /* tv_id */
2306 : PROP_ssa, /* properties_required */
2307 : 0, /* properties_provided */
2308 : 0, /* properties_destroyed */
2309 : 0, /* todo_flags_start */
2310 : TODO_update_address_taken, /* todo_flags_finish */
2311 : };
2312 :
2313 : class pass_update_address_taken : public gimple_opt_pass
2314 : {
2315 : public:
2316 0 : pass_update_address_taken (gcc::context *ctxt)
2317 0 : : gimple_opt_pass (pass_data_update_address_taken, ctxt)
2318 : {}
2319 :
2320 : /* opt_pass methods: */
2321 :
2322 : }; // class pass_update_address_taken
2323 :
2324 : } // anon namespace
2325 :
2326 : gimple_opt_pass *
2327 0 : make_pass_update_address_taken (gcc::context *ctxt)
2328 : {
2329 0 : return new pass_update_address_taken (ctxt);
2330 : }
|