OSDN Git Service

2011-03-17 Richard Guenther <rguenther@suse.de>
[pf3gnuchains/gcc-fork.git] / gcc / tree-ssa.c
1 /* Miscellaneous SSA utility functions.
2    Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010
3    Free Software Foundation, Inc.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
11
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
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 "tm_p.h"
28 #include "target.h"
29 #include "ggc.h"
30 #include "langhooks.h"
31 #include "basic-block.h"
32 #include "output.h"
33 #include "function.h"
34 #include "tree-pretty-print.h"
35 #include "gimple-pretty-print.h"
36 #include "bitmap.h"
37 #include "pointer-set.h"
38 #include "tree-flow.h"
39 #include "gimple.h"
40 #include "tree-inline.h"
41 #include "timevar.h"
42 #include "hashtab.h"
43 #include "tree-dump.h"
44 #include "tree-pass.h"
45 #include "diagnostic-core.h"
46
47 /* Pointer map of variable mappings, keyed by edge.  */
48 static struct pointer_map_t *edge_var_maps;
49
50
51 /* Add a mapping with PHI RESULT and PHI DEF associated with edge E.  */
52
53 void
54 redirect_edge_var_map_add (edge e, tree result, tree def, source_location locus)
55 {
56   void **slot;
57   edge_var_map_vector old_head, head;
58   edge_var_map new_node;
59
60   if (edge_var_maps == NULL)
61     edge_var_maps = pointer_map_create ();
62
63   slot = pointer_map_insert (edge_var_maps, e);
64   old_head = head = (edge_var_map_vector) *slot;
65   if (!head)
66     {
67       head = VEC_alloc (edge_var_map, heap, 5);
68       *slot = head;
69     }
70   new_node.def = def;
71   new_node.result = result;
72   new_node.locus = locus;
73
74   VEC_safe_push (edge_var_map, heap, head, &new_node);
75   if (old_head != head)
76     {
77       /* The push did some reallocation.  Update the pointer map.  */
78       *slot = head;
79     }
80 }
81
82
83 /* Clear the var mappings in edge E.  */
84
85 void
86 redirect_edge_var_map_clear (edge e)
87 {
88   void **slot;
89   edge_var_map_vector head;
90
91   if (!edge_var_maps)
92     return;
93
94   slot = pointer_map_contains (edge_var_maps, e);
95
96   if (slot)
97     {
98       head = (edge_var_map_vector) *slot;
99       VEC_free (edge_var_map, heap, head);
100       *slot = NULL;
101     }
102 }
103
104
105 /* Duplicate the redirected var mappings in OLDE in NEWE.
106
107    Since we can't remove a mapping, let's just duplicate it.  This assumes a
108    pointer_map can have multiple edges mapping to the same var_map (many to
109    one mapping), since we don't remove the previous mappings.  */
110
111 void
112 redirect_edge_var_map_dup (edge newe, edge olde)
113 {
114   void **new_slot, **old_slot;
115   edge_var_map_vector head;
116
117   if (!edge_var_maps)
118     return;
119
120   new_slot = pointer_map_insert (edge_var_maps, newe);
121   old_slot = pointer_map_contains (edge_var_maps, olde);
122   if (!old_slot)
123     return;
124   head = (edge_var_map_vector) *old_slot;
125
126   if (head)
127     *new_slot = VEC_copy (edge_var_map, heap, head);
128   else
129     *new_slot = VEC_alloc (edge_var_map, heap, 5);
130 }
131
132
133 /* Return the variable mappings for a given edge.  If there is none, return
134    NULL.  */
135
136 edge_var_map_vector
137 redirect_edge_var_map_vector (edge e)
138 {
139   void **slot;
140
141   /* Hey, what kind of idiot would... you'd be surprised.  */
142   if (!edge_var_maps)
143     return NULL;
144
145   slot = pointer_map_contains (edge_var_maps, e);
146   if (!slot)
147     return NULL;
148
149   return (edge_var_map_vector) *slot;
150 }
151
152 /* Used by redirect_edge_var_map_destroy to free all memory.  */
153
154 static bool
155 free_var_map_entry (const void *key ATTRIBUTE_UNUSED,
156                     void **value,
157                     void *data ATTRIBUTE_UNUSED)
158 {
159   edge_var_map_vector head = (edge_var_map_vector) *value;
160   VEC_free (edge_var_map, heap, head);
161   return true;
162 }
163
164 /* Clear the edge variable mappings.  */
165
166 void
167 redirect_edge_var_map_destroy (void)
168 {
169   if (edge_var_maps)
170     {
171       pointer_map_traverse (edge_var_maps, free_var_map_entry, NULL);
172       pointer_map_destroy (edge_var_maps);
173       edge_var_maps = NULL;
174     }
175 }
176
177
178 /* Remove the corresponding arguments from the PHI nodes in E's
179    destination block and redirect it to DEST.  Return redirected edge.
180    The list of removed arguments is stored in a vector accessed
181    through edge_var_maps.  */
182
183 edge
184 ssa_redirect_edge (edge e, basic_block dest)
185 {
186   gimple_stmt_iterator gsi;
187   gimple phi;
188
189   redirect_edge_var_map_clear (e);
190
191   /* Remove the appropriate PHI arguments in E's destination block.  */
192   for (gsi = gsi_start_phis (e->dest); !gsi_end_p (gsi); gsi_next (&gsi))
193     {
194       tree def;
195       source_location locus ;
196
197       phi = gsi_stmt (gsi);
198       def = gimple_phi_arg_def (phi, e->dest_idx);
199       locus = gimple_phi_arg_location (phi, e->dest_idx);
200
201       if (def == NULL_TREE)
202         continue;
203
204       redirect_edge_var_map_add (e, gimple_phi_result (phi), def, locus);
205     }
206
207   e = redirect_edge_succ_nodup (e, dest);
208
209   return e;
210 }
211
212
213 /* Add PHI arguments queued in PENDING_STMT list on edge E to edge
214    E->dest.  */
215
216 void
217 flush_pending_stmts (edge e)
218 {
219   gimple phi;
220   edge_var_map_vector v;
221   edge_var_map *vm;
222   int i;
223   gimple_stmt_iterator gsi;
224
225   v = redirect_edge_var_map_vector (e);
226   if (!v)
227     return;
228
229   for (gsi = gsi_start_phis (e->dest), i = 0;
230        !gsi_end_p (gsi) && VEC_iterate (edge_var_map, v, i, vm);
231        gsi_next (&gsi), i++)
232     {
233       tree def;
234
235       phi = gsi_stmt (gsi);
236       def = redirect_edge_var_map_def (vm);
237       add_phi_arg (phi, def, e, redirect_edge_var_map_location (vm));
238     }
239
240   redirect_edge_var_map_clear (e);
241 }
242
243 /* Given a tree for an expression for which we might want to emit
244    locations or values in debug information (generally a variable, but
245    we might deal with other kinds of trees in the future), return the
246    tree that should be used as the variable of a DEBUG_BIND STMT or
247    VAR_LOCATION INSN or NOTE.  Return NULL if VAR is not to be tracked.  */
248
249 tree
250 target_for_debug_bind (tree var)
251 {
252   if (!MAY_HAVE_DEBUG_STMTS)
253     return NULL_TREE;
254
255   if (TREE_CODE (var) != VAR_DECL
256       && TREE_CODE (var) != PARM_DECL)
257     return NULL_TREE;
258
259   if (DECL_HAS_VALUE_EXPR_P (var))
260     return target_for_debug_bind (DECL_VALUE_EXPR (var));
261
262   if (DECL_IGNORED_P (var))
263     return NULL_TREE;
264
265   if (!is_gimple_reg (var))
266     return NULL_TREE;
267
268   return var;
269 }
270
271 /* Called via walk_tree, look for SSA_NAMEs that have already been
272    released.  */
273
274 static tree
275 find_released_ssa_name (tree *tp, int *walk_subtrees, void *data_)
276 {
277   struct walk_stmt_info *wi = (struct walk_stmt_info *) data_;
278
279   if (wi && wi->is_lhs)
280     return NULL_TREE;
281
282   if (TREE_CODE (*tp) == SSA_NAME)
283     {
284       if (SSA_NAME_IN_FREE_LIST (*tp))
285         return *tp;
286
287       *walk_subtrees = 0;
288     }
289   else if (IS_TYPE_OR_DECL_P (*tp))
290     *walk_subtrees = 0;
291
292   return NULL_TREE;
293 }
294
295 /* Insert a DEBUG BIND stmt before the DEF of VAR if VAR is referenced
296    by other DEBUG stmts, and replace uses of the DEF with the
297    newly-created debug temp.  */
298
299 void
300 insert_debug_temp_for_var_def (gimple_stmt_iterator *gsi, tree var)
301 {
302   imm_use_iterator imm_iter;
303   use_operand_p use_p;
304   gimple stmt;
305   gimple def_stmt = NULL;
306   int usecount = 0;
307   tree value = NULL;
308
309   if (!MAY_HAVE_DEBUG_STMTS)
310     return;
311
312   /* If this name has already been registered for replacement, do nothing
313      as anything that uses this name isn't in SSA form.  */
314   if (name_registered_for_update_p (var))
315     return;
316
317   /* Check whether there are debug stmts that reference this variable and,
318      if there are, decide whether we should use a debug temp.  */
319   FOR_EACH_IMM_USE_FAST (use_p, imm_iter, var)
320     {
321       stmt = USE_STMT (use_p);
322
323       if (!gimple_debug_bind_p (stmt))
324         continue;
325
326       if (usecount++)
327         break;
328
329       if (gimple_debug_bind_get_value (stmt) != var)
330         {
331           /* Count this as an additional use, so as to make sure we
332              use a temp unless VAR's definition has a SINGLE_RHS that
333              can be shared.  */
334           usecount++;
335           break;
336         }
337     }
338
339   if (!usecount)
340     return;
341
342   if (gsi)
343     def_stmt = gsi_stmt (*gsi);
344   else
345     def_stmt = SSA_NAME_DEF_STMT (var);
346
347   /* If we didn't get an insertion point, and the stmt has already
348      been removed, we won't be able to insert the debug bind stmt, so
349      we'll have to drop debug information.  */
350   if (gimple_code (def_stmt) == GIMPLE_PHI)
351     {
352       value = degenerate_phi_result (def_stmt);
353       if (value && walk_tree (&value, find_released_ssa_name, NULL, NULL))
354         value = NULL;
355     }
356   else if (is_gimple_assign (def_stmt))
357     {
358       bool no_value = false;
359
360       if (!dom_info_available_p (CDI_DOMINATORS))
361         {
362           struct walk_stmt_info wi;
363
364           memset (&wi, 0, sizeof (wi));
365
366           /* When removing blocks without following reverse dominance
367              order, we may sometimes encounter SSA_NAMEs that have
368              already been released, referenced in other SSA_DEFs that
369              we're about to release.  Consider:
370
371              <bb X>:
372              v_1 = foo;
373
374              <bb Y>:
375              w_2 = v_1 + bar;
376              # DEBUG w => w_2
377
378              If we deleted BB X first, propagating the value of w_2
379              won't do us any good.  It's too late to recover their
380              original definition of v_1: when it was deleted, it was
381              only referenced in other DEFs, it couldn't possibly know
382              it should have been retained, and propagating every
383              single DEF just in case it might have to be propagated
384              into a DEBUG STMT would probably be too wasteful.
385
386              When dominator information is not readily available, we
387              check for and accept some loss of debug information.  But
388              if it is available, there's no excuse for us to remove
389              blocks in the wrong order, so we don't even check for
390              dead SSA NAMEs.  SSA verification shall catch any
391              errors.  */
392           if ((!gsi && !gimple_bb (def_stmt))
393               || walk_gimple_op (def_stmt, find_released_ssa_name, &wi))
394             no_value = true;
395         }
396
397       if (!no_value)
398         value = gimple_assign_rhs_to_tree (def_stmt);
399     }
400
401   if (value)
402     {
403       /* If there's a single use of VAR, and VAR is the entire debug
404          expression (usecount would have been incremented again
405          otherwise), and the definition involves only constants and
406          SSA names, then we can propagate VALUE into this single use,
407          avoiding the temp.
408
409          We can also avoid using a temp if VALUE can be shared and
410          propagated into all uses, without generating expressions that
411          wouldn't be valid gimple RHSs.
412
413          Other cases that would require unsharing or non-gimple RHSs
414          are deferred to a debug temp, although we could avoid temps
415          at the expense of duplication of expressions.  */
416
417       if (CONSTANT_CLASS_P (value)
418           || gimple_code (def_stmt) == GIMPLE_PHI
419           || (usecount == 1
420               && (!gimple_assign_single_p (def_stmt)
421                   || is_gimple_min_invariant (value)))
422           || is_gimple_reg (value))
423         value = unshare_expr (value);
424       else
425         {
426           gimple def_temp;
427           tree vexpr = make_node (DEBUG_EXPR_DECL);
428
429           def_temp = gimple_build_debug_bind (vexpr,
430                                               unshare_expr (value),
431                                               def_stmt);
432
433           DECL_ARTIFICIAL (vexpr) = 1;
434           TREE_TYPE (vexpr) = TREE_TYPE (value);
435           if (DECL_P (value))
436             DECL_MODE (vexpr) = DECL_MODE (value);
437           else
438             DECL_MODE (vexpr) = TYPE_MODE (TREE_TYPE (value));
439
440           if (gsi)
441             gsi_insert_before (gsi, def_temp, GSI_SAME_STMT);
442           else
443             {
444               gimple_stmt_iterator ngsi = gsi_for_stmt (def_stmt);
445               gsi_insert_before (&ngsi, def_temp, GSI_SAME_STMT);
446             }
447
448           value = vexpr;
449         }
450     }
451
452   FOR_EACH_IMM_USE_STMT (stmt, imm_iter, var)
453     {
454       if (!gimple_debug_bind_p (stmt))
455         continue;
456
457       if (value)
458         {
459           FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
460             /* unshare_expr is not needed here.  vexpr is either a
461                SINGLE_RHS, that can be safely shared, some other RHS
462                that was unshared when we found it had a single debug
463                use, or a DEBUG_EXPR_DECL, that can be safely
464                shared.  */
465             SET_USE (use_p, value);
466           /* If we didn't replace uses with a debug decl fold the
467              resulting expression.  Otherwise we end up with invalid IL.  */
468           if (TREE_CODE (value) != DEBUG_EXPR_DECL)
469             fold_stmt_inplace (stmt);
470         }
471       else
472         gimple_debug_bind_reset_value (stmt);
473
474       update_stmt (stmt);
475     }
476 }
477
478
479 /* Insert a DEBUG BIND stmt before STMT for each DEF referenced by
480    other DEBUG stmts, and replace uses of the DEF with the
481    newly-created debug temp.  */
482
483 void
484 insert_debug_temps_for_defs (gimple_stmt_iterator *gsi)
485 {
486   gimple stmt;
487   ssa_op_iter op_iter;
488   def_operand_p def_p;
489
490   if (!MAY_HAVE_DEBUG_STMTS)
491     return;
492
493   stmt = gsi_stmt (*gsi);
494
495   FOR_EACH_PHI_OR_STMT_DEF (def_p, stmt, op_iter, SSA_OP_DEF)
496     {
497       tree var = DEF_FROM_PTR (def_p);
498
499       if (TREE_CODE (var) != SSA_NAME)
500         continue;
501
502       insert_debug_temp_for_var_def (gsi, var);
503     }
504 }
505
506 /* Delete SSA DEFs for SSA versions in the TOREMOVE bitmap, removing
507    dominated stmts before their dominators, so that release_ssa_defs
508    stands a chance of propagating DEFs into debug bind stmts.  */
509
510 void
511 release_defs_bitset (bitmap toremove)
512 {
513   unsigned j;
514   bitmap_iterator bi;
515
516   /* Performing a topological sort is probably overkill, this will
517      most likely run in slightly superlinear time, rather than the
518      pathological quadratic worst case.  */
519   while (!bitmap_empty_p (toremove))
520     EXECUTE_IF_SET_IN_BITMAP (toremove, 0, j, bi)
521       {
522         bool remove_now = true;
523         tree var = ssa_name (j);
524         gimple stmt;
525         imm_use_iterator uit;
526
527         FOR_EACH_IMM_USE_STMT (stmt, uit, var)
528           {
529             ssa_op_iter dit;
530             def_operand_p def_p;
531
532             /* We can't propagate PHI nodes into debug stmts.  */
533             if (gimple_code (stmt) == GIMPLE_PHI
534                 || is_gimple_debug (stmt))
535               continue;
536
537             /* If we find another definition to remove that uses
538                the one we're looking at, defer the removal of this
539                one, so that it can be propagated into debug stmts
540                after the other is.  */
541             FOR_EACH_SSA_DEF_OPERAND (def_p, stmt, dit, SSA_OP_DEF)
542               {
543                 tree odef = DEF_FROM_PTR (def_p);
544
545                 if (bitmap_bit_p (toremove, SSA_NAME_VERSION (odef)))
546                   {
547                     remove_now = false;
548                     break;
549                   }
550               }
551
552             if (!remove_now)
553               BREAK_FROM_IMM_USE_STMT (uit);
554           }
555
556         if (remove_now)
557           {
558             gimple def = SSA_NAME_DEF_STMT (var);
559             gimple_stmt_iterator gsi = gsi_for_stmt (def);
560
561             if (gimple_code (def) == GIMPLE_PHI)
562               remove_phi_node (&gsi, true);
563             else
564               {
565                 gsi_remove (&gsi, true);
566                 release_defs (def);
567               }
568
569             bitmap_clear_bit (toremove, j);
570           }
571       }
572 }
573
574 /* Return true if SSA_NAME is malformed and mark it visited.
575
576    IS_VIRTUAL is true if this SSA_NAME was found inside a virtual
577       operand.  */
578
579 static bool
580 verify_ssa_name (tree ssa_name, bool is_virtual)
581 {
582   if (TREE_CODE (ssa_name) != SSA_NAME)
583     {
584       error ("expected an SSA_NAME object");
585       return true;
586     }
587
588   if (TREE_TYPE (ssa_name) != TREE_TYPE (SSA_NAME_VAR (ssa_name)))
589     {
590       error ("type mismatch between an SSA_NAME and its symbol");
591       return true;
592     }
593
594   if (SSA_NAME_IN_FREE_LIST (ssa_name))
595     {
596       error ("found an SSA_NAME that had been released into the free pool");
597       return true;
598     }
599
600   if (is_virtual && is_gimple_reg (ssa_name))
601     {
602       error ("found a virtual definition for a GIMPLE register");
603       return true;
604     }
605
606   if (is_virtual && SSA_NAME_VAR (ssa_name) != gimple_vop (cfun))
607     {
608       error ("virtual SSA name for non-VOP decl");
609       return true;
610     }
611
612   if (!is_virtual && !is_gimple_reg (ssa_name))
613     {
614       error ("found a real definition for a non-register");
615       return true;
616     }
617
618   if (SSA_NAME_IS_DEFAULT_DEF (ssa_name)
619       && !gimple_nop_p (SSA_NAME_DEF_STMT (ssa_name)))
620     {
621       error ("found a default name with a non-empty defining statement");
622       return true;
623     }
624
625   return false;
626 }
627
628
629 /* Return true if the definition of SSA_NAME at block BB is malformed.
630
631    STMT is the statement where SSA_NAME is created.
632
633    DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME
634       version numbers.  If DEFINITION_BLOCK[SSA_NAME_VERSION] is set,
635       it means that the block in that array slot contains the
636       definition of SSA_NAME.
637
638    IS_VIRTUAL is true if SSA_NAME is created by a VDEF.  */
639
640 static bool
641 verify_def (basic_block bb, basic_block *definition_block, tree ssa_name,
642             gimple stmt, bool is_virtual)
643 {
644   if (verify_ssa_name (ssa_name, is_virtual))
645     goto err;
646
647   if (TREE_CODE (SSA_NAME_VAR (ssa_name)) == RESULT_DECL
648       && DECL_BY_REFERENCE (SSA_NAME_VAR (ssa_name)))
649     {
650       error ("RESULT_DECL should be read only when DECL_BY_REFERENCE is set");
651       goto err;
652     }
653
654   if (definition_block[SSA_NAME_VERSION (ssa_name)])
655     {
656       error ("SSA_NAME created in two different blocks %i and %i",
657              definition_block[SSA_NAME_VERSION (ssa_name)]->index, bb->index);
658       goto err;
659     }
660
661   definition_block[SSA_NAME_VERSION (ssa_name)] = bb;
662
663   if (SSA_NAME_DEF_STMT (ssa_name) != stmt)
664     {
665       error ("SSA_NAME_DEF_STMT is wrong");
666       fprintf (stderr, "Expected definition statement:\n");
667       print_gimple_stmt (stderr, SSA_NAME_DEF_STMT (ssa_name), 4, TDF_VOPS);
668       fprintf (stderr, "\nActual definition statement:\n");
669       print_gimple_stmt (stderr, stmt, 4, TDF_VOPS);
670       goto err;
671     }
672
673   return false;
674
675 err:
676   fprintf (stderr, "while verifying SSA_NAME ");
677   print_generic_expr (stderr, ssa_name, 0);
678   fprintf (stderr, " in statement\n");
679   print_gimple_stmt (stderr, stmt, 4, TDF_VOPS);
680
681   return true;
682 }
683
684
685 /* Return true if the use of SSA_NAME at statement STMT in block BB is
686    malformed.
687
688    DEF_BB is the block where SSA_NAME was found to be created.
689
690    IDOM contains immediate dominator information for the flowgraph.
691
692    CHECK_ABNORMAL is true if the caller wants to check whether this use
693       is flowing through an abnormal edge (only used when checking PHI
694       arguments).
695
696    If NAMES_DEFINED_IN_BB is not NULL, it contains a bitmap of ssa names
697      that are defined before STMT in basic block BB.  */
698
699 static bool
700 verify_use (basic_block bb, basic_block def_bb, use_operand_p use_p,
701             gimple stmt, bool check_abnormal, bitmap names_defined_in_bb)
702 {
703   bool err = false;
704   tree ssa_name = USE_FROM_PTR (use_p);
705
706   if (!TREE_VISITED (ssa_name))
707     if (verify_imm_links (stderr, ssa_name))
708       err = true;
709
710   TREE_VISITED (ssa_name) = 1;
711
712   if (gimple_nop_p (SSA_NAME_DEF_STMT (ssa_name))
713       && SSA_NAME_IS_DEFAULT_DEF (ssa_name))
714     ; /* Default definitions have empty statements.  Nothing to do.  */
715   else if (!def_bb)
716     {
717       error ("missing definition");
718       err = true;
719     }
720   else if (bb != def_bb
721            && !dominated_by_p (CDI_DOMINATORS, bb, def_bb))
722     {
723       error ("definition in block %i does not dominate use in block %i",
724              def_bb->index, bb->index);
725       err = true;
726     }
727   else if (bb == def_bb
728            && names_defined_in_bb != NULL
729            && !bitmap_bit_p (names_defined_in_bb, SSA_NAME_VERSION (ssa_name)))
730     {
731       error ("definition in block %i follows the use", def_bb->index);
732       err = true;
733     }
734
735   if (check_abnormal
736       && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ssa_name))
737     {
738       error ("SSA_NAME_OCCURS_IN_ABNORMAL_PHI should be set");
739       err = true;
740     }
741
742   /* Make sure the use is in an appropriate list by checking the previous
743      element to make sure it's the same.  */
744   if (use_p->prev == NULL)
745     {
746       error ("no immediate_use list");
747       err = true;
748     }
749   else
750     {
751       tree listvar;
752       if (use_p->prev->use == NULL)
753         listvar = use_p->prev->loc.ssa_name;
754       else
755         listvar = USE_FROM_PTR (use_p->prev);
756       if (listvar != ssa_name)
757         {
758           error ("wrong immediate use list");
759           err = true;
760         }
761     }
762
763   if (err)
764     {
765       fprintf (stderr, "for SSA_NAME: ");
766       print_generic_expr (stderr, ssa_name, TDF_VOPS);
767       fprintf (stderr, " in statement:\n");
768       print_gimple_stmt (stderr, stmt, 0, TDF_VOPS);
769     }
770
771   return err;
772 }
773
774
775 /* Return true if any of the arguments for PHI node PHI at block BB is
776    malformed.
777
778    DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME
779       version numbers.  If DEFINITION_BLOCK[SSA_NAME_VERSION] is set,
780       it means that the block in that array slot contains the
781       definition of SSA_NAME.  */
782
783 static bool
784 verify_phi_args (gimple phi, basic_block bb, basic_block *definition_block)
785 {
786   edge e;
787   bool err = false;
788   size_t i, phi_num_args = gimple_phi_num_args (phi);
789
790   if (EDGE_COUNT (bb->preds) != phi_num_args)
791     {
792       error ("incoming edge count does not match number of PHI arguments");
793       err = true;
794       goto error;
795     }
796
797   for (i = 0; i < phi_num_args; i++)
798     {
799       use_operand_p op_p = gimple_phi_arg_imm_use_ptr (phi, i);
800       tree op = USE_FROM_PTR (op_p);
801
802       e = EDGE_PRED (bb, i);
803
804       if (op == NULL_TREE)
805         {
806           error ("PHI argument is missing for edge %d->%d",
807                  e->src->index,
808                  e->dest->index);
809           err = true;
810           goto error;
811         }
812
813       if (TREE_CODE (op) != SSA_NAME && !is_gimple_min_invariant (op))
814         {
815           error ("PHI argument is not SSA_NAME, or invariant");
816           err = true;
817         }
818
819       if (TREE_CODE (op) == SSA_NAME)
820         {
821           err = verify_ssa_name (op, !is_gimple_reg (gimple_phi_result (phi)));
822           err |= verify_use (e->src, definition_block[SSA_NAME_VERSION (op)],
823                              op_p, phi, e->flags & EDGE_ABNORMAL, NULL);
824         }
825
826       if (TREE_CODE (op) == ADDR_EXPR)
827         {
828           tree base = TREE_OPERAND (op, 0);
829           while (handled_component_p (base))
830             base = TREE_OPERAND (base, 0);
831           if ((TREE_CODE (base) == VAR_DECL
832                || TREE_CODE (base) == PARM_DECL
833                || TREE_CODE (base) == RESULT_DECL)
834               && !TREE_ADDRESSABLE (base))
835             {
836               error ("address taken, but ADDRESSABLE bit not set");
837               err = true;
838             }
839         }
840
841       if (e->dest != bb)
842         {
843           error ("wrong edge %d->%d for PHI argument",
844                  e->src->index, e->dest->index);
845           err = true;
846         }
847
848       if (err)
849         {
850           fprintf (stderr, "PHI argument\n");
851           print_generic_stmt (stderr, op, TDF_VOPS);
852           goto error;
853         }
854     }
855
856 error:
857   if (err)
858     {
859       fprintf (stderr, "for PHI node\n");
860       print_gimple_stmt (stderr, phi, 0, TDF_VOPS|TDF_MEMSYMS);
861     }
862
863
864   return err;
865 }
866
867
868 /* Verify common invariants in the SSA web.
869    TODO: verify the variable annotations.  */
870
871 DEBUG_FUNCTION void
872 verify_ssa (bool check_modified_stmt)
873 {
874   size_t i;
875   basic_block bb;
876   basic_block *definition_block = XCNEWVEC (basic_block, num_ssa_names);
877   ssa_op_iter iter;
878   tree op;
879   enum dom_state orig_dom_state = dom_info_state (CDI_DOMINATORS);
880   bitmap names_defined_in_bb = BITMAP_ALLOC (NULL);
881
882   gcc_assert (!need_ssa_update_p (cfun));
883
884   verify_stmts ();
885
886   timevar_push (TV_TREE_SSA_VERIFY);
887
888   /* Keep track of SSA names present in the IL.  */
889   for (i = 1; i < num_ssa_names; i++)
890     {
891       tree name = ssa_name (i);
892       if (name)
893         {
894           gimple stmt;
895           TREE_VISITED (name) = 0;
896
897           stmt = SSA_NAME_DEF_STMT (name);
898           if (!gimple_nop_p (stmt))
899             {
900               basic_block bb = gimple_bb (stmt);
901               verify_def (bb, definition_block,
902                           name, stmt, !is_gimple_reg (name));
903
904             }
905         }
906     }
907
908   calculate_dominance_info (CDI_DOMINATORS);
909
910   /* Now verify all the uses and make sure they agree with the definitions
911      found in the previous pass.  */
912   FOR_EACH_BB (bb)
913     {
914       edge e;
915       gimple phi;
916       edge_iterator ei;
917       gimple_stmt_iterator gsi;
918
919       /* Make sure that all edges have a clear 'aux' field.  */
920       FOR_EACH_EDGE (e, ei, bb->preds)
921         {
922           if (e->aux)
923             {
924               error ("AUX pointer initialized for edge %d->%d", e->src->index,
925                       e->dest->index);
926               goto err;
927             }
928         }
929
930       /* Verify the arguments for every PHI node in the block.  */
931       for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
932         {
933           phi = gsi_stmt (gsi);
934           if (verify_phi_args (phi, bb, definition_block))
935             goto err;
936
937           bitmap_set_bit (names_defined_in_bb,
938                           SSA_NAME_VERSION (gimple_phi_result (phi)));
939         }
940
941       /* Now verify all the uses and vuses in every statement of the block.  */
942       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
943         {
944           gimple stmt = gsi_stmt (gsi);
945           use_operand_p use_p;
946           bool has_err;
947           int count;
948           unsigned i;
949
950           if (check_modified_stmt && gimple_modified_p (stmt))
951             {
952               error ("stmt (%p) marked modified after optimization pass: ",
953                      (void *)stmt);
954               print_gimple_stmt (stderr, stmt, 0, TDF_VOPS);
955               goto err;
956             }
957
958           if (is_gimple_assign (stmt)
959               && TREE_CODE (gimple_assign_lhs (stmt)) != SSA_NAME)
960             {
961               tree lhs, base_address;
962
963               lhs = gimple_assign_lhs (stmt);
964               base_address = get_base_address (lhs);
965
966               if (base_address
967                   && SSA_VAR_P (base_address)
968                   && !gimple_vdef (stmt)
969                   && optimize > 0)
970                 {
971                   error ("statement makes a memory store, but has no VDEFS");
972                   print_gimple_stmt (stderr, stmt, 0, TDF_VOPS);
973                   goto err;
974                 }
975             }
976           else if (gimple_debug_bind_p (stmt)
977                    && !gimple_debug_bind_has_value_p (stmt))
978             continue;
979
980           /* Verify the single virtual operand and its constraints.  */
981           has_err = false;
982           if (gimple_vdef (stmt))
983             {
984               if (gimple_vdef_op (stmt) == NULL_DEF_OPERAND_P)
985                 {
986                   error ("statement has VDEF operand not in defs list");
987                   has_err = true;
988                 }
989               if (!gimple_vuse (stmt))
990                 {
991                   error ("statement has VDEF but no VUSE operand");
992                   has_err = true;
993                 }
994               else if (SSA_NAME_VAR (gimple_vdef (stmt))
995                        != SSA_NAME_VAR (gimple_vuse (stmt)))
996                 {
997                   error ("VDEF and VUSE do not use the same symbol");
998                   has_err = true;
999                 }
1000               has_err |= verify_ssa_name (gimple_vdef (stmt), true);
1001             }
1002           if (gimple_vuse (stmt))
1003             {
1004               if  (gimple_vuse_op (stmt) == NULL_USE_OPERAND_P)
1005                 {
1006                   error ("statement has VUSE operand not in uses list");
1007                   has_err = true;
1008                 }
1009               has_err |= verify_ssa_name (gimple_vuse (stmt), true);
1010             }
1011           if (has_err)
1012             {
1013               error ("in statement");
1014               print_gimple_stmt (stderr, stmt, 0, TDF_VOPS|TDF_MEMSYMS);
1015               goto err;
1016             }
1017
1018           count = 0;
1019           FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE|SSA_OP_DEF)
1020             {
1021               if (verify_ssa_name (op, false))
1022                 {
1023                   error ("in statement");
1024                   print_gimple_stmt (stderr, stmt, 0, TDF_VOPS|TDF_MEMSYMS);
1025                   goto err;
1026                 }
1027               count++;
1028             }
1029
1030           for (i = 0; i < gimple_num_ops (stmt); i++)
1031             {
1032               op = gimple_op (stmt, i);
1033               if (op && TREE_CODE (op) == SSA_NAME && --count < 0)
1034                 {
1035                   error ("number of operands and imm-links don%'t agree"
1036                          " in statement");
1037                   print_gimple_stmt (stderr, stmt, 0, TDF_VOPS|TDF_MEMSYMS);
1038                   goto err;
1039                 }
1040             }
1041
1042           FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE|SSA_OP_VUSE)
1043             {
1044               op = USE_FROM_PTR (use_p);
1045               if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
1046                               use_p, stmt, false, names_defined_in_bb))
1047                 goto err;
1048             }
1049
1050           FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_ALL_DEFS)
1051             {
1052               if (SSA_NAME_DEF_STMT (op) != stmt)
1053                 {
1054                   error ("SSA_NAME_DEF_STMT is wrong");
1055                   fprintf (stderr, "Expected definition statement:\n");
1056                   print_gimple_stmt (stderr, stmt, 4, TDF_VOPS);
1057                   fprintf (stderr, "\nActual definition statement:\n");
1058                   print_gimple_stmt (stderr, SSA_NAME_DEF_STMT (op),
1059                                      4, TDF_VOPS);
1060                   goto err;
1061                 }
1062               bitmap_set_bit (names_defined_in_bb, SSA_NAME_VERSION (op));
1063             }
1064         }
1065
1066       bitmap_clear (names_defined_in_bb);
1067     }
1068
1069   free (definition_block);
1070
1071   /* Restore the dominance information to its prior known state, so
1072      that we do not perturb the compiler's subsequent behavior.  */
1073   if (orig_dom_state == DOM_NONE)
1074     free_dominance_info (CDI_DOMINATORS);
1075   else
1076     set_dom_info_availability (CDI_DOMINATORS, orig_dom_state);
1077
1078   BITMAP_FREE (names_defined_in_bb);
1079   timevar_pop (TV_TREE_SSA_VERIFY);
1080   return;
1081
1082 err:
1083   internal_error ("verify_ssa failed");
1084 }
1085
1086 /* Return true if the uid in both int tree maps are equal.  */
1087
1088 int
1089 int_tree_map_eq (const void *va, const void *vb)
1090 {
1091   const struct int_tree_map *a = (const struct int_tree_map *) va;
1092   const struct int_tree_map *b = (const struct int_tree_map *) vb;
1093   return (a->uid == b->uid);
1094 }
1095
1096 /* Hash a UID in a int_tree_map.  */
1097
1098 unsigned int
1099 int_tree_map_hash (const void *item)
1100 {
1101   return ((const struct int_tree_map *)item)->uid;
1102 }
1103
1104 /* Return true if the DECL_UID in both trees are equal.  */
1105
1106 int
1107 uid_decl_map_eq (const void *va, const void *vb)
1108 {
1109   const_tree a = (const_tree) va;
1110   const_tree b = (const_tree) vb;
1111   return (a->decl_minimal.uid == b->decl_minimal.uid);
1112 }
1113
1114 /* Hash a tree in a uid_decl_map.  */
1115
1116 unsigned int
1117 uid_decl_map_hash (const void *item)
1118 {
1119   return ((const_tree)item)->decl_minimal.uid;
1120 }
1121
1122 /* Return true if the DECL_UID in both trees are equal.  */
1123
1124 static int
1125 uid_ssaname_map_eq (const void *va, const void *vb)
1126 {
1127   const_tree a = (const_tree) va;
1128   const_tree b = (const_tree) vb;
1129   return (a->ssa_name.var->decl_minimal.uid == b->ssa_name.var->decl_minimal.uid);
1130 }
1131
1132 /* Hash a tree in a uid_decl_map.  */
1133
1134 static unsigned int
1135 uid_ssaname_map_hash (const void *item)
1136 {
1137   return ((const_tree)item)->ssa_name.var->decl_minimal.uid;
1138 }
1139
1140
1141 /* Initialize global DFA and SSA structures.  */
1142
1143 void
1144 init_tree_ssa (struct function *fn)
1145 {
1146   fn->gimple_df = ggc_alloc_cleared_gimple_df ();
1147   fn->gimple_df->referenced_vars = htab_create_ggc (20, uid_decl_map_hash,
1148                                                     uid_decl_map_eq, NULL);
1149   fn->gimple_df->default_defs = htab_create_ggc (20, uid_ssaname_map_hash,
1150                                                  uid_ssaname_map_eq, NULL);
1151   pt_solution_reset (&fn->gimple_df->escaped);
1152   init_ssanames (fn, 0);
1153   init_phinodes ();
1154 }
1155
1156
1157 /* Deallocate memory associated with SSA data structures for FNDECL.  */
1158
1159 void
1160 delete_tree_ssa (void)
1161 {
1162   referenced_var_iterator rvi;
1163   tree var;
1164
1165   /* Remove annotations from every referenced local variable.  */
1166   FOR_EACH_REFERENCED_VAR (cfun, var, rvi)
1167     {
1168       if (is_global_var (var))
1169         continue;
1170       if (var_ann (var))
1171         {
1172           ggc_free (var_ann (var));
1173           *DECL_VAR_ANN_PTR (var) = NULL;
1174         }
1175     }
1176   htab_delete (gimple_referenced_vars (cfun));
1177   cfun->gimple_df->referenced_vars = NULL;
1178
1179   fini_ssanames ();
1180   fini_phinodes ();
1181
1182   /* We no longer maintain the SSA operand cache at this point.  */
1183   if (ssa_operands_active ())
1184     fini_ssa_operands ();
1185
1186   delete_alias_heapvars ();
1187
1188   htab_delete (cfun->gimple_df->default_defs);
1189   cfun->gimple_df->default_defs = NULL;
1190   pt_solution_reset (&cfun->gimple_df->escaped);
1191   if (cfun->gimple_df->decls_to_pointers != NULL)
1192     pointer_map_destroy (cfun->gimple_df->decls_to_pointers);
1193   cfun->gimple_df->decls_to_pointers = NULL;
1194   cfun->gimple_df->modified_noreturn_calls = NULL;
1195   cfun->gimple_df = NULL;
1196
1197   /* We no longer need the edge variable maps.  */
1198   redirect_edge_var_map_destroy ();
1199 }
1200
1201 /* Return true if the conversion from INNER_TYPE to OUTER_TYPE is a
1202    useless type conversion, otherwise return false.
1203
1204    This function implicitly defines the middle-end type system.  With
1205    the notion of 'a < b' meaning that useless_type_conversion_p (a, b)
1206    holds and 'a > b' meaning that useless_type_conversion_p (b, a) holds,
1207    the following invariants shall be fulfilled:
1208
1209      1) useless_type_conversion_p is transitive.
1210         If a < b and b < c then a < c.
1211
1212      2) useless_type_conversion_p is not symmetric.
1213         From a < b does not follow a > b.
1214
1215      3) Types define the available set of operations applicable to values.
1216         A type conversion is useless if the operations for the target type
1217         is a subset of the operations for the source type.  For example
1218         casts to void* are useless, casts from void* are not (void* can't
1219         be dereferenced or offsetted, but copied, hence its set of operations
1220         is a strict subset of that of all other data pointer types).  Casts
1221         to const T* are useless (can't be written to), casts from const T*
1222         to T* are not.  */
1223
1224 bool
1225 useless_type_conversion_p (tree outer_type, tree inner_type)
1226 {
1227   /* Do the following before stripping toplevel qualifiers.  */
1228   if (POINTER_TYPE_P (inner_type)
1229       && POINTER_TYPE_P (outer_type))
1230     {
1231       /* Do not lose casts between pointers to different address spaces.  */
1232       if (TYPE_ADDR_SPACE (TREE_TYPE (outer_type))
1233           != TYPE_ADDR_SPACE (TREE_TYPE (inner_type)))
1234         return false;
1235
1236       /* Do not lose casts to restrict qualified pointers.  */
1237       if ((TYPE_RESTRICT (outer_type)
1238            != TYPE_RESTRICT (inner_type))
1239           && TYPE_RESTRICT (outer_type))
1240         return false;
1241
1242       /* If the outer type is (void *) or a pointer to an incomplete
1243          record type or a pointer to an unprototyped function,
1244          then the conversion is not necessary.  */
1245       if (VOID_TYPE_P (TREE_TYPE (outer_type))
1246           || ((TREE_CODE (TREE_TYPE (outer_type)) == FUNCTION_TYPE
1247                || TREE_CODE (TREE_TYPE (outer_type)) == METHOD_TYPE)
1248               && (TREE_CODE (TREE_TYPE (outer_type))
1249                   == TREE_CODE (TREE_TYPE (inner_type)))
1250               && !prototype_p (TREE_TYPE (outer_type))
1251               && useless_type_conversion_p (TREE_TYPE (TREE_TYPE (outer_type)),
1252                                             TREE_TYPE (TREE_TYPE (inner_type)))))
1253         return true;
1254     }
1255
1256   /* From now on qualifiers on value types do not matter.  */
1257   inner_type = TYPE_MAIN_VARIANT (inner_type);
1258   outer_type = TYPE_MAIN_VARIANT (outer_type);
1259
1260   if (inner_type == outer_type)
1261     return true;
1262
1263   /* If we know the canonical types, compare them.  */
1264   if (TYPE_CANONICAL (inner_type)
1265       && TYPE_CANONICAL (inner_type) == TYPE_CANONICAL (outer_type))
1266     return true;
1267
1268   /* Changes in machine mode are never useless conversions unless we
1269      deal with aggregate types in which case we defer to later checks.  */
1270   if (TYPE_MODE (inner_type) != TYPE_MODE (outer_type)
1271       && !AGGREGATE_TYPE_P (inner_type))
1272     return false;
1273
1274   /* If both the inner and outer types are integral types, then the
1275      conversion is not necessary if they have the same mode and
1276      signedness and precision, and both or neither are boolean.  */
1277   if (INTEGRAL_TYPE_P (inner_type)
1278       && INTEGRAL_TYPE_P (outer_type))
1279     {
1280       /* Preserve changes in signedness or precision.  */
1281       if (TYPE_UNSIGNED (inner_type) != TYPE_UNSIGNED (outer_type)
1282           || TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type))
1283         return false;
1284
1285       /* We don't need to preserve changes in the types minimum or
1286          maximum value in general as these do not generate code
1287          unless the types precisions are different.  */
1288       return true;
1289     }
1290
1291   /* Scalar floating point types with the same mode are compatible.  */
1292   else if (SCALAR_FLOAT_TYPE_P (inner_type)
1293            && SCALAR_FLOAT_TYPE_P (outer_type))
1294     return true;
1295
1296   /* Fixed point types with the same mode are compatible.  */
1297   else if (FIXED_POINT_TYPE_P (inner_type)
1298            && FIXED_POINT_TYPE_P (outer_type))
1299     return true;
1300
1301   /* We need to take special care recursing to pointed-to types.  */
1302   else if (POINTER_TYPE_P (inner_type)
1303            && POINTER_TYPE_P (outer_type))
1304     {
1305       /* Do not lose casts to function pointer types.  */
1306       if ((TREE_CODE (TREE_TYPE (outer_type)) == FUNCTION_TYPE
1307            || TREE_CODE (TREE_TYPE (outer_type)) == METHOD_TYPE)
1308           && !useless_type_conversion_p (TREE_TYPE (outer_type),
1309                                          TREE_TYPE (inner_type)))
1310         return false;
1311
1312       /* We do not care for const qualification of the pointed-to types
1313          as const qualification has no semantic value to the middle-end.  */
1314
1315       /* Otherwise pointers/references are equivalent.  */
1316       return true;
1317     }
1318
1319   /* Recurse for complex types.  */
1320   else if (TREE_CODE (inner_type) == COMPLEX_TYPE
1321            && TREE_CODE (outer_type) == COMPLEX_TYPE)
1322     return useless_type_conversion_p (TREE_TYPE (outer_type),
1323                                       TREE_TYPE (inner_type));
1324
1325   /* Recurse for vector types with the same number of subparts.  */
1326   else if (TREE_CODE (inner_type) == VECTOR_TYPE
1327            && TREE_CODE (outer_type) == VECTOR_TYPE
1328            && TYPE_PRECISION (inner_type) == TYPE_PRECISION (outer_type))
1329     return useless_type_conversion_p (TREE_TYPE (outer_type),
1330                                       TREE_TYPE (inner_type));
1331
1332   else if (TREE_CODE (inner_type) == ARRAY_TYPE
1333            && TREE_CODE (outer_type) == ARRAY_TYPE)
1334     {
1335       /* Preserve string attributes.  */
1336       if (TYPE_STRING_FLAG (inner_type) != TYPE_STRING_FLAG (outer_type))
1337         return false;
1338
1339       /* Conversions from array types with unknown extent to
1340          array types with known extent are not useless.  */
1341       if (!TYPE_DOMAIN (inner_type)
1342           && TYPE_DOMAIN (outer_type))
1343         return false;
1344
1345       /* Nor are conversions from array types with non-constant size to
1346          array types with constant size or to different size.  */
1347       if (TYPE_SIZE (outer_type)
1348           && TREE_CODE (TYPE_SIZE (outer_type)) == INTEGER_CST
1349           && (!TYPE_SIZE (inner_type)
1350               || TREE_CODE (TYPE_SIZE (inner_type)) != INTEGER_CST
1351               || !tree_int_cst_equal (TYPE_SIZE (outer_type),
1352                                       TYPE_SIZE (inner_type))))
1353         return false;
1354
1355       /* Check conversions between arrays with partially known extents.
1356          If the array min/max values are constant they have to match.
1357          Otherwise allow conversions to unknown and variable extents.
1358          In particular this declares conversions that may change the
1359          mode to BLKmode as useless.  */
1360       if (TYPE_DOMAIN (inner_type)
1361           && TYPE_DOMAIN (outer_type)
1362           && TYPE_DOMAIN (inner_type) != TYPE_DOMAIN (outer_type))
1363         {
1364           tree inner_min = TYPE_MIN_VALUE (TYPE_DOMAIN (inner_type));
1365           tree outer_min = TYPE_MIN_VALUE (TYPE_DOMAIN (outer_type));
1366           tree inner_max = TYPE_MAX_VALUE (TYPE_DOMAIN (inner_type));
1367           tree outer_max = TYPE_MAX_VALUE (TYPE_DOMAIN (outer_type));
1368
1369           /* After gimplification a variable min/max value carries no
1370              additional information compared to a NULL value.  All that
1371              matters has been lowered to be part of the IL.  */
1372           if (inner_min && TREE_CODE (inner_min) != INTEGER_CST)
1373             inner_min = NULL_TREE;
1374           if (outer_min && TREE_CODE (outer_min) != INTEGER_CST)
1375             outer_min = NULL_TREE;
1376           if (inner_max && TREE_CODE (inner_max) != INTEGER_CST)
1377             inner_max = NULL_TREE;
1378           if (outer_max && TREE_CODE (outer_max) != INTEGER_CST)
1379             outer_max = NULL_TREE;
1380
1381           /* Conversions NULL / variable <- cst are useless, but not
1382              the other way around.  */
1383           if (outer_min
1384               && (!inner_min
1385                   || !tree_int_cst_equal (inner_min, outer_min)))
1386             return false;
1387           if (outer_max
1388               && (!inner_max
1389                   || !tree_int_cst_equal (inner_max, outer_max)))
1390             return false;
1391         }
1392
1393       /* Recurse on the element check.  */
1394       return useless_type_conversion_p (TREE_TYPE (outer_type),
1395                                         TREE_TYPE (inner_type));
1396     }
1397
1398   else if ((TREE_CODE (inner_type) == FUNCTION_TYPE
1399             || TREE_CODE (inner_type) == METHOD_TYPE)
1400            && TREE_CODE (inner_type) == TREE_CODE (outer_type))
1401     {
1402       tree outer_parm, inner_parm;
1403
1404       /* If the return types are not compatible bail out.  */
1405       if (!useless_type_conversion_p (TREE_TYPE (outer_type),
1406                                       TREE_TYPE (inner_type)))
1407         return false;
1408
1409       /* Method types should belong to a compatible base class.  */
1410       if (TREE_CODE (inner_type) == METHOD_TYPE
1411           && !useless_type_conversion_p (TYPE_METHOD_BASETYPE (outer_type),
1412                                          TYPE_METHOD_BASETYPE (inner_type)))
1413         return false;
1414
1415       /* A conversion to an unprototyped argument list is ok.  */
1416       if (!prototype_p (outer_type))
1417         return true;
1418
1419       /* If the unqualified argument types are compatible the conversion
1420          is useless.  */
1421       if (TYPE_ARG_TYPES (outer_type) == TYPE_ARG_TYPES (inner_type))
1422         return true;
1423
1424       for (outer_parm = TYPE_ARG_TYPES (outer_type),
1425            inner_parm = TYPE_ARG_TYPES (inner_type);
1426            outer_parm && inner_parm;
1427            outer_parm = TREE_CHAIN (outer_parm),
1428            inner_parm = TREE_CHAIN (inner_parm))
1429         if (!useless_type_conversion_p
1430                (TYPE_MAIN_VARIANT (TREE_VALUE (outer_parm)),
1431                 TYPE_MAIN_VARIANT (TREE_VALUE (inner_parm))))
1432           return false;
1433
1434       /* If there is a mismatch in the number of arguments the functions
1435          are not compatible.  */
1436       if (outer_parm || inner_parm)
1437         return false;
1438
1439       /* Defer to the target if necessary.  */
1440       if (TYPE_ATTRIBUTES (inner_type) || TYPE_ATTRIBUTES (outer_type))
1441         return targetm.comp_type_attributes (outer_type, inner_type) != 0;
1442
1443       return true;
1444     }
1445
1446   /* For aggregates we rely on TYPE_CANONICAL exclusively and require
1447      explicit conversions for types involving to be structurally
1448      compared types.  */
1449   else if (AGGREGATE_TYPE_P (inner_type)
1450            && TREE_CODE (inner_type) == TREE_CODE (outer_type))
1451     return false;
1452
1453   return false;
1454 }
1455
1456 /* Return true if a conversion from either type of TYPE1 and TYPE2
1457    to the other is not required.  Otherwise return false.  */
1458
1459 bool
1460 types_compatible_p (tree type1, tree type2)
1461 {
1462   return (type1 == type2
1463           || (useless_type_conversion_p (type1, type2)
1464               && useless_type_conversion_p (type2, type1)));
1465 }
1466
1467 /* Return true if EXPR is a useless type conversion, otherwise return
1468    false.  */
1469
1470 bool
1471 tree_ssa_useless_type_conversion (tree expr)
1472 {
1473   /* If we have an assignment that merely uses a NOP_EXPR to change
1474      the top of the RHS to the type of the LHS and the type conversion
1475      is "safe", then strip away the type conversion so that we can
1476      enter LHS = RHS into the const_and_copies table.  */
1477   if (CONVERT_EXPR_P (expr)
1478       || TREE_CODE (expr) == VIEW_CONVERT_EXPR
1479       || TREE_CODE (expr) == NON_LVALUE_EXPR)
1480     return useless_type_conversion_p
1481       (TREE_TYPE (expr),
1482        TREE_TYPE (TREE_OPERAND (expr, 0)));
1483
1484   return false;
1485 }
1486
1487 /* Strip conversions from EXP according to
1488    tree_ssa_useless_type_conversion and return the resulting
1489    expression.  */
1490
1491 tree
1492 tree_ssa_strip_useless_type_conversions (tree exp)
1493 {
1494   while (tree_ssa_useless_type_conversion (exp))
1495     exp = TREE_OPERAND (exp, 0);
1496   return exp;
1497 }
1498
1499
1500 /* Internal helper for walk_use_def_chains.  VAR, FN and DATA are as
1501    described in walk_use_def_chains.
1502
1503    VISITED is a pointer set used to mark visited SSA_NAMEs to avoid
1504       infinite loops.  We used to have a bitmap for this to just mark
1505       SSA versions we had visited.  But non-sparse bitmaps are way too
1506       expensive, while sparse bitmaps may cause quadratic behavior.
1507
1508    IS_DFS is true if the caller wants to perform a depth-first search
1509       when visiting PHI nodes.  A DFS will visit each PHI argument and
1510       call FN after each one.  Otherwise, all the arguments are
1511       visited first and then FN is called with each of the visited
1512       arguments in a separate pass.  */
1513
1514 static bool
1515 walk_use_def_chains_1 (tree var, walk_use_def_chains_fn fn, void *data,
1516                        struct pointer_set_t *visited, bool is_dfs)
1517 {
1518   gimple def_stmt;
1519
1520   if (pointer_set_insert (visited, var))
1521     return false;
1522
1523   def_stmt = SSA_NAME_DEF_STMT (var);
1524
1525   if (gimple_code (def_stmt) != GIMPLE_PHI)
1526     {
1527       /* If we reached the end of the use-def chain, call FN.  */
1528       return fn (var, def_stmt, data);
1529     }
1530   else
1531     {
1532       size_t i;
1533
1534       /* When doing a breadth-first search, call FN before following the
1535          use-def links for each argument.  */
1536       if (!is_dfs)
1537         for (i = 0; i < gimple_phi_num_args (def_stmt); i++)
1538           if (fn (gimple_phi_arg_def (def_stmt, i), def_stmt, data))
1539             return true;
1540
1541       /* Follow use-def links out of each PHI argument.  */
1542       for (i = 0; i < gimple_phi_num_args (def_stmt); i++)
1543         {
1544           tree arg = gimple_phi_arg_def (def_stmt, i);
1545
1546           /* ARG may be NULL for newly introduced PHI nodes.  */
1547           if (arg
1548               && TREE_CODE (arg) == SSA_NAME
1549               && walk_use_def_chains_1 (arg, fn, data, visited, is_dfs))
1550             return true;
1551         }
1552
1553       /* When doing a depth-first search, call FN after following the
1554          use-def links for each argument.  */
1555       if (is_dfs)
1556         for (i = 0; i < gimple_phi_num_args (def_stmt); i++)
1557           if (fn (gimple_phi_arg_def (def_stmt, i), def_stmt, data))
1558             return true;
1559     }
1560
1561   return false;
1562 }
1563
1564
1565
1566 /* Walk use-def chains starting at the SSA variable VAR.  Call
1567    function FN at each reaching definition found.  FN takes three
1568    arguments: VAR, its defining statement (DEF_STMT) and a generic
1569    pointer to whatever state information that FN may want to maintain
1570    (DATA).  FN is able to stop the walk by returning true, otherwise
1571    in order to continue the walk, FN should return false.
1572
1573    Note, that if DEF_STMT is a PHI node, the semantics are slightly
1574    different.  The first argument to FN is no longer the original
1575    variable VAR, but the PHI argument currently being examined.  If FN
1576    wants to get at VAR, it should call PHI_RESULT (PHI).
1577
1578    If IS_DFS is true, this function will:
1579
1580         1- walk the use-def chains for all the PHI arguments, and,
1581         2- call (*FN) (ARG, PHI, DATA) on all the PHI arguments.
1582
1583    If IS_DFS is false, the two steps above are done in reverse order
1584    (i.e., a breadth-first search).  */
1585
1586 void
1587 walk_use_def_chains (tree var, walk_use_def_chains_fn fn, void *data,
1588                      bool is_dfs)
1589 {
1590   gimple def_stmt;
1591
1592   gcc_assert (TREE_CODE (var) == SSA_NAME);
1593
1594   def_stmt = SSA_NAME_DEF_STMT (var);
1595
1596   /* We only need to recurse if the reaching definition comes from a PHI
1597      node.  */
1598   if (gimple_code (def_stmt) != GIMPLE_PHI)
1599     (*fn) (var, def_stmt, data);
1600   else
1601     {
1602       struct pointer_set_t *visited = pointer_set_create ();
1603       walk_use_def_chains_1 (var, fn, data, visited, is_dfs);
1604       pointer_set_destroy (visited);
1605     }
1606 }
1607
1608 \f
1609 /* Emit warnings for uninitialized variables.  This is done in two passes.
1610
1611    The first pass notices real uses of SSA names with undefined values.
1612    Such uses are unconditionally uninitialized, and we can be certain that
1613    such a use is a mistake.  This pass is run before most optimizations,
1614    so that we catch as many as we can.
1615
1616    The second pass follows PHI nodes to find uses that are potentially
1617    uninitialized.  In this case we can't necessarily prove that the use
1618    is really uninitialized.  This pass is run after most optimizations,
1619    so that we thread as many jumps and possible, and delete as much dead
1620    code as possible, in order to reduce false positives.  We also look
1621    again for plain uninitialized variables, since optimization may have
1622    changed conditionally uninitialized to unconditionally uninitialized.  */
1623
1624 /* Emit a warning for T, an SSA_NAME, being uninitialized.  The exact
1625    warning text is in MSGID and LOCUS may contain a location or be null.  */
1626
1627 void
1628 warn_uninit (tree t, const char *gmsgid, void *data)
1629 {
1630   tree var = SSA_NAME_VAR (t);
1631   gimple context = (gimple) data;
1632   location_t location;
1633   expanded_location xloc, floc;
1634
1635   if (!ssa_undefined_value_p (t))
1636     return;
1637
1638   /* TREE_NO_WARNING either means we already warned, or the front end
1639      wishes to suppress the warning.  */
1640   if (TREE_NO_WARNING (var))
1641     return;
1642
1643   /* Do not warn if it can be initialized outside this module.  */
1644   if (is_global_var (var))
1645     return;
1646
1647   location = (context != NULL && gimple_has_location (context))
1648              ? gimple_location (context)
1649              : DECL_SOURCE_LOCATION (var);
1650   xloc = expand_location (location);
1651   floc = expand_location (DECL_SOURCE_LOCATION (cfun->decl));
1652   if (warning_at (location, OPT_Wuninitialized, gmsgid, var))
1653     {
1654       TREE_NO_WARNING (var) = 1;
1655
1656       if (location == DECL_SOURCE_LOCATION (var))
1657         return;
1658       if (xloc.file != floc.file
1659           || xloc.line < floc.line
1660           || xloc.line > LOCATION_LINE (cfun->function_end_locus))
1661         inform (DECL_SOURCE_LOCATION (var), "%qD was declared here", var);
1662     }
1663 }
1664
1665 struct walk_data {
1666   gimple stmt;
1667   bool always_executed;
1668   bool warn_possibly_uninitialized;
1669 };
1670
1671 /* Called via walk_tree, look for SSA_NAMEs that have empty definitions
1672    and warn about them.  */
1673
1674 static tree
1675 warn_uninitialized_var (tree *tp, int *walk_subtrees, void *data_)
1676 {
1677   struct walk_stmt_info *wi = (struct walk_stmt_info *) data_;
1678   struct walk_data *data = (struct walk_data *) wi->info;
1679   tree t = *tp;
1680
1681   /* We do not care about LHS.  */
1682   if (wi->is_lhs)
1683     {
1684       /* Except for operands of dereferences.  */
1685       if (!INDIRECT_REF_P (t)
1686           && TREE_CODE (t) != MEM_REF)
1687         return NULL_TREE;
1688       t = TREE_OPERAND (t, 0);
1689     }
1690
1691   switch (TREE_CODE (t))
1692     {
1693     case ADDR_EXPR:
1694       /* Taking the address of an uninitialized variable does not
1695          count as using it.  */
1696       *walk_subtrees = 0;
1697       break;
1698
1699     case VAR_DECL:
1700       {
1701         /* A VAR_DECL in the RHS of a gimple statement may mean that
1702            this variable is loaded from memory.  */
1703         use_operand_p vuse;
1704         tree op;
1705
1706         /* If there is not gimple stmt,
1707            or alias information has not been computed,
1708            then we cannot check VUSE ops.  */
1709         if (data->stmt == NULL)
1710           return NULL_TREE;
1711
1712         /* If the load happens as part of a call do not warn about it.  */
1713         if (is_gimple_call (data->stmt))
1714           return NULL_TREE;
1715
1716         vuse = gimple_vuse_op (data->stmt);
1717         if (vuse == NULL_USE_OPERAND_P)
1718           return NULL_TREE;
1719
1720         op = USE_FROM_PTR (vuse);
1721         if (t != SSA_NAME_VAR (op)
1722             || !SSA_NAME_IS_DEFAULT_DEF (op))
1723           return NULL_TREE;
1724         /* If this is a VUSE of t and it is the default definition,
1725            then warn about op.  */
1726         t = op;
1727         /* Fall through into SSA_NAME.  */
1728       }
1729
1730     case SSA_NAME:
1731       /* We only do data flow with SSA_NAMEs, so that's all we
1732          can warn about.  */
1733       if (data->always_executed)
1734         warn_uninit (t, "%qD is used uninitialized in this function",
1735                      data->stmt);
1736       else if (data->warn_possibly_uninitialized)
1737         warn_uninit (t, "%qD may be used uninitialized in this function",
1738                      data->stmt);
1739       *walk_subtrees = 0;
1740       break;
1741
1742     case REALPART_EXPR:
1743     case IMAGPART_EXPR:
1744       /* The total store transformation performed during gimplification
1745          creates uninitialized variable uses.  If all is well, these will
1746          be optimized away, so don't warn now.  */
1747       if (TREE_CODE (TREE_OPERAND (t, 0)) == SSA_NAME)
1748         *walk_subtrees = 0;
1749       break;
1750
1751     default:
1752       if (IS_TYPE_OR_DECL_P (t))
1753         *walk_subtrees = 0;
1754       break;
1755     }
1756
1757   return NULL_TREE;
1758 }
1759
1760 unsigned int
1761 warn_uninitialized_vars (bool warn_possibly_uninitialized)
1762 {
1763   gimple_stmt_iterator gsi;
1764   basic_block bb;
1765   struct walk_data data;
1766
1767   data.warn_possibly_uninitialized = warn_possibly_uninitialized;
1768
1769
1770   FOR_EACH_BB (bb)
1771     {
1772       data.always_executed = dominated_by_p (CDI_POST_DOMINATORS,
1773                                              single_succ (ENTRY_BLOCK_PTR), bb);
1774       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1775         {
1776           struct walk_stmt_info wi;
1777           data.stmt = gsi_stmt (gsi);
1778           if (is_gimple_debug (data.stmt))
1779             continue;
1780           memset (&wi, 0, sizeof (wi));
1781           wi.info = &data;
1782           walk_gimple_op (gsi_stmt (gsi), warn_uninitialized_var, &wi);
1783         }
1784     }
1785
1786   return 0;
1787 }
1788
1789 static unsigned int
1790 execute_early_warn_uninitialized (void)
1791 {
1792   /* Currently, this pass runs always but
1793      execute_late_warn_uninitialized only runs with optimization. With
1794      optimization we want to warn about possible uninitialized as late
1795      as possible, thus don't do it here.  However, without
1796      optimization we need to warn here about "may be uninitialized".
1797   */
1798   calculate_dominance_info (CDI_POST_DOMINATORS);
1799
1800   warn_uninitialized_vars (/*warn_possibly_uninitialized=*/!optimize);
1801
1802   /* Post-dominator information can not be reliably updated. Free it
1803      after the use.  */
1804
1805   free_dominance_info (CDI_POST_DOMINATORS);
1806   return 0;
1807 }
1808
1809 static bool
1810 gate_warn_uninitialized (void)
1811 {
1812   return warn_uninitialized != 0;
1813 }
1814
1815 struct gimple_opt_pass pass_early_warn_uninitialized =
1816 {
1817  {
1818   GIMPLE_PASS,
1819   "*early_warn_uninitialized",          /* name */
1820   gate_warn_uninitialized,              /* gate */
1821   execute_early_warn_uninitialized,     /* execute */
1822   NULL,                                 /* sub */
1823   NULL,                                 /* next */
1824   0,                                    /* static_pass_number */
1825   TV_TREE_UNINIT,                       /* tv_id */
1826   PROP_ssa,                             /* properties_required */
1827   0,                                    /* properties_provided */
1828   0,                                    /* properties_destroyed */
1829   0,                                    /* todo_flags_start */
1830   0                                     /* todo_flags_finish */
1831  }
1832 };
1833
1834
1835 /* If necessary, rewrite the base of the reference tree *TP from
1836    a MEM_REF to a plain or converted symbol.  */
1837
1838 static void
1839 maybe_rewrite_mem_ref_base (tree *tp)
1840 {
1841   tree sym;
1842
1843   while (handled_component_p (*tp))
1844     tp = &TREE_OPERAND (*tp, 0);
1845   if (TREE_CODE (*tp) == MEM_REF
1846       && TREE_CODE (TREE_OPERAND (*tp, 0)) == ADDR_EXPR
1847       && (sym = TREE_OPERAND (TREE_OPERAND (*tp, 0), 0))
1848       && DECL_P (sym)
1849       && !TREE_ADDRESSABLE (sym)
1850       && symbol_marked_for_renaming (sym))
1851     {
1852       if (TREE_CODE (TREE_TYPE (sym)) == VECTOR_TYPE
1853           && useless_type_conversion_p (TREE_TYPE (*tp),
1854                                         TREE_TYPE (TREE_TYPE (sym)))
1855           && multiple_of_p (sizetype, TREE_OPERAND (*tp, 1),
1856                             TYPE_SIZE_UNIT (TREE_TYPE (*tp))))
1857         {
1858           *tp = build3 (BIT_FIELD_REF, TREE_TYPE (*tp), sym, 
1859                         TYPE_SIZE (TREE_TYPE (*tp)),
1860                         int_const_binop (MULT_EXPR,
1861                                          bitsize_int (BITS_PER_UNIT),
1862                                          TREE_OPERAND (*tp, 1), 0));
1863         }
1864       else if (TREE_CODE (TREE_TYPE (sym)) == COMPLEX_TYPE
1865                && useless_type_conversion_p (TREE_TYPE (*tp),
1866                                              TREE_TYPE (TREE_TYPE (sym))))
1867         {
1868           *tp = build1 (integer_zerop (TREE_OPERAND (*tp, 1))
1869                         ? REALPART_EXPR : IMAGPART_EXPR,
1870                         TREE_TYPE (*tp), sym);
1871         }
1872       else if (integer_zerop (TREE_OPERAND (*tp, 1)))
1873         {
1874           if (!useless_type_conversion_p (TREE_TYPE (*tp),
1875                                           TREE_TYPE (sym)))
1876             *tp = build1 (VIEW_CONVERT_EXPR,
1877                           TREE_TYPE (*tp), sym);
1878           else
1879             *tp = sym;
1880         }
1881     }
1882 }
1883
1884 /* For a tree REF return its base if it is the base of a MEM_REF
1885    that cannot be rewritten into SSA form.  Otherwise return NULL_TREE.  */
1886
1887 static tree
1888 non_rewritable_mem_ref_base (tree ref)
1889 {
1890   tree base = ref;
1891
1892   /* A plain decl does not need it set.  */
1893   if (DECL_P (ref))
1894     return NULL_TREE;
1895
1896   while (handled_component_p (base))
1897     base = TREE_OPERAND (base, 0);
1898
1899   /* But watch out for MEM_REFs we cannot lower to a
1900      VIEW_CONVERT_EXPR or a BIT_FIELD_REF.  */
1901   if (TREE_CODE (base) == MEM_REF
1902       && TREE_CODE (TREE_OPERAND (base, 0)) == ADDR_EXPR)
1903     {
1904       tree decl = TREE_OPERAND (TREE_OPERAND (base, 0), 0);
1905       if ((TREE_CODE (TREE_TYPE (decl)) == VECTOR_TYPE
1906            || TREE_CODE (TREE_TYPE (decl)) == COMPLEX_TYPE)
1907           && useless_type_conversion_p (TREE_TYPE (base),
1908                                         TREE_TYPE (TREE_TYPE (decl)))
1909           && double_int_fits_in_uhwi_p (mem_ref_offset (base))
1910           && double_int_ucmp
1911                (tree_to_double_int (TYPE_SIZE_UNIT (TREE_TYPE (decl))),
1912                 mem_ref_offset (base)) == 1
1913           && multiple_of_p (sizetype, TREE_OPERAND (base, 1),
1914                             TYPE_SIZE_UNIT (TREE_TYPE (base))))
1915         return NULL_TREE;
1916       if (DECL_P (decl)
1917           && (!integer_zerop (TREE_OPERAND (base, 1))
1918               || (DECL_SIZE (decl)
1919                   != TYPE_SIZE (TREE_TYPE (base)))
1920               || TREE_THIS_VOLATILE (decl) != TREE_THIS_VOLATILE (base)))
1921         return decl;
1922     }
1923
1924   return NULL_TREE;
1925 }
1926
1927 /* For an lvalue tree LHS return true if it cannot be rewritten into SSA form.
1928    Otherwise return true.  */
1929
1930 static bool 
1931 non_rewritable_lvalue_p (tree lhs)
1932 {
1933   /* A plain decl is always rewritable.  */
1934   if (DECL_P (lhs))
1935     return false;
1936
1937   /* A decl that is wrapped inside a MEM-REF that covers
1938      it full is also rewritable.
1939      ???  The following could be relaxed allowing component
1940      references that do not change the access size.  */
1941   if (TREE_CODE (lhs) == MEM_REF
1942       && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR
1943       && integer_zerop (TREE_OPERAND (lhs, 1)))
1944     {
1945       tree decl = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0);
1946       if (DECL_P (decl)
1947           && DECL_SIZE (decl) == TYPE_SIZE (TREE_TYPE (lhs))
1948           && (TREE_THIS_VOLATILE (decl) == TREE_THIS_VOLATILE (lhs)))
1949         return false;
1950     }
1951
1952   return true;
1953 }
1954
1955 /* When possible, clear TREE_ADDRESSABLE bit or set DECL_GIMPLE_REG_P bit and
1956    mark the variable VAR for conversion into SSA.  Return true when updating
1957    stmts is required.  */
1958
1959 static bool
1960 maybe_optimize_var (tree var, bitmap addresses_taken, bitmap not_reg_needs)
1961 {
1962   bool update_vops = false;
1963
1964   /* Global Variables, result decls cannot be changed.  */
1965   if (is_global_var (var)
1966       || TREE_CODE (var) == RESULT_DECL
1967       || bitmap_bit_p (addresses_taken, DECL_UID (var)))
1968     return false;
1969
1970   /* If the variable is not in the list of referenced vars then we
1971      do not need to touch it nor can we rename it.  */
1972   if (!referenced_var_lookup (cfun, DECL_UID (var)))
1973     return false;
1974
1975   if (TREE_ADDRESSABLE (var)
1976       /* Do not change TREE_ADDRESSABLE if we need to preserve var as
1977          a non-register.  Otherwise we are confused and forget to
1978          add virtual operands for it.  */
1979       && (!is_gimple_reg_type (TREE_TYPE (var))
1980           || !bitmap_bit_p (not_reg_needs, DECL_UID (var))))
1981     {
1982       TREE_ADDRESSABLE (var) = 0;
1983       if (is_gimple_reg (var))
1984         mark_sym_for_renaming (var);
1985       update_vops = true;
1986       if (dump_file)
1987         {
1988           fprintf (dump_file, "No longer having address taken: ");
1989           print_generic_expr (dump_file, var, 0);
1990           fprintf (dump_file, "\n");
1991         }
1992     }
1993
1994   if (!DECL_GIMPLE_REG_P (var)
1995       && !bitmap_bit_p (not_reg_needs, DECL_UID (var))
1996       && (TREE_CODE (TREE_TYPE (var)) == COMPLEX_TYPE
1997           || TREE_CODE (TREE_TYPE (var)) == VECTOR_TYPE)
1998       && !TREE_THIS_VOLATILE (var)
1999       && (TREE_CODE (var) != VAR_DECL || !DECL_HARD_REGISTER (var)))
2000     {
2001       DECL_GIMPLE_REG_P (var) = 1;
2002       mark_sym_for_renaming (var);
2003       update_vops = true;
2004       if (dump_file)
2005         {
2006           fprintf (dump_file, "Now a gimple register: ");
2007           print_generic_expr (dump_file, var, 0);
2008           fprintf (dump_file, "\n");
2009         }
2010     }
2011
2012   return update_vops;
2013 }
2014
2015 /* Compute TREE_ADDRESSABLE and DECL_GIMPLE_REG_P for local variables.  */
2016
2017 void
2018 execute_update_addresses_taken (void)
2019 {
2020   gimple_stmt_iterator gsi;
2021   basic_block bb;
2022   bitmap addresses_taken = BITMAP_ALLOC (NULL);
2023   bitmap not_reg_needs = BITMAP_ALLOC (NULL);
2024   bool update_vops = false;
2025   tree var;
2026   unsigned i;
2027
2028   timevar_push (TV_ADDRESS_TAKEN);
2029
2030   /* Collect into ADDRESSES_TAKEN all variables whose address is taken within
2031      the function body.  */
2032   FOR_EACH_BB (bb)
2033     {
2034       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
2035         {
2036           gimple stmt = gsi_stmt (gsi);
2037           enum gimple_code code = gimple_code (stmt);
2038           tree decl;
2039
2040           /* Note all addresses taken by the stmt.  */
2041           gimple_ior_addresses_taken (addresses_taken, stmt);
2042
2043           /* If we have a call or an assignment, see if the lhs contains
2044              a local decl that requires not to be a gimple register.  */
2045           if (code == GIMPLE_ASSIGN || code == GIMPLE_CALL)
2046             {
2047               tree lhs = gimple_get_lhs (stmt);
2048               if (lhs
2049                   && TREE_CODE (lhs) != SSA_NAME
2050                   && non_rewritable_lvalue_p (lhs))
2051                 {
2052                   decl = get_base_address (lhs);
2053                   if (DECL_P (decl))
2054                     bitmap_set_bit (not_reg_needs, DECL_UID (decl));
2055                 }
2056             }
2057
2058           if (gimple_assign_single_p (stmt))
2059             {
2060               tree rhs = gimple_assign_rhs1 (stmt);
2061               if ((decl = non_rewritable_mem_ref_base (rhs)))
2062                 bitmap_set_bit (not_reg_needs, DECL_UID (decl));
2063             }
2064
2065           else if (code == GIMPLE_CALL)
2066             {
2067               for (i = 0; i < gimple_call_num_args (stmt); ++i)
2068                 {
2069                   tree arg = gimple_call_arg (stmt, i);
2070                   if ((decl = non_rewritable_mem_ref_base (arg)))
2071                     bitmap_set_bit (not_reg_needs, DECL_UID (decl));
2072                 }
2073             }
2074
2075           else if (code == GIMPLE_ASM)
2076             {
2077               for (i = 0; i < gimple_asm_noutputs (stmt); ++i)
2078                 {
2079                   tree link = gimple_asm_output_op (stmt, i);
2080                   tree lhs = TREE_VALUE (link);
2081                   if (TREE_CODE (lhs) != SSA_NAME)
2082                     {
2083                       decl = get_base_address (lhs);
2084                       if (DECL_P (decl)
2085                           && (non_rewritable_lvalue_p (lhs)
2086                               /* We cannot move required conversions from
2087                                  the lhs to the rhs in asm statements, so
2088                                  require we do not need any.  */
2089                               || !useless_type_conversion_p
2090                                     (TREE_TYPE (lhs), TREE_TYPE (decl))))
2091                         bitmap_set_bit (not_reg_needs, DECL_UID (decl));
2092                     }
2093                 }
2094               for (i = 0; i < gimple_asm_ninputs (stmt); ++i)
2095                 {
2096                   tree link = gimple_asm_input_op (stmt, i);
2097                   if ((decl = non_rewritable_mem_ref_base (TREE_VALUE (link))))
2098                     bitmap_set_bit (not_reg_needs, DECL_UID (decl));
2099                 }
2100             }
2101         }
2102
2103       for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
2104         {
2105           size_t i;
2106           gimple phi = gsi_stmt (gsi);
2107
2108           for (i = 0; i < gimple_phi_num_args (phi); i++)
2109             {
2110               tree op = PHI_ARG_DEF (phi, i), var;
2111               if (TREE_CODE (op) == ADDR_EXPR
2112                   && (var = get_base_address (TREE_OPERAND (op, 0))) != NULL
2113                   && DECL_P (var))
2114                 bitmap_set_bit (addresses_taken, DECL_UID (var));
2115             }
2116         }
2117     }
2118
2119   /* We cannot iterate over all referenced vars because that can contain
2120      unused vars from BLOCK trees, which causes code generation differences
2121      for -g vs. -g0.  */
2122   for (var = DECL_ARGUMENTS (cfun->decl); var; var = DECL_CHAIN (var))
2123     update_vops |= maybe_optimize_var (var, addresses_taken, not_reg_needs);
2124
2125   FOR_EACH_VEC_ELT (tree, cfun->local_decls, i, var)
2126     update_vops |= maybe_optimize_var (var, addresses_taken, not_reg_needs);
2127
2128   /* Operand caches need to be recomputed for operands referencing the updated
2129      variables.  */
2130   if (update_vops)
2131     {
2132       FOR_EACH_BB (bb)
2133         for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
2134           {
2135             gimple stmt = gsi_stmt (gsi);
2136
2137             /* Re-write TARGET_MEM_REFs of symbols we want to
2138                rewrite into SSA form.  */
2139             if (gimple_assign_single_p (stmt))
2140               {
2141                 tree lhs = gimple_assign_lhs (stmt);
2142                 tree rhs, *rhsp = gimple_assign_rhs1_ptr (stmt);
2143                 tree sym;
2144
2145                 /* We shouldn't have any fancy wrapping of
2146                    component-refs on the LHS, but look through
2147                    VIEW_CONVERT_EXPRs as that is easy.  */
2148                 while (TREE_CODE (lhs) == VIEW_CONVERT_EXPR)
2149                   lhs = TREE_OPERAND (lhs, 0);
2150                 if (TREE_CODE (lhs) == MEM_REF
2151                     && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR
2152                     && integer_zerop (TREE_OPERAND (lhs, 1))
2153                     && (sym = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0))
2154                     && DECL_P (sym)
2155                     && !TREE_ADDRESSABLE (sym)
2156                     && symbol_marked_for_renaming (sym))
2157                   lhs = sym;
2158                 else
2159                   lhs = gimple_assign_lhs (stmt);
2160
2161                 /* Rewrite the RHS and make sure the resulting assignment
2162                    is validly typed.  */
2163                 maybe_rewrite_mem_ref_base (rhsp);
2164                 rhs = gimple_assign_rhs1 (stmt);
2165                 if (gimple_assign_lhs (stmt) != lhs
2166                     && !useless_type_conversion_p (TREE_TYPE (lhs),
2167                                                    TREE_TYPE (rhs)))
2168                   rhs = fold_build1 (VIEW_CONVERT_EXPR,
2169                                      TREE_TYPE (lhs), rhs);
2170
2171                 if (gimple_assign_lhs (stmt) != lhs)
2172                   gimple_assign_set_lhs (stmt, lhs);
2173
2174                 if (gimple_assign_rhs1 (stmt) != rhs)
2175                   {
2176                     gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
2177                     gimple_assign_set_rhs_from_tree (&gsi, rhs);
2178                   }
2179               }
2180
2181             else if (gimple_code (stmt) == GIMPLE_CALL)
2182               {
2183                 unsigned i;
2184                 for (i = 0; i < gimple_call_num_args (stmt); ++i)
2185                   {
2186                     tree *argp = gimple_call_arg_ptr (stmt, i);
2187                     maybe_rewrite_mem_ref_base (argp);
2188                   }
2189               }
2190
2191             else if (gimple_code (stmt) == GIMPLE_ASM)
2192               {
2193                 unsigned i;
2194                 for (i = 0; i < gimple_asm_noutputs (stmt); ++i)
2195                   {
2196                     tree link = gimple_asm_output_op (stmt, i);
2197                     maybe_rewrite_mem_ref_base (&TREE_VALUE (link));
2198                   }
2199                 for (i = 0; i < gimple_asm_ninputs (stmt); ++i)
2200                   {
2201                     tree link = gimple_asm_input_op (stmt, i);
2202                     maybe_rewrite_mem_ref_base (&TREE_VALUE (link));
2203                   }
2204               }
2205
2206             if (gimple_references_memory_p (stmt)
2207                 || is_gimple_debug (stmt))
2208               update_stmt (stmt);
2209           }
2210
2211       /* Update SSA form here, we are called as non-pass as well.  */
2212       update_ssa (TODO_update_ssa);
2213     }
2214
2215   BITMAP_FREE (not_reg_needs);
2216   BITMAP_FREE (addresses_taken);
2217   timevar_pop (TV_ADDRESS_TAKEN);
2218 }
2219
2220 struct gimple_opt_pass pass_update_address_taken =
2221 {
2222  {
2223   GIMPLE_PASS,
2224   "addressables",                       /* name */
2225   NULL,                                 /* gate */
2226   NULL,                                 /* execute */
2227   NULL,                                 /* sub */
2228   NULL,                                 /* next */
2229   0,                                    /* static_pass_number */
2230   TV_ADDRESS_TAKEN,                     /* tv_id */
2231   PROP_ssa,                             /* properties_required */
2232   0,                                    /* properties_provided */
2233   0,                                    /* properties_destroyed */
2234   0,                                    /* todo_flags_start */
2235   TODO_update_address_taken
2236   | TODO_dump_func                      /* todo_flags_finish */
2237  }
2238 };