OSDN Git Service

bbec1b2d726d585cd550538a4771b6da8f1ff34a
[pf3gnuchains/gcc-fork.git] / gcc / tree-into-ssa.c
1 /* Rewrite a program in Normal form into SSA.
2    Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
3    Contributed by Diego Novillo <dnovillo@redhat.com>
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 2, 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 COPYING.  If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "tree.h"
27 #include "flags.h"
28 #include "rtl.h"
29 #include "tm_p.h"
30 #include "langhooks.h"
31 #include "hard-reg-set.h"
32 #include "basic-block.h"
33 #include "output.h"
34 #include "errors.h"
35 #include "expr.h"
36 #include "function.h"
37 #include "diagnostic.h"
38 #include "bitmap.h"
39 #include "tree-flow.h"
40 #include "tree-gimple.h"
41 #include "tree-inline.h"
42 #include "varray.h"
43 #include "timevar.h"
44 #include "tree-alias-common.h"
45 #include "hashtab.h"
46 #include "tree-dump.h"
47 #include "tree-pass.h"
48 #include "cfgloop.h"
49 #include "domwalk.h"
50 #include "ggc.h"
51
52 /* This file builds the SSA form for a function as described in:
53    R. Cytron, J. Ferrante, B. Rosen, M. Wegman, and K. Zadeck. Efficiently
54    Computing Static Single Assignment Form and the Control Dependence
55    Graph. ACM Transactions on Programming Languages and Systems,
56    13(4):451-490, October 1991.  */
57
58
59 /* Structure to map a variable VAR to the set of blocks that contain
60    definitions for VAR.  */
61 struct def_blocks_d
62 {
63   /* The variable.  */
64   tree var;
65
66   /* Blocks that contain definitions of VAR.  Bit I will be set if the
67      Ith block contains a definition of VAR.  */
68   bitmap def_blocks;
69
70   /* Blocks that contain a phi node for VAR.  */
71   bitmap phi_blocks;
72
73   /* Blocks where VAR is live-on-entry.  Similar semantics as
74      DEF_BLOCKS.  */
75   bitmap livein_blocks;
76 };
77
78 /* Each entry in DEF_BLOCKS contains an element of type STRUCT
79    DEF_BLOCKS_D, mapping a variable VAR to a bitmap describing all the
80    basic blocks where VAR is defined (assigned a new value).  It also
81    contains a bitmap of all the blocks where VAR is live-on-entry
82    (i.e., there is a use of VAR in block B without a preceding
83    definition in B).  The live-on-entry information is used when
84    computing PHI pruning heuristics.  */
85 static htab_t def_blocks;
86
87 /* Global data to attach to the main dominator walk structure.  */
88 struct mark_def_sites_global_data
89 {
90   /* This sbitmap contains the variables which are set before they
91      are used in a basic block.  We keep it as a global variable
92      solely to avoid the overhead of allocating and deallocating
93      the bitmap.  */
94   sbitmap kills;
95
96   /* Bitmap of names to rename.  */
97   sbitmap names_to_rename;
98 };
99
100 struct rewrite_block_data
101 {
102   varray_type block_defs;
103 };
104
105 /* Information stored for ssa names.  */
106
107 struct ssa_name_info
108 {
109   /* This field indicates whether or not the variable may need PHI nodes.
110      See the enum's definition for more detailed information about the
111      states.  */
112   ENUM_BITFIELD (need_phi_state) need_phi_state : 2;
113
114   /* The actual definition of the ssa name.  */
115   tree current_def;
116 };
117
118 /* Local functions.  */
119 static void rewrite_finalize_block (struct dom_walk_data *, basic_block);
120 static void rewrite_initialize_block_local_data (struct dom_walk_data *,
121                                                  basic_block, bool);
122 static void rewrite_initialize_block (struct dom_walk_data *, basic_block);
123 static void rewrite_add_phi_arguments (struct dom_walk_data *, basic_block);
124 static void mark_def_sites (struct dom_walk_data *walk_data,
125                             basic_block bb, block_stmt_iterator);
126 static void mark_def_sites_initialize_block (struct dom_walk_data *walk_data,
127                                              basic_block bb);
128 static void set_def_block (tree, basic_block, bool, bool);
129 static void set_livein_block (tree, basic_block);
130 static bool prepare_use_operand_for_rename (use_operand_p, size_t *uid_p);
131 static bool prepare_def_operand_for_rename (tree def, size_t *uid_p);
132 static void insert_phi_nodes (bitmap *, bitmap);
133 static void rewrite_stmt (struct dom_walk_data *, basic_block,
134                           block_stmt_iterator);
135 static inline void rewrite_operand (use_operand_p);
136 static void insert_phi_nodes_for (tree, bitmap *, varray_type *);
137 static tree get_reaching_def (tree);
138 static hashval_t def_blocks_hash (const void *);
139 static int def_blocks_eq (const void *, const void *);
140 static void def_blocks_free (void *);
141 static int debug_def_blocks_r (void **, void *);
142 static inline struct def_blocks_d *get_def_blocks_for (tree);
143 static inline struct def_blocks_d *find_def_blocks_for (tree);
144 static void htab_statistics (FILE *, htab_t);
145
146 /* Get the information associated with NAME.  */
147
148 static inline struct ssa_name_info *
149 get_ssa_name_ann (tree name)
150 {
151   if (!SSA_NAME_AUX (name))
152     SSA_NAME_AUX (name) = xcalloc (1, sizeof (struct ssa_name_info));
153
154   return SSA_NAME_AUX (name);
155 }
156
157 /* Gets phi_state field for VAR.  */
158
159 static inline enum need_phi_state
160 get_phi_state (tree var)
161 {
162   if (TREE_CODE (var) == SSA_NAME)
163     return get_ssa_name_ann (var)->need_phi_state;
164   else
165     return var_ann (var)->need_phi_state;
166 }
167
168 /* Sets phi_state field for VAR to STATE.  */
169
170 static inline void
171 set_phi_state (tree var, enum need_phi_state state)
172 {
173   if (TREE_CODE (var) == SSA_NAME)
174     get_ssa_name_ann (var)->need_phi_state = state;
175   else
176     var_ann (var)->need_phi_state = state;
177 }
178
179 /* Return the current definition for VAR.  */
180
181 static inline tree
182 get_current_def (tree var)
183 {
184   if (TREE_CODE (var) == SSA_NAME)
185     return get_ssa_name_ann (var)->current_def;
186   else
187     return var_ann (var)->current_def;
188 }
189
190 /* Sets current definition of VAR to DEF.  */
191
192 static inline void
193 set_current_def (tree var, tree def)
194 {
195   if (TREE_CODE (var) == SSA_NAME)
196     get_ssa_name_ann (var)->current_def = def;
197   else
198     var_ann (var)->current_def = def;
199 }
200
201 /* Compute global livein information given the set of blockx where
202    an object is locally live at the start of the block (LIVEIN)
203    and the set of blocks where the object is defined (DEF_BLOCKS).
204
205    Note: This routine augments the existing local livein information
206    to include global livein (i.e., it modifies the underlying bitmap
207    for LIVEIN).  */
208
209 void
210 compute_global_livein (bitmap livein, bitmap def_blocks)
211 {
212   basic_block bb, *worklist, *tos;
213   int i;
214
215   tos = worklist
216     = (basic_block *) xmalloc (sizeof (basic_block) * (n_basic_blocks + 1));
217
218   EXECUTE_IF_SET_IN_BITMAP (livein, 0, i,
219     {
220         *tos++ = BASIC_BLOCK (i);
221     });
222
223   /* Iterate until the worklist is empty.  */
224   while (tos != worklist)
225     {
226       edge e;
227
228       /* Pull a block off the worklist.  */
229       bb = *--tos;
230
231       /* For each predecessor block.  */
232       for (e = bb->pred; e; e = e->pred_next)
233         {
234           basic_block pred = e->src;
235           int pred_index = pred->index;
236
237           /* None of this is necessary for the entry block.  */
238           if (pred != ENTRY_BLOCK_PTR
239               && ! bitmap_bit_p (livein, pred_index)
240               && ! bitmap_bit_p (def_blocks, pred_index))
241             {
242               *tos++ = pred;
243               bitmap_set_bit (livein, pred_index);
244             }
245         }
246     }
247
248   free (worklist);
249 }
250
251
252 /* Block initialization routine for mark_def_sites.  Clear the 
253    KILLS bitmap at the start of each block.  */
254
255 static void
256 mark_def_sites_initialize_block (struct dom_walk_data *walk_data,
257                                  basic_block bb ATTRIBUTE_UNUSED)
258 {
259   struct mark_def_sites_global_data *gd = walk_data->global_data;
260   sbitmap kills = gd->kills;
261
262   sbitmap_zero (kills);
263 }
264
265 /* Block initialization routine for mark_def_sites.  Clear the 
266    KILLS bitmap at the start of each block.  */
267
268 static void
269 ssa_mark_def_sites_initialize_block (struct dom_walk_data *walk_data,
270                                      basic_block bb)
271 {
272   struct mark_def_sites_global_data *gd = walk_data->global_data;
273   sbitmap kills = gd->kills;
274   tree phi, def;
275   unsigned def_uid;
276
277   sbitmap_zero (kills);
278
279   for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
280     {
281       def = PHI_RESULT (phi);
282       def_uid = SSA_NAME_VERSION (def);
283
284       if (!TEST_BIT (gd->names_to_rename, def_uid))
285         continue;
286
287       set_def_block (def, bb, true, true);
288       SET_BIT (kills, def_uid);
289     }
290 }
291
292 /* Marks ssa names used as arguments of phis at the end of BB.  */
293
294 static void
295 ssa_mark_phi_uses (struct dom_walk_data *walk_data, basic_block bb)
296 {
297   struct mark_def_sites_global_data *gd = walk_data->global_data;
298   sbitmap kills = gd->kills;
299   edge e;
300   tree phi, use;
301   unsigned uid;
302
303   for (e = bb->succ; e; e = e->succ_next)
304     {
305       if (e->dest == EXIT_BLOCK_PTR)
306         continue;
307
308       for (phi = phi_nodes (e->dest); phi; phi = TREE_CHAIN (phi))
309         {
310           use = PHI_ARG_DEF_FROM_EDGE (phi, e);
311           if (TREE_CODE (use) != SSA_NAME)
312             continue;
313
314           uid = SSA_NAME_VERSION (use);
315
316           if (TEST_BIT (gd->names_to_rename, uid)
317               && !TEST_BIT (kills, uid))
318             set_livein_block (use, bb);
319         }
320     }
321 }
322
323 /* Call back for walk_dominator_tree used to collect definition sites
324    for every variable in the function.  For every statement S in block
325    BB:
326
327    1- Variables defined by S in DEF_OPS(S) are marked in the bitmap
328       WALK_DATA->GLOBAL_DATA->KILLS.
329
330    2- If S uses a variable VAR and there is no preceding kill of VAR,
331       then it is marked in marked in the LIVEIN_BLOCKS bitmap
332       associated with VAR.
333
334    This information is used to determine which variables are live
335    across block boundaries to reduce the number of PHI nodes
336    we create.  */
337
338 static void
339 mark_def_sites (struct dom_walk_data *walk_data,
340                 basic_block bb,
341                 block_stmt_iterator bsi)
342 {
343   struct mark_def_sites_global_data *gd = walk_data->global_data;
344   sbitmap kills = gd->kills;
345   size_t uid;
346   tree stmt, def;
347   use_operand_p use_p;
348   def_operand_p def_p;
349   ssa_op_iter iter;
350
351   /* Mark all the blocks that have definitions for each variable in the
352      VARS_TO_RENAME bitmap.  */
353   stmt = bsi_stmt (bsi);
354   get_stmt_operands (stmt);
355
356   /* If a variable is used before being set, then the variable is live
357      across a block boundary, so mark it live-on-entry to BB.  */
358
359   FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE | SSA_OP_VUSE)
360     {
361       if (prepare_use_operand_for_rename (use_p, &uid)
362           && !TEST_BIT (kills, uid))
363         set_livein_block (USE_FROM_PTR (use_p), bb);
364     }
365           
366   /* Note that virtual definitions are irrelevant for computing KILLS
367      because a V_MAY_DEF does not constitute a killing definition of the
368      variable.  However, the operand of a virtual definitions is a use
369      of the variable, so it may cause the variable to be considered
370      live-on-entry.  */
371
372   FOR_EACH_SSA_MAYDEF_OPERAND (def_p, use_p, stmt, iter)
373     {
374       if (prepare_use_operand_for_rename (use_p, &uid))
375         {
376           /* If we do not already have an SSA_NAME for our destination,
377              then set the destination to the source.  */
378           if (TREE_CODE (DEF_FROM_PTR (def_p)) != SSA_NAME)
379             SET_DEF (def_p, USE_FROM_PTR (use_p));
380             
381           set_livein_block (USE_FROM_PTR (use_p), bb);
382           set_def_block (DEF_FROM_PTR (def_p), bb, false, false);
383         }
384     }
385
386   /* Now process the virtual must-defs made by this statement.  */
387   FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF | SSA_OP_VMUSTDEF)
388     {
389       if (prepare_def_operand_for_rename (def, &uid))
390         {
391           set_def_block (def, bb, false, false);
392           SET_BIT (kills, uid);
393         }
394     }
395
396 }
397
398 /* Ditto, but works over ssa names.  */
399
400 static void
401 ssa_mark_def_sites (struct dom_walk_data *walk_data,
402                     basic_block bb,
403                     block_stmt_iterator bsi)
404 {
405   struct mark_def_sites_global_data *gd = walk_data->global_data;
406   sbitmap kills = gd->kills;
407   size_t uid, def_uid;
408   tree stmt, use, def;
409   ssa_op_iter iter;
410
411   /* Mark all the blocks that have definitions for each variable in the
412      names_to_rename bitmap.  */
413   stmt = bsi_stmt (bsi);
414   get_stmt_operands (stmt);
415
416   /* If a variable is used before being set, then the variable is live
417      across a block boundary, so mark it live-on-entry to BB.  */
418   FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_ALL_USES)
419     {
420       uid = SSA_NAME_VERSION (use);
421
422       if (TEST_BIT (gd->names_to_rename, uid)
423           && !TEST_BIT (kills, uid))
424         set_livein_block (use, bb);
425     }
426           
427   /* Now process the definition made by this statement.  Mark the
428      variables in KILLS.  */
429   FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
430     {
431       def_uid = SSA_NAME_VERSION (def);
432
433       if (TEST_BIT (gd->names_to_rename, def_uid))
434         {
435           set_def_block (def, bb, false, true);
436           SET_BIT (kills, def_uid);
437         }
438     }
439 }
440
441 /* Mark block BB as the definition site for variable VAR.  PHI_P is true if
442    VAR is defined by a phi node.  SSA_P is true if we are called from
443    rewrite_ssa_into_ssa.  */
444
445 static void
446 set_def_block (tree var, basic_block bb, bool phi_p, bool ssa_p)
447 {
448   struct def_blocks_d *db_p;
449   enum need_phi_state state;
450
451   if (!ssa_p
452       && TREE_CODE (var) == SSA_NAME)
453     var = SSA_NAME_VAR (var);
454
455   state = get_phi_state (var);
456   db_p = get_def_blocks_for (var);
457
458   /* Set the bit corresponding to the block where VAR is defined.  */
459   bitmap_set_bit (db_p->def_blocks, bb->index);
460   if (phi_p)
461     bitmap_set_bit (db_p->phi_blocks, bb->index);
462
463   /* Keep track of whether or not we may need to insert phi nodes.
464
465      If we are in the UNKNOWN state, then this is the first definition
466      of VAR.  Additionally, we have not seen any uses of VAR yet, so
467      we do not need a phi node for this variable at this time (i.e.,
468      transition to NEED_PHI_STATE_NO).
469
470      If we are in any other state, then we either have multiple definitions
471      of this variable occurring in different blocks or we saw a use of the
472      variable which was not dominated by the block containing the
473      definition(s).  In this case we may need a PHI node, so enter
474      state NEED_PHI_STATE_MAYBE.  */
475   if (state == NEED_PHI_STATE_UNKNOWN)
476     set_phi_state (var, NEED_PHI_STATE_NO);
477   else
478     set_phi_state (var, NEED_PHI_STATE_MAYBE);
479 }
480
481
482 /* Mark block BB as having VAR live at the entry to BB.  */
483
484 static void
485 set_livein_block (tree var, basic_block bb)
486 {
487   struct def_blocks_d *db_p;
488   enum need_phi_state state = get_phi_state (var);
489
490   db_p = get_def_blocks_for (var);
491
492   /* Set the bit corresponding to the block where VAR is live in.  */
493   bitmap_set_bit (db_p->livein_blocks, bb->index);
494
495   /* Keep track of whether or not we may need to insert phi nodes.
496
497      If we reach here in NEED_PHI_STATE_NO, see if this use is dominated
498      by the single block containing the definition(s) of this variable.  If
499      it is, then we remain in NEED_PHI_STATE_NO, otherwise we transition to
500      NEED_PHI_STATE_MAYBE.  */
501   if (state == NEED_PHI_STATE_NO)
502     {
503       int def_block_index = bitmap_first_set_bit (db_p->def_blocks);
504
505       if (def_block_index == -1
506           || ! dominated_by_p (CDI_DOMINATORS, bb,
507                                BASIC_BLOCK (def_block_index)))
508         set_phi_state (var, NEED_PHI_STATE_MAYBE);
509     }
510   else
511     set_phi_state (var, NEED_PHI_STATE_MAYBE);
512 }
513
514
515 /* If the use operand pointed to by OP_P needs to be renamed, then strip away 
516    any SSA_NAME wrapping the operand, set *UID_P to the underlying variable's 
517    uid, and return true.  Otherwise return false.  If the operand was an 
518    SSA_NAME, change it to the stripped name.  */
519
520 static bool
521 prepare_use_operand_for_rename (use_operand_p op_p, size_t *uid_p)
522 {
523   tree use = USE_FROM_PTR (op_p);
524   tree var = (TREE_CODE (use) != SSA_NAME) ? use : SSA_NAME_VAR (use);
525   *uid_p = var_ann (var)->uid;
526
527   /* Ignore variables that don't need to be renamed.  */
528   if (vars_to_rename && !bitmap_bit_p (vars_to_rename, *uid_p))
529     return false;
530
531   /* The variable needs to be renamed.  If this is a use which already
532      has an SSA_NAME, then strip it off.
533
534      By not throwing away SSA_NAMEs on assignments, we avoid a lot of 
535      useless churn of SSA_NAMEs without having to overly complicate the
536      renamer.  */
537   if (TREE_CODE (use) == SSA_NAME)
538     SET_USE (op_p, var);
539
540   return true;
541 }
542
543 /* If the def variable DEF needs to be renamed, then strip away any SSA_NAME 
544    wrapping the operand, set *UID_P to the underlying variable's uid and return
545    true.  Otherwise return false.  */
546
547 static bool
548 prepare_def_operand_for_rename (tree def, size_t *uid_p)
549 {
550   tree var = (TREE_CODE (def) != SSA_NAME) ? def : SSA_NAME_VAR (def);
551   *uid_p = var_ann (var)->uid;
552
553   /* Ignore variables that don't need to be renamed.  */
554   if (vars_to_rename && !bitmap_bit_p (vars_to_rename, *uid_p))
555     return false;
556
557   return true;
558 }
559
560 /* Helper for insert_phi_nodes.  If VAR needs PHI nodes, insert them
561    at the dominance frontier (DFS) of blocks defining VAR.
562    WORK_STACK is the varray used to implement the worklist of basic
563    blocks.  */
564
565 static inline
566 void insert_phi_nodes_1 (tree var, bitmap *dfs, varray_type *work_stack)
567 {
568   if (get_phi_state (var) != NEED_PHI_STATE_NO)
569     insert_phi_nodes_for (var, dfs, work_stack);
570 }
571
572 /* Insert PHI nodes at the dominance frontier of blocks with variable
573    definitions.  DFS contains the dominance frontier information for
574    the flowgraph.  PHI nodes will only be inserted at the dominance
575    frontier of definition blocks for variables whose NEED_PHI_STATE
576    annotation is marked as ``maybe'' or ``unknown'' (computed by
577    mark_def_sites).  If NAMES_TO_RENAME is not NULL, do the same but
578    for ssa name rewriting.  */
579
580 static void
581 insert_phi_nodes (bitmap *dfs, bitmap names_to_rename)
582 {
583   size_t i;
584   varray_type work_stack;
585
586   timevar_push (TV_TREE_INSERT_PHI_NODES);
587
588   /* Array WORK_STACK is a stack of CFG blocks.  Each block that contains
589      an assignment or PHI node will be pushed to this stack.  */
590   VARRAY_GENERIC_PTR_NOGC_INIT (work_stack, last_basic_block, "work_stack");
591
592   /* Iterate over all variables in VARS_TO_RENAME.  For each variable, add
593      to the work list all the blocks that have a definition for the
594      variable.  PHI nodes will be added to the dominance frontier blocks of
595      each definition block.  */
596   if (names_to_rename)
597     {
598       EXECUTE_IF_SET_IN_BITMAP (names_to_rename, 0, i,
599         {
600           if (ssa_name (i))
601             insert_phi_nodes_1 (ssa_name (i), dfs, &work_stack);
602         });
603     }
604   else if (vars_to_rename)
605     EXECUTE_IF_SET_IN_BITMAP (vars_to_rename, 0, i,
606         insert_phi_nodes_1 (referenced_var (i), dfs, &work_stack));
607   else
608     for (i = 0; i < num_referenced_vars; i++)
609       insert_phi_nodes_1 (referenced_var (i), dfs, &work_stack);
610
611   VARRAY_FREE (work_stack);
612
613   timevar_pop (TV_TREE_INSERT_PHI_NODES);
614 }
615
616
617 /* Perform a depth-first traversal of the dominator tree looking for
618    variables to rename.  BB is the block where to start searching.
619    Renaming is a five step process:
620
621    1- Every definition made by PHI nodes at the start of the blocks is
622       registered as the current definition for the corresponding variable.
623
624    2- Every statement in BB is rewritten.  USE and VUSE operands are
625       rewritten with their corresponding reaching definition.  DEF and
626       VDEF targets are registered as new definitions.
627       
628    3- All the PHI nodes in successor blocks of BB are visited.  The
629       argument corresponding to BB is replaced with its current reaching
630       definition.
631
632    4- Recursively rewrite every dominator child block of BB.
633
634    5- Restore (in reverse order) the current reaching definition for every
635       new definition introduced in this block.  This is done so that when
636       we return from the recursive call, all the current reaching
637       definitions are restored to the names that were valid in the
638       dominator parent of BB.  */
639
640 /* Initialize the local stacks.
641      
642    BLOCK_DEFS is used to save all the existing reaching definitions for
643    the new SSA names introduced in this block.  Before registering a
644    new definition for a variable, the existing reaching definition is
645    pushed into this stack so that we can restore it in Step 5.  */
646
647 static void
648 rewrite_initialize_block_local_data (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
649                                      basic_block bb ATTRIBUTE_UNUSED,
650                                      bool recycled ATTRIBUTE_UNUSED)
651 {
652   struct rewrite_block_data *bd
653     = (struct rewrite_block_data *)VARRAY_TOP_GENERIC_PTR (walk_data->block_data_stack);
654                                                                                 
655   /* We get cleared memory from the allocator, so if the memory is
656      not cleared, then we are re-using a previously allocated entry.  In
657      that case, we can also re-use the underlying virtual arrays.  Just
658      make sure we clear them before using them!  */
659   gcc_assert (!recycled || !bd->block_defs || !(VARRAY_ACTIVE_SIZE (bd->block_defs) > 0));
660 }
661
662
663 /* SSA Rewriting Step 1.  Initialization, create a block local stack
664    of reaching definitions for new SSA names produced in this block
665    (BLOCK_DEFS).  Register new definitions for every PHI node in the
666    block.  */
667
668 static void
669 rewrite_initialize_block (struct dom_walk_data *walk_data, basic_block bb)
670 {
671   tree phi;
672   struct rewrite_block_data *bd
673     = (struct rewrite_block_data *)VARRAY_TOP_GENERIC_PTR (walk_data->block_data_stack);
674
675   if (dump_file && (dump_flags & TDF_DETAILS))
676     fprintf (dump_file, "\n\nRenaming block #%d\n\n", bb->index);
677
678   /* Step 1.  Register new definitions for every PHI node in the block.
679      Conceptually, all the PHI nodes are executed in parallel and each PHI
680      node introduces a new version for the associated variable.  */
681   for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
682     {
683       tree result = PHI_RESULT (phi);
684
685       register_new_def (result, &bd->block_defs);
686     }
687 }
688
689 /* Register DEF (an SSA_NAME) to be a new definition for the original
690    ssa name VAR and push VAR's current reaching definition
691    into the stack pointed by BLOCK_DEFS_P.  */
692
693 static void
694 ssa_register_new_def (tree var, tree def, varray_type *block_defs_p)
695 {
696   tree currdef;
697    
698   /* If this variable is set in a single basic block and all uses are
699      dominated by the set(s) in that single basic block, then there is
700      nothing to do.  TODO we should not be called at all, and just
701      keep the original name.  */
702   if (get_phi_state (var) == NEED_PHI_STATE_NO)
703     {
704       set_current_def (var, def);
705       return;
706     }
707
708   currdef = get_current_def (var);
709   if (! *block_defs_p)
710     VARRAY_TREE_INIT (*block_defs_p, 20, "block_defs");
711
712   /* Push the current reaching definition into *BLOCK_DEFS_P.  This stack is
713      later used by the dominator tree callbacks to restore the reaching
714      definitions for all the variables defined in the block after a recursive
715      visit to all its immediately dominated blocks.  */
716   VARRAY_PUSH_TREE (*block_defs_p, var);
717   VARRAY_PUSH_TREE (*block_defs_p, currdef);
718
719   /* Set the current reaching definition for VAR to be DEF.  */
720   set_current_def (var, def);
721 }
722
723 /* Ditto, for rewriting ssa names.  */
724
725 static void
726 ssa_rewrite_initialize_block (struct dom_walk_data *walk_data, basic_block bb)
727 {
728   tree phi, new_name;
729   struct rewrite_block_data *bd
730     = (struct rewrite_block_data *)VARRAY_TOP_GENERIC_PTR (walk_data->block_data_stack);
731   sbitmap names_to_rename = walk_data->global_data;
732   edge e;
733   bool abnormal_phi;
734
735   if (dump_file && (dump_flags & TDF_DETAILS))
736     fprintf (dump_file, "\n\nRenaming block #%d\n\n", bb->index);
737
738   for (e = bb->pred; e; e = e->pred_next)
739     if (e->flags & EDGE_ABNORMAL)
740       break;
741   abnormal_phi = (e != NULL);
742
743   /* Step 1.  Register new definitions for every PHI node in the block.
744      Conceptually, all the PHI nodes are executed in parallel and each PHI
745      node introduces a new version for the associated variable.  */
746   for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
747     {
748       tree result = PHI_RESULT (phi);
749
750       if (TEST_BIT (names_to_rename, SSA_NAME_VERSION (result)))
751         {
752           new_name = duplicate_ssa_name (result, phi);
753           SET_PHI_RESULT (phi, new_name);
754
755           if (abnormal_phi)
756             SSA_NAME_OCCURS_IN_ABNORMAL_PHI (new_name) = 1;
757         }
758       else
759         new_name = result;
760
761       ssa_register_new_def (result, new_name, &bd->block_defs);
762     }
763 }
764
765 /* SSA Rewriting Step 3.  Visit all the successor blocks of BB looking for
766    PHI nodes.  For every PHI node found, add a new argument containing the
767    current reaching definition for the variable and the edge through which
768    that definition is reaching the PHI node.   */
769
770 static void
771 rewrite_add_phi_arguments (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
772                            basic_block bb)
773 {
774   edge e;
775
776   for (e = bb->succ; e; e = e->succ_next)
777     {
778       tree phi;
779
780       for (phi = phi_nodes (e->dest); phi; phi = TREE_CHAIN (phi))
781         {
782           tree currdef;
783
784           /* If this PHI node has already been rewritten, then there is
785              nothing to do for this PHI or any following PHIs since we
786              always add new PHI nodes at the start of the PHI chain.  */
787           if (PHI_REWRITTEN (phi))
788             break;
789
790           currdef = get_reaching_def (SSA_NAME_VAR (PHI_RESULT (phi)));
791           add_phi_arg (&phi, currdef, e);
792         }
793     }
794 }
795
796 /* Ditto, for ssa name rewriting.  */
797
798 static void
799 ssa_rewrite_phi_arguments (struct dom_walk_data *walk_data, basic_block bb)
800 {
801   edge e;
802   sbitmap names_to_rename = walk_data->global_data;
803   use_operand_p op;
804
805   for (e = bb->succ; e; e = e->succ_next)
806     {
807       tree phi;
808
809       if (e->dest == EXIT_BLOCK_PTR)
810         continue;
811
812       for (phi = phi_nodes (e->dest); phi; phi = TREE_CHAIN (phi))
813         {
814           op = PHI_ARG_DEF_PTR_FROM_EDGE (phi, e);
815           if (TREE_CODE (USE_FROM_PTR (op)) != SSA_NAME)
816             continue;
817
818           if (!TEST_BIT (names_to_rename, SSA_NAME_VERSION (USE_FROM_PTR (op))))
819             continue;
820
821           SET_USE (op, get_reaching_def (USE_FROM_PTR (op)));
822           if (e->flags & EDGE_ABNORMAL)
823             SSA_NAME_OCCURS_IN_ABNORMAL_PHI (USE_FROM_PTR (op)) = 1;
824         }
825     }
826 }
827
828 /* SSA Rewriting Step 5.  Restore the current reaching definition for each
829    variable referenced in the block (in reverse order).  */
830
831 static void
832 rewrite_finalize_block (struct dom_walk_data *walk_data,
833                         basic_block bb ATTRIBUTE_UNUSED)
834 {
835   struct rewrite_block_data *bd
836     = (struct rewrite_block_data *)VARRAY_TOP_GENERIC_PTR (walk_data->block_data_stack);
837
838   /* Step 5.  Restore the current reaching definition for each variable
839      referenced in the block (in reverse order).  */
840   while (bd->block_defs && VARRAY_ACTIVE_SIZE (bd->block_defs) > 0)
841     {
842       tree tmp = VARRAY_TOP_TREE (bd->block_defs);
843       tree saved_def, var;
844
845       VARRAY_POP (bd->block_defs);
846       if (TREE_CODE (tmp) == SSA_NAME)
847         {
848           saved_def = tmp;
849           var = SSA_NAME_VAR (saved_def);
850         }
851       else
852         {
853           saved_def = NULL;
854           var = tmp;
855         }
856
857       set_current_def (var, saved_def);
858     }
859 }
860
861 /* Ditto, for rewriting ssa names.  */
862
863 static void
864 ssa_rewrite_finalize_block (struct dom_walk_data *walk_data,
865                             basic_block bb ATTRIBUTE_UNUSED)
866 {
867   struct rewrite_block_data *bd
868     = (struct rewrite_block_data *)VARRAY_TOP_GENERIC_PTR (walk_data->block_data_stack);
869
870   /* Step 5.  Restore the current reaching definition for each variable
871      referenced in the block (in reverse order).  */
872   while (bd->block_defs && VARRAY_ACTIVE_SIZE (bd->block_defs) > 0)
873     {
874       tree var;
875       tree saved_def = VARRAY_TOP_TREE (bd->block_defs);
876       VARRAY_POP (bd->block_defs);
877       
878       var = VARRAY_TOP_TREE (bd->block_defs);
879       VARRAY_POP (bd->block_defs);
880
881       set_current_def (var, saved_def);
882     }
883 }
884
885 /* Dump SSA information to FILE.  */
886
887 void
888 dump_tree_ssa (FILE *file)
889 {
890   basic_block bb;
891   const char *funcname
892     = lang_hooks.decl_printable_name (current_function_decl, 2);
893
894   fprintf (file, "SSA information for %s\n\n", funcname);
895
896   FOR_EACH_BB (bb)
897     {
898       dump_bb (bb, file, 0);
899       fputs ("    ", file);
900       print_generic_stmt (file, phi_nodes (bb), dump_flags);
901       fputs ("\n\n", file);
902     }
903 }
904
905
906 /* Dump SSA information to stderr.  */
907
908 void
909 debug_tree_ssa (void)
910 {
911   dump_tree_ssa (stderr);
912 }
913
914
915 /* Dump SSA statistics on FILE.  */
916
917 void
918 dump_tree_ssa_stats (FILE *file)
919 {
920   fprintf (file, "\nHash table statistics:\n");
921
922   fprintf (file, "    def_blocks: ");
923   htab_statistics (file, def_blocks);
924
925   fprintf (file, "\n");
926 }
927
928
929 /* Dump SSA statistics on stderr.  */
930
931 void
932 debug_tree_ssa_stats (void)
933 {
934   dump_tree_ssa_stats (stderr);
935 }
936
937
938 /* Dump statistics for the hash table HTAB.  */
939
940 static void
941 htab_statistics (FILE *file, htab_t htab)
942 {
943   fprintf (file, "size %ld, %ld elements, %f collision/search ratio\n",
944            (long) htab_size (htab),
945            (long) htab_elements (htab),
946            htab_collisions (htab));
947 }
948
949
950 /* Insert PHI nodes for variable VAR using the dominance frontier
951    information given in DFS.  WORK_STACK is the varray used to
952    implement the worklist of basic blocks.  */
953
954 static void
955 insert_phi_nodes_for (tree var, bitmap *dfs, varray_type *work_stack)
956 {
957   struct def_blocks_d *def_map;
958   bitmap phi_insertion_points;
959   int bb_index;
960   edge e;
961   tree phi;
962   basic_block bb;
963
964   def_map = find_def_blocks_for (var);
965   if (def_map == NULL)
966     return;
967
968   phi_insertion_points = BITMAP_XMALLOC ();
969
970   EXECUTE_IF_SET_IN_BITMAP (def_map->def_blocks, 0, bb_index,
971     {
972       VARRAY_PUSH_GENERIC_PTR_NOGC (*work_stack, BASIC_BLOCK (bb_index));
973     });
974
975   /* Pop a block off the worklist, add every block that appears in
976      the original block's dfs that we have not already processed to
977      the worklist.  Iterate until the worklist is empty.   Blocks
978      which are added to the worklist are potential sites for
979      PHI nodes. 
980
981      The iteration step could be done during PHI insertion just as
982      easily.  We do it here for historical reasons -- we used to have
983      a heuristic which used the potential PHI insertion points to
984      determine if fully pruned or semi pruned SSA form was appropriate.
985
986      We now always use fully pruned SSA form.  */
987   while (VARRAY_ACTIVE_SIZE (*work_stack) > 0)
988     {
989       int dfs_index;
990
991       bb = VARRAY_TOP_GENERIC_PTR_NOGC (*work_stack);
992       bb_index = bb->index;
993
994       VARRAY_POP (*work_stack);
995       
996       EXECUTE_IF_AND_COMPL_IN_BITMAP (dfs[bb_index],
997                                       phi_insertion_points,
998                                       0, dfs_index,
999         {
1000           basic_block bb = BASIC_BLOCK (dfs_index);
1001
1002           VARRAY_PUSH_GENERIC_PTR_NOGC (*work_stack, bb);
1003           bitmap_set_bit (phi_insertion_points, dfs_index);
1004         });
1005     }
1006
1007   /* Remove the blocks where we already have the phis.  */
1008   bitmap_operation (phi_insertion_points, phi_insertion_points,
1009                     def_map->phi_blocks, BITMAP_AND_COMPL);
1010
1011   /* Now compute global livein for this variable.  Note this modifies
1012      def_map->livein_blocks.  */
1013   compute_global_livein (def_map->livein_blocks, def_map->def_blocks);
1014
1015   /* And insert the PHI nodes.  */
1016   EXECUTE_IF_AND_IN_BITMAP (phi_insertion_points, def_map->livein_blocks,
1017                             0, bb_index,
1018     do
1019       {
1020         bb = BASIC_BLOCK (bb_index);
1021
1022         phi = create_phi_node (var, bb);
1023
1024         /* If we are rewriting ssa names, add also the phi arguments.  */
1025         if (TREE_CODE (var) == SSA_NAME)
1026           {
1027             for (e = bb->pred; e; e = e->pred_next)
1028               add_phi_arg (&phi, var, e);
1029           }
1030       }
1031     while (0));
1032
1033   BITMAP_XFREE (phi_insertion_points);
1034 }
1035
1036 /* SSA Rewriting Step 2.  Rewrite every variable used in each statement in
1037    the block with its immediate reaching definitions.  Update the current
1038    definition of a variable when a new real or virtual definition is found.  */
1039
1040 static void
1041 rewrite_stmt (struct dom_walk_data *walk_data,
1042               basic_block bb ATTRIBUTE_UNUSED,
1043               block_stmt_iterator si)
1044 {
1045   stmt_ann_t ann;
1046   tree stmt;
1047   use_operand_p use_p;
1048   def_operand_p def_p;
1049   ssa_op_iter iter;
1050   struct rewrite_block_data *bd;
1051
1052   bd = VARRAY_TOP_GENERIC_PTR (walk_data->block_data_stack);
1053
1054   stmt = bsi_stmt (si);
1055   ann = stmt_ann (stmt);
1056
1057   if (dump_file && (dump_flags & TDF_DETAILS))
1058     {
1059       fprintf (dump_file, "Renaming statement ");
1060       print_generic_stmt (dump_file, stmt, TDF_SLIM);
1061       fprintf (dump_file, "\n");
1062     }
1063
1064   /* We have just scanned the code for operands.  No statement should
1065      be modified.  */
1066   gcc_assert (!ann->modified);
1067
1068   /* Step 1.  Rewrite USES and VUSES in the statement.  */
1069   FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
1070     rewrite_operand (use_p);
1071
1072   /* Step 2.  Register the statement's DEF and VDEF operands.  */
1073   FOR_EACH_SSA_DEF_OPERAND (def_p, stmt, iter, SSA_OP_ALL_DEFS)
1074     {
1075       if (TREE_CODE (DEF_FROM_PTR (def_p)) != SSA_NAME)
1076         SET_DEF (def_p, make_ssa_name (DEF_FROM_PTR (def_p), stmt));
1077
1078       /* FIXME: We shouldn't be registering new defs if the variable
1079          doesn't need to be renamed.  */
1080       register_new_def (DEF_FROM_PTR (def_p), &bd->block_defs);
1081     }
1082 }
1083
1084 /* Ditto, for rewriting ssa names.  */
1085
1086 static void
1087 ssa_rewrite_stmt (struct dom_walk_data *walk_data,
1088                   basic_block bb ATTRIBUTE_UNUSED,
1089                   block_stmt_iterator si)
1090 {
1091   stmt_ann_t ann;
1092   tree stmt, var;
1093   ssa_op_iter iter;
1094   use_operand_p use_p;
1095   def_operand_p def_p;
1096   struct rewrite_block_data *bd;
1097   sbitmap names_to_rename = walk_data->global_data;
1098
1099   bd = VARRAY_TOP_GENERIC_PTR (walk_data->block_data_stack);
1100
1101   stmt = bsi_stmt (si);
1102   ann = stmt_ann (stmt);
1103
1104   if (dump_file && (dump_flags & TDF_DETAILS))
1105     {
1106       fprintf (dump_file, "Renaming statement ");
1107       print_generic_stmt (dump_file, stmt, TDF_SLIM);
1108       fprintf (dump_file, "\n");
1109     }
1110
1111   /* We have just scanned the code for operands.  No statement should
1112      be modified.  */
1113   gcc_assert (!ann->modified);
1114
1115   /* Step 1.  Rewrite USES and VUSES in the statement.  */
1116   FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
1117     {
1118       if (TEST_BIT (names_to_rename, SSA_NAME_VERSION (USE_FROM_PTR (use_p))))
1119         SET_USE (use_p, get_reaching_def (USE_FROM_PTR (use_p)));
1120     }
1121
1122   /* Step 2.  Register the statement's DEF and VDEF operands.  */
1123   FOR_EACH_SSA_DEF_OPERAND (def_p, stmt, iter, SSA_OP_ALL_DEFS)
1124     {
1125       var = DEF_FROM_PTR (def_p);
1126
1127       if (!TEST_BIT (names_to_rename, SSA_NAME_VERSION (var)))
1128         continue;
1129
1130       SET_DEF (def_p, duplicate_ssa_name (var, stmt));
1131       ssa_register_new_def (var, DEF_FROM_PTR (def_p), &bd->block_defs);
1132     }
1133 }
1134
1135 /* Replace the operand pointed by OP_P with its immediate reaching
1136    definition.  */
1137
1138 static inline void
1139 rewrite_operand (use_operand_p op_p)
1140 {
1141   if (TREE_CODE (USE_FROM_PTR (op_p)) != SSA_NAME)
1142     SET_USE (op_p, get_reaching_def (USE_FROM_PTR (op_p)));
1143 }
1144
1145 /* Register DEF (an SSA_NAME) to be a new definition for its underlying
1146    variable (SSA_NAME_VAR (DEF)) and push VAR's current reaching definition
1147    into the stack pointed by BLOCK_DEFS_P.  */
1148
1149 void
1150 register_new_def (tree def, varray_type *block_defs_p)
1151 {
1152   tree var = SSA_NAME_VAR (def);
1153   tree currdef;
1154    
1155   /* If this variable is set in a single basic block and all uses are
1156      dominated by the set(s) in that single basic block, then there is
1157      no reason to record anything for this variable in the block local
1158      definition stacks.  Doing so just wastes time and memory.
1159
1160      This is the same test to prune the set of variables which may
1161      need PHI nodes.  So we just use that information since it's already
1162      computed and available for us to use.  */
1163   if (get_phi_state (var) == NEED_PHI_STATE_NO)
1164     {
1165       set_current_def (var, def);
1166       return;
1167     }
1168
1169   currdef = get_current_def (var);
1170   if (! *block_defs_p)
1171     VARRAY_TREE_INIT (*block_defs_p, 20, "block_defs");
1172
1173   /* Push the current reaching definition into *BLOCK_DEFS_P.  This stack is
1174      later used by the dominator tree callbacks to restore the reaching
1175      definitions for all the variables defined in the block after a recursive
1176      visit to all its immediately dominated blocks.  If there is no current
1177      reaching definition, then just record the underlying _DECL node.  */
1178   VARRAY_PUSH_TREE (*block_defs_p, currdef ? currdef : var);
1179
1180   /* Set the current reaching definition for VAR to be DEF.  */
1181   set_current_def (var, def);
1182 }
1183
1184 /* Return the current definition for variable VAR.  If none is found,
1185    create a new SSA name to act as the zeroth definition for VAR.  If VAR
1186    is call clobbered and there exists a more recent definition of
1187    GLOBAL_VAR, return the definition for GLOBAL_VAR.  This means that VAR
1188    has been clobbered by a function call since its last assignment.  */
1189
1190 static tree
1191 get_reaching_def (tree var)
1192 {
1193   tree default_d, currdef_var, avar;
1194   
1195   /* Lookup the current reaching definition for VAR.  */
1196   default_d = NULL_TREE;
1197   currdef_var = get_current_def (var);
1198
1199   /* If there is no reaching definition for VAR, create and register a
1200      default definition for it (if needed).  */
1201   if (currdef_var == NULL_TREE)
1202     {
1203       if (TREE_CODE (var) == SSA_NAME)
1204         avar = SSA_NAME_VAR (var);
1205       else
1206         avar = var;
1207
1208       default_d = default_def (avar);
1209       if (default_d == NULL_TREE)
1210         {
1211           default_d = make_ssa_name (avar, build_empty_stmt ());
1212           set_default_def (avar, default_d);
1213         }
1214       set_current_def (var, default_d);
1215     }
1216
1217   /* Return the current reaching definition for VAR, or the default
1218      definition, if we had to create one.  */
1219   return (currdef_var) ? currdef_var : default_d;
1220 }
1221
1222
1223 /* Hashing and equality functions for DEF_BLOCKS.  */
1224
1225 static hashval_t
1226 def_blocks_hash (const void *p)
1227 {
1228   return htab_hash_pointer
1229         ((const void *)((const struct def_blocks_d *)p)->var);
1230 }
1231
1232 static int
1233 def_blocks_eq (const void *p1, const void *p2)
1234 {
1235   return ((const struct def_blocks_d *)p1)->var
1236          == ((const struct def_blocks_d *)p2)->var;
1237 }
1238
1239 /* Free memory allocated by one entry in DEF_BLOCKS.  */
1240
1241 static void
1242 def_blocks_free (void *p)
1243 {
1244   struct def_blocks_d *entry = p;
1245   BITMAP_XFREE (entry->def_blocks);
1246   BITMAP_XFREE (entry->phi_blocks);
1247   BITMAP_XFREE (entry->livein_blocks);
1248   free (entry);
1249 }
1250
1251
1252 /* Dump the DEF_BLOCKS hash table on stderr.  */
1253
1254 void
1255 debug_def_blocks (void)
1256 {
1257   htab_traverse (def_blocks, debug_def_blocks_r, NULL);
1258 }
1259
1260 /* Callback for htab_traverse to dump the DEF_BLOCKS hash table.  */
1261
1262 static int
1263 debug_def_blocks_r (void **slot, void *data ATTRIBUTE_UNUSED)
1264 {
1265   unsigned long i;
1266   struct def_blocks_d *db_p = (struct def_blocks_d *) *slot;
1267   
1268   fprintf (stderr, "VAR: ");
1269   print_generic_expr (stderr, db_p->var, dump_flags);
1270   fprintf (stderr, ", DEF_BLOCKS: { ");
1271   EXECUTE_IF_SET_IN_BITMAP (db_p->def_blocks, 0, i,
1272                             fprintf (stderr, "%ld ", i));
1273   fprintf (stderr, "}");
1274   fprintf (stderr, ", LIVEIN_BLOCKS: { ");
1275   EXECUTE_IF_SET_IN_BITMAP (db_p->livein_blocks, 0, i,
1276                             fprintf (stderr, "%ld ", i));
1277   fprintf (stderr, "}\n");
1278
1279   return 1;
1280 }
1281
1282
1283 /* Return the set of blocks where variable VAR is defined and the blocks
1284    where VAR is live on entry (livein).  Return NULL, if no entry is
1285    found in DEF_BLOCKS.  */
1286
1287 static inline struct def_blocks_d *
1288 find_def_blocks_for (tree var)
1289 {
1290   struct def_blocks_d dm;
1291   dm.var = var;
1292   return (struct def_blocks_d *) htab_find (def_blocks, &dm);
1293 }
1294
1295
1296 /* Return the set of blocks where variable VAR is defined and the blocks
1297    where VAR is live on entry (livein).  If no entry is found in
1298    DEF_BLOCKS, a new one is created and returned.  */
1299
1300 static inline struct def_blocks_d *
1301 get_def_blocks_for (tree var)
1302 {
1303   struct def_blocks_d db, *db_p;
1304   void **slot;
1305
1306   db.var = var;
1307   slot = htab_find_slot (def_blocks, (void *) &db, INSERT);
1308   if (*slot == NULL)
1309     {
1310       db_p = xmalloc (sizeof (*db_p));
1311       db_p->var = var;
1312       db_p->def_blocks = BITMAP_XMALLOC ();
1313       db_p->phi_blocks = BITMAP_XMALLOC ();
1314       db_p->livein_blocks = BITMAP_XMALLOC ();
1315       *slot = (void *) db_p;
1316     }
1317   else
1318     db_p = (struct def_blocks_d *) *slot;
1319
1320   return db_p;
1321 }
1322
1323 /* If a variable V in VARS_TO_RENAME is a pointer, the renaming
1324    process will cause us to lose the name memory tags that may have
1325    been associated with the various SSA_NAMEs of V.  This means that
1326    the variables aliased to those name tags also need to be renamed
1327    again.
1328
1329    FIXME 1- We should either have a better scheme for renaming
1330             pointers that doesn't lose name tags or re-run alias
1331             analysis to recover points-to information.
1332
1333          2- Currently we just invalidate *all* the name tags.  This
1334             should be more selective.  */
1335
1336 static void
1337 invalidate_name_tags (bitmap vars_to_rename)
1338 {
1339   size_t i;
1340   bool rename_name_tags_p;
1341
1342   rename_name_tags_p = false;
1343   EXECUTE_IF_SET_IN_BITMAP (vars_to_rename, 0, i,
1344       if (POINTER_TYPE_P (TREE_TYPE (referenced_var (i))))
1345         {
1346           rename_name_tags_p = true;
1347           break;
1348         });
1349
1350   if (rename_name_tags_p)
1351     for (i = 0; i < num_referenced_vars; i++)
1352       {
1353         var_ann_t ann = var_ann (referenced_var (i));
1354
1355         if (ann->mem_tag_kind == NAME_TAG)
1356           {
1357             size_t j;
1358             varray_type may_aliases = ann->may_aliases;
1359
1360             bitmap_set_bit (vars_to_rename, ann->uid);
1361             if (ann->may_aliases)
1362               for (j = 0; j < VARRAY_ACTIVE_SIZE (may_aliases); j++)
1363                 {
1364                   tree var = VARRAY_TREE (may_aliases, j);
1365                   bitmap_set_bit (vars_to_rename, var_ann (var)->uid);
1366                 }
1367           }
1368       }
1369 }
1370
1371
1372 /* Main entry point into the SSA builder.  The renaming process
1373    proceeds in five main phases:
1374
1375    1- If VARS_TO_RENAME has any entries, any existing PHI nodes for
1376       those variables are removed from the flow graph so that they can
1377       be computed again.
1378
1379    2- Compute dominance frontier and immediate dominators, needed to
1380       insert PHI nodes and rename the function in dominator tree
1381       order.
1382
1383    3- Find and mark all the blocks that define variables
1384       (mark_def_sites).
1385
1386    4- Insert PHI nodes at dominance frontiers (insert_phi_nodes).
1387
1388    5- Rename all the blocks (rewrite_initialize_block,
1389       rewrite_add_phi_arguments) and statements in the program
1390       (rewrite_stmt).
1391
1392    Steps 3 and 5 are done using the dominator tree walker
1393    (walk_dominator_tree).
1394
1395    ALL is true if all variables should be renamed (otherwise just those
1396    mentioned in vars_to_rename are taken into account).  */
1397
1398 void
1399 rewrite_into_ssa (bool all)
1400 {
1401   bitmap *dfs;
1402   basic_block bb;
1403   struct dom_walk_data walk_data;
1404   struct mark_def_sites_global_data mark_def_sites_global_data;
1405   bitmap old_vars_to_rename = vars_to_rename;
1406   unsigned i;
1407   
1408   timevar_push (TV_TREE_SSA_OTHER);
1409
1410   if (all)
1411     vars_to_rename = NULL;
1412   else
1413     {
1414       /* Initialize the array of variables to rename.  */
1415       gcc_assert (vars_to_rename);
1416
1417       if (bitmap_first_set_bit (vars_to_rename) < 0)
1418         {
1419           timevar_pop (TV_TREE_SSA_OTHER);
1420           return;
1421         }
1422       
1423       invalidate_name_tags (vars_to_rename);
1424
1425       /* Now remove all the existing PHI nodes (if any) for the variables
1426          that we are about to rename into SSA.  */
1427       remove_all_phi_nodes_for (vars_to_rename);
1428     }
1429
1430   /* Allocate memory for the DEF_BLOCKS hash table.  */
1431   def_blocks = htab_create (VARRAY_ACTIVE_SIZE (referenced_vars),
1432                             def_blocks_hash, def_blocks_eq, def_blocks_free);
1433
1434   /* Initialize dominance frontier and immediate dominator bitmaps. 
1435      Also count the number of predecessors for each block.  Doing so
1436      can save significant time during PHI insertion for large graphs.  */
1437   dfs = (bitmap *) xmalloc (last_basic_block * sizeof (bitmap *));
1438   FOR_EACH_BB (bb)
1439     {
1440       edge e;
1441       int count = 0;
1442
1443       for (e = bb->pred; e; e = e->pred_next)
1444         count++;
1445
1446       bb_ann (bb)->num_preds = count;
1447       dfs[bb->index] = BITMAP_XMALLOC ();
1448     }
1449
1450   for (i = 0; i < num_referenced_vars; i++)
1451     set_current_def (referenced_var (i), NULL_TREE);
1452
1453   /* Ensure that the dominance information is OK.  */
1454   calculate_dominance_info (CDI_DOMINATORS);
1455
1456   /* Compute dominance frontiers.  */
1457   compute_dominance_frontiers (dfs);
1458
1459   /* Setup callbacks for the generic dominator tree walker to find and
1460      mark definition sites.  */
1461   walk_data.walk_stmts_backward = false;
1462   walk_data.dom_direction = CDI_DOMINATORS;
1463   walk_data.initialize_block_local_data = NULL;
1464   walk_data.before_dom_children_before_stmts = mark_def_sites_initialize_block;
1465   walk_data.before_dom_children_walk_stmts = mark_def_sites;
1466   walk_data.before_dom_children_after_stmts = NULL; 
1467   walk_data.after_dom_children_before_stmts =  NULL;
1468   walk_data.after_dom_children_walk_stmts =  NULL;
1469   walk_data.after_dom_children_after_stmts =  NULL;
1470
1471   /* Notice that this bitmap is indexed using variable UIDs, so it must be
1472      large enough to accommodate all the variables referenced in the
1473      function, not just the ones we are renaming.  */
1474   mark_def_sites_global_data.kills = sbitmap_alloc (num_referenced_vars);
1475   walk_data.global_data = &mark_def_sites_global_data;
1476
1477   /* We do not have any local data.  */
1478   walk_data.block_local_data_size = 0;
1479
1480   /* Initialize the dominator walker.  */
1481   init_walk_dominator_tree (&walk_data);
1482
1483   /* Recursively walk the dominator tree.  */
1484   walk_dominator_tree (&walk_data, ENTRY_BLOCK_PTR);
1485
1486   /* Finalize the dominator walker.  */
1487   fini_walk_dominator_tree (&walk_data);
1488
1489   /* We no longer need this bitmap, clear and free it.  */
1490   sbitmap_free (mark_def_sites_global_data.kills);
1491
1492   /* Insert PHI nodes at dominance frontiers of definition blocks.  */
1493   insert_phi_nodes (dfs, NULL);
1494
1495   /* Rewrite all the basic blocks in the program.  */
1496   timevar_push (TV_TREE_SSA_REWRITE_BLOCKS);
1497
1498   /* Setup callbacks for the generic dominator tree walker.  */
1499   walk_data.walk_stmts_backward = false;
1500   walk_data.dom_direction = CDI_DOMINATORS;
1501   walk_data.initialize_block_local_data = rewrite_initialize_block_local_data;
1502   walk_data.before_dom_children_before_stmts = rewrite_initialize_block;
1503   walk_data.before_dom_children_walk_stmts = rewrite_stmt;
1504   walk_data.before_dom_children_after_stmts = rewrite_add_phi_arguments; 
1505   walk_data.after_dom_children_before_stmts =  NULL;
1506   walk_data.after_dom_children_walk_stmts =  NULL;
1507   walk_data.after_dom_children_after_stmts =  rewrite_finalize_block;
1508   walk_data.global_data = NULL;
1509   walk_data.block_local_data_size = sizeof (struct rewrite_block_data);
1510
1511   /* Initialize the dominator walker.  */
1512   init_walk_dominator_tree (&walk_data);
1513
1514   /* Recursively walk the dominator tree rewriting each statement in
1515      each basic block.  */
1516   walk_dominator_tree (&walk_data, ENTRY_BLOCK_PTR);
1517
1518   /* Finalize the dominator walker.  */
1519   fini_walk_dominator_tree (&walk_data);
1520
1521   timevar_pop (TV_TREE_SSA_REWRITE_BLOCKS);
1522
1523   /* Debugging dumps.  */
1524   if (dump_file && (dump_flags & TDF_STATS))
1525     {
1526       dump_dfa_stats (dump_file);
1527       dump_tree_ssa_stats (dump_file);
1528     }
1529
1530   /* Free allocated memory.  */
1531   FOR_EACH_BB (bb)
1532     BITMAP_XFREE (dfs[bb->index]);
1533   free (dfs);
1534
1535   htab_delete (def_blocks);
1536
1537   vars_to_rename = old_vars_to_rename;
1538   timevar_pop (TV_TREE_SSA_OTHER);
1539 }
1540
1541 /* The marked ssa names may have more than one definition;
1542    add phi nodes and rewrite them to fix this.  */
1543
1544 void
1545 rewrite_ssa_into_ssa (void)
1546 {
1547   bitmap *dfs;
1548   basic_block bb;
1549   struct dom_walk_data walk_data;
1550   struct mark_def_sites_global_data mark_def_sites_global_data;
1551   unsigned i;
1552   sbitmap snames_to_rename;
1553   tree name;
1554   bitmap to_rename;
1555   
1556   if (!any_marked_for_rewrite_p ())
1557     return;
1558   to_rename = marked_ssa_names ();
1559
1560   timevar_push (TV_TREE_SSA_OTHER);
1561
1562   /* Allocate memory for the DEF_BLOCKS hash table.  */
1563   def_blocks = htab_create (num_ssa_names,
1564                             def_blocks_hash, def_blocks_eq, def_blocks_free);
1565
1566   /* Initialize dominance frontier and immediate dominator bitmaps. 
1567      Also count the number of predecessors for each block.  Doing so
1568      can save significant time during PHI insertion for large graphs.  */
1569   dfs = (bitmap *) xmalloc (last_basic_block * sizeof (bitmap *));
1570   FOR_EACH_BB (bb)
1571     {
1572       edge e;
1573       int count = 0;
1574
1575       for (e = bb->pred; e; e = e->pred_next)
1576         count++;
1577
1578       bb_ann (bb)->num_preds = count;
1579       dfs[bb->index] = BITMAP_XMALLOC ();
1580     }
1581
1582   /* Ensure that the dominance information is OK.  */
1583   calculate_dominance_info (CDI_DOMINATORS);
1584
1585   /* Compute dominance frontiers.  */
1586   compute_dominance_frontiers (dfs);
1587
1588   /* Setup callbacks for the generic dominator tree walker to find and
1589      mark definition sites.  */
1590   walk_data.walk_stmts_backward = false;
1591   walk_data.dom_direction = CDI_DOMINATORS;
1592   walk_data.initialize_block_local_data = NULL;
1593   walk_data.before_dom_children_before_stmts
1594           = ssa_mark_def_sites_initialize_block;
1595   walk_data.before_dom_children_walk_stmts = ssa_mark_def_sites;
1596   walk_data.before_dom_children_after_stmts = ssa_mark_phi_uses; 
1597   walk_data.after_dom_children_before_stmts =  NULL;
1598   walk_data.after_dom_children_walk_stmts =  NULL;
1599   walk_data.after_dom_children_after_stmts =  NULL;
1600
1601   snames_to_rename = sbitmap_alloc (num_ssa_names);
1602   sbitmap_zero (snames_to_rename);
1603   EXECUTE_IF_SET_IN_BITMAP (to_rename, 0, i,
1604                             SET_BIT (snames_to_rename, i));
1605
1606   mark_def_sites_global_data.kills = sbitmap_alloc (num_ssa_names);
1607   mark_def_sites_global_data.names_to_rename = snames_to_rename;
1608   walk_data.global_data = &mark_def_sites_global_data;
1609
1610   /* We do not have any local data.  */
1611   walk_data.block_local_data_size = 0;
1612
1613   /* Initialize the dominator walker.  */
1614   init_walk_dominator_tree (&walk_data);
1615
1616   /* Recursively walk the dominator tree.  */
1617   walk_dominator_tree (&walk_data, ENTRY_BLOCK_PTR);
1618
1619   /* Finalize the dominator walker.  */
1620   fini_walk_dominator_tree (&walk_data);
1621
1622   /* We no longer need this bitmap, clear and free it.  */
1623   sbitmap_free (mark_def_sites_global_data.kills);
1624
1625   for (i = 1; i < num_ssa_names; i++)
1626     set_current_def (ssa_name (i), NULL_TREE);
1627
1628   /* Insert PHI nodes at dominance frontiers of definition blocks.  */
1629   insert_phi_nodes (dfs, to_rename);
1630
1631   /* Rewrite all the basic blocks in the program.  */
1632   timevar_push (TV_TREE_SSA_REWRITE_BLOCKS);
1633
1634   /* Setup callbacks for the generic dominator tree walker.  */
1635   walk_data.walk_stmts_backward = false;
1636   walk_data.dom_direction = CDI_DOMINATORS;
1637   walk_data.initialize_block_local_data
1638           = rewrite_initialize_block_local_data;
1639   walk_data.before_dom_children_before_stmts = ssa_rewrite_initialize_block;
1640   walk_data.before_dom_children_walk_stmts = ssa_rewrite_stmt;
1641   walk_data.before_dom_children_after_stmts = ssa_rewrite_phi_arguments;
1642   walk_data.after_dom_children_before_stmts = NULL;
1643   walk_data.after_dom_children_walk_stmts =  NULL;
1644   walk_data.after_dom_children_after_stmts =  ssa_rewrite_finalize_block;
1645   walk_data.global_data = snames_to_rename;
1646   walk_data.block_local_data_size = sizeof (struct rewrite_block_data);
1647
1648   /* Initialize the dominator walker.  */
1649   init_walk_dominator_tree (&walk_data);
1650
1651   /* Recursively walk the dominator tree rewriting each statement in
1652      each basic block.  */
1653   walk_dominator_tree (&walk_data, ENTRY_BLOCK_PTR);
1654
1655   /* Finalize the dominator walker.  */
1656   fini_walk_dominator_tree (&walk_data);
1657
1658   unmark_all_for_rewrite ();
1659
1660   EXECUTE_IF_SET_IN_BITMAP (to_rename, 0, i, release_ssa_name (ssa_name (i)));
1661
1662   sbitmap_free (snames_to_rename);
1663
1664   timevar_pop (TV_TREE_SSA_REWRITE_BLOCKS);
1665
1666   /* Debugging dumps.  */
1667   if (dump_file && (dump_flags & TDF_STATS))
1668     {
1669       dump_dfa_stats (dump_file);
1670       dump_tree_ssa_stats (dump_file);
1671     }
1672
1673   /* Free allocated memory.  */
1674   FOR_EACH_BB (bb)
1675     BITMAP_XFREE (dfs[bb->index]);
1676   free (dfs);
1677
1678   htab_delete (def_blocks);
1679
1680   for (i = 1; i < num_ssa_names; i++)
1681     {
1682       name = ssa_name (i);
1683       if (!SSA_NAME_AUX (name))
1684         continue;
1685
1686       free (SSA_NAME_AUX (name));
1687       SSA_NAME_AUX (name) = NULL;
1688     }
1689
1690   BITMAP_XFREE (to_rename);
1691   timevar_pop (TV_TREE_SSA_OTHER);
1692 }
1693
1694 /* Rewrites all variables into ssa.  */
1695
1696 static void
1697 rewrite_all_into_ssa (void)
1698 {
1699   rewrite_into_ssa (true);
1700 }
1701
1702 struct tree_opt_pass pass_build_ssa = 
1703 {
1704   "ssa",                                /* name */
1705   NULL,                                 /* gate */
1706   rewrite_all_into_ssa,                 /* execute */
1707   NULL,                                 /* sub */
1708   NULL,                                 /* next */
1709   0,                                    /* static_pass_number */
1710   0,                                    /* tv_id */
1711   PROP_cfg | PROP_referenced_vars,      /* properties_required */
1712   PROP_ssa,                             /* properties_provided */
1713   0,                                    /* properties_destroyed */
1714   0,                                    /* todo_flags_start */
1715   TODO_dump_func | TODO_verify_ssa,                     /* todo_flags_finish */
1716   0                                     /* letter */
1717 };