OSDN Git Service

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