OSDN Git Service

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