OSDN Git Service

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