OSDN Git Service

2004-10-30 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
[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 || bitmap_empty_p (pi->pt_vars)))
474         {
475           error ("Pointers with a memory tag, should have points-to sets or point to malloc");
476           goto err;
477         }
478
479       if (pi->value_escapes_p
480           && pi->name_mem_tag
481           && !is_call_clobbered (pi->name_mem_tag))
482         {
483           error ("Pointer escapes but its name tag is not call-clobbered.");
484           goto err;
485         }
486     }
487
488   return;
489
490 err:
491   debug_variable (ptr);
492   internal_error ("verify_flow_sensitive_alias_info failed.");
493 }
494
495 DEF_VEC_MALLOC_P (bitmap);
496
497 /* Verify that all name tags have different points to sets.
498    This algorithm takes advantage of the fact that every variable with the
499    same name tag must have the same points-to set. 
500    So we check a single variable for each name tag, and verify that its
501    points-to set is different from every other points-to set for other name
502    tags.  */
503
504 static void
505 verify_name_tags (void)
506 {
507   size_t i;  
508   size_t j;
509   bitmap first, second;  
510   VEC (tree) *name_tag_reps = NULL;
511   VEC (bitmap) *pt_vars_for_reps = NULL;
512
513   /* First we compute the name tag representatives and their points-to sets.  */
514   for (i = 0; i < num_ssa_names; i++)
515     {
516       if (ssa_name (i))
517         {
518           tree ptr = ssa_name (i);
519           struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr);
520           if (!TREE_VISITED (ptr) 
521               || !POINTER_TYPE_P (TREE_TYPE (ptr)) 
522               || !pi
523               || !pi->name_mem_tag 
524               || TREE_VISITED (pi->name_mem_tag))
525             continue;
526           TREE_VISITED (pi->name_mem_tag) = 1;
527           if (pi->pt_vars != NULL)
528             {    
529               VEC_safe_push (tree, name_tag_reps, ptr);
530               VEC_safe_push (bitmap, pt_vars_for_reps, pi->pt_vars);
531             }
532         }
533     }
534   
535   /* Now compare all the representative bitmaps with all other representative
536      bitmaps, to verify that they are all different.  */
537   for (i = 0; VEC_iterate (bitmap, pt_vars_for_reps, i, first); i++)
538     {
539        for (j = i + 1; VEC_iterate (bitmap, pt_vars_for_reps, j, second); j++)
540          { 
541            if (bitmap_equal_p (first, second))
542              {
543                error ("Two different pointers with identical points-to sets but different name tags");
544                debug_variable (VEC_index (tree, name_tag_reps, j));
545                goto err;
546              }
547          }
548     }
549
550   /* Lastly, clear out the visited flags.  */
551   for (i = 0; i < num_ssa_names; i++)
552     {
553       if (ssa_name (i))
554         {
555           tree ptr = ssa_name (i);
556           struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr);
557           if (!TREE_VISITED (ptr) 
558               || !POINTER_TYPE_P (TREE_TYPE (ptr)) 
559               || !pi
560               || !pi->name_mem_tag)
561             continue;
562           TREE_VISITED (pi->name_mem_tag) = 0;
563         }
564     } 
565   VEC_free (bitmap, pt_vars_for_reps);
566   return;
567   
568 err:
569   debug_variable (VEC_index (tree, name_tag_reps, i));
570   internal_error ("verify_name_tags failed");
571 }
572 /* Verify the consistency of aliasing information.  */
573
574 static void
575 verify_alias_info (void)
576 {
577   verify_flow_sensitive_alias_info ();
578   verify_name_tags ();
579   verify_flow_insensitive_alias_info ();
580 }
581
582
583 /* Verify common invariants in the SSA web.
584    TODO: verify the variable annotations.  */
585
586 void
587 verify_ssa (void)
588 {
589   size_t i;
590   basic_block bb;
591   basic_block *definition_block = xcalloc (num_ssa_names, sizeof (basic_block));
592   ssa_op_iter iter;
593   tree op;
594   enum dom_state orig_dom_state = dom_computed[CDI_DOMINATORS];
595   bitmap names_defined_in_bb = BITMAP_XMALLOC ();
596
597   timevar_push (TV_TREE_SSA_VERIFY);
598
599   /* Keep track of SSA names present in the IL.  */
600   for (i = 1; i < num_ssa_names; i++)
601     if (ssa_name (i))
602       TREE_VISITED (ssa_name (i)) = 0;
603
604   calculate_dominance_info (CDI_DOMINATORS);
605
606   /* Verify and register all the SSA_NAME definitions found in the
607      function.  */
608   FOR_EACH_BB (bb)
609     {
610       tree phi;
611       block_stmt_iterator bsi;
612
613       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
614         {
615           int i;
616           if (verify_def (bb, definition_block, PHI_RESULT (phi), phi,
617                         !is_gimple_reg (PHI_RESULT (phi))))
618           goto err;
619           for (i = 0; i < PHI_NUM_ARGS (phi); i++)
620             {
621               tree def = PHI_ARG_DEF (phi, i);
622               if (TREE_CODE (def) != SSA_NAME && !is_gimple_min_invariant (def))
623                 {
624                   error ("PHI argument is not SSA_NAME, or invariant");
625                   print_generic_stmt (stderr, phi, TDF_VOPS);
626                   goto err;
627                 }
628             }
629         }
630
631       for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
632         {
633           tree stmt;
634
635           stmt = bsi_stmt (bsi);
636           get_stmt_operands (stmt);
637
638           if (stmt_ann (stmt)->makes_aliased_stores 
639               && NUM_V_MAY_DEFS (STMT_V_MAY_DEF_OPS (stmt)) == 0)
640             {
641               error ("Statement makes aliased stores, but has no V_MAY_DEFS");
642               print_generic_stmt (stderr, stmt, TDF_VOPS);
643               goto err;
644             }
645             
646           FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_VIRTUAL_DEFS)
647             {
648               if (verify_def (bb, definition_block, op, stmt, true))
649                 goto err;
650             }
651           
652           FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_DEF)
653             {
654               if (verify_def (bb, definition_block, op, stmt, false))
655                 goto err;
656             }
657         }
658     }
659
660
661   /* Now verify all the uses and make sure they agree with the definitions
662      found in the previous pass.  */
663   FOR_EACH_BB (bb)
664     {
665       edge e;
666       tree phi;
667       edge_iterator ei;
668       block_stmt_iterator bsi;
669
670       /* Make sure that all edges have a clear 'aux' field.  */
671       FOR_EACH_EDGE (e, ei, bb->preds)
672         {
673           if (e->aux)
674             {
675               error ("AUX pointer initialized for edge %d->%d\n", e->src->index,
676                       e->dest->index);
677               goto err;
678             }
679         }
680
681       /* Verify the arguments for every PHI node in the block.  */
682       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
683         {
684           if (verify_phi_args (phi, bb, definition_block))
685             goto err;
686           bitmap_set_bit (names_defined_in_bb,
687                           SSA_NAME_VERSION (PHI_RESULT (phi)));
688         }
689
690       /* Now verify all the uses and vuses in every statement of the block.  */
691       for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
692         {
693           tree stmt = bsi_stmt (bsi);
694
695           FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_VIRTUAL_USES | SSA_OP_VIRTUAL_KILLS)
696             {
697               if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
698                               op, stmt, false, true,
699                               names_defined_in_bb))
700                 goto err;
701             }
702
703           FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE)
704             {
705               if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
706                               op, stmt, false, false,
707                               names_defined_in_bb))
708                 goto err;
709             }
710
711           FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_ALL_DEFS)
712             {
713               bitmap_set_bit (names_defined_in_bb, SSA_NAME_VERSION (op));
714             }
715         }
716
717       /* Verify the uses in arguments of PHI nodes at the exits from the
718          block.  */
719       FOR_EACH_EDGE (e, ei, bb->succs)
720         {
721           for (phi = phi_nodes (e->dest); phi; phi = PHI_CHAIN (phi))
722             {
723               bool virtual = !is_gimple_reg (PHI_RESULT (phi));
724               op = PHI_ARG_DEF_FROM_EDGE (phi, e);
725               if (TREE_CODE (op) != SSA_NAME)
726                 continue;
727
728               if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
729                               op, phi, false, virtual,
730                               names_defined_in_bb))
731                 goto err;
732             }
733         }
734
735       bitmap_clear (names_defined_in_bb);
736     }
737
738   /* Finally, verify alias information.  */
739   verify_alias_info ();
740
741   free (definition_block);
742   /* Restore the dominance information to its prior known state, so
743      that we do not perturb the compiler's subsequent behavior.  */
744   if (orig_dom_state == DOM_NONE)
745     free_dominance_info (CDI_DOMINATORS);
746   else
747     dom_computed[CDI_DOMINATORS] = orig_dom_state;
748   
749   BITMAP_XFREE (names_defined_in_bb);
750   timevar_pop (TV_TREE_SSA_VERIFY);
751   return;
752
753 err:
754   internal_error ("verify_ssa failed.");
755 }
756
757
758 /* Initialize global DFA and SSA structures.  */
759
760 void
761 init_tree_ssa (void)
762 {
763   VARRAY_TREE_INIT (referenced_vars, 20, "referenced_vars");
764   call_clobbered_vars = BITMAP_XMALLOC ();
765   addressable_vars = BITMAP_XMALLOC ();
766   init_ssa_operands ();
767   init_ssanames ();
768   init_phinodes ();
769   global_var = NULL_TREE;
770 }
771
772
773 /* Deallocate memory associated with SSA data structures for FNDECL.  */
774
775 void
776 delete_tree_ssa (void)
777 {
778   size_t i;
779   basic_block bb;
780   block_stmt_iterator bsi;
781
782   /* Remove annotations from every tree in the function.  */
783   FOR_EACH_BB (bb)
784     for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
785       {
786         tree stmt = bsi_stmt (bsi);
787         release_defs (stmt);
788         ggc_free (stmt->common.ann);
789         stmt->common.ann = NULL;
790       }
791
792   /* Remove annotations from every referenced variable.  */
793   if (referenced_vars)
794     {
795       for (i = 0; i < num_referenced_vars; i++)
796         {
797           tree var = referenced_var (i);
798           ggc_free (var->common.ann);
799           var->common.ann = NULL;
800         }
801       referenced_vars = NULL;
802     }
803
804   fini_ssanames ();
805   fini_phinodes ();
806   fini_ssa_operands ();
807
808   global_var = NULL_TREE;
809   BITMAP_XFREE (call_clobbered_vars);
810   call_clobbered_vars = NULL;
811   BITMAP_XFREE (addressable_vars);
812   addressable_vars = NULL;
813 }
814
815
816 /* Return true if EXPR is a useless type conversion, otherwise return
817    false.  */
818
819 bool
820 tree_ssa_useless_type_conversion_1 (tree outer_type, tree inner_type)
821 {
822   /* If the inner and outer types are effectively the same, then
823      strip the type conversion and enter the equivalence into
824      the table.  */
825   if (inner_type == outer_type
826      || (lang_hooks.types_compatible_p (inner_type, outer_type)))
827     return true;
828
829   /* If both types are pointers and the outer type is a (void *), then
830      the conversion is not necessary.  The opposite is not true since
831      that conversion would result in a loss of information if the
832      equivalence was used.  Consider an indirect function call where
833      we need to know the exact type of the function to correctly
834      implement the ABI.  */
835   else if (POINTER_TYPE_P (inner_type)
836            && POINTER_TYPE_P (outer_type)
837            && TREE_CODE (TREE_TYPE (outer_type)) == VOID_TYPE)
838     return true;
839
840   /* Pointers and references are equivalent once we get to GENERIC,
841      so strip conversions that just switch between them.  */
842   else if (POINTER_TYPE_P (inner_type)
843            && POINTER_TYPE_P (outer_type)
844            && lang_hooks.types_compatible_p (TREE_TYPE (inner_type),
845                                              TREE_TYPE (outer_type)))
846     return true;
847
848   /* If both the inner and outer types are integral types, then the
849      conversion is not necessary if they have the same mode and
850      signedness and precision, and both or neither are boolean.  Some
851      code assumes an invariant that boolean types stay boolean and do
852      not become 1-bit bit-field types.  Note that types with precision
853      not using all bits of the mode (such as bit-field types in C)
854      mean that testing of precision is necessary.  */
855   else if (INTEGRAL_TYPE_P (inner_type)
856            && INTEGRAL_TYPE_P (outer_type)
857            && TYPE_MODE (inner_type) == TYPE_MODE (outer_type)
858            && TYPE_UNSIGNED (inner_type) == TYPE_UNSIGNED (outer_type)
859            && TYPE_PRECISION (inner_type) == TYPE_PRECISION (outer_type))
860     {
861       bool first_boolean = (TREE_CODE (inner_type) == BOOLEAN_TYPE);
862       bool second_boolean = (TREE_CODE (outer_type) == BOOLEAN_TYPE);
863       if (first_boolean == second_boolean)
864         return true;
865     }
866
867   /* Recurse for complex types.  */
868   else if (TREE_CODE (inner_type) == COMPLEX_TYPE
869            && TREE_CODE (outer_type) == COMPLEX_TYPE
870            && tree_ssa_useless_type_conversion_1 (TREE_TYPE (outer_type),
871                                                   TREE_TYPE (inner_type)))
872     return true;
873
874   return false;
875 }
876
877 /* Return true if EXPR is a useless type conversion, otherwise return
878    false.  */
879
880 bool
881 tree_ssa_useless_type_conversion (tree expr)
882 {
883   /* If we have an assignment that merely uses a NOP_EXPR to change
884      the top of the RHS to the type of the LHS and the type conversion
885      is "safe", then strip away the type conversion so that we can
886      enter LHS = RHS into the const_and_copies table.  */
887   if (TREE_CODE (expr) == NOP_EXPR || TREE_CODE (expr) == CONVERT_EXPR
888       || TREE_CODE (expr) == VIEW_CONVERT_EXPR
889       || TREE_CODE (expr) == NON_LVALUE_EXPR)
890     return tree_ssa_useless_type_conversion_1 (TREE_TYPE (expr),
891                                                TREE_TYPE (TREE_OPERAND (expr,
892                                                                         0)));
893
894
895   return false;
896 }
897
898
899 /* Internal helper for walk_use_def_chains.  VAR, FN and DATA are as
900    described in walk_use_def_chains.
901    
902    VISITED is a bitmap used to mark visited SSA_NAMEs to avoid
903       infinite loops.
904
905    IS_DFS is true if the caller wants to perform a depth-first search
906       when visiting PHI nodes.  A DFS will visit each PHI argument and
907       call FN after each one.  Otherwise, all the arguments are
908       visited first and then FN is called with each of the visited
909       arguments in a separate pass.  */
910
911 static bool
912 walk_use_def_chains_1 (tree var, walk_use_def_chains_fn fn, void *data,
913                        bitmap visited, bool is_dfs)
914 {
915   tree def_stmt;
916
917   if (bitmap_bit_p (visited, SSA_NAME_VERSION (var)))
918     return false;
919
920   bitmap_set_bit (visited, SSA_NAME_VERSION (var));
921
922   def_stmt = SSA_NAME_DEF_STMT (var);
923
924   if (TREE_CODE (def_stmt) != PHI_NODE)
925     {
926       /* If we reached the end of the use-def chain, call FN.  */
927       return fn (var, def_stmt, data);
928     }
929   else
930     {
931       int i;
932
933       /* When doing a breadth-first search, call FN before following the
934          use-def links for each argument.  */
935       if (!is_dfs)
936         for (i = 0; i < PHI_NUM_ARGS (def_stmt); i++)
937           if (fn (PHI_ARG_DEF (def_stmt, i), def_stmt, data))
938             return true;
939
940       /* Follow use-def links out of each PHI argument.  */
941       for (i = 0; i < PHI_NUM_ARGS (def_stmt); i++)
942         {
943           tree arg = PHI_ARG_DEF (def_stmt, i);
944           if (TREE_CODE (arg) == SSA_NAME
945               && walk_use_def_chains_1 (arg, fn, data, visited, is_dfs))
946             return true;
947         }
948
949       /* When doing a depth-first search, call FN after following the
950          use-def links for each argument.  */
951       if (is_dfs)
952         for (i = 0; i < PHI_NUM_ARGS (def_stmt); i++)
953           if (fn (PHI_ARG_DEF (def_stmt, i), def_stmt, data))
954             return true;
955     }
956   
957   return false;
958 }
959   
960
961
962 /* Walk use-def chains starting at the SSA variable VAR.  Call
963    function FN at each reaching definition found.  FN takes three
964    arguments: VAR, its defining statement (DEF_STMT) and a generic
965    pointer to whatever state information that FN may want to maintain
966    (DATA).  FN is able to stop the walk by returning true, otherwise
967    in order to continue the walk, FN should return false.  
968
969    Note, that if DEF_STMT is a PHI node, the semantics are slightly
970    different.  The first argument to FN is no longer the original
971    variable VAR, but the PHI argument currently being examined.  If FN
972    wants to get at VAR, it should call PHI_RESULT (PHI).
973
974    If IS_DFS is true, this function will:
975
976         1- walk the use-def chains for all the PHI arguments, and,
977         2- call (*FN) (ARG, PHI, DATA) on all the PHI arguments.
978
979    If IS_DFS is false, the two steps above are done in reverse order
980    (i.e., a breadth-first search).  */
981
982
983 void
984 walk_use_def_chains (tree var, walk_use_def_chains_fn fn, void *data,
985                      bool is_dfs)
986 {
987   tree def_stmt;
988
989   gcc_assert (TREE_CODE (var) == SSA_NAME);
990
991   def_stmt = SSA_NAME_DEF_STMT (var);
992
993   /* We only need to recurse if the reaching definition comes from a PHI
994      node.  */
995   if (TREE_CODE (def_stmt) != PHI_NODE)
996     (*fn) (var, def_stmt, data);
997   else
998     {
999       bitmap visited = BITMAP_XMALLOC ();
1000       walk_use_def_chains_1 (var, fn, data, visited, is_dfs);
1001       BITMAP_XFREE (visited);
1002     }
1003 }
1004
1005
1006 /* Replaces VAR with REPL in memory reference expression *X in
1007    statement STMT.  */
1008
1009 static void
1010 propagate_into_addr (tree stmt, tree var, tree *x, tree repl)
1011 {
1012   tree new_var, ass_stmt, addr_var;
1013   basic_block bb;
1014   block_stmt_iterator bsi;
1015
1016   /* There is nothing special to handle in the other cases.  */
1017   if (TREE_CODE (repl) != ADDR_EXPR)
1018     return;
1019   addr_var = TREE_OPERAND (repl, 0);
1020
1021   while (handled_component_p (*x)
1022          || TREE_CODE (*x) == REALPART_EXPR
1023          || TREE_CODE (*x) == IMAGPART_EXPR)
1024     x = &TREE_OPERAND (*x, 0);
1025
1026   if (TREE_CODE (*x) != INDIRECT_REF
1027       || TREE_OPERAND (*x, 0) != var)
1028     return;
1029
1030   if (TREE_TYPE (*x) == TREE_TYPE (addr_var))
1031     {
1032       *x = addr_var;
1033       mark_new_vars_to_rename (stmt, vars_to_rename);
1034       return;
1035     }
1036
1037
1038   /* Frontends sometimes produce expressions like *&a instead of a[0].
1039      Create a temporary variable to handle this case.  */
1040   ass_stmt = build2 (MODIFY_EXPR, void_type_node, NULL_TREE, repl);
1041   new_var = duplicate_ssa_name (var, ass_stmt);
1042   TREE_OPERAND (*x, 0) = new_var;
1043   TREE_OPERAND (ass_stmt, 0) = new_var;
1044
1045   bb = bb_for_stmt (stmt);
1046   tree_block_label (bb);
1047   bsi = bsi_after_labels (bb);
1048   bsi_insert_after (&bsi, ass_stmt, BSI_NEW_STMT);
1049
1050   mark_new_vars_to_rename (stmt, vars_to_rename);
1051 }
1052
1053 /* Replaces immediate uses of VAR by REPL.  */
1054
1055 static void
1056 replace_immediate_uses (tree var, tree repl)
1057 {
1058   int i, j, n;
1059   dataflow_t df;
1060   tree stmt;
1061   bool mark_new_vars;
1062   ssa_op_iter iter;
1063   use_operand_p use_p;
1064
1065   df = get_immediate_uses (SSA_NAME_DEF_STMT (var));
1066   n = num_immediate_uses (df);
1067
1068   for (i = 0; i < n; i++)
1069     {
1070       stmt = immediate_use (df, i);
1071
1072       if (TREE_CODE (stmt) == PHI_NODE)
1073         {
1074           for (j = 0; j < PHI_NUM_ARGS (stmt); j++)
1075             if (PHI_ARG_DEF (stmt, j) == var)
1076               {
1077                 SET_PHI_ARG_DEF (stmt, j, repl);
1078                 if (TREE_CODE (repl) == SSA_NAME
1079                     && PHI_ARG_EDGE (stmt, j)->flags & EDGE_ABNORMAL)
1080                   SSA_NAME_OCCURS_IN_ABNORMAL_PHI (repl) = 1;
1081               }
1082
1083           continue;
1084         }
1085
1086       get_stmt_operands (stmt);
1087       mark_new_vars = false;
1088       if (is_gimple_reg (SSA_NAME_VAR (var)))
1089         {
1090           if (TREE_CODE (stmt) == MODIFY_EXPR)
1091             {
1092               propagate_into_addr (stmt, var, &TREE_OPERAND (stmt, 0), repl);
1093               propagate_into_addr (stmt, var, &TREE_OPERAND (stmt, 1), repl);
1094             }
1095
1096           FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE)
1097             if (USE_FROM_PTR (use_p) == var)
1098               {
1099                 propagate_value (use_p, repl);
1100                 mark_new_vars = POINTER_TYPE_P (TREE_TYPE (repl));
1101               }
1102         }
1103       else
1104         {
1105           FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, 
1106                                     SSA_OP_VIRTUAL_USES | SSA_OP_VIRTUAL_KILLS)
1107             if (USE_FROM_PTR (use_p) == var)
1108               propagate_value (use_p, repl);
1109         }
1110
1111       /* FIXME.  If REPL is a constant, we need to fold STMT.
1112          However, fold_stmt wants a pointer to the statement, because
1113          it may happen that it needs to replace the whole statement
1114          with a new expression.  Since the current def-use machinery
1115          does not return pointers to statements, we call fold_stmt
1116          with the address of a local temporary, if that call changes
1117          the temporary then we fallback on looking for a proper
1118          pointer to STMT by scanning STMT's basic block.
1119
1120          Note that all this will become unnecessary soon.  This
1121          pass is being replaced with a proper copy propagation pass
1122          for 4.1 (dnovillo, 2004-09-17).  */
1123       if (TREE_CODE (repl) != SSA_NAME)
1124         {
1125           tree tmp = stmt;
1126           fold_stmt (&tmp);
1127           if (tmp != stmt)
1128             {
1129               block_stmt_iterator si = bsi_for_stmt (stmt);
1130               bsi_replace (&si, tmp, true);
1131               stmt = bsi_stmt (si);
1132             }
1133         }
1134
1135       /* If REPL is a pointer, it may have different memory tags associated
1136          with it.  For instance, VAR may have had a name tag while REPL
1137          only had a type tag.  In these cases, the virtual operands (if
1138          any) in the statement will refer to different symbols which need
1139          to be renamed.  */
1140       if (mark_new_vars)
1141         mark_new_vars_to_rename (stmt, vars_to_rename);
1142       else
1143         modify_stmt (stmt);
1144     }
1145 }
1146
1147 /* Gets the value VAR is equivalent to according to EQ_TO.  */
1148
1149 static tree
1150 get_eq_name (tree *eq_to, tree var)
1151 {
1152   unsigned ver;
1153   tree val = var;
1154
1155   while (TREE_CODE (val) == SSA_NAME)
1156     {
1157       ver = SSA_NAME_VERSION (val);
1158       if (!eq_to[ver])
1159         break;
1160
1161       val = eq_to[ver];
1162     }
1163
1164   while (TREE_CODE (var) == SSA_NAME)
1165     {
1166       ver = SSA_NAME_VERSION (var);
1167       if (!eq_to[ver])
1168         break;
1169
1170       var = eq_to[ver];
1171       eq_to[ver] = val;
1172     }
1173
1174   return val;
1175 }
1176
1177 /* Checks whether phi node PHI is redundant and if it is, records the ssa name
1178    its result is redundant to to EQ_TO array.  */
1179
1180 static void
1181 check_phi_redundancy (tree phi, tree *eq_to)
1182 {
1183   tree val = NULL_TREE, def, res = PHI_RESULT (phi), stmt;
1184   unsigned i, ver = SSA_NAME_VERSION (res), n;
1185   dataflow_t df;
1186
1187   /* It is unlikely that such large phi node would be redundant.  */
1188   if (PHI_NUM_ARGS (phi) > 16)
1189     return;
1190
1191   for (i = 0; i < (unsigned) PHI_NUM_ARGS (phi); i++)
1192     {
1193       def = PHI_ARG_DEF (phi, i);
1194
1195       if (TREE_CODE (def) == SSA_NAME)
1196         {
1197           def = get_eq_name (eq_to, def);
1198           if (def == res)
1199             continue;
1200         }
1201
1202       if (val
1203           && !operand_equal_p (val, def, 0))
1204         return;
1205
1206       val = def;
1207     }
1208
1209   /* At least one of the arguments should not be equal to the result, or
1210      something strange is happening.  */
1211   gcc_assert (val);
1212
1213   if (get_eq_name (eq_to, res) == val)
1214     return;
1215
1216   if (!may_propagate_copy (res, val))
1217     return;
1218
1219   eq_to[ver] = val;
1220
1221   df = get_immediate_uses (SSA_NAME_DEF_STMT (res));
1222   n = num_immediate_uses (df);
1223
1224   for (i = 0; i < n; i++)
1225     {
1226       stmt = immediate_use (df, i);
1227
1228       if (TREE_CODE (stmt) == PHI_NODE)
1229         check_phi_redundancy (stmt, eq_to);
1230     }
1231 }
1232
1233 /* Removes redundant phi nodes.
1234
1235    A redundant PHI node is a PHI node where all of its PHI arguments
1236    are the same value, excluding any PHI arguments which are the same
1237    as the PHI result.
1238
1239    A redundant PHI node is effectively a copy, so we forward copy propagate
1240    which removes all uses of the destination of the PHI node then
1241    finally we delete the redundant PHI node.
1242
1243    Note that if we can not copy propagate the PHI node, then the PHI
1244    will not be removed.  Thus we do not have to worry about dependencies
1245    between PHIs and the problems serializing PHIs into copies creates. 
1246    
1247    The most important effect of this pass is to remove degenerate PHI
1248    nodes created by removing unreachable code.  */
1249
1250 void
1251 kill_redundant_phi_nodes (void)
1252 {
1253   tree *eq_to;
1254   unsigned i, old_num_ssa_names;
1255   basic_block bb;
1256   tree phi, var, repl, stmt;
1257
1258   /* The EQ_TO[VER] holds the value by that the ssa name VER should be
1259      replaced.  If EQ_TO[VER] is ssa name and it is decided to replace it by
1260      other value, it may be necessary to follow the chain till the final value.
1261      We perform path shortening (replacing the entries of the EQ_TO array with
1262      heads of these chains) whenever we access the field to prevent quadratic
1263      complexity (probably would not occur in practice anyway, but let us play
1264      it safe).  */
1265   eq_to = xcalloc (num_ssa_names, sizeof (tree));
1266
1267   /* We have had cases where computing immediate uses takes a
1268      significant amount of compile time.  If we run into such
1269      problems here, we may want to only compute immediate uses for
1270      a subset of all the SSA_NAMEs instead of computing it for
1271      all of the SSA_NAMEs.  */
1272   compute_immediate_uses (TDFA_USE_OPS | TDFA_USE_VOPS, NULL);
1273   old_num_ssa_names = num_ssa_names;
1274
1275   FOR_EACH_BB (bb)
1276     {
1277       for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
1278         {
1279           var = PHI_RESULT (phi);
1280           check_phi_redundancy (phi, eq_to);
1281         }
1282     }
1283
1284   /* Now propagate the values.  */
1285   for (i = 0; i < old_num_ssa_names; i++)
1286     {
1287       if (!ssa_name (i))
1288         continue;
1289
1290       repl = get_eq_name (eq_to, ssa_name (i));
1291       if (repl != ssa_name (i))
1292         replace_immediate_uses (ssa_name (i), repl);
1293     }
1294
1295   /* And remove the dead phis.  */
1296   for (i = 0; i < old_num_ssa_names; i++)
1297     {
1298       if (!ssa_name (i))
1299         continue;
1300
1301       repl = get_eq_name (eq_to, ssa_name (i));
1302       if (repl != ssa_name (i))
1303         {
1304           stmt = SSA_NAME_DEF_STMT (ssa_name (i));
1305           remove_phi_node (stmt, NULL_TREE, bb_for_stmt (stmt));
1306         }
1307     }
1308
1309   free_df ();
1310   free (eq_to);
1311 }
1312
1313 struct tree_opt_pass pass_redundant_phi =
1314 {
1315   "redphi",                             /* name */
1316   NULL,                                 /* gate */
1317   kill_redundant_phi_nodes,             /* execute */
1318   NULL,                                 /* sub */
1319   NULL,                                 /* next */
1320   0,                                    /* static_pass_number */
1321   0,                                    /* tv_id */
1322   PROP_cfg | PROP_ssa | PROP_alias,     /* properties_required */
1323   0,                                    /* properties_provided */
1324   0,                                    /* properties_destroyed */
1325   0,                                    /* todo_flags_start */
1326   TODO_dump_func | TODO_rename_vars 
1327     | TODO_ggc_collect | TODO_verify_ssa, /* todo_flags_finish */
1328   0                                     /* letter */
1329 };
1330 \f
1331 /* Emit warnings for uninitialized variables.  This is done in two passes.
1332
1333    The first pass notices real uses of SSA names with default definitions.
1334    Such uses are unconditionally uninitialized, and we can be certain that
1335    such a use is a mistake.  This pass is run before most optimizations,
1336    so that we catch as many as we can.
1337
1338    The second pass follows PHI nodes to find uses that are potentially
1339    uninitialized.  In this case we can't necessarily prove that the use
1340    is really uninitialized.  This pass is run after most optimizations,
1341    so that we thread as many jumps and possible, and delete as much dead
1342    code as possible, in order to reduce false positives.  We also look
1343    again for plain uninitialized variables, since optimization may have
1344    changed conditionally uninitialized to unconditionally uninitialized.  */
1345
1346 /* Emit a warning for T, an SSA_NAME, being uninitialized.  The exact
1347    warning text is in MSGID and LOCUS may contain a location or be null.  */
1348
1349 static void
1350 warn_uninit (tree t, const char *msgid, location_t *locus)
1351 {
1352   tree var = SSA_NAME_VAR (t);
1353   tree def = SSA_NAME_DEF_STMT (t);
1354
1355   /* Default uses (indicated by an empty definition statement),
1356      are uninitialized.  */
1357   if (!IS_EMPTY_STMT (def))
1358     return;
1359
1360   /* Except for PARMs of course, which are always initialized.  */
1361   if (TREE_CODE (var) == PARM_DECL)
1362     return;
1363
1364   /* Hard register variables get their initial value from the ether.  */
1365   if (TREE_CODE (var) == VAR_DECL && DECL_HARD_REGISTER (var))
1366     return;
1367
1368   /* TREE_NO_WARNING either means we already warned, or the front end
1369      wishes to suppress the warning.  */
1370   if (TREE_NO_WARNING (var))
1371     return;
1372
1373   if (!locus)
1374     locus = &DECL_SOURCE_LOCATION (var);
1375   warning (msgid, locus, var);
1376   TREE_NO_WARNING (var) = 1;
1377 }
1378    
1379 /* Called via walk_tree, look for SSA_NAMEs that have empty definitions
1380    and warn about them.  */
1381
1382 static tree
1383 warn_uninitialized_var (tree *tp, int *walk_subtrees, void *data)
1384 {
1385   location_t *locus = data;
1386   tree t = *tp;
1387
1388   /* We only do data flow with SSA_NAMEs, so that's all we can warn about.  */
1389   if (TREE_CODE (t) == SSA_NAME)
1390     {
1391       warn_uninit (t, "%H'%D' is used uninitialized in this function", locus);
1392       *walk_subtrees = 0;
1393     }
1394   else if (IS_TYPE_OR_DECL_P (t))
1395     *walk_subtrees = 0;
1396
1397   return NULL_TREE;
1398 }
1399
1400 /* Look for inputs to PHI that are SSA_NAMEs that have empty definitions
1401    and warn about them.  */
1402
1403 static void
1404 warn_uninitialized_phi (tree phi)
1405 {
1406   int i, n = PHI_NUM_ARGS (phi);
1407
1408   /* Don't look at memory tags.  */
1409   if (!is_gimple_reg (PHI_RESULT (phi)))
1410     return;
1411
1412   for (i = 0; i < n; ++i)
1413     {
1414       tree op = PHI_ARG_DEF (phi, i);
1415       if (TREE_CODE (op) == SSA_NAME)
1416         warn_uninit (op, "%H'%D' may be used uninitialized in this function",
1417                      NULL);
1418     }
1419 }
1420
1421 static void
1422 execute_early_warn_uninitialized (void)
1423 {
1424   block_stmt_iterator bsi;
1425   basic_block bb;
1426
1427   FOR_EACH_BB (bb)
1428     for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
1429       walk_tree (bsi_stmt_ptr (bsi), warn_uninitialized_var,
1430                  EXPR_LOCUS (bsi_stmt (bsi)), NULL);
1431 }
1432
1433 static void
1434 execute_late_warn_uninitialized (void)
1435 {
1436   basic_block bb;
1437   tree phi;
1438
1439   /* Re-do the plain uninitialized variable check, as optimization may have
1440      straightened control flow.  Do this first so that we don't accidentally
1441      get a "may be" warning when we'd have seen an "is" warning later.  */
1442   execute_early_warn_uninitialized ();
1443
1444   FOR_EACH_BB (bb)
1445     for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
1446       warn_uninitialized_phi (phi);
1447 }
1448
1449 static bool
1450 gate_warn_uninitialized (void)
1451 {
1452   return warn_uninitialized != 0;
1453 }
1454
1455 struct tree_opt_pass pass_early_warn_uninitialized =
1456 {
1457   NULL,                                 /* name */
1458   gate_warn_uninitialized,              /* gate */
1459   execute_early_warn_uninitialized,     /* execute */
1460   NULL,                                 /* sub */
1461   NULL,                                 /* next */
1462   0,                                    /* static_pass_number */
1463   0,                                    /* tv_id */
1464   PROP_ssa,                             /* properties_required */
1465   0,                                    /* properties_provided */
1466   0,                                    /* properties_destroyed */
1467   0,                                    /* todo_flags_start */
1468   0,                                    /* todo_flags_finish */
1469   0                                     /* letter */
1470 };
1471
1472 struct tree_opt_pass pass_late_warn_uninitialized =
1473 {
1474   NULL,                                 /* name */
1475   gate_warn_uninitialized,              /* gate */
1476   execute_late_warn_uninitialized,      /* execute */
1477   NULL,                                 /* sub */
1478   NULL,                                 /* next */
1479   0,                                    /* static_pass_number */
1480   0,                                    /* tv_id */
1481   PROP_ssa,                             /* properties_required */
1482   0,                                    /* properties_provided */
1483   0,                                    /* properties_destroyed */
1484   0,                                    /* todo_flags_start */
1485   0,                                    /* todo_flags_finish */
1486   0                                     /* letter */
1487 };
1488