OSDN Git Service

Move ChangeLog entry for testsuite/gcc.dg/20050922-1.c from
[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, 51 Franklin Street, Fifth Floor,
19 Boston, MA 02110-1301, 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 "expr.h"
35 #include "function.h"
36 #include "diagnostic.h"
37 #include "bitmap.h"
38 #include "pointer-set.h"
39 #include "tree-flow.h"
40 #include "tree-gimple.h"
41 #include "tree-inline.h"
42 #include "varray.h"
43 #include "timevar.h"
44 #include "hashtab.h"
45 #include "tree-dump.h"
46 #include "tree-pass.h"
47 #include "toplev.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 PENDING_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   if (is_virtual && var_ann (SSA_NAME_VAR (ssa_name)) 
140       && get_subvars_for_var (SSA_NAME_VAR (ssa_name)) != NULL)
141     {
142       error ("found real variable when subvariables should have appeared");
143       return true;
144     }
145
146   if (SSA_NAME_IS_DEFAULT_DEF (ssa_name)
147       && !IS_EMPTY_STMT (SSA_NAME_DEF_STMT (ssa_name)))
148     {
149       error ("found a default name with a non-empty defining statement");
150       return true;
151     }
152
153   return false;
154 }
155
156
157 /* Return true if the definition of SSA_NAME at block BB is malformed.
158
159    STMT is the statement where SSA_NAME is created.
160
161    DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME
162       version numbers.  If DEFINITION_BLOCK[SSA_NAME_VERSION] is set,
163       it means that the block in that array slot contains the
164       definition of SSA_NAME.
165
166    IS_VIRTUAL is true if SSA_NAME is created by a VDEF.  */
167
168 static bool
169 verify_def (basic_block bb, basic_block *definition_block, tree ssa_name,
170             tree stmt, bool is_virtual)
171 {
172   if (verify_ssa_name (ssa_name, is_virtual))
173     goto err;
174
175   if (definition_block[SSA_NAME_VERSION (ssa_name)])
176     {
177       error ("SSA_NAME created in two different blocks %i and %i",
178              definition_block[SSA_NAME_VERSION (ssa_name)]->index, bb->index);
179       goto err;
180     }
181
182   definition_block[SSA_NAME_VERSION (ssa_name)] = bb;
183
184   if (SSA_NAME_DEF_STMT (ssa_name) != stmt)
185     {
186       error ("SSA_NAME_DEF_STMT is wrong");
187       fprintf (stderr, "Expected definition statement:\n");
188       print_generic_stmt (stderr, SSA_NAME_DEF_STMT (ssa_name), TDF_VOPS);
189       fprintf (stderr, "\nActual definition statement:\n");
190       print_generic_stmt (stderr, stmt, TDF_VOPS);
191       goto err;
192     }
193
194   return false;
195
196 err:
197   fprintf (stderr, "while verifying SSA_NAME ");
198   print_generic_expr (stderr, ssa_name, 0);
199   fprintf (stderr, " in statement\n");
200   print_generic_stmt (stderr, stmt, TDF_VOPS);
201
202   return true;
203 }
204
205
206 /* Return true if the use of SSA_NAME at statement STMT in block BB is
207    malformed.
208
209    DEF_BB is the block where SSA_NAME was found to be created.
210
211    IDOM contains immediate dominator information for the flowgraph.
212
213    CHECK_ABNORMAL is true if the caller wants to check whether this use
214       is flowing through an abnormal edge (only used when checking PHI
215       arguments).
216
217    If NAMES_DEFINED_IN_BB is not NULL, it contains a bitmap of ssa names
218      that are defined before STMT in basic block BB.  */
219
220 static bool
221 verify_use (basic_block bb, basic_block def_bb, use_operand_p use_p,
222             tree stmt, bool check_abnormal, bitmap names_defined_in_bb)
223 {
224   bool err = false;
225   tree ssa_name = USE_FROM_PTR (use_p);
226
227   if (!TREE_VISITED (ssa_name))
228     if (verify_imm_links (stderr, ssa_name))
229       err = true;
230
231   TREE_VISITED (ssa_name) = 1;
232
233   if (IS_EMPTY_STMT (SSA_NAME_DEF_STMT (ssa_name))
234       && SSA_NAME_IS_DEFAULT_DEF (ssa_name))
235     ; /* Default definitions have empty statements.  Nothing to do.  */
236   else if (!def_bb)
237     {
238       error ("missing definition");
239       err = true;
240     }
241   else if (bb != def_bb
242            && !dominated_by_p (CDI_DOMINATORS, bb, def_bb))
243     {
244       error ("definition in block %i does not dominate use in block %i",
245              def_bb->index, bb->index);
246       err = true;
247     }
248   else if (bb == def_bb
249            && names_defined_in_bb != NULL
250            && !bitmap_bit_p (names_defined_in_bb, SSA_NAME_VERSION (ssa_name)))
251     {
252       error ("definition in block %i follows the use", def_bb->index);
253       err = true;
254     }
255
256   if (check_abnormal
257       && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ssa_name))
258     {
259       error ("SSA_NAME_OCCURS_IN_ABNORMAL_PHI should be set");
260       err = true;
261     }
262
263   /* Make sure the use is in an appropriate list by checking the previous 
264      element to make sure it's the same.  */
265   if (use_p->prev == NULL)
266     {
267       error ("no immediate_use list");
268       err = true;
269     }
270   else
271     {
272       tree listvar ;
273       if (use_p->prev->use == NULL)
274         listvar = use_p->prev->stmt;
275       else
276         listvar = USE_FROM_PTR (use_p->prev);
277       if (listvar != ssa_name)
278         {
279           error ("wrong immediate use list");
280           err = true;
281         }
282     }
283
284   if (err)
285     {
286       fprintf (stderr, "for SSA_NAME: ");
287       print_generic_expr (stderr, ssa_name, TDF_VOPS);
288       fprintf (stderr, " in statement:\n");
289       print_generic_stmt (stderr, stmt, TDF_VOPS);
290     }
291
292   return err;
293 }
294
295
296 /* Return true if any of the arguments for PHI node PHI at block BB is
297    malformed.
298
299    DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME
300       version numbers.  If DEFINITION_BLOCK[SSA_NAME_VERSION] is set,
301       it means that the block in that array slot contains the
302       definition of SSA_NAME.  */
303
304 static bool
305 verify_phi_args (tree phi, basic_block bb, basic_block *definition_block)
306 {
307   edge e;
308   bool err = false;
309   unsigned i, phi_num_args = PHI_NUM_ARGS (phi);
310
311   if (EDGE_COUNT (bb->preds) != phi_num_args)
312     {
313       error ("incoming edge count does not match number of PHI arguments");
314       err = true;
315       goto error;
316     }
317
318   for (i = 0; i < phi_num_args; i++)
319     {
320       use_operand_p op_p = PHI_ARG_DEF_PTR (phi, i);
321       tree op = USE_FROM_PTR (op_p);
322
323       e = EDGE_PRED (bb, i);
324
325       if (op == NULL_TREE)
326         {
327           error ("PHI argument is missing for edge %d->%d",
328                  e->src->index,
329                  e->dest->index);
330           err = true;
331           goto error;
332         }
333
334       if (TREE_CODE (op) != SSA_NAME && !is_gimple_min_invariant (op))
335         {
336           error ("PHI argument is not SSA_NAME, or invariant");
337           err = true;
338         }
339
340       if (TREE_CODE (op) == SSA_NAME)
341         {
342           err = verify_ssa_name (op, !is_gimple_reg (PHI_RESULT (phi)));
343           err |= verify_use (e->src, definition_block[SSA_NAME_VERSION (op)],
344                              op_p, phi, e->flags & EDGE_ABNORMAL, NULL);
345         }
346
347       if (e->dest != bb)
348         {
349           error ("wrong edge %d->%d for PHI argument",
350                  e->src->index, e->dest->index);
351           err = true;
352         }
353
354       if (err)
355         {
356           fprintf (stderr, "PHI argument\n");
357           print_generic_stmt (stderr, op, TDF_VOPS);
358           goto error;
359         }
360     }
361
362 error:
363   if (err)
364     {
365       fprintf (stderr, "for PHI node\n");
366       print_generic_stmt (stderr, phi, TDF_VOPS|TDF_MEMSYMS);
367     }
368
369
370   return err;
371 }
372
373
374 static void
375 verify_flow_insensitive_alias_info (void)
376 {
377   tree var;
378   bitmap visited = BITMAP_ALLOC (NULL);
379   referenced_var_iterator rvi;
380
381   FOR_EACH_REFERENCED_VAR (var, rvi)
382     {
383       unsigned int j;
384       bitmap aliases;
385       tree alias;
386       bitmap_iterator bi;
387
388       if (!MTAG_P (var) || !MTAG_ALIASES (var))
389         continue;
390       
391       aliases = MTAG_ALIASES (var);
392
393       EXECUTE_IF_SET_IN_BITMAP (aliases, 0, j, bi)
394         {
395           alias = referenced_var (j);
396           bitmap_set_bit (visited, j);
397
398           if (TREE_CODE (alias) != MEMORY_PARTITION_TAG
399               && !may_be_aliased (alias))
400             {
401               error ("non-addressable variable inside an alias set");
402               debug_variable (alias);
403               goto err;
404             }
405         }
406     }
407
408   FOR_EACH_REFERENCED_VAR (var, rvi)
409     {
410       var_ann_t ann;
411       ann = var_ann (var);
412
413       if (!MTAG_P (var)
414           && ann->is_aliased
415           && memory_partition (var) == NULL_TREE
416           && !bitmap_bit_p (visited, DECL_UID (var)))
417         {
418           error ("addressable variable that is aliased but is not in any "
419                  "alias set");
420           goto err;
421         }
422     }
423
424   BITMAP_FREE (visited);
425   return;
426
427 err:
428   debug_variable (var);
429   internal_error ("verify_flow_insensitive_alias_info failed");
430 }
431
432
433 static void
434 verify_flow_sensitive_alias_info (void)
435 {
436   size_t i;
437   tree ptr;
438
439   for (i = 1; i < num_ssa_names; i++)
440     {
441       tree var;
442       var_ann_t ann;
443       struct ptr_info_def *pi;
444  
445
446       ptr = ssa_name (i);
447       if (!ptr)
448         continue;
449
450       /* We only care for pointers that are actually referenced in the
451          program.  */
452       if (!POINTER_TYPE_P (TREE_TYPE (ptr)) || !TREE_VISITED (ptr))
453         continue;
454
455       /* RESULT_DECL is special.  If it's a GIMPLE register, then it
456          is only written-to only once in the return statement.
457          Otherwise, aggregate RESULT_DECLs may be written-to more than
458          once in virtual operands.  */
459       var = SSA_NAME_VAR (ptr);
460       if (TREE_CODE (var) == RESULT_DECL
461           && is_gimple_reg (ptr))
462         continue;
463
464       pi = SSA_NAME_PTR_INFO (ptr);
465       if (pi == NULL)
466         continue;
467
468       ann = var_ann (var);
469       if (pi->is_dereferenced && !pi->name_mem_tag && !ann->symbol_mem_tag)
470         {
471           error ("dereferenced pointers should have a name or a symbol tag");
472           goto err;
473         }
474
475       if (pi->name_mem_tag
476           && (pi->pt_vars == NULL || bitmap_empty_p (pi->pt_vars)))
477         {
478           error ("pointers with a memory tag, should have points-to sets");
479           goto err;
480         }
481
482       if (pi->value_escapes_p && pi->name_mem_tag)
483         {
484           tree t = memory_partition (pi->name_mem_tag);
485           if (t == NULL_TREE)
486             t = pi->name_mem_tag;
487           
488           if (!is_call_clobbered (t))
489             {
490               error ("pointer escapes but its name tag is not call-clobbered");
491               goto err;
492             }
493         }
494     }
495
496   return;
497
498 err:
499   debug_variable (ptr);
500   internal_error ("verify_flow_sensitive_alias_info failed");
501 }
502
503
504 /* Verify the consistency of call clobbering information.  */
505
506 static void
507 verify_call_clobbering (void)
508 {
509   unsigned int i;
510   bitmap_iterator bi;
511   tree var;
512   referenced_var_iterator rvi;
513
514   /* At all times, the result of the call_clobbered flag should
515      match the result of the call_clobbered_vars bitmap.  Verify both
516      that everything in call_clobbered_vars is marked
517      call_clobbered, and that everything marked
518      call_clobbered is in call_clobbered_vars.  */
519   EXECUTE_IF_SET_IN_BITMAP (gimple_call_clobbered_vars (cfun), 0, i, bi)
520     {
521       var = referenced_var (i);
522
523       if (memory_partition (var))
524         var = memory_partition (var);
525
526       if (!MTAG_P (var) && !var_ann (var)->call_clobbered)
527         {
528           error ("variable in call_clobbered_vars but not marked "
529                  "call_clobbered");
530           debug_variable (var);
531           goto err;
532         }
533     }
534
535   FOR_EACH_REFERENCED_VAR (var, rvi)
536     {
537       if (is_gimple_reg (var))
538         continue;
539
540       if (memory_partition (var))
541         var = memory_partition (var);
542
543       if (!MTAG_P (var)
544           && var_ann (var)->call_clobbered
545           && !bitmap_bit_p (gimple_call_clobbered_vars (cfun), DECL_UID (var)))
546         {
547           error ("variable marked call_clobbered but not in "
548                  "call_clobbered_vars bitmap.");
549           debug_variable (var);
550           goto err;
551         }
552     }
553
554   return;
555
556  err:
557     internal_error ("verify_call_clobbering failed");
558 }
559
560 /* Verify the consistency of aliasing information.  */
561
562 static void
563 verify_alias_info (void)
564 {
565   verify_flow_sensitive_alias_info ();
566   verify_call_clobbering ();
567   verify_flow_insensitive_alias_info ();
568 }
569
570
571 /* Verify common invariants in the SSA web.
572    TODO: verify the variable annotations.  */
573
574 void
575 verify_ssa (bool check_modified_stmt)
576 {
577   size_t i;
578   basic_block bb;
579   basic_block *definition_block = XCNEWVEC (basic_block, num_ssa_names);
580   ssa_op_iter iter;
581   tree op;
582   enum dom_state orig_dom_state = dom_computed[CDI_DOMINATORS];
583   bitmap names_defined_in_bb = BITMAP_ALLOC (NULL);
584
585   gcc_assert (!need_ssa_update_p ());
586
587   verify_stmts ();
588
589   timevar_push (TV_TREE_SSA_VERIFY);
590
591   /* Keep track of SSA names present in the IL.  */
592   for (i = 1; i < num_ssa_names; i++)
593     {
594       tree name = ssa_name (i);
595       if (name)
596         {
597           tree stmt;
598           TREE_VISITED (name) = 0;
599
600           stmt = SSA_NAME_DEF_STMT (name);
601           if (!IS_EMPTY_STMT (stmt))
602             {
603               basic_block bb = bb_for_stmt (stmt);
604               verify_def (bb, definition_block,
605                           name, stmt, !is_gimple_reg (name));
606
607             }
608         }
609     }
610
611   calculate_dominance_info (CDI_DOMINATORS);
612
613   /* Now verify all the uses and make sure they agree with the definitions
614      found in the previous pass.  */
615   FOR_EACH_BB (bb)
616     {
617       edge e;
618       tree phi;
619       edge_iterator ei;
620       block_stmt_iterator bsi;
621
622       /* Make sure that all edges have a clear 'aux' field.  */
623       FOR_EACH_EDGE (e, ei, bb->preds)
624         {
625           if (e->aux)
626             {
627               error ("AUX pointer initialized for edge %d->%d", e->src->index,
628                       e->dest->index);
629               goto err;
630             }
631         }
632
633       /* Verify the arguments for every PHI node in the block.  */
634       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
635         {
636           if (verify_phi_args (phi, bb, definition_block))
637             goto err;
638
639           bitmap_set_bit (names_defined_in_bb,
640                           SSA_NAME_VERSION (PHI_RESULT (phi)));
641         }
642
643       /* Now verify all the uses and vuses in every statement of the block.  */
644       for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
645         {
646           tree stmt = bsi_stmt (bsi);
647           use_operand_p use_p;
648
649           if (check_modified_stmt && stmt_modified_p (stmt))
650             {
651               error ("stmt (%p) marked modified after optimization pass: ",
652                      (void *)stmt);
653               print_generic_stmt (stderr, stmt, TDF_VOPS);
654               goto err;
655             }
656
657           if (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT
658               && TREE_CODE (GIMPLE_STMT_OPERAND (stmt, 0)) != SSA_NAME)
659             {
660               tree lhs, base_address;
661
662               lhs = GIMPLE_STMT_OPERAND (stmt, 0);
663               base_address = get_base_address (lhs);
664
665               if (base_address
666                   && gimple_aliases_computed_p (cfun)
667                   && SSA_VAR_P (base_address)
668                   && !stmt_ann (stmt)->has_volatile_ops
669                   && ZERO_SSA_OPERANDS (stmt, SSA_OP_VDEF))
670                 {
671                   error ("statement makes a memory store, but has no VDEFS");
672                   print_generic_stmt (stderr, stmt, TDF_VOPS);
673                   goto err;
674                 }
675             }
676
677           FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_ALL_VIRTUALS)
678             {
679               if (verify_ssa_name (op, true))
680                 {
681                   error ("in statement");
682                   print_generic_stmt (stderr, stmt, TDF_VOPS|TDF_MEMSYMS);
683                   goto err;
684                 }
685             }
686
687           FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE|SSA_OP_DEF)
688             {
689               if (verify_ssa_name (op, false))
690                 {
691                   error ("in statement");
692                   print_generic_stmt (stderr, stmt, TDF_VOPS|TDF_MEMSYMS);
693                   goto err;
694                 }
695             }
696
697           FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE|SSA_OP_VUSE)
698             {
699               op = USE_FROM_PTR (use_p);
700               if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
701                               use_p, stmt, false, names_defined_in_bb))
702                 goto err;
703             }
704
705           FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_ALL_DEFS)
706             bitmap_set_bit (names_defined_in_bb, SSA_NAME_VERSION (op));
707         }
708
709       bitmap_clear (names_defined_in_bb);
710     }
711
712   /* Finally, verify alias information.  */
713   if (gimple_aliases_computed_p (cfun))
714     verify_alias_info ();
715
716   free (definition_block);
717
718   /* Restore the dominance information to its prior known state, so
719      that we do not perturb the compiler's subsequent behavior.  */
720   if (orig_dom_state == DOM_NONE)
721     free_dominance_info (CDI_DOMINATORS);
722   else
723     dom_computed[CDI_DOMINATORS] = orig_dom_state;
724   
725   BITMAP_FREE (names_defined_in_bb);
726   timevar_pop (TV_TREE_SSA_VERIFY);
727   return;
728
729 err:
730   internal_error ("verify_ssa failed");
731 }
732
733 /* Return true if the uid in both int tree maps are equal.  */
734
735 int
736 int_tree_map_eq (const void *va, const void *vb)
737 {
738   const struct int_tree_map *a = (const struct int_tree_map *) va;
739   const struct int_tree_map *b = (const struct int_tree_map *) vb;
740   return (a->uid == b->uid);
741 }
742
743 /* Hash a UID in a int_tree_map.  */
744
745 unsigned int
746 int_tree_map_hash (const void *item)
747 {
748   return ((const struct int_tree_map *)item)->uid;
749 }
750
751 /* Return true if the uid in both int tree maps are equal.  */
752
753 static int
754 var_ann_eq (const void *va, const void *vb)
755 {
756   const struct static_var_ann_d *a = (const struct static_var_ann_d *) va;
757   tree b = (tree) vb;
758   return (a->uid == DECL_UID (b));
759 }
760
761 /* Hash a UID in a int_tree_map.  */
762
763 static unsigned int
764 var_ann_hash (const void *item)
765 {
766   return ((const struct static_var_ann_d *)item)->uid;
767 }
768
769
770 /* Initialize global DFA and SSA structures.  */
771
772 void
773 init_tree_ssa (void)
774 {
775   cfun->gimple_df = ggc_alloc_cleared (sizeof (struct gimple_df));
776   cfun->gimple_df->referenced_vars = htab_create_ggc (20, int_tree_map_hash, 
777                                                       int_tree_map_eq, NULL);
778   cfun->gimple_df->default_defs = htab_create_ggc (20, int_tree_map_hash, 
779                                                    int_tree_map_eq, NULL);
780   cfun->gimple_df->var_anns = htab_create_ggc (20, var_ann_hash, 
781                                                var_ann_eq, NULL);
782   cfun->gimple_df->call_clobbered_vars = BITMAP_GGC_ALLOC ();
783   cfun->gimple_df->addressable_vars = BITMAP_GGC_ALLOC ();
784   init_ssanames ();
785   init_phinodes ();
786 }
787
788
789 /* Deallocate memory associated with SSA data structures for FNDECL.  */
790
791 void
792 delete_tree_ssa (void)
793 {
794   size_t i;
795   basic_block bb;
796   block_stmt_iterator bsi;
797   referenced_var_iterator rvi;
798   tree var;
799
800   /* Release any ssa_names still in use.  */
801   for (i = 0; i < num_ssa_names; i++)
802     {
803       tree var = ssa_name (i);
804       if (var && TREE_CODE (var) == SSA_NAME)
805         {
806           SSA_NAME_IMM_USE_NODE (var).prev = &(SSA_NAME_IMM_USE_NODE (var));
807           SSA_NAME_IMM_USE_NODE (var).next = &(SSA_NAME_IMM_USE_NODE (var));
808         }
809       release_ssa_name (var);
810     }
811
812   /* Remove annotations from every tree in the function.  */
813   FOR_EACH_BB (bb)
814     {
815       for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
816         {
817           tree stmt = bsi_stmt (bsi);
818           stmt_ann_t ann = get_stmt_ann (stmt);
819
820           free_ssa_operands (&ann->operands);
821           ann->addresses_taken = 0;
822           mark_stmt_modified (stmt);
823         }
824       set_phi_nodes (bb, NULL);
825     }
826
827   /* Remove annotations from every referenced variable.  */
828   FOR_EACH_REFERENCED_VAR (var, rvi)
829     {
830       if (var->base.ann)
831         ggc_free (var->base.ann);
832       var->base.ann = NULL;
833     }
834   htab_delete (gimple_referenced_vars (cfun));
835   cfun->gimple_df->referenced_vars = NULL;
836
837   fini_ssanames ();
838   fini_phinodes ();
839   /* we no longer maintain the SSA operand cache at this point.  */
840   fini_ssa_operands ();
841
842   cfun->gimple_df->global_var = NULL_TREE;
843   
844   htab_delete (cfun->gimple_df->default_defs);
845   cfun->gimple_df->default_defs = NULL;
846   htab_delete (cfun->gimple_df->var_anns);
847   cfun->gimple_df->var_anns = NULL;
848   cfun->gimple_df->call_clobbered_vars = NULL;
849   cfun->gimple_df->addressable_vars = NULL;
850   cfun->gimple_df->modified_noreturn_calls = NULL;
851   if (gimple_aliases_computed_p (cfun))
852     {
853       delete_alias_heapvars ();
854       gcc_assert (!need_ssa_update_p ());
855     }
856   cfun->gimple_df->aliases_computed_p = false;
857
858   cfun->gimple_df = NULL;
859 }
860
861
862 /* Return true if the conversion from INNER_TYPE to OUTER_TYPE is a
863    useless type conversion, otherwise return false.  */
864
865 bool
866 tree_ssa_useless_type_conversion_1 (tree outer_type, tree inner_type)
867 {
868   if (inner_type == outer_type)
869     return true;
870
871   /* Changes in machine mode are never useless conversions.  */
872   if (TYPE_MODE (inner_type) != TYPE_MODE (outer_type))
873     return false;
874
875   /* If the inner and outer types are effectively the same, then
876      strip the type conversion and enter the equivalence into
877      the table.  */
878   if (lang_hooks.types_compatible_p (inner_type, outer_type))
879     return true;
880
881   /* If both types are pointers and the outer type is a (void *), then
882      the conversion is not necessary.  The opposite is not true since
883      that conversion would result in a loss of information if the
884      equivalence was used.  Consider an indirect function call where
885      we need to know the exact type of the function to correctly
886      implement the ABI.  */
887   else if (POINTER_TYPE_P (inner_type)
888            && POINTER_TYPE_P (outer_type)
889            && TYPE_REF_CAN_ALIAS_ALL (inner_type)
890               == TYPE_REF_CAN_ALIAS_ALL (outer_type)
891            && TREE_CODE (TREE_TYPE (outer_type)) == VOID_TYPE)
892     return true;
893
894   /* Don't lose casts between pointers to volatile and non-volatile
895      qualified types.  Doing so would result in changing the semantics
896      of later accesses.  */
897   else if (POINTER_TYPE_P (inner_type)
898            && POINTER_TYPE_P (outer_type)
899            && TYPE_VOLATILE (TREE_TYPE (outer_type))
900               != TYPE_VOLATILE (TREE_TYPE (inner_type)))
901     return false;
902
903   /* Pointers/references are equivalent if their pointed to types
904      are effectively the same.  This allows to strip conversions between
905      pointer types with different type qualifiers.  */
906   else if (POINTER_TYPE_P (inner_type)
907            && POINTER_TYPE_P (outer_type)
908            && TYPE_REF_CAN_ALIAS_ALL (inner_type)
909               == TYPE_REF_CAN_ALIAS_ALL (outer_type)
910            && lang_hooks.types_compatible_p (TREE_TYPE (inner_type),
911                                              TREE_TYPE (outer_type)))
912     return true;
913
914   /* If both the inner and outer types are integral types, then the
915      conversion is not necessary if they have the same mode and
916      signedness and precision, and both or neither are boolean.  Some
917      code assumes an invariant that boolean types stay boolean and do
918      not become 1-bit bit-field types.  Note that types with precision
919      not using all bits of the mode (such as bit-field types in C)
920      mean that testing of precision is necessary.  */
921   else if (INTEGRAL_TYPE_P (inner_type)
922            && INTEGRAL_TYPE_P (outer_type)
923            && TYPE_UNSIGNED (inner_type) == TYPE_UNSIGNED (outer_type)
924            && TYPE_PRECISION (inner_type) == TYPE_PRECISION (outer_type)
925            && simple_cst_equal (TYPE_MAX_VALUE (inner_type), TYPE_MAX_VALUE (outer_type))
926            && simple_cst_equal (TYPE_MIN_VALUE (inner_type), TYPE_MIN_VALUE (outer_type)))
927     {
928       bool first_boolean = (TREE_CODE (inner_type) == BOOLEAN_TYPE);
929       bool second_boolean = (TREE_CODE (outer_type) == BOOLEAN_TYPE);
930       if (first_boolean == second_boolean)
931         return true;
932     }
933
934   /* Recurse for complex types.  */
935   else if (TREE_CODE (inner_type) == COMPLEX_TYPE
936            && TREE_CODE (outer_type) == COMPLEX_TYPE
937            && tree_ssa_useless_type_conversion_1 (TREE_TYPE (outer_type),
938                                                   TREE_TYPE (inner_type)))
939     return true;
940
941   return false;
942 }
943
944 /* Return true if EXPR is a useless type conversion, otherwise return
945    false.  */
946
947 bool
948 tree_ssa_useless_type_conversion (tree expr)
949 {
950   /* If we have an assignment that merely uses a NOP_EXPR to change
951      the top of the RHS to the type of the LHS and the type conversion
952      is "safe", then strip away the type conversion so that we can
953      enter LHS = RHS into the const_and_copies table.  */
954   if (TREE_CODE (expr) == NOP_EXPR || TREE_CODE (expr) == CONVERT_EXPR
955       || TREE_CODE (expr) == VIEW_CONVERT_EXPR
956       || TREE_CODE (expr) == NON_LVALUE_EXPR)
957     return tree_ssa_useless_type_conversion_1 (TREE_TYPE (expr),
958                                                TREE_TYPE (TREE_OPERAND (expr,
959                                                                         0)));
960
961
962   return false;
963 }
964
965
966 /* Internal helper for walk_use_def_chains.  VAR, FN and DATA are as
967    described in walk_use_def_chains.
968    
969    VISITED is a pointer set used to mark visited SSA_NAMEs to avoid
970       infinite loops.  We used to have a bitmap for this to just mark
971       SSA versions we had visited.  But non-sparse bitmaps are way too
972       expensive, while sparse bitmaps may cause quadratic behavior.
973
974    IS_DFS is true if the caller wants to perform a depth-first search
975       when visiting PHI nodes.  A DFS will visit each PHI argument and
976       call FN after each one.  Otherwise, all the arguments are
977       visited first and then FN is called with each of the visited
978       arguments in a separate pass.  */
979
980 static bool
981 walk_use_def_chains_1 (tree var, walk_use_def_chains_fn fn, void *data,
982                        struct pointer_set_t *visited, bool is_dfs)
983 {
984   tree def_stmt;
985
986   if (pointer_set_insert (visited, var))
987     return false;
988
989   def_stmt = SSA_NAME_DEF_STMT (var);
990
991   if (TREE_CODE (def_stmt) != PHI_NODE)
992     {
993       /* If we reached the end of the use-def chain, call FN.  */
994       return fn (var, def_stmt, data);
995     }
996   else
997     {
998       int i;
999
1000       /* When doing a breadth-first search, call FN before following the
1001          use-def links for each argument.  */
1002       if (!is_dfs)
1003         for (i = 0; i < PHI_NUM_ARGS (def_stmt); i++)
1004           if (fn (PHI_ARG_DEF (def_stmt, i), def_stmt, data))
1005             return true;
1006
1007       /* Follow use-def links out of each PHI argument.  */
1008       for (i = 0; i < PHI_NUM_ARGS (def_stmt); i++)
1009         {
1010           tree arg = PHI_ARG_DEF (def_stmt, i);
1011
1012           /* ARG may be NULL for newly introduced PHI nodes.  */
1013           if (arg
1014               && TREE_CODE (arg) == SSA_NAME
1015               && walk_use_def_chains_1 (arg, fn, data, visited, is_dfs))
1016             return true;
1017         }
1018
1019       /* When doing a depth-first search, call FN after following the
1020          use-def links for each argument.  */
1021       if (is_dfs)
1022         for (i = 0; i < PHI_NUM_ARGS (def_stmt); i++)
1023           if (fn (PHI_ARG_DEF (def_stmt, i), def_stmt, data))
1024             return true;
1025     }
1026   
1027   return false;
1028 }
1029   
1030
1031
1032 /* Walk use-def chains starting at the SSA variable VAR.  Call
1033    function FN at each reaching definition found.  FN takes three
1034    arguments: VAR, its defining statement (DEF_STMT) and a generic
1035    pointer to whatever state information that FN may want to maintain
1036    (DATA).  FN is able to stop the walk by returning true, otherwise
1037    in order to continue the walk, FN should return false.  
1038
1039    Note, that if DEF_STMT is a PHI node, the semantics are slightly
1040    different.  The first argument to FN is no longer the original
1041    variable VAR, but the PHI argument currently being examined.  If FN
1042    wants to get at VAR, it should call PHI_RESULT (PHI).
1043
1044    If IS_DFS is true, this function will:
1045
1046         1- walk the use-def chains for all the PHI arguments, and,
1047         2- call (*FN) (ARG, PHI, DATA) on all the PHI arguments.
1048
1049    If IS_DFS is false, the two steps above are done in reverse order
1050    (i.e., a breadth-first search).  */
1051
1052 void
1053 walk_use_def_chains (tree var, walk_use_def_chains_fn fn, void *data,
1054                      bool is_dfs)
1055 {
1056   tree def_stmt;
1057
1058   gcc_assert (TREE_CODE (var) == SSA_NAME);
1059
1060   def_stmt = SSA_NAME_DEF_STMT (var);
1061
1062   /* We only need to recurse if the reaching definition comes from a PHI
1063      node.  */
1064   if (TREE_CODE (def_stmt) != PHI_NODE)
1065     (*fn) (var, def_stmt, data);
1066   else
1067     {
1068       struct pointer_set_t *visited = pointer_set_create ();
1069       walk_use_def_chains_1 (var, fn, data, visited, is_dfs);
1070       pointer_set_destroy (visited);
1071     }
1072 }
1073
1074 \f
1075 /* Emit warnings for uninitialized variables.  This is done in two passes.
1076
1077    The first pass notices real uses of SSA names with default definitions.
1078    Such uses are unconditionally uninitialized, and we can be certain that
1079    such a use is a mistake.  This pass is run before most optimizations,
1080    so that we catch as many as we can.
1081
1082    The second pass follows PHI nodes to find uses that are potentially
1083    uninitialized.  In this case we can't necessarily prove that the use
1084    is really uninitialized.  This pass is run after most optimizations,
1085    so that we thread as many jumps and possible, and delete as much dead
1086    code as possible, in order to reduce false positives.  We also look
1087    again for plain uninitialized variables, since optimization may have
1088    changed conditionally uninitialized to unconditionally uninitialized.  */
1089
1090 /* Emit a warning for T, an SSA_NAME, being uninitialized.  The exact
1091    warning text is in MSGID and LOCUS may contain a location or be null.  */
1092
1093 static void
1094 warn_uninit (tree t, const char *gmsgid, void *data)
1095 {
1096   tree var = SSA_NAME_VAR (t);
1097   tree def = SSA_NAME_DEF_STMT (t);
1098   tree context = (tree) data;
1099   location_t *locus;
1100   expanded_location xloc, floc;
1101
1102   /* Default uses (indicated by an empty definition statement),
1103      are uninitialized.  */
1104   if (!IS_EMPTY_STMT (def))
1105     return;
1106
1107   /* Except for PARMs of course, which are always initialized.  */
1108   if (TREE_CODE (var) == PARM_DECL)
1109     return;
1110
1111   /* Hard register variables get their initial value from the ether.  */
1112   if (TREE_CODE (var) == VAR_DECL && DECL_HARD_REGISTER (var))
1113     return;
1114
1115   /* TREE_NO_WARNING either means we already warned, or the front end
1116      wishes to suppress the warning.  */
1117   if (TREE_NO_WARNING (var))
1118     return;
1119
1120   locus = (context != NULL && EXPR_HAS_LOCATION (context)
1121            ? EXPR_LOCUS (context)
1122            : &DECL_SOURCE_LOCATION (var));
1123   warning (0, gmsgid, locus, var);
1124   xloc = expand_location (*locus);
1125   floc = expand_location (DECL_SOURCE_LOCATION (cfun->decl));
1126   if (xloc.file != floc.file
1127       || xloc.line < floc.line
1128       || xloc.line > LOCATION_LINE (cfun->function_end_locus))
1129     inform ("%J%qD was declared here", var, var);
1130
1131   TREE_NO_WARNING (var) = 1;
1132 }
1133    
1134 /* Called via walk_tree, look for SSA_NAMEs that have empty definitions
1135    and warn about them.  */
1136
1137 static tree
1138 warn_uninitialized_var (tree *tp, int *walk_subtrees, void *data)
1139 {
1140   tree t = *tp;
1141
1142   switch (TREE_CODE (t))
1143     {
1144     case SSA_NAME:
1145       /* We only do data flow with SSA_NAMEs, so that's all we
1146          can warn about.  */
1147       warn_uninit (t, "%H%qD is used uninitialized in this function", data);
1148       *walk_subtrees = 0;
1149       break;
1150
1151     case REALPART_EXPR:
1152     case IMAGPART_EXPR:
1153       /* The total store transformation performed during gimplification
1154          creates uninitialized variable uses.  If all is well, these will
1155          be optimized away, so don't warn now.  */
1156       if (TREE_CODE (TREE_OPERAND (t, 0)) == SSA_NAME)
1157         *walk_subtrees = 0;
1158       break;
1159
1160     default:
1161       if (IS_TYPE_OR_DECL_P (t))
1162         *walk_subtrees = 0;
1163       break;
1164     }
1165
1166   return NULL_TREE;
1167 }
1168
1169 /* Look for inputs to PHI that are SSA_NAMEs that have empty definitions
1170    and warn about them.  */
1171
1172 static void
1173 warn_uninitialized_phi (tree phi)
1174 {
1175   int i, n = PHI_NUM_ARGS (phi);
1176
1177   /* Don't look at memory tags.  */
1178   if (!is_gimple_reg (PHI_RESULT (phi)))
1179     return;
1180
1181   for (i = 0; i < n; ++i)
1182     {
1183       tree op = PHI_ARG_DEF (phi, i);
1184       if (TREE_CODE (op) == SSA_NAME)
1185         warn_uninit (op, "%H%qD may be used uninitialized in this function",
1186                      NULL);
1187     }
1188 }
1189
1190 static unsigned int
1191 execute_early_warn_uninitialized (void)
1192 {
1193   block_stmt_iterator bsi;
1194   basic_block bb;
1195
1196   FOR_EACH_BB (bb)
1197     for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
1198       {
1199         tree context = bsi_stmt (bsi);
1200         walk_tree (bsi_stmt_ptr (bsi), warn_uninitialized_var,
1201                    context, NULL);
1202       }
1203   return 0;
1204 }
1205
1206 static unsigned int
1207 execute_late_warn_uninitialized (void)
1208 {
1209   basic_block bb;
1210   tree phi;
1211
1212   /* Re-do the plain uninitialized variable check, as optimization may have
1213      straightened control flow.  Do this first so that we don't accidentally
1214      get a "may be" warning when we'd have seen an "is" warning later.  */
1215   execute_early_warn_uninitialized ();
1216
1217   FOR_EACH_BB (bb)
1218     for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
1219       warn_uninitialized_phi (phi);
1220   return 0;
1221 }
1222
1223 static bool
1224 gate_warn_uninitialized (void)
1225 {
1226   return warn_uninitialized != 0;
1227 }
1228
1229 struct tree_opt_pass pass_early_warn_uninitialized =
1230 {
1231   NULL,                                 /* name */
1232   gate_warn_uninitialized,              /* gate */
1233   execute_early_warn_uninitialized,     /* execute */
1234   NULL,                                 /* sub */
1235   NULL,                                 /* next */
1236   0,                                    /* static_pass_number */
1237   0,                                    /* tv_id */
1238   PROP_ssa,                             /* properties_required */
1239   0,                                    /* properties_provided */
1240   0,                                    /* properties_destroyed */
1241   0,                                    /* todo_flags_start */
1242   0,                                    /* todo_flags_finish */
1243   0                                     /* letter */
1244 };
1245
1246 struct tree_opt_pass pass_late_warn_uninitialized =
1247 {
1248   NULL,                                 /* name */
1249   gate_warn_uninitialized,              /* gate */
1250   execute_late_warn_uninitialized,      /* execute */
1251   NULL,                                 /* sub */
1252   NULL,                                 /* next */
1253   0,                                    /* static_pass_number */
1254   0,                                    /* tv_id */
1255   PROP_ssa,                             /* properties_required */
1256   0,                                    /* properties_provided */
1257   0,                                    /* properties_destroyed */
1258   0,                                    /* todo_flags_start */
1259   0,                                    /* todo_flags_finish */
1260   0                                     /* letter */
1261 };