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 11835043 : redirect_edge_var_map_add (edge e, tree result, tree def, location_t locus)
56 : {
57 11835043 : edge_var_map new_node;
58 :
59 11835043 : if (edge_var_maps == NULL)
60 68170 : edge_var_maps = new hash_map<edge, auto_vec<edge_var_map> >;
61 :
62 11835043 : auto_vec<edge_var_map> &slot = edge_var_maps->get_or_insert (e);
63 11835043 : new_node.def = def;
64 11835043 : new_node.result = result;
65 11835043 : new_node.locus = locus;
66 :
67 11835043 : slot.safe_push (new_node);
68 11835043 : }
69 :
70 :
71 : /* Clear the var mappings in edge E. */
72 :
73 : void
74 140180034 : redirect_edge_var_map_clear (edge e)
75 : {
76 140180034 : if (!edge_var_maps)
77 : return;
78 :
79 124636740 : auto_vec<edge_var_map> *head = edge_var_maps->get (e);
80 :
81 124636740 : if (head)
82 10537323 : 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 420870 : redirect_edge_var_map_dup (edge newe, edge olde)
94 : {
95 420870 : if (!edge_var_maps)
96 : return;
97 :
98 391979 : auto_vec<edge_var_map> *new_head = &edge_var_maps->get_or_insert (newe);
99 391979 : auto_vec<edge_var_map> *old_head = edge_var_maps->get (olde);
100 391979 : if (!old_head)
101 : return;
102 :
103 7919 : 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 8171290 : redirect_edge_var_map_vector (edge e)
112 : {
113 : /* Hey, what kind of idiot would... you'd be surprised. */
114 8171290 : if (!edge_var_maps)
115 : return NULL;
116 :
117 8144446 : auto_vec<edge_var_map> *slot = edge_var_maps->get (e);
118 8144446 : if (!slot)
119 : return NULL;
120 :
121 : return slot;
122 : }
123 :
124 : /* Clear the edge variable mappings. */
125 :
126 : void
127 969342464 : redirect_edge_var_map_empty (void)
128 : {
129 969342464 : if (edge_var_maps)
130 244142407 : edge_var_maps->empty ();
131 969342464 : }
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 63784011 : ssa_redirect_edge (edge e, basic_block dest)
141 : {
142 63784011 : gphi_iterator gsi;
143 63784011 : gphi *phi;
144 :
145 63784011 : 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 63784011 : if (! (e->dest->flags & BB_DUPLICATED))
151 74340941 : for (gsi = gsi_start_phis (e->dest); !gsi_end_p (gsi); gsi_next (&gsi))
152 : {
153 12466215 : tree def;
154 12466215 : location_t locus;
155 :
156 12466215 : phi = gsi.phi ();
157 12466215 : def = gimple_phi_arg_def (phi, e->dest_idx);
158 12466215 : locus = gimple_phi_arg_location (phi, e->dest_idx);
159 :
160 12466215 : if (def == NULL_TREE)
161 1527214 : continue;
162 :
163 10939001 : redirect_edge_var_map_add (e, gimple_phi_result (phi), def, locus);
164 : }
165 :
166 63784011 : e = redirect_edge_succ_nodup (e, dest);
167 :
168 63784011 : 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 3346259 : flush_pending_stmts (edge e)
177 : {
178 3346259 : gphi *phi;
179 3346259 : edge_var_map *vm;
180 3346259 : int i;
181 3346259 : gphi_iterator gsi;
182 :
183 3346259 : vec<edge_var_map> *v = redirect_edge_var_map_vector (e);
184 3346259 : if (!v)
185 345029 : return;
186 :
187 3001230 : for (gsi = gsi_start_phis (e->dest), i = 0;
188 8281709 : !gsi_end_p (gsi) && v->iterate (i, &vm);
189 5280479 : gsi_next (&gsi), i++)
190 : {
191 5280479 : tree def;
192 :
193 5280479 : phi = gsi.phi ();
194 5280479 : def = redirect_edge_var_map_def (vm);
195 5280479 : add_phi_arg (phi, def, e, redirect_edge_var_map_location (vm));
196 : }
197 :
198 3001230 : 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 347855588 : target_for_debug_bind (tree var)
244 : {
245 347857621 : if (!MAY_HAVE_DEBUG_BIND_STMTS)
246 : return NULL_TREE;
247 :
248 326530881 : if (TREE_CODE (var) == SSA_NAME)
249 : {
250 16111101 : var = SSA_NAME_VAR (var);
251 : if (var == NULL_TREE)
252 : return NULL_TREE;
253 : }
254 :
255 274144481 : if ((!VAR_P (var) || VAR_DECL_IS_VIRTUAL_OPERAND (var))
256 334525793 : && TREE_CODE (var) != PARM_DECL)
257 : return NULL_TREE;
258 :
259 273693989 : if (DECL_HAS_VALUE_EXPR_P (var))
260 2033 : return target_for_debug_bind (DECL_VALUE_EXPR (var));
261 :
262 273691956 : if (DECL_IGNORED_P (var))
263 : return NULL_TREE;
264 :
265 : /* var-tracking only tracks registers. */
266 251785707 : if (!is_gimple_reg_type (TREE_TYPE (var)))
267 8927617 : 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 10996306 : find_released_ssa_name (tree *tp, int *walk_subtrees, void *data_)
277 : {
278 10996306 : struct walk_stmt_info *wi = (struct walk_stmt_info *) data_;
279 :
280 10996306 : if (wi && wi->is_lhs)
281 : return NULL_TREE;
282 :
283 10966947 : if (TREE_CODE (*tp) == SSA_NAME)
284 : {
285 1779109 : if (SSA_NAME_IN_FREE_LIST (*tp))
286 : return *tp;
287 :
288 1769123 : *walk_subtrees = 0;
289 : }
290 9187838 : else if (IS_TYPE_OR_DECL_P (*tp))
291 37058 : *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 89276407 : insert_debug_temp_for_var_def (gimple_stmt_iterator *gsi, tree var)
302 : {
303 89276407 : imm_use_iterator imm_iter;
304 89276407 : use_operand_p use_p;
305 89276407 : gimple *stmt;
306 89276407 : gimple *def_stmt = NULL;
307 89276407 : int usecount = 0;
308 89276407 : tree value = NULL;
309 :
310 89276407 : if (!MAY_HAVE_DEBUG_BIND_STMTS)
311 85889705 : 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 89276407 : 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 187888772 : FOR_EACH_IMM_USE_FAST (use_p, imm_iter, var)
321 : {
322 11495707 : stmt = USE_STMT (use_p);
323 :
324 11495707 : if (!gimple_debug_bind_p (stmt))
325 7640173 : continue;
326 :
327 3855534 : if (usecount++)
328 : break;
329 :
330 3386702 : 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 88772006 : }
339 :
340 88772006 : if (!usecount)
341 : return;
342 :
343 3386702 : if (gsi)
344 2982113 : def_stmt = gsi_stmt (*gsi);
345 : else
346 404589 : 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 3386702 : if (gimple_code (def_stmt) == GIMPLE_PHI)
352 : {
353 165538 : value = degenerate_phi_result (as_a <gphi *> (def_stmt));
354 165538 : 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 165406 : else if (value == error_mark_node)
359 0 : value = NULL;
360 : }
361 3221164 : 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 1270092 : value = NULL;
366 1951072 : else if (is_gimple_assign (def_stmt))
367 : {
368 1887177 : bool no_value = false;
369 :
370 1887177 : if (!dom_info_available_p (CDI_DOMINATORS))
371 : {
372 39213 : struct walk_stmt_info wi;
373 :
374 39213 : 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 39180 : if ((!gsi && !gimple_bb (def_stmt))
403 78393 : || walk_gimple_op (def_stmt, find_released_ssa_name, &wi))
404 9854 : no_value = true;
405 : }
406 :
407 39213 : if (!no_value)
408 1877323 : value = gimple_assign_rhs_to_tree (def_stmt);
409 : }
410 :
411 3386702 : 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 1904333 : if (usecount == 1
427 1046794 : || gimple_code (def_stmt) == GIMPLE_PHI
428 1038751 : || CONSTANT_CLASS_P (value)
429 2941856 : || is_gimple_reg (value))
430 : ;
431 : else
432 : {
433 1035947 : gdebug *def_temp;
434 1035947 : tree vexpr = build_debug_expr_decl (TREE_TYPE (value));
435 :
436 1035947 : def_temp = gimple_build_debug_bind (vexpr,
437 : unshare_expr (value),
438 : def_stmt);
439 :
440 : /* FIXME: Is setting the mode really necessary? */
441 1035947 : if (DECL_P (value))
442 2767 : SET_DECL_MODE (vexpr, DECL_MODE (value));
443 : else
444 1033180 : SET_DECL_MODE (vexpr, TYPE_MODE (TREE_TYPE (value)));
445 :
446 1035947 : if (gsi)
447 824758 : gsi_insert_before (gsi, def_temp, GSI_SAME_STMT);
448 : else
449 : {
450 211189 : gimple_stmt_iterator ngsi = gsi_for_stmt (def_stmt);
451 211189 : gsi_insert_before (&ngsi, def_temp, GSI_SAME_STMT);
452 : }
453 :
454 1035947 : value = vexpr;
455 : }
456 : }
457 :
458 13061713 : FOR_EACH_IMM_USE_STMT (stmt, imm_iter, var)
459 : {
460 6288309 : if (!gimple_debug_bind_p (stmt))
461 868342 : continue;
462 :
463 5419967 : if (value)
464 : {
465 11386147 : FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
466 3795580 : 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 3794987 : if (TREE_CODE (value) != DEBUG_EXPR_DECL)
470 : {
471 888776 : gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
472 888776 : fold_stmt_inplace (&gsi);
473 : }
474 : }
475 : else
476 1624980 : gimple_debug_bind_reset_value (stmt);
477 :
478 5419967 : update_stmt (stmt);
479 3386702 : }
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 162124349 : insert_debug_temps_for_defs (gimple_stmt_iterator *gsi)
489 : {
490 162124349 : gimple *stmt;
491 162124349 : ssa_op_iter op_iter;
492 162124349 : def_operand_p def_p;
493 :
494 162124349 : if (!MAY_HAVE_DEBUG_BIND_STMTS)
495 44701158 : return;
496 :
497 117423191 : stmt = gsi_stmt (*gsi);
498 :
499 269871783 : FOR_EACH_PHI_OR_STMT_DEF (def_p, stmt, op_iter, SSA_OP_DEF)
500 : {
501 35025401 : tree var = DEF_FROM_PTR (def_p);
502 :
503 35025401 : if (TREE_CODE (var) != SSA_NAME)
504 152275 : continue;
505 :
506 34873126 : 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 7231 : reset_debug_uses (gimple *stmt)
514 : {
515 7231 : ssa_op_iter op_iter;
516 7231 : def_operand_p def_p;
517 7231 : imm_use_iterator imm_iter;
518 7231 : gimple *use_stmt;
519 :
520 7231 : if (!MAY_HAVE_DEBUG_BIND_STMTS)
521 177 : return;
522 :
523 18807 : FOR_EACH_PHI_OR_STMT_DEF (def_p, stmt, op_iter, SSA_OP_DEF)
524 : {
525 4699 : tree var = DEF_FROM_PTR (def_p);
526 :
527 4699 : if (TREE_CODE (var) != SSA_NAME)
528 0 : continue;
529 :
530 14677 : FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, var)
531 : {
532 5279 : if (!gimple_debug_bind_p (use_stmt))
533 5197 : continue;
534 :
535 82 : gimple_debug_bind_reset_value (use_stmt);
536 82 : update_stmt (use_stmt);
537 4699 : }
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 240808 : release_defs_bitset (bitmap toremove)
547 : {
548 240808 : unsigned j;
549 240808 : 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 240808 : auto_vec<tree, 16> names;
559 240808 : names.reserve (bitmap_count_bits (toremove) + 1);
560 240808 : names.quick_push (NULL_TREE);
561 2708741 : EXECUTE_IF_SET_IN_BITMAP (toremove, 0, j, bi)
562 2467933 : names.quick_push (ssa_name (j));
563 :
564 240808 : bitmap_tree_view (toremove);
565 745703 : while (!bitmap_empty_p (toremove))
566 : {
567 264087 : j = names.length () - 1;
568 3526137 : for (unsigned i = names.length () - 1; names[i];)
569 : {
570 3262050 : bool remove_now = true;
571 3262050 : tree var = names[i];
572 3262050 : gimple *stmt;
573 3262050 : imm_use_iterator uit;
574 :
575 7205938 : FOR_EACH_IMM_USE_STMT (stmt, uit, var)
576 : {
577 1475955 : ssa_op_iter dit;
578 1475955 : def_operand_p def_p;
579 :
580 : /* We can't propagate PHI nodes into debug stmts. */
581 1475955 : if (gimple_code (stmt) == GIMPLE_PHI
582 1475955 : || is_gimple_debug (stmt))
583 681838 : 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 794117 : FOR_EACH_SSA_DEF_OPERAND (def_p, stmt, dit, SSA_OP_DEF)
590 : {
591 794117 : tree odef = DEF_FROM_PTR (def_p);
592 :
593 794117 : if (bitmap_bit_p (toremove, SSA_NAME_VERSION (odef)))
594 : {
595 : remove_now = false;
596 : break;
597 : }
598 : }
599 :
600 794117 : if (!remove_now)
601 : break;
602 3262050 : }
603 :
604 3262050 : if (remove_now)
605 : {
606 2467933 : gimple *def = SSA_NAME_DEF_STMT (var);
607 2467933 : gimple_stmt_iterator gsi = gsi_for_stmt (def);
608 :
609 2467933 : if (gimple_code (def) == GIMPLE_PHI)
610 629032 : remove_phi_node (&gsi, true);
611 : else
612 : {
613 1838901 : gsi_remove (&gsi, true);
614 1838901 : release_defs (def);
615 : }
616 2467933 : bitmap_clear_bit (toremove, SSA_NAME_VERSION (var));
617 : }
618 : else
619 794117 : --i;
620 3262050 : if (--j != i)
621 3074612 : names[i] = names[j];
622 : }
623 : }
624 240808 : bitmap_list_view (toremove);
625 240808 : }
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 2939419686 : verify_vssa (basic_block bb, tree current_vdef, sbitmap visited)
640 : {
641 2939419686 : bool err = false;
642 :
643 2939419686 : if (!bitmap_set_bit (visited, bb->index))
644 : return false;
645 :
646 : /* Pick up the single virtual PHI def. */
647 2240350018 : gphi *phi = NULL;
648 2892866006 : for (gphi_iterator si = gsi_start_phis (bb); !gsi_end_p (si);
649 652515988 : gsi_next (&si))
650 : {
651 652515988 : tree res = gimple_phi_result (si.phi ());
652 1609851669 : if (virtual_operand_p (res))
653 : {
654 304819693 : 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 2240350018 : if (phi)
666 : {
667 304819693 : current_vdef = gimple_phi_result (phi);
668 304819693 : 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 16569834078 : for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
678 12089134042 : gsi_next (&gsi))
679 : {
680 12089134042 : gimple *stmt = gsi_stmt (gsi);
681 17273186964 : tree vuse = gimple_vuse (stmt);
682 5124119458 : if (vuse)
683 : {
684 3420320623 : 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 15509454665 : tree vdef = gimple_vdef (stmt);
694 3420320623 : if (vdef)
695 : {
696 2130944922 : current_vdef = vdef;
697 2130944922 : 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 2240350018 : edge_iterator ei;
709 2240350018 : edge e;
710 4959419232 : FOR_EACH_EDGE (e, ei, bb->succs)
711 : {
712 2719069214 : gphi *phi = get_virtual_phi (e->dest);
713 2719069214 : if (phi
714 2719069214 : && 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 2719069214 : 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 13513674998 : verify_ssa_name (tree ssa_name, bool is_virtual)
739 : {
740 13513674998 : if (TREE_CODE (ssa_name) != SSA_NAME)
741 : {
742 0 : error ("expected an SSA_NAME object");
743 0 : return true;
744 : }
745 :
746 13513674998 : 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 13513674998 : if (SSA_NAME_VAR (ssa_name) != NULL_TREE
753 8064173064 : && 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 13513674998 : 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 13513674998 : 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 13513674998 : 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 13513674998 : if (SSA_NAME_IS_DEFAULT_DEF (ssa_name)
778 13513674998 : && !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 5742677037 : verify_def (basic_block bb, basic_block *definition_block, tree ssa_name,
801 : gimple *stmt, bool is_virtual)
802 : {
803 5742677037 : if (verify_ssa_name (ssa_name, is_virtual))
804 0 : goto err;
805 :
806 5742677037 : if (SSA_NAME_VAR (ssa_name)
807 3144648959 : && 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 5742677037 : 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 5742677037 : definition_block[SSA_NAME_VERSION (ssa_name)] = bb;
822 :
823 5742677037 : 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 10976116569 : 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 10976116569 : bool err = false;
864 10976116569 : tree ssa_name = USE_FROM_PTR (use_p);
865 :
866 10976116569 : if (!TREE_VISITED (ssa_name))
867 6121106243 : if (verify_imm_links (stderr, ssa_name))
868 10976116569 : err = true;
869 :
870 10976116569 : TREE_VISITED (ssa_name) = 1;
871 :
872 10976116569 : if (gimple_nop_p (SSA_NAME_DEF_STMT (ssa_name))
873 10976116569 : && SSA_NAME_IS_DEFAULT_DEF (ssa_name))
874 : ; /* Default definitions have empty statements. Nothing to do. */
875 9426686973 : else if (!def_bb)
876 : {
877 0 : error ("missing definition");
878 0 : err = true;
879 : }
880 9426686973 : else if (bb != def_bb
881 9426686973 : && !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 9426686973 : else if (bb == def_bb
888 9426686973 : && names_defined_in_bb != NULL
889 15059919063 : && !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 10976116569 : if (check_abnormal
896 10983831527 : && !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 10976116569 : if (use_p->prev == NULL)
905 : {
906 0 : error ("no immediate_use list");
907 0 : err = true;
908 : }
909 : else
910 : {
911 10976116569 : tree listvar;
912 10976116569 : if (use_p->prev->use == NULL)
913 6121106243 : listvar = use_p->prev->loc.ssa_name;
914 : else
915 4855010326 : listvar = USE_FROM_PTR (use_p->prev);
916 10976116569 : if (listvar != ssa_name)
917 : {
918 0 : error ("wrong immediate use list");
919 0 : err = true;
920 : }
921 : }
922 :
923 10976116569 : 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 10976116569 : 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 652527093 : verify_phi_args (gphi *phi, basic_block bb, basic_block *definition_block)
945 : {
946 652527093 : edge e;
947 652527093 : bool err = false;
948 652527093 : size_t i, phi_num_args = gimple_phi_num_args (phi);
949 :
950 1305054186 : 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 2304813495 : for (i = 0; i < phi_num_args; i++)
958 : {
959 1652286402 : use_operand_p op_p = gimple_phi_arg_imm_use_ptr (phi, i);
960 1652286402 : tree op = USE_FROM_PTR (op_p);
961 :
962 1652286402 : e = EDGE_PRED (bb, i);
963 :
964 1652286402 : 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 1652286402 : 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 1652286402 : 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 1652286402 : if (TREE_CODE (op) == SSA_NAME)
986 : {
987 2849360696 : err = verify_ssa_name (op, virtual_operand_p (gimple_phi_result (phi)));
988 1424680348 : err |= verify_use (e->src, definition_block[SSA_NAME_VERSION (op)],
989 1424680348 : op_p, phi, e->flags & EDGE_ABNORMAL, NULL);
990 : }
991 :
992 1652286402 : if (TREE_CODE (op) == ADDR_EXPR)
993 : {
994 12175864 : tree base = TREE_OPERAND (op, 0);
995 16131779 : while (handled_component_p (base))
996 3955915 : base = TREE_OPERAND (base, 0);
997 12175864 : if ((VAR_P (base)
998 : || TREE_CODE (base) == PARM_DECL
999 : || TREE_CODE (base) == RESULT_DECL)
1000 5433613 : && !TREE_ADDRESSABLE (base))
1001 : {
1002 0 : error ("address taken, but ADDRESSABLE bit not set");
1003 0 : err = true;
1004 : }
1005 : }
1006 :
1007 1652286402 : 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 1652286402 : 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 652527093 : error:
1023 652527093 : 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 652527093 : 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 220456889 : verify_ssa (bool check_modified_stmt, bool check_ssa_operands)
1039 : {
1040 220456889 : basic_block bb;
1041 440913778 : basic_block *definition_block = XCNEWVEC (basic_block, num_ssa_names);
1042 220456889 : ssa_op_iter iter;
1043 220456889 : tree op;
1044 220456889 : enum dom_state orig_dom_state = dom_info_state (CDI_DOMINATORS);
1045 220456889 : auto_bitmap names_defined_in_bb;
1046 :
1047 220456889 : gcc_assert (!need_ssa_update_p (cfun));
1048 :
1049 220456889 : timevar_push (TV_TREE_SSA_VERIFY);
1050 :
1051 220456889 : {
1052 : /* Keep track of SSA names present in the IL. */
1053 220456889 : size_t i;
1054 220456889 : tree name;
1055 220456889 : hash_map <void *, tree> ssa_info;
1056 :
1057 8414439013 : FOR_EACH_SSA_NAME (i, name, cfun)
1058 : {
1059 6346317613 : gimple *stmt;
1060 6346317613 : TREE_VISITED (name) = 0;
1061 :
1062 12692635226 : verify_ssa_name (name, virtual_operand_p (name));
1063 :
1064 6346317613 : stmt = SSA_NAME_DEF_STMT (name);
1065 6346317613 : if (!gimple_nop_p (stmt))
1066 : {
1067 5742677037 : basic_block bb = gimple_bb (stmt);
1068 5742677037 : if (verify_def (bb, definition_block,
1069 5742677037 : name, stmt, virtual_operand_p (name)))
1070 0 : goto err;
1071 : }
1072 :
1073 6346317613 : void *info = NULL;
1074 6346317613 : if (POINTER_TYPE_P (TREE_TYPE (name)))
1075 1129537154 : info = SSA_NAME_PTR_INFO (name);
1076 5216780459 : else if (INTEGRAL_TYPE_P (TREE_TYPE (name)))
1077 2202058722 : info = SSA_NAME_RANGE_INFO (name);
1078 6346317613 : if (info)
1079 : {
1080 1330502972 : bool existed;
1081 1330502972 : tree &val = ssa_info.get_or_insert (info, &existed);
1082 1330502972 : 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 1330502972 : val = name;
1093 : }
1094 : }
1095 0 : }
1096 :
1097 220456889 : 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 2024480310 : FOR_EACH_BB_FN (bb, cfun)
1102 : {
1103 1804023421 : edge e;
1104 1804023421 : edge_iterator ei;
1105 :
1106 : /* Make sure that all edges have a clear 'aux' field. */
1107 4306972136 : FOR_EACH_EDGE (e, ei, bb->preds)
1108 : {
1109 2502948715 : 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 2456550514 : for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1119 : {
1120 652527093 : gphi *phi = gsi.phi ();
1121 652527093 : if (verify_phi_args (phi, bb, definition_block))
1122 0 : goto err;
1123 :
1124 652527093 : bitmap_set_bit (names_defined_in_bb,
1125 652527093 : SSA_NAME_VERSION (gimple_phi_result (phi)));
1126 : }
1127 :
1128 : /* Now verify all the uses and vuses in every statement of the block. */
1129 15697335122 : for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
1130 12089288280 : gsi_next (&gsi))
1131 : {
1132 12089288280 : gimple *stmt = gsi_stmt (gsi);
1133 12089288280 : use_operand_p use_p;
1134 :
1135 24110750313 : 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 12089288280 : 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 12089288280 : if (gimple_debug_bind_p (stmt)
1150 6093203138 : && !gimple_debug_bind_has_value_p (stmt))
1151 2021840175 : continue;
1152 :
1153 19618884326 : FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE|SSA_OP_VUSE)
1154 : {
1155 9551436221 : op = USE_FROM_PTR (use_p);
1156 9551436221 : 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 15145813744 : FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_ALL_DEFS)
1162 : {
1163 5078365639 : 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 5078365639 : bitmap_set_bit (names_defined_in_bb, SSA_NAME_VERSION (op));
1174 : }
1175 : }
1176 :
1177 1804023421 : bitmap_clear (names_defined_in_bb);
1178 : }
1179 :
1180 220456889 : free (definition_block);
1181 :
1182 220456889 : if (gimple_vop (cfun)
1183 220456889 : && ssa_default_def (cfun, gimple_vop (cfun)))
1184 : {
1185 220350472 : auto_sbitmap visited (last_basic_block_for_fn (cfun) + 1);
1186 220350472 : bitmap_clear (visited);
1187 220350472 : if (verify_vssa (ENTRY_BLOCK_PTR_FOR_FN (cfun),
1188 : ssa_default_def (cfun, gimple_vop (cfun)), visited))
1189 0 : goto err;
1190 220350472 : }
1191 :
1192 : /* Restore the dominance information to its prior known state, so
1193 : that we do not perturb the compiler's subsequent behavior. */
1194 220456889 : if (orig_dom_state == DOM_NONE)
1195 71867744 : free_dominance_info (CDI_DOMINATORS);
1196 : else
1197 148589145 : set_dom_info_availability (CDI_DOMINATORS, orig_dom_state);
1198 :
1199 220456889 : timevar_pop (TV_TREE_SSA_VERIFY);
1200 220456889 : return;
1201 :
1202 0 : err:
1203 0 : internal_error ("verify_ssa failed");
1204 220456889 : }
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 3261070 : init_tree_ssa (struct function *fn, int size)
1215 : {
1216 3261070 : fn->gimple_df = ggc_cleared_alloc<gimple_df> ();
1217 3261070 : fn->gimple_df->default_defs = hash_table<ssa_name_hasher>::create_ggc (20);
1218 3261070 : pt_solution_reset (&fn->gimple_df->escaped);
1219 3261070 : pt_solution_reset (&fn->gimple_df->escaped_return);
1220 3261070 : init_ssanames (fn, size);
1221 3261070 : }
1222 :
1223 : /* Deallocate memory associated with SSA data structures for FNDECL. */
1224 :
1225 : void
1226 3155338 : delete_tree_ssa (struct function *fn)
1227 : {
1228 3155338 : fini_ssanames (fn);
1229 :
1230 : /* We no longer maintain the SSA operand cache at this point. */
1231 3155338 : if (ssa_operands_active (fn))
1232 3131792 : fini_ssa_operands (fn);
1233 :
1234 3155338 : fn->gimple_df->default_defs->empty ();
1235 3155338 : fn->gimple_df->default_defs = NULL;
1236 3155338 : pt_solution_reset (&fn->gimple_df->escaped);
1237 3155338 : pt_solution_reset (&fn->gimple_df->escaped_return);
1238 3155338 : if (fn->gimple_df->decls_to_pointers != NULL)
1239 40482 : delete fn->gimple_df->decls_to_pointers;
1240 3155338 : fn->gimple_df->decls_to_pointers = NULL;
1241 3155338 : fn->gimple_df = NULL;
1242 :
1243 : /* We no longer need the edge variable maps. */
1244 3155338 : redirect_edge_var_map_empty ();
1245 3155338 : }
1246 :
1247 : /* Return true if EXPR is a useless type conversion, otherwise return
1248 : false. */
1249 :
1250 : bool
1251 953128316 : tree_ssa_useless_type_conversion (tree expr)
1252 : {
1253 953128316 : 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 953128316 : if (!CONVERT_EXPR_P (expr)
1260 880827077 : && TREE_CODE (expr) != VIEW_CONVERT_EXPR
1261 879795571 : && TREE_CODE (expr) != NON_LVALUE_EXPR)
1262 : return false;
1263 :
1264 73877858 : outer_type = TREE_TYPE (expr);
1265 73877858 : inner_type = TREE_TYPE (TREE_OPERAND (expr, 0));
1266 :
1267 73877858 : if (inner_type == error_mark_node)
1268 : return false;
1269 :
1270 73877815 : 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 918995264 : tree_ssa_strip_useless_type_conversions (tree exp)
1279 : {
1280 940268708 : while (tree_ssa_useless_type_conversion (exp))
1281 21273444 : exp = TREE_OPERAND (exp, 0);
1282 918995264 : return exp;
1283 : }
1284 :
1285 : /* Return true if T, as SSA_NAME, has an implicit default defined value. */
1286 :
1287 : bool
1288 366834867 : ssa_defined_default_def_p (tree t)
1289 : {
1290 366834867 : tree var = SSA_NAME_VAR (t);
1291 :
1292 146131434 : if (!var)
1293 : ;
1294 : /* Parameters get their initial value from the function entry. */
1295 146131434 : 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 113546898 : 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 113346732 : 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 364525197 : ssa_undefined_value_p (tree t, bool partial)
1314 : {
1315 364525197 : gimple *def_stmt;
1316 :
1317 729050394 : gcc_checking_assert (!virtual_operand_p (t));
1318 :
1319 364525197 : if (ssa_defined_default_def_p (t))
1320 : return false;
1321 :
1322 : /* The value is undefined iff its definition statement is empty. */
1323 333789711 : def_stmt = SSA_NAME_DEF_STMT (t);
1324 333789711 : 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 327329067 : 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 51905018 : if (partial && is_gimple_assign (def_stmt)
1357 366998052 : && (gimple_assign_rhs_code (def_stmt) == REALPART_EXPR
1358 39418315 : || gimple_assign_rhs_code (def_stmt) == IMAGPART_EXPR))
1359 : {
1360 603853 : tree real_imag_part = TREE_OPERAND (gimple_assign_rhs1 (def_stmt), 0);
1361 603853 : if (TREE_CODE (real_imag_part) == SSA_NAME
1362 603853 : && 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 51904873 : if (partial && is_gimple_assign (def_stmt)
1369 366997762 : && gimple_assign_rhs_code (def_stmt) == COMPLEX_EXPR)
1370 : {
1371 17478 : tree rhs1, rhs2;
1372 :
1373 17478 : rhs1 = gimple_assign_rhs1 (def_stmt);
1374 17478 : rhs2 = gimple_assign_rhs2 (def_stmt);
1375 17142 : return (TREE_CODE (rhs1) == SSA_NAME && ssa_undefined_value_p (rhs1))
1376 34579 : || (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 320177 : ssa_name_any_use_dominates_bb_p (tree var, basic_block bb)
1389 : {
1390 320177 : imm_use_iterator iter;
1391 320177 : use_operand_p use_p;
1392 1297087 : FOR_EACH_IMM_USE_FAST (use_p, iter, var)
1393 : {
1394 679449 : if (is_a <gphi *> (USE_STMT (use_p))
1395 679449 : || is_gimple_debug (USE_STMT (use_p)))
1396 615901 : continue;
1397 63548 : basic_block dombb = gimple_bb (USE_STMT (use_p));
1398 63548 : if (dominated_by_p (CDI_DOMINATORS, bb, dombb))
1399 22716 : return true;
1400 22716 : }
1401 :
1402 297461 : 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 11784372 : mark_ssa_maybe_undefs (void)
1410 : {
1411 11784372 : 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 11784372 : unsigned int i;
1417 11784372 : tree var;
1418 558663245 : FOR_EACH_SSA_NAME (i, var, cfun)
1419 : {
1420 367781526 : if (SSA_NAME_IS_VIRTUAL_OPERAND (var)
1421 367781526 : || !ssa_undefined_value_p (var, false))
1422 363352445 : ssa_name_set_maybe_undef (var, false);
1423 : else
1424 : {
1425 4429081 : ssa_name_set_maybe_undef (var);
1426 4429081 : queue.safe_push (var);
1427 4429081 : 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 17552498 : while (!queue.is_empty ())
1436 : {
1437 4723462 : var = queue.pop ();
1438 4723462 : imm_use_iterator iter;
1439 4723462 : use_operand_p use_p;
1440 10837506 : 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 1390582 : if (!is_a <gphi *> (USE_STMT (use_p)))
1448 1096201 : continue;
1449 500251 : gphi *phi = as_a <gphi *> (USE_STMT (use_p));
1450 :
1451 500251 : tree def = gimple_phi_result (phi);
1452 500251 : if (ssa_name_maybe_undef_p (def))
1453 188689 : 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 311562 : int idx = phi_arg_index_from_use (use_p);
1462 311562 : basic_block bb = gimple_phi_arg_edge (phi, idx)->src;
1463 311562 : if (ssa_name_any_use_dominates_bb_p (var, bb))
1464 17181 : continue;
1465 :
1466 294381 : ssa_name_set_maybe_undef (def);
1467 294381 : queue.safe_push (def);
1468 294381 : 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 4723462 : }
1472 : }
1473 11784372 : }
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 30129639 : maybe_rewrite_mem_ref_base (tree *tp, bitmap suitable_for_renaming)
1481 : {
1482 30129639 : tree sym;
1483 :
1484 34114649 : while (handled_component_p (*tp))
1485 3985010 : tp = &TREE_OPERAND (*tp, 0);
1486 30129639 : if (TREE_CODE (*tp) == MEM_REF
1487 2057626 : && 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 186117 : && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym))
1492 55856 : && is_gimple_reg_type (TREE_TYPE (*tp))
1493 30185485 : && ! VOID_TYPE_P (TREE_TYPE (*tp)))
1494 : {
1495 55846 : if (VECTOR_TYPE_P (TREE_TYPE (sym))
1496 1084 : && useless_type_conversion_p (TREE_TYPE (*tp),
1497 1084 : TREE_TYPE (TREE_TYPE (sym)))
1498 56096 : && multiple_p (mem_ref_offset (*tp),
1499 250 : wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (*tp)))))
1500 : {
1501 498 : *tp = build3 (BIT_FIELD_REF, TREE_TYPE (*tp), sym,
1502 249 : TYPE_SIZE (TREE_TYPE (*tp)),
1503 : int_const_binop (MULT_EXPR,
1504 498 : bitsize_int (BITS_PER_UNIT),
1505 249 : TREE_OPERAND (*tp, 1)));
1506 : }
1507 55597 : 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 55602 : && (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 55593 : else if (integer_zerop (TREE_OPERAND (*tp, 1))
1519 55593 : && DECL_SIZE (sym) == TYPE_SIZE (TREE_TYPE (*tp)))
1520 : {
1521 55233 : if (!useless_type_conversion_p (TREE_TYPE (*tp),
1522 55233 : TREE_TYPE (sym)))
1523 12359 : *tp = build1 (VIEW_CONVERT_EXPR,
1524 12359 : TREE_TYPE (*tp), sym);
1525 : else
1526 42874 : *tp = sym;
1527 : }
1528 360 : else if (DECL_SIZE (sym)
1529 360 : && TREE_CODE (DECL_SIZE (sym)) == INTEGER_CST
1530 360 : && (known_subrange_p
1531 360 : (mem_ref_offset (*tp),
1532 360 : wi::to_offset (TYPE_SIZE_UNIT (TREE_TYPE (*tp))),
1533 360 : 0, wi::to_offset (DECL_SIZE_UNIT (sym))))
1534 360 : && (! INTEGRAL_TYPE_P (TREE_TYPE (*tp))
1535 346 : || (wi::to_offset (TYPE_SIZE (TREE_TYPE (*tp)))
1536 692 : == TYPE_PRECISION (TREE_TYPE (*tp))))
1537 360 : && (! INTEGRAL_TYPE_P (TREE_TYPE (sym))
1538 169 : || type_has_mode_precision_p (TREE_TYPE (sym)))
1539 720 : && wi::umod_trunc (wi::to_offset (TYPE_SIZE (TREE_TYPE (*tp))),
1540 720 : BITS_PER_UNIT) == 0)
1541 : {
1542 720 : *tp = build3 (BIT_FIELD_REF, TREE_TYPE (*tp), sym,
1543 360 : TYPE_SIZE (TREE_TYPE (*tp)),
1544 : wide_int_to_tree (bitsizetype,
1545 360 : mem_ref_offset (*tp)
1546 720 : << LOG2_BITS_PER_UNIT));
1547 : }
1548 : }
1549 30129639 : }
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 297263568 : non_rewritable_mem_ref_base (tree ref)
1556 : {
1557 297263568 : tree base;
1558 :
1559 : /* A plain decl does not need it set. */
1560 297263568 : if (DECL_P (ref))
1561 : return NULL_TREE;
1562 :
1563 266620062 : switch (TREE_CODE (ref))
1564 : {
1565 2617803 : case REALPART_EXPR:
1566 2617803 : case IMAGPART_EXPR:
1567 2617803 : case BIT_FIELD_REF:
1568 2617803 : if (DECL_P (TREE_OPERAND (ref, 0)))
1569 : return NULL_TREE;
1570 : break;
1571 2444285 : case VIEW_CONVERT_EXPR:
1572 2444285 : if (DECL_P (TREE_OPERAND (ref, 0)))
1573 : {
1574 1097391 : if (TYPE_SIZE (TREE_TYPE (ref))
1575 1097391 : != 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 265059497 : default:;
1583 : }
1584 :
1585 265059497 : 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 265059497 : if (TREE_CODE (base) == MEM_REF
1590 265059497 : && TREE_CODE (TREE_OPERAND (base, 0)) == ADDR_EXPR)
1591 : {
1592 6097011 : tree decl = TREE_OPERAND (TREE_OPERAND (base, 0), 0);
1593 6097011 : if (! DECL_P (decl))
1594 : return NULL_TREE;
1595 6063131 : if (! is_gimple_reg_type (TREE_TYPE (base))
1596 5894919 : || VOID_TYPE_P (TREE_TYPE (base))
1597 11958050 : || TREE_THIS_VOLATILE (decl) != TREE_THIS_VOLATILE (base))
1598 : return decl;
1599 5893695 : if ((VECTOR_TYPE_P (TREE_TYPE (decl))
1600 5891583 : || TREE_CODE (TREE_TYPE (decl)) == COMPLEX_TYPE)
1601 3499 : && useless_type_conversion_p (TREE_TYPE (base),
1602 3499 : TREE_TYPE (TREE_TYPE (decl)))
1603 433 : && known_ge (mem_ref_offset (base), 0)
1604 386 : && known_gt (wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (decl))),
1605 : mem_ref_offset (base))
1606 5894075 : && multiple_p (mem_ref_offset (base),
1607 380 : wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (base)))))
1608 378 : return NULL_TREE;
1609 : /* For same sizes and zero offset we can use a VIEW_CONVERT_EXPR. */
1610 5893317 : if (integer_zerop (TREE_OPERAND (base, 1))
1611 5893317 : && 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 5275588 : if (DECL_SIZE (decl)
1615 5271059 : && TREE_CODE (DECL_SIZE_UNIT (decl)) == INTEGER_CST
1616 5271059 : && (known_subrange_p
1617 5271059 : (mem_ref_offset (base),
1618 5271059 : wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (base))),
1619 5271059 : 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 5268635 : && (! INTEGRAL_TYPE_P (TREE_TYPE (base))
1625 2738090 : || (wi::to_offset (TYPE_SIZE (TREE_TYPE (base)))
1626 5476180 : == 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 5263203 : && (! INTEGRAL_TYPE_P (TREE_TYPE (decl))
1630 39553 : || type_has_mode_precision_p (TREE_TYPE (decl)))
1631 10504892 : && wi::umod_trunc (wi::to_offset (TYPE_SIZE (TREE_TYPE (base))),
1632 10458608 : BITS_PER_UNIT) == 0)
1633 5229304 : return NULL_TREE;
1634 46284 : return decl;
1635 : }
1636 :
1637 : /* We cannot rewrite a decl in the base. */
1638 258962486 : base = get_base_address (ref);
1639 258962486 : if (DECL_P (base))
1640 : return base;
1641 :
1642 : /* We cannot rewrite TARGET_MEM_REFs. */
1643 239244485 : else if (TREE_CODE (base) == TARGET_MEM_REF
1644 239244485 : && 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 102792245 : non_rewritable_lvalue_p (tree lhs)
1660 : {
1661 : /* A plain decl is always rewritable. */
1662 102792245 : 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 60191764 : if ((TREE_CODE (lhs) == REALPART_EXPR
1668 60191764 : || TREE_CODE (lhs) == IMAGPART_EXPR)
1669 60191764 : && 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 60160706 : if (TREE_CODE (lhs) == MEM_REF
1675 60160706 : && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR)
1676 : {
1677 7115550 : 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 7115550 : if (integer_zerop (TREE_OPERAND (lhs, 1))
1682 2072231 : && DECL_P (decl)
1683 2072171 : && 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 540602 : && ((! INTEGRAL_TYPE_P (TREE_TYPE (decl))
1687 13600 : || compare_tree_int (DECL_SIZE (decl),
1688 13600 : 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 540449 : && (! FLOAT_TYPE_P (TREE_TYPE (decl))
1695 4962 : || types_compatible_p (TREE_TYPE (lhs), TREE_TYPE (decl)))
1696 7651744 : && (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 6579842 : if (DECL_P (decl)
1702 6579776 : && 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 13159618 : && 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 59624781 : if (TREE_CODE (lhs) == BIT_FIELD_REF
1735 19067 : && DECL_P (TREE_OPERAND (lhs, 0))
1736 13420 : && VECTOR_TYPE_P (TREE_TYPE (TREE_OPERAND (lhs, 0)))
1737 13366 : && TYPE_MODE (TREE_TYPE (TREE_OPERAND (lhs, 0))) != BLKmode
1738 1573 : && operand_equal_p (TYPE_SIZE_UNIT (TREE_TYPE (lhs)),
1739 1573 : TYPE_SIZE_UNIT
1740 : (TREE_TYPE (TREE_TYPE (TREE_OPERAND (lhs, 0)))), 0)
1741 59626353 : && (tree_to_uhwi (TREE_OPERAND (lhs, 2))
1742 1572 : % 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 105925294 : 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 105925294 : if (is_global_var (var)
1758 104301855 : || TREE_CODE (var) == RESULT_DECL
1759 210227149 : || bitmap_bit_p (addresses_taken, DECL_UID (var)))
1760 10431193 : return;
1761 :
1762 95494101 : bool maybe_reg = false;
1763 95494101 : if (TREE_ADDRESSABLE (var))
1764 : {
1765 1513499 : TREE_ADDRESSABLE (var) = 0;
1766 1513499 : maybe_reg = true;
1767 1513499 : 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 95494101 : if (is_gimple_reg_type (TREE_TYPE (var)))
1780 : {
1781 79873004 : if (bitmap_bit_p (not_reg_needs, DECL_UID (var)))
1782 : {
1783 32627 : DECL_NOT_GIMPLE_REG_P (var) = 1;
1784 32627 : 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 79840377 : else if (TREE_CODE (TREE_TYPE (var)) == BITINT_TYPE
1792 39088 : && (cfun->curr_properties & PROP_gimple_lbitint) != 0
1793 79860255 : && 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 2218 : DECL_NOT_GIMPLE_REG_P (var) = 1;
1798 2218 : 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 79838159 : else if (DECL_NOT_GIMPLE_REG_P (var))
1806 : {
1807 7978 : maybe_reg = true;
1808 7978 : DECL_NOT_GIMPLE_REG_P (var) = 0;
1809 : }
1810 79873004 : if (maybe_reg)
1811 : {
1812 547796 : if (is_gimple_reg (var))
1813 : {
1814 540437 : 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 540437 : bitmap_set_bit (suitable_for_renaming, DECL_UID (var));
1821 : }
1822 : else
1823 7359 : 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 59103009 : is_asan_mark_p (gimple *stmt)
1833 : {
1834 59103009 : 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 12421098 : execute_update_addresses_taken (void)
1861 : {
1862 12421098 : basic_block bb;
1863 12421098 : auto_bitmap addresses_taken;
1864 12421098 : auto_bitmap not_reg_needs;
1865 12421098 : auto_bitmap suitable_for_renaming;
1866 12421098 : bool optimistic_not_addressable = false;
1867 12421098 : tree var;
1868 12421098 : unsigned i;
1869 :
1870 12421098 : timevar_push (TV_ADDRESS_TAKEN);
1871 :
1872 : /* Collect into ADDRESSES_TAKEN all variables whose address is taken within
1873 : the function body. */
1874 122698934 : FOR_EACH_BB_FN (bb, cfun)
1875 : {
1876 1044302526 : for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
1877 823746854 : gsi_next (&gsi))
1878 : {
1879 823746854 : gimple *stmt = gsi_stmt (gsi);
1880 823746854 : enum gimple_code code = gimple_code (stmt);
1881 823746854 : tree decl;
1882 :
1883 823746854 : if (code == GIMPLE_CALL)
1884 : {
1885 56139059 : 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 5781 : tree arg = gimple_call_arg (stmt, 1);
1892 5781 : gimple_call_set_arg (stmt, 1, null_pointer_node);
1893 5781 : gimple_ior_addresses_taken (addresses_taken, stmt);
1894 5781 : gimple_call_set_arg (stmt, 1, arg);
1895 : /* Remember we have to check again below. */
1896 5781 : optimistic_not_addressable = true;
1897 : }
1898 56133278 : else if (is_asan_mark_p (stmt)
1899 56133278 : || gimple_call_internal_p (stmt, IFN_GOMP_SIMT_ENTER))
1900 : ;
1901 : else
1902 56112219 : gimple_ior_addresses_taken (addresses_taken, stmt);
1903 : }
1904 : else
1905 : /* Note all addresses taken by the stmt. */
1906 767607795 : 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 823746854 : if (code == GIMPLE_ASSIGN || code == GIMPLE_CALL)
1911 : {
1912 316007445 : tree lhs = gimple_get_lhs (stmt);
1913 316007445 : if (lhs
1914 282317446 : && TREE_CODE (lhs) != SSA_NAME
1915 418801104 : && ((code == GIMPLE_CALL && ! DECL_P (lhs))
1916 102684899 : || non_rewritable_lvalue_p (lhs)))
1917 : {
1918 59719656 : decl = get_base_address (lhs);
1919 59719656 : if (DECL_P (decl))
1920 41527879 : bitmap_set_bit (not_reg_needs, DECL_UID (decl));
1921 : }
1922 : }
1923 :
1924 823746854 : if (gimple_assign_single_p (stmt))
1925 : {
1926 175231295 : tree rhs = gimple_assign_rhs1 (stmt);
1927 175231295 : if ((decl = non_rewritable_mem_ref_base (rhs)))
1928 19728053 : bitmap_set_bit (not_reg_needs, DECL_UID (decl));
1929 : }
1930 :
1931 648515559 : else if (code == GIMPLE_CALL)
1932 : {
1933 166657238 : for (i = 0; i < gimple_call_num_args (stmt); ++i)
1934 : {
1935 110518179 : tree arg = gimple_call_arg (stmt, i);
1936 110518179 : if ((decl = non_rewritable_mem_ref_base (arg)))
1937 162198 : bitmap_set_bit (not_reg_needs, DECL_UID (decl));
1938 : }
1939 : }
1940 :
1941 592376500 : else if (code == GIMPLE_ASM)
1942 : {
1943 730610 : gasm *asm_stmt = as_a <gasm *> (stmt);
1944 1386062 : for (i = 0; i < gimple_asm_noutputs (asm_stmt); ++i)
1945 : {
1946 655452 : tree link = gimple_asm_output_op (asm_stmt, i);
1947 655452 : tree lhs = TREE_VALUE (link);
1948 655452 : if (TREE_CODE (lhs) != SSA_NAME)
1949 : {
1950 168798 : decl = get_base_address (lhs);
1951 168798 : if (DECL_P (decl)
1952 168798 : && (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 95033 : || !useless_type_conversion_p
1957 95033 : (TREE_TYPE (lhs), TREE_TYPE (decl))))
1958 12859 : bitmap_set_bit (not_reg_needs, DECL_UID (decl));
1959 : }
1960 : }
1961 1162535 : for (i = 0; i < gimple_asm_ninputs (asm_stmt); ++i)
1962 : {
1963 431925 : tree link = gimple_asm_input_op (asm_stmt, i);
1964 431925 : 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 147832683 : for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
1971 37554847 : gsi_next (&gsi))
1972 : {
1973 37554847 : size_t i;
1974 37554847 : gphi *phi = gsi.phi ();
1975 :
1976 134792256 : for (i = 0; i < gimple_phi_num_args (phi); i++)
1977 : {
1978 97237409 : tree op = PHI_ARG_DEF (phi, i), var;
1979 97237409 : if (TREE_CODE (op) == ADDR_EXPR
1980 823099 : && (var = get_base_address (TREE_OPERAND (op, 0))) != NULL
1981 98060508 : && DECL_P (var))
1982 613624 : 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 38527817 : for (var = DECL_ARGUMENTS (cfun->decl); var; var = DECL_CHAIN (var))
1991 26106719 : maybe_optimize_var (var, addresses_taken, not_reg_needs,
1992 : suitable_for_renaming);
1993 :
1994 92239673 : FOR_EACH_VEC_SAFE_ELT (cfun->local_decls, i, var)
1995 79818575 : 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 12421098 : if (!bitmap_empty_p (suitable_for_renaming)
2001 12421098 : || optimistic_not_addressable)
2002 : {
2003 6853561 : FOR_EACH_BB_FN (bb, cfun)
2004 63874962 : for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);)
2005 : {
2006 50607660 : gimple *stmt = gsi_stmt (gsi);
2007 :
2008 : /* Re-write TARGET_MEM_REFs of symbols we want to
2009 : rewrite into SSA form. */
2010 50607660 : if (gimple_assign_single_p (stmt))
2011 : {
2012 13939836 : tree lhs = gimple_assign_lhs (stmt);
2013 13939836 : tree rhs, *rhsp = gimple_assign_rhs1_ptr (stmt);
2014 13939836 : tree sym;
2015 :
2016 : /* Rewrite LHS IMAG/REALPART_EXPR similar to
2017 : gimplify_modify_expr_complex_part. */
2018 13939836 : if ((TREE_CODE (lhs) == IMAGPART_EXPR
2019 13939836 : || TREE_CODE (lhs) == REALPART_EXPR)
2020 2217 : && DECL_P (TREE_OPERAND (lhs, 0))
2021 13941320 : && bitmap_bit_p (suitable_for_renaming,
2022 1484 : DECL_UID (TREE_OPERAND (lhs, 0))))
2023 : {
2024 1410 : tree other = make_ssa_name (TREE_TYPE (lhs));
2025 2124 : tree lrhs = build1 (TREE_CODE (lhs) == IMAGPART_EXPR
2026 : ? REALPART_EXPR : IMAGPART_EXPR,
2027 1410 : TREE_TYPE (other),
2028 1410 : TREE_OPERAND (lhs, 0));
2029 1410 : suppress_warning (lrhs);
2030 1410 : gimple *load = gimple_build_assign (other, lrhs);
2031 1410 : location_t loc = gimple_location (stmt);
2032 1410 : gimple_set_location (load, loc);
2033 2820 : gimple_set_vuse (load, gimple_vuse (stmt));
2034 1410 : gsi_insert_before (&gsi, load, GSI_SAME_STMT);
2035 1410 : gimple_assign_set_lhs (stmt, TREE_OPERAND (lhs, 0));
2036 1410 : gimple_assign_set_rhs_with_ops
2037 2124 : (&gsi, COMPLEX_EXPR,
2038 : TREE_CODE (lhs) == IMAGPART_EXPR
2039 714 : ? other : gimple_assign_rhs1 (stmt),
2040 1410 : TREE_CODE (lhs) == IMAGPART_EXPR
2041 696 : ? gimple_assign_rhs1 (stmt) : other, NULL_TREE);
2042 1410 : stmt = gsi_stmt (gsi);
2043 1410 : unlink_stmt_vdef (stmt);
2044 1410 : update_stmt (stmt);
2045 1410 : continue;
2046 1410 : }
2047 :
2048 : /* Rewrite a vector insert via a BIT_FIELD_REF on the LHS
2049 : into a BIT_INSERT_EXPR. */
2050 13938426 : if (TREE_CODE (lhs) == BIT_FIELD_REF
2051 817 : && DECL_P (TREE_OPERAND (lhs, 0))
2052 759 : && bitmap_bit_p (suitable_for_renaming,
2053 759 : DECL_UID (TREE_OPERAND (lhs, 0)))
2054 633 : && VECTOR_TYPE_P (TREE_TYPE (TREE_OPERAND (lhs, 0)))
2055 633 : && TYPE_MODE (TREE_TYPE (TREE_OPERAND (lhs, 0))) != BLKmode
2056 633 : && operand_equal_p (TYPE_SIZE_UNIT (TREE_TYPE (lhs)),
2057 633 : TYPE_SIZE_UNIT (TREE_TYPE
2058 : (TREE_TYPE (TREE_OPERAND (lhs, 0)))),
2059 : 0)
2060 13939059 : && (tree_to_uhwi (TREE_OPERAND (lhs, 2))
2061 633 : % tree_to_uhwi (TYPE_SIZE (TREE_TYPE (lhs))) == 0))
2062 : {
2063 633 : tree var = TREE_OPERAND (lhs, 0);
2064 633 : tree val = gimple_assign_rhs1 (stmt);
2065 633 : if (! types_compatible_p (TREE_TYPE (TREE_TYPE (var)),
2066 633 : 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 633 : tree bitpos = TREE_OPERAND (lhs, 2);
2077 633 : gimple_assign_set_lhs (stmt, var);
2078 633 : gimple_assign_set_rhs_with_ops
2079 633 : (&gsi, BIT_INSERT_EXPR, var, val, bitpos);
2080 633 : stmt = gsi_stmt (gsi);
2081 633 : unlink_stmt_vdef (stmt);
2082 633 : update_stmt (stmt);
2083 633 : continue;
2084 633 : }
2085 :
2086 : /* Rewrite a vector insert using a MEM_REF on the LHS
2087 : into a BIT_INSERT_EXPR. */
2088 13937793 : if (TREE_CODE (lhs) == MEM_REF
2089 610301 : && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR
2090 135501 : && (sym = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0))
2091 135501 : && DECL_P (sym)
2092 135501 : && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym))
2093 8557 : && VECTOR_TYPE_P (TREE_TYPE (sym))
2094 160 : && TYPE_MODE (TREE_TYPE (sym)) != BLKmode
2095 : /* If it is a full replacement we can do better below. */
2096 156 : && maybe_ne (wi::to_poly_offset
2097 156 : (TYPE_SIZE_UNIT (TREE_TYPE (lhs))),
2098 : wi::to_poly_offset
2099 156 : (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 13937875 : && multiple_p (mem_ref_offset (lhs),
2105 : wi::to_poly_offset
2106 13937793 : (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 13937721 : while (TREE_CODE (lhs) == VIEW_CONVERT_EXPR)
2148 10 : lhs = TREE_OPERAND (lhs, 0);
2149 13937711 : if (TREE_CODE (lhs) == MEM_REF
2150 610224 : && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR
2151 135419 : && integer_zerop (TREE_OPERAND (lhs, 1))
2152 57638 : && (sym = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0))
2153 57638 : && DECL_P (sym)
2154 57638 : && !TREE_ADDRESSABLE (sym)
2155 13973478 : && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym)))
2156 : lhs = sym;
2157 : else
2158 13929236 : lhs = gimple_assign_lhs (stmt);
2159 :
2160 : /* Rewrite the RHS and make sure the resulting assignment
2161 : is validly typed. */
2162 13937711 : maybe_rewrite_mem_ref_base (rhsp, suitable_for_renaming);
2163 13937711 : rhs = gimple_assign_rhs1 (stmt);
2164 13937711 : if (gimple_assign_lhs (stmt) != lhs
2165 13946186 : && !useless_type_conversion_p (TREE_TYPE (lhs),
2166 8475 : TREE_TYPE (rhs)))
2167 : {
2168 3926 : 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 3915 : rhs = fold_build1 (VIEW_CONVERT_EXPR,
2175 : TREE_TYPE (lhs), rhs);
2176 : }
2177 13937711 : if (gimple_assign_lhs (stmt) != lhs)
2178 8475 : gimple_assign_set_lhs (stmt, lhs);
2179 :
2180 13937711 : if (gimple_assign_rhs1 (stmt) != rhs)
2181 : {
2182 3926 : gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
2183 3926 : gimple_assign_set_rhs_from_tree (&gsi, rhs);
2184 : }
2185 : }
2186 :
2187 36667824 : else if (gimple_code (stmt) == GIMPLE_CALL)
2188 : {
2189 2975512 : unsigned i;
2190 2975512 : if (optimize_atomic_compare_exchange_p (stmt))
2191 : {
2192 5781 : tree expected = gimple_call_arg (stmt, 1);
2193 5781 : tree decl = TREE_OPERAND (expected, 0);
2194 5781 : if (bitmap_bit_p (suitable_for_renaming, DECL_UID (decl)))
2195 : {
2196 5706 : fold_builtin_atomic_compare_exchange (&gsi);
2197 5706 : 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 2969731 : 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 2969017 : 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 8027508 : for (i = 0; i < gimple_call_num_args (stmt); ++i)
2244 : {
2245 5058365 : tree *argp = gimple_call_arg_ptr (stmt, i);
2246 5058365 : maybe_rewrite_mem_ref_base (argp, suitable_for_renaming);
2247 : }
2248 : }
2249 :
2250 33692312 : else if (gimple_code (stmt) == GIMPLE_ASM)
2251 : {
2252 11035 : gasm *asm_stmt = as_a <gasm *> (stmt);
2253 11035 : unsigned i;
2254 48148 : for (i = 0; i < gimple_asm_noutputs (asm_stmt); ++i)
2255 : {
2256 37113 : tree link = gimple_asm_output_op (asm_stmt, i);
2257 37113 : maybe_rewrite_mem_ref_base (&TREE_VALUE (link),
2258 : suitable_for_renaming);
2259 : }
2260 25316 : for (i = 0; i < gimple_asm_ninputs (asm_stmt); ++i)
2261 : {
2262 14281 : tree link = gimple_asm_input_op (asm_stmt, i);
2263 14281 : maybe_rewrite_mem_ref_base (&TREE_VALUE (link),
2264 : suitable_for_renaming);
2265 : }
2266 : }
2267 :
2268 33681277 : else if (gimple_debug_bind_p (stmt)
2269 26839029 : && gimple_debug_bind_has_value_p (stmt))
2270 : {
2271 11082169 : tree *valuep = gimple_debug_bind_get_value_ptr (stmt);
2272 11082169 : tree decl;
2273 11082169 : maybe_rewrite_mem_ref_base (valuep, suitable_for_renaming);
2274 11082169 : decl = non_rewritable_mem_ref_base (*valuep);
2275 11082169 : if (decl
2276 11082169 : && bitmap_bit_p (suitable_for_renaming, DECL_UID (decl)))
2277 10 : gimple_debug_bind_reset_value (stmt);
2278 : }
2279 :
2280 65021319 : if (gimple_references_memory_p (stmt)
2281 44037584 : || is_gimple_debug (stmt))
2282 33400611 : update_stmt (stmt);
2283 :
2284 50599166 : gsi_next (&gsi);
2285 : }
2286 :
2287 : /* Update SSA form here, we are called as non-pass as well. */
2288 219910 : if (number_of_loops (cfun) > 1
2289 219910 : && loops_state_satisfies_p (LOOP_CLOSED_SSA))
2290 65 : rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
2291 : else
2292 219845 : update_ssa (TODO_update_ssa);
2293 : }
2294 :
2295 12421098 : timevar_pop (TV_ADDRESS_TAKEN);
2296 12421098 : }
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 : }
|