OSDN Git Service

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