]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/tree-ssa.c
re PR tree-optimization/17133 (wrong code with -ftree-lim)
[thirdparty/gcc.git] / gcc / tree-ssa.c
CommitLineData
6de9cd9a
DN
1/* Miscellaneous SSA utility functions.
2 Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
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
8the Free Software Foundation; either version 2, or (at your option)
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
17along with GCC; see the file COPYING. If not, write to
18the Free Software Foundation, 59 Temple Place - Suite 330,
19Boston, MA 02111-1307, USA. */
20
21#include "config.h"
22#include "system.h"
23#include "coretypes.h"
24#include "tm.h"
25#include "tree.h"
26#include "flags.h"
27#include "rtl.h"
28#include "tm_p.h"
29#include "ggc.h"
30#include "langhooks.h"
31#include "hard-reg-set.h"
32#include "basic-block.h"
33#include "output.h"
34#include "errors.h"
35#include "expr.h"
36#include "function.h"
37#include "diagnostic.h"
38#include "bitmap.h"
39#include "tree-flow.h"
eadf906f 40#include "tree-gimple.h"
6de9cd9a
DN
41#include "tree-inline.h"
42#include "varray.h"
43#include "timevar.h"
6de9cd9a
DN
44#include "hashtab.h"
45#include "tree-dump.h"
46#include "tree-pass.h"
47
48
49/* Remove edge E and remove the corresponding arguments from the PHI nodes
50 in E's destination block. */
51
52void
53ssa_remove_edge (edge e)
54{
55 tree phi, next;
56
57 /* Remove the appropriate PHI arguments in E's destination block. */
58 for (phi = phi_nodes (e->dest); phi; phi = next)
59 {
17192884 60 next = PHI_CHAIN (phi);
6de9cd9a
DN
61 remove_phi_arg (phi, e->src);
62 }
63
64 remove_edge (e);
65}
66
f6144c34
BE
67/* Remove the corresponding arguments from the PHI nodes in E's
68 destination block and redirect it to DEST. Return redirected edge.
6de9cd9a
DN
69 The list of removed arguments is stored in PENDING_STMT (e). */
70
71edge
72ssa_redirect_edge (edge e, basic_block dest)
73{
74 tree phi, next;
75 tree list = NULL, *last = &list;
76 tree src, dst, node;
77 int i;
78
79 /* Remove the appropriate PHI arguments in E's destination block. */
80 for (phi = phi_nodes (e->dest); phi; phi = next)
81 {
17192884 82 next = PHI_CHAIN (phi);
6de9cd9a
DN
83
84 i = phi_arg_from_edge (phi, e);
85 if (i < 0)
86 continue;
87
88 src = PHI_ARG_DEF (phi, i);
89 dst = PHI_RESULT (phi);
90 node = build_tree_list (dst, src);
91 *last = node;
92 last = &TREE_CHAIN (node);
93
94 remove_phi_arg_num (phi, i);
95 }
96
97 e = redirect_edge_succ_nodup (e, dest);
98 PENDING_STMT (e) = list;
99
100 return e;
101}
102
103
53b4bf74 104/* Return true if SSA_NAME is malformed and mark it visited.
6de9cd9a 105
53b4bf74
DN
106 IS_VIRTUAL is true if this SSA_NAME was found inside a virtual
107 operand. */
6de9cd9a
DN
108
109static bool
53b4bf74 110verify_ssa_name (tree ssa_name, bool is_virtual)
6de9cd9a 111{
53b4bf74 112 TREE_VISITED (ssa_name) = 1;
6de9cd9a
DN
113
114 if (TREE_CODE (ssa_name) != SSA_NAME)
115 {
116 error ("Expected an SSA_NAME object");
53b4bf74 117 return true;
6de9cd9a
DN
118 }
119
bbc630f5
DN
120 if (TREE_TYPE (ssa_name) != TREE_TYPE (SSA_NAME_VAR (ssa_name)))
121 {
122 error ("Type mismatch between an SSA_NAME and its symbol.");
123 return true;
124 }
125
53b4bf74
DN
126 if (SSA_NAME_IN_FREE_LIST (ssa_name))
127 {
128 error ("Found an SSA_NAME that had been released into the free pool");
129 return true;
130 }
131
132 if (is_virtual && is_gimple_reg (ssa_name))
133 {
134 error ("Found a virtual definition for a GIMPLE register");
135 return true;
136 }
137
138 if (!is_virtual && !is_gimple_reg (ssa_name))
139 {
140 error ("Found a real definition for a non-register");
141 return true;
142 }
143
144 return false;
145}
146
147
148/* Return true if the definition of SSA_NAME at block BB is malformed.
149
150 STMT is the statement where SSA_NAME is created.
151
152 DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME
153 version numbers. If DEFINITION_BLOCK[SSA_NAME_VERSION] is set,
154 it means that the block in that array slot contains the
155 definition of SSA_NAME.
156
157 IS_VIRTUAL is true if SSA_NAME is created by a V_MAY_DEF or a
158 V_MUST_DEF. */
159
160static bool
161verify_def (basic_block bb, basic_block *definition_block, tree ssa_name,
162 tree stmt, bool is_virtual)
163{
164 if (verify_ssa_name (ssa_name, is_virtual))
165 goto err;
166
6de9cd9a
DN
167 if (definition_block[SSA_NAME_VERSION (ssa_name)])
168 {
169 error ("SSA_NAME created in two different blocks %i and %i",
170 definition_block[SSA_NAME_VERSION (ssa_name)]->index, bb->index);
53b4bf74 171 goto err;
6de9cd9a
DN
172 }
173
174 definition_block[SSA_NAME_VERSION (ssa_name)] = bb;
175
176 if (SSA_NAME_DEF_STMT (ssa_name) != stmt)
177 {
178 error ("SSA_NAME_DEF_STMT is wrong");
6de9cd9a 179 fprintf (stderr, "Expected definition statement:\n");
7bab95ba 180 print_generic_stmt (stderr, SSA_NAME_DEF_STMT (ssa_name), TDF_VOPS);
6de9cd9a 181 fprintf (stderr, "\nActual definition statement:\n");
7bab95ba 182 print_generic_stmt (stderr, stmt, TDF_VOPS);
53b4bf74 183 goto err;
6de9cd9a
DN
184 }
185
53b4bf74
DN
186 return false;
187
188err:
189 fprintf (stderr, "while verifying SSA_NAME ");
190 print_generic_expr (stderr, ssa_name, 0);
191 fprintf (stderr, " in statement\n");
7bab95ba 192 print_generic_stmt (stderr, stmt, TDF_VOPS);
53b4bf74
DN
193
194 return true;
6de9cd9a
DN
195}
196
197
198/* Return true if the use of SSA_NAME at statement STMT in block BB is
199 malformed.
200
201 DEF_BB is the block where SSA_NAME was found to be created.
202
203 IDOM contains immediate dominator information for the flowgraph.
204
205 CHECK_ABNORMAL is true if the caller wants to check whether this use
206 is flowing through an abnormal edge (only used when checking PHI
53b4bf74
DN
207 arguments).
208
209 IS_VIRTUAL is true if SSA_NAME is created by a V_MAY_DEF or a
b1d16eff
ZD
210 V_MUST_DEF.
211
212 If NAMES_DEFINED_IN_BB is not NULL, it contains a bitmap of ssa names
213 that are defined before STMT in basic block BB. */
6de9cd9a
DN
214
215static bool
216verify_use (basic_block bb, basic_block def_bb, tree ssa_name,
b1d16eff
ZD
217 tree stmt, bool check_abnormal, bool is_virtual,
218 bitmap names_defined_in_bb)
6de9cd9a
DN
219{
220 bool err = false;
221
53b4bf74
DN
222 err = verify_ssa_name (ssa_name, is_virtual);
223
224 if (IS_EMPTY_STMT (SSA_NAME_DEF_STMT (ssa_name))
225 && var_ann (SSA_NAME_VAR (ssa_name))->default_def == ssa_name)
226 ; /* Default definitions have empty statements. Nothing to do. */
6de9cd9a
DN
227 else if (!def_bb)
228 {
229 error ("Missing definition");
230 err = true;
231 }
232 else if (bb != def_bb
233 && !dominated_by_p (CDI_DOMINATORS, bb, def_bb))
234 {
235 error ("Definition in block %i does not dominate use in block %i",
236 def_bb->index, bb->index);
237 err = true;
238 }
b1d16eff
ZD
239 else if (bb == def_bb
240 && names_defined_in_bb != NULL
241 && !bitmap_bit_p (names_defined_in_bb, SSA_NAME_VERSION (ssa_name)))
242 {
243 error ("Definition in block %i follows the use", def_bb->index);
244 err = true;
245 }
6de9cd9a
DN
246
247 if (check_abnormal
248 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ssa_name))
249 {
250 error ("SSA_NAME_OCCURS_IN_ABNORMAL_PHI should be set");
251 err = true;
252 }
253
254 if (err)
255 {
256 fprintf (stderr, "for SSA_NAME: ");
7bab95ba 257 print_generic_expr (stderr, ssa_name, TDF_VOPS);
6de9cd9a 258 fprintf (stderr, "in statement:\n");
7bab95ba 259 print_generic_stmt (stderr, stmt, TDF_VOPS);
6de9cd9a
DN
260 }
261
262 return err;
263}
264
265
266/* Return true if any of the arguments for PHI node PHI at block BB is
267 malformed.
268
269 IDOM contains immediate dominator information for the flowgraph.
270
271 DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME version
272 numbers. If DEFINITION_BLOCK[SSA_NAME_VERSION] is set, it means that the
273 block in that array slot contains the definition of SSA_NAME. */
274
275static bool
276verify_phi_args (tree phi, basic_block bb, basic_block *definition_block)
277{
278 edge e;
279 bool err = false;
280 int i, phi_num_args = PHI_NUM_ARGS (phi);
628f6a4e 281 edge_iterator ei;
6de9cd9a
DN
282
283 /* Mark all the incoming edges. */
628f6a4e 284 FOR_EACH_EDGE (e, ei, bb->preds)
6de9cd9a
DN
285 e->aux = (void *) 1;
286
287 for (i = 0; i < phi_num_args; i++)
288 {
289 tree op = PHI_ARG_DEF (phi, i);
290
291 e = PHI_ARG_EDGE (phi, i);
292
293 if (TREE_CODE (op) == SSA_NAME)
53b4bf74
DN
294 err = verify_use (e->src, definition_block[SSA_NAME_VERSION (op)], op,
295 phi, e->flags & EDGE_ABNORMAL,
b1d16eff
ZD
296 !is_gimple_reg (PHI_RESULT (phi)),
297 NULL);
6de9cd9a
DN
298
299 if (e->dest != bb)
300 {
301 error ("Wrong edge %d->%d for PHI argument\n",
302 e->src->index, e->dest->index, bb->index);
303 err = true;
304 }
305
306 if (e->aux == (void *) 0)
307 {
308 error ("PHI argument flowing through dead edge %d->%d\n",
309 e->src->index, e->dest->index);
310 err = true;
311 }
312
313 if (e->aux == (void *) 2)
314 {
315 error ("PHI argument duplicated for edge %d->%d\n", e->src->index,
316 e->dest->index);
317 err = true;
318 }
319
320 if (err)
321 {
322 fprintf (stderr, "PHI argument\n");
7bab95ba 323 print_generic_stmt (stderr, op, TDF_VOPS);
53b4bf74 324 goto error;
6de9cd9a
DN
325 }
326
327 e->aux = (void *) 2;
328 }
329
628f6a4e 330 FOR_EACH_EDGE (e, ei, bb->preds)
6de9cd9a
DN
331 {
332 if (e->aux != (void *) 2)
333 {
334 error ("No argument flowing through edge %d->%d\n", e->src->index,
335 e->dest->index);
336 err = true;
53b4bf74 337 goto error;
6de9cd9a
DN
338 }
339 e->aux = (void *) 0;
340 }
341
53b4bf74 342error:
6de9cd9a
DN
343 if (err)
344 {
345 fprintf (stderr, "for PHI node\n");
7bab95ba 346 print_generic_stmt (stderr, phi, TDF_VOPS);
6de9cd9a
DN
347 }
348
349
350 return err;
351}
352
353
53b4bf74
DN
354static void
355verify_flow_insensitive_alias_info (void)
356{
357 size_t i;
358 tree var;
359 bitmap visited = BITMAP_XMALLOC ();
360
361 for (i = 0; i < num_referenced_vars; i++)
362 {
852c7b12 363 size_t j;
53b4bf74 364 var_ann_t ann;
852c7b12 365 varray_type may_aliases;
53b4bf74
DN
366
367 var = referenced_var (i);
368 ann = var_ann (var);
852c7b12 369 may_aliases = ann->may_aliases;
53b4bf74 370
852c7b12 371 for (j = 0; may_aliases && j < VARRAY_ACTIVE_SIZE (may_aliases); j++)
53b4bf74 372 {
852c7b12 373 tree alias = VARRAY_TREE (may_aliases, j);
53b4bf74 374
852c7b12 375 bitmap_set_bit (visited, var_ann (alias)->uid);
53b4bf74 376
852c7b12
DN
377 if (!may_be_aliased (alias))
378 {
379 error ("Non-addressable variable inside an alias set.");
380 debug_variable (alias);
381 goto err;
53b4bf74
DN
382 }
383 }
384 }
385
386 for (i = 0; i < num_referenced_vars; i++)
387 {
388 var_ann_t ann;
389
390 var = referenced_var (i);
391 ann = var_ann (var);
392
393 if (ann->mem_tag_kind == NOT_A_TAG
394 && ann->is_alias_tag
395 && !bitmap_bit_p (visited, ann->uid))
396 {
397 error ("Addressable variable that is an alias tag but is not in any alias set.");
398 goto err;
399 }
400 }
401
402 BITMAP_XFREE (visited);
403 return;
404
405err:
406 debug_variable (var);
407 internal_error ("verify_flow_insensitive_alias_info failed.");
408}
409
410
411static void
412verify_flow_sensitive_alias_info (void)
413{
414 size_t i;
415 tree ptr;
416
417 for (i = 1; i < num_ssa_names; i++)
418 {
419 var_ann_t ann;
420 struct ptr_info_def *pi;
421
422 ptr = ssa_name (i);
8b547e44
JH
423 if (!ptr)
424 continue;
53b4bf74
DN
425 ann = var_ann (SSA_NAME_VAR (ptr));
426 pi = SSA_NAME_PTR_INFO (ptr);
427
428 /* We only care for pointers that are actually referenced in the
429 program. */
430 if (!TREE_VISITED (ptr) || !POINTER_TYPE_P (TREE_TYPE (ptr)))
431 continue;
432
433 /* RESULT_DECL is special. If it's a GIMPLE register, then it
434 is only written-to only once in the return statement.
435 Otherwise, aggregate RESULT_DECLs may be written-to more than
436 once in virtual operands. */
437 if (TREE_CODE (SSA_NAME_VAR (ptr)) == RESULT_DECL
438 && is_gimple_reg (ptr))
439 continue;
440
441 if (pi == NULL)
442 continue;
443
444 if (pi->is_dereferenced && !pi->name_mem_tag && !ann->type_mem_tag)
445 {
446 error ("Dereferenced pointers should have a name or a type tag");
447 goto err;
448 }
449
53b4bf74
DN
450 if (pi->name_mem_tag
451 && !pi->pt_malloc
452 && (pi->pt_vars == NULL
453 || bitmap_first_set_bit (pi->pt_vars) < 0))
454 {
455 error ("Pointers with a memory tag, should have points-to sets or point to malloc");
456 goto err;
457 }
458
459 if (pi->value_escapes_p
460 && pi->name_mem_tag
461 && !is_call_clobbered (pi->name_mem_tag))
462 {
463 error ("Pointer escapes but its name tag is not call-clobbered.");
464 goto err;
465 }
53b4bf74
DN
466 }
467
468 return;
469
470err:
471 debug_variable (ptr);
472 internal_error ("verify_flow_sensitive_alias_info failed.");
473}
474
7dcdacad
DB
475DEF_VEC_MALLOC_P (bitmap);
476
477/* Verify that all name tags have different points to sets.
478 This algorithm takes advantage of the fact that every variable with the
479 same name tag must have the same points-to set.
3d4818fd 480 So we check a single variable for each name tag, and verify that its
7dcdacad
DB
481 points-to set is different from every other points-to set for other name
482 tags. */
483
484static void
485verify_name_tags (void)
486{
487 size_t i;
488 size_t j;
489 bitmap first, second;
490 VEC (tree) *name_tag_reps = NULL;
491 VEC (bitmap) *pt_vars_for_reps = NULL;
492
493 /* First we compute the name tag representatives and their points-to sets. */
494 for (i = 0; i < num_ssa_names; i++)
495 {
496 if (ssa_name (i))
497 {
498 tree ptr = ssa_name (i);
499 struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr);
500 if (!TREE_VISITED (ptr)
501 || !POINTER_TYPE_P (TREE_TYPE (ptr))
502 || !pi
503 || !pi->name_mem_tag
504 || TREE_VISITED (pi->name_mem_tag))
505 continue;
506 TREE_VISITED (pi->name_mem_tag) = 1;
507 if (pi->pt_vars != NULL)
508 {
509 VEC_safe_push (tree, name_tag_reps, ptr);
510 VEC_safe_push (bitmap, pt_vars_for_reps, pi->pt_vars);
511 }
512 }
513 }
514
515 /* Now compare all the representative bitmaps with all other representative
516 bitmaps, to verify that they are all different. */
517 for (i = 0; VEC_iterate (bitmap, pt_vars_for_reps, i, first); i++)
518 {
519 for (j = i + 1; VEC_iterate (bitmap, pt_vars_for_reps, j, second); j++)
520 {
521 if (bitmap_equal_p (first, second))
522 {
523 error ("Two different pointers with identical points-to sets but different name tags");
524 debug_variable (VEC_index (tree, name_tag_reps, j));
525 goto err;
526 }
527 }
528 }
53b4bf74 529
7dcdacad
DB
530 /* Lastly, clear out the visited flags. */
531 for (i = 0; i < num_ssa_names; i++)
532 {
533 if (ssa_name (i))
534 {
535 tree ptr = ssa_name (i);
536 struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr);
537 if (!TREE_VISITED (ptr)
538 || !POINTER_TYPE_P (TREE_TYPE (ptr))
539 || !pi
540 || !pi->name_mem_tag)
541 continue;
542 TREE_VISITED (pi->name_mem_tag) = 0;
543 }
544 }
545 VEC_free (bitmap, pt_vars_for_reps);
546 return;
547
548err:
549 debug_variable (VEC_index (tree, name_tag_reps, i));
550 internal_error ("verify_name_tags failed");
551}
53b4bf74
DN
552/* Verify the consistency of aliasing information. */
553
554static void
555verify_alias_info (void)
556{
c1b763fa 557 verify_flow_sensitive_alias_info ();
7dcdacad 558 verify_name_tags ();
c1b763fa 559 verify_flow_insensitive_alias_info ();
53b4bf74
DN
560}
561
562
6de9cd9a
DN
563/* Verify common invariants in the SSA web.
564 TODO: verify the variable annotations. */
565
566void
567verify_ssa (void)
568{
53b4bf74 569 size_t i;
6de9cd9a 570 basic_block bb;
95a3742c 571 basic_block *definition_block = xcalloc (num_ssa_names, sizeof (basic_block));
4c124b4c
AM
572 ssa_op_iter iter;
573 tree op;
03261822 574 enum dom_state orig_dom_state = dom_computed[CDI_DOMINATORS];
b1d16eff 575 bitmap names_defined_in_bb = BITMAP_XMALLOC ();
6de9cd9a
DN
576
577 timevar_push (TV_TREE_SSA_VERIFY);
578
53b4bf74
DN
579 /* Keep track of SSA names present in the IL. */
580 for (i = 1; i < num_ssa_names; i++)
8b547e44
JH
581 if (ssa_name (i))
582 TREE_VISITED (ssa_name (i)) = 0;
53b4bf74 583
6de9cd9a
DN
584 calculate_dominance_info (CDI_DOMINATORS);
585
586 /* Verify and register all the SSA_NAME definitions found in the
587 function. */
588 FOR_EACH_BB (bb)
589 {
590 tree phi;
591 block_stmt_iterator bsi;
592
17192884 593 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
af16db69
DB
594 {
595 int i;
596 if (verify_def (bb, definition_block, PHI_RESULT (phi), phi,
53b4bf74
DN
597 !is_gimple_reg (PHI_RESULT (phi))))
598 goto err;
af16db69
DB
599 for (i = 0; i < PHI_NUM_ARGS (phi); i++)
600 {
601 tree def = PHI_ARG_DEF (phi, i);
602 if (TREE_CODE (def) != SSA_NAME && !is_gimple_min_invariant (def))
603 {
604 error ("PHI argument is not SSA_NAME, or invariant");
605 print_generic_stmt (stderr, phi, TDF_VOPS);
606 goto err;
607 }
608 }
609 }
6de9cd9a
DN
610
611 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
612 {
613 tree stmt;
6de9cd9a
DN
614
615 stmt = bsi_stmt (bsi);
6de9cd9a
DN
616 get_stmt_operands (stmt);
617
4c124b4c
AM
618 if (stmt_ann (stmt)->makes_aliased_stores
619 && NUM_V_MAY_DEFS (STMT_V_MAY_DEF_OPS (stmt)) == 0)
53b4bf74
DN
620 {
621 error ("Statement makes aliased stores, but has no V_MAY_DEFS");
7bab95ba 622 print_generic_stmt (stderr, stmt, TDF_VOPS);
53b4bf74
DN
623 goto err;
624 }
a32b97a2 625
4c124b4c 626 FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_VIRTUAL_DEFS)
6de9cd9a 627 {
53b4bf74
DN
628 if (verify_def (bb, definition_block, op, stmt, true))
629 goto err;
6de9cd9a 630 }
a32b97a2 631
4c124b4c 632 FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_DEF)
a32b97a2 633 {
53b4bf74
DN
634 if (verify_def (bb, definition_block, op, stmt, false))
635 goto err;
6de9cd9a
DN
636 }
637 }
638 }
639
640
641 /* Now verify all the uses and make sure they agree with the definitions
642 found in the previous pass. */
643 FOR_EACH_BB (bb)
644 {
645 edge e;
646 tree phi;
628f6a4e 647 edge_iterator ei;
6de9cd9a
DN
648 block_stmt_iterator bsi;
649
650 /* Make sure that all edges have a clear 'aux' field. */
628f6a4e 651 FOR_EACH_EDGE (e, ei, bb->preds)
6de9cd9a
DN
652 {
653 if (e->aux)
654 {
655 error ("AUX pointer initialized for edge %d->%d\n", e->src->index,
656 e->dest->index);
53b4bf74 657 goto err;
6de9cd9a
DN
658 }
659 }
660
661 /* Verify the arguments for every PHI node in the block. */
17192884 662 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
b1d16eff
ZD
663 {
664 if (verify_phi_args (phi, bb, definition_block))
665 goto err;
666 bitmap_set_bit (names_defined_in_bb,
667 SSA_NAME_VERSION (PHI_RESULT (phi)));
668 }
6de9cd9a 669
53b4bf74 670 /* Now verify all the uses and vuses in every statement of the block. */
6de9cd9a
DN
671 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
672 {
673 tree stmt = bsi_stmt (bsi);
6de9cd9a 674
52328bf6 675 FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_VIRTUAL_USES | SSA_OP_VIRTUAL_KILLS)
6de9cd9a 676 {
53b4bf74 677 if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
b1d16eff
ZD
678 op, stmt, false, true,
679 names_defined_in_bb))
53b4bf74 680 goto err;
6de9cd9a
DN
681 }
682
4c124b4c 683 FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE)
6de9cd9a 684 {
53b4bf74 685 if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
b1d16eff
ZD
686 op, stmt, false, false,
687 names_defined_in_bb))
688 goto err;
689 }
690
691 FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_ALL_DEFS)
692 {
693 bitmap_set_bit (names_defined_in_bb, SSA_NAME_VERSION (op));
694 }
695 }
696
697 /* Verify the uses in arguments of PHI nodes at the exits from the
698 block. */
628f6a4e 699 FOR_EACH_EDGE (e, ei, bb->succs)
b1d16eff
ZD
700 {
701 for (phi = phi_nodes (e->dest); phi; phi = PHI_CHAIN (phi))
702 {
703 bool virtual = !is_gimple_reg (PHI_RESULT (phi));
704 op = PHI_ARG_DEF_FROM_EDGE (phi, e);
705 if (TREE_CODE (op) != SSA_NAME)
706 continue;
707
708 if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
709 op, phi, false, virtual,
710 names_defined_in_bb))
53b4bf74 711 goto err;
6de9cd9a
DN
712 }
713 }
b1d16eff
ZD
714
715 bitmap_clear (names_defined_in_bb);
6de9cd9a
DN
716 }
717
53b4bf74
DN
718 /* Finally, verify alias information. */
719 verify_alias_info ();
6de9cd9a 720
53b4bf74 721 free (definition_block);
b01d837f
KH
722 /* Restore the dominance information to its prior known state, so
723 that we do not perturb the compiler's subsequent behavior. */
03261822
NS
724 if (orig_dom_state == DOM_NONE)
725 free_dominance_info (CDI_DOMINATORS);
726 else
727 dom_computed[CDI_DOMINATORS] = orig_dom_state;
728
b1d16eff 729 BITMAP_XFREE (names_defined_in_bb);
6de9cd9a 730 timevar_pop (TV_TREE_SSA_VERIFY);
53b4bf74 731 return;
6de9cd9a 732
53b4bf74
DN
733err:
734 internal_error ("verify_ssa failed.");
6de9cd9a
DN
735}
736
737
6de9cd9a
DN
738/* Initialize global DFA and SSA structures. */
739
740void
741init_tree_ssa (void)
742{
743 VARRAY_TREE_INIT (referenced_vars, 20, "referenced_vars");
744 call_clobbered_vars = BITMAP_XMALLOC ();
a6d02559 745 addressable_vars = BITMAP_XMALLOC ();
6de9cd9a
DN
746 init_ssa_operands ();
747 init_ssanames ();
748 init_phinodes ();
749 global_var = NULL_TREE;
6de9cd9a
DN
750}
751
752
753/* Deallocate memory associated with SSA data structures for FNDECL. */
754
755void
756delete_tree_ssa (void)
757{
758 size_t i;
759 basic_block bb;
760 block_stmt_iterator bsi;
761
762 /* Remove annotations from every tree in the function. */
763 FOR_EACH_BB (bb)
764 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
80d8221e
JH
765 {
766 tree stmt = bsi_stmt (bsi);
767 release_defs (stmt);
768 ggc_free (stmt->common.ann);
769 stmt->common.ann = NULL;
770 }
6de9cd9a
DN
771
772 /* Remove annotations from every referenced variable. */
773 if (referenced_vars)
774 {
775 for (i = 0; i < num_referenced_vars; i++)
80d8221e
JH
776 {
777 tree var = referenced_var (i);
778 ggc_free (var->common.ann);
779 var->common.ann = NULL;
780 }
6de9cd9a
DN
781 referenced_vars = NULL;
782 }
783
784 fini_ssanames ();
785 fini_phinodes ();
786 fini_ssa_operands ();
787
788 global_var = NULL_TREE;
6b9bee8e 789 BITMAP_XFREE (call_clobbered_vars);
6de9cd9a 790 call_clobbered_vars = NULL;
a6d02559
DN
791 BITMAP_XFREE (addressable_vars);
792 addressable_vars = NULL;
6de9cd9a
DN
793}
794
795
796/* Return true if EXPR is a useless type conversion, otherwise return
797 false. */
798
799bool
800tree_ssa_useless_type_conversion_1 (tree outer_type, tree inner_type)
801{
802 /* If the inner and outer types are effectively the same, then
803 strip the type conversion and enter the equivalence into
804 the table. */
805 if (inner_type == outer_type
806 || (lang_hooks.types_compatible_p (inner_type, outer_type)))
807 return true;
808
809 /* If both types are pointers and the outer type is a (void *), then
810 the conversion is not necessary. The opposite is not true since
811 that conversion would result in a loss of information if the
812 equivalence was used. Consider an indirect function call where
813 we need to know the exact type of the function to correctly
814 implement the ABI. */
815 else if (POINTER_TYPE_P (inner_type)
816 && POINTER_TYPE_P (outer_type)
817 && TREE_CODE (TREE_TYPE (outer_type)) == VOID_TYPE)
818 return true;
819
820 /* Pointers and references are equivalent once we get to GENERIC,
821 so strip conversions that just switch between them. */
822 else if (POINTER_TYPE_P (inner_type)
823 && POINTER_TYPE_P (outer_type)
3facc4b6
AP
824 && lang_hooks.types_compatible_p (TREE_TYPE (inner_type),
825 TREE_TYPE (outer_type)))
6de9cd9a
DN
826 return true;
827
828 /* If both the inner and outer types are integral types, then the
829 conversion is not necessary if they have the same mode and
bc15d0ef
JM
830 signedness and precision, and both or neither are boolean. Some
831 code assumes an invariant that boolean types stay boolean and do
832 not become 1-bit bit-field types. Note that types with precision
833 not using all bits of the mode (such as bit-field types in C)
834 mean that testing of precision is necessary. */
6de9cd9a
DN
835 else if (INTEGRAL_TYPE_P (inner_type)
836 && INTEGRAL_TYPE_P (outer_type)
837 && TYPE_MODE (inner_type) == TYPE_MODE (outer_type)
838 && TYPE_UNSIGNED (inner_type) == TYPE_UNSIGNED (outer_type)
839 && TYPE_PRECISION (inner_type) == TYPE_PRECISION (outer_type))
bc15d0ef
JM
840 {
841 bool first_boolean = (TREE_CODE (inner_type) == BOOLEAN_TYPE);
842 bool second_boolean = (TREE_CODE (outer_type) == BOOLEAN_TYPE);
843 if (first_boolean == second_boolean)
844 return true;
845 }
6de9cd9a
DN
846
847 /* Recurse for complex types. */
848 else if (TREE_CODE (inner_type) == COMPLEX_TYPE
849 && TREE_CODE (outer_type) == COMPLEX_TYPE
850 && tree_ssa_useless_type_conversion_1 (TREE_TYPE (outer_type),
851 TREE_TYPE (inner_type)))
852 return true;
853
854 return false;
855}
856
857/* Return true if EXPR is a useless type conversion, otherwise return
858 false. */
859
860bool
861tree_ssa_useless_type_conversion (tree expr)
862{
863 /* If we have an assignment that merely uses a NOP_EXPR to change
864 the top of the RHS to the type of the LHS and the type conversion
865 is "safe", then strip away the type conversion so that we can
866 enter LHS = RHS into the const_and_copies table. */
580d124f
RK
867 if (TREE_CODE (expr) == NOP_EXPR || TREE_CODE (expr) == CONVERT_EXPR
868 || TREE_CODE (expr) == VIEW_CONVERT_EXPR
869 || TREE_CODE (expr) == NON_LVALUE_EXPR)
6de9cd9a
DN
870 return tree_ssa_useless_type_conversion_1 (TREE_TYPE (expr),
871 TREE_TYPE (TREE_OPERAND (expr,
872 0)));
873
874
875 return false;
876}
877
878
879/* Internal helper for walk_use_def_chains. VAR, FN and DATA are as
53b4bf74
DN
880 described in walk_use_def_chains.
881
882 VISITED is a bitmap used to mark visited SSA_NAMEs to avoid
883 infinite loops.
884
885 IS_DFS is true if the caller wants to perform a depth-first search
886 when visiting PHI nodes. A DFS will visit each PHI argument and
887 call FN after each one. Otherwise, all the arguments are
888 visited first and then FN is called with each of the visited
889 arguments in a separate pass. */
6de9cd9a
DN
890
891static bool
892walk_use_def_chains_1 (tree var, walk_use_def_chains_fn fn, void *data,
53b4bf74 893 bitmap visited, bool is_dfs)
6de9cd9a
DN
894{
895 tree def_stmt;
896
897 if (bitmap_bit_p (visited, SSA_NAME_VERSION (var)))
898 return false;
899
900 bitmap_set_bit (visited, SSA_NAME_VERSION (var));
901
902 def_stmt = SSA_NAME_DEF_STMT (var);
903
904 if (TREE_CODE (def_stmt) != PHI_NODE)
905 {
906 /* If we reached the end of the use-def chain, call FN. */
53b4bf74 907 return fn (var, def_stmt, data);
6de9cd9a
DN
908 }
909 else
910 {
911 int i;
912
53b4bf74
DN
913 /* When doing a breadth-first search, call FN before following the
914 use-def links for each argument. */
915 if (!is_dfs)
916 for (i = 0; i < PHI_NUM_ARGS (def_stmt); i++)
917 if (fn (PHI_ARG_DEF (def_stmt, i), def_stmt, data))
918 return true;
919
920 /* Follow use-def links out of each PHI argument. */
6de9cd9a
DN
921 for (i = 0; i < PHI_NUM_ARGS (def_stmt); i++)
922 {
923 tree arg = PHI_ARG_DEF (def_stmt, i);
924 if (TREE_CODE (arg) == SSA_NAME
53b4bf74 925 && walk_use_def_chains_1 (arg, fn, data, visited, is_dfs))
6de9cd9a
DN
926 return true;
927 }
53b4bf74
DN
928
929 /* When doing a depth-first search, call FN after following the
930 use-def links for each argument. */
931 if (is_dfs)
932 for (i = 0; i < PHI_NUM_ARGS (def_stmt); i++)
933 if (fn (PHI_ARG_DEF (def_stmt, i), def_stmt, data))
934 return true;
6de9cd9a 935 }
53b4bf74 936
6de9cd9a
DN
937 return false;
938}
939
940
941
53b4bf74
DN
942/* Walk use-def chains starting at the SSA variable VAR. Call
943 function FN at each reaching definition found. FN takes three
944 arguments: VAR, its defining statement (DEF_STMT) and a generic
945 pointer to whatever state information that FN may want to maintain
946 (DATA). FN is able to stop the walk by returning true, otherwise
947 in order to continue the walk, FN should return false.
6de9cd9a
DN
948
949 Note, that if DEF_STMT is a PHI node, the semantics are slightly
53b4bf74
DN
950 different. The first argument to FN is no longer the original
951 variable VAR, but the PHI argument currently being examined. If FN
952 wants to get at VAR, it should call PHI_RESULT (PHI).
953
954 If IS_DFS is true, this function will:
6de9cd9a 955
53b4bf74
DN
956 1- walk the use-def chains for all the PHI arguments, and,
957 2- call (*FN) (ARG, PHI, DATA) on all the PHI arguments.
958
959 If IS_DFS is false, the two steps above are done in reverse order
960 (i.e., a breadth-first search). */
6de9cd9a 961
6de9cd9a
DN
962
963void
53b4bf74
DN
964walk_use_def_chains (tree var, walk_use_def_chains_fn fn, void *data,
965 bool is_dfs)
6de9cd9a
DN
966{
967 tree def_stmt;
968
1e128c5f 969 gcc_assert (TREE_CODE (var) == SSA_NAME);
6de9cd9a
DN
970
971 def_stmt = SSA_NAME_DEF_STMT (var);
972
973 /* We only need to recurse if the reaching definition comes from a PHI
974 node. */
975 if (TREE_CODE (def_stmt) != PHI_NODE)
976 (*fn) (var, def_stmt, data);
977 else
978 {
979 bitmap visited = BITMAP_XMALLOC ();
53b4bf74 980 walk_use_def_chains_1 (var, fn, data, visited, is_dfs);
6de9cd9a
DN
981 BITMAP_XFREE (visited);
982 }
983}
984
53b4bf74 985
d7621d3c
ZD
986/* Replaces VAR with REPL in memory reference expression *X in
987 statement STMT. */
988
989static void
990propagate_into_addr (tree stmt, tree var, tree *x, tree repl)
991{
992 tree new_var, ass_stmt, addr_var;
993 basic_block bb;
994 block_stmt_iterator bsi;
995
996 /* There is nothing special to handle in the other cases. */
997 if (TREE_CODE (repl) != ADDR_EXPR)
998 return;
999 addr_var = TREE_OPERAND (repl, 0);
1000
0705d602
RK
1001 while (handled_component_p (*x)
1002 || TREE_CODE (*x) == REALPART_EXPR
1003 || TREE_CODE (*x) == IMAGPART_EXPR)
d7621d3c
ZD
1004 x = &TREE_OPERAND (*x, 0);
1005
1006 if (TREE_CODE (*x) != INDIRECT_REF
1007 || TREE_OPERAND (*x, 0) != var)
1008 return;
1009
d7621d3c
ZD
1010 if (TREE_TYPE (*x) == TREE_TYPE (addr_var))
1011 {
1012 *x = addr_var;
1013 mark_new_vars_to_rename (stmt, vars_to_rename);
1014 return;
1015 }
1016
68b9f53b 1017
d7621d3c
ZD
1018 /* Frontends sometimes produce expressions like *&a instead of a[0].
1019 Create a temporary variable to handle this case. */
1020 ass_stmt = build2 (MODIFY_EXPR, void_type_node, NULL_TREE, repl);
1021 new_var = duplicate_ssa_name (var, ass_stmt);
1022 TREE_OPERAND (*x, 0) = new_var;
1023 TREE_OPERAND (ass_stmt, 0) = new_var;
1024
1025 bb = bb_for_stmt (stmt);
1026 tree_block_label (bb);
1027 bsi = bsi_after_labels (bb);
1028 bsi_insert_after (&bsi, ass_stmt, BSI_NEW_STMT);
1029
1030 mark_new_vars_to_rename (stmt, vars_to_rename);
1031}
6de9cd9a
DN
1032
1033/* Replaces immediate uses of VAR by REPL. */
1034
1035static void
1036replace_immediate_uses (tree var, tree repl)
1037{
6de9cd9a
DN
1038 int i, j, n;
1039 dataflow_t df;
1040 tree stmt;
d7621d3c 1041 bool mark_new_vars;
4c124b4c
AM
1042 ssa_op_iter iter;
1043 use_operand_p use_p;
6de9cd9a
DN
1044
1045 df = get_immediate_uses (SSA_NAME_DEF_STMT (var));
1046 n = num_immediate_uses (df);
1047
1048 for (i = 0; i < n; i++)
1049 {
1050 stmt = immediate_use (df, i);
6de9cd9a
DN
1051
1052 if (TREE_CODE (stmt) == PHI_NODE)
1053 {
1054 for (j = 0; j < PHI_NUM_ARGS (stmt); j++)
1055 if (PHI_ARG_DEF (stmt, j) == var)
1056 {
d00ad49b 1057 SET_PHI_ARG_DEF (stmt, j, repl);
6de9cd9a
DN
1058 if (TREE_CODE (repl) == SSA_NAME
1059 && PHI_ARG_EDGE (stmt, j)->flags & EDGE_ABNORMAL)
1060 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (repl) = 1;
1061 }
1062
1063 continue;
1064 }
1065
1066 get_stmt_operands (stmt);
d7621d3c 1067 mark_new_vars = false;
6de9cd9a
DN
1068 if (is_gimple_reg (SSA_NAME_VAR (var)))
1069 {
d7621d3c
ZD
1070 if (TREE_CODE (stmt) == MODIFY_EXPR)
1071 {
1072 propagate_into_addr (stmt, var, &TREE_OPERAND (stmt, 0), repl);
1073 propagate_into_addr (stmt, var, &TREE_OPERAND (stmt, 1), repl);
1074 }
1075
4c124b4c
AM
1076 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE)
1077 if (USE_FROM_PTR (use_p) == var)
d7621d3c 1078 {
4c124b4c 1079 propagate_value (use_p, repl);
d7621d3c
ZD
1080 mark_new_vars = POINTER_TYPE_P (TREE_TYPE (repl));
1081 }
6de9cd9a
DN
1082 }
1083 else
1084 {
52328bf6
DB
1085 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter,
1086 SSA_OP_VIRTUAL_USES | SSA_OP_VIRTUAL_KILLS)
4c124b4c
AM
1087 if (USE_FROM_PTR (use_p) == var)
1088 propagate_value (use_p, repl);
6de9cd9a
DN
1089 }
1090
7eae8eb2
DN
1091 /* FIXME. If REPL is a constant, we need to fold STMT.
1092 However, fold_stmt wants a pointer to the statement, because
1093 it may happen that it needs to replace the whole statement
1094 with a new expression. Since the current def-use machinery
1095 does not return pointers to statements, we call fold_stmt
1096 with the address of a local temporary, if that call changes
bca9e17b
DN
1097 the temporary then we fallback on looking for a proper
1098 pointer to STMT by scanning STMT's basic block.
7eae8eb2
DN
1099
1100 Note that all this will become unnecessary soon. This
1101 pass is being replaced with a proper copy propagation pass
1102 for 4.1 (dnovillo, 2004-09-17). */
1103 if (TREE_CODE (repl) != SSA_NAME)
1104 {
1105 tree tmp = stmt;
1106 fold_stmt (&tmp);
1107 if (tmp != stmt)
bca9e17b 1108 {
1a1804c2
DN
1109 block_stmt_iterator si = bsi_for_stmt (stmt);
1110 bsi_replace (&si, tmp, true);
1111 stmt = bsi_stmt (si);
bca9e17b 1112 }
7eae8eb2
DN
1113 }
1114
6de9cd9a
DN
1115 /* If REPL is a pointer, it may have different memory tags associated
1116 with it. For instance, VAR may have had a name tag while REPL
1117 only had a type tag. In these cases, the virtual operands (if
1118 any) in the statement will refer to different symbols which need
1119 to be renamed. */
d7621d3c 1120 if (mark_new_vars)
6de9cd9a 1121 mark_new_vars_to_rename (stmt, vars_to_rename);
d7621d3c
ZD
1122 else
1123 modify_stmt (stmt);
6de9cd9a
DN
1124 }
1125}
1126
048d9936
ZD
1127/* Gets the value VAR is equivalent to according to EQ_TO. */
1128
1129static tree
1130get_eq_name (tree *eq_to, tree var)
1131{
1132 unsigned ver;
1133 tree val = var;
1134
1135 while (TREE_CODE (val) == SSA_NAME)
1136 {
1137 ver = SSA_NAME_VERSION (val);
1138 if (!eq_to[ver])
1139 break;
1140
1141 val = eq_to[ver];
1142 }
1143
1144 while (TREE_CODE (var) == SSA_NAME)
1145 {
1146 ver = SSA_NAME_VERSION (var);
1147 if (!eq_to[ver])
1148 break;
1149
1150 var = eq_to[ver];
1151 eq_to[ver] = val;
1152 }
1153
1154 return val;
1155}
1156
1157/* Checks whether phi node PHI is redundant and if it is, records the ssa name
1158 its result is redundant to to EQ_TO array. */
6de9cd9a
DN
1159
1160static void
048d9936 1161check_phi_redundancy (tree phi, tree *eq_to)
6de9cd9a 1162{
048d9936
ZD
1163 tree val = NULL_TREE, def, res = PHI_RESULT (phi), stmt;
1164 unsigned i, ver = SSA_NAME_VERSION (res), n;
6de9cd9a
DN
1165 dataflow_t df;
1166
048d9936
ZD
1167 /* It is unlikely that such large phi node would be redundant. */
1168 if (PHI_NUM_ARGS (phi) > 16)
6de9cd9a
DN
1169 return;
1170
048d9936 1171 for (i = 0; i < (unsigned) PHI_NUM_ARGS (phi); i++)
6de9cd9a 1172 {
048d9936
ZD
1173 def = PHI_ARG_DEF (phi, i);
1174
1175 if (TREE_CODE (def) == SSA_NAME)
1176 {
1177 def = get_eq_name (eq_to, def);
1178 if (def == res)
1179 continue;
1180 }
1181
1182 if (val
1183 && !operand_equal_p (val, def, 0))
6de9cd9a
DN
1184 return;
1185
048d9936 1186 val = def;
6de9cd9a 1187 }
6de9cd9a 1188
048d9936
ZD
1189 /* At least one of the arguments should not be equal to the result, or
1190 something strange is happening. */
1e128c5f 1191 gcc_assert (val);
048d9936
ZD
1192
1193 if (get_eq_name (eq_to, res) == val)
1194 return;
1195
1196 if (!may_propagate_copy (res, val))
1197 return;
1198
1199 eq_to[ver] = val;
1200
1201 df = get_immediate_uses (SSA_NAME_DEF_STMT (res));
6de9cd9a
DN
1202 n = num_immediate_uses (df);
1203
1204 for (i = 0; i < n; i++)
1205 {
1206 stmt = immediate_use (df, i);
1207
048d9936
ZD
1208 if (TREE_CODE (stmt) == PHI_NODE)
1209 check_phi_redundancy (stmt, eq_to);
6de9cd9a
DN
1210 }
1211}
1212
1213/* Removes redundant phi nodes.
1214
1215 A redundant PHI node is a PHI node where all of its PHI arguments
1216 are the same value, excluding any PHI arguments which are the same
1217 as the PHI result.
1218
1219 A redundant PHI node is effectively a copy, so we forward copy propagate
1220 which removes all uses of the destination of the PHI node then
1221 finally we delete the redundant PHI node.
1222
1223 Note that if we can not copy propagate the PHI node, then the PHI
1224 will not be removed. Thus we do not have to worry about dependencies
1225 between PHIs and the problems serializing PHIs into copies creates.
1226
1227 The most important effect of this pass is to remove degenerate PHI
1228 nodes created by removing unreachable code. */
1229
c66b6c66 1230void
6de9cd9a
DN
1231kill_redundant_phi_nodes (void)
1232{
95a3742c 1233 tree *eq_to;
048d9936 1234 unsigned i, old_num_ssa_names;
6de9cd9a 1235 basic_block bb;
048d9936
ZD
1236 tree phi, var, repl, stmt;
1237
1238 /* The EQ_TO[VER] holds the value by that the ssa name VER should be
1239 replaced. If EQ_TO[VER] is ssa name and it is decided to replace it by
1240 other value, it may be necessary to follow the chain till the final value.
1241 We perform path shortening (replacing the entries of the EQ_TO array with
1242 heads of these chains) whenever we access the field to prevent quadratic
1243 complexity (probably would not occur in practice anyway, but let us play
1244 it safe). */
95a3742c 1245 eq_to = xcalloc (num_ssa_names, sizeof (tree));
6de9cd9a
DN
1246
1247 /* We have had cases where computing immediate uses takes a
1248 significant amount of compile time. If we run into such
1249 problems here, we may want to only compute immediate uses for
1250 a subset of all the SSA_NAMEs instead of computing it for
1251 all of the SSA_NAMEs. */
1252 compute_immediate_uses (TDFA_USE_OPS | TDFA_USE_VOPS, NULL);
048d9936 1253 old_num_ssa_names = num_ssa_names;
6de9cd9a
DN
1254
1255 FOR_EACH_BB (bb)
1256 {
048d9936 1257 for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
6de9cd9a
DN
1258 {
1259 var = PHI_RESULT (phi);
048d9936 1260 check_phi_redundancy (phi, eq_to);
6de9cd9a
DN
1261 }
1262 }
1263
1264 /* Now propagate the values. */
048d9936
ZD
1265 for (i = 0; i < old_num_ssa_names; i++)
1266 {
1267 if (!ssa_name (i))
1268 continue;
1269
1270 repl = get_eq_name (eq_to, ssa_name (i));
1271 if (repl != ssa_name (i))
1272 replace_immediate_uses (ssa_name (i), repl);
1273 }
6de9cd9a
DN
1274
1275 /* And remove the dead phis. */
048d9936
ZD
1276 for (i = 0; i < old_num_ssa_names; i++)
1277 {
1278 if (!ssa_name (i))
1279 continue;
1280
1281 repl = get_eq_name (eq_to, ssa_name (i));
1282 if (repl != ssa_name (i))
1283 {
1284 stmt = SSA_NAME_DEF_STMT (ssa_name (i));
1285 remove_phi_node (stmt, NULL_TREE, bb_for_stmt (stmt));
1286 }
1287 }
6de9cd9a
DN
1288
1289 free_df ();
1290 free (eq_to);
6de9cd9a
DN
1291}
1292
1293struct tree_opt_pass pass_redundant_phi =
1294{
1295 "redphi", /* name */
1296 NULL, /* gate */
1297 kill_redundant_phi_nodes, /* execute */
1298 NULL, /* sub */
1299 NULL, /* next */
1300 0, /* static_pass_number */
1301 0, /* tv_id */
c1b763fa 1302 PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
6de9cd9a
DN
1303 0, /* properties_provided */
1304 0, /* properties_destroyed */
1305 0, /* todo_flags_start */
1306 TODO_dump_func | TODO_rename_vars
9f8628ba
PB
1307 | TODO_ggc_collect | TODO_verify_ssa, /* todo_flags_finish */
1308 0 /* letter */
6de9cd9a
DN
1309};
1310\f
1311/* Emit warnings for uninitialized variables. This is done in two passes.
1312
1313 The first pass notices real uses of SSA names with default definitions.
1314 Such uses are unconditionally uninitialized, and we can be certain that
1315 such a use is a mistake. This pass is run before most optimizations,
1316 so that we catch as many as we can.
1317
1318 The second pass follows PHI nodes to find uses that are potentially
1319 uninitialized. In this case we can't necessarily prove that the use
1320 is really uninitialized. This pass is run after most optimizations,
1321 so that we thread as many jumps and possible, and delete as much dead
1322 code as possible, in order to reduce false positives. We also look
1323 again for plain uninitialized variables, since optimization may have
1324 changed conditionally uninitialized to unconditionally uninitialized. */
1325
1326/* Emit a warning for T, an SSA_NAME, being uninitialized. The exact
1327 warning text is in MSGID and LOCUS may contain a location or be null. */
1328
1329static void
1330warn_uninit (tree t, const char *msgid, location_t *locus)
1331{
1332 tree var = SSA_NAME_VAR (t);
1333 tree def = SSA_NAME_DEF_STMT (t);
1334
1335 /* Default uses (indicated by an empty definition statement),
1336 are uninitialized. */
1337 if (!IS_EMPTY_STMT (def))
1338 return;
1339
1340 /* Except for PARMs of course, which are always initialized. */
1341 if (TREE_CODE (var) == PARM_DECL)
1342 return;
1343
1344 /* Hard register variables get their initial value from the ether. */
e670d9e4 1345 if (TREE_CODE (var) == VAR_DECL && DECL_HARD_REGISTER (var))
6de9cd9a
DN
1346 return;
1347
1348 /* TREE_NO_WARNING either means we already warned, or the front end
1349 wishes to suppress the warning. */
1350 if (TREE_NO_WARNING (var))
1351 return;
1352
1353 if (!locus)
1354 locus = &DECL_SOURCE_LOCATION (var);
1355 warning (msgid, locus, var);
1356 TREE_NO_WARNING (var) = 1;
1357}
1358
1359/* Called via walk_tree, look for SSA_NAMEs that have empty definitions
1360 and warn about them. */
1361
1362static tree
1363warn_uninitialized_var (tree *tp, int *walk_subtrees, void *data)
1364{
1365 location_t *locus = data;
1366 tree t = *tp;
1367
1368 /* We only do data flow with SSA_NAMEs, so that's all we can warn about. */
1369 if (TREE_CODE (t) == SSA_NAME)
1370 {
1371 warn_uninit (t, "%H'%D' is used uninitialized in this function", locus);
1372 *walk_subtrees = 0;
1373 }
6615c446 1374 else if (IS_TYPE_OR_DECL_P (t))
6de9cd9a
DN
1375 *walk_subtrees = 0;
1376
1377 return NULL_TREE;
1378}
1379
1380/* Look for inputs to PHI that are SSA_NAMEs that have empty definitions
1381 and warn about them. */
1382
1383static void
1384warn_uninitialized_phi (tree phi)
1385{
1386 int i, n = PHI_NUM_ARGS (phi);
1387
1388 /* Don't look at memory tags. */
1389 if (!is_gimple_reg (PHI_RESULT (phi)))
1390 return;
1391
1392 for (i = 0; i < n; ++i)
1393 {
1394 tree op = PHI_ARG_DEF (phi, i);
1395 if (TREE_CODE (op) == SSA_NAME)
1396 warn_uninit (op, "%H'%D' may be used uninitialized in this function",
1397 NULL);
1398 }
1399}
1400
1401static void
1402execute_early_warn_uninitialized (void)
1403{
1404 block_stmt_iterator bsi;
1405 basic_block bb;
1406
1407 FOR_EACH_BB (bb)
1408 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
1409 walk_tree (bsi_stmt_ptr (bsi), warn_uninitialized_var,
1410 EXPR_LOCUS (bsi_stmt (bsi)), NULL);
1411}
1412
1413static void
1414execute_late_warn_uninitialized (void)
1415{
1416 basic_block bb;
1417 tree phi;
1418
1419 /* Re-do the plain uninitialized variable check, as optimization may have
1420 straightened control flow. Do this first so that we don't accidentally
1421 get a "may be" warning when we'd have seen an "is" warning later. */
1422 execute_early_warn_uninitialized ();
1423
1424 FOR_EACH_BB (bb)
17192884 1425 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
6de9cd9a
DN
1426 warn_uninitialized_phi (phi);
1427}
1428
1429static bool
1430gate_warn_uninitialized (void)
1431{
1432 return warn_uninitialized != 0;
1433}
1434
1435struct tree_opt_pass pass_early_warn_uninitialized =
1436{
1437 NULL, /* name */
1438 gate_warn_uninitialized, /* gate */
1439 execute_early_warn_uninitialized, /* execute */
1440 NULL, /* sub */
1441 NULL, /* next */
1442 0, /* static_pass_number */
1443 0, /* tv_id */
1444 PROP_ssa, /* properties_required */
1445 0, /* properties_provided */
1446 0, /* properties_destroyed */
1447 0, /* todo_flags_start */
9f8628ba
PB
1448 0, /* todo_flags_finish */
1449 0 /* letter */
6de9cd9a
DN
1450};
1451
1452struct tree_opt_pass pass_late_warn_uninitialized =
1453{
1454 NULL, /* name */
1455 gate_warn_uninitialized, /* gate */
1456 execute_late_warn_uninitialized, /* execute */
1457 NULL, /* sub */
1458 NULL, /* next */
1459 0, /* static_pass_number */
1460 0, /* tv_id */
1461 PROP_ssa, /* properties_required */
1462 0, /* properties_provided */
1463 0, /* properties_destroyed */
1464 0, /* todo_flags_start */
9f8628ba
PB
1465 0, /* todo_flags_finish */
1466 0 /* letter */
6de9cd9a 1467};
52328bf6 1468