Merge from vendor branch BZIP:
[dragonfly.git] / contrib / gcc-4.0 / 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 (inner_type == outer_type)
782     return true;
783
784   /* Changes in machine mode are never useless conversions.  */
785   if (TYPE_MODE (inner_type) != TYPE_MODE (outer_type))
786     return false;
787
788   /* If the inner and outer types are effectively the same, then
789      strip the type conversion and enter the equivalence into
790      the table.  */
791   if (lang_hooks.types_compatible_p (inner_type, outer_type))
792     return true;
793
794   /* If both types are pointers and the outer type is a (void *), then
795      the conversion is not necessary.  The opposite is not true since
796      that conversion would result in a loss of information if the
797      equivalence was used.  Consider an indirect function call where
798      we need to know the exact type of the function to correctly
799      implement the ABI.  */
800   else if (POINTER_TYPE_P (inner_type)
801            && POINTER_TYPE_P (outer_type)
802            && TYPE_REF_CAN_ALIAS_ALL (inner_type)
803               == TYPE_REF_CAN_ALIAS_ALL (outer_type)
804            && TREE_CODE (TREE_TYPE (outer_type)) == VOID_TYPE)
805     return true;
806
807   /* Pointers and references are equivalent once we get to GENERIC,
808      so strip conversions that just switch between them.  */
809   else if (POINTER_TYPE_P (inner_type)
810            && POINTER_TYPE_P (outer_type)
811            && TYPE_REF_CAN_ALIAS_ALL (inner_type)
812               == TYPE_REF_CAN_ALIAS_ALL (outer_type)
813            && lang_hooks.types_compatible_p (TREE_TYPE (inner_type),
814                                              TREE_TYPE (outer_type)))
815     return true;
816
817   /* If both the inner and outer types are integral types, then the
818      conversion is not necessary if they have the same mode and
819      signedness and precision, and both or neither are boolean.  Some
820      code assumes an invariant that boolean types stay boolean and do
821      not become 1-bit bit-field types.  Note that types with precision
822      not using all bits of the mode (such as bit-field types in C)
823      mean that testing of precision is necessary.  */
824   else if (INTEGRAL_TYPE_P (inner_type)
825            && INTEGRAL_TYPE_P (outer_type)
826            && TYPE_UNSIGNED (inner_type) == TYPE_UNSIGNED (outer_type)
827            && TYPE_PRECISION (inner_type) == TYPE_PRECISION (outer_type))
828     {
829       bool first_boolean = (TREE_CODE (inner_type) == BOOLEAN_TYPE);
830       bool second_boolean = (TREE_CODE (outer_type) == BOOLEAN_TYPE);
831       if (first_boolean == second_boolean)
832         return true;
833     }
834
835   /* Recurse for complex types.  */
836   else if (TREE_CODE (inner_type) == COMPLEX_TYPE
837            && TREE_CODE (outer_type) == COMPLEX_TYPE
838            && tree_ssa_useless_type_conversion_1 (TREE_TYPE (outer_type),
839                                                   TREE_TYPE (inner_type)))
840     return true;
841
842   return false;
843 }
844
845 /* Return true if EXPR is a useless type conversion, otherwise return
846    false.  */
847
848 bool
849 tree_ssa_useless_type_conversion (tree expr)
850 {
851   /* If we have an assignment that merely uses a NOP_EXPR to change
852      the top of the RHS to the type of the LHS and the type conversion
853      is "safe", then strip away the type conversion so that we can
854      enter LHS = RHS into the const_and_copies table.  */
855   if (TREE_CODE (expr) == NOP_EXPR || TREE_CODE (expr) == CONVERT_EXPR
856       || TREE_CODE (expr) == VIEW_CONVERT_EXPR
857       || TREE_CODE (expr) == NON_LVALUE_EXPR)
858     return tree_ssa_useless_type_conversion_1 (TREE_TYPE (expr),
859                                                TREE_TYPE (TREE_OPERAND (expr,
860                                                                         0)));
861
862
863   return false;
864 }
865
866 /* Returns true if statement STMT may read memory.  */
867
868 bool
869 stmt_references_memory_p (tree stmt)
870 {
871   stmt_ann_t ann;
872
873   get_stmt_operands (stmt);
874   ann = stmt_ann (stmt);
875
876   if (ann->has_volatile_ops)
877     return true;
878
879   return (NUM_VUSES (VUSE_OPS (ann)) > 0
880           || NUM_V_MAY_DEFS (V_MAY_DEF_OPS (ann)) > 0
881           || NUM_V_MUST_DEFS (V_MUST_DEF_OPS (ann)) > 0);
882 }
883
884 /* Internal helper for walk_use_def_chains.  VAR, FN and DATA are as
885    described in walk_use_def_chains.
886    
887    VISITED is a pointer set used to mark visited SSA_NAMEs to avoid
888       infinite loops.  We used to have a bitmap for this to just mark
889       SSA versions we had visited.  But non-sparse bitmaps are way too
890       expensive, while sparse bitmaps may cause quadratic behavior.
891
892    IS_DFS is true if the caller wants to perform a depth-first search
893       when visiting PHI nodes.  A DFS will visit each PHI argument and
894       call FN after each one.  Otherwise, all the arguments are
895       visited first and then FN is called with each of the visited
896       arguments in a separate pass.  */
897
898 static bool
899 walk_use_def_chains_1 (tree var, walk_use_def_chains_fn fn, void *data,
900                        struct pointer_set_t *visited, bool is_dfs)
901 {
902   tree def_stmt;
903
904   if (pointer_set_insert (visited, var))
905     return false;
906
907   def_stmt = SSA_NAME_DEF_STMT (var);
908
909   if (TREE_CODE (def_stmt) != PHI_NODE)
910     {
911       /* If we reached the end of the use-def chain, call FN.  */
912       return fn (var, def_stmt, data);
913     }
914   else
915     {
916       int i;
917
918       /* When doing a breadth-first search, call FN before following the
919          use-def links for each argument.  */
920       if (!is_dfs)
921         for (i = 0; i < PHI_NUM_ARGS (def_stmt); i++)
922           if (fn (PHI_ARG_DEF (def_stmt, i), def_stmt, data))
923             return true;
924
925       /* Follow use-def links out of each PHI argument.  */
926       for (i = 0; i < PHI_NUM_ARGS (def_stmt); i++)
927         {
928           tree arg = PHI_ARG_DEF (def_stmt, i);
929           if (TREE_CODE (arg) == SSA_NAME
930               && walk_use_def_chains_1 (arg, fn, data, visited, is_dfs))
931             return true;
932         }
933
934       /* When doing a depth-first search, call FN after following the
935          use-def links for each argument.  */
936       if (is_dfs)
937         for (i = 0; i < PHI_NUM_ARGS (def_stmt); i++)
938           if (fn (PHI_ARG_DEF (def_stmt, i), def_stmt, data))
939             return true;
940     }
941   
942   return false;
943 }
944   
945
946
947 /* Walk use-def chains starting at the SSA variable VAR.  Call
948    function FN at each reaching definition found.  FN takes three
949    arguments: VAR, its defining statement (DEF_STMT) and a generic
950    pointer to whatever state information that FN may want to maintain
951    (DATA).  FN is able to stop the walk by returning true, otherwise
952    in order to continue the walk, FN should return false.  
953
954    Note, that if DEF_STMT is a PHI node, the semantics are slightly
955    different.  The first argument to FN is no longer the original
956    variable VAR, but the PHI argument currently being examined.  If FN
957    wants to get at VAR, it should call PHI_RESULT (PHI).
958
959    If IS_DFS is true, this function will:
960
961         1- walk the use-def chains for all the PHI arguments, and,
962         2- call (*FN) (ARG, PHI, DATA) on all the PHI arguments.
963
964    If IS_DFS is false, the two steps above are done in reverse order
965    (i.e., a breadth-first search).  */
966
967
968 void
969 walk_use_def_chains (tree var, walk_use_def_chains_fn fn, void *data,
970                      bool is_dfs)
971 {
972   tree def_stmt;
973
974   gcc_assert (TREE_CODE (var) == SSA_NAME);
975
976   def_stmt = SSA_NAME_DEF_STMT (var);
977
978   /* We only need to recurse if the reaching definition comes from a PHI
979      node.  */
980   if (TREE_CODE (def_stmt) != PHI_NODE)
981     (*fn) (var, def_stmt, data);
982   else
983     {
984       struct pointer_set_t *visited = pointer_set_create ();
985       walk_use_def_chains_1 (var, fn, data, visited, is_dfs);
986       pointer_set_destroy (visited);
987     }
988 }
989
990
991 /* Replaces VAR with REPL in memory reference expression *X in
992    statement STMT.  */
993
994 static void
995 propagate_into_addr (tree stmt, tree var, tree *x, tree repl)
996 {
997   tree new_var, ass_stmt, addr_var;
998   basic_block bb;
999   block_stmt_iterator bsi;
1000
1001   /* There is nothing special to handle in the other cases.  */
1002   if (TREE_CODE (repl) != ADDR_EXPR)
1003     return;
1004   addr_var = TREE_OPERAND (repl, 0);
1005
1006   while (handled_component_p (*x)
1007          || TREE_CODE (*x) == REALPART_EXPR
1008          || TREE_CODE (*x) == IMAGPART_EXPR)
1009     x = &TREE_OPERAND (*x, 0);
1010
1011   if (TREE_CODE (*x) != INDIRECT_REF
1012       || TREE_OPERAND (*x, 0) != var)
1013     return;
1014
1015   if (TREE_TYPE (*x) == TREE_TYPE (addr_var))
1016     {
1017       *x = addr_var;
1018       mark_new_vars_to_rename (stmt, vars_to_rename);
1019       return;
1020     }
1021
1022
1023   /* Frontends sometimes produce expressions like *&a instead of a[0].
1024      Create a temporary variable to handle this case.  */
1025   ass_stmt = build2 (MODIFY_EXPR, void_type_node, NULL_TREE, repl);
1026   new_var = duplicate_ssa_name (var, ass_stmt);
1027   TREE_OPERAND (*x, 0) = new_var;
1028   TREE_OPERAND (ass_stmt, 0) = new_var;
1029
1030   bb = bb_for_stmt (stmt);
1031   tree_block_label (bb);
1032   bsi = bsi_after_labels (bb);
1033   bsi_insert_after (&bsi, ass_stmt, BSI_NEW_STMT);
1034
1035   mark_new_vars_to_rename (stmt, vars_to_rename);
1036 }
1037
1038 /* Replaces immediate uses of VAR by REPL.  */
1039
1040 static void
1041 replace_immediate_uses (tree var, tree repl)
1042 {
1043   int i, j, n;
1044   dataflow_t df;
1045   tree stmt;
1046   bool mark_new_vars;
1047   ssa_op_iter iter;
1048   use_operand_p use_p;
1049
1050   df = get_immediate_uses (SSA_NAME_DEF_STMT (var));
1051   n = num_immediate_uses (df);
1052
1053   for (i = 0; i < n; i++)
1054     {
1055       stmt = immediate_use (df, i);
1056
1057       if (TREE_CODE (stmt) == PHI_NODE)
1058         {
1059           for (j = 0; j < PHI_NUM_ARGS (stmt); j++)
1060             if (PHI_ARG_DEF (stmt, j) == var)
1061               {
1062                 SET_PHI_ARG_DEF (stmt, j, repl);
1063                 if (TREE_CODE (repl) == SSA_NAME
1064                     && PHI_ARG_EDGE (stmt, j)->flags & EDGE_ABNORMAL)
1065                   SSA_NAME_OCCURS_IN_ABNORMAL_PHI (repl) = 1;
1066               }
1067
1068           continue;
1069         }
1070
1071       get_stmt_operands (stmt);
1072       mark_new_vars = false;
1073       if (is_gimple_reg (SSA_NAME_VAR (var)))
1074         {
1075           if (TREE_CODE (stmt) == MODIFY_EXPR)
1076             {
1077               propagate_into_addr (stmt, var, &TREE_OPERAND (stmt, 0), repl);
1078               propagate_into_addr (stmt, var, &TREE_OPERAND (stmt, 1), repl);
1079             }
1080
1081           FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE)
1082             if (USE_FROM_PTR (use_p) == var)
1083               {
1084                 propagate_value (use_p, repl);
1085                 mark_new_vars = POINTER_TYPE_P (TREE_TYPE (repl));
1086               }
1087         }
1088       else
1089         {
1090           FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, 
1091                                     SSA_OP_VIRTUAL_USES | SSA_OP_VIRTUAL_KILLS)
1092             if (USE_FROM_PTR (use_p) == var)
1093               propagate_value (use_p, repl);
1094         }
1095
1096       /* FIXME.  If REPL is a constant, we need to fold STMT.
1097          However, fold_stmt wants a pointer to the statement, because
1098          it may happen that it needs to replace the whole statement
1099          with a new expression.  Since the current def-use machinery
1100          does not return pointers to statements, we call fold_stmt
1101          with the address of a local temporary, if that call changes
1102          the temporary then we fallback on looking for a proper
1103          pointer to STMT by scanning STMT's basic block.
1104
1105          Note that all this will become unnecessary soon.  This
1106          pass is being replaced with a proper copy propagation pass
1107          for 4.1 (dnovillo, 2004-09-17).  */
1108       if (TREE_CODE (repl) != SSA_NAME)
1109         {
1110           tree tmp = stmt;
1111           fold_stmt (&tmp);
1112           mark_new_vars = true;
1113           if (tmp != stmt)
1114             {
1115               block_stmt_iterator si = bsi_for_stmt (stmt);
1116               mark_new_vars_to_rename (tmp, vars_to_rename);
1117               redirect_immediate_uses (stmt, tmp);
1118               bsi_replace (&si, tmp, true);
1119               stmt = bsi_stmt (si);
1120             }
1121         }
1122
1123       /* If REPL is a pointer, it may have different memory tags associated
1124          with it.  For instance, VAR may have had a name tag while REPL
1125          only had a type tag.  In these cases, the virtual operands (if
1126          any) in the statement will refer to different symbols which need
1127          to be renamed.  */
1128       if (mark_new_vars)
1129         mark_new_vars_to_rename (stmt, vars_to_rename);
1130       else
1131         modify_stmt (stmt);
1132     }
1133 }
1134
1135 /* Gets the value VAR is equivalent to according to EQ_TO.  */
1136
1137 static tree
1138 get_eq_name (tree *eq_to, tree var)
1139 {
1140   unsigned ver;
1141   tree val = var;
1142
1143   while (TREE_CODE (val) == SSA_NAME)
1144     {
1145       ver = SSA_NAME_VERSION (val);
1146       if (!eq_to[ver])
1147         break;
1148
1149       val = eq_to[ver];
1150     }
1151
1152   while (TREE_CODE (var) == SSA_NAME)
1153     {
1154       ver = SSA_NAME_VERSION (var);
1155       if (!eq_to[ver])
1156         break;
1157
1158       var = eq_to[ver];
1159       eq_to[ver] = val;
1160     }
1161
1162   return val;
1163 }
1164
1165 /* Checks whether phi node PHI is redundant and if it is, records the ssa name
1166    its result is redundant to to EQ_TO array.  */
1167
1168 static void
1169 check_phi_redundancy (tree phi, tree *eq_to)
1170 {
1171   tree val = NULL_TREE, def, res = PHI_RESULT (phi), stmt;
1172   unsigned i, ver = SSA_NAME_VERSION (res), n;
1173   dataflow_t df;
1174
1175   /* It is unlikely that such large phi node would be redundant.  */
1176   if (PHI_NUM_ARGS (phi) > 16)
1177     return;
1178
1179   for (i = 0; i < (unsigned) PHI_NUM_ARGS (phi); i++)
1180     {
1181       def = PHI_ARG_DEF (phi, i);
1182
1183       if (TREE_CODE (def) == SSA_NAME)
1184         {
1185           def = get_eq_name (eq_to, def);
1186           if (def == res)
1187             continue;
1188         }
1189
1190       if (val
1191           && !operand_equal_for_phi_arg_p (val, def))
1192         return;
1193
1194       val = def;
1195     }
1196
1197   /* At least one of the arguments should not be equal to the result, or
1198      something strange is happening.  */
1199   gcc_assert (val);
1200
1201   if (get_eq_name (eq_to, res) == val)
1202     return;
1203
1204   if (!may_propagate_copy (res, val))
1205     return;
1206
1207   eq_to[ver] = val;
1208
1209   df = get_immediate_uses (SSA_NAME_DEF_STMT (res));
1210   n = num_immediate_uses (df);
1211
1212   for (i = 0; i < n; i++)
1213     {
1214       stmt = immediate_use (df, i);
1215
1216       if (TREE_CODE (stmt) == PHI_NODE)
1217         check_phi_redundancy (stmt, eq_to);
1218     }
1219 }
1220
1221 /* Removes redundant phi nodes.
1222
1223    A redundant PHI node is a PHI node where all of its PHI arguments
1224    are the same value, excluding any PHI arguments which are the same
1225    as the PHI result.
1226
1227    A redundant PHI node is effectively a copy, so we forward copy propagate
1228    which removes all uses of the destination of the PHI node then
1229    finally we delete the redundant PHI node.
1230
1231    Note that if we can not copy propagate the PHI node, then the PHI
1232    will not be removed.  Thus we do not have to worry about dependencies
1233    between PHIs and the problems serializing PHIs into copies creates. 
1234    
1235    The most important effect of this pass is to remove degenerate PHI
1236    nodes created by removing unreachable code.  */
1237
1238 void
1239 kill_redundant_phi_nodes (void)
1240 {
1241   tree *eq_to;
1242   unsigned i, old_num_ssa_names;
1243   basic_block bb;
1244   tree phi, var, repl, stmt;
1245
1246   /* The EQ_TO[VER] holds the value by that the ssa name VER should be
1247      replaced.  If EQ_TO[VER] is ssa name and it is decided to replace it by
1248      other value, it may be necessary to follow the chain till the final value.
1249      We perform path shortening (replacing the entries of the EQ_TO array with
1250      heads of these chains) whenever we access the field to prevent quadratic
1251      complexity (probably would not occur in practice anyway, but let us play
1252      it safe).  */
1253   eq_to = xcalloc (num_ssa_names, sizeof (tree));
1254
1255   /* We have had cases where computing immediate uses takes a
1256      significant amount of compile time.  If we run into such
1257      problems here, we may want to only compute immediate uses for
1258      a subset of all the SSA_NAMEs instead of computing it for
1259      all of the SSA_NAMEs.  */
1260   compute_immediate_uses (TDFA_USE_OPS | TDFA_USE_VOPS, NULL);
1261   old_num_ssa_names = num_ssa_names;
1262
1263   FOR_EACH_BB (bb)
1264     {
1265       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
1266         {
1267           var = PHI_RESULT (phi);
1268           check_phi_redundancy (phi, eq_to);
1269         }
1270     }
1271
1272   /* Now propagate the values.  */
1273   for (i = 0; i < old_num_ssa_names; i++)
1274     {
1275       if (!ssa_name (i))
1276         continue;
1277
1278       repl = get_eq_name (eq_to, ssa_name (i));
1279       if (repl != ssa_name (i))
1280         replace_immediate_uses (ssa_name (i), repl);
1281     }
1282
1283   /* And remove the dead phis.  */
1284   for (i = 0; i < old_num_ssa_names; i++)
1285     {
1286       if (!ssa_name (i))
1287         continue;
1288
1289       repl = get_eq_name (eq_to, ssa_name (i));
1290       if (repl != ssa_name (i))
1291         {
1292           stmt = SSA_NAME_DEF_STMT (ssa_name (i));
1293           remove_phi_node (stmt, NULL_TREE, bb_for_stmt (stmt));
1294         }
1295     }
1296
1297   free_df ();
1298   free (eq_to);
1299 }
1300
1301 struct tree_opt_pass pass_redundant_phi =
1302 {
1303   "redphi",                             /* name */
1304   NULL,                                 /* gate */
1305   kill_redundant_phi_nodes,             /* execute */
1306   NULL,                                 /* sub */
1307   NULL,                                 /* next */
1308   0,                                    /* static_pass_number */
1309   TV_TREE_REDPHI,                       /* tv_id */
1310   PROP_cfg | PROP_ssa | PROP_alias,     /* properties_required */
1311   0,                                    /* properties_provided */
1312   0,                                    /* properties_destroyed */
1313   0,                                    /* todo_flags_start */
1314   TODO_dump_func | TODO_rename_vars 
1315     | TODO_ggc_collect | TODO_verify_ssa, /* todo_flags_finish */
1316   0                                     /* letter */
1317 };
1318 \f
1319 /* Emit warnings for uninitialized variables.  This is done in two passes.
1320
1321    The first pass notices real uses of SSA names with default definitions.
1322    Such uses are unconditionally uninitialized, and we can be certain that
1323    such a use is a mistake.  This pass is run before most optimizations,
1324    so that we catch as many as we can.
1325
1326    The second pass follows PHI nodes to find uses that are potentially
1327    uninitialized.  In this case we can't necessarily prove that the use
1328    is really uninitialized.  This pass is run after most optimizations,
1329    so that we thread as many jumps and possible, and delete as much dead
1330    code as possible, in order to reduce false positives.  We also look
1331    again for plain uninitialized variables, since optimization may have
1332    changed conditionally uninitialized to unconditionally uninitialized.  */
1333
1334 /* Emit a warning for T, an SSA_NAME, being uninitialized.  The exact
1335    warning text is in MSGID and LOCUS may contain a location or be null.  */
1336
1337 static void
1338 warn_uninit (tree t, const char *msgid, location_t *locus)
1339 {
1340   tree var = SSA_NAME_VAR (t);
1341   tree def = SSA_NAME_DEF_STMT (t);
1342
1343   /* Default uses (indicated by an empty definition statement),
1344      are uninitialized.  */
1345   if (!IS_EMPTY_STMT (def))
1346     return;
1347
1348   /* Except for PARMs of course, which are always initialized.  */
1349   if (TREE_CODE (var) == PARM_DECL)
1350     return;
1351
1352   /* Hard register variables get their initial value from the ether.  */
1353   if (TREE_CODE (var) == VAR_DECL && DECL_HARD_REGISTER (var))
1354     return;
1355
1356   /* TREE_NO_WARNING either means we already warned, or the front end
1357      wishes to suppress the warning.  */
1358   if (TREE_NO_WARNING (var))
1359     return;
1360
1361   if (!locus)
1362     locus = &DECL_SOURCE_LOCATION (var);
1363   warning (msgid, locus, var);
1364   TREE_NO_WARNING (var) = 1;
1365 }
1366    
1367 /* Called via walk_tree, look for SSA_NAMEs that have empty definitions
1368    and warn about them.  */
1369
1370 static tree
1371 warn_uninitialized_var (tree *tp, int *walk_subtrees, void *data)
1372 {
1373   location_t *locus = data;
1374   tree t = *tp;
1375
1376   /* We only do data flow with SSA_NAMEs, so that's all we can warn about.  */
1377   if (TREE_CODE (t) == SSA_NAME)
1378     {
1379       warn_uninit (t, "%H%qD is used uninitialized in this function", locus);
1380       *walk_subtrees = 0;
1381     }
1382   else if (IS_TYPE_OR_DECL_P (t))
1383     *walk_subtrees = 0;
1384
1385   return NULL_TREE;
1386 }
1387
1388 /* Look for inputs to PHI that are SSA_NAMEs that have empty definitions
1389    and warn about them.  */
1390
1391 static void
1392 warn_uninitialized_phi (tree phi)
1393 {
1394   int i, n = PHI_NUM_ARGS (phi);
1395
1396   /* Don't look at memory tags.  */
1397   if (!is_gimple_reg (PHI_RESULT (phi)))
1398     return;
1399
1400   for (i = 0; i < n; ++i)
1401     {
1402       tree op = PHI_ARG_DEF (phi, i);
1403       if (TREE_CODE (op) == SSA_NAME)
1404         warn_uninit (op, "%H%qD may be used uninitialized in this function",
1405                      NULL);
1406     }
1407 }
1408
1409 static void
1410 execute_early_warn_uninitialized (void)
1411 {
1412   block_stmt_iterator bsi;
1413   basic_block bb;
1414
1415   FOR_EACH_BB (bb)
1416     for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
1417       walk_tree (bsi_stmt_ptr (bsi), warn_uninitialized_var,
1418                  EXPR_LOCUS (bsi_stmt (bsi)), NULL);
1419 }
1420
1421 static void
1422 execute_late_warn_uninitialized (void)
1423 {
1424   basic_block bb;
1425   tree phi;
1426
1427   /* Re-do the plain uninitialized variable check, as optimization may have
1428      straightened control flow.  Do this first so that we don't accidentally
1429      get a "may be" warning when we'd have seen an "is" warning later.  */
1430   execute_early_warn_uninitialized ();
1431
1432   FOR_EACH_BB (bb)
1433     for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
1434       warn_uninitialized_phi (phi);
1435 }
1436
1437 static bool
1438 gate_warn_uninitialized (void)
1439 {
1440   return warn_uninitialized != 0;
1441 }
1442
1443 struct tree_opt_pass pass_early_warn_uninitialized =
1444 {
1445   NULL,                                 /* name */
1446   gate_warn_uninitialized,              /* gate */
1447   execute_early_warn_uninitialized,     /* execute */
1448   NULL,                                 /* sub */
1449   NULL,                                 /* next */
1450   0,                                    /* static_pass_number */
1451   0,                                    /* tv_id */
1452   PROP_ssa,                             /* properties_required */
1453   0,                                    /* properties_provided */
1454   0,                                    /* properties_destroyed */
1455   0,                                    /* todo_flags_start */
1456   0,                                    /* todo_flags_finish */
1457   0                                     /* letter */
1458 };
1459
1460 struct tree_opt_pass pass_late_warn_uninitialized =
1461 {
1462   NULL,                                 /* name */
1463   gate_warn_uninitialized,              /* gate */
1464   execute_late_warn_uninitialized,      /* execute */
1465   NULL,                                 /* sub */
1466   NULL,                                 /* next */
1467   0,                                    /* static_pass_number */
1468   0,                                    /* tv_id */
1469   PROP_ssa,                             /* properties_required */
1470   0,                                    /* properties_provided */
1471   0,                                    /* properties_destroyed */
1472   0,                                    /* todo_flags_start */
1473   0,                                    /* todo_flags_finish */
1474   0                                     /* letter */
1475 };
1476