OSDN Git Service

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