Update gcc-50 to SVN version 220677
[dragonfly.git] / contrib / gcc-5.0 / gcc / tree-ssa.c
1 /* Miscellaneous SSA utility functions.
2    Copyright (C) 2001-2015 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
10
11 GCC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "tm.h"
24 #include "hash-set.h"
25 #include "machmode.h"
26 #include "vec.h"
27 #include "double-int.h"
28 #include "input.h"
29 #include "alias.h"
30 #include "symtab.h"
31 #include "wide-int.h"
32 #include "inchash.h"
33 #include "tree.h"
34 #include "fold-const.h"
35 #include "stor-layout.h"
36 #include "flags.h"
37 #include "tm_p.h"
38 #include "target.h"
39 #include "langhooks.h"
40 #include "predict.h"
41 #include "hard-reg-set.h"
42 #include "input.h"
43 #include "function.h"
44 #include "dominance.h"
45 #include "cfg.h"
46 #include "basic-block.h"
47 #include "gimple-pretty-print.h"
48 #include "tree-ssa-alias.h"
49 #include "internal-fn.h"
50 #include "gimple-fold.h"
51 #include "gimple-expr.h"
52 #include "is-a.h"
53 #include "gimple.h"
54 #include "gimplify.h"
55 #include "gimple-iterator.h"
56 #include "gimple-walk.h"
57 #include "gimple-ssa.h"
58 #include "tree-phinodes.h"
59 #include "ssa-iterators.h"
60 #include "stringpool.h"
61 #include "tree-ssanames.h"
62 #include "tree-ssa-loop-manip.h"
63 #include "tree-into-ssa.h"
64 #include "tree-ssa.h"
65 #include "tree-inline.h"
66 #include "hash-map.h"
67 #include "tree-pass.h"
68 #include "diagnostic-core.h"
69 #include "cfgloop.h"
70 #include "cfgexpand.h"
71
72 /* Pointer map of variable mappings, keyed by edge.  */
73 static hash_map<edge, auto_vec<edge_var_map> > *edge_var_maps;
74
75
76 /* Add a mapping with PHI RESULT and PHI DEF associated with edge E.  */
77
78 void
79 redirect_edge_var_map_add (edge e, tree result, tree def, source_location locus)
80 {
81   edge_var_map new_node;
82
83   if (edge_var_maps == NULL)
84     edge_var_maps = new hash_map<edge, auto_vec<edge_var_map> >;
85
86   auto_vec<edge_var_map> &slot = edge_var_maps->get_or_insert (e);
87   new_node.def = def;
88   new_node.result = result;
89   new_node.locus = locus;
90
91   slot.safe_push (new_node);
92 }
93
94
95 /* Clear the var mappings in edge E.  */
96
97 void
98 redirect_edge_var_map_clear (edge e)
99 {
100   if (!edge_var_maps)
101     return;
102
103   auto_vec<edge_var_map> *head = edge_var_maps->get (e);
104
105   if (head)
106     head->release ();
107 }
108
109
110 /* Duplicate the redirected var mappings in OLDE in NEWE.
111
112    This assumes a hash_map can have multiple edges mapping to the same
113    var_map (many to one mapping), since we don't remove the previous mappings.
114    */
115
116 void
117 redirect_edge_var_map_dup (edge newe, edge olde)
118 {
119   if (!edge_var_maps)
120     return;
121
122   auto_vec<edge_var_map> *new_head = &edge_var_maps->get_or_insert (newe);
123   auto_vec<edge_var_map> *old_head = edge_var_maps->get (olde);
124   if (!old_head)
125     return;
126
127   new_head->safe_splice (*old_head);
128 }
129
130
131 /* Return the variable mappings for a given edge.  If there is none, return
132    NULL.  */
133
134 vec<edge_var_map> *
135 redirect_edge_var_map_vector (edge e)
136 {
137   /* Hey, what kind of idiot would... you'd be surprised.  */
138   if (!edge_var_maps)
139     return NULL;
140
141   auto_vec<edge_var_map> *slot = edge_var_maps->get (e);
142   if (!slot)
143     return NULL;
144
145   return slot;
146 }
147
148 /* Clear the edge variable mappings.  */
149
150 void
151 redirect_edge_var_map_destroy (void)
152 {
153   delete edge_var_maps;
154   edge_var_maps = NULL;
155 }
156
157
158 /* Remove the corresponding arguments from the PHI nodes in E's
159    destination block and redirect it to DEST.  Return redirected edge.
160    The list of removed arguments is stored in a vector accessed
161    through edge_var_maps.  */
162
163 edge
164 ssa_redirect_edge (edge e, basic_block dest)
165 {
166   gphi_iterator gsi;
167   gphi *phi;
168
169   redirect_edge_var_map_clear (e);
170
171   /* Remove the appropriate PHI arguments in E's destination block.  */
172   for (gsi = gsi_start_phis (e->dest); !gsi_end_p (gsi); gsi_next (&gsi))
173     {
174       tree def;
175       source_location locus ;
176
177       phi = gsi.phi ();
178       def = gimple_phi_arg_def (phi, e->dest_idx);
179       locus = gimple_phi_arg_location (phi, e->dest_idx);
180
181       if (def == NULL_TREE)
182         continue;
183
184       redirect_edge_var_map_add (e, gimple_phi_result (phi), def, locus);
185     }
186
187   e = redirect_edge_succ_nodup (e, dest);
188
189   return e;
190 }
191
192
193 /* Add PHI arguments queued in PENDING_STMT list on edge E to edge
194    E->dest.  */
195
196 void
197 flush_pending_stmts (edge e)
198 {
199   gphi *phi;
200   edge_var_map *vm;
201   int i;
202   gphi_iterator gsi;
203
204   vec<edge_var_map> *v = redirect_edge_var_map_vector (e);
205   if (!v)
206     return;
207
208   for (gsi = gsi_start_phis (e->dest), i = 0;
209        !gsi_end_p (gsi) && v->iterate (i, &vm);
210        gsi_next (&gsi), i++)
211     {
212       tree def;
213
214       phi = gsi.phi ();
215       def = redirect_edge_var_map_def (vm);
216       add_phi_arg (phi, def, e, redirect_edge_var_map_location (vm));
217     }
218
219   redirect_edge_var_map_clear (e);
220 }
221
222 /* Replace the LHS of STMT, an assignment, either a GIMPLE_ASSIGN or a
223    GIMPLE_CALL, with NLHS, in preparation for modifying the RHS to an
224    expression with a different value.
225
226    This will update any annotations (say debug bind stmts) referring
227    to the original LHS, so that they use the RHS instead.  This is
228    done even if NLHS and LHS are the same, for it is understood that
229    the RHS will be modified afterwards, and NLHS will not be assigned
230    an equivalent value.
231
232    Adjusting any non-annotation uses of the LHS, if needed, is a
233    responsibility of the caller.
234
235    The effect of this call should be pretty much the same as that of
236    inserting a copy of STMT before STMT, and then removing the
237    original stmt, at which time gsi_remove() would have update
238    annotations, but using this function saves all the inserting,
239    copying and removing.  */
240
241 void
242 gimple_replace_ssa_lhs (gimple stmt, tree nlhs)
243 {
244   if (MAY_HAVE_DEBUG_STMTS)
245     {
246       tree lhs = gimple_get_lhs (stmt);
247
248       gcc_assert (SSA_NAME_DEF_STMT (lhs) == stmt);
249
250       insert_debug_temp_for_var_def (NULL, lhs);
251     }
252
253   gimple_set_lhs (stmt, nlhs);
254 }
255
256
257 /* Given a tree for an expression for which we might want to emit
258    locations or values in debug information (generally a variable, but
259    we might deal with other kinds of trees in the future), return the
260    tree that should be used as the variable of a DEBUG_BIND STMT or
261    VAR_LOCATION INSN or NOTE.  Return NULL if VAR is not to be tracked.  */
262
263 tree
264 target_for_debug_bind (tree var)
265 {
266   if (!MAY_HAVE_DEBUG_STMTS)
267     return NULL_TREE;
268
269   if (TREE_CODE (var) == SSA_NAME)
270     {
271       var = SSA_NAME_VAR (var);
272       if (var == NULL_TREE)
273         return NULL_TREE;
274     }
275
276   if ((TREE_CODE (var) != VAR_DECL
277        || VAR_DECL_IS_VIRTUAL_OPERAND (var))
278       && TREE_CODE (var) != PARM_DECL)
279     return NULL_TREE;
280
281   if (DECL_HAS_VALUE_EXPR_P (var))
282     return target_for_debug_bind (DECL_VALUE_EXPR (var));
283
284   if (DECL_IGNORED_P (var))
285     return NULL_TREE;
286
287   /* var-tracking only tracks registers.  */
288   if (!is_gimple_reg_type (TREE_TYPE (var)))
289     return NULL_TREE;
290
291   return var;
292 }
293
294 /* Called via walk_tree, look for SSA_NAMEs that have already been
295    released.  */
296
297 static tree
298 find_released_ssa_name (tree *tp, int *walk_subtrees, void *data_)
299 {
300   struct walk_stmt_info *wi = (struct walk_stmt_info *) data_;
301
302   if (wi && wi->is_lhs)
303     return NULL_TREE;
304
305   if (TREE_CODE (*tp) == SSA_NAME)
306     {
307       if (SSA_NAME_IN_FREE_LIST (*tp))
308         return *tp;
309
310       *walk_subtrees = 0;
311     }
312   else if (IS_TYPE_OR_DECL_P (*tp))
313     *walk_subtrees = 0;
314
315   return NULL_TREE;
316 }
317
318 /* Insert a DEBUG BIND stmt before the DEF of VAR if VAR is referenced
319    by other DEBUG stmts, and replace uses of the DEF with the
320    newly-created debug temp.  */
321
322 void
323 insert_debug_temp_for_var_def (gimple_stmt_iterator *gsi, tree var)
324 {
325   imm_use_iterator imm_iter;
326   use_operand_p use_p;
327   gimple stmt;
328   gimple def_stmt = NULL;
329   int usecount = 0;
330   tree value = NULL;
331
332   if (!MAY_HAVE_DEBUG_STMTS)
333     return;
334
335   /* If this name has already been registered for replacement, do nothing
336      as anything that uses this name isn't in SSA form.  */
337   if (name_registered_for_update_p (var))
338     return;
339
340   /* Check whether there are debug stmts that reference this variable and,
341      if there are, decide whether we should use a debug temp.  */
342   FOR_EACH_IMM_USE_FAST (use_p, imm_iter, var)
343     {
344       stmt = USE_STMT (use_p);
345
346       if (!gimple_debug_bind_p (stmt))
347         continue;
348
349       if (usecount++)
350         break;
351
352       if (gimple_debug_bind_get_value (stmt) != var)
353         {
354           /* Count this as an additional use, so as to make sure we
355              use a temp unless VAR's definition has a SINGLE_RHS that
356              can be shared.  */
357           usecount++;
358           break;
359         }
360     }
361
362   if (!usecount)
363     return;
364
365   if (gsi)
366     def_stmt = gsi_stmt (*gsi);
367   else
368     def_stmt = SSA_NAME_DEF_STMT (var);
369
370   /* If we didn't get an insertion point, and the stmt has already
371      been removed, we won't be able to insert the debug bind stmt, so
372      we'll have to drop debug information.  */
373   if (gimple_code (def_stmt) == GIMPLE_PHI)
374     {
375       value = degenerate_phi_result (as_a <gphi *> (def_stmt));
376       if (value && walk_tree (&value, find_released_ssa_name, NULL, NULL))
377         value = NULL;
378       /* error_mark_node is what fixup_noreturn_call changes PHI arguments
379          to.  */
380       else if (value == error_mark_node)
381         value = NULL;
382     }
383   else if (is_gimple_assign (def_stmt))
384     {
385       bool no_value = false;
386
387       if (!dom_info_available_p (CDI_DOMINATORS))
388         {
389           struct walk_stmt_info wi;
390
391           memset (&wi, 0, sizeof (wi));
392
393           /* When removing blocks without following reverse dominance
394              order, we may sometimes encounter SSA_NAMEs that have
395              already been released, referenced in other SSA_DEFs that
396              we're about to release.  Consider:
397
398              <bb X>:
399              v_1 = foo;
400
401              <bb Y>:
402              w_2 = v_1 + bar;
403              # DEBUG w => w_2
404
405              If we deleted BB X first, propagating the value of w_2
406              won't do us any good.  It's too late to recover their
407              original definition of v_1: when it was deleted, it was
408              only referenced in other DEFs, it couldn't possibly know
409              it should have been retained, and propagating every
410              single DEF just in case it might have to be propagated
411              into a DEBUG STMT would probably be too wasteful.
412
413              When dominator information is not readily available, we
414              check for and accept some loss of debug information.  But
415              if it is available, there's no excuse for us to remove
416              blocks in the wrong order, so we don't even check for
417              dead SSA NAMEs.  SSA verification shall catch any
418              errors.  */
419           if ((!gsi && !gimple_bb (def_stmt))
420               || walk_gimple_op (def_stmt, find_released_ssa_name, &wi))
421             no_value = true;
422         }
423
424       if (!no_value)
425         value = gimple_assign_rhs_to_tree (def_stmt);
426     }
427
428   if (value)
429     {
430       /* If there's a single use of VAR, and VAR is the entire debug
431          expression (usecount would have been incremented again
432          otherwise), and the definition involves only constants and
433          SSA names, then we can propagate VALUE into this single use,
434          avoiding the temp.
435
436          We can also avoid using a temp if VALUE can be shared and
437          propagated into all uses, without generating expressions that
438          wouldn't be valid gimple RHSs.
439
440          Other cases that would require unsharing or non-gimple RHSs
441          are deferred to a debug temp, although we could avoid temps
442          at the expense of duplication of expressions.  */
443
444       if (CONSTANT_CLASS_P (value)
445           || gimple_code (def_stmt) == GIMPLE_PHI
446           || (usecount == 1
447               && (!gimple_assign_single_p (def_stmt)
448                   || is_gimple_min_invariant (value)))
449           || is_gimple_reg (value))
450         ;
451       else
452         {
453           gdebug *def_temp;
454           tree vexpr = make_node (DEBUG_EXPR_DECL);
455
456           def_temp = gimple_build_debug_bind (vexpr,
457                                               unshare_expr (value),
458                                               def_stmt);
459
460           DECL_ARTIFICIAL (vexpr) = 1;
461           TREE_TYPE (vexpr) = TREE_TYPE (value);
462           if (DECL_P (value))
463             DECL_MODE (vexpr) = DECL_MODE (value);
464           else
465             DECL_MODE (vexpr) = TYPE_MODE (TREE_TYPE (value));
466
467           if (gsi)
468             gsi_insert_before (gsi, def_temp, GSI_SAME_STMT);
469           else
470             {
471               gimple_stmt_iterator ngsi = gsi_for_stmt (def_stmt);
472               gsi_insert_before (&ngsi, def_temp, GSI_SAME_STMT);
473             }
474
475           value = vexpr;
476         }
477     }
478
479   FOR_EACH_IMM_USE_STMT (stmt, imm_iter, var)
480     {
481       if (!gimple_debug_bind_p (stmt))
482         continue;
483
484       if (value)
485         {
486           FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
487             /* unshare_expr is not needed here.  vexpr is either a
488                SINGLE_RHS, that can be safely shared, some other RHS
489                that was unshared when we found it had a single debug
490                use, or a DEBUG_EXPR_DECL, that can be safely
491                shared.  */
492             SET_USE (use_p, unshare_expr (value));
493           /* If we didn't replace uses with a debug decl fold the
494              resulting expression.  Otherwise we end up with invalid IL.  */
495           if (TREE_CODE (value) != DEBUG_EXPR_DECL)
496             {
497               gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
498               fold_stmt_inplace (&gsi);
499             }
500         }
501       else
502         gimple_debug_bind_reset_value (stmt);
503
504       update_stmt (stmt);
505     }
506 }
507
508
509 /* Insert a DEBUG BIND stmt before STMT for each DEF referenced by
510    other DEBUG stmts, and replace uses of the DEF with the
511    newly-created debug temp.  */
512
513 void
514 insert_debug_temps_for_defs (gimple_stmt_iterator *gsi)
515 {
516   gimple stmt;
517   ssa_op_iter op_iter;
518   def_operand_p def_p;
519
520   if (!MAY_HAVE_DEBUG_STMTS)
521     return;
522
523   stmt = gsi_stmt (*gsi);
524
525   FOR_EACH_PHI_OR_STMT_DEF (def_p, stmt, op_iter, SSA_OP_DEF)
526     {
527       tree var = DEF_FROM_PTR (def_p);
528
529       if (TREE_CODE (var) != SSA_NAME)
530         continue;
531
532       insert_debug_temp_for_var_def (gsi, var);
533     }
534 }
535
536 /* Reset all debug stmts that use SSA_NAME(s) defined in STMT.  */
537
538 void
539 reset_debug_uses (gimple stmt)
540 {
541   ssa_op_iter op_iter;
542   def_operand_p def_p;
543   imm_use_iterator imm_iter;
544   gimple use_stmt;
545
546   if (!MAY_HAVE_DEBUG_STMTS)
547     return;
548
549   FOR_EACH_PHI_OR_STMT_DEF (def_p, stmt, op_iter, SSA_OP_DEF)
550     {
551       tree var = DEF_FROM_PTR (def_p);
552
553       if (TREE_CODE (var) != SSA_NAME)
554         continue;
555
556       FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, var)
557         {
558           if (!gimple_debug_bind_p (use_stmt))
559             continue;
560
561           gimple_debug_bind_reset_value (use_stmt);
562           update_stmt (use_stmt);
563         }
564     }
565 }
566
567 /* Delete SSA DEFs for SSA versions in the TOREMOVE bitmap, removing
568    dominated stmts before their dominators, so that release_ssa_defs
569    stands a chance of propagating DEFs into debug bind stmts.  */
570
571 void
572 release_defs_bitset (bitmap toremove)
573 {
574   unsigned j;
575   bitmap_iterator bi;
576
577   /* Performing a topological sort is probably overkill, this will
578      most likely run in slightly superlinear time, rather than the
579      pathological quadratic worst case.  */
580   while (!bitmap_empty_p (toremove))
581     EXECUTE_IF_SET_IN_BITMAP (toremove, 0, j, bi)
582       {
583         bool remove_now = true;
584         tree var = ssa_name (j);
585         gimple stmt;
586         imm_use_iterator uit;
587
588         FOR_EACH_IMM_USE_STMT (stmt, uit, var)
589           {
590             ssa_op_iter dit;
591             def_operand_p def_p;
592
593             /* We can't propagate PHI nodes into debug stmts.  */
594             if (gimple_code (stmt) == GIMPLE_PHI
595                 || is_gimple_debug (stmt))
596               continue;
597
598             /* If we find another definition to remove that uses
599                the one we're looking at, defer the removal of this
600                one, so that it can be propagated into debug stmts
601                after the other is.  */
602             FOR_EACH_SSA_DEF_OPERAND (def_p, stmt, dit, SSA_OP_DEF)
603               {
604                 tree odef = DEF_FROM_PTR (def_p);
605
606                 if (bitmap_bit_p (toremove, SSA_NAME_VERSION (odef)))
607                   {
608                     remove_now = false;
609                     break;
610                   }
611               }
612
613             if (!remove_now)
614               BREAK_FROM_IMM_USE_STMT (uit);
615           }
616
617         if (remove_now)
618           {
619             gimple def = SSA_NAME_DEF_STMT (var);
620             gimple_stmt_iterator gsi = gsi_for_stmt (def);
621
622             if (gimple_code (def) == GIMPLE_PHI)
623               remove_phi_node (&gsi, true);
624             else
625               {
626                 gsi_remove (&gsi, true);
627                 release_defs (def);
628               }
629
630             bitmap_clear_bit (toremove, j);
631           }
632       }
633 }
634
635 /* Return true if SSA_NAME is malformed and mark it visited.
636
637    IS_VIRTUAL is true if this SSA_NAME was found inside a virtual
638       operand.  */
639
640 static bool
641 verify_ssa_name (tree ssa_name, bool is_virtual)
642 {
643   if (TREE_CODE (ssa_name) != SSA_NAME)
644     {
645       error ("expected an SSA_NAME object");
646       return true;
647     }
648
649   if (SSA_NAME_IN_FREE_LIST (ssa_name))
650     {
651       error ("found an SSA_NAME that had been released into the free pool");
652       return true;
653     }
654
655   if (SSA_NAME_VAR (ssa_name) != NULL_TREE
656       && TREE_TYPE (ssa_name) != TREE_TYPE (SSA_NAME_VAR (ssa_name)))
657     {
658       error ("type mismatch between an SSA_NAME and its symbol");
659       return true;
660     }
661
662   if (is_virtual && !virtual_operand_p (ssa_name))
663     {
664       error ("found a virtual definition for a GIMPLE register");
665       return true;
666     }
667
668   if (is_virtual && SSA_NAME_VAR (ssa_name) != gimple_vop (cfun))
669     {
670       error ("virtual SSA name for non-VOP decl");
671       return true;
672     }
673
674   if (!is_virtual && virtual_operand_p (ssa_name))
675     {
676       error ("found a real definition for a non-register");
677       return true;
678     }
679
680   if (SSA_NAME_IS_DEFAULT_DEF (ssa_name)
681       && !gimple_nop_p (SSA_NAME_DEF_STMT (ssa_name)))
682     {
683       error ("found a default name with a non-empty defining statement");
684       return true;
685     }
686
687   return false;
688 }
689
690
691 /* Return true if the definition of SSA_NAME at block BB is malformed.
692
693    STMT is the statement where SSA_NAME is created.
694
695    DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME
696       version numbers.  If DEFINITION_BLOCK[SSA_NAME_VERSION] is set,
697       it means that the block in that array slot contains the
698       definition of SSA_NAME.
699
700    IS_VIRTUAL is true if SSA_NAME is created by a VDEF.  */
701
702 static bool
703 verify_def (basic_block bb, basic_block *definition_block, tree ssa_name,
704             gimple stmt, bool is_virtual)
705 {
706   if (verify_ssa_name (ssa_name, is_virtual))
707     goto err;
708
709   if (SSA_NAME_VAR (ssa_name)
710       && TREE_CODE (SSA_NAME_VAR (ssa_name)) == RESULT_DECL
711       && DECL_BY_REFERENCE (SSA_NAME_VAR (ssa_name)))
712     {
713       error ("RESULT_DECL should be read only when DECL_BY_REFERENCE is set");
714       goto err;
715     }
716
717   if (definition_block[SSA_NAME_VERSION (ssa_name)])
718     {
719       error ("SSA_NAME created in two different blocks %i and %i",
720              definition_block[SSA_NAME_VERSION (ssa_name)]->index, bb->index);
721       goto err;
722     }
723
724   definition_block[SSA_NAME_VERSION (ssa_name)] = bb;
725
726   if (SSA_NAME_DEF_STMT (ssa_name) != stmt)
727     {
728       error ("SSA_NAME_DEF_STMT is wrong");
729       fprintf (stderr, "Expected definition statement:\n");
730       print_gimple_stmt (stderr, SSA_NAME_DEF_STMT (ssa_name), 4, TDF_VOPS);
731       fprintf (stderr, "\nActual definition statement:\n");
732       print_gimple_stmt (stderr, stmt, 4, TDF_VOPS);
733       goto err;
734     }
735
736   return false;
737
738 err:
739   fprintf (stderr, "while verifying SSA_NAME ");
740   print_generic_expr (stderr, ssa_name, 0);
741   fprintf (stderr, " in statement\n");
742   print_gimple_stmt (stderr, stmt, 4, TDF_VOPS);
743
744   return true;
745 }
746
747
748 /* Return true if the use of SSA_NAME at statement STMT in block BB is
749    malformed.
750
751    DEF_BB is the block where SSA_NAME was found to be created.
752
753    IDOM contains immediate dominator information for the flowgraph.
754
755    CHECK_ABNORMAL is true if the caller wants to check whether this use
756       is flowing through an abnormal edge (only used when checking PHI
757       arguments).
758
759    If NAMES_DEFINED_IN_BB is not NULL, it contains a bitmap of ssa names
760      that are defined before STMT in basic block BB.  */
761
762 static bool
763 verify_use (basic_block bb, basic_block def_bb, use_operand_p use_p,
764             gimple stmt, bool check_abnormal, bitmap names_defined_in_bb)
765 {
766   bool err = false;
767   tree ssa_name = USE_FROM_PTR (use_p);
768
769   if (!TREE_VISITED (ssa_name))
770     if (verify_imm_links (stderr, ssa_name))
771       err = true;
772
773   TREE_VISITED (ssa_name) = 1;
774
775   if (gimple_nop_p (SSA_NAME_DEF_STMT (ssa_name))
776       && SSA_NAME_IS_DEFAULT_DEF (ssa_name))
777     ; /* Default definitions have empty statements.  Nothing to do.  */
778   else if (!def_bb)
779     {
780       error ("missing definition");
781       err = true;
782     }
783   else if (bb != def_bb
784            && !dominated_by_p (CDI_DOMINATORS, bb, def_bb))
785     {
786       error ("definition in block %i does not dominate use in block %i",
787              def_bb->index, bb->index);
788       err = true;
789     }
790   else if (bb == def_bb
791            && names_defined_in_bb != NULL
792            && !bitmap_bit_p (names_defined_in_bb, SSA_NAME_VERSION (ssa_name)))
793     {
794       error ("definition in block %i follows the use", def_bb->index);
795       err = true;
796     }
797
798   if (check_abnormal
799       && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ssa_name))
800     {
801       error ("SSA_NAME_OCCURS_IN_ABNORMAL_PHI should be set");
802       err = true;
803     }
804
805   /* Make sure the use is in an appropriate list by checking the previous
806      element to make sure it's the same.  */
807   if (use_p->prev == NULL)
808     {
809       error ("no immediate_use list");
810       err = true;
811     }
812   else
813     {
814       tree listvar;
815       if (use_p->prev->use == NULL)
816         listvar = use_p->prev->loc.ssa_name;
817       else
818         listvar = USE_FROM_PTR (use_p->prev);
819       if (listvar != ssa_name)
820         {
821           error ("wrong immediate use list");
822           err = true;
823         }
824     }
825
826   if (err)
827     {
828       fprintf (stderr, "for SSA_NAME: ");
829       print_generic_expr (stderr, ssa_name, TDF_VOPS);
830       fprintf (stderr, " in statement:\n");
831       print_gimple_stmt (stderr, stmt, 0, TDF_VOPS);
832     }
833
834   return err;
835 }
836
837
838 /* Return true if any of the arguments for PHI node PHI at block BB is
839    malformed.
840
841    DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME
842       version numbers.  If DEFINITION_BLOCK[SSA_NAME_VERSION] is set,
843       it means that the block in that array slot contains the
844       definition of SSA_NAME.  */
845
846 static bool
847 verify_phi_args (gphi *phi, basic_block bb, basic_block *definition_block)
848 {
849   edge e;
850   bool err = false;
851   size_t i, phi_num_args = gimple_phi_num_args (phi);
852
853   if (EDGE_COUNT (bb->preds) != phi_num_args)
854     {
855       error ("incoming edge count does not match number of PHI arguments");
856       err = true;
857       goto error;
858     }
859
860   for (i = 0; i < phi_num_args; i++)
861     {
862       use_operand_p op_p = gimple_phi_arg_imm_use_ptr (phi, i);
863       tree op = USE_FROM_PTR (op_p);
864
865       e = EDGE_PRED (bb, i);
866
867       if (op == NULL_TREE)
868         {
869           error ("PHI argument is missing for edge %d->%d",
870                  e->src->index,
871                  e->dest->index);
872           err = true;
873           goto error;
874         }
875
876       if (TREE_CODE (op) != SSA_NAME && !is_gimple_min_invariant (op))
877         {
878           error ("PHI argument is not SSA_NAME, or invariant");
879           err = true;
880         }
881
882       if (TREE_CODE (op) == SSA_NAME)
883         {
884           err = verify_ssa_name (op, virtual_operand_p (gimple_phi_result (phi)));
885           err |= verify_use (e->src, definition_block[SSA_NAME_VERSION (op)],
886                              op_p, phi, e->flags & EDGE_ABNORMAL, NULL);
887         }
888
889       if (TREE_CODE (op) == ADDR_EXPR)
890         {
891           tree base = TREE_OPERAND (op, 0);
892           while (handled_component_p (base))
893             base = TREE_OPERAND (base, 0);
894           if ((TREE_CODE (base) == VAR_DECL
895                || TREE_CODE (base) == PARM_DECL
896                || TREE_CODE (base) == RESULT_DECL)
897               && !TREE_ADDRESSABLE (base))
898             {
899               error ("address taken, but ADDRESSABLE bit not set");
900               err = true;
901             }
902         }
903
904       if (e->dest != bb)
905         {
906           error ("wrong edge %d->%d for PHI argument",
907                  e->src->index, e->dest->index);
908           err = true;
909         }
910
911       if (err)
912         {
913           fprintf (stderr, "PHI argument\n");
914           print_generic_stmt (stderr, op, TDF_VOPS);
915           goto error;
916         }
917     }
918
919 error:
920   if (err)
921     {
922       fprintf (stderr, "for PHI node\n");
923       print_gimple_stmt (stderr, phi, 0, TDF_VOPS|TDF_MEMSYMS);
924     }
925
926
927   return err;
928 }
929
930
931 /* Verify common invariants in the SSA web.
932    TODO: verify the variable annotations.  */
933
934 DEBUG_FUNCTION void
935 verify_ssa (bool check_modified_stmt, bool check_ssa_operands)
936 {
937   size_t i;
938   basic_block bb;
939   basic_block *definition_block = XCNEWVEC (basic_block, num_ssa_names);
940   ssa_op_iter iter;
941   tree op;
942   enum dom_state orig_dom_state = dom_info_state (CDI_DOMINATORS);
943   bitmap names_defined_in_bb = BITMAP_ALLOC (NULL);
944
945   gcc_assert (!need_ssa_update_p (cfun));
946
947   timevar_push (TV_TREE_SSA_VERIFY);
948
949   /* Keep track of SSA names present in the IL.  */
950   for (i = 1; i < num_ssa_names; i++)
951     {
952       tree name = ssa_name (i);
953       if (name)
954         {
955           gimple stmt;
956           TREE_VISITED (name) = 0;
957
958           verify_ssa_name (name, virtual_operand_p (name));
959
960           stmt = SSA_NAME_DEF_STMT (name);
961           if (!gimple_nop_p (stmt))
962             {
963               basic_block bb = gimple_bb (stmt);
964               if (verify_def (bb, definition_block,
965                               name, stmt, virtual_operand_p (name)))
966                 goto err;
967             }
968         }
969     }
970
971   calculate_dominance_info (CDI_DOMINATORS);
972
973   /* Now verify all the uses and make sure they agree with the definitions
974      found in the previous pass.  */
975   FOR_EACH_BB_FN (bb, cfun)
976     {
977       edge e;
978       edge_iterator ei;
979
980       /* Make sure that all edges have a clear 'aux' field.  */
981       FOR_EACH_EDGE (e, ei, bb->preds)
982         {
983           if (e->aux)
984             {
985               error ("AUX pointer initialized for edge %d->%d", e->src->index,
986                       e->dest->index);
987               goto err;
988             }
989         }
990
991       /* Verify the arguments for every PHI node in the block.  */
992       for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
993         {
994           gphi *phi = gsi.phi ();
995           if (verify_phi_args (phi, bb, definition_block))
996             goto err;
997
998           bitmap_set_bit (names_defined_in_bb,
999                           SSA_NAME_VERSION (gimple_phi_result (phi)));
1000         }
1001
1002       /* Now verify all the uses and vuses in every statement of the block.  */
1003       for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
1004            gsi_next (&gsi))
1005         {
1006           gimple stmt = gsi_stmt (gsi);
1007           use_operand_p use_p;
1008
1009           if (check_modified_stmt && gimple_modified_p (stmt))
1010             {
1011               error ("stmt (%p) marked modified after optimization pass: ",
1012                      (void *)stmt);
1013               print_gimple_stmt (stderr, stmt, 0, TDF_VOPS);
1014               goto err;
1015             }
1016
1017           if (check_ssa_operands && verify_ssa_operands (cfun, stmt))
1018             {
1019               print_gimple_stmt (stderr, stmt, 0, TDF_VOPS);
1020               goto err;
1021             }
1022
1023           if (gimple_debug_bind_p (stmt)
1024               && !gimple_debug_bind_has_value_p (stmt))
1025             continue;
1026
1027           FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE|SSA_OP_VUSE)
1028             {
1029               op = USE_FROM_PTR (use_p);
1030               if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
1031                               use_p, stmt, false, names_defined_in_bb))
1032                 goto err;
1033             }
1034
1035           FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_ALL_DEFS)
1036             {
1037               if (SSA_NAME_DEF_STMT (op) != stmt)
1038                 {
1039                   error ("SSA_NAME_DEF_STMT is wrong");
1040                   fprintf (stderr, "Expected definition statement:\n");
1041                   print_gimple_stmt (stderr, stmt, 4, TDF_VOPS);
1042                   fprintf (stderr, "\nActual definition statement:\n");
1043                   print_gimple_stmt (stderr, SSA_NAME_DEF_STMT (op),
1044                                      4, TDF_VOPS);
1045                   goto err;
1046                 }
1047               bitmap_set_bit (names_defined_in_bb, SSA_NAME_VERSION (op));
1048             }
1049         }
1050
1051       bitmap_clear (names_defined_in_bb);
1052     }
1053
1054   free (definition_block);
1055
1056   /* Restore the dominance information to its prior known state, so
1057      that we do not perturb the compiler's subsequent behavior.  */
1058   if (orig_dom_state == DOM_NONE)
1059     free_dominance_info (CDI_DOMINATORS);
1060   else
1061     set_dom_info_availability (CDI_DOMINATORS, orig_dom_state);
1062
1063   BITMAP_FREE (names_defined_in_bb);
1064   timevar_pop (TV_TREE_SSA_VERIFY);
1065   return;
1066
1067 err:
1068   internal_error ("verify_ssa failed");
1069 }
1070
1071
1072 /* Initialize global DFA and SSA structures.  */
1073
1074 void
1075 init_tree_ssa (struct function *fn)
1076 {
1077   fn->gimple_df = ggc_cleared_alloc<gimple_df> ();
1078   fn->gimple_df->default_defs = hash_table<ssa_name_hasher>::create_ggc (20);
1079   pt_solution_reset (&fn->gimple_df->escaped);
1080   init_ssanames (fn, 0);
1081 }
1082
1083 /* Do the actions required to initialize internal data structures used
1084    in tree-ssa optimization passes.  */
1085
1086 static unsigned int
1087 execute_init_datastructures (void)
1088 {
1089   /* Allocate hash tables, arrays and other structures.  */
1090   gcc_assert (!cfun->gimple_df);
1091   init_tree_ssa (cfun);
1092   return 0;
1093 }
1094
1095 namespace {
1096
1097 const pass_data pass_data_init_datastructures =
1098 {
1099   GIMPLE_PASS, /* type */
1100   "*init_datastructures", /* name */
1101   OPTGROUP_NONE, /* optinfo_flags */
1102   TV_NONE, /* tv_id */
1103   PROP_cfg, /* properties_required */
1104   0, /* properties_provided */
1105   0, /* properties_destroyed */
1106   0, /* todo_flags_start */
1107   0, /* todo_flags_finish */
1108 };
1109
1110 class pass_init_datastructures : public gimple_opt_pass
1111 {
1112 public:
1113   pass_init_datastructures (gcc::context *ctxt)
1114     : gimple_opt_pass (pass_data_init_datastructures, ctxt)
1115   {}
1116
1117   /* opt_pass methods: */
1118   virtual bool gate (function *fun)
1119     {
1120       /* Do nothing for funcions that was produced already in SSA form.  */
1121       return !(fun->curr_properties & PROP_ssa);
1122     }
1123
1124   virtual unsigned int execute (function *)
1125     {
1126       return execute_init_datastructures ();
1127     }
1128
1129 }; // class pass_init_datastructures
1130
1131 } // anon namespace
1132
1133 gimple_opt_pass *
1134 make_pass_init_datastructures (gcc::context *ctxt)
1135 {
1136   return new pass_init_datastructures (ctxt);
1137 }
1138
1139 /* Deallocate memory associated with SSA data structures for FNDECL.  */
1140
1141 void
1142 delete_tree_ssa (void)
1143 {
1144   fini_ssanames ();
1145
1146   /* We no longer maintain the SSA operand cache at this point.  */
1147   if (ssa_operands_active (cfun))
1148     fini_ssa_operands (cfun);
1149
1150   cfun->gimple_df->default_defs->empty ();
1151   cfun->gimple_df->default_defs = NULL;
1152   pt_solution_reset (&cfun->gimple_df->escaped);
1153   if (cfun->gimple_df->decls_to_pointers != NULL)
1154     delete cfun->gimple_df->decls_to_pointers;
1155   cfun->gimple_df->decls_to_pointers = NULL;
1156   cfun->gimple_df->modified_noreturn_calls = NULL;
1157   cfun->gimple_df = NULL;
1158
1159   /* We no longer need the edge variable maps.  */
1160   redirect_edge_var_map_destroy ();
1161 }
1162
1163 /* Return true if EXPR is a useless type conversion, otherwise return
1164    false.  */
1165
1166 bool
1167 tree_ssa_useless_type_conversion (tree expr)
1168 {
1169   /* If we have an assignment that merely uses a NOP_EXPR to change
1170      the top of the RHS to the type of the LHS and the type conversion
1171      is "safe", then strip away the type conversion so that we can
1172      enter LHS = RHS into the const_and_copies table.  */
1173   if (CONVERT_EXPR_P (expr)
1174       || TREE_CODE (expr) == VIEW_CONVERT_EXPR
1175       || TREE_CODE (expr) == NON_LVALUE_EXPR)
1176     return useless_type_conversion_p
1177       (TREE_TYPE (expr),
1178        TREE_TYPE (TREE_OPERAND (expr, 0)));
1179
1180   return false;
1181 }
1182
1183 /* Strip conversions from EXP according to
1184    tree_ssa_useless_type_conversion and return the resulting
1185    expression.  */
1186
1187 tree
1188 tree_ssa_strip_useless_type_conversions (tree exp)
1189 {
1190   while (tree_ssa_useless_type_conversion (exp))
1191     exp = TREE_OPERAND (exp, 0);
1192   return exp;
1193 }
1194
1195
1196 /* Return true if T, an SSA_NAME, has an undefined value.  PARTIAL is what
1197    should be returned if the value is only partially undefined.  */
1198
1199 bool
1200 ssa_undefined_value_p (tree t, bool partial)
1201 {
1202   gimple def_stmt;
1203   tree var = SSA_NAME_VAR (t);
1204
1205   if (!var)
1206     ;
1207   /* Parameters get their initial value from the function entry.  */
1208   else if (TREE_CODE (var) == PARM_DECL)
1209     return false;
1210   /* When returning by reference the return address is actually a hidden
1211      parameter.  */
1212   else if (TREE_CODE (var) == RESULT_DECL && DECL_BY_REFERENCE (var))
1213     return false;
1214   /* Hard register variables get their initial value from the ether.  */
1215   else if (TREE_CODE (var) == VAR_DECL && DECL_HARD_REGISTER (var))
1216     return false;
1217
1218   /* The value is undefined iff its definition statement is empty.  */
1219   def_stmt = SSA_NAME_DEF_STMT (t);
1220   if (gimple_nop_p (def_stmt))
1221     return true;
1222
1223   /* Check if the complex was not only partially defined.  */
1224   if (partial && is_gimple_assign (def_stmt)
1225       && gimple_assign_rhs_code (def_stmt) == COMPLEX_EXPR)
1226     {
1227       tree rhs1, rhs2;
1228
1229       rhs1 = gimple_assign_rhs1 (def_stmt);
1230       rhs2 = gimple_assign_rhs2 (def_stmt);
1231       return (TREE_CODE (rhs1) == SSA_NAME && ssa_undefined_value_p (rhs1))
1232              || (TREE_CODE (rhs2) == SSA_NAME && ssa_undefined_value_p (rhs2));
1233     }
1234   return false;
1235 }
1236
1237
1238 /* If necessary, rewrite the base of the reference tree *TP from
1239    a MEM_REF to a plain or converted symbol.  */
1240
1241 static void
1242 maybe_rewrite_mem_ref_base (tree *tp, bitmap suitable_for_renaming)
1243 {
1244   tree sym;
1245
1246   while (handled_component_p (*tp))
1247     tp = &TREE_OPERAND (*tp, 0);
1248   if (TREE_CODE (*tp) == MEM_REF
1249       && TREE_CODE (TREE_OPERAND (*tp, 0)) == ADDR_EXPR
1250       && (sym = TREE_OPERAND (TREE_OPERAND (*tp, 0), 0))
1251       && DECL_P (sym)
1252       && !TREE_ADDRESSABLE (sym)
1253       && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym)))
1254     {
1255       if (TREE_CODE (TREE_TYPE (sym)) == VECTOR_TYPE
1256           && useless_type_conversion_p (TREE_TYPE (*tp),
1257                                         TREE_TYPE (TREE_TYPE (sym)))
1258           && multiple_of_p (sizetype, TREE_OPERAND (*tp, 1),
1259                             TYPE_SIZE_UNIT (TREE_TYPE (*tp))))
1260         {
1261           *tp = build3 (BIT_FIELD_REF, TREE_TYPE (*tp), sym, 
1262                         TYPE_SIZE (TREE_TYPE (*tp)),
1263                         int_const_binop (MULT_EXPR,
1264                                          bitsize_int (BITS_PER_UNIT),
1265                                          TREE_OPERAND (*tp, 1)));
1266         }
1267       else if (TREE_CODE (TREE_TYPE (sym)) == COMPLEX_TYPE
1268                && useless_type_conversion_p (TREE_TYPE (*tp),
1269                                              TREE_TYPE (TREE_TYPE (sym))))
1270         {
1271           *tp = build1 (integer_zerop (TREE_OPERAND (*tp, 1))
1272                         ? REALPART_EXPR : IMAGPART_EXPR,
1273                         TREE_TYPE (*tp), sym);
1274         }
1275       else if (integer_zerop (TREE_OPERAND (*tp, 1)))
1276         {
1277           if (!useless_type_conversion_p (TREE_TYPE (*tp),
1278                                           TREE_TYPE (sym)))
1279             *tp = build1 (VIEW_CONVERT_EXPR,
1280                           TREE_TYPE (*tp), sym);
1281           else
1282             *tp = sym;
1283         }
1284     }
1285 }
1286
1287 /* For a tree REF return its base if it is the base of a MEM_REF
1288    that cannot be rewritten into SSA form.  Otherwise return NULL_TREE.  */
1289
1290 static tree
1291 non_rewritable_mem_ref_base (tree ref)
1292 {
1293   tree base = ref;
1294
1295   /* A plain decl does not need it set.  */
1296   if (DECL_P (ref))
1297     return NULL_TREE;
1298
1299   while (handled_component_p (base))
1300     base = TREE_OPERAND (base, 0);
1301
1302   /* But watch out for MEM_REFs we cannot lower to a
1303      VIEW_CONVERT_EXPR or a BIT_FIELD_REF.  */
1304   if (TREE_CODE (base) == MEM_REF
1305       && TREE_CODE (TREE_OPERAND (base, 0)) == ADDR_EXPR)
1306     {
1307       tree decl = TREE_OPERAND (TREE_OPERAND (base, 0), 0);
1308       if ((TREE_CODE (TREE_TYPE (decl)) == VECTOR_TYPE
1309            || TREE_CODE (TREE_TYPE (decl)) == COMPLEX_TYPE)
1310           && useless_type_conversion_p (TREE_TYPE (base),
1311                                         TREE_TYPE (TREE_TYPE (decl)))
1312           && wi::fits_uhwi_p (mem_ref_offset (base))
1313           && wi::gtu_p (wi::to_offset (TYPE_SIZE_UNIT (TREE_TYPE (decl))),
1314                         mem_ref_offset (base))
1315           && multiple_of_p (sizetype, TREE_OPERAND (base, 1),
1316                             TYPE_SIZE_UNIT (TREE_TYPE (base))))
1317         return NULL_TREE;
1318       if (DECL_P (decl)
1319           && (!integer_zerop (TREE_OPERAND (base, 1))
1320               || (DECL_SIZE (decl)
1321                   != TYPE_SIZE (TREE_TYPE (base)))
1322               || TREE_THIS_VOLATILE (decl) != TREE_THIS_VOLATILE (base)))
1323         return decl;
1324     }
1325
1326   return NULL_TREE;
1327 }
1328
1329 /* For an lvalue tree LHS return true if it cannot be rewritten into SSA form.
1330    Otherwise return true.  */
1331
1332 static bool 
1333 non_rewritable_lvalue_p (tree lhs)
1334 {
1335   /* A plain decl is always rewritable.  */
1336   if (DECL_P (lhs))
1337     return false;
1338
1339   /* We can re-write REALPART_EXPR and IMAGPART_EXPR sets in
1340      a reasonably efficient manner... */
1341   if ((TREE_CODE (lhs) == REALPART_EXPR
1342        || TREE_CODE (lhs) == IMAGPART_EXPR)
1343       && DECL_P (TREE_OPERAND (lhs, 0)))
1344     return false;
1345
1346   /* A decl that is wrapped inside a MEM-REF that covers
1347      it full is also rewritable.
1348      ???  The following could be relaxed allowing component
1349      references that do not change the access size.  */
1350   if (TREE_CODE (lhs) == MEM_REF
1351       && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR
1352       && integer_zerop (TREE_OPERAND (lhs, 1)))
1353     {
1354       tree decl = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0);
1355       if (DECL_P (decl)
1356           && DECL_SIZE (decl) == TYPE_SIZE (TREE_TYPE (lhs))
1357           && (TREE_THIS_VOLATILE (decl) == TREE_THIS_VOLATILE (lhs)))
1358         return false;
1359     }
1360
1361   return true;
1362 }
1363
1364 /* When possible, clear TREE_ADDRESSABLE bit or set DECL_GIMPLE_REG_P bit and
1365    mark the variable VAR for conversion into SSA.  Return true when updating
1366    stmts is required.  */
1367
1368 static void
1369 maybe_optimize_var (tree var, bitmap addresses_taken, bitmap not_reg_needs,
1370                     bitmap suitable_for_renaming)
1371 {
1372   /* Global Variables, result decls cannot be changed.  */
1373   if (is_global_var (var)
1374       || TREE_CODE (var) == RESULT_DECL
1375       || bitmap_bit_p (addresses_taken, DECL_UID (var)))
1376     return;
1377
1378   if (TREE_ADDRESSABLE (var)
1379       /* Do not change TREE_ADDRESSABLE if we need to preserve var as
1380          a non-register.  Otherwise we are confused and forget to
1381          add virtual operands for it.  */
1382       && (!is_gimple_reg_type (TREE_TYPE (var))
1383           || TREE_CODE (TREE_TYPE (var)) == VECTOR_TYPE
1384           || TREE_CODE (TREE_TYPE (var)) == COMPLEX_TYPE
1385           || !bitmap_bit_p (not_reg_needs, DECL_UID (var))))
1386     {
1387       TREE_ADDRESSABLE (var) = 0;
1388       if (is_gimple_reg (var))
1389         bitmap_set_bit (suitable_for_renaming, DECL_UID (var));
1390       if (dump_file)
1391         {
1392           fprintf (dump_file, "No longer having address taken: ");
1393           print_generic_expr (dump_file, var, 0);
1394           fprintf (dump_file, "\n");
1395         }
1396     }
1397
1398   if (!DECL_GIMPLE_REG_P (var)
1399       && !bitmap_bit_p (not_reg_needs, DECL_UID (var))
1400       && (TREE_CODE (TREE_TYPE (var)) == COMPLEX_TYPE
1401           || TREE_CODE (TREE_TYPE (var)) == VECTOR_TYPE)
1402       && !TREE_THIS_VOLATILE (var)
1403       && (TREE_CODE (var) != VAR_DECL || !DECL_HARD_REGISTER (var)))
1404     {
1405       DECL_GIMPLE_REG_P (var) = 1;
1406       bitmap_set_bit (suitable_for_renaming, DECL_UID (var));
1407       if (dump_file)
1408         {
1409           fprintf (dump_file, "Now a gimple register: ");
1410           print_generic_expr (dump_file, var, 0);
1411           fprintf (dump_file, "\n");
1412         }
1413     }
1414 }
1415
1416 /* Compute TREE_ADDRESSABLE and DECL_GIMPLE_REG_P for local variables.  */
1417
1418 void
1419 execute_update_addresses_taken (void)
1420 {
1421   basic_block bb;
1422   bitmap addresses_taken = BITMAP_ALLOC (NULL);
1423   bitmap not_reg_needs = BITMAP_ALLOC (NULL);
1424   bitmap suitable_for_renaming = BITMAP_ALLOC (NULL);
1425   tree var;
1426   unsigned i;
1427
1428   timevar_push (TV_ADDRESS_TAKEN);
1429
1430   /* Collect into ADDRESSES_TAKEN all variables whose address is taken within
1431      the function body.  */
1432   FOR_EACH_BB_FN (bb, cfun)
1433     {
1434       for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
1435            gsi_next (&gsi))
1436         {
1437           gimple stmt = gsi_stmt (gsi);
1438           enum gimple_code code = gimple_code (stmt);
1439           tree decl;
1440
1441           /* Note all addresses taken by the stmt.  */
1442           gimple_ior_addresses_taken (addresses_taken, stmt);
1443
1444           /* If we have a call or an assignment, see if the lhs contains
1445              a local decl that requires not to be a gimple register.  */
1446           if (code == GIMPLE_ASSIGN || code == GIMPLE_CALL)
1447             {
1448               tree lhs = gimple_get_lhs (stmt);
1449               if (lhs
1450                   && TREE_CODE (lhs) != SSA_NAME
1451                   && non_rewritable_lvalue_p (lhs))
1452                 {
1453                   decl = get_base_address (lhs);
1454                   if (DECL_P (decl))
1455                     bitmap_set_bit (not_reg_needs, DECL_UID (decl));
1456                 }
1457             }
1458
1459           if (gimple_assign_single_p (stmt))
1460             {
1461               tree rhs = gimple_assign_rhs1 (stmt);
1462               if ((decl = non_rewritable_mem_ref_base (rhs)))
1463                 bitmap_set_bit (not_reg_needs, DECL_UID (decl));
1464             }
1465
1466           else if (code == GIMPLE_CALL)
1467             {
1468               for (i = 0; i < gimple_call_num_args (stmt); ++i)
1469                 {
1470                   tree arg = gimple_call_arg (stmt, i);
1471                   if ((decl = non_rewritable_mem_ref_base (arg)))
1472                     bitmap_set_bit (not_reg_needs, DECL_UID (decl));
1473                 }
1474             }
1475
1476           else if (code == GIMPLE_ASM)
1477             {
1478               gasm *asm_stmt = as_a <gasm *> (stmt);
1479               for (i = 0; i < gimple_asm_noutputs (asm_stmt); ++i)
1480                 {
1481                   tree link = gimple_asm_output_op (asm_stmt, i);
1482                   tree lhs = TREE_VALUE (link);
1483                   if (TREE_CODE (lhs) != SSA_NAME)
1484                     {
1485                       decl = get_base_address (lhs);
1486                       if (DECL_P (decl)
1487                           && (non_rewritable_lvalue_p (lhs)
1488                               /* We cannot move required conversions from
1489                                  the lhs to the rhs in asm statements, so
1490                                  require we do not need any.  */
1491                               || !useless_type_conversion_p
1492                                     (TREE_TYPE (lhs), TREE_TYPE (decl))))
1493                         bitmap_set_bit (not_reg_needs, DECL_UID (decl));
1494                     }
1495                 }
1496               for (i = 0; i < gimple_asm_ninputs (asm_stmt); ++i)
1497                 {
1498                   tree link = gimple_asm_input_op (asm_stmt, i);
1499                   if ((decl = non_rewritable_mem_ref_base (TREE_VALUE (link))))
1500                     bitmap_set_bit (not_reg_needs, DECL_UID (decl));
1501                 }
1502             }
1503         }
1504
1505       for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
1506            gsi_next (&gsi))
1507         {
1508           size_t i;
1509           gphi *phi = gsi.phi ();
1510
1511           for (i = 0; i < gimple_phi_num_args (phi); i++)
1512             {
1513               tree op = PHI_ARG_DEF (phi, i), var;
1514               if (TREE_CODE (op) == ADDR_EXPR
1515                   && (var = get_base_address (TREE_OPERAND (op, 0))) != NULL
1516                   && DECL_P (var))
1517                 bitmap_set_bit (addresses_taken, DECL_UID (var));
1518             }
1519         }
1520     }
1521
1522   /* We cannot iterate over all referenced vars because that can contain
1523      unused vars from BLOCK trees, which causes code generation differences
1524      for -g vs. -g0.  */
1525   for (var = DECL_ARGUMENTS (cfun->decl); var; var = DECL_CHAIN (var))
1526     maybe_optimize_var (var, addresses_taken, not_reg_needs,
1527                         suitable_for_renaming);
1528
1529   FOR_EACH_VEC_SAFE_ELT (cfun->local_decls, i, var)
1530     maybe_optimize_var (var, addresses_taken, not_reg_needs,
1531                         suitable_for_renaming);
1532
1533   /* Operand caches need to be recomputed for operands referencing the updated
1534      variables and operands need to be rewritten to expose bare symbols.  */
1535   if (!bitmap_empty_p (suitable_for_renaming))
1536     {
1537       FOR_EACH_BB_FN (bb, cfun)
1538         for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);)
1539           {
1540             gimple stmt = gsi_stmt (gsi);
1541
1542             /* Re-write TARGET_MEM_REFs of symbols we want to
1543                rewrite into SSA form.  */
1544             if (gimple_assign_single_p (stmt))
1545               {
1546                 tree lhs = gimple_assign_lhs (stmt);
1547                 tree rhs, *rhsp = gimple_assign_rhs1_ptr (stmt);
1548                 tree sym;
1549
1550                 /* Rewrite LHS IMAG/REALPART_EXPR similar to
1551                    gimplify_modify_expr_complex_part.  */
1552                 if ((TREE_CODE (lhs) == IMAGPART_EXPR
1553                      || TREE_CODE (lhs) == REALPART_EXPR)
1554                     && DECL_P (TREE_OPERAND (lhs, 0))
1555                     && bitmap_bit_p (suitable_for_renaming,
1556                                      DECL_UID (TREE_OPERAND (lhs, 0))))
1557                   {
1558                     tree other = make_ssa_name (TREE_TYPE (lhs));
1559                     tree lrhs = build1 (TREE_CODE (lhs) == IMAGPART_EXPR
1560                                         ? REALPART_EXPR : IMAGPART_EXPR,
1561                                         TREE_TYPE (other),
1562                                         TREE_OPERAND (lhs, 0));
1563                     gimple load = gimple_build_assign (other, lrhs);
1564                     location_t loc = gimple_location (stmt);
1565                     gimple_set_location (load, loc);
1566                     gimple_set_vuse (load, gimple_vuse (stmt));
1567                     gsi_insert_before (&gsi, load, GSI_SAME_STMT);
1568                     gimple_assign_set_lhs (stmt, TREE_OPERAND (lhs, 0));
1569                     gimple_assign_set_rhs_with_ops
1570                       (&gsi, COMPLEX_EXPR,
1571                        TREE_CODE (lhs) == IMAGPART_EXPR
1572                        ? other : gimple_assign_rhs1 (stmt),
1573                        TREE_CODE (lhs) == IMAGPART_EXPR
1574                        ? gimple_assign_rhs1 (stmt) : other, NULL_TREE);
1575                     stmt = gsi_stmt (gsi);
1576                     unlink_stmt_vdef (stmt);
1577                     update_stmt (stmt);
1578                     continue;
1579                   }
1580
1581                 /* We shouldn't have any fancy wrapping of
1582                    component-refs on the LHS, but look through
1583                    VIEW_CONVERT_EXPRs as that is easy.  */
1584                 while (TREE_CODE (lhs) == VIEW_CONVERT_EXPR)
1585                   lhs = TREE_OPERAND (lhs, 0);
1586                 if (TREE_CODE (lhs) == MEM_REF
1587                     && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR
1588                     && integer_zerop (TREE_OPERAND (lhs, 1))
1589                     && (sym = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0))
1590                     && DECL_P (sym)
1591                     && !TREE_ADDRESSABLE (sym)
1592                     && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym)))
1593                   lhs = sym;
1594                 else
1595                   lhs = gimple_assign_lhs (stmt);
1596
1597                 /* Rewrite the RHS and make sure the resulting assignment
1598                    is validly typed.  */
1599                 maybe_rewrite_mem_ref_base (rhsp, suitable_for_renaming);
1600                 rhs = gimple_assign_rhs1 (stmt);
1601                 if (gimple_assign_lhs (stmt) != lhs
1602                     && !useless_type_conversion_p (TREE_TYPE (lhs),
1603                                                    TREE_TYPE (rhs)))
1604                   rhs = fold_build1 (VIEW_CONVERT_EXPR,
1605                                      TREE_TYPE (lhs), rhs);
1606
1607                 if (gimple_assign_lhs (stmt) != lhs)
1608                   gimple_assign_set_lhs (stmt, lhs);
1609
1610                 if (gimple_assign_rhs1 (stmt) != rhs)
1611                   {
1612                     gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
1613                     gimple_assign_set_rhs_from_tree (&gsi, rhs);
1614                   }
1615               }
1616
1617             else if (gimple_code (stmt) == GIMPLE_CALL)
1618               {
1619                 unsigned i;
1620                 for (i = 0; i < gimple_call_num_args (stmt); ++i)
1621                   {
1622                     tree *argp = gimple_call_arg_ptr (stmt, i);
1623                     maybe_rewrite_mem_ref_base (argp, suitable_for_renaming);
1624                   }
1625               }
1626
1627             else if (gimple_code (stmt) == GIMPLE_ASM)
1628               {
1629                 gasm *asm_stmt = as_a <gasm *> (stmt);
1630                 unsigned i;
1631                 for (i = 0; i < gimple_asm_noutputs (asm_stmt); ++i)
1632                   {
1633                     tree link = gimple_asm_output_op (asm_stmt, i);
1634                     maybe_rewrite_mem_ref_base (&TREE_VALUE (link),
1635                                                 suitable_for_renaming);
1636                   }
1637                 for (i = 0; i < gimple_asm_ninputs (asm_stmt); ++i)
1638                   {
1639                     tree link = gimple_asm_input_op (asm_stmt, i);
1640                     maybe_rewrite_mem_ref_base (&TREE_VALUE (link),
1641                                                 suitable_for_renaming);
1642                   }
1643               }
1644
1645             else if (gimple_debug_bind_p (stmt)
1646                      && gimple_debug_bind_has_value_p (stmt))
1647               {
1648                 tree *valuep = gimple_debug_bind_get_value_ptr (stmt);
1649                 tree decl;
1650                 maybe_rewrite_mem_ref_base (valuep, suitable_for_renaming);
1651                 decl = non_rewritable_mem_ref_base (*valuep);
1652                 if (decl
1653                     && bitmap_bit_p (suitable_for_renaming, DECL_UID (decl)))
1654                   gimple_debug_bind_reset_value (stmt);
1655               }
1656
1657             if (gimple_references_memory_p (stmt)
1658                 || is_gimple_debug (stmt))
1659               update_stmt (stmt);
1660
1661             gsi_next (&gsi);
1662           }
1663
1664       /* Update SSA form here, we are called as non-pass as well.  */
1665       if (number_of_loops (cfun) > 1
1666           && loops_state_satisfies_p (LOOP_CLOSED_SSA))
1667         rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
1668       else
1669         update_ssa (TODO_update_ssa);
1670     }
1671
1672   BITMAP_FREE (not_reg_needs);
1673   BITMAP_FREE (addresses_taken);
1674   BITMAP_FREE (suitable_for_renaming);
1675   timevar_pop (TV_ADDRESS_TAKEN);
1676 }
1677
1678 namespace {
1679
1680 const pass_data pass_data_update_address_taken =
1681 {
1682   GIMPLE_PASS, /* type */
1683   "addressables", /* name */
1684   OPTGROUP_NONE, /* optinfo_flags */
1685   TV_ADDRESS_TAKEN, /* tv_id */
1686   PROP_ssa, /* properties_required */
1687   0, /* properties_provided */
1688   0, /* properties_destroyed */
1689   0, /* todo_flags_start */
1690   TODO_update_address_taken, /* todo_flags_finish */
1691 };
1692
1693 class pass_update_address_taken : public gimple_opt_pass
1694 {
1695 public:
1696   pass_update_address_taken (gcc::context *ctxt)
1697     : gimple_opt_pass (pass_data_update_address_taken, ctxt)
1698   {}
1699
1700   /* opt_pass methods: */
1701
1702 }; // class pass_update_address_taken
1703
1704 } // anon namespace
1705
1706 gimple_opt_pass *
1707 make_pass_update_address_taken (gcc::context *ctxt)
1708 {
1709   return new pass_update_address_taken (ctxt);
1710 }