Branch data Line data Source code
1 : : /* Miscellaneous SSA utility functions.
2 : : Copyright (C) 2001-2024 Free Software Foundation, Inc.
3 : :
4 : : This file is part of GCC.
5 : :
6 : : GCC is free software; you can redistribute it and/or modify
7 : : it under the terms of the GNU General Public License as published by
8 : : the Free Software Foundation; either version 3, or (at your option)
9 : : any later version.
10 : :
11 : : GCC is distributed in the hope that it will be useful,
12 : : but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : : GNU General Public License for more details.
15 : :
16 : : You should have received a copy of the GNU General Public License
17 : : along with GCC; see the file COPYING3. If not see
18 : : <http://www.gnu.org/licenses/>. */
19 : :
20 : : #include "config.h"
21 : : #include "system.h"
22 : : #include "coretypes.h"
23 : : #include "backend.h"
24 : : #include "tree.h"
25 : : #include "gimple.h"
26 : : #include "cfghooks.h"
27 : : #include "tree-pass.h"
28 : : #include "ssa.h"
29 : : #include "gimple-pretty-print.h"
30 : : #include "diagnostic-core.h"
31 : : #include "fold-const.h"
32 : : #include "stor-layout.h"
33 : : #include "gimple-iterator.h"
34 : : #include "gimple-fold.h"
35 : : #include "gimplify.h"
36 : : #include "gimple-walk.h"
37 : : #include "tree-ssa-loop-manip.h"
38 : : #include "tree-into-ssa.h"
39 : : #include "tree-ssa.h"
40 : : #include "cfgloop.h"
41 : : #include "cfgexpand.h"
42 : : #include "tree-cfg.h"
43 : : #include "tree-dfa.h"
44 : : #include "stringpool.h"
45 : : #include "attribs.h"
46 : : #include "asan.h"
47 : :
48 : : /* Pointer map of variable mappings, keyed by edge. */
49 : : static hash_map<edge, auto_vec<edge_var_map> > *edge_var_maps;
50 : :
51 : :
52 : : /* Add a mapping with PHI RESULT and PHI DEF associated with edge E. */
53 : :
54 : : void
55 : 7444262 : redirect_edge_var_map_add (edge e, tree result, tree def, location_t locus)
56 : : {
57 : 7444262 : edge_var_map new_node;
58 : :
59 : 7444262 : if (edge_var_maps == NULL)
60 : 63087 : edge_var_maps = new hash_map<edge, auto_vec<edge_var_map> >;
61 : :
62 : 7444262 : auto_vec<edge_var_map> &slot = edge_var_maps->get_or_insert (e);
63 : 7444262 : new_node.def = def;
64 : 7444262 : new_node.result = result;
65 : 7444262 : new_node.locus = locus;
66 : :
67 : 7444262 : slot.safe_push (new_node);
68 : 7444262 : }
69 : :
70 : :
71 : : /* Clear the var mappings in edge E. */
72 : :
73 : : void
74 : 124172964 : redirect_edge_var_map_clear (edge e)
75 : : {
76 : 124172964 : if (!edge_var_maps)
77 : : return;
78 : :
79 : 109934623 : auto_vec<edge_var_map> *head = edge_var_maps->get (e);
80 : :
81 : 109934623 : if (head)
82 : 6569186 : 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 : 330937 : redirect_edge_var_map_dup (edge newe, edge olde)
94 : : {
95 : 330937 : if (!edge_var_maps)
96 : : return;
97 : :
98 : 303974 : auto_vec<edge_var_map> *new_head = &edge_var_maps->get_or_insert (newe);
99 : 303974 : auto_vec<edge_var_map> *old_head = edge_var_maps->get (olde);
100 : 303974 : if (!old_head)
101 : : return;
102 : :
103 : 4654 : 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 : 4742635 : redirect_edge_var_map_vector (edge e)
112 : : {
113 : : /* Hey, what kind of idiot would... you'd be surprised. */
114 : 4742635 : if (!edge_var_maps)
115 : : return NULL;
116 : :
117 : 4728366 : auto_vec<edge_var_map> *slot = edge_var_maps->get (e);
118 : 4728366 : if (!slot)
119 : : return NULL;
120 : :
121 : : return slot;
122 : : }
123 : :
124 : : /* Clear the edge variable mappings. */
125 : :
126 : : void
127 : 785032831 : redirect_edge_var_map_empty (void)
128 : : {
129 : 785032831 : if (edge_var_maps)
130 : 227563153 : edge_var_maps->empty ();
131 : 785032831 : }
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 : 58093447 : ssa_redirect_edge (edge e, basic_block dest)
141 : : {
142 : 58093447 : gphi_iterator gsi;
143 : 58093447 : gphi *phi;
144 : :
145 : 58093447 : 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 : 58093447 : if (! (e->dest->flags & BB_DUPLICATED))
151 : 64360316 : for (gsi = gsi_start_phis (e->dest); !gsi_end_p (gsi); gsi_next (&gsi))
152 : : {
153 : 7874224 : tree def;
154 : 7874224 : location_t locus;
155 : :
156 : 7874224 : phi = gsi.phi ();
157 : 7874224 : def = gimple_phi_arg_def (phi, e->dest_idx);
158 : 7874224 : locus = gimple_phi_arg_location (phi, e->dest_idx);
159 : :
160 : 7874224 : if (def == NULL_TREE)
161 : 1302777 : continue;
162 : :
163 : 6571447 : redirect_edge_var_map_add (e, gimple_phi_result (phi), def, locus);
164 : : }
165 : :
166 : 58093447 : e = redirect_edge_succ_nodup (e, dest);
167 : :
168 : 58093447 : 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 : 2933164 : flush_pending_stmts (edge e)
177 : : {
178 : 2933164 : gphi *phi;
179 : 2933164 : edge_var_map *vm;
180 : 2933164 : int i;
181 : 2933164 : gphi_iterator gsi;
182 : :
183 : 2933164 : vec<edge_var_map> *v = redirect_edge_var_map_vector (e);
184 : 2933164 : if (!v)
185 : 312658 : return;
186 : :
187 : 2620506 : for (gsi = gsi_start_phis (e->dest), i = 0;
188 : 7486485 : !gsi_end_p (gsi) && v->iterate (i, &vm);
189 : 4865979 : gsi_next (&gsi), i++)
190 : : {
191 : 4865979 : tree def;
192 : :
193 : 4865979 : phi = gsi.phi ();
194 : 4865979 : def = redirect_edge_var_map_def (vm);
195 : 4865979 : add_phi_arg (phi, def, e, redirect_edge_var_map_location (vm));
196 : : }
197 : :
198 : 2620506 : 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 : 61 : gimple_replace_ssa_lhs (gimple *stmt, tree nlhs)
222 : : {
223 : 61 : 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 : 61 : gimple_set_lhs (stmt, nlhs);
233 : 61 : }
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 : 300226358 : target_for_debug_bind (tree var)
244 : : {
245 : 300228446 : if (!MAY_HAVE_DEBUG_BIND_STMTS)
246 : : return NULL_TREE;
247 : :
248 : 280577908 : if (TREE_CODE (var) == SSA_NAME)
249 : : {
250 : 14051712 : var = SSA_NAME_VAR (var);
251 : : if (var == NULL_TREE)
252 : : return NULL_TREE;
253 : : }
254 : :
255 : 232958561 : if ((!VAR_P (var) || VAR_DECL_IS_VIRTUAL_OPERAND (var))
256 : 288535544 : && TREE_CODE (var) != PARM_DECL)
257 : : return NULL_TREE;
258 : :
259 : 232735683 : if (DECL_HAS_VALUE_EXPR_P (var))
260 : 2088 : return target_for_debug_bind (DECL_VALUE_EXPR (var));
261 : :
262 : 232733595 : if (DECL_IGNORED_P (var))
263 : : return NULL_TREE;
264 : :
265 : : /* var-tracking only tracks registers. */
266 : 211351612 : if (!is_gimple_reg_type (TREE_TYPE (var)))
267 : 8619294 : 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 : 9965410 : find_released_ssa_name (tree *tp, int *walk_subtrees, void *data_)
277 : : {
278 : 9965410 : struct walk_stmt_info *wi = (struct walk_stmt_info *) data_;
279 : :
280 : 9965410 : if (wi && wi->is_lhs)
281 : : return NULL_TREE;
282 : :
283 : 9948881 : if (TREE_CODE (*tp) == SSA_NAME)
284 : : {
285 : 1595367 : if (SSA_NAME_IN_FREE_LIST (*tp))
286 : : return *tp;
287 : :
288 : 1590334 : *walk_subtrees = 0;
289 : : }
290 : 8353514 : else if (IS_TYPE_OR_DECL_P (*tp))
291 : 21743 : *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 : 80932315 : insert_debug_temp_for_var_def (gimple_stmt_iterator *gsi, tree var)
302 : : {
303 : 80932315 : imm_use_iterator imm_iter;
304 : 80932315 : use_operand_p use_p;
305 : 80932315 : gimple *stmt;
306 : 80932315 : gimple *def_stmt = NULL;
307 : 80932315 : int usecount = 0;
308 : 80932315 : tree value = NULL;
309 : :
310 : 80932315 : if (!MAY_HAVE_DEBUG_BIND_STMTS)
311 : 77875450 : 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 : 80932315 : 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 : 88584242 : FOR_EACH_IMM_USE_FAST (use_p, imm_iter, var)
321 : : {
322 : 9044089 : stmt = USE_STMT (use_p);
323 : :
324 : 9044089 : if (!gimple_debug_bind_p (stmt))
325 : 5588533 : continue;
326 : :
327 : 3455556 : if (usecount++)
328 : : break;
329 : :
330 : 3056865 : if (gimple_debug_bind_get_value (stmt) != var)
331 : : {
332 : : /* Count this as an additional use, so as to make sure we
333 : : use a temp unless VAR's definition has a SINGLE_RHS that
334 : : can be shared. */
335 : : usecount++;
336 : : break;
337 : : }
338 : : }
339 : :
340 : 80541374 : if (!usecount)
341 : : return;
342 : :
343 : 3056865 : if (gsi)
344 : 2738120 : def_stmt = gsi_stmt (*gsi);
345 : : else
346 : 318745 : 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 : 3056865 : if (gimple_code (def_stmt) == GIMPLE_PHI)
352 : : {
353 : 131623 : value = degenerate_phi_result (as_a <gphi *> (def_stmt));
354 : 131623 : if (value && walk_tree (&value, find_released_ssa_name, NULL, NULL))
355 : 44 : value = NULL;
356 : : /* error_mark_node is what fixup_noreturn_call changes PHI arguments
357 : : to. */
358 : 131579 : else if (value == error_mark_node)
359 : 0 : value = NULL;
360 : : }
361 : 2925242 : 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 : 1257141 : value = NULL;
366 : 1668101 : else if (is_gimple_assign (def_stmt))
367 : : {
368 : 1644100 : bool no_value = false;
369 : :
370 : 1644100 : if (!dom_info_available_p (CDI_DOMINATORS))
371 : : {
372 : 21518 : struct walk_stmt_info wi;
373 : :
374 : 21518 : 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 : 18395 : if ((!gsi && !gimple_bb (def_stmt))
403 : 39913 : || walk_gimple_op (def_stmt, find_released_ssa_name, &wi))
404 : 4989 : no_value = true;
405 : : }
406 : :
407 : 21518 : if (!no_value)
408 : 1639111 : value = gimple_assign_rhs_to_tree (def_stmt);
409 : : }
410 : :
411 : 3056865 : 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 : 1663667 : if (usecount == 1
427 : 912611 : || gimple_code (def_stmt) == GIMPLE_PHI
428 : 908011 : || CONSTANT_CLASS_P (value)
429 : 2568692 : || is_gimple_reg (value))
430 : : ;
431 : : else
432 : : {
433 : 903724 : gdebug *def_temp;
434 : 903724 : tree vexpr = build_debug_expr_decl (TREE_TYPE (value));
435 : :
436 : 903724 : def_temp = gimple_build_debug_bind (vexpr,
437 : : unshare_expr (value),
438 : : def_stmt);
439 : :
440 : : /* FIXME: Is setting the mode really necessary? */
441 : 903724 : if (DECL_P (value))
442 : 7240 : SET_DECL_MODE (vexpr, DECL_MODE (value));
443 : : else
444 : 896484 : SET_DECL_MODE (vexpr, TYPE_MODE (TREE_TYPE (value)));
445 : :
446 : 903724 : if (gsi)
447 : 740492 : gsi_insert_before (gsi, def_temp, GSI_SAME_STMT);
448 : : else
449 : : {
450 : 163232 : gimple_stmt_iterator ngsi = gsi_for_stmt (def_stmt);
451 : 163232 : gsi_insert_before (&ngsi, def_temp, GSI_SAME_STMT);
452 : : }
453 : :
454 : 903724 : value = vexpr;
455 : : }
456 : : }
457 : :
458 : 8307775 : FOR_EACH_IMM_USE_STMT (stmt, imm_iter, var)
459 : : {
460 : 5250910 : if (!gimple_debug_bind_p (stmt))
461 : 712343 : continue;
462 : :
463 : 4538567 : if (value)
464 : : {
465 : 9113239 : FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
466 : 3037866 : 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 : 3037507 : if (TREE_CODE (value) != DEBUG_EXPR_DECL)
470 : : {
471 : 774375 : gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
472 : 774375 : fold_stmt_inplace (&gsi);
473 : : }
474 : : }
475 : : else
476 : 1501060 : gimple_debug_bind_reset_value (stmt);
477 : :
478 : 4538567 : update_stmt (stmt);
479 : 3056865 : }
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 : 145646670 : insert_debug_temps_for_defs (gimple_stmt_iterator *gsi)
489 : : {
490 : 145646670 : gimple *stmt;
491 : 145646670 : ssa_op_iter op_iter;
492 : 145646670 : def_operand_p def_p;
493 : :
494 : 145646670 : if (!MAY_HAVE_DEBUG_BIND_STMTS)
495 : 41060516 : return;
496 : :
497 : 104586154 : stmt = gsi_stmt (*gsi);
498 : :
499 : 241411258 : FOR_EACH_PHI_OR_STMT_DEF (def_p, stmt, op_iter, SSA_OP_DEF)
500 : : {
501 : 32238950 : tree var = DEF_FROM_PTR (def_p);
502 : :
503 : 32238950 : if (TREE_CODE (var) != SSA_NAME)
504 : 109931 : continue;
505 : :
506 : 32129019 : 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 : 6224 : reset_debug_uses (gimple *stmt)
514 : : {
515 : 6224 : ssa_op_iter op_iter;
516 : 6224 : def_operand_p def_p;
517 : 6224 : imm_use_iterator imm_iter;
518 : 6224 : gimple *use_stmt;
519 : :
520 : 6224 : if (!MAY_HAVE_DEBUG_BIND_STMTS)
521 : 252 : return;
522 : :
523 : 15842 : FOR_EACH_PHI_OR_STMT_DEF (def_p, stmt, op_iter, SSA_OP_DEF)
524 : : {
525 : 3898 : tree var = DEF_FROM_PTR (def_p);
526 : :
527 : 3898 : if (TREE_CODE (var) != SSA_NAME)
528 : 0 : continue;
529 : :
530 : 8208 : FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, var)
531 : : {
532 : 4310 : if (!gimple_debug_bind_p (use_stmt))
533 : 4270 : continue;
534 : :
535 : 40 : gimple_debug_bind_reset_value (use_stmt);
536 : 40 : update_stmt (use_stmt);
537 : 3898 : }
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 : 225954 : release_defs_bitset (bitmap toremove)
547 : : {
548 : 225954 : unsigned j;
549 : 225954 : 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 : 225954 : auto_vec<tree, 16> names;
559 : 225954 : names.reserve (bitmap_count_bits (toremove) + 1);
560 : 225954 : names.quick_push (NULL_TREE);
561 : 2548417 : EXECUTE_IF_SET_IN_BITMAP (toremove, 0, j, bi)
562 : 2322463 : names.quick_push (ssa_name (j));
563 : :
564 : 225954 : bitmap_tree_view (toremove);
565 : 698117 : while (!bitmap_empty_p (toremove))
566 : : {
567 : 246209 : j = names.length () - 1;
568 : 3322201 : for (unsigned i = names.length () - 1; names[i];)
569 : : {
570 : 3075992 : bool remove_now = true;
571 : 3075992 : tree var = names[i];
572 : 3075992 : gimple *stmt;
573 : 3075992 : imm_use_iterator uit;
574 : :
575 : 3697689 : FOR_EACH_IMM_USE_STMT (stmt, uit, var)
576 : : {
577 : 1375226 : ssa_op_iter dit;
578 : 1375226 : def_operand_p def_p;
579 : :
580 : : /* We can't propagate PHI nodes into debug stmts. */
581 : 1375226 : if (gimple_code (stmt) == GIMPLE_PHI
582 : 1375226 : || is_gimple_debug (stmt))
583 : 621697 : 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 : 753529 : FOR_EACH_SSA_DEF_OPERAND (def_p, stmt, dit, SSA_OP_DEF)
590 : : {
591 : 753529 : tree odef = DEF_FROM_PTR (def_p);
592 : :
593 : 753529 : if (bitmap_bit_p (toremove, SSA_NAME_VERSION (odef)))
594 : : {
595 : : remove_now = false;
596 : : break;
597 : : }
598 : : }
599 : :
600 : 753529 : if (!remove_now)
601 : : break;
602 : 3075992 : }
603 : :
604 : 3075992 : if (remove_now)
605 : : {
606 : 2322463 : gimple *def = SSA_NAME_DEF_STMT (var);
607 : 2322463 : gimple_stmt_iterator gsi = gsi_for_stmt (def);
608 : :
609 : 2322463 : if (gimple_code (def) == GIMPLE_PHI)
610 : 576743 : remove_phi_node (&gsi, true);
611 : : else
612 : : {
613 : 1745720 : gsi_remove (&gsi, true);
614 : 1745720 : release_defs (def);
615 : : }
616 : 2322463 : bitmap_clear_bit (toremove, SSA_NAME_VERSION (var));
617 : : }
618 : : else
619 : 753529 : --i;
620 : 3075992 : if (--j != i)
621 : 2899242 : names[i] = names[j];
622 : : }
623 : : }
624 : 225954 : bitmap_list_view (toremove);
625 : 225954 : }
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 : 2757771717 : verify_vssa (basic_block bb, tree current_vdef, sbitmap visited)
640 : : {
641 : 2757771717 : bool err = false;
642 : :
643 : 2757771717 : if (!bitmap_set_bit (visited, bb->index))
644 : : return false;
645 : :
646 : : /* Pick up the single virtual PHI def. */
647 : 2099542950 : gphi *phi = NULL;
648 : 2723278453 : for (gphi_iterator si = gsi_start_phis (bb); !gsi_end_p (si);
649 : 623735503 : gsi_next (&si))
650 : : {
651 : 623735503 : tree res = gimple_phi_result (si.phi ());
652 : 1543929492 : if (virtual_operand_p (res))
653 : : {
654 : 296458486 : 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 : 2099542950 : if (phi)
666 : : {
667 : 296458486 : current_vdef = gimple_phi_result (phi);
668 : 296458486 : 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 : 14911304055 : for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
678 : 10712218155 : gsi_next (&gsi))
679 : : {
680 : 10712218155 : gimple *stmt = gsi_stmt (gsi);
681 : 15577095524 : tree vuse = gimple_vuse (stmt);
682 : 4808184194 : if (vuse)
683 : : {
684 : 3226671919 : 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 : 13938890074 : tree vdef = gimple_vdef (stmt);
694 : 3226671919 : if (vdef)
695 : : {
696 : 2008803968 : current_vdef = vdef;
697 : 2008803968 : 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 : 2099542950 : edge_iterator ei;
709 : 2099542950 : edge e;
710 : 4650575506 : FOR_EACH_EDGE (e, ei, bb->succs)
711 : : {
712 : 2551032556 : gphi *phi = get_virtual_phi (e->dest);
713 : 2551032556 : if (phi
714 : 2551032556 : && 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 : 2551032556 : 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 : 12699053164 : verify_ssa_name (tree ssa_name, bool is_virtual)
739 : : {
740 : 12699053164 : if (TREE_CODE (ssa_name) != SSA_NAME)
741 : : {
742 : 0 : error ("expected an SSA_NAME object");
743 : 0 : return true;
744 : : }
745 : :
746 : 12699053164 : 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 : 12699053164 : if (SSA_NAME_VAR (ssa_name) != NULL_TREE
753 : 7624693580 : && 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 : 12699053164 : 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 : 12699053164 : 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 : 12699053164 : 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 : 12699053164 : if (SSA_NAME_IS_DEFAULT_DEF (ssa_name)
778 : 12699053164 : && !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 : 5400439473 : verify_def (basic_block bb, basic_block *definition_block, tree ssa_name,
801 : : gimple *stmt, bool is_virtual)
802 : : {
803 : 5400439473 : if (verify_ssa_name (ssa_name, is_virtual))
804 : 0 : goto err;
805 : :
806 : 5400439473 : if (SSA_NAME_VAR (ssa_name)
807 : 2976174535 : && TREE_CODE (SSA_NAME_VAR (ssa_name)) == RESULT_DECL
808 : 106 : && 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 : 5400439473 : 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 : 5400439473 : definition_block[SSA_NAME_VERSION (ssa_name)] = bb;
822 : :
823 : 5400439473 : 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 : 10150951813 : 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 : 10150951813 : bool err = false;
864 : 10150951813 : tree ssa_name = USE_FROM_PTR (use_p);
865 : :
866 : 10150951813 : if (!TREE_VISITED (ssa_name))
867 : 5760517817 : if (verify_imm_links (stderr, ssa_name))
868 : 10150951813 : err = true;
869 : :
870 : 10150951813 : TREE_VISITED (ssa_name) = 1;
871 : :
872 : 10150951813 : if (gimple_nop_p (SSA_NAME_DEF_STMT (ssa_name))
873 : 10150951813 : && SSA_NAME_IS_DEFAULT_DEF (ssa_name))
874 : : ; /* Default definitions have empty statements. Nothing to do. */
875 : 8718882836 : else if (!def_bb)
876 : : {
877 : 0 : error ("missing definition");
878 : 0 : err = true;
879 : : }
880 : 8718882836 : else if (bb != def_bb
881 : 8718882836 : && !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 : 8718882836 : else if (bb == def_bb
888 : 8718882836 : && names_defined_in_bb != NULL
889 : 13976252533 : && !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 : 10150951813 : if (check_abnormal
896 : 10158341161 : && !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 : 10150951813 : if (use_p->prev == NULL)
905 : : {
906 : 0 : error ("no immediate_use list");
907 : 0 : err = true;
908 : : }
909 : : else
910 : : {
911 : 10150951813 : tree listvar;
912 : 10150951813 : if (use_p->prev->use == NULL)
913 : 5760517817 : listvar = use_p->prev->loc.ssa_name;
914 : : else
915 : 4390433996 : listvar = USE_FROM_PTR (use_p->prev);
916 : 10150951813 : if (listvar != ssa_name)
917 : : {
918 : 0 : error ("wrong immediate use list");
919 : 0 : err = true;
920 : : }
921 : : }
922 : :
923 : 10150951813 : 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 : 10150951813 : 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 : 623746438 : verify_phi_args (gphi *phi, basic_block bb, basic_block *definition_block)
945 : : {
946 : 623746438 : edge e;
947 : 623746438 : bool err = false;
948 : 623746438 : size_t i, phi_num_args = gimple_phi_num_args (phi);
949 : :
950 : 1247492876 : 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 : 2158821964 : for (i = 0; i < phi_num_args; i++)
958 : : {
959 : 1535075526 : use_operand_p op_p = gimple_phi_arg_imm_use_ptr (phi, i);
960 : 1535075526 : tree op = USE_FROM_PTR (op_p);
961 : :
962 : 1535075526 : e = EDGE_PRED (bb, i);
963 : :
964 : 1535075526 : 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 : 1535075526 : 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 : 1535075526 : 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 : 1535075526 : if (TREE_CODE (op) == SSA_NAME)
986 : : {
987 : 2660231366 : err = verify_ssa_name (op, virtual_operand_p (gimple_phi_result (phi)));
988 : 1330115683 : err |= verify_use (e->src, definition_block[SSA_NAME_VERSION (op)],
989 : 1330115683 : op_p, phi, e->flags & EDGE_ABNORMAL, NULL);
990 : : }
991 : :
992 : 1535075526 : if (TREE_CODE (op) == ADDR_EXPR)
993 : : {
994 : 10878913 : tree base = TREE_OPERAND (op, 0);
995 : 14581180 : while (handled_component_p (base))
996 : 3702267 : base = TREE_OPERAND (base, 0);
997 : 10878913 : if ((VAR_P (base)
998 : : || TREE_CODE (base) == PARM_DECL
999 : : || TREE_CODE (base) == RESULT_DECL)
1000 : 4885753 : && !TREE_ADDRESSABLE (base))
1001 : : {
1002 : 0 : error ("address taken, but ADDRESSABLE bit not set");
1003 : 0 : err = true;
1004 : : }
1005 : : }
1006 : :
1007 : 1535075526 : 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 : 1535075526 : 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 : 623746438 : error:
1023 : 623746438 : 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 : 623746438 : 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 : 206839058 : verify_ssa (bool check_modified_stmt, bool check_ssa_operands)
1039 : : {
1040 : 206839058 : basic_block bb;
1041 : 413678116 : basic_block *definition_block = XCNEWVEC (basic_block, num_ssa_names);
1042 : 206839058 : ssa_op_iter iter;
1043 : 206839058 : tree op;
1044 : 206839058 : enum dom_state orig_dom_state = dom_info_state (CDI_DOMINATORS);
1045 : 206839058 : auto_bitmap names_defined_in_bb;
1046 : :
1047 : 206839058 : gcc_assert (!need_ssa_update_p (cfun));
1048 : :
1049 : 206839058 : timevar_push (TV_TREE_SSA_VERIFY);
1050 : :
1051 : 206839058 : {
1052 : : /* Keep track of SSA names present in the IL. */
1053 : 206839058 : size_t i;
1054 : 206839058 : tree name;
1055 : 206839058 : hash_map <void *, tree> ssa_info;
1056 : :
1057 : 7777479328 : FOR_EACH_SSA_NAME (i, name, cfun)
1058 : : {
1059 : 5968498008 : gimple *stmt;
1060 : 5968498008 : TREE_VISITED (name) = 0;
1061 : :
1062 : 11936996016 : verify_ssa_name (name, virtual_operand_p (name));
1063 : :
1064 : 5968498008 : stmt = SSA_NAME_DEF_STMT (name);
1065 : 5968498008 : if (!gimple_nop_p (stmt))
1066 : : {
1067 : 5400439473 : basic_block bb = gimple_bb (stmt);
1068 : 5400439473 : if (verify_def (bb, definition_block,
1069 : 5400439473 : name, stmt, virtual_operand_p (name)))
1070 : 0 : goto err;
1071 : : }
1072 : :
1073 : 5968498008 : void *info = NULL;
1074 : 5968498008 : if (POINTER_TYPE_P (TREE_TYPE (name)))
1075 : 1050069414 : info = SSA_NAME_PTR_INFO (name);
1076 : 4918428594 : else if (INTEGRAL_TYPE_P (TREE_TYPE (name)))
1077 : 2057728453 : info = SSA_NAME_RANGE_INFO (name);
1078 : 5968498008 : if (info)
1079 : : {
1080 : 1253655387 : bool existed;
1081 : 1253655387 : tree &val = ssa_info.get_or_insert (info, &existed);
1082 : 1253655387 : 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 : 1253655387 : val = name;
1093 : : }
1094 : : }
1095 : 0 : }
1096 : :
1097 : 206839058 : 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 : 1897060291 : FOR_EACH_BB_FN (bb, cfun)
1102 : : {
1103 : 1690221233 : edge e;
1104 : 1690221233 : edge_iterator ei;
1105 : :
1106 : : /* Make sure that all edges have a clear 'aux' field. */
1107 : 4038532966 : FOR_EACH_EDGE (e, ei, bb->preds)
1108 : : {
1109 : 2348311733 : 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 : 2313967671 : for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1119 : : {
1120 : 623746438 : gphi *phi = gsi.phi ();
1121 : 623746438 : if (verify_phi_args (phi, bb, definition_block))
1122 : 0 : goto err;
1123 : :
1124 : 623746438 : bitmap_set_bit (names_defined_in_bb,
1125 : 623746438 : SSA_NAME_VERSION (gimple_phi_result (phi)));
1126 : : }
1127 : :
1128 : : /* Now verify all the uses and vuses in every statement of the block. */
1129 : 14092810880 : for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
1130 : 10712368414 : gsi_next (&gsi))
1131 : : {
1132 : 10712368414 : gimple *stmt = gsi_stmt (gsi);
1133 : 10712368414 : use_operand_p use_p;
1134 : :
1135 : 21361282678 : 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 : 10712368414 : 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 : 10712368414 : if (gimple_debug_bind_p (stmt)
1150 : 5098357611 : && !gimple_debug_bind_has_value_p (stmt))
1151 : 1612757919 : continue;
1152 : :
1153 : 17920446625 : FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE|SSA_OP_VUSE)
1154 : : {
1155 : 8820836130 : op = USE_FROM_PTR (use_p);
1156 : 8820836130 : 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 : 13865834346 : FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_ALL_DEFS)
1162 : : {
1163 : 4766223851 : 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 : 4766223851 : bitmap_set_bit (names_defined_in_bb, SSA_NAME_VERSION (op));
1174 : : }
1175 : : }
1176 : :
1177 : 1690221233 : bitmap_clear (names_defined_in_bb);
1178 : : }
1179 : :
1180 : 206839058 : free (definition_block);
1181 : :
1182 : 206839058 : if (gimple_vop (cfun)
1183 : 206839058 : && ssa_default_def (cfun, gimple_vop (cfun)))
1184 : : {
1185 : 206739161 : auto_sbitmap visited (last_basic_block_for_fn (cfun) + 1);
1186 : 206739161 : bitmap_clear (visited);
1187 : 206739161 : if (verify_vssa (ENTRY_BLOCK_PTR_FOR_FN (cfun),
1188 : : ssa_default_def (cfun, gimple_vop (cfun)), visited))
1189 : 0 : goto err;
1190 : 206739161 : }
1191 : :
1192 : : /* Restore the dominance information to its prior known state, so
1193 : : that we do not perturb the compiler's subsequent behavior. */
1194 : 206839058 : if (orig_dom_state == DOM_NONE)
1195 : 65351308 : free_dominance_info (CDI_DOMINATORS);
1196 : : else
1197 : 141487750 : set_dom_info_availability (CDI_DOMINATORS, orig_dom_state);
1198 : :
1199 : 206839058 : timevar_pop (TV_TREE_SSA_VERIFY);
1200 : 206839058 : return;
1201 : :
1202 : 0 : err:
1203 : 0 : internal_error ("verify_ssa failed");
1204 : 206839058 : }
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 : 3032726 : init_tree_ssa (struct function *fn, int size)
1215 : : {
1216 : 3032726 : fn->gimple_df = ggc_cleared_alloc<gimple_df> ();
1217 : 3032726 : fn->gimple_df->default_defs = hash_table<ssa_name_hasher>::create_ggc (20);
1218 : 3032726 : pt_solution_reset (&fn->gimple_df->escaped);
1219 : 3032726 : pt_solution_reset (&fn->gimple_df->escaped_return);
1220 : 3032726 : init_ssanames (fn, size);
1221 : 3032726 : }
1222 : :
1223 : : /* Deallocate memory associated with SSA data structures for FNDECL. */
1224 : :
1225 : : void
1226 : 2928225 : delete_tree_ssa (struct function *fn)
1227 : : {
1228 : 2928225 : fini_ssanames (fn);
1229 : :
1230 : : /* We no longer maintain the SSA operand cache at this point. */
1231 : 2928225 : if (ssa_operands_active (fn))
1232 : 2906730 : fini_ssa_operands (fn);
1233 : :
1234 : 2928225 : fn->gimple_df->default_defs->empty ();
1235 : 2928225 : fn->gimple_df->default_defs = NULL;
1236 : 2928225 : pt_solution_reset (&fn->gimple_df->escaped);
1237 : 2928225 : pt_solution_reset (&fn->gimple_df->escaped_return);
1238 : 2928225 : if (fn->gimple_df->decls_to_pointers != NULL)
1239 : 40368 : delete fn->gimple_df->decls_to_pointers;
1240 : 2928225 : fn->gimple_df->decls_to_pointers = NULL;
1241 : 2928225 : fn->gimple_df = NULL;
1242 : :
1243 : : /* We no longer need the edge variable maps. */
1244 : 2928225 : redirect_edge_var_map_empty ();
1245 : 2928225 : }
1246 : :
1247 : : /* Return true if EXPR is a useless type conversion, otherwise return
1248 : : false. */
1249 : :
1250 : : bool
1251 : 895086216 : tree_ssa_useless_type_conversion (tree expr)
1252 : : {
1253 : 895086216 : 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 : 895086216 : if (!CONVERT_EXPR_P (expr)
1260 : 827252807 : && TREE_CODE (expr) != VIEW_CONVERT_EXPR
1261 : 826187448 : && TREE_CODE (expr) != NON_LVALUE_EXPR)
1262 : : return false;
1263 : :
1264 : 69407191 : outer_type = TREE_TYPE (expr);
1265 : 69407191 : inner_type = TREE_TYPE (TREE_OPERAND (expr, 0));
1266 : :
1267 : 69407191 : if (inner_type == error_mark_node)
1268 : : return false;
1269 : :
1270 : 69407128 : 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 : 863387696 : tree_ssa_strip_useless_type_conversions (tree exp)
1279 : : {
1280 : 882710001 : while (tree_ssa_useless_type_conversion (exp))
1281 : 19322305 : exp = TREE_OPERAND (exp, 0);
1282 : 863387696 : return exp;
1283 : : }
1284 : :
1285 : : /* Return true if T, as SSA_NAME, has an implicit default defined value. */
1286 : :
1287 : : bool
1288 : 341777084 : ssa_defined_default_def_p (tree t)
1289 : : {
1290 : 341777084 : tree var = SSA_NAME_VAR (t);
1291 : :
1292 : 136155566 : if (!var)
1293 : : ;
1294 : : /* Parameters get their initial value from the function entry. */
1295 : 136155566 : 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 : 106960204 : 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 : 106778398 : 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 : 341539407 : ssa_undefined_value_p (tree t, bool partial)
1314 : : {
1315 : 341539407 : gimple *def_stmt;
1316 : :
1317 : 683078814 : gcc_checking_assert (!virtual_operand_p (t));
1318 : :
1319 : 341539407 : if (ssa_defined_default_def_p (t))
1320 : : return false;
1321 : :
1322 : : /* The value is undefined iff its definition statement is empty. */
1323 : 312162239 : def_stmt = SSA_NAME_DEF_STMT (t);
1324 : 312162239 : 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 : 306131581 : 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 : 48994911 : if (partial && is_gimple_assign (def_stmt)
1357 : 343645254 : && (gimple_assign_rhs_code (def_stmt) == REALPART_EXPR
1358 : 37234048 : || gimple_assign_rhs_code (def_stmt) == IMAGPART_EXPR))
1359 : : {
1360 : 604396 : tree real_imag_part = TREE_OPERAND (gimple_assign_rhs1 (def_stmt), 0);
1361 : 604396 : if (TREE_CODE (real_imag_part) == SSA_NAME
1362 : 604396 : && 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 : 48994837 : if (partial && is_gimple_assign (def_stmt)
1369 : 343645106 : && gimple_assign_rhs_code (def_stmt) == COMPLEX_EXPR)
1370 : : {
1371 : 17157 : tree rhs1, rhs2;
1372 : :
1373 : 17157 : rhs1 = gimple_assign_rhs1 (def_stmt);
1374 : 17157 : rhs2 = gimple_assign_rhs2 (def_stmt);
1375 : 16730 : return (TREE_CODE (rhs1) == SSA_NAME && ssa_undefined_value_p (rhs1))
1376 : 33846 : || (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 : 313118 : ssa_name_any_use_dominates_bb_p (tree var, basic_block bb)
1389 : : {
1390 : 313118 : imm_use_iterator iter;
1391 : 313118 : use_operand_p use_p;
1392 : 921852 : FOR_EACH_IMM_USE_FAST (use_p, iter, var)
1393 : : {
1394 : 632918 : if (is_a <gphi *> (USE_STMT (use_p))
1395 : 632918 : || is_gimple_debug (USE_STMT (use_p)))
1396 : 570522 : continue;
1397 : 62396 : basic_block dombb = gimple_bb (USE_STMT (use_p));
1398 : 62396 : if (dominated_by_p (CDI_DOMINATORS, bb, dombb))
1399 : : return true;
1400 : : }
1401 : :
1402 : : return false;
1403 : : }
1404 : :
1405 : : /* Mark as maybe_undef any SSA_NAMEs that are unsuitable as ivopts
1406 : : candidates for potentially involving undefined behavior. */
1407 : :
1408 : : void
1409 : 11153068 : mark_ssa_maybe_undefs (void)
1410 : : {
1411 : 11153068 : 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 : 11153068 : unsigned int i;
1417 : 11153068 : tree var;
1418 : 513231724 : FOR_EACH_SSA_NAME (i, var, cfun)
1419 : : {
1420 : 347886896 : if (SSA_NAME_IS_VIRTUAL_OPERAND (var)
1421 : 347886896 : || !ssa_undefined_value_p (var, false))
1422 : 343838517 : ssa_name_set_maybe_undef (var, false);
1423 : : else
1424 : : {
1425 : 4048379 : ssa_name_set_maybe_undef (var);
1426 : 4048379 : queue.safe_push (var);
1427 : 4048379 : if (dump_file && (dump_flags & TDF_DETAILS))
1428 : 34 : fprintf (dump_file, "marking _%i as maybe-undef\n",
1429 : 17 : 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 : 16526578 : while (!queue.is_empty ())
1436 : : {
1437 : 4334362 : var = queue.pop ();
1438 : 4334362 : imm_use_iterator iter;
1439 : 4334362 : use_operand_p use_p;
1440 : 5606953 : 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 : 1272591 : if (!is_a <gphi *> (USE_STMT (use_p)))
1448 : 986608 : continue;
1449 : 485320 : gphi *phi = as_a <gphi *> (USE_STMT (use_p));
1450 : :
1451 : 485320 : tree def = gimple_phi_result (phi);
1452 : 485320 : if (ssa_name_maybe_undef_p (def))
1453 : 180226 : 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 : 305094 : int idx = phi_arg_index_from_use (use_p);
1462 : 305094 : basic_block bb = gimple_phi_arg_edge (phi, idx)->src;
1463 : 305094 : if (ssa_name_any_use_dominates_bb_p (var, bb))
1464 : 19111 : continue;
1465 : :
1466 : 285983 : ssa_name_set_maybe_undef (def);
1467 : 285983 : queue.safe_push (def);
1468 : 285983 : if (dump_file && (dump_flags & TDF_DETAILS))
1469 : 0 : fprintf (dump_file, "marking _%i as maybe-undef because of _%i\n",
1470 : 0 : SSA_NAME_VERSION (def), SSA_NAME_VERSION (var));
1471 : : }
1472 : : }
1473 : 11153068 : }
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 : 23096743 : maybe_rewrite_mem_ref_base (tree *tp, bitmap suitable_for_renaming)
1481 : : {
1482 : 23096743 : tree sym;
1483 : :
1484 : 26237727 : while (handled_component_p (*tp))
1485 : 3140984 : tp = &TREE_OPERAND (*tp, 0);
1486 : 23096743 : if (TREE_CODE (*tp) == MEM_REF
1487 : 1626266 : && TREE_CODE (TREE_OPERAND (*tp, 0)) == ADDR_EXPR
1488 : 264144 : && (sym = TREE_OPERAND (TREE_OPERAND (*tp, 0), 0))
1489 : 264144 : && DECL_P (sym)
1490 : 263732 : && !TREE_ADDRESSABLE (sym)
1491 : 141642 : && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym))
1492 : 50696 : && is_gimple_reg_type (TREE_TYPE (*tp))
1493 : 23147427 : && ! VOID_TYPE_P (TREE_TYPE (*tp)))
1494 : : {
1495 : 50684 : if (VECTOR_TYPE_P (TREE_TYPE (sym))
1496 : 779 : && useless_type_conversion_p (TREE_TYPE (*tp),
1497 : 779 : TREE_TYPE (TREE_TYPE (sym)))
1498 : 50768 : && 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 : 50601 : else if (TREE_CODE (TREE_TYPE (sym)) == COMPLEX_TYPE
1508 : 1007 : && useless_type_conversion_p (TREE_TYPE (*tp),
1509 : 1007 : TREE_TYPE (TREE_TYPE (sym)))
1510 : 50606 : && (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 : 50597 : else if (integer_zerop (TREE_OPERAND (*tp, 1))
1519 : 50597 : && DECL_SIZE (sym) == TYPE_SIZE (TREE_TYPE (*tp)))
1520 : : {
1521 : 50240 : if (!useless_type_conversion_p (TREE_TYPE (*tp),
1522 : 50240 : TREE_TYPE (sym)))
1523 : 13398 : *tp = build1 (VIEW_CONVERT_EXPR,
1524 : 13398 : TREE_TYPE (*tp), sym);
1525 : : else
1526 : 36842 : *tp = sym;
1527 : : }
1528 : 357 : else if (DECL_SIZE (sym)
1529 : 357 : && TREE_CODE (DECL_SIZE (sym)) == INTEGER_CST
1530 : 357 : && (known_subrange_p
1531 : 357 : (mem_ref_offset (*tp),
1532 : 357 : wi::to_offset (TYPE_SIZE_UNIT (TREE_TYPE (*tp))),
1533 : 357 : 0, wi::to_offset (DECL_SIZE_UNIT (sym))))
1534 : 357 : && (! INTEGRAL_TYPE_P (TREE_TYPE (*tp))
1535 : 343 : || (wi::to_offset (TYPE_SIZE (TREE_TYPE (*tp)))
1536 : 686 : == TYPE_PRECISION (TREE_TYPE (*tp))))
1537 : 357 : && (! INTEGRAL_TYPE_P (TREE_TYPE (sym))
1538 : 167 : || type_has_mode_precision_p (TREE_TYPE (sym)))
1539 : 714 : && wi::umod_trunc (wi::to_offset (TYPE_SIZE (TREE_TYPE (*tp))),
1540 : 714 : BITS_PER_UNIT) == 0)
1541 : : {
1542 : 714 : *tp = build3 (BIT_FIELD_REF, TREE_TYPE (*tp), sym,
1543 : 357 : TYPE_SIZE (TREE_TYPE (*tp)),
1544 : 714 : wide_int_to_tree (bitsizetype,
1545 : 357 : mem_ref_offset (*tp)
1546 : 714 : << LOG2_BITS_PER_UNIT));
1547 : : }
1548 : : }
1549 : 23096743 : }
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 : 274546881 : non_rewritable_mem_ref_base (tree ref)
1556 : : {
1557 : 274546881 : tree base;
1558 : :
1559 : : /* A plain decl does not need it set. */
1560 : 274546881 : if (DECL_P (ref))
1561 : : return NULL_TREE;
1562 : :
1563 : 246315116 : switch (TREE_CODE (ref))
1564 : : {
1565 : 2446185 : case REALPART_EXPR:
1566 : 2446185 : case IMAGPART_EXPR:
1567 : 2446185 : case BIT_FIELD_REF:
1568 : 2446185 : if (DECL_P (TREE_OPERAND (ref, 0)))
1569 : : return NULL_TREE;
1570 : : break;
1571 : 2354288 : case VIEW_CONVERT_EXPR:
1572 : 2354288 : if (DECL_P (TREE_OPERAND (ref, 0)))
1573 : : {
1574 : 1093837 : if (TYPE_SIZE (TREE_TYPE (ref))
1575 : 1093837 : != TYPE_SIZE (TREE_TYPE (TREE_OPERAND (ref, 0))))
1576 : 719 : 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 : 244761485 : default:;
1583 : : }
1584 : :
1585 : 244761485 : 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 : 244761485 : if (TREE_CODE (base) == MEM_REF
1590 : 244761485 : && TREE_CODE (TREE_OPERAND (base, 0)) == ADDR_EXPR)
1591 : : {
1592 : 4787555 : tree decl = TREE_OPERAND (TREE_OPERAND (base, 0), 0);
1593 : 4787555 : if (! DECL_P (decl))
1594 : : return NULL_TREE;
1595 : 4753565 : if (! is_gimple_reg_type (TREE_TYPE (base))
1596 : 4614363 : || VOID_TYPE_P (TREE_TYPE (base))
1597 : 9367928 : || TREE_THIS_VOLATILE (decl) != TREE_THIS_VOLATILE (base))
1598 : : return decl;
1599 : 4613490 : if ((VECTOR_TYPE_P (TREE_TYPE (decl))
1600 : 4612386 : || TREE_CODE (TREE_TYPE (decl)) == COMPLEX_TYPE)
1601 : 2407 : && useless_type_conversion_p (TREE_TYPE (base),
1602 : 2407 : 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 : 4613704 : && 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 : 4613278 : if (integer_zerop (TREE_OPERAND (base, 1))
1611 : 4613278 : && 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 : 4206621 : if (DECL_SIZE (decl)
1615 : 4202315 : && TREE_CODE (DECL_SIZE_UNIT (decl)) == INTEGER_CST
1616 : 4202315 : && (known_subrange_p
1617 : 4202315 : (mem_ref_offset (base),
1618 : 4202315 : wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (base))),
1619 : 4202315 : 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 : 4200418 : && (! INTEGRAL_TYPE_P (TREE_TYPE (base))
1625 : 2433165 : || (wi::to_offset (TYPE_SIZE (TREE_TYPE (base)))
1626 : 4866330 : == 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 : 4196206 : && (! INTEGRAL_TYPE_P (TREE_TYPE (decl))
1630 : 38391 : || type_has_mode_precision_p (TREE_TYPE (decl)))
1631 : 8369551 : && wi::umod_trunc (wi::to_offset (TYPE_SIZE (TREE_TYPE (base))),
1632 : 8325860 : BITS_PER_UNIT) == 0)
1633 : 4162930 : return NULL_TREE;
1634 : 43691 : return decl;
1635 : : }
1636 : :
1637 : : /* We cannot rewrite a decl in the base. */
1638 : 239973930 : base = get_base_address (ref);
1639 : 239973930 : if (DECL_P (base))
1640 : : return base;
1641 : :
1642 : : /* We cannot rewrite TARGET_MEM_REFs. */
1643 : 220159503 : else if (TREE_CODE (base) == TARGET_MEM_REF
1644 : 220159503 : && 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 : 96827915 : non_rewritable_lvalue_p (tree lhs)
1660 : : {
1661 : : /* A plain decl is always rewritable. */
1662 : 96827915 : 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 : 58610751 : if ((TREE_CODE (lhs) == REALPART_EXPR
1668 : 58610751 : || TREE_CODE (lhs) == IMAGPART_EXPR)
1669 : 58610751 : && 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 : 58580864 : if (TREE_CODE (lhs) == MEM_REF
1675 : 58580864 : && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR)
1676 : : {
1677 : 7013184 : 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 : 7013184 : if (integer_zerop (TREE_OPERAND (lhs, 1))
1682 : 2981075 : && DECL_P (decl)
1683 : 2981075 : && 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 : 1559784 : && ((! INTEGRAL_TYPE_P (TREE_TYPE (decl))
1687 : 9522 : || compare_tree_int (DECL_SIZE (decl),
1688 : 9522 : TYPE_PRECISION (TREE_TYPE (decl))) == 0)
1689 : 805 : || (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
1690 : 784 : && (TYPE_PRECISION (TREE_TYPE (decl))
1691 : 784 : >= 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 : 1559659 : && (! FLOAT_TYPE_P (TREE_TYPE (decl))
1695 : 5318 : || types_compatible_p (TREE_TYPE (lhs), TREE_TYPE (decl)))
1696 : 8568223 : && (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 : 5458803 : if (DECL_P (decl)
1702 : 5458797 : && VECTOR_TYPE_P (TREE_TYPE (decl))
1703 : 1732 : && TYPE_MODE (TREE_TYPE (decl)) != BLKmode
1704 : 270 : && known_ge (mem_ref_offset (lhs), 0)
1705 : 235 : && known_gt (wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (decl))),
1706 : : mem_ref_offset (lhs))
1707 : 235 : && multiple_p (mem_ref_offset (lhs),
1708 : 235 : wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (lhs))))
1709 : 10917600 : && known_ge (wi::to_poly_offset (TYPE_SIZE (TREE_TYPE (decl))),
1710 : : wi::to_poly_offset (TYPE_SIZE (TREE_TYPE (lhs)))))
1711 : : {
1712 : 234 : poly_uint64 lhs_bits, nelts;
1713 : 234 : if (poly_int_tree_p (TYPE_SIZE (TREE_TYPE (lhs)), &lhs_bits)
1714 : 236 : && multiple_p (lhs_bits,
1715 : : tree_to_uhwi
1716 : 234 : (TYPE_SIZE (TREE_TYPE (TREE_TYPE (decl)))),
1717 : : &nelts)
1718 : 254 : && valid_vector_subparts_p (nelts))
1719 : : {
1720 : 214 : if (known_eq (nelts, 1u))
1721 : 214 : 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 : : 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 : 57026269 : if (TREE_CODE (lhs) == BIT_FIELD_REF
1735 : 18617 : && DECL_P (TREE_OPERAND (lhs, 0))
1736 : 13247 : && VECTOR_TYPE_P (TREE_TYPE (TREE_OPERAND (lhs, 0)))
1737 : 13188 : && TYPE_MODE (TREE_TYPE (TREE_OPERAND (lhs, 0))) != BLKmode
1738 : 1440 : && operand_equal_p (TYPE_SIZE_UNIT (TREE_TYPE (lhs)),
1739 : 1440 : TYPE_SIZE_UNIT
1740 : : (TREE_TYPE (TREE_TYPE (TREE_OPERAND (lhs, 0)))), 0)
1741 : 57027703 : && (tree_to_uhwi (TREE_OPERAND (lhs, 2))
1742 : 1434 : % 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 : 99180953 : 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 : 99180953 : if (is_global_var (var)
1758 : 97641853 : || TREE_CODE (var) == RESULT_DECL
1759 : 196822806 : || bitmap_bit_p (addresses_taken, DECL_UID (var)))
1760 : 9765806 : return;
1761 : :
1762 : 89415147 : bool maybe_reg = false;
1763 : 89415147 : if (TREE_ADDRESSABLE (var))
1764 : : {
1765 : 1378221 : TREE_ADDRESSABLE (var) = 0;
1766 : 1378221 : maybe_reg = true;
1767 : 1378221 : if (dump_file)
1768 : : {
1769 : 67 : fprintf (dump_file, "No longer having address taken: ");
1770 : 67 : print_generic_expr (dump_file, var);
1771 : 67 : 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 : 89415147 : if (is_gimple_reg_type (TREE_TYPE (var)))
1780 : : {
1781 : 74543267 : if (bitmap_bit_p (not_reg_needs, DECL_UID (var)))
1782 : : {
1783 : 31694 : DECL_NOT_GIMPLE_REG_P (var) = 1;
1784 : 31694 : 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 : 74511573 : else if (TREE_CODE (TREE_TYPE (var)) == BITINT_TYPE
1792 : 36506 : && (cfun->curr_properties & PROP_gimple_lbitint) != 0
1793 : 74528685 : && 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 : 1120 : DECL_NOT_GIMPLE_REG_P (var) = 1;
1798 : 1120 : 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 : 74510453 : else if (DECL_NOT_GIMPLE_REG_P (var))
1806 : : {
1807 : 7497 : maybe_reg = true;
1808 : 7497 : DECL_NOT_GIMPLE_REG_P (var) = 0;
1809 : : }
1810 : 74543267 : if (maybe_reg)
1811 : : {
1812 : 509823 : if (is_gimple_reg (var))
1813 : : {
1814 : 503114 : 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 : 503114 : bitmap_set_bit (suitable_for_renaming, DECL_UID (var));
1821 : : }
1822 : : else
1823 : 6709 : 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 : 54420892 : is_asan_mark_p (gimple *stmt)
1833 : : {
1834 : 54420892 : if (!gimple_call_internal_p (stmt, IFN_ASAN_MARK))
1835 : : return false;
1836 : :
1837 : 43888 : tree addr = get_base_address (gimple_call_arg (stmt, 1));
1838 : 43888 : if (TREE_CODE (addr) == ADDR_EXPR
1839 : 43888 : && VAR_P (TREE_OPERAND (addr, 0)))
1840 : : {
1841 : 43684 : tree var = TREE_OPERAND (addr, 0);
1842 : 43684 : if (lookup_attribute (ASAN_USE_AFTER_SCOPE_ATTRIBUTE,
1843 : 43684 : DECL_ATTRIBUTES (var)))
1844 : : return false;
1845 : :
1846 : 39634 : unsigned addressable = TREE_ADDRESSABLE (var);
1847 : 39634 : TREE_ADDRESSABLE (var) = 0;
1848 : 39634 : bool r = is_gimple_reg (var);
1849 : 39634 : TREE_ADDRESSABLE (var) = addressable;
1850 : 39634 : 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 : 11706325 : execute_update_addresses_taken (void)
1861 : : {
1862 : 11706325 : basic_block bb;
1863 : 11706325 : auto_bitmap addresses_taken;
1864 : 11706325 : auto_bitmap not_reg_needs;
1865 : 11706325 : auto_bitmap suitable_for_renaming;
1866 : 11706325 : bool optimistic_not_addressable = false;
1867 : 11706325 : tree var;
1868 : 11706325 : unsigned i;
1869 : :
1870 : 11706325 : timevar_push (TV_ADDRESS_TAKEN);
1871 : :
1872 : : /* Collect into ADDRESSES_TAKEN all variables whose address is taken within
1873 : : the function body. */
1874 : 114131575 : FOR_EACH_BB_FN (bb, cfun)
1875 : : {
1876 : 923295708 : for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
1877 : 718445208 : gsi_next (&gsi))
1878 : : {
1879 : 718445208 : gimple *stmt = gsi_stmt (gsi);
1880 : 718445208 : enum gimple_code code = gimple_code (stmt);
1881 : 718445208 : tree decl;
1882 : :
1883 : 718445208 : if (code == GIMPLE_CALL)
1884 : : {
1885 : 51995516 : 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 : 5865 : tree arg = gimple_call_arg (stmt, 1);
1892 : 5865 : gimple_call_set_arg (stmt, 1, null_pointer_node);
1893 : 5865 : gimple_ior_addresses_taken (addresses_taken, stmt);
1894 : 5865 : gimple_call_set_arg (stmt, 1, arg);
1895 : : /* Remember we have to check again below. */
1896 : 5865 : optimistic_not_addressable = true;
1897 : : }
1898 : 51989651 : else if (is_asan_mark_p (stmt)
1899 : 51989651 : || gimple_call_internal_p (stmt, IFN_GOMP_SIMT_ENTER))
1900 : : ;
1901 : : else
1902 : 51979785 : gimple_ior_addresses_taken (addresses_taken, stmt);
1903 : : }
1904 : : else
1905 : : /* Note all addresses taken by the stmt. */
1906 : 666449692 : 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 : 718445208 : if (code == GIMPLE_ASSIGN || code == GIMPLE_CALL)
1911 : : {
1912 : 295165549 : tree lhs = gimple_get_lhs (stmt);
1913 : 295165549 : if (lhs
1914 : 263890615 : && TREE_CODE (lhs) != SSA_NAME
1915 : 392002502 : && ((code == GIMPLE_CALL && ! DECL_P (lhs))
1916 : 96728728 : || non_rewritable_lvalue_p (lhs)))
1917 : : {
1918 : 57122978 : decl = get_base_address (lhs);
1919 : 57122978 : if (DECL_P (decl))
1920 : 40037621 : bitmap_set_bit (not_reg_needs, DECL_UID (decl));
1921 : : }
1922 : : }
1923 : :
1924 : 718445208 : if (gimple_assign_single_p (stmt))
1925 : : {
1926 : 164352676 : tree rhs = gimple_assign_rhs1 (stmt);
1927 : 164352676 : if ((decl = non_rewritable_mem_ref_base (rhs)))
1928 : 19887369 : bitmap_set_bit (not_reg_needs, DECL_UID (decl));
1929 : : }
1930 : :
1931 : 554092532 : else if (code == GIMPLE_CALL)
1932 : : {
1933 : 154940863 : for (i = 0; i < gimple_call_num_args (stmt); ++i)
1934 : : {
1935 : 102945347 : tree arg = gimple_call_arg (stmt, i);
1936 : 102945347 : if ((decl = non_rewritable_mem_ref_base (arg)))
1937 : 93922 : bitmap_set_bit (not_reg_needs, DECL_UID (decl));
1938 : : }
1939 : : }
1940 : :
1941 : 502097016 : else if (code == GIMPLE_ASM)
1942 : : {
1943 : 694664 : gasm *asm_stmt = as_a <gasm *> (stmt);
1944 : 1297975 : for (i = 0; i < gimple_asm_noutputs (asm_stmt); ++i)
1945 : : {
1946 : 603311 : tree link = gimple_asm_output_op (asm_stmt, i);
1947 : 603311 : tree lhs = TREE_VALUE (link);
1948 : 603311 : if (TREE_CODE (lhs) != SSA_NAME)
1949 : : {
1950 : 151315 : decl = get_base_address (lhs);
1951 : 151315 : if (DECL_P (decl)
1952 : 151315 : && (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 : 89105 : || !useless_type_conversion_p
1957 : 89105 : (TREE_TYPE (lhs), TREE_TYPE (decl))))
1958 : 10612 : bitmap_set_bit (not_reg_needs, DECL_UID (decl));
1959 : : }
1960 : : }
1961 : 1088769 : for (i = 0; i < gimple_asm_ninputs (asm_stmt); ++i)
1962 : : {
1963 : 394105 : tree link = gimple_asm_input_op (asm_stmt, i);
1964 : 394105 : if ((decl = non_rewritable_mem_ref_base (TREE_VALUE (link))))
1965 : 1094 : bitmap_set_bit (not_reg_needs, DECL_UID (decl));
1966 : : }
1967 : : }
1968 : : }
1969 : :
1970 : 137914474 : for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
1971 : 35489224 : gsi_next (&gsi))
1972 : : {
1973 : 35489224 : size_t i;
1974 : 35489224 : gphi *phi = gsi.phi ();
1975 : :
1976 : 124391817 : for (i = 0; i < gimple_phi_num_args (phi); i++)
1977 : : {
1978 : 88902593 : tree op = PHI_ARG_DEF (phi, i), var;
1979 : 88902593 : if (TREE_CODE (op) == ADDR_EXPR
1980 : 725140 : && (var = get_base_address (TREE_OPERAND (op, 0))) != NULL
1981 : 89627733 : && DECL_P (var))
1982 : 529677 : 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 : 36491780 : for (var = DECL_ARGUMENTS (cfun->decl); var; var = DECL_CHAIN (var))
1991 : 24785455 : maybe_optimize_var (var, addresses_taken, not_reg_needs,
1992 : : suitable_for_renaming);
1993 : :
1994 : 86101823 : FOR_EACH_VEC_SAFE_ELT (cfun->local_decls, i, var)
1995 : 74395498 : 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 : 11706325 : if (!bitmap_empty_p (suitable_for_renaming)
2001 : 11706325 : || optimistic_not_addressable)
2002 : : {
2003 : 5573400 : FOR_EACH_BB_FN (bb, cfun)
2004 : 47701183 : for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);)
2005 : : {
2006 : 36939265 : gimple *stmt = gsi_stmt (gsi);
2007 : :
2008 : : /* Re-write TARGET_MEM_REFs of symbols we want to
2009 : : rewrite into SSA form. */
2010 : 36939265 : if (gimple_assign_single_p (stmt))
2011 : : {
2012 : 11915930 : tree lhs = gimple_assign_lhs (stmt);
2013 : 11915930 : tree rhs, *rhsp = gimple_assign_rhs1_ptr (stmt);
2014 : 11915930 : tree sym;
2015 : :
2016 : : /* Rewrite LHS IMAG/REALPART_EXPR similar to
2017 : : gimplify_modify_expr_complex_part. */
2018 : 11915930 : if ((TREE_CODE (lhs) == IMAGPART_EXPR
2019 : 11915930 : || TREE_CODE (lhs) == REALPART_EXPR)
2020 : 1944 : && DECL_P (TREE_OPERAND (lhs, 0))
2021 : 11917387 : && bitmap_bit_p (suitable_for_renaming,
2022 : 1457 : DECL_UID (TREE_OPERAND (lhs, 0))))
2023 : : {
2024 : 1381 : tree other = make_ssa_name (TREE_TYPE (lhs));
2025 : 2074 : tree lrhs = build1 (TREE_CODE (lhs) == IMAGPART_EXPR
2026 : : ? REALPART_EXPR : IMAGPART_EXPR,
2027 : 1381 : TREE_TYPE (other),
2028 : 1381 : TREE_OPERAND (lhs, 0));
2029 : 1381 : suppress_warning (lrhs);
2030 : 1381 : gimple *load = gimple_build_assign (other, lrhs);
2031 : 1381 : location_t loc = gimple_location (stmt);
2032 : 1381 : gimple_set_location (load, loc);
2033 : 2762 : gimple_set_vuse (load, gimple_vuse (stmt));
2034 : 1381 : gsi_insert_before (&gsi, load, GSI_SAME_STMT);
2035 : 1381 : gimple_assign_set_lhs (stmt, TREE_OPERAND (lhs, 0));
2036 : 1381 : gimple_assign_set_rhs_with_ops
2037 : 2074 : (&gsi, COMPLEX_EXPR,
2038 : : TREE_CODE (lhs) == IMAGPART_EXPR
2039 : 693 : ? other : gimple_assign_rhs1 (stmt),
2040 : 1381 : TREE_CODE (lhs) == IMAGPART_EXPR
2041 : 688 : ? gimple_assign_rhs1 (stmt) : other, NULL_TREE);
2042 : 1381 : stmt = gsi_stmt (gsi);
2043 : 1381 : unlink_stmt_vdef (stmt);
2044 : 1381 : update_stmt (stmt);
2045 : 1381 : continue;
2046 : 1381 : }
2047 : :
2048 : : /* Rewrite a vector insert via a BIT_FIELD_REF on the LHS
2049 : : into a BIT_INSERT_EXPR. */
2050 : 11914549 : if (TREE_CODE (lhs) == BIT_FIELD_REF
2051 : 736 : && DECL_P (TREE_OPERAND (lhs, 0))
2052 : 680 : && bitmap_bit_p (suitable_for_renaming,
2053 : 680 : DECL_UID (TREE_OPERAND (lhs, 0)))
2054 : 570 : && VECTOR_TYPE_P (TREE_TYPE (TREE_OPERAND (lhs, 0)))
2055 : 570 : && TYPE_MODE (TREE_TYPE (TREE_OPERAND (lhs, 0))) != BLKmode
2056 : 570 : && operand_equal_p (TYPE_SIZE_UNIT (TREE_TYPE (lhs)),
2057 : 570 : TYPE_SIZE_UNIT (TREE_TYPE
2058 : : (TREE_TYPE (TREE_OPERAND (lhs, 0)))),
2059 : : 0)
2060 : 11915119 : && (tree_to_uhwi (TREE_OPERAND (lhs, 2))
2061 : 570 : % tree_to_uhwi (TYPE_SIZE (TREE_TYPE (lhs))) == 0))
2062 : : {
2063 : 570 : tree var = TREE_OPERAND (lhs, 0);
2064 : 570 : tree val = gimple_assign_rhs1 (stmt);
2065 : 570 : if (! types_compatible_p (TREE_TYPE (TREE_TYPE (var)),
2066 : 570 : 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 : 570 : tree bitpos = TREE_OPERAND (lhs, 2);
2077 : 570 : gimple_assign_set_lhs (stmt, var);
2078 : 570 : gimple_assign_set_rhs_with_ops
2079 : 570 : (&gsi, BIT_INSERT_EXPR, var, val, bitpos);
2080 : 570 : stmt = gsi_stmt (gsi);
2081 : 570 : unlink_stmt_vdef (stmt);
2082 : 570 : update_stmt (stmt);
2083 : 570 : continue;
2084 : 570 : }
2085 : :
2086 : : /* Rewrite a vector insert using a MEM_REF on the LHS
2087 : : into a BIT_INSERT_EXPR. */
2088 : 11913979 : if (TREE_CODE (lhs) == MEM_REF
2089 : 613784 : && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR
2090 : 208712 : && (sym = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0))
2091 : 208712 : && DECL_P (sym)
2092 : 208712 : && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym))
2093 : 6423 : && VECTOR_TYPE_P (TREE_TYPE (sym))
2094 : 133 : && TYPE_MODE (TREE_TYPE (sym)) != BLKmode
2095 : : /* If it is a full replacement we can do better below. */
2096 : 131 : && maybe_ne (wi::to_poly_offset
2097 : 131 : (TYPE_SIZE_UNIT (TREE_TYPE (lhs))),
2098 : : wi::to_poly_offset
2099 : 131 : (TYPE_SIZE_UNIT (TREE_TYPE (sym))))
2100 : 79 : && known_ge (mem_ref_offset (lhs), 0)
2101 : 79 : && known_gt (wi::to_poly_offset
2102 : : (TYPE_SIZE_UNIT (TREE_TYPE (sym))),
2103 : : mem_ref_offset (lhs))
2104 : 11914058 : && multiple_p (mem_ref_offset (lhs),
2105 : : wi::to_poly_offset
2106 : 11913979 : (TYPE_SIZE_UNIT (TREE_TYPE (lhs)))))
2107 : : {
2108 : 79 : tree val = gimple_assign_rhs1 (stmt);
2109 : 79 : if (! types_compatible_p (TREE_TYPE (val),
2110 : 79 : 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 : 79 : tree bitpos
2133 : 79 : = wide_int_to_tree (bitsizetype,
2134 : 79 : mem_ref_offset (lhs) * BITS_PER_UNIT);
2135 : 79 : gimple_assign_set_lhs (stmt, sym);
2136 : 79 : gimple_assign_set_rhs_with_ops
2137 : 79 : (&gsi, BIT_INSERT_EXPR, sym, val, bitpos);
2138 : 79 : stmt = gsi_stmt (gsi);
2139 : 79 : unlink_stmt_vdef (stmt);
2140 : 79 : update_stmt (stmt);
2141 : 79 : continue;
2142 : 79 : }
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 : 11913910 : while (TREE_CODE (lhs) == VIEW_CONVERT_EXPR)
2148 : 10 : lhs = TREE_OPERAND (lhs, 0);
2149 : 11913900 : if (TREE_CODE (lhs) == MEM_REF
2150 : 613710 : && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR
2151 : 208633 : && integer_zerop (TREE_OPERAND (lhs, 1))
2152 : 139151 : && (sym = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0))
2153 : 139151 : && DECL_P (sym)
2154 : 139151 : && !TREE_ADDRESSABLE (sym)
2155 : 11980283 : && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym)))
2156 : : lhs = sym;
2157 : : else
2158 : 11907556 : lhs = gimple_assign_lhs (stmt);
2159 : :
2160 : : /* Rewrite the RHS and make sure the resulting assignment
2161 : : is validly typed. */
2162 : 11913900 : maybe_rewrite_mem_ref_base (rhsp, suitable_for_renaming);
2163 : 11913900 : rhs = gimple_assign_rhs1 (stmt);
2164 : 11913900 : if (gimple_assign_lhs (stmt) != lhs
2165 : 11920244 : && !useless_type_conversion_p (TREE_TYPE (lhs),
2166 : 6344 : TREE_TYPE (rhs)))
2167 : : {
2168 : 3367 : if (gimple_clobber_p (stmt))
2169 : : {
2170 : 5 : rhs = build_constructor (TREE_TYPE (lhs), NULL);
2171 : 5 : TREE_THIS_VOLATILE (rhs) = 1;
2172 : : }
2173 : : else
2174 : 3362 : rhs = fold_build1 (VIEW_CONVERT_EXPR,
2175 : : TREE_TYPE (lhs), rhs);
2176 : : }
2177 : 11913900 : if (gimple_assign_lhs (stmt) != lhs)
2178 : 6344 : gimple_assign_set_lhs (stmt, lhs);
2179 : :
2180 : 11913900 : if (gimple_assign_rhs1 (stmt) != rhs)
2181 : : {
2182 : 3367 : gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
2183 : 3367 : gimple_assign_set_rhs_from_tree (&gsi, rhs);
2184 : : }
2185 : : }
2186 : :
2187 : 25023335 : else if (gimple_code (stmt) == GIMPLE_CALL)
2188 : : {
2189 : 2437106 : unsigned i;
2190 : 2437106 : if (optimize_atomic_compare_exchange_p (stmt))
2191 : : {
2192 : 5865 : tree expected = gimple_call_arg (stmt, 1);
2193 : 5865 : tree decl = TREE_OPERAND (expected, 0);
2194 : 5865 : if (bitmap_bit_p (suitable_for_renaming, DECL_UID (decl)))
2195 : : {
2196 : 5758 : fold_builtin_atomic_compare_exchange (&gsi);
2197 : 5758 : continue;
2198 : : }
2199 : 107 : 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 : 2431241 : else if (is_asan_mark_p (stmt))
2207 : : {
2208 : 404 : tree var = TREE_OPERAND (gimple_call_arg (stmt, 1), 0);
2209 : 404 : if (bitmap_bit_p (suitable_for_renaming, DECL_UID (var)))
2210 : : {
2211 : 356 : unlink_stmt_vdef (stmt);
2212 : 356 : if (asan_mark_p (stmt, ASAN_MARK_POISON))
2213 : : {
2214 : 183 : gcall *call
2215 : 183 : = gimple_build_call_internal (IFN_ASAN_POISON, 0);
2216 : 183 : gimple_call_set_lhs (call, var);
2217 : 183 : 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 : 173 : tree clobber = build_clobber (TREE_TYPE (var));
2225 : 173 : gimple *g = gimple_build_assign (var, clobber);
2226 : 173 : gsi_replace (&gsi, g, true);
2227 : : }
2228 : 356 : continue;
2229 : 356 : }
2230 : : }
2231 : 2430837 : 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 : 6712026 : for (i = 0; i < gimple_call_num_args (stmt); ++i)
2244 : : {
2245 : 4281034 : tree *argp = gimple_call_arg_ptr (stmt, i);
2246 : 4281034 : maybe_rewrite_mem_ref_base (argp, suitable_for_renaming);
2247 : : }
2248 : : }
2249 : :
2250 : 22586229 : else if (gimple_code (stmt) == GIMPLE_ASM)
2251 : : {
2252 : 9519 : gasm *asm_stmt = as_a <gasm *> (stmt);
2253 : 9519 : unsigned i;
2254 : 43876 : for (i = 0; i < gimple_asm_noutputs (asm_stmt); ++i)
2255 : : {
2256 : 34357 : tree link = gimple_asm_output_op (asm_stmt, i);
2257 : 34357 : maybe_rewrite_mem_ref_base (&TREE_VALUE (link),
2258 : : suitable_for_renaming);
2259 : : }
2260 : 22218 : for (i = 0; i < gimple_asm_ninputs (asm_stmt); ++i)
2261 : : {
2262 : 12699 : tree link = gimple_asm_input_op (asm_stmt, i);
2263 : 12699 : maybe_rewrite_mem_ref_base (&TREE_VALUE (link),
2264 : : suitable_for_renaming);
2265 : : }
2266 : : }
2267 : :
2268 : 22576710 : else if (gimple_debug_bind_p (stmt)
2269 : 17169071 : && gimple_debug_bind_has_value_p (stmt))
2270 : : {
2271 : 6854753 : tree *valuep = gimple_debug_bind_get_value_ptr (stmt);
2272 : 6854753 : tree decl;
2273 : 6854753 : maybe_rewrite_mem_ref_base (valuep, suitable_for_renaming);
2274 : 6854753 : decl = non_rewritable_mem_ref_base (*valuep);
2275 : 6854753 : if (decl
2276 : 6854753 : && bitmap_bit_p (suitable_for_renaming, DECL_UID (decl)))
2277 : 12 : gimple_debug_bind_reset_value (stmt);
2278 : : }
2279 : :
2280 : 49802794 : if (gimple_references_memory_p (stmt)
2281 : 32144125 : || is_gimple_debug (stmt))
2282 : 21956067 : update_stmt (stmt);
2283 : :
2284 : 36931121 : gsi_next (&gsi);
2285 : : }
2286 : :
2287 : : /* Update SSA form here, we are called as non-pass as well. */
2288 : 192441 : if (number_of_loops (cfun) > 1
2289 : 192441 : && loops_state_satisfies_p (LOOP_CLOSED_SSA))
2290 : 60 : rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
2291 : : else
2292 : 192381 : update_ssa (TODO_update_ssa);
2293 : : }
2294 : :
2295 : 11706325 : timevar_pop (TV_ADDRESS_TAKEN);
2296 : 11706325 : }
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 : : }
|