OSDN Git Service

Fix linux make profiledbootstrap.
[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       size_t j;
352       var_ann_t ann;
353       varray_type may_aliases;
354
355       var = referenced_var (i);
356       ann = var_ann (var);
357       may_aliases = ann->may_aliases;
358
359       for (j = 0; may_aliases && j < VARRAY_ACTIVE_SIZE (may_aliases); j++)
360         {
361           tree alias = VARRAY_TREE (may_aliases, j);
362
363           bitmap_set_bit (visited, var_ann (alias)->uid);
364
365           if (!may_be_aliased (alias))
366             {
367               error ("Non-addressable variable inside an alias set.");
368               debug_variable (alias);
369               goto err;
370             }
371         }
372     }
373
374   for (i = 0; i < num_referenced_vars; i++)
375     {
376       var_ann_t ann;
377
378       var = referenced_var (i);
379       ann = var_ann (var);
380
381       if (ann->mem_tag_kind == NOT_A_TAG
382           && ann->is_alias_tag
383           && !bitmap_bit_p (visited, ann->uid))
384         {
385           error ("Addressable variable that is an alias tag but is not in any alias set.");
386           goto err;
387         }
388     }
389
390   BITMAP_XFREE (visited);
391   return;
392
393 err:
394   debug_variable (var);
395   internal_error ("verify_flow_insensitive_alias_info failed.");
396 }
397
398
399 static void
400 verify_flow_sensitive_alias_info (void)
401 {
402   size_t i;
403   tree ptr;
404
405   for (i = 1; i < num_ssa_names; i++)
406     {
407       var_ann_t ann;
408       struct ptr_info_def *pi;
409
410       ptr = ssa_name (i);
411       ann = var_ann (SSA_NAME_VAR (ptr));
412       pi = SSA_NAME_PTR_INFO (ptr);
413
414       /* We only care for pointers that are actually referenced in the
415          program.  */
416       if (!TREE_VISITED (ptr) || !POINTER_TYPE_P (TREE_TYPE (ptr)))
417         continue;
418
419       /* RESULT_DECL is special.  If it's a GIMPLE register, then it
420          is only written-to only once in the return statement.
421          Otherwise, aggregate RESULT_DECLs may be written-to more than
422          once in virtual operands.  */
423       if (TREE_CODE (SSA_NAME_VAR (ptr)) == RESULT_DECL
424           && is_gimple_reg (ptr))
425         continue;
426
427       if (pi == NULL)
428         continue;
429
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
439               || bitmap_first_set_bit (pi->pt_vars) < 0))
440         {
441           error ("Pointers with a memory tag, should have points-to sets or point to malloc");
442           goto err;
443         }
444
445       if (pi->value_escapes_p
446           && pi->name_mem_tag
447           && !is_call_clobbered (pi->name_mem_tag))
448         {
449           error ("Pointer escapes but its name tag is not call-clobbered.");
450           goto err;
451         }
452
453       if (pi->name_mem_tag && pi->pt_vars)
454         {
455           size_t j;
456
457           for (j = i + 1; j < num_ssa_names; j++)
458             {
459               tree ptr2 = ssa_name (j);
460               struct ptr_info_def *pi2 = SSA_NAME_PTR_INFO (ptr2);
461
462               if (!TREE_VISITED (ptr2) || !POINTER_TYPE_P (TREE_TYPE (ptr2)))
463                 continue;
464
465               if (pi2
466                   && pi2->name_mem_tag
467                   && pi2->pt_vars
468                   && bitmap_first_set_bit (pi2->pt_vars) >= 0
469                   && pi->name_mem_tag != pi2->name_mem_tag
470                   && bitmap_equal_p (pi->pt_vars, pi2->pt_vars))
471                 {
472                   error ("Two pointers with different name tags and identical points-to sets");
473                   debug_variable (ptr2);
474                   goto err;
475                 }
476             }
477         }
478     }
479
480   return;
481
482 err:
483   debug_variable (ptr);
484   internal_error ("verify_flow_sensitive_alias_info failed.");
485 }
486
487
488 /* Verify the consistency of aliasing information.  */
489
490 static void
491 verify_alias_info (void)
492 {
493   verify_flow_sensitive_alias_info ();
494   verify_flow_insensitive_alias_info ();
495 }
496
497
498 /* Verify common invariants in the SSA web.
499    TODO: verify the variable annotations.  */
500
501 void
502 verify_ssa (void)
503 {
504   size_t i;
505   basic_block bb;
506   basic_block *definition_block = xcalloc (num_ssa_names, sizeof (basic_block));
507
508   timevar_push (TV_TREE_SSA_VERIFY);
509
510   /* Keep track of SSA names present in the IL.  */
511   for (i = 1; i < num_ssa_names; i++)
512     TREE_VISITED (ssa_name (i)) = 0;
513
514   calculate_dominance_info (CDI_DOMINATORS);
515
516   /* Verify and register all the SSA_NAME definitions found in the
517      function.  */
518   FOR_EACH_BB (bb)
519     {
520       tree phi;
521       block_stmt_iterator bsi;
522
523       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
524         if (verify_def (bb, definition_block, PHI_RESULT (phi), phi,
525                         !is_gimple_reg (PHI_RESULT (phi))))
526           goto err;
527
528       for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
529         {
530           tree stmt;
531           stmt_ann_t ann;
532           unsigned int j;
533           v_may_def_optype v_may_defs;
534           v_must_def_optype v_must_defs;
535           def_optype defs;
536
537           stmt = bsi_stmt (bsi);
538           ann = stmt_ann (stmt);
539           get_stmt_operands (stmt);
540
541           v_may_defs = V_MAY_DEF_OPS (ann);
542           if (ann->makes_aliased_stores && NUM_V_MAY_DEFS (v_may_defs) == 0)
543             {
544               error ("Statement makes aliased stores, but has no V_MAY_DEFS");
545               debug_generic_stmt (stmt);
546               goto err;
547             }
548             
549           for (j = 0; j < NUM_V_MAY_DEFS (v_may_defs); j++)
550             {
551               tree op = V_MAY_DEF_RESULT (v_may_defs, j);
552               if (verify_def (bb, definition_block, op, stmt, true))
553                 goto err;
554             }
555           
556           v_must_defs = STMT_V_MUST_DEF_OPS (stmt);
557           for (j = 0; j < NUM_V_MUST_DEFS (v_must_defs); j++)
558             {
559               tree op = V_MUST_DEF_OP (v_must_defs, j);
560               if (verify_def (bb, definition_block, op, stmt, true))
561                 goto err;
562             }
563
564           defs = DEF_OPS (ann);
565           for (j = 0; j < NUM_DEFS (defs); j++)
566             {
567               tree op = DEF_OP (defs, j);
568               if (verify_def (bb, definition_block, op, stmt, false))
569                 goto err;
570             }
571         }
572     }
573
574
575   /* Now verify all the uses and make sure they agree with the definitions
576      found in the previous pass.  */
577   FOR_EACH_BB (bb)
578     {
579       edge e;
580       tree phi;
581       block_stmt_iterator bsi;
582
583       /* Make sure that all edges have a clear 'aux' field.  */
584       for (e = bb->pred; e; e = e->pred_next)
585         {
586           if (e->aux)
587             {
588               error ("AUX pointer initialized for edge %d->%d\n", e->src->index,
589                       e->dest->index);
590               goto err;
591             }
592         }
593
594       /* Verify the arguments for every PHI node in the block.  */
595       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
596         if (verify_phi_args (phi, bb, definition_block))
597           goto err;
598
599       /* Now verify all the uses and vuses in every statement of the block.  */
600       for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
601         {
602           tree stmt = bsi_stmt (bsi);
603           stmt_ann_t ann = stmt_ann (stmt);
604           unsigned int j;
605           vuse_optype vuses;
606           v_may_def_optype v_may_defs;
607           use_optype uses;
608
609           vuses = VUSE_OPS (ann); 
610           for (j = 0; j < NUM_VUSES (vuses); j++)
611             {
612               tree op = VUSE_OP (vuses, j);
613               if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
614                               op, stmt, false, true))
615                 goto err;
616             }
617
618           v_may_defs = V_MAY_DEF_OPS (ann);
619           for (j = 0; j < NUM_V_MAY_DEFS (v_may_defs); j++)
620             {
621               tree op = V_MAY_DEF_OP (v_may_defs, j);
622               if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
623                               op, stmt, false, true))
624                 goto err;
625             }
626
627           uses = USE_OPS (ann);
628           for (j = 0; j < NUM_USES (uses); j++)
629             {
630               tree op = USE_OP (uses, j);
631               if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
632                               op, stmt, false, false))
633                 goto err;
634             }
635         }
636     }
637
638   /* Finally, verify alias information.  */
639   verify_alias_info ();
640
641   free (definition_block);
642   timevar_pop (TV_TREE_SSA_VERIFY);
643   return;
644
645 err:
646   internal_error ("verify_ssa failed.");
647 }
648
649
650 /* Initialize global DFA and SSA structures.  */
651
652 void
653 init_tree_ssa (void)
654 {
655   VARRAY_TREE_INIT (referenced_vars, 20, "referenced_vars");
656   call_clobbered_vars = BITMAP_XMALLOC ();
657   addressable_vars = BITMAP_XMALLOC ();
658   init_ssa_operands ();
659   init_ssanames ();
660   init_phinodes ();
661   global_var = NULL_TREE;
662 }
663
664
665 /* Deallocate memory associated with SSA data structures for FNDECL.  */
666
667 void
668 delete_tree_ssa (void)
669 {
670   size_t i;
671   basic_block bb;
672   block_stmt_iterator bsi;
673
674   /* Remove annotations from every tree in the function.  */
675   FOR_EACH_BB (bb)
676     for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
677       bsi_stmt (bsi)->common.ann = NULL;
678
679   /* Remove annotations from every referenced variable.  */
680   if (referenced_vars)
681     {
682       for (i = 0; i < num_referenced_vars; i++)
683         referenced_var (i)->common.ann = NULL;
684       referenced_vars = NULL;
685     }
686
687   fini_ssanames ();
688   fini_phinodes ();
689   fini_ssa_operands ();
690
691   global_var = NULL_TREE;
692   BITMAP_XFREE (call_clobbered_vars);
693   call_clobbered_vars = NULL;
694   BITMAP_XFREE (addressable_vars);
695   addressable_vars = NULL;
696 }
697
698
699 /* Return true if EXPR is a useless type conversion, otherwise return
700    false.  */
701
702 bool
703 tree_ssa_useless_type_conversion_1 (tree outer_type, tree inner_type)
704 {
705   /* If the inner and outer types are effectively the same, then
706      strip the type conversion and enter the equivalence into
707      the table.  */
708   if (inner_type == outer_type
709      || (lang_hooks.types_compatible_p (inner_type, outer_type)))
710     return true;
711
712   /* If both types are pointers and the outer type is a (void *), then
713      the conversion is not necessary.  The opposite is not true since
714      that conversion would result in a loss of information if the
715      equivalence was used.  Consider an indirect function call where
716      we need to know the exact type of the function to correctly
717      implement the ABI.  */
718   else if (POINTER_TYPE_P (inner_type)
719            && POINTER_TYPE_P (outer_type)
720            && TREE_CODE (TREE_TYPE (outer_type)) == VOID_TYPE)
721     return true;
722
723   /* Pointers and references are equivalent once we get to GENERIC,
724      so strip conversions that just switch between them.  */
725   else if (POINTER_TYPE_P (inner_type)
726            && POINTER_TYPE_P (outer_type)
727            && lang_hooks.types_compatible_p (TREE_TYPE (inner_type),
728                                              TREE_TYPE (outer_type)))
729     return true;
730
731   /* If both the inner and outer types are integral types, then the
732      conversion is not necessary if they have the same mode and
733      signedness and precision, and both or neither are boolean.  Some
734      code assumes an invariant that boolean types stay boolean and do
735      not become 1-bit bit-field types.  Note that types with precision
736      not using all bits of the mode (such as bit-field types in C)
737      mean that testing of precision is necessary.  */
738   else if (INTEGRAL_TYPE_P (inner_type)
739            && INTEGRAL_TYPE_P (outer_type)
740            && TYPE_MODE (inner_type) == TYPE_MODE (outer_type)
741            && TYPE_UNSIGNED (inner_type) == TYPE_UNSIGNED (outer_type)
742            && TYPE_PRECISION (inner_type) == TYPE_PRECISION (outer_type))
743     {
744       bool first_boolean = (TREE_CODE (inner_type) == BOOLEAN_TYPE);
745       bool second_boolean = (TREE_CODE (outer_type) == BOOLEAN_TYPE);
746       if (first_boolean == second_boolean)
747         return true;
748     }
749
750   /* Recurse for complex types.  */
751   else if (TREE_CODE (inner_type) == COMPLEX_TYPE
752            && TREE_CODE (outer_type) == COMPLEX_TYPE
753            && tree_ssa_useless_type_conversion_1 (TREE_TYPE (outer_type),
754                                                   TREE_TYPE (inner_type)))
755     return true;
756
757   return false;
758 }
759
760 /* Return true if EXPR is a useless type conversion, otherwise return
761    false.  */
762
763 bool
764 tree_ssa_useless_type_conversion (tree expr)
765 {
766   /* If we have an assignment that merely uses a NOP_EXPR to change
767      the top of the RHS to the type of the LHS and the type conversion
768      is "safe", then strip away the type conversion so that we can
769      enter LHS = RHS into the const_and_copies table.  */
770   if (TREE_CODE (expr) == NOP_EXPR || TREE_CODE (expr) == CONVERT_EXPR
771       || TREE_CODE (expr) == VIEW_CONVERT_EXPR
772       || TREE_CODE (expr) == NON_LVALUE_EXPR)
773     return tree_ssa_useless_type_conversion_1 (TREE_TYPE (expr),
774                                                TREE_TYPE (TREE_OPERAND (expr,
775                                                                         0)));
776
777
778   return false;
779 }
780
781
782 /* Internal helper for walk_use_def_chains.  VAR, FN and DATA are as
783    described in walk_use_def_chains.
784    
785    VISITED is a bitmap used to mark visited SSA_NAMEs to avoid
786       infinite loops.
787
788    IS_DFS is true if the caller wants to perform a depth-first search
789       when visiting PHI nodes.  A DFS will visit each PHI argument and
790       call FN after each one.  Otherwise, all the arguments are
791       visited first and then FN is called with each of the visited
792       arguments in a separate pass.  */
793
794 static bool
795 walk_use_def_chains_1 (tree var, walk_use_def_chains_fn fn, void *data,
796                        bitmap visited, bool is_dfs)
797 {
798   tree def_stmt;
799
800   if (bitmap_bit_p (visited, SSA_NAME_VERSION (var)))
801     return false;
802
803   bitmap_set_bit (visited, SSA_NAME_VERSION (var));
804
805   def_stmt = SSA_NAME_DEF_STMT (var);
806
807   if (TREE_CODE (def_stmt) != PHI_NODE)
808     {
809       /* If we reached the end of the use-def chain, call FN.  */
810       return fn (var, def_stmt, data);
811     }
812   else
813     {
814       int i;
815
816       /* When doing a breadth-first search, call FN before following the
817          use-def links for each argument.  */
818       if (!is_dfs)
819         for (i = 0; i < PHI_NUM_ARGS (def_stmt); i++)
820           if (fn (PHI_ARG_DEF (def_stmt, i), def_stmt, data))
821             return true;
822
823       /* Follow use-def links out of each PHI argument.  */
824       for (i = 0; i < PHI_NUM_ARGS (def_stmt); i++)
825         {
826           tree arg = PHI_ARG_DEF (def_stmt, i);
827           if (TREE_CODE (arg) == SSA_NAME
828               && walk_use_def_chains_1 (arg, fn, data, visited, is_dfs))
829             return true;
830         }
831
832       /* When doing a depth-first search, call FN after following the
833          use-def links for each argument.  */
834       if (is_dfs)
835         for (i = 0; i < PHI_NUM_ARGS (def_stmt); i++)
836           if (fn (PHI_ARG_DEF (def_stmt, i), def_stmt, data))
837             return true;
838     }
839   
840   return false;
841 }
842   
843
844
845 /* Walk use-def chains starting at the SSA variable VAR.  Call
846    function FN at each reaching definition found.  FN takes three
847    arguments: VAR, its defining statement (DEF_STMT) and a generic
848    pointer to whatever state information that FN may want to maintain
849    (DATA).  FN is able to stop the walk by returning true, otherwise
850    in order to continue the walk, FN should return false.  
851
852    Note, that if DEF_STMT is a PHI node, the semantics are slightly
853    different.  The first argument to FN is no longer the original
854    variable VAR, but the PHI argument currently being examined.  If FN
855    wants to get at VAR, it should call PHI_RESULT (PHI).
856
857    If IS_DFS is true, this function will:
858
859         1- walk the use-def chains for all the PHI arguments, and,
860         2- call (*FN) (ARG, PHI, DATA) on all the PHI arguments.
861
862    If IS_DFS is false, the two steps above are done in reverse order
863    (i.e., a breadth-first search).  */
864
865
866 void
867 walk_use_def_chains (tree var, walk_use_def_chains_fn fn, void *data,
868                      bool is_dfs)
869 {
870   tree def_stmt;
871
872 #if defined ENABLE_CHECKING
873   if (TREE_CODE (var) != SSA_NAME)
874     abort ();
875 #endif
876
877   def_stmt = SSA_NAME_DEF_STMT (var);
878
879   /* We only need to recurse if the reaching definition comes from a PHI
880      node.  */
881   if (TREE_CODE (def_stmt) != PHI_NODE)
882     (*fn) (var, def_stmt, data);
883   else
884     {
885       bitmap visited = BITMAP_XMALLOC ();
886       walk_use_def_chains_1 (var, fn, data, visited, is_dfs);
887       BITMAP_XFREE (visited);
888     }
889 }
890
891
892 /* Replaces VAR with REPL in memory reference expression *X in
893    statement STMT.  */
894
895 static void
896 propagate_into_addr (tree stmt, tree var, tree *x, tree repl)
897 {
898   tree new_var, ass_stmt, addr_var;
899   basic_block bb;
900   block_stmt_iterator bsi;
901
902   /* There is nothing special to handle in the other cases.  */
903   if (TREE_CODE (repl) != ADDR_EXPR)
904     return;
905   addr_var = TREE_OPERAND (repl, 0);
906
907   while (TREE_CODE (*x) == ARRAY_REF
908          || TREE_CODE (*x) == COMPONENT_REF
909          || TREE_CODE (*x) == BIT_FIELD_REF)
910     x = &TREE_OPERAND (*x, 0);
911
912   if (TREE_CODE (*x) != INDIRECT_REF
913       || TREE_OPERAND (*x, 0) != var)
914     return;
915
916   if (TREE_TYPE (*x) == TREE_TYPE (addr_var))
917     {
918       *x = addr_var;
919       mark_new_vars_to_rename (stmt, vars_to_rename);
920       return;
921     }
922
923
924   /* Frontends sometimes produce expressions like *&a instead of a[0].
925      Create a temporary variable to handle this case.  */
926   ass_stmt = build2 (MODIFY_EXPR, void_type_node, NULL_TREE, repl);
927   new_var = duplicate_ssa_name (var, ass_stmt);
928   TREE_OPERAND (*x, 0) = new_var;
929   TREE_OPERAND (ass_stmt, 0) = new_var;
930
931   bb = bb_for_stmt (stmt);
932   tree_block_label (bb);
933   bsi = bsi_after_labels (bb);
934   bsi_insert_after (&bsi, ass_stmt, BSI_NEW_STMT);
935
936   mark_new_vars_to_rename (stmt, vars_to_rename);
937 }
938
939 /* Replaces immediate uses of VAR by REPL.  */
940
941 static void
942 replace_immediate_uses (tree var, tree repl)
943 {
944   use_optype uses;
945   vuse_optype vuses;
946   v_may_def_optype v_may_defs;
947   int i, j, n;
948   dataflow_t df;
949   tree stmt;
950   stmt_ann_t ann;
951   bool mark_new_vars;
952
953   df = get_immediate_uses (SSA_NAME_DEF_STMT (var));
954   n = num_immediate_uses (df);
955
956   for (i = 0; i < n; i++)
957     {
958       stmt = immediate_use (df, i);
959       ann = stmt_ann (stmt);
960
961       if (TREE_CODE (stmt) == PHI_NODE)
962         {
963           for (j = 0; j < PHI_NUM_ARGS (stmt); j++)
964             if (PHI_ARG_DEF (stmt, j) == var)
965               {
966                 SET_PHI_ARG_DEF (stmt, j, repl);
967                 if (TREE_CODE (repl) == SSA_NAME
968                     && PHI_ARG_EDGE (stmt, j)->flags & EDGE_ABNORMAL)
969                   SSA_NAME_OCCURS_IN_ABNORMAL_PHI (repl) = 1;
970               }
971
972           continue;
973         }
974
975       get_stmt_operands (stmt);
976       mark_new_vars = false;
977       if (is_gimple_reg (SSA_NAME_VAR (var)))
978         {
979           if (TREE_CODE (stmt) == MODIFY_EXPR)
980             {
981               propagate_into_addr (stmt, var, &TREE_OPERAND (stmt, 0), repl);
982               propagate_into_addr (stmt, var, &TREE_OPERAND (stmt, 1), repl);
983             }
984
985           uses = USE_OPS (ann);
986           for (j = 0; j < (int) NUM_USES (uses); j++)
987             if (USE_OP (uses, j) == var)
988               {
989                 propagate_value (USE_OP_PTR (uses, j), repl);
990                 mark_new_vars = POINTER_TYPE_P (TREE_TYPE (repl));
991               }
992         }
993       else
994         {
995           vuses = VUSE_OPS (ann);
996           for (j = 0; j < (int) NUM_VUSES (vuses); j++)
997             if (VUSE_OP (vuses, j) == var)
998               propagate_value (VUSE_OP_PTR (vuses, j), repl);
999
1000           v_may_defs = V_MAY_DEF_OPS (ann);
1001           for (j = 0; j < (int) NUM_V_MAY_DEFS (v_may_defs); j++)
1002             if (V_MAY_DEF_OP (v_may_defs, j) == var)
1003               propagate_value (V_MAY_DEF_OP_PTR (v_may_defs, j), repl);
1004         }
1005
1006       /* If REPL is a pointer, it may have different memory tags associated
1007          with it.  For instance, VAR may have had a name tag while REPL
1008          only had a type tag.  In these cases, the virtual operands (if
1009          any) in the statement will refer to different symbols which need
1010          to be renamed.  */
1011       if (mark_new_vars)
1012         mark_new_vars_to_rename (stmt, vars_to_rename);
1013       else
1014         modify_stmt (stmt);
1015     }
1016 }
1017
1018 /* Gets the value VAR is equivalent to according to EQ_TO.  */
1019
1020 static tree
1021 get_eq_name (tree *eq_to, tree var)
1022 {
1023   unsigned ver;
1024   tree val = var;
1025
1026   while (TREE_CODE (val) == SSA_NAME)
1027     {
1028       ver = SSA_NAME_VERSION (val);
1029       if (!eq_to[ver])
1030         break;
1031
1032       val = eq_to[ver];
1033     }
1034
1035   while (TREE_CODE (var) == SSA_NAME)
1036     {
1037       ver = SSA_NAME_VERSION (var);
1038       if (!eq_to[ver])
1039         break;
1040
1041       var = eq_to[ver];
1042       eq_to[ver] = val;
1043     }
1044
1045   return val;
1046 }
1047
1048 /* Checks whether phi node PHI is redundant and if it is, records the ssa name
1049    its result is redundant to to EQ_TO array.  */
1050
1051 static void
1052 check_phi_redundancy (tree phi, tree *eq_to)
1053 {
1054   tree val = NULL_TREE, def, res = PHI_RESULT (phi), stmt;
1055   unsigned i, ver = SSA_NAME_VERSION (res), n;
1056   dataflow_t df;
1057
1058   /* It is unlikely that such large phi node would be redundant.  */
1059   if (PHI_NUM_ARGS (phi) > 16)
1060     return;
1061
1062   for (i = 0; i < (unsigned) PHI_NUM_ARGS (phi); i++)
1063     {
1064       def = PHI_ARG_DEF (phi, i);
1065
1066       if (TREE_CODE (def) == SSA_NAME)
1067         {
1068           def = get_eq_name (eq_to, def);
1069           if (def == res)
1070             continue;
1071         }
1072
1073       if (val
1074           && !operand_equal_p (val, def, 0))
1075         return;
1076
1077       val = def;
1078     }
1079
1080   /* At least one of the arguments should not be equal to the result, or
1081      something strange is happening.  */
1082   if (!val)
1083     abort ();
1084
1085   if (get_eq_name (eq_to, res) == val)
1086     return;
1087
1088   if (!may_propagate_copy (res, val))
1089     return;
1090
1091   eq_to[ver] = val;
1092
1093   df = get_immediate_uses (SSA_NAME_DEF_STMT (res));
1094   n = num_immediate_uses (df);
1095
1096   for (i = 0; i < n; i++)
1097     {
1098       stmt = immediate_use (df, i);
1099
1100       if (TREE_CODE (stmt) == PHI_NODE)
1101         check_phi_redundancy (stmt, eq_to);
1102     }
1103 }
1104
1105 /* Removes redundant phi nodes.
1106
1107    A redundant PHI node is a PHI node where all of its PHI arguments
1108    are the same value, excluding any PHI arguments which are the same
1109    as the PHI result.
1110
1111    A redundant PHI node is effectively a copy, so we forward copy propagate
1112    which removes all uses of the destination of the PHI node then
1113    finally we delete the redundant PHI node.
1114
1115    Note that if we can not copy propagate the PHI node, then the PHI
1116    will not be removed.  Thus we do not have to worry about dependencies
1117    between PHIs and the problems serializing PHIs into copies creates. 
1118    
1119    The most important effect of this pass is to remove degenerate PHI
1120    nodes created by removing unreachable code.  */
1121
1122 void
1123 kill_redundant_phi_nodes (void)
1124 {
1125   tree *eq_to;
1126   unsigned i, old_num_ssa_names;
1127   basic_block bb;
1128   tree phi, var, repl, stmt;
1129
1130   /* The EQ_TO[VER] holds the value by that the ssa name VER should be
1131      replaced.  If EQ_TO[VER] is ssa name and it is decided to replace it by
1132      other value, it may be necessary to follow the chain till the final value.
1133      We perform path shortening (replacing the entries of the EQ_TO array with
1134      heads of these chains) whenever we access the field to prevent quadratic
1135      complexity (probably would not occur in practice anyway, but let us play
1136      it safe).  */
1137   eq_to = xcalloc (num_ssa_names, sizeof (tree));
1138
1139   /* We have had cases where computing immediate uses takes a
1140      significant amount of compile time.  If we run into such
1141      problems here, we may want to only compute immediate uses for
1142      a subset of all the SSA_NAMEs instead of computing it for
1143      all of the SSA_NAMEs.  */
1144   compute_immediate_uses (TDFA_USE_OPS | TDFA_USE_VOPS, NULL);
1145   old_num_ssa_names = num_ssa_names;
1146
1147   FOR_EACH_BB (bb)
1148     {
1149       for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
1150         {
1151           var = PHI_RESULT (phi);
1152           check_phi_redundancy (phi, eq_to);
1153         }
1154     }
1155
1156   /* Now propagate the values.  */
1157   for (i = 0; i < old_num_ssa_names; i++)
1158     {
1159       if (!ssa_name (i))
1160         continue;
1161
1162       repl = get_eq_name (eq_to, ssa_name (i));
1163       if (repl != ssa_name (i))
1164         replace_immediate_uses (ssa_name (i), repl);
1165     }
1166
1167   /* And remove the dead phis.  */
1168   for (i = 0; i < old_num_ssa_names; i++)
1169     {
1170       if (!ssa_name (i))
1171         continue;
1172
1173       repl = get_eq_name (eq_to, ssa_name (i));
1174       if (repl != ssa_name (i))
1175         {
1176           stmt = SSA_NAME_DEF_STMT (ssa_name (i));
1177           remove_phi_node (stmt, NULL_TREE, bb_for_stmt (stmt));
1178         }
1179     }
1180
1181   free_df ();
1182   free (eq_to);
1183 }
1184
1185 struct tree_opt_pass pass_redundant_phi =
1186 {
1187   "redphi",                             /* name */
1188   NULL,                                 /* gate */
1189   kill_redundant_phi_nodes,             /* execute */
1190   NULL,                                 /* sub */
1191   NULL,                                 /* next */
1192   0,                                    /* static_pass_number */
1193   0,                                    /* tv_id */
1194   PROP_cfg | PROP_ssa | PROP_alias,     /* properties_required */
1195   0,                                    /* properties_provided */
1196   0,                                    /* properties_destroyed */
1197   0,                                    /* todo_flags_start */
1198   TODO_dump_func | TODO_rename_vars 
1199     | TODO_ggc_collect | TODO_verify_ssa /* todo_flags_finish */
1200 };
1201 \f
1202 /* Emit warnings for uninitialized variables.  This is done in two passes.
1203
1204    The first pass notices real uses of SSA names with default definitions.
1205    Such uses are unconditionally uninitialized, and we can be certain that
1206    such a use is a mistake.  This pass is run before most optimizations,
1207    so that we catch as many as we can.
1208
1209    The second pass follows PHI nodes to find uses that are potentially
1210    uninitialized.  In this case we can't necessarily prove that the use
1211    is really uninitialized.  This pass is run after most optimizations,
1212    so that we thread as many jumps and possible, and delete as much dead
1213    code as possible, in order to reduce false positives.  We also look
1214    again for plain uninitialized variables, since optimization may have
1215    changed conditionally uninitialized to unconditionally uninitialized.  */
1216
1217 /* Emit a warning for T, an SSA_NAME, being uninitialized.  The exact
1218    warning text is in MSGID and LOCUS may contain a location or be null.  */
1219
1220 static void
1221 warn_uninit (tree t, const char *msgid, location_t *locus)
1222 {
1223   tree var = SSA_NAME_VAR (t);
1224   tree def = SSA_NAME_DEF_STMT (t);
1225
1226   /* Default uses (indicated by an empty definition statement),
1227      are uninitialized.  */
1228   if (!IS_EMPTY_STMT (def))
1229     return;
1230
1231   /* Except for PARMs of course, which are always initialized.  */
1232   if (TREE_CODE (var) == PARM_DECL)
1233     return;
1234
1235   /* Hard register variables get their initial value from the ether.  */
1236   if (DECL_HARD_REGISTER (var))
1237     return;
1238
1239   /* TREE_NO_WARNING either means we already warned, or the front end
1240      wishes to suppress the warning.  */
1241   if (TREE_NO_WARNING (var))
1242     return;
1243
1244   if (!locus)
1245     locus = &DECL_SOURCE_LOCATION (var);
1246   warning (msgid, locus, var);
1247   TREE_NO_WARNING (var) = 1;
1248 }
1249    
1250 /* Called via walk_tree, look for SSA_NAMEs that have empty definitions
1251    and warn about them.  */
1252
1253 static tree
1254 warn_uninitialized_var (tree *tp, int *walk_subtrees, void *data)
1255 {
1256   location_t *locus = data;
1257   tree t = *tp;
1258
1259   /* We only do data flow with SSA_NAMEs, so that's all we can warn about.  */
1260   if (TREE_CODE (t) == SSA_NAME)
1261     {
1262       warn_uninit (t, "%H'%D' is used uninitialized in this function", locus);
1263       *walk_subtrees = 0;
1264     }
1265   else if (DECL_P (t) || TYPE_P (t))
1266     *walk_subtrees = 0;
1267
1268   return NULL_TREE;
1269 }
1270
1271 /* Look for inputs to PHI that are SSA_NAMEs that have empty definitions
1272    and warn about them.  */
1273
1274 static void
1275 warn_uninitialized_phi (tree phi)
1276 {
1277   int i, n = PHI_NUM_ARGS (phi);
1278
1279   /* Don't look at memory tags.  */
1280   if (!is_gimple_reg (PHI_RESULT (phi)))
1281     return;
1282
1283   for (i = 0; i < n; ++i)
1284     {
1285       tree op = PHI_ARG_DEF (phi, i);
1286       if (TREE_CODE (op) == SSA_NAME)
1287         warn_uninit (op, "%H'%D' may be used uninitialized in this function",
1288                      NULL);
1289     }
1290 }
1291
1292 static void
1293 execute_early_warn_uninitialized (void)
1294 {
1295   block_stmt_iterator bsi;
1296   basic_block bb;
1297
1298   FOR_EACH_BB (bb)
1299     for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
1300       walk_tree (bsi_stmt_ptr (bsi), warn_uninitialized_var,
1301                  EXPR_LOCUS (bsi_stmt (bsi)), NULL);
1302 }
1303
1304 static void
1305 execute_late_warn_uninitialized (void)
1306 {
1307   basic_block bb;
1308   tree phi;
1309
1310   /* Re-do the plain uninitialized variable check, as optimization may have
1311      straightened control flow.  Do this first so that we don't accidentally
1312      get a "may be" warning when we'd have seen an "is" warning later.  */
1313   execute_early_warn_uninitialized ();
1314
1315   FOR_EACH_BB (bb)
1316     for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
1317       warn_uninitialized_phi (phi);
1318 }
1319
1320 static bool
1321 gate_warn_uninitialized (void)
1322 {
1323   return warn_uninitialized != 0;
1324 }
1325
1326 struct tree_opt_pass pass_early_warn_uninitialized =
1327 {
1328   NULL,                                 /* name */
1329   gate_warn_uninitialized,              /* gate */
1330   execute_early_warn_uninitialized,     /* execute */
1331   NULL,                                 /* sub */
1332   NULL,                                 /* next */
1333   0,                                    /* static_pass_number */
1334   0,                                    /* tv_id */
1335   PROP_ssa,                             /* properties_required */
1336   0,                                    /* properties_provided */
1337   0,                                    /* properties_destroyed */
1338   0,                                    /* todo_flags_start */
1339   0                                     /* todo_flags_finish */
1340 };
1341
1342 struct tree_opt_pass pass_late_warn_uninitialized =
1343 {
1344   NULL,                                 /* name */
1345   gate_warn_uninitialized,              /* gate */
1346   execute_late_warn_uninitialized,      /* execute */
1347   NULL,                                 /* sub */
1348   NULL,                                 /* next */
1349   0,                                    /* static_pass_number */
1350   0,                                    /* tv_id */
1351   PROP_ssa,                             /* properties_required */
1352   0,                                    /* properties_provided */
1353   0,                                    /* properties_destroyed */
1354   0,                                    /* todo_flags_start */
1355   0                                     /* todo_flags_finish */
1356 };