OSDN Git Service

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