]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/tree-ssa.c
re PR middle-end/68117 (error: invalid PHI argument <<< Unknown tree: <invalid tree...
[thirdparty/gcc.git] / gcc / tree-ssa.c
CommitLineData
6de9cd9a 1/* Miscellaneous SSA utility functions.
5624e564 2 Copyright (C) 2001-2015 Free Software Foundation, Inc.
6de9cd9a
DN
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
9dcd6f09 8the Free Software Foundation; either version 3, or (at your option)
6de9cd9a
DN
9any later version.
10
11GCC is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
9dcd6f09
NC
17along with GCC; see the file COPYING3. If not see
18<http://www.gnu.org/licenses/>. */
6de9cd9a
DN
19
20#include "config.h"
21#include "system.h"
22#include "coretypes.h"
c7131fb2 23#include "backend.h"
6de9cd9a 24#include "tree.h"
c7131fb2 25#include "gimple.h"
957060b5
AM
26#include "cfghooks.h"
27#include "tree-pass.h"
c7131fb2 28#include "ssa.h"
957060b5
AM
29#include "gimple-pretty-print.h"
30#include "diagnostic-core.h"
40e23961 31#include "fold-const.h"
d8a2d370 32#include "stor-layout.h"
2fb9a547 33#include "gimple-fold.h"
45b0be94 34#include "gimplify.h"
5be5c238
AM
35#include "gimple-iterator.h"
36#include "gimple-walk.h"
e28030cf 37#include "tree-ssa-loop-manip.h"
442b4905
AM
38#include "tree-into-ssa.h"
39#include "tree-ssa.h"
94e3faf6 40#include "cfgloop.h"
1fe37220 41#include "cfgexpand.h"
6de9cd9a 42
ea7e6d5a 43/* Pointer map of variable mappings, keyed by edge. */
b787e7a2 44static hash_map<edge, auto_vec<edge_var_map> > *edge_var_maps;
ea7e6d5a
AH
45
46
47/* Add a mapping with PHI RESULT and PHI DEF associated with edge E. */
48
49void
9e227d60 50redirect_edge_var_map_add (edge e, tree result, tree def, source_location locus)
ea7e6d5a 51{
ea7e6d5a
AH
52 edge_var_map new_node;
53
54 if (edge_var_maps == NULL)
b787e7a2 55 edge_var_maps = new hash_map<edge, auto_vec<edge_var_map> >;
ea7e6d5a 56
b787e7a2 57 auto_vec<edge_var_map> &slot = edge_var_maps->get_or_insert (e);
ea7e6d5a
AH
58 new_node.def = def;
59 new_node.result = result;
f5045c96 60 new_node.locus = locus;
ea7e6d5a 61
b787e7a2 62 slot.safe_push (new_node);
ea7e6d5a
AH
63}
64
65
66/* Clear the var mappings in edge E. */
67
68void
69redirect_edge_var_map_clear (edge e)
70{
ea7e6d5a
AH
71 if (!edge_var_maps)
72 return;
73
b787e7a2 74 auto_vec<edge_var_map> *head = edge_var_maps->get (e);
ea7e6d5a 75
b787e7a2
TS
76 if (head)
77 head->release ();
ea7e6d5a
AH
78}
79
80
81/* Duplicate the redirected var mappings in OLDE in NEWE.
82
b787e7a2
TS
83 This assumes a hash_map can have multiple edges mapping to the same
84 var_map (many to one mapping), since we don't remove the previous mappings.
85 */
ea7e6d5a
AH
86
87void
88redirect_edge_var_map_dup (edge newe, edge olde)
89{
ea7e6d5a
AH
90 if (!edge_var_maps)
91 return;
92
6ef6945c
TS
93 auto_vec<edge_var_map> *new_head = &edge_var_maps->get_or_insert (newe);
94 auto_vec<edge_var_map> *old_head = edge_var_maps->get (olde);
95 if (!old_head)
ea7e6d5a 96 return;
ea7e6d5a 97
6ef6945c 98 new_head->safe_splice (*old_head);
ea7e6d5a
AH
99}
100
101
fa10beec 102/* Return the variable mappings for a given edge. If there is none, return
ea7e6d5a
AH
103 NULL. */
104
b787e7a2 105vec<edge_var_map> *
ea7e6d5a
AH
106redirect_edge_var_map_vector (edge e)
107{
ea7e6d5a
AH
108 /* Hey, what kind of idiot would... you'd be surprised. */
109 if (!edge_var_maps)
110 return NULL;
111
b787e7a2 112 auto_vec<edge_var_map> *slot = edge_var_maps->get (e);
ea7e6d5a
AH
113 if (!slot)
114 return NULL;
115
b787e7a2 116 return slot;
a97a7ae9 117}
ea7e6d5a
AH
118
119/* Clear the edge variable mappings. */
120
121void
122redirect_edge_var_map_destroy (void)
123{
b787e7a2
TS
124 delete edge_var_maps;
125 edge_var_maps = NULL;
ea7e6d5a
AH
126}
127
128
f6144c34
BE
129/* Remove the corresponding arguments from the PHI nodes in E's
130 destination block and redirect it to DEST. Return redirected edge.
ea7e6d5a
AH
131 The list of removed arguments is stored in a vector accessed
132 through edge_var_maps. */
6de9cd9a
DN
133
134edge
135ssa_redirect_edge (edge e, basic_block dest)
136{
538dd0b7
DM
137 gphi_iterator gsi;
138 gphi *phi;
ea7e6d5a
AH
139
140 redirect_edge_var_map_clear (e);
6de9cd9a
DN
141
142 /* Remove the appropriate PHI arguments in E's destination block. */
726a989a 143 for (gsi = gsi_start_phis (e->dest); !gsi_end_p (gsi); gsi_next (&gsi))
6de9cd9a 144 {
726a989a 145 tree def;
f5045c96 146 source_location locus ;
726a989a 147
538dd0b7 148 phi = gsi.phi ();
726a989a 149 def = gimple_phi_arg_def (phi, e->dest_idx);
f5045c96 150 locus = gimple_phi_arg_location (phi, e->dest_idx);
ea7e6d5a
AH
151
152 if (def == NULL_TREE)
6de9cd9a
DN
153 continue;
154
9e227d60 155 redirect_edge_var_map_add (e, gimple_phi_result (phi), def, locus);
6de9cd9a
DN
156 }
157
158 e = redirect_edge_succ_nodup (e, dest);
6de9cd9a
DN
159
160 return e;
161}
162
726a989a 163
38635499 164/* Add PHI arguments queued in PENDING_STMT list on edge E to edge
71882046
KH
165 E->dest. */
166
167void
168flush_pending_stmts (edge e)
169{
538dd0b7 170 gphi *phi;
ea7e6d5a
AH
171 edge_var_map *vm;
172 int i;
538dd0b7 173 gphi_iterator gsi;
71882046 174
b787e7a2 175 vec<edge_var_map> *v = redirect_edge_var_map_vector (e);
ea7e6d5a 176 if (!v)
71882046
KH
177 return;
178
726a989a 179 for (gsi = gsi_start_phis (e->dest), i = 0;
9771b263 180 !gsi_end_p (gsi) && v->iterate (i, &vm);
726a989a 181 gsi_next (&gsi), i++)
71882046 182 {
726a989a
RB
183 tree def;
184
538dd0b7 185 phi = gsi.phi ();
726a989a 186 def = redirect_edge_var_map_def (vm);
9e227d60 187 add_phi_arg (phi, def, e, redirect_edge_var_map_location (vm));
71882046
KH
188 }
189
ea7e6d5a 190 redirect_edge_var_map_clear (e);
71882046 191}
6de9cd9a 192
ff2a63a7
AM
193/* Replace the LHS of STMT, an assignment, either a GIMPLE_ASSIGN or a
194 GIMPLE_CALL, with NLHS, in preparation for modifying the RHS to an
195 expression with a different value.
196
197 This will update any annotations (say debug bind stmts) referring
198 to the original LHS, so that they use the RHS instead. This is
199 done even if NLHS and LHS are the same, for it is understood that
200 the RHS will be modified afterwards, and NLHS will not be assigned
201 an equivalent value.
202
203 Adjusting any non-annotation uses of the LHS, if needed, is a
204 responsibility of the caller.
205
206 The effect of this call should be pretty much the same as that of
207 inserting a copy of STMT before STMT, and then removing the
208 original stmt, at which time gsi_remove() would have update
209 annotations, but using this function saves all the inserting,
210 copying and removing. */
211
212void
355fe088 213gimple_replace_ssa_lhs (gimple *stmt, tree nlhs)
ff2a63a7
AM
214{
215 if (MAY_HAVE_DEBUG_STMTS)
216 {
217 tree lhs = gimple_get_lhs (stmt);
218
219 gcc_assert (SSA_NAME_DEF_STMT (lhs) == stmt);
220
221 insert_debug_temp_for_var_def (NULL, lhs);
222 }
223
224 gimple_set_lhs (stmt, nlhs);
225}
226
227
b5b8b0ac
AO
228/* Given a tree for an expression for which we might want to emit
229 locations or values in debug information (generally a variable, but
230 we might deal with other kinds of trees in the future), return the
231 tree that should be used as the variable of a DEBUG_BIND STMT or
232 VAR_LOCATION INSN or NOTE. Return NULL if VAR is not to be tracked. */
233
234tree
235target_for_debug_bind (tree var)
236{
237 if (!MAY_HAVE_DEBUG_STMTS)
238 return NULL_TREE;
239
70b5e7dc
RG
240 if (TREE_CODE (var) == SSA_NAME)
241 {
242 var = SSA_NAME_VAR (var);
243 if (var == NULL_TREE)
244 return NULL_TREE;
245 }
246
46eb666a
RG
247 if ((TREE_CODE (var) != VAR_DECL
248 || VAR_DECL_IS_VIRTUAL_OPERAND (var))
b5b8b0ac
AO
249 && TREE_CODE (var) != PARM_DECL)
250 return NULL_TREE;
251
252 if (DECL_HAS_VALUE_EXPR_P (var))
253 return target_for_debug_bind (DECL_VALUE_EXPR (var));
254
255 if (DECL_IGNORED_P (var))
256 return NULL_TREE;
257
46eb666a
RG
258 /* var-tracking only tracks registers. */
259 if (!is_gimple_reg_type (TREE_TYPE (var)))
260 return NULL_TREE;
b5b8b0ac
AO
261
262 return var;
263}
264
265/* Called via walk_tree, look for SSA_NAMEs that have already been
266 released. */
267
268static tree
269find_released_ssa_name (tree *tp, int *walk_subtrees, void *data_)
270{
271 struct walk_stmt_info *wi = (struct walk_stmt_info *) data_;
272
42a06e46 273 if (wi && wi->is_lhs)
b5b8b0ac
AO
274 return NULL_TREE;
275
276 if (TREE_CODE (*tp) == SSA_NAME)
277 {
278 if (SSA_NAME_IN_FREE_LIST (*tp))
279 return *tp;
280
281 *walk_subtrees = 0;
282 }
283 else if (IS_TYPE_OR_DECL_P (*tp))
284 *walk_subtrees = 0;
285
286 return NULL_TREE;
287}
288
0ca5af51
AO
289/* Insert a DEBUG BIND stmt before the DEF of VAR if VAR is referenced
290 by other DEBUG stmts, and replace uses of the DEF with the
291 newly-created debug temp. */
292
b5b8b0ac 293void
0ca5af51 294insert_debug_temp_for_var_def (gimple_stmt_iterator *gsi, tree var)
b5b8b0ac
AO
295{
296 imm_use_iterator imm_iter;
b5b8b0ac 297 use_operand_p use_p;
355fe088
TS
298 gimple *stmt;
299 gimple *def_stmt = NULL;
0ca5af51 300 int usecount = 0;
b5b8b0ac 301 tree value = NULL;
b5b8b0ac
AO
302
303 if (!MAY_HAVE_DEBUG_STMTS)
304 return;
305
74e12783
RH
306 /* If this name has already been registered for replacement, do nothing
307 as anything that uses this name isn't in SSA form. */
308 if (name_registered_for_update_p (var))
309 return;
310
311 /* Check whether there are debug stmts that reference this variable and,
312 if there are, decide whether we should use a debug temp. */
0ca5af51 313 FOR_EACH_IMM_USE_FAST (use_p, imm_iter, var)
b5b8b0ac 314 {
0ca5af51 315 stmt = USE_STMT (use_p);
b5b8b0ac 316
0ca5af51 317 if (!gimple_debug_bind_p (stmt))
b5b8b0ac
AO
318 continue;
319
0ca5af51
AO
320 if (usecount++)
321 break;
322
323 if (gimple_debug_bind_get_value (stmt) != var)
b5b8b0ac 324 {
0ca5af51
AO
325 /* Count this as an additional use, so as to make sure we
326 use a temp unless VAR's definition has a SINGLE_RHS that
327 can be shared. */
328 usecount++;
329 break;
330 }
331 }
b5b8b0ac 332
0ca5af51
AO
333 if (!usecount)
334 return;
b5b8b0ac 335
0ca5af51
AO
336 if (gsi)
337 def_stmt = gsi_stmt (*gsi);
338 else
339 def_stmt = SSA_NAME_DEF_STMT (var);
b5b8b0ac 340
0ca5af51
AO
341 /* If we didn't get an insertion point, and the stmt has already
342 been removed, we won't be able to insert the debug bind stmt, so
343 we'll have to drop debug information. */
42a06e46
AO
344 if (gimple_code (def_stmt) == GIMPLE_PHI)
345 {
538dd0b7 346 value = degenerate_phi_result (as_a <gphi *> (def_stmt));
42a06e46
AO
347 if (value && walk_tree (&value, find_released_ssa_name, NULL, NULL))
348 value = NULL;
0c5f6539
JJ
349 /* error_mark_node is what fixup_noreturn_call changes PHI arguments
350 to. */
351 else if (value == error_mark_node)
352 value = NULL;
42a06e46
AO
353 }
354 else if (is_gimple_assign (def_stmt))
0ca5af51
AO
355 {
356 bool no_value = false;
b5b8b0ac 357
0ca5af51
AO
358 if (!dom_info_available_p (CDI_DOMINATORS))
359 {
360 struct walk_stmt_info wi;
361
362 memset (&wi, 0, sizeof (wi));
363
364 /* When removing blocks without following reverse dominance
365 order, we may sometimes encounter SSA_NAMEs that have
366 already been released, referenced in other SSA_DEFs that
367 we're about to release. Consider:
368
369 <bb X>:
370 v_1 = foo;
371
372 <bb Y>:
373 w_2 = v_1 + bar;
374 # DEBUG w => w_2
375
376 If we deleted BB X first, propagating the value of w_2
377 won't do us any good. It's too late to recover their
378 original definition of v_1: when it was deleted, it was
379 only referenced in other DEFs, it couldn't possibly know
380 it should have been retained, and propagating every
381 single DEF just in case it might have to be propagated
382 into a DEBUG STMT would probably be too wasteful.
383
384 When dominator information is not readily available, we
385 check for and accept some loss of debug information. But
386 if it is available, there's no excuse for us to remove
387 blocks in the wrong order, so we don't even check for
388 dead SSA NAMEs. SSA verification shall catch any
389 errors. */
390 if ((!gsi && !gimple_bb (def_stmt))
462b701b 391 || walk_gimple_op (def_stmt, find_released_ssa_name, &wi))
0ca5af51 392 no_value = true;
b5b8b0ac
AO
393 }
394
0ca5af51
AO
395 if (!no_value)
396 value = gimple_assign_rhs_to_tree (def_stmt);
397 }
398
399 if (value)
400 {
401 /* If there's a single use of VAR, and VAR is the entire debug
402 expression (usecount would have been incremented again
403 otherwise), and the definition involves only constants and
404 SSA names, then we can propagate VALUE into this single use,
405 avoiding the temp.
406
407 We can also avoid using a temp if VALUE can be shared and
408 propagated into all uses, without generating expressions that
409 wouldn't be valid gimple RHSs.
410
411 Other cases that would require unsharing or non-gimple RHSs
412 are deferred to a debug temp, although we could avoid temps
413 at the expense of duplication of expressions. */
414
415 if (CONSTANT_CLASS_P (value)
42a06e46 416 || gimple_code (def_stmt) == GIMPLE_PHI
0ca5af51
AO
417 || (usecount == 1
418 && (!gimple_assign_single_p (def_stmt)
419 || is_gimple_min_invariant (value)))
420 || is_gimple_reg (value))
2724573f 421 ;
0ca5af51 422 else
b5b8b0ac 423 {
538dd0b7 424 gdebug *def_temp;
0ca5af51
AO
425 tree vexpr = make_node (DEBUG_EXPR_DECL);
426
427 def_temp = gimple_build_debug_bind (vexpr,
428 unshare_expr (value),
429 def_stmt);
430
431 DECL_ARTIFICIAL (vexpr) = 1;
432 TREE_TYPE (vexpr) = TREE_TYPE (value);
433 if (DECL_P (value))
434 DECL_MODE (vexpr) = DECL_MODE (value);
435 else
436 DECL_MODE (vexpr) = TYPE_MODE (TREE_TYPE (value));
b5b8b0ac 437
0ca5af51
AO
438 if (gsi)
439 gsi_insert_before (gsi, def_temp, GSI_SAME_STMT);
440 else
b5b8b0ac 441 {
0ca5af51
AO
442 gimple_stmt_iterator ngsi = gsi_for_stmt (def_stmt);
443 gsi_insert_before (&ngsi, def_temp, GSI_SAME_STMT);
b5b8b0ac
AO
444 }
445
0ca5af51 446 value = vexpr;
b5b8b0ac 447 }
0ca5af51 448 }
b5b8b0ac 449
0ca5af51
AO
450 FOR_EACH_IMM_USE_STMT (stmt, imm_iter, var)
451 {
452 if (!gimple_debug_bind_p (stmt))
453 continue;
454
455 if (value)
1bce4ff3
RG
456 {
457 FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
458 /* unshare_expr is not needed here. vexpr is either a
459 SINGLE_RHS, that can be safely shared, some other RHS
460 that was unshared when we found it had a single debug
461 use, or a DEBUG_EXPR_DECL, that can be safely
462 shared. */
2724573f 463 SET_USE (use_p, unshare_expr (value));
1bce4ff3
RG
464 /* If we didn't replace uses with a debug decl fold the
465 resulting expression. Otherwise we end up with invalid IL. */
466 if (TREE_CODE (value) != DEBUG_EXPR_DECL)
59401b92
RG
467 {
468 gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
469 fold_stmt_inplace (&gsi);
470 }
1bce4ff3 471 }
0ca5af51
AO
472 else
473 gimple_debug_bind_reset_value (stmt);
b5b8b0ac
AO
474
475 update_stmt (stmt);
476 }
477}
478
479
0ca5af51
AO
480/* Insert a DEBUG BIND stmt before STMT for each DEF referenced by
481 other DEBUG stmts, and replace uses of the DEF with the
482 newly-created debug temp. */
b5b8b0ac
AO
483
484void
0ca5af51 485insert_debug_temps_for_defs (gimple_stmt_iterator *gsi)
b5b8b0ac 486{
355fe088 487 gimple *stmt;
b5b8b0ac
AO
488 ssa_op_iter op_iter;
489 def_operand_p def_p;
490
491 if (!MAY_HAVE_DEBUG_STMTS)
492 return;
493
0ca5af51
AO
494 stmt = gsi_stmt (*gsi);
495
42a06e46 496 FOR_EACH_PHI_OR_STMT_DEF (def_p, stmt, op_iter, SSA_OP_DEF)
b5b8b0ac
AO
497 {
498 tree var = DEF_FROM_PTR (def_p);
499
500 if (TREE_CODE (var) != SSA_NAME)
501 continue;
502
0ca5af51 503 insert_debug_temp_for_var_def (gsi, var);
b5b8b0ac
AO
504 }
505}
506
b03c3082
JJ
507/* Reset all debug stmts that use SSA_NAME(s) defined in STMT. */
508
509void
355fe088 510reset_debug_uses (gimple *stmt)
b03c3082
JJ
511{
512 ssa_op_iter op_iter;
513 def_operand_p def_p;
514 imm_use_iterator imm_iter;
355fe088 515 gimple *use_stmt;
b03c3082
JJ
516
517 if (!MAY_HAVE_DEBUG_STMTS)
518 return;
519
520 FOR_EACH_PHI_OR_STMT_DEF (def_p, stmt, op_iter, SSA_OP_DEF)
521 {
522 tree var = DEF_FROM_PTR (def_p);
523
524 if (TREE_CODE (var) != SSA_NAME)
525 continue;
526
527 FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, var)
528 {
529 if (!gimple_debug_bind_p (use_stmt))
530 continue;
531
532 gimple_debug_bind_reset_value (use_stmt);
533 update_stmt (use_stmt);
534 }
535 }
536}
537
ae0a4449
AO
538/* Delete SSA DEFs for SSA versions in the TOREMOVE bitmap, removing
539 dominated stmts before their dominators, so that release_ssa_defs
540 stands a chance of propagating DEFs into debug bind stmts. */
541
542void
543release_defs_bitset (bitmap toremove)
544{
545 unsigned j;
546 bitmap_iterator bi;
547
548 /* Performing a topological sort is probably overkill, this will
549 most likely run in slightly superlinear time, rather than the
550 pathological quadratic worst case. */
551 while (!bitmap_empty_p (toremove))
552 EXECUTE_IF_SET_IN_BITMAP (toremove, 0, j, bi)
553 {
554 bool remove_now = true;
555 tree var = ssa_name (j);
355fe088 556 gimple *stmt;
ae0a4449
AO
557 imm_use_iterator uit;
558
559 FOR_EACH_IMM_USE_STMT (stmt, uit, var)
560 {
561 ssa_op_iter dit;
562 def_operand_p def_p;
563
564 /* We can't propagate PHI nodes into debug stmts. */
565 if (gimple_code (stmt) == GIMPLE_PHI
566 || is_gimple_debug (stmt))
567 continue;
568
569 /* If we find another definition to remove that uses
570 the one we're looking at, defer the removal of this
571 one, so that it can be propagated into debug stmts
572 after the other is. */
573 FOR_EACH_SSA_DEF_OPERAND (def_p, stmt, dit, SSA_OP_DEF)
574 {
575 tree odef = DEF_FROM_PTR (def_p);
576
577 if (bitmap_bit_p (toremove, SSA_NAME_VERSION (odef)))
578 {
579 remove_now = false;
580 break;
581 }
582 }
583
584 if (!remove_now)
585 BREAK_FROM_IMM_USE_STMT (uit);
586 }
587
588 if (remove_now)
589 {
355fe088 590 gimple *def = SSA_NAME_DEF_STMT (var);
ae0a4449
AO
591 gimple_stmt_iterator gsi = gsi_for_stmt (def);
592
593 if (gimple_code (def) == GIMPLE_PHI)
594 remove_phi_node (&gsi, true);
595 else
596 {
597 gsi_remove (&gsi, true);
598 release_defs (def);
599 }
600
601 bitmap_clear_bit (toremove, j);
602 }
603 }
604}
605
53b4bf74 606/* Return true if SSA_NAME is malformed and mark it visited.
6de9cd9a 607
53b4bf74
DN
608 IS_VIRTUAL is true if this SSA_NAME was found inside a virtual
609 operand. */
6de9cd9a
DN
610
611static bool
53b4bf74 612verify_ssa_name (tree ssa_name, bool is_virtual)
6de9cd9a 613{
6de9cd9a
DN
614 if (TREE_CODE (ssa_name) != SSA_NAME)
615 {
ab532386 616 error ("expected an SSA_NAME object");
53b4bf74 617 return true;
6de9cd9a
DN
618 }
619
a011aa39 620 if (SSA_NAME_IN_FREE_LIST (ssa_name))
bbc630f5 621 {
a011aa39 622 error ("found an SSA_NAME that had been released into the free pool");
bbc630f5
DN
623 return true;
624 }
625
a011aa39
RB
626 if (SSA_NAME_VAR (ssa_name) != NULL_TREE
627 && TREE_TYPE (ssa_name) != TREE_TYPE (SSA_NAME_VAR (ssa_name)))
53b4bf74 628 {
a011aa39 629 error ("type mismatch between an SSA_NAME and its symbol");
53b4bf74
DN
630 return true;
631 }
632
ea057359 633 if (is_virtual && !virtual_operand_p (ssa_name))
53b4bf74 634 {
ab532386 635 error ("found a virtual definition for a GIMPLE register");
53b4bf74
DN
636 return true;
637 }
638
5006671f
RG
639 if (is_virtual && SSA_NAME_VAR (ssa_name) != gimple_vop (cfun))
640 {
641 error ("virtual SSA name for non-VOP decl");
642 return true;
643 }
644
ea057359 645 if (!is_virtual && virtual_operand_p (ssa_name))
53b4bf74 646 {
ab532386 647 error ("found a real definition for a non-register");
53b4bf74
DN
648 return true;
649 }
650
38635499 651 if (SSA_NAME_IS_DEFAULT_DEF (ssa_name)
726a989a 652 && !gimple_nop_p (SSA_NAME_DEF_STMT (ssa_name)))
38635499
DN
653 {
654 error ("found a default name with a non-empty defining statement");
655 return true;
656 }
657
53b4bf74
DN
658 return false;
659}
660
661
662/* Return true if the definition of SSA_NAME at block BB is malformed.
663
664 STMT is the statement where SSA_NAME is created.
665
666 DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME
667 version numbers. If DEFINITION_BLOCK[SSA_NAME_VERSION] is set,
668 it means that the block in that array slot contains the
669 definition of SSA_NAME.
670
38635499 671 IS_VIRTUAL is true if SSA_NAME is created by a VDEF. */
53b4bf74
DN
672
673static bool
674verify_def (basic_block bb, basic_block *definition_block, tree ssa_name,
355fe088 675 gimple *stmt, bool is_virtual)
53b4bf74
DN
676{
677 if (verify_ssa_name (ssa_name, is_virtual))
678 goto err;
679
70b5e7dc
RG
680 if (SSA_NAME_VAR (ssa_name)
681 && TREE_CODE (SSA_NAME_VAR (ssa_name)) == RESULT_DECL
6938f93f
JH
682 && DECL_BY_REFERENCE (SSA_NAME_VAR (ssa_name)))
683 {
d8a07487 684 error ("RESULT_DECL should be read only when DECL_BY_REFERENCE is set");
6938f93f
JH
685 goto err;
686 }
687
6de9cd9a
DN
688 if (definition_block[SSA_NAME_VERSION (ssa_name)])
689 {
690 error ("SSA_NAME created in two different blocks %i and %i",
691 definition_block[SSA_NAME_VERSION (ssa_name)]->index, bb->index);
53b4bf74 692 goto err;
6de9cd9a
DN
693 }
694
695 definition_block[SSA_NAME_VERSION (ssa_name)] = bb;
696
697 if (SSA_NAME_DEF_STMT (ssa_name) != stmt)
698 {
699 error ("SSA_NAME_DEF_STMT is wrong");
6de9cd9a 700 fprintf (stderr, "Expected definition statement:\n");
726a989a 701 print_gimple_stmt (stderr, SSA_NAME_DEF_STMT (ssa_name), 4, TDF_VOPS);
6de9cd9a 702 fprintf (stderr, "\nActual definition statement:\n");
726a989a 703 print_gimple_stmt (stderr, stmt, 4, TDF_VOPS);
53b4bf74 704 goto err;
6de9cd9a
DN
705 }
706
53b4bf74
DN
707 return false;
708
709err:
710 fprintf (stderr, "while verifying SSA_NAME ");
711 print_generic_expr (stderr, ssa_name, 0);
712 fprintf (stderr, " in statement\n");
726a989a 713 print_gimple_stmt (stderr, stmt, 4, TDF_VOPS);
53b4bf74
DN
714
715 return true;
6de9cd9a
DN
716}
717
718
719/* Return true if the use of SSA_NAME at statement STMT in block BB is
720 malformed.
721
722 DEF_BB is the block where SSA_NAME was found to be created.
723
724 IDOM contains immediate dominator information for the flowgraph.
725
726 CHECK_ABNORMAL is true if the caller wants to check whether this use
727 is flowing through an abnormal edge (only used when checking PHI
53b4bf74
DN
728 arguments).
729
b1d16eff
ZD
730 If NAMES_DEFINED_IN_BB is not NULL, it contains a bitmap of ssa names
731 that are defined before STMT in basic block BB. */
6de9cd9a
DN
732
733static bool
f430bae8 734verify_use (basic_block bb, basic_block def_bb, use_operand_p use_p,
355fe088 735 gimple *stmt, bool check_abnormal, bitmap names_defined_in_bb)
6de9cd9a
DN
736{
737 bool err = false;
f430bae8 738 tree ssa_name = USE_FROM_PTR (use_p);
6de9cd9a 739
f430bae8
AM
740 if (!TREE_VISITED (ssa_name))
741 if (verify_imm_links (stderr, ssa_name))
742 err = true;
743
28a3618f 744 TREE_VISITED (ssa_name) = 1;
53b4bf74 745
726a989a 746 if (gimple_nop_p (SSA_NAME_DEF_STMT (ssa_name))
38635499 747 && SSA_NAME_IS_DEFAULT_DEF (ssa_name))
53b4bf74 748 ; /* Default definitions have empty statements. Nothing to do. */
6de9cd9a
DN
749 else if (!def_bb)
750 {
ab532386 751 error ("missing definition");
6de9cd9a
DN
752 err = true;
753 }
754 else if (bb != def_bb
755 && !dominated_by_p (CDI_DOMINATORS, bb, def_bb))
756 {
ab532386 757 error ("definition in block %i does not dominate use in block %i",
6de9cd9a
DN
758 def_bb->index, bb->index);
759 err = true;
760 }
b1d16eff
ZD
761 else if (bb == def_bb
762 && names_defined_in_bb != NULL
763 && !bitmap_bit_p (names_defined_in_bb, SSA_NAME_VERSION (ssa_name)))
764 {
ab532386 765 error ("definition in block %i follows the use", def_bb->index);
b1d16eff
ZD
766 err = true;
767 }
6de9cd9a
DN
768
769 if (check_abnormal
770 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ssa_name))
771 {
772 error ("SSA_NAME_OCCURS_IN_ABNORMAL_PHI should be set");
773 err = true;
774 }
775
b8698a0f 776 /* Make sure the use is in an appropriate list by checking the previous
f3b569ca 777 element to make sure it's the same. */
f430bae8
AM
778 if (use_p->prev == NULL)
779 {
ab532386 780 error ("no immediate_use list");
f430bae8
AM
781 err = true;
782 }
783 else
784 {
726a989a 785 tree listvar;
f430bae8 786 if (use_p->prev->use == NULL)
726a989a 787 listvar = use_p->prev->loc.ssa_name;
f430bae8
AM
788 else
789 listvar = USE_FROM_PTR (use_p->prev);
790 if (listvar != ssa_name)
791 {
ab532386 792 error ("wrong immediate use list");
f430bae8
AM
793 err = true;
794 }
795 }
796
6de9cd9a
DN
797 if (err)
798 {
799 fprintf (stderr, "for SSA_NAME: ");
7bab95ba 800 print_generic_expr (stderr, ssa_name, TDF_VOPS);
0bca51f0 801 fprintf (stderr, " in statement:\n");
726a989a 802 print_gimple_stmt (stderr, stmt, 0, TDF_VOPS);
6de9cd9a
DN
803 }
804
805 return err;
806}
807
808
809/* Return true if any of the arguments for PHI node PHI at block BB is
810 malformed.
811
38635499
DN
812 DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME
813 version numbers. If DEFINITION_BLOCK[SSA_NAME_VERSION] is set,
814 it means that the block in that array slot contains the
815 definition of SSA_NAME. */
6de9cd9a
DN
816
817static bool
538dd0b7 818verify_phi_args (gphi *phi, basic_block bb, basic_block *definition_block)
6de9cd9a
DN
819{
820 edge e;
821 bool err = false;
726a989a 822 size_t i, phi_num_args = gimple_phi_num_args (phi);
6de9cd9a 823
609d9bed
JL
824 if (EDGE_COUNT (bb->preds) != phi_num_args)
825 {
ab532386 826 error ("incoming edge count does not match number of PHI arguments");
609d9bed
JL
827 err = true;
828 goto error;
829 }
830
6de9cd9a
DN
831 for (i = 0; i < phi_num_args; i++)
832 {
726a989a 833 use_operand_p op_p = gimple_phi_arg_imm_use_ptr (phi, i);
f430bae8
AM
834 tree op = USE_FROM_PTR (op_p);
835
62112e35 836 e = EDGE_PRED (bb, i);
6b66c718
KH
837
838 if (op == NULL_TREE)
839 {
ab532386 840 error ("PHI argument is missing for edge %d->%d",
6b66c718
KH
841 e->src->index,
842 e->dest->index);
843 err = true;
844 goto error;
845 }
846
609d9bed
JL
847 if (TREE_CODE (op) != SSA_NAME && !is_gimple_min_invariant (op))
848 {
849 error ("PHI argument is not SSA_NAME, or invariant");
850 err = true;
851 }
852
6de9cd9a 853 if (TREE_CODE (op) == SSA_NAME)
38635499 854 {
ea057359 855 err = verify_ssa_name (op, virtual_operand_p (gimple_phi_result (phi)));
38635499
DN
856 err |= verify_use (e->src, definition_block[SSA_NAME_VERSION (op)],
857 op_p, phi, e->flags & EDGE_ABNORMAL, NULL);
858 }
6de9cd9a 859
628c189e
RG
860 if (TREE_CODE (op) == ADDR_EXPR)
861 {
862 tree base = TREE_OPERAND (op, 0);
863 while (handled_component_p (base))
864 base = TREE_OPERAND (base, 0);
865 if ((TREE_CODE (base) == VAR_DECL
866 || TREE_CODE (base) == PARM_DECL
867 || TREE_CODE (base) == RESULT_DECL)
868 && !TREE_ADDRESSABLE (base))
869 {
870 error ("address taken, but ADDRESSABLE bit not set");
871 err = true;
872 }
873 }
874
6de9cd9a
DN
875 if (e->dest != bb)
876 {
ab532386 877 error ("wrong edge %d->%d for PHI argument",
ea40ba9c 878 e->src->index, e->dest->index);
6de9cd9a
DN
879 err = true;
880 }
881
6de9cd9a
DN
882 if (err)
883 {
884 fprintf (stderr, "PHI argument\n");
7bab95ba 885 print_generic_stmt (stderr, op, TDF_VOPS);
53b4bf74 886 goto error;
6de9cd9a 887 }
6de9cd9a
DN
888 }
889
53b4bf74 890error:
6de9cd9a
DN
891 if (err)
892 {
893 fprintf (stderr, "for PHI node\n");
726a989a 894 print_gimple_stmt (stderr, phi, 0, TDF_VOPS|TDF_MEMSYMS);
6de9cd9a
DN
895 }
896
897
898 return err;
899}
900
901
902/* Verify common invariants in the SSA web.
903 TODO: verify the variable annotations. */
904
24e47c76 905DEBUG_FUNCTION void
e9ff9caf 906verify_ssa (bool check_modified_stmt, bool check_ssa_operands)
6de9cd9a 907{
53b4bf74 908 size_t i;
6de9cd9a 909 basic_block bb;
858904db 910 basic_block *definition_block = XCNEWVEC (basic_block, num_ssa_names);
4c124b4c
AM
911 ssa_op_iter iter;
912 tree op;
2b28c07a 913 enum dom_state orig_dom_state = dom_info_state (CDI_DOMINATORS);
8bdbfff5 914 bitmap names_defined_in_bb = BITMAP_ALLOC (NULL);
6de9cd9a 915
5006671f 916 gcc_assert (!need_ssa_update_p (cfun));
84d65814 917
6de9cd9a
DN
918 timevar_push (TV_TREE_SSA_VERIFY);
919
53b4bf74
DN
920 /* Keep track of SSA names present in the IL. */
921 for (i = 1; i < num_ssa_names; i++)
6de9cd9a 922 {
609d9bed
JL
923 tree name = ssa_name (i);
924 if (name)
6de9cd9a 925 {
355fe088 926 gimple *stmt;
609d9bed 927 TREE_VISITED (name) = 0;
6de9cd9a 928
ea057359 929 verify_ssa_name (name, virtual_operand_p (name));
bc590dfb 930
609d9bed 931 stmt = SSA_NAME_DEF_STMT (name);
726a989a 932 if (!gimple_nop_p (stmt))
53b4bf74 933 {
726a989a 934 basic_block bb = gimple_bb (stmt);
0492158e
RB
935 if (verify_def (bb, definition_block,
936 name, stmt, virtual_operand_p (name)))
937 goto err;
6de9cd9a
DN
938 }
939 }
940 }
941
609d9bed 942 calculate_dominance_info (CDI_DOMINATORS);
6de9cd9a
DN
943
944 /* Now verify all the uses and make sure they agree with the definitions
945 found in the previous pass. */
11cd3bed 946 FOR_EACH_BB_FN (bb, cfun)
6de9cd9a
DN
947 {
948 edge e;
628f6a4e 949 edge_iterator ei;
6de9cd9a
DN
950
951 /* Make sure that all edges have a clear 'aux' field. */
628f6a4e 952 FOR_EACH_EDGE (e, ei, bb->preds)
6de9cd9a
DN
953 {
954 if (e->aux)
955 {
ab532386 956 error ("AUX pointer initialized for edge %d->%d", e->src->index,
6de9cd9a 957 e->dest->index);
53b4bf74 958 goto err;
6de9cd9a
DN
959 }
960 }
961
962 /* Verify the arguments for every PHI node in the block. */
538dd0b7 963 for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
b1d16eff 964 {
538dd0b7 965 gphi *phi = gsi.phi ();
b1d16eff
ZD
966 if (verify_phi_args (phi, bb, definition_block))
967 goto err;
38635499 968
b1d16eff 969 bitmap_set_bit (names_defined_in_bb,
726a989a 970 SSA_NAME_VERSION (gimple_phi_result (phi)));
b1d16eff 971 }
6de9cd9a 972
53b4bf74 973 /* Now verify all the uses and vuses in every statement of the block. */
538dd0b7
DM
974 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
975 gsi_next (&gsi))
6de9cd9a 976 {
355fe088 977 gimple *stmt = gsi_stmt (gsi);
f430bae8
AM
978 use_operand_p use_p;
979
726a989a 980 if (check_modified_stmt && gimple_modified_p (stmt))
f430bae8 981 {
38635499 982 error ("stmt (%p) marked modified after optimization pass: ",
f47c96aa 983 (void *)stmt);
726a989a 984 print_gimple_stmt (stderr, stmt, 0, TDF_VOPS);
f430bae8
AM
985 goto err;
986 }
6de9cd9a 987
e9ff9caf 988 if (check_ssa_operands && verify_ssa_operands (cfun, stmt))
5006671f 989 {
bc590dfb 990 print_gimple_stmt (stderr, stmt, 0, TDF_VOPS);
5006671f 991 goto err;
38635499
DN
992 }
993
bc590dfb
RG
994 if (gimple_debug_bind_p (stmt)
995 && !gimple_debug_bind_has_value_p (stmt))
996 continue;
38635499
DN
997
998 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE|SSA_OP_VUSE)
6de9cd9a 999 {
f430bae8 1000 op = USE_FROM_PTR (use_p);
53b4bf74 1001 if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
38635499 1002 use_p, stmt, false, names_defined_in_bb))
b1d16eff
ZD
1003 goto err;
1004 }
1005
1006 FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_ALL_DEFS)
5006671f
RG
1007 {
1008 if (SSA_NAME_DEF_STMT (op) != stmt)
1009 {
1010 error ("SSA_NAME_DEF_STMT is wrong");
1011 fprintf (stderr, "Expected definition statement:\n");
1012 print_gimple_stmt (stderr, stmt, 4, TDF_VOPS);
1013 fprintf (stderr, "\nActual definition statement:\n");
1014 print_gimple_stmt (stderr, SSA_NAME_DEF_STMT (op),
1015 4, TDF_VOPS);
1016 goto err;
1017 }
1018 bitmap_set_bit (names_defined_in_bb, SSA_NAME_VERSION (op));
1019 }
b1d16eff
ZD
1020 }
1021
b1d16eff 1022 bitmap_clear (names_defined_in_bb);
6de9cd9a
DN
1023 }
1024
53b4bf74 1025 free (definition_block);
84d65814 1026
b01d837f
KH
1027 /* Restore the dominance information to its prior known state, so
1028 that we do not perturb the compiler's subsequent behavior. */
03261822
NS
1029 if (orig_dom_state == DOM_NONE)
1030 free_dominance_info (CDI_DOMINATORS);
1031 else
2b28c07a 1032 set_dom_info_availability (CDI_DOMINATORS, orig_dom_state);
b8698a0f 1033
8bdbfff5 1034 BITMAP_FREE (names_defined_in_bb);
6de9cd9a 1035 timevar_pop (TV_TREE_SSA_VERIFY);
53b4bf74 1036 return;
6de9cd9a 1037
53b4bf74 1038err:
ab532386 1039 internal_error ("verify_ssa failed");
6de9cd9a
DN
1040}
1041
1042
6de9cd9a
DN
1043/* Initialize global DFA and SSA structures. */
1044
1045void
5db9ba0c 1046init_tree_ssa (struct function *fn)
6de9cd9a 1047{
766090c2 1048 fn->gimple_df = ggc_cleared_alloc<gimple_df> ();
2a22f99c 1049 fn->gimple_df->default_defs = hash_table<ssa_name_hasher>::create_ggc (20);
5006671f 1050 pt_solution_reset (&fn->gimple_df->escaped);
5db9ba0c 1051 init_ssanames (fn, 0);
6de9cd9a
DN
1052}
1053
452aa9c5
RG
1054/* Do the actions required to initialize internal data structures used
1055 in tree-ssa optimization passes. */
1056
1057static unsigned int
1058execute_init_datastructures (void)
1059{
1060 /* Allocate hash tables, arrays and other structures. */
afdec9bd 1061 gcc_assert (!cfun->gimple_df);
452aa9c5
RG
1062 init_tree_ssa (cfun);
1063 return 0;
1064}
1065
27a4cd48
DM
1066namespace {
1067
1068const pass_data pass_data_init_datastructures =
452aa9c5 1069{
27a4cd48
DM
1070 GIMPLE_PASS, /* type */
1071 "*init_datastructures", /* name */
1072 OPTGROUP_NONE, /* optinfo_flags */
27a4cd48
DM
1073 TV_NONE, /* tv_id */
1074 PROP_cfg, /* properties_required */
1075 0, /* properties_provided */
1076 0, /* properties_destroyed */
1077 0, /* todo_flags_start */
1078 0, /* todo_flags_finish */
452aa9c5 1079};
6de9cd9a 1080
27a4cd48
DM
1081class pass_init_datastructures : public gimple_opt_pass
1082{
1083public:
c3284718
RS
1084 pass_init_datastructures (gcc::context *ctxt)
1085 : gimple_opt_pass (pass_data_init_datastructures, ctxt)
27a4cd48
DM
1086 {}
1087
1088 /* opt_pass methods: */
1a3d085c
TS
1089 virtual bool gate (function *fun)
1090 {
1091 /* Do nothing for funcions that was produced already in SSA form. */
1092 return !(fun->curr_properties & PROP_ssa);
1093 }
1094
be55bfe6
TS
1095 virtual unsigned int execute (function *)
1096 {
1097 return execute_init_datastructures ();
1098 }
27a4cd48
DM
1099
1100}; // class pass_init_datastructures
1101
1102} // anon namespace
1103
1104gimple_opt_pass *
1105make_pass_init_datastructures (gcc::context *ctxt)
1106{
1107 return new pass_init_datastructures (ctxt);
1108}
1109
6de9cd9a
DN
1110/* Deallocate memory associated with SSA data structures for FNDECL. */
1111
1112void
61183076 1113delete_tree_ssa (struct function *fn)
6de9cd9a 1114{
61183076 1115 fini_ssanames (fn);
726a989a
RB
1116
1117 /* We no longer maintain the SSA operand cache at this point. */
61183076
RB
1118 if (ssa_operands_active (fn))
1119 fini_ssa_operands (fn);
1120
1121 fn->gimple_df->default_defs->empty ();
1122 fn->gimple_df->default_defs = NULL;
1123 pt_solution_reset (&fn->gimple_df->escaped);
1124 if (fn->gimple_df->decls_to_pointers != NULL)
1125 delete fn->gimple_df->decls_to_pointers;
1126 fn->gimple_df->decls_to_pointers = NULL;
1127 fn->gimple_df->modified_noreturn_calls = NULL;
1128 fn->gimple_df = NULL;
bb35ccb1
RB
1129
1130 /* We no longer need the edge variable maps. */
1131 redirect_edge_var_map_destroy ();
6de9cd9a
DN
1132}
1133
6de9cd9a
DN
1134/* Return true if EXPR is a useless type conversion, otherwise return
1135 false. */
1136
1137bool
1138tree_ssa_useless_type_conversion (tree expr)
1139{
1140 /* If we have an assignment that merely uses a NOP_EXPR to change
1141 the top of the RHS to the type of the LHS and the type conversion
1142 is "safe", then strip away the type conversion so that we can
1143 enter LHS = RHS into the const_and_copies table. */
1043771b 1144 if (CONVERT_EXPR_P (expr)
580d124f
RK
1145 || TREE_CODE (expr) == VIEW_CONVERT_EXPR
1146 || TREE_CODE (expr) == NON_LVALUE_EXPR)
36618b93 1147 return useless_type_conversion_p
5039610b 1148 (TREE_TYPE (expr),
726a989a 1149 TREE_TYPE (TREE_OPERAND (expr, 0)));
6de9cd9a
DN
1150
1151 return false;
1152}
1153
23314e77
AN
1154/* Strip conversions from EXP according to
1155 tree_ssa_useless_type_conversion and return the resulting
1156 expression. */
1157
1158tree
1159tree_ssa_strip_useless_type_conversions (tree exp)
1160{
1161 while (tree_ssa_useless_type_conversion (exp))
1162 exp = TREE_OPERAND (exp, 0);
1163 return exp;
1164}
1165
6de9cd9a 1166
956623c1
MG
1167/* Return true if T, an SSA_NAME, has an undefined value. PARTIAL is what
1168 should be returned if the value is only partially undefined. */
c152901f
AM
1169
1170bool
956623c1 1171ssa_undefined_value_p (tree t, bool partial)
c152901f 1172{
355fe088 1173 gimple *def_stmt;
c152901f
AM
1174 tree var = SSA_NAME_VAR (t);
1175
1176 if (!var)
1177 ;
1178 /* Parameters get their initial value from the function entry. */
1179 else if (TREE_CODE (var) == PARM_DECL)
1180 return false;
1181 /* When returning by reference the return address is actually a hidden
1182 parameter. */
1183 else if (TREE_CODE (var) == RESULT_DECL && DECL_BY_REFERENCE (var))
1184 return false;
1185 /* Hard register variables get their initial value from the ether. */
1186 else if (TREE_CODE (var) == VAR_DECL && DECL_HARD_REGISTER (var))
1187 return false;
1188
1189 /* The value is undefined iff its definition statement is empty. */
e1ec47c4
TP
1190 def_stmt = SSA_NAME_DEF_STMT (t);
1191 if (gimple_nop_p (def_stmt))
1192 return true;
1193
1194 /* Check if the complex was not only partially defined. */
956623c1 1195 if (partial && is_gimple_assign (def_stmt)
e1ec47c4
TP
1196 && gimple_assign_rhs_code (def_stmt) == COMPLEX_EXPR)
1197 {
1198 tree rhs1, rhs2;
1199
1200 rhs1 = gimple_assign_rhs1 (def_stmt);
1201 rhs2 = gimple_assign_rhs2 (def_stmt);
1202 return (TREE_CODE (rhs1) == SSA_NAME && ssa_undefined_value_p (rhs1))
1203 || (TREE_CODE (rhs2) == SSA_NAME && ssa_undefined_value_p (rhs2));
1204 }
1205 return false;
c152901f
AM
1206}
1207
1208
828ca3d8
AO
1209/* Return TRUE iff STMT, a gimple statement, references an undefined
1210 SSA name. */
1211
1212bool
1213gimple_uses_undefined_value_p (gimple *stmt)
1214{
1215 ssa_op_iter iter;
1216 tree op;
1217
1218 FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE)
1219 if (ssa_undefined_value_p (op))
1220 return true;
1221
1222 return false;
1223}
1224
1225
1226
70f34814
RG
1227/* If necessary, rewrite the base of the reference tree *TP from
1228 a MEM_REF to a plain or converted symbol. */
1229
1230static void
13714310 1231maybe_rewrite_mem_ref_base (tree *tp, bitmap suitable_for_renaming)
70f34814
RG
1232{
1233 tree sym;
1234
1235 while (handled_component_p (*tp))
1236 tp = &TREE_OPERAND (*tp, 0);
1237 if (TREE_CODE (*tp) == MEM_REF
1238 && TREE_CODE (TREE_OPERAND (*tp, 0)) == ADDR_EXPR
70f34814
RG
1239 && (sym = TREE_OPERAND (TREE_OPERAND (*tp, 0), 0))
1240 && DECL_P (sym)
1241 && !TREE_ADDRESSABLE (sym)
13714310 1242 && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym)))
70f34814 1243 {
b2ad5e37
RG
1244 if (TREE_CODE (TREE_TYPE (sym)) == VECTOR_TYPE
1245 && useless_type_conversion_p (TREE_TYPE (*tp),
1246 TREE_TYPE (TREE_TYPE (sym)))
1247 && multiple_of_p (sizetype, TREE_OPERAND (*tp, 1),
1248 TYPE_SIZE_UNIT (TREE_TYPE (*tp))))
1249 {
1250 *tp = build3 (BIT_FIELD_REF, TREE_TYPE (*tp), sym,
1251 TYPE_SIZE (TREE_TYPE (*tp)),
1252 int_const_binop (MULT_EXPR,
1253 bitsize_int (BITS_PER_UNIT),
d35936ab 1254 TREE_OPERAND (*tp, 1)));
b2ad5e37 1255 }
64a3d647
RG
1256 else if (TREE_CODE (TREE_TYPE (sym)) == COMPLEX_TYPE
1257 && useless_type_conversion_p (TREE_TYPE (*tp),
1258 TREE_TYPE (TREE_TYPE (sym))))
1259 {
1260 *tp = build1 (integer_zerop (TREE_OPERAND (*tp, 1))
1261 ? REALPART_EXPR : IMAGPART_EXPR,
1262 TREE_TYPE (*tp), sym);
1263 }
b2ad5e37
RG
1264 else if (integer_zerop (TREE_OPERAND (*tp, 1)))
1265 {
1266 if (!useless_type_conversion_p (TREE_TYPE (*tp),
1267 TREE_TYPE (sym)))
1268 *tp = build1 (VIEW_CONVERT_EXPR,
1269 TREE_TYPE (*tp), sym);
1270 else
1271 *tp = sym;
1272 }
70f34814
RG
1273 }
1274}
1275
ad650c92
RG
1276/* For a tree REF return its base if it is the base of a MEM_REF
1277 that cannot be rewritten into SSA form. Otherwise return NULL_TREE. */
1278
1279static tree
1280non_rewritable_mem_ref_base (tree ref)
1281{
1282 tree base = ref;
1283
1284 /* A plain decl does not need it set. */
1285 if (DECL_P (ref))
1286 return NULL_TREE;
1287
1288 while (handled_component_p (base))
1289 base = TREE_OPERAND (base, 0);
1290
1291 /* But watch out for MEM_REFs we cannot lower to a
b2ad5e37 1292 VIEW_CONVERT_EXPR or a BIT_FIELD_REF. */
ad650c92
RG
1293 if (TREE_CODE (base) == MEM_REF
1294 && TREE_CODE (TREE_OPERAND (base, 0)) == ADDR_EXPR)
1295 {
1296 tree decl = TREE_OPERAND (TREE_OPERAND (base, 0), 0);
64a3d647
RG
1297 if ((TREE_CODE (TREE_TYPE (decl)) == VECTOR_TYPE
1298 || TREE_CODE (TREE_TYPE (decl)) == COMPLEX_TYPE)
b2ad5e37
RG
1299 && useless_type_conversion_p (TREE_TYPE (base),
1300 TREE_TYPE (TREE_TYPE (decl)))
807e902e
KZ
1301 && wi::fits_uhwi_p (mem_ref_offset (base))
1302 && wi::gtu_p (wi::to_offset (TYPE_SIZE_UNIT (TREE_TYPE (decl))),
1303 mem_ref_offset (base))
b2ad5e37
RG
1304 && multiple_of_p (sizetype, TREE_OPERAND (base, 1),
1305 TYPE_SIZE_UNIT (TREE_TYPE (base))))
1306 return NULL_TREE;
ad650c92
RG
1307 if (DECL_P (decl)
1308 && (!integer_zerop (TREE_OPERAND (base, 1))
1309 || (DECL_SIZE (decl)
02ff830b
RG
1310 != TYPE_SIZE (TREE_TYPE (base)))
1311 || TREE_THIS_VOLATILE (decl) != TREE_THIS_VOLATILE (base)))
ad650c92
RG
1312 return decl;
1313 }
1314
1315 return NULL_TREE;
1316}
1317
c0aae19c
RG
1318/* For an lvalue tree LHS return true if it cannot be rewritten into SSA form.
1319 Otherwise return true. */
1320
1321static bool
1322non_rewritable_lvalue_p (tree lhs)
1323{
1324 /* A plain decl is always rewritable. */
1325 if (DECL_P (lhs))
1326 return false;
1327
2f278249
RB
1328 /* We can re-write REALPART_EXPR and IMAGPART_EXPR sets in
1329 a reasonably efficient manner... */
1330 if ((TREE_CODE (lhs) == REALPART_EXPR
1331 || TREE_CODE (lhs) == IMAGPART_EXPR)
1332 && DECL_P (TREE_OPERAND (lhs, 0)))
1333 return false;
1334
c0aae19c
RG
1335 /* A decl that is wrapped inside a MEM-REF that covers
1336 it full is also rewritable.
1337 ??? The following could be relaxed allowing component
62902f3f 1338 references that do not change the access size. */
c0aae19c
RG
1339 if (TREE_CODE (lhs) == MEM_REF
1340 && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR
1341 && integer_zerop (TREE_OPERAND (lhs, 1)))
1342 {
1343 tree decl = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0);
1344 if (DECL_P (decl)
1345 && DECL_SIZE (decl) == TYPE_SIZE (TREE_TYPE (lhs))
1346 && (TREE_THIS_VOLATILE (decl) == TREE_THIS_VOLATILE (lhs)))
1347 return false;
1348 }
1349
1350 return true;
1351}
1352
f61c8291
EB
1353/* When possible, clear TREE_ADDRESSABLE bit or set DECL_GIMPLE_REG_P bit and
1354 mark the variable VAR for conversion into SSA. Return true when updating
1355 stmts is required. */
ad650c92 1356
13714310
RG
1357static void
1358maybe_optimize_var (tree var, bitmap addresses_taken, bitmap not_reg_needs,
1359 bitmap suitable_for_renaming)
ad650c92 1360{
ad650c92
RG
1361 /* Global Variables, result decls cannot be changed. */
1362 if (is_global_var (var)
1363 || TREE_CODE (var) == RESULT_DECL
1364 || bitmap_bit_p (addresses_taken, DECL_UID (var)))
13714310 1365 return;
3f2930d8 1366
ad650c92
RG
1367 if (TREE_ADDRESSABLE (var)
1368 /* Do not change TREE_ADDRESSABLE if we need to preserve var as
1369 a non-register. Otherwise we are confused and forget to
1370 add virtual operands for it. */
1371 && (!is_gimple_reg_type (TREE_TYPE (var))
9a6b63c3
JJ
1372 || TREE_CODE (TREE_TYPE (var)) == VECTOR_TYPE
1373 || TREE_CODE (TREE_TYPE (var)) == COMPLEX_TYPE
ad650c92
RG
1374 || !bitmap_bit_p (not_reg_needs, DECL_UID (var))))
1375 {
1376 TREE_ADDRESSABLE (var) = 0;
1377 if (is_gimple_reg (var))
13714310 1378 bitmap_set_bit (suitable_for_renaming, DECL_UID (var));
ad650c92
RG
1379 if (dump_file)
1380 {
f61c8291 1381 fprintf (dump_file, "No longer having address taken: ");
ad650c92
RG
1382 print_generic_expr (dump_file, var, 0);
1383 fprintf (dump_file, "\n");
1384 }
1385 }
f61c8291 1386
ad650c92
RG
1387 if (!DECL_GIMPLE_REG_P (var)
1388 && !bitmap_bit_p (not_reg_needs, DECL_UID (var))
1389 && (TREE_CODE (TREE_TYPE (var)) == COMPLEX_TYPE
1390 || TREE_CODE (TREE_TYPE (var)) == VECTOR_TYPE)
1391 && !TREE_THIS_VOLATILE (var)
1392 && (TREE_CODE (var) != VAR_DECL || !DECL_HARD_REGISTER (var)))
1393 {
1394 DECL_GIMPLE_REG_P (var) = 1;
13714310 1395 bitmap_set_bit (suitable_for_renaming, DECL_UID (var));
ad650c92
RG
1396 if (dump_file)
1397 {
f61c8291 1398 fprintf (dump_file, "Now a gimple register: ");
ad650c92
RG
1399 print_generic_expr (dump_file, var, 0);
1400 fprintf (dump_file, "\n");
1401 }
1402 }
ad650c92
RG
1403}
1404
f22b7039 1405/* Compute TREE_ADDRESSABLE and DECL_GIMPLE_REG_P for local variables. */
201b2ead 1406
5006671f 1407void
f61c8291 1408execute_update_addresses_taken (void)
201b2ead 1409{
201b2ead
JH
1410 basic_block bb;
1411 bitmap addresses_taken = BITMAP_ALLOC (NULL);
f22b7039 1412 bitmap not_reg_needs = BITMAP_ALLOC (NULL);
13714310 1413 bitmap suitable_for_renaming = BITMAP_ALLOC (NULL);
f61c8291 1414 tree var;
ad650c92 1415 unsigned i;
201b2ead 1416
a222c01a
MM
1417 timevar_push (TV_ADDRESS_TAKEN);
1418
201b2ead
JH
1419 /* Collect into ADDRESSES_TAKEN all variables whose address is taken within
1420 the function body. */
11cd3bed 1421 FOR_EACH_BB_FN (bb, cfun)
201b2ead 1422 {
538dd0b7
DM
1423 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
1424 gsi_next (&gsi))
201b2ead 1425 {
355fe088 1426 gimple *stmt = gsi_stmt (gsi);
f22b7039 1427 enum gimple_code code = gimple_code (stmt);
ad650c92 1428 tree decl;
ccacdf06
RG
1429
1430 /* Note all addresses taken by the stmt. */
1431 gimple_ior_addresses_taken (addresses_taken, stmt);
1432
f22b7039
AP
1433 /* If we have a call or an assignment, see if the lhs contains
1434 a local decl that requires not to be a gimple register. */
1435 if (code == GIMPLE_ASSIGN || code == GIMPLE_CALL)
1436 {
fff1894c 1437 tree lhs = gimple_get_lhs (stmt);
c0aae19c
RG
1438 if (lhs
1439 && TREE_CODE (lhs) != SSA_NAME
1440 && non_rewritable_lvalue_p (lhs))
70f34814 1441 {
c0aae19c
RG
1442 decl = get_base_address (lhs);
1443 if (DECL_P (decl))
1444 bitmap_set_bit (not_reg_needs, DECL_UID (decl));
70f34814
RG
1445 }
1446 }
1447
1448 if (gimple_assign_single_p (stmt))
1449 {
1450 tree rhs = gimple_assign_rhs1 (stmt);
ad650c92
RG
1451 if ((decl = non_rewritable_mem_ref_base (rhs)))
1452 bitmap_set_bit (not_reg_needs, DECL_UID (decl));
1453 }
fff1894c 1454
ad650c92
RG
1455 else if (code == GIMPLE_CALL)
1456 {
1457 for (i = 0; i < gimple_call_num_args (stmt); ++i)
70f34814 1458 {
ad650c92
RG
1459 tree arg = gimple_call_arg (stmt, i);
1460 if ((decl = non_rewritable_mem_ref_base (arg)))
1461 bitmap_set_bit (not_reg_needs, DECL_UID (decl));
1462 }
1463 }
1464
1465 else if (code == GIMPLE_ASM)
1466 {
538dd0b7
DM
1467 gasm *asm_stmt = as_a <gasm *> (stmt);
1468 for (i = 0; i < gimple_asm_noutputs (asm_stmt); ++i)
ad650c92 1469 {
538dd0b7 1470 tree link = gimple_asm_output_op (asm_stmt, i);
e5160e93 1471 tree lhs = TREE_VALUE (link);
62902f3f 1472 if (TREE_CODE (lhs) != SSA_NAME)
e5160e93 1473 {
c0aae19c 1474 decl = get_base_address (lhs);
62902f3f
RG
1475 if (DECL_P (decl)
1476 && (non_rewritable_lvalue_p (lhs)
1477 /* We cannot move required conversions from
1478 the lhs to the rhs in asm statements, so
1479 require we do not need any. */
1480 || !useless_type_conversion_p
1481 (TREE_TYPE (lhs), TREE_TYPE (decl))))
c0aae19c 1482 bitmap_set_bit (not_reg_needs, DECL_UID (decl));
e5160e93 1483 }
ad650c92 1484 }
538dd0b7 1485 for (i = 0; i < gimple_asm_ninputs (asm_stmt); ++i)
ad650c92 1486 {
538dd0b7 1487 tree link = gimple_asm_input_op (asm_stmt, i);
ad650c92
RG
1488 if ((decl = non_rewritable_mem_ref_base (TREE_VALUE (link))))
1489 bitmap_set_bit (not_reg_needs, DECL_UID (decl));
1490 }
f22b7039 1491 }
201b2ead 1492 }
726a989a 1493
538dd0b7
DM
1494 for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
1495 gsi_next (&gsi))
201b2ead 1496 {
726a989a 1497 size_t i;
538dd0b7 1498 gphi *phi = gsi.phi ();
726a989a
RB
1499
1500 for (i = 0; i < gimple_phi_num_args (phi); i++)
201b2ead
JH
1501 {
1502 tree op = PHI_ARG_DEF (phi, i), var;
1503 if (TREE_CODE (op) == ADDR_EXPR
726a989a 1504 && (var = get_base_address (TREE_OPERAND (op, 0))) != NULL
201b2ead
JH
1505 && DECL_P (var))
1506 bitmap_set_bit (addresses_taken, DECL_UID (var));
1507 }
1508 }
1509 }
1510
f61c8291
EB
1511 /* We cannot iterate over all referenced vars because that can contain
1512 unused vars from BLOCK trees, which causes code generation differences
1513 for -g vs. -g0. */
1514 for (var = DECL_ARGUMENTS (cfun->decl); var; var = DECL_CHAIN (var))
13714310
RG
1515 maybe_optimize_var (var, addresses_taken, not_reg_needs,
1516 suitable_for_renaming);
f61c8291 1517
9771b263 1518 FOR_EACH_VEC_SAFE_ELT (cfun->local_decls, i, var)
13714310
RG
1519 maybe_optimize_var (var, addresses_taken, not_reg_needs,
1520 suitable_for_renaming);
201b2ead 1521
f61c8291 1522 /* Operand caches need to be recomputed for operands referencing the updated
13714310
RG
1523 variables and operands need to be rewritten to expose bare symbols. */
1524 if (!bitmap_empty_p (suitable_for_renaming))
5006671f 1525 {
11cd3bed 1526 FOR_EACH_BB_FN (bb, cfun)
538dd0b7 1527 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);)
70f34814 1528 {
355fe088 1529 gimple *stmt = gsi_stmt (gsi);
5006671f 1530
70f34814
RG
1531 /* Re-write TARGET_MEM_REFs of symbols we want to
1532 rewrite into SSA form. */
1533 if (gimple_assign_single_p (stmt))
1534 {
1535 tree lhs = gimple_assign_lhs (stmt);
1536 tree rhs, *rhsp = gimple_assign_rhs1_ptr (stmt);
1537 tree sym;
1538
2f278249
RB
1539 /* Rewrite LHS IMAG/REALPART_EXPR similar to
1540 gimplify_modify_expr_complex_part. */
1541 if ((TREE_CODE (lhs) == IMAGPART_EXPR
1542 || TREE_CODE (lhs) == REALPART_EXPR)
1543 && DECL_P (TREE_OPERAND (lhs, 0))
1544 && bitmap_bit_p (suitable_for_renaming,
1545 DECL_UID (TREE_OPERAND (lhs, 0))))
1546 {
1547 tree other = make_ssa_name (TREE_TYPE (lhs));
1548 tree lrhs = build1 (TREE_CODE (lhs) == IMAGPART_EXPR
1549 ? REALPART_EXPR : IMAGPART_EXPR,
1550 TREE_TYPE (other),
1551 TREE_OPERAND (lhs, 0));
355fe088 1552 gimple *load = gimple_build_assign (other, lrhs);
f376994a
RL
1553 location_t loc = gimple_location (stmt);
1554 gimple_set_location (load, loc);
2f278249
RB
1555 gimple_set_vuse (load, gimple_vuse (stmt));
1556 gsi_insert_before (&gsi, load, GSI_SAME_STMT);
1557 gimple_assign_set_lhs (stmt, TREE_OPERAND (lhs, 0));
1558 gimple_assign_set_rhs_with_ops
1559 (&gsi, COMPLEX_EXPR,
1560 TREE_CODE (lhs) == IMAGPART_EXPR
1561 ? other : gimple_assign_rhs1 (stmt),
1562 TREE_CODE (lhs) == IMAGPART_EXPR
1563 ? gimple_assign_rhs1 (stmt) : other, NULL_TREE);
1564 stmt = gsi_stmt (gsi);
1565 unlink_stmt_vdef (stmt);
1566 update_stmt (stmt);
1567 continue;
1568 }
1569
70f34814
RG
1570 /* We shouldn't have any fancy wrapping of
1571 component-refs on the LHS, but look through
1572 VIEW_CONVERT_EXPRs as that is easy. */
1573 while (TREE_CODE (lhs) == VIEW_CONVERT_EXPR)
1574 lhs = TREE_OPERAND (lhs, 0);
1575 if (TREE_CODE (lhs) == MEM_REF
1576 && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR
1577 && integer_zerop (TREE_OPERAND (lhs, 1))
1578 && (sym = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0))
1579 && DECL_P (sym)
1580 && !TREE_ADDRESSABLE (sym)
13714310 1581 && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym)))
70f34814
RG
1582 lhs = sym;
1583 else
1584 lhs = gimple_assign_lhs (stmt);
1585
1586 /* Rewrite the RHS and make sure the resulting assignment
1587 is validly typed. */
13714310 1588 maybe_rewrite_mem_ref_base (rhsp, suitable_for_renaming);
70f34814
RG
1589 rhs = gimple_assign_rhs1 (stmt);
1590 if (gimple_assign_lhs (stmt) != lhs
1591 && !useless_type_conversion_p (TREE_TYPE (lhs),
1592 TREE_TYPE (rhs)))
1593 rhs = fold_build1 (VIEW_CONVERT_EXPR,
1594 TREE_TYPE (lhs), rhs);
1595
1596 if (gimple_assign_lhs (stmt) != lhs)
1597 gimple_assign_set_lhs (stmt, lhs);
1598
1599 if (gimple_assign_rhs1 (stmt) != rhs)
1600 {
1601 gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
1602 gimple_assign_set_rhs_from_tree (&gsi, rhs);
1603 }
1604 }
1605
ad650c92
RG
1606 else if (gimple_code (stmt) == GIMPLE_CALL)
1607 {
1608 unsigned i;
1609 for (i = 0; i < gimple_call_num_args (stmt); ++i)
1610 {
1611 tree *argp = gimple_call_arg_ptr (stmt, i);
13714310 1612 maybe_rewrite_mem_ref_base (argp, suitable_for_renaming);
ad650c92
RG
1613 }
1614 }
1615
1616 else if (gimple_code (stmt) == GIMPLE_ASM)
70f34814 1617 {
538dd0b7 1618 gasm *asm_stmt = as_a <gasm *> (stmt);
70f34814 1619 unsigned i;
538dd0b7 1620 for (i = 0; i < gimple_asm_noutputs (asm_stmt); ++i)
70f34814 1621 {
538dd0b7 1622 tree link = gimple_asm_output_op (asm_stmt, i);
13714310
RG
1623 maybe_rewrite_mem_ref_base (&TREE_VALUE (link),
1624 suitable_for_renaming);
70f34814 1625 }
538dd0b7 1626 for (i = 0; i < gimple_asm_ninputs (asm_stmt); ++i)
70f34814 1627 {
538dd0b7 1628 tree link = gimple_asm_input_op (asm_stmt, i);
13714310
RG
1629 maybe_rewrite_mem_ref_base (&TREE_VALUE (link),
1630 suitable_for_renaming);
70f34814
RG
1631 }
1632 }
1633
116bc3a4
JJ
1634 else if (gimple_debug_bind_p (stmt)
1635 && gimple_debug_bind_has_value_p (stmt))
1636 {
1637 tree *valuep = gimple_debug_bind_get_value_ptr (stmt);
1638 tree decl;
13714310 1639 maybe_rewrite_mem_ref_base (valuep, suitable_for_renaming);
116bc3a4 1640 decl = non_rewritable_mem_ref_base (*valuep);
13714310
RG
1641 if (decl
1642 && bitmap_bit_p (suitable_for_renaming, DECL_UID (decl)))
116bc3a4
JJ
1643 gimple_debug_bind_reset_value (stmt);
1644 }
1645
70f34814
RG
1646 if (gimple_references_memory_p (stmt)
1647 || is_gimple_debug (stmt))
1648 update_stmt (stmt);
c32f25b8
JJ
1649
1650 gsi_next (&gsi);
70f34814 1651 }
5006671f
RG
1652
1653 /* Update SSA form here, we are called as non-pass as well. */
0fc822d0
RB
1654 if (number_of_loops (cfun) > 1
1655 && loops_state_satisfies_p (LOOP_CLOSED_SSA))
94e3faf6
JJ
1656 rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
1657 else
1658 update_ssa (TODO_update_ssa);
5006671f 1659 }
201b2ead 1660
f22b7039 1661 BITMAP_FREE (not_reg_needs);
201b2ead 1662 BITMAP_FREE (addresses_taken);
13714310 1663 BITMAP_FREE (suitable_for_renaming);
a222c01a 1664 timevar_pop (TV_ADDRESS_TAKEN);
201b2ead
JH
1665}
1666
27a4cd48
DM
1667namespace {
1668
1669const pass_data pass_data_update_address_taken =
201b2ead 1670{
27a4cd48
DM
1671 GIMPLE_PASS, /* type */
1672 "addressables", /* name */
1673 OPTGROUP_NONE, /* optinfo_flags */
27a4cd48
DM
1674 TV_ADDRESS_TAKEN, /* tv_id */
1675 PROP_ssa, /* properties_required */
1676 0, /* properties_provided */
1677 0, /* properties_destroyed */
1678 0, /* todo_flags_start */
1679 TODO_update_address_taken, /* todo_flags_finish */
201b2ead 1680};
27a4cd48
DM
1681
1682class pass_update_address_taken : public gimple_opt_pass
1683{
1684public:
c3284718
RS
1685 pass_update_address_taken (gcc::context *ctxt)
1686 : gimple_opt_pass (pass_data_update_address_taken, ctxt)
27a4cd48
DM
1687 {}
1688
1689 /* opt_pass methods: */
1690
1691}; // class pass_update_address_taken
1692
1693} // anon namespace
1694
1695gimple_opt_pass *
1696make_pass_update_address_taken (gcc::context *ctxt)
1697{
1698 return new pass_update_address_taken (ctxt);
1699}