OSDN Git Service

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