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