OSDN Git Service

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