OSDN Git Service

* tree-gimple.c: Rename from tree-simple.c.
[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
51 /* This file builds the SSA form for a function as described in:
52    R. Cytron, J. Ferrante, B. Rosen, M. Wegman, and K. Zadeck. Efficiently
53    Computing Static Single Assignment Form and the Control Dependence
54    Graph. ACM Transactions on Programming Languages and Systems,
55    13(4):451-490, October 1991.  */
56
57
58 /* Structure to map a variable VAR to the set of blocks that contain
59    definitions for VAR.  */
60 struct def_blocks_d
61 {
62   /* The variable.  */
63   tree var;
64
65   /* Blocks that contain definitions of VAR.  Bit I will be set if the
66      Ith block contains a definition of VAR.  */
67   bitmap def_blocks;
68
69   /* Blocks where VAR is live-on-entry.  Similar semantics as
70      DEF_BLOCKS.  */
71   bitmap livein_blocks;
72 };
73
74 /* Each entry in DEF_BLOCKS contains an element of type STRUCT
75    DEF_BLOCKS_D, mapping a variable VAR to a bitmap describing all the
76    basic blocks where VAR is defined (assigned a new value).  It also
77    contains a bitmap of all the blocks where VAR is live-on-entry
78    (i.e., there is a use of VAR in block B without a preceding
79    definition in B).  The live-on-entry information is used when
80    computing PHI pruning heuristics.  */
81 static htab_t def_blocks;
82
83 /* Global data to attach to the main dominator walk structure.  */
84 struct mark_def_sites_global_data
85 {
86   /* This sbitmap contains the variables which are set before they
87      are used in a basic block.  We keep it as a global variable
88      solely to avoid the overhead of allocating and deallocating
89      the bitmap.  */
90   sbitmap kills;
91 };
92
93 struct rewrite_block_data
94 {
95   varray_type block_defs;
96 };
97
98
99 /* Local functions.  */
100 static void rewrite_finalize_block (struct dom_walk_data *, basic_block);
101 static void rewrite_initialize_block_local_data (struct dom_walk_data *,
102                                                  basic_block, bool);
103 static void rewrite_initialize_block (struct dom_walk_data *, basic_block);
104 static void rewrite_add_phi_arguments (struct dom_walk_data *, basic_block);
105 static void mark_def_sites (struct dom_walk_data *walk_data,
106                             basic_block bb, block_stmt_iterator);
107 static void mark_def_sites_initialize_block (struct dom_walk_data *walk_data,
108                                              basic_block bb);
109 static void compute_global_livein (bitmap, bitmap);
110 static void set_def_block (tree, basic_block);
111 static void set_livein_block (tree, basic_block);
112 static bool prepare_operand_for_rename (tree *op_p, size_t *uid_p);
113 static void insert_phi_nodes (bitmap *);
114 static void rewrite_stmt (struct dom_walk_data *, basic_block,
115                           block_stmt_iterator);
116 static inline void rewrite_operand (tree *);
117 static void insert_phi_nodes_for (tree, bitmap *, varray_type *);
118 static tree get_reaching_def (tree);
119 static hashval_t def_blocks_hash (const void *);
120 static int def_blocks_eq (const void *, const void *);
121 static void def_blocks_free (void *);
122 static int debug_def_blocks_r (void **, void *);
123 static inline struct def_blocks_d *get_def_blocks_for (tree);
124 static inline struct def_blocks_d *find_def_blocks_for (tree);
125 static void htab_statistics (FILE *, htab_t);
126
127 /* Compute global livein information given the set of blockx where
128    an object is locally live at the start of the block (LIVEIN)
129    and the set of blocks where the object is defined (DEF_BLOCKS).
130
131    Note: This routine augments the existing local livein information
132    to include global livein (i.e., it modifies the underlying bitmap
133    for LIVEIN).  */
134
135 static void
136 compute_global_livein (bitmap livein, bitmap def_blocks)
137 {
138   basic_block bb, *worklist, *tos;
139   int i;
140
141   tos = worklist
142     = (basic_block *) xmalloc (sizeof (basic_block) * (last_basic_block + 1));
143
144   EXECUTE_IF_SET_IN_BITMAP (livein, 0, i,
145     {
146         *tos++ = BASIC_BLOCK (i);
147     });
148
149   /* Iterate until the worklist is empty.  */
150   while (tos != worklist)
151     {
152       edge e;
153
154       /* Pull a block off the worklist.  */
155       bb = *--tos;
156
157       /* For each predecessor block.  */
158       for (e = bb->pred; e; e = e->pred_next)
159         {
160           basic_block pred = e->src;
161           int pred_index = pred->index;
162
163           /* None of this is necessary for the entry block.  */
164           if (pred != ENTRY_BLOCK_PTR
165               && ! bitmap_bit_p (livein, pred_index)
166               && ! bitmap_bit_p (def_blocks, pred_index))
167             {
168               *tos++ = pred;
169               bitmap_set_bit (livein, pred_index);
170             }
171         }
172     }
173
174   free (worklist);
175 }
176
177
178 /* Block initialization routine for mark_def_sites.  Clear the 
179    KILLS bitmap at the start of each block.  */
180
181 static void
182 mark_def_sites_initialize_block (struct dom_walk_data *walk_data,
183                                  basic_block bb ATTRIBUTE_UNUSED)
184 {
185   struct mark_def_sites_global_data *gd = walk_data->global_data;
186   sbitmap kills = gd->kills;
187
188   sbitmap_zero (kills);
189 }
190
191
192 /* Call back for walk_dominator_tree used to collect definition sites
193    for every variable in the function.  For every statement S in block
194    BB:
195
196    1- Variables defined by S in DEF_OPS(S) are marked in the bitmap
197       WALK_DATA->GLOBAL_DATA->KILLS.
198
199    2- If S uses a variable VAR and there is no preceding kill of VAR,
200       then it is marked in marked in the LIVEIN_BLOCKS bitmap
201       associated with VAR.
202
203    This information is used to determine which variables are live
204    across block boundaries to reduce the number of PHI nodes
205    we create.  */
206
207 static void
208 mark_def_sites (struct dom_walk_data *walk_data,
209                 basic_block bb,
210                 block_stmt_iterator bsi)
211 {
212   struct mark_def_sites_global_data *gd = walk_data->global_data;
213   sbitmap kills = gd->kills;
214   vdef_optype vdefs;
215   vuse_optype vuses;
216   def_optype defs;
217   use_optype uses;
218   size_t i, uid;
219   tree stmt;
220   stmt_ann_t ann;
221
222   /* Mark all the blocks that have definitions for each variable in the
223      VARS_TO_RENAME bitmap.  */
224   stmt = bsi_stmt (bsi);
225   get_stmt_operands (stmt);
226   ann = stmt_ann (stmt);
227
228   /* If a variable is used before being set, then the variable is live
229      across a block boundary, so mark it live-on-entry to BB.  */
230   uses = USE_OPS (ann);
231   for (i = 0; i < NUM_USES (uses); i++)
232     {
233       tree *use_p = USE_OP_PTR (uses, i);
234
235       if (prepare_operand_for_rename (use_p, &uid)
236           && !TEST_BIT (kills, uid))
237         set_livein_block (*use_p, bb);
238     }
239           
240   /* Similarly for virtual uses.  */
241   vuses = VUSE_OPS (ann);
242   for (i = 0; i < NUM_VUSES (vuses); i++)
243     {
244       tree *use_p = VUSE_OP_PTR (vuses, i);
245
246       if (prepare_operand_for_rename (use_p, &uid))
247         set_livein_block (*use_p, bb);
248     }
249
250   /* Note that virtual definitions are irrelevant for computing KILLS
251      because a VDEF does not constitute a killing definition of the
252      variable.  However, the operand of a virtual definitions is a use
253      of the variable, so it may cause the variable to be considered
254      live-on-entry.  */
255   vdefs = VDEF_OPS (ann);
256   for (i = 0; i < NUM_VDEFS (vdefs); i++)
257     {
258       size_t dummy;
259
260       if (prepare_operand_for_rename (VDEF_OP_PTR (vdefs, i), &uid)
261           && prepare_operand_for_rename (VDEF_RESULT_PTR (vdefs, i), &dummy))
262         {
263           VDEF_RESULT (vdefs, i) = VDEF_OP (vdefs, i);
264
265           set_livein_block (VDEF_OP (vdefs, i), bb);
266           set_def_block (VDEF_RESULT (vdefs, i), bb);
267         }
268     }
269
270   /* Now process the definition made by this statement.  Mark the
271      variables in KILLS.  */
272   defs = DEF_OPS (ann);
273   for (i = 0; i < NUM_DEFS (defs); i++)
274     {
275       tree *def_p = DEF_OP_PTR (defs, i);
276
277       if (prepare_operand_for_rename (def_p, &uid))
278         {
279           set_def_block (*def_p, bb);
280           SET_BIT (kills, uid);
281         }
282     }
283 }
284
285
286 /* Mark block BB as the definition site for variable VAR.  */
287
288 static void
289 set_def_block (tree var, basic_block bb)
290 {
291   struct def_blocks_d *db_p;
292   enum need_phi_state state = var_ann (var)->need_phi_state;
293
294   db_p = get_def_blocks_for (var);
295
296   /* Set the bit corresponding to the block where VAR is defined.  */
297   bitmap_set_bit (db_p->def_blocks, bb->index);
298
299   /* Keep track of whether or not we may need to insert phi nodes.
300
301      If we are in the UNKNOWN state, then this is the first definition
302      of VAR.  Additionally, we have not seen any uses of VAR yet, so
303      we do not need a phi node for this variable at this time (i.e.,
304      transition to NEED_PHI_STATE_NO).
305
306      If we are in any other state, then we either have multiple definitions
307      of this variable occurring in different blocks or we saw a use of the
308      variable which was not dominated by the block containing the
309      definition(s).  In this case we may need a PHI node, so enter
310      state NEED_PHI_STATE_MAYBE.  */
311   if (state == NEED_PHI_STATE_UNKNOWN)
312     var_ann (var)->need_phi_state = NEED_PHI_STATE_NO;
313   else
314     var_ann (var)->need_phi_state = NEED_PHI_STATE_MAYBE;
315 }
316
317
318 /* Mark block BB as having VAR live at the entry to BB.  */
319
320 static void
321 set_livein_block (tree var, basic_block bb)
322 {
323   struct def_blocks_d *db_p;
324   enum need_phi_state state = var_ann (var)->need_phi_state;
325
326   db_p = get_def_blocks_for (var);
327
328   /* Set the bit corresponding to the block where VAR is live in.  */
329   bitmap_set_bit (db_p->livein_blocks, bb->index);
330
331   /* Keep track of whether or not we may need to insert phi nodes.
332
333      If we reach here in NEED_PHI_STATE_NO, see if this use is dominated
334      by the single block containing the definition(s) of this variable.  If
335      it is, then we remain in NEED_PHI_STATE_NO, otherwise we transition to
336      NEED_PHI_STATE_MAYBE.  */
337   if (state == NEED_PHI_STATE_NO)
338     {
339       int def_block_index = bitmap_first_set_bit (db_p->def_blocks);
340
341       if (def_block_index == -1
342           || ! dominated_by_p (CDI_DOMINATORS, bb,
343                                BASIC_BLOCK (def_block_index)))
344         var_ann (var)->need_phi_state = NEED_PHI_STATE_MAYBE;
345     }
346   else
347     var_ann (var)->need_phi_state = NEED_PHI_STATE_MAYBE;
348 }
349
350
351 /* If the operand pointed by OP_P needs to be renamed, strip away SSA_NAME
352    wrappers (if needed) and return true.  The unique ID for the operand's
353    variable will be stored in *UID_P.  */
354
355 static bool
356 prepare_operand_for_rename (tree *op_p, size_t *uid_p)
357 {
358   tree var = (TREE_CODE (*op_p) != SSA_NAME) ? *op_p : SSA_NAME_VAR (*op_p);
359   *uid_p = var_ann (var)->uid;
360
361   /* Ignore variables that don't need to be renamed.  */
362   if (vars_to_rename && !bitmap_bit_p (vars_to_rename, *uid_p))
363     return false;
364
365   /* The variable needs to be renamed.  If it already had an
366      SSA_NAME, strip it off.  This way, the SSA rename pass
367      doesn't need to deal with existing SSA names.  */
368   if (TREE_CODE (*op_p) == SSA_NAME)
369     {
370       if (default_def (SSA_NAME_VAR (*op_p)) != *op_p)
371         release_ssa_name (*op_p);
372       *op_p = var;
373     }
374
375   return true;
376 }
377
378
379 /* Helper for insert_phi_nodes.  If VAR needs PHI nodes, insert them
380    at the dominance frontier (DFS) of blocks defining VAR.  */
381
382 static inline
383 void insert_phi_nodes_1 (tree var, bitmap *dfs, varray_type *work_stack)
384 {
385   var_ann_t ann = var_ann (var);
386   if (ann->need_phi_state != NEED_PHI_STATE_NO)
387     insert_phi_nodes_for (var, dfs, work_stack);
388 }
389
390
391 /* Insert PHI nodes at the dominance frontier of blocks with variable
392    definitions.  DFS contains the dominance frontier information for
393    the flowgraph.  PHI nodes will only be inserted at the dominance
394    frontier of definition blocks for variables whose NEED_PHI_STATE
395    annotation is marked as ``maybe'' or ``unknown'' (computed by
396    mark_def_sites).  */
397
398 static void
399 insert_phi_nodes (bitmap *dfs)
400 {
401   size_t i;
402   varray_type work_stack;
403
404   timevar_push (TV_TREE_INSERT_PHI_NODES);
405
406   /* Array WORK_STACK is a stack of CFG blocks.  Each block that contains
407      an assignment or PHI node will be pushed to this stack.  */
408   VARRAY_BB_INIT (work_stack, last_basic_block, "work_stack");
409
410   /* Iterate over all variables in VARS_TO_RENAME.  For each variable, add
411      to the work list all the blocks that have a definition for the
412      variable.  PHI nodes will be added to the dominance frontier blocks of
413      each definition block.  */
414   if (vars_to_rename)
415     EXECUTE_IF_SET_IN_BITMAP (vars_to_rename, 0, i,
416         insert_phi_nodes_1 (referenced_var (i), dfs, &work_stack));
417   else
418     for (i = 0; i < num_referenced_vars; i++)
419       insert_phi_nodes_1 (referenced_var (i), dfs, &work_stack);
420
421   timevar_pop (TV_TREE_INSERT_PHI_NODES);
422 }
423
424
425 /* Perform a depth-first traversal of the dominator tree looking for
426    variables to rename.  BB is the block where to start searching.
427    Renaming is a five step process:
428
429    1- Every definition made by PHI nodes at the start of the blocks is
430       registered as the current definition for the corresponding variable.
431
432    2- Every statement in BB is rewritten.  USE and VUSE operands are
433       rewritten with their corresponding reaching definition.  DEF and
434       VDEF targets are registered as new definitions.
435       
436    3- All the PHI nodes in successor blocks of BB are visited.  The
437       argument corresponding to BB is replaced with its current reaching
438       definition.
439
440    4- Recursively rewrite every dominator child block of BB.
441
442    5- Restore (in reverse order) the current reaching definition for every
443       new definition introduced in this block.  This is done so that when
444       we return from the recursive call, all the current reaching
445       definitions are restored to the names that were valid in the
446       dominator parent of BB.  */
447
448 /* Initialize the local stacks.
449      
450    BLOCK_DEFS is used to save all the existing reaching definitions for
451    the new SSA names introduced in this block.  Before registering a
452    new definition for a variable, the existing reaching definition is
453    pushed into this stack so that we can restore it in Step 5.  */
454
455 static void
456 rewrite_initialize_block_local_data (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
457                                      basic_block bb ATTRIBUTE_UNUSED,
458                                      bool recycled ATTRIBUTE_UNUSED)
459 {
460 #ifdef ENABLE_CHECKING
461   struct rewrite_block_data *bd
462     = (struct rewrite_block_data *)VARRAY_TOP_GENERIC_PTR (walk_data->block_data_stack);
463                                                                                 
464   /* We get cleared memory from the allocator, so if the memory is
465      not cleared, then we are re-using a previously allocated entry.  In
466      that case, we can also re-use the underlying virtal arrays.  Just
467      make sure we clear them before using them!  */
468   if (recycled && bd->block_defs && VARRAY_ACTIVE_SIZE (bd->block_defs) > 0)
469     abort ();
470 #endif
471 }
472
473
474 /* SSA Rewriting Step 1.  Initialization, create a block local stack
475    of reaching definitions for new SSA names produced in this block
476    (BLOCK_DEFS).  Register new definitions for every PHI node in the
477    block.  */
478
479 static void
480 rewrite_initialize_block (struct dom_walk_data *walk_data, basic_block bb)
481 {
482   tree phi;
483   struct rewrite_block_data *bd
484     = (struct rewrite_block_data *)VARRAY_TOP_GENERIC_PTR (walk_data->block_data_stack);
485
486   if (dump_file && (dump_flags & TDF_DETAILS))
487     fprintf (dump_file, "\n\nRenaming block #%d\n\n", bb->index);
488
489   /* Step 1.  Register new definitions for every PHI node in the block.
490      Conceptually, all the PHI nodes are executed in parallel and each PHI
491      node introduces a new version for the associated variable.  */
492   for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
493     {
494       tree result = PHI_RESULT (phi);
495
496       register_new_def (result, &bd->block_defs);
497     }
498 }
499
500
501 /* SSA Rewriting Step 3.  Visit all the successor blocks of BB looking for
502    PHI nodes.  For every PHI node found, add a new argument containing the
503    current reaching definition for the variable and the edge through which
504    that definition is reaching the PHI node.   */
505
506 static void
507 rewrite_add_phi_arguments (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
508                            basic_block bb)
509 {
510   edge e;
511
512   for (e = bb->succ; e; e = e->succ_next)
513     {
514       tree phi;
515
516       for (phi = phi_nodes (e->dest); phi; phi = TREE_CHAIN (phi))
517         {
518           tree currdef;
519
520           /* If this PHI node has already been rewritten, then there is
521              nothing to do for this PHI or any following PHIs since we
522              always add new PHI nodes at the start of the PHI chain.  */
523           if (PHI_REWRITTEN (phi))
524             break;
525
526           currdef = get_reaching_def (SSA_NAME_VAR (PHI_RESULT (phi)));
527           add_phi_arg (&phi, currdef, e);
528         }
529     }
530 }
531
532 /* SSA Rewriting Step 5.  Restore the current reaching definition for each
533    variable referenced in the block (in reverse order).  */
534
535 static void
536 rewrite_finalize_block (struct dom_walk_data *walk_data,
537                         basic_block bb ATTRIBUTE_UNUSED)
538 {
539   struct rewrite_block_data *bd
540     = (struct rewrite_block_data *)VARRAY_TOP_GENERIC_PTR (walk_data->block_data_stack);
541
542   /* Step 5.  Restore the current reaching definition for each variable
543      referenced in the block (in reverse order).  */
544   while (bd->block_defs && VARRAY_ACTIVE_SIZE (bd->block_defs) > 0)
545     {
546       tree tmp = VARRAY_TOP_TREE (bd->block_defs);
547       tree saved_def, var;
548
549       VARRAY_POP (bd->block_defs);
550       if (TREE_CODE (tmp) == SSA_NAME)
551         {
552           saved_def = tmp;
553           var = SSA_NAME_VAR (saved_def);
554         }
555       else
556         {
557           saved_def = NULL;
558           var = tmp;
559         }
560
561       var_ann (var)->current_def = saved_def;
562     }
563 }
564
565
566 /* Dump SSA information to FILE.  */
567
568 void
569 dump_tree_ssa (FILE *file)
570 {
571   basic_block bb;
572   const char *funcname
573     = (*lang_hooks.decl_printable_name) (current_function_decl, 2);
574
575   fprintf (file, "SSA information for %s\n\n", funcname);
576
577   FOR_EACH_BB (bb)
578     {
579       dump_bb (bb, file, 0);
580       fputs ("    ", file);
581       print_generic_stmt (file, phi_nodes (bb), dump_flags);
582       fputs ("\n\n", file);
583     }
584 }
585
586
587 /* Dump SSA information to stderr.  */
588
589 void
590 debug_tree_ssa (void)
591 {
592   dump_tree_ssa (stderr);
593 }
594
595
596 /* Dump SSA statistics on FILE.  */
597
598 void
599 dump_tree_ssa_stats (FILE *file)
600 {
601   fprintf (file, "\nHash table statistics:\n");
602
603   fprintf (file, "    def_blocks: ");
604   htab_statistics (file, def_blocks);
605
606   fprintf (file, "\n");
607 }
608
609
610 /* Dump SSA statistics on stderr.  */
611
612 void
613 debug_tree_ssa_stats (void)
614 {
615   dump_tree_ssa_stats (stderr);
616 }
617
618
619 /* Dump statistics for the hash table HTAB.  */
620
621 static void
622 htab_statistics (FILE *file, htab_t htab)
623 {
624   fprintf (file, "size %ld, %ld elements, %f collision/search ratio\n",
625            (long) htab_size (htab),
626            (long) htab_elements (htab),
627            htab_collisions (htab));
628 }
629
630
631 /* Insert PHI nodes for variable VAR using the dominance frontier
632    information given in DFS.  */
633
634 static void
635 insert_phi_nodes_for (tree var, bitmap *dfs, varray_type *work_stack)
636 {
637   struct def_blocks_d *def_map;
638   bitmap phi_insertion_points;
639   int bb_index;
640
641   def_map = find_def_blocks_for (var);
642   if (def_map == NULL)
643     return;
644
645   phi_insertion_points = BITMAP_XMALLOC ();
646
647   EXECUTE_IF_SET_IN_BITMAP (def_map->def_blocks, 0, bb_index,
648     {
649       VARRAY_PUSH_BB (*work_stack, BASIC_BLOCK (bb_index));
650     });
651
652   /* Pop a block off the worklist, add every block that appears in
653      the original block's dfs that we have not already processed to
654      the worklist.  Iterate until the worklist is empty.   Blocks
655      which are added to the worklist are potential sites for
656      PHI nodes. 
657
658      The iteration step could be done during PHI insertion just as
659      easily.  We do it here for historical reasons -- we used to have
660      a heuristic which used the potential PHI insertion points to
661      determine if fully pruned or semi pruned SSA form was appropriate.
662
663      We now always use fully pruned SSA form.  */
664   while (VARRAY_ACTIVE_SIZE (*work_stack) > 0)
665     {
666       basic_block bb = VARRAY_TOP_BB (*work_stack);
667       int bb_index = bb->index;
668       int dfs_index;
669
670       VARRAY_POP (*work_stack);
671       
672       EXECUTE_IF_AND_COMPL_IN_BITMAP (dfs[bb_index],
673                                       phi_insertion_points,
674                                       0, dfs_index,
675         {
676           basic_block bb = BASIC_BLOCK (dfs_index);
677
678           VARRAY_PUSH_BB (*work_stack, bb);
679           bitmap_set_bit (phi_insertion_points, dfs_index);
680         });
681     }
682
683   /* Now compute global livein for this variable.  Note this modifies
684      def_map->livein_blocks.  */
685   compute_global_livein (def_map->livein_blocks, def_map->def_blocks);
686
687   /* And insert the PHI nodes.  */
688   EXECUTE_IF_AND_IN_BITMAP (phi_insertion_points, def_map->livein_blocks,
689                             0, bb_index,
690     {
691       create_phi_node (var, BASIC_BLOCK (bb_index));
692     });
693
694   BITMAP_XFREE (phi_insertion_points);
695 }
696
697 /* SSA Rewriting Step 2.  Rewrite every variable used in each statement in
698    the block with its immediate reaching definitions.  Update the current
699    definition of a variable when a new real or virtual definition is found.  */
700
701 static void
702 rewrite_stmt (struct dom_walk_data *walk_data,
703               basic_block bb ATTRIBUTE_UNUSED,
704               block_stmt_iterator si)
705 {
706   size_t i;
707   stmt_ann_t ann;
708   tree stmt;
709   vuse_optype vuses;
710   vdef_optype vdefs;
711   def_optype defs;
712   use_optype uses;
713   struct rewrite_block_data *bd;
714
715   bd = VARRAY_TOP_GENERIC_PTR (walk_data->block_data_stack);
716
717   stmt = bsi_stmt (si);
718   ann = stmt_ann (stmt);
719
720   if (dump_file && (dump_flags & TDF_DETAILS))
721     {
722       fprintf (dump_file, "Renaming statement ");
723       print_generic_stmt (dump_file, stmt, TDF_SLIM);
724       fprintf (dump_file, "\n");
725     }
726
727 #if defined ENABLE_CHECKING
728   /* We have just scanned the code for operands.  No statement should
729      be modified.  */
730   if (ann->modified)
731     abort ();
732 #endif
733
734   defs = DEF_OPS (ann);
735   uses = USE_OPS (ann);
736   vuses = VUSE_OPS (ann);
737   vdefs = VDEF_OPS (ann);
738
739   /* Step 1.  Rewrite USES and VUSES in the statement.  */
740   for (i = 0; i < NUM_USES (uses); i++)
741     rewrite_operand (USE_OP_PTR (uses, i));
742
743   /* Rewrite virtual uses in the statement.  */
744   for (i = 0; i < NUM_VUSES (vuses); i++)
745     rewrite_operand (VUSE_OP_PTR (vuses, i));
746
747   /* Step 2.  Register the statement's DEF and VDEF operands.  */
748   for (i = 0; i < NUM_DEFS (defs); i++)
749     {
750       tree *def_p = DEF_OP_PTR (defs, i);
751
752       if (TREE_CODE (*def_p) != SSA_NAME)
753         *def_p = make_ssa_name (*def_p, stmt);
754
755       /* FIXME: We shouldn't be registering new defs if the variable
756          doesn't need to be renamed.  */
757       register_new_def (*def_p, &bd->block_defs);
758     }
759
760   /* Register new virtual definitions made by the statement.  */
761   for (i = 0; i < NUM_VDEFS (vdefs); i++)
762     {
763       rewrite_operand (VDEF_OP_PTR (vdefs, i));
764
765       if (TREE_CODE (VDEF_RESULT (vdefs, i)) != SSA_NAME)
766         *VDEF_RESULT_PTR (vdefs, i)
767           = make_ssa_name (VDEF_RESULT (vdefs, i), stmt);
768
769       /* FIXME: We shouldn't be registering new defs if the variable
770          doesn't need to be renamed.  */
771       register_new_def (VDEF_RESULT (vdefs, i), &bd->block_defs);
772     }
773 }
774
775
776 /* Replace the operand pointed by OP_P with its immediate reaching
777    definition.  */
778
779 static inline void
780 rewrite_operand (tree *op_p)
781 {
782   if (TREE_CODE (*op_p) != SSA_NAME)
783     *op_p = get_reaching_def (*op_p);
784 }
785
786
787 /* Register DEF (an SSA_NAME) to be a new definition for its underlying
788    variable (SSA_NAME_VAR (DEF)) and push VAR's current reaching definition
789    into the stack pointed by BLOCK_DEFS_P.  */
790
791 void
792 register_new_def (tree def, varray_type *block_defs_p)
793 {
794   tree var = SSA_NAME_VAR (def);
795   tree currdef;
796    
797   /* If this variable is set in a single basic block and all uses are
798      dominated by the set(s) in that single basic block, then there is
799      no reason to record anything for this variable in the block local
800      definition stacks.  Doing so just wastes time and memory.
801
802      This is the same test to prune the set of variables which may
803      need PHI nodes.  So we just use that information since it's already
804      computed and available for us to use.  */
805   if (var_ann (var)->need_phi_state == NEED_PHI_STATE_NO)
806     {
807       var_ann (var)->current_def = def;
808       return;
809     }
810
811   currdef = var_ann (var)->current_def;
812   if (! *block_defs_p)
813     VARRAY_TREE_INIT (*block_defs_p, 20, "block_defs");
814
815   /* Push the current reaching definition into *BLOCK_DEFS_P.  This stack is
816      later used by the dominator tree callbacks to restore the reaching
817      definitions for all the variables defined in the block after a recursive
818      visit to all its immediately dominated blocks.  If there is no current
819      reaching definition, then just record the underlying _DECL node.  */
820   VARRAY_PUSH_TREE (*block_defs_p, currdef ? currdef : var);
821
822   /* Set the current reaching definition for VAR to be DEF.  */
823   var_ann (var)->current_def = def;
824 }
825
826
827 /* Return the current definition for variable VAR.  If none is found,
828    create a new SSA name to act as the zeroth definition for VAR.  If VAR
829    is call clobbered and there exists a more recent definition of
830    GLOBAL_VAR, return the definition for GLOBAL_VAR.  This means that VAR
831    has been clobbered by a function call since its last assignment.  */
832
833 static tree
834 get_reaching_def (tree var)
835 {
836   tree default_d, currdef_var;
837   
838   /* Lookup the current reaching definition for VAR.  */
839   default_d = NULL_TREE;
840   currdef_var = var_ann (var)->current_def;
841
842   /* If there is no reaching definition for VAR, create and register a
843      default definition for it (if needed).  */
844   if (currdef_var == NULL_TREE)
845     {
846       default_d = default_def (var);
847       if (default_d == NULL_TREE)
848         {
849           default_d = make_ssa_name (var, build_empty_stmt ());
850           set_default_def (var, default_d);
851         }
852       var_ann (var)->current_def = default_d;
853     }
854
855   /* Return the current reaching definition for VAR, or the default
856      definition, if we had to create one.  */
857   return (currdef_var) ? currdef_var : default_d;
858 }
859
860
861 /* Hashing and equality functions for DEF_BLOCKS.  */
862
863 static hashval_t
864 def_blocks_hash (const void *p)
865 {
866   return htab_hash_pointer
867         ((const void *)((const struct def_blocks_d *)p)->var);
868 }
869
870 static int
871 def_blocks_eq (const void *p1, const void *p2)
872 {
873   return ((const struct def_blocks_d *)p1)->var
874          == ((const struct def_blocks_d *)p2)->var;
875 }
876
877 /* Free memory allocated by one entry in DEF_BLOCKS.  */
878
879 static void
880 def_blocks_free (void *p)
881 {
882   struct def_blocks_d *entry = p;
883   BITMAP_XFREE (entry->def_blocks);
884   BITMAP_XFREE (entry->livein_blocks);
885   free (entry);
886 }
887
888
889 /* Dump the DEF_BLOCKS hash table on stderr.  */
890
891 void
892 debug_def_blocks (void)
893 {
894   htab_traverse (def_blocks, debug_def_blocks_r, NULL);
895 }
896
897 /* Callback for htab_traverse to dump the DEF_BLOCKS hash table.  */
898
899 static int
900 debug_def_blocks_r (void **slot, void *data ATTRIBUTE_UNUSED)
901 {
902   unsigned long i;
903   struct def_blocks_d *db_p = (struct def_blocks_d *) *slot;
904   
905   fprintf (stderr, "VAR: ");
906   print_generic_expr (stderr, db_p->var, dump_flags);
907   fprintf (stderr, ", DEF_BLOCKS: { ");
908   EXECUTE_IF_SET_IN_BITMAP (db_p->def_blocks, 0, i,
909                             fprintf (stderr, "%ld ", i));
910   fprintf (stderr, "}");
911   fprintf (stderr, ", LIVEIN_BLOCKS: { ");
912   EXECUTE_IF_SET_IN_BITMAP (db_p->livein_blocks, 0, i,
913                             fprintf (stderr, "%ld ", i));
914   fprintf (stderr, "}\n");
915
916   return 1;
917 }
918
919
920 /* Return the set of blocks where variable VAR is defined and the blocks
921    where VAR is live on entry (livein).  Return NULL, if no entry is
922    found in DEF_BLOCKS.  */
923
924 static inline struct def_blocks_d *
925 find_def_blocks_for (tree var)
926 {
927   struct def_blocks_d dm;
928   dm.var = var;
929   return (struct def_blocks_d *) htab_find (def_blocks, &dm);
930 }
931
932
933 /* Return the set of blocks where variable VAR is defined and the blocks
934    where VAR is live on entry (livein).  If no entry is found in
935    DEF_BLOCKS, a new one is created and returned.  */
936
937 static inline struct def_blocks_d *
938 get_def_blocks_for (tree var)
939 {
940   struct def_blocks_d db, *db_p;
941   void **slot;
942
943   db.var = var;
944   slot = htab_find_slot (def_blocks, (void *) &db, INSERT);
945   if (*slot == NULL)
946     {
947       db_p = xmalloc (sizeof (*db_p));
948       db_p->var = var;
949       db_p->def_blocks = BITMAP_XMALLOC ();
950       db_p->livein_blocks = BITMAP_XMALLOC ();
951       *slot = (void *) db_p;
952     }
953   else
954     db_p = (struct def_blocks_d *) *slot;
955
956   return db_p;
957 }
958
959 /* If a variable V in VARS_TO_RENAME is a pointer, the renaming
960    process will cause us to lose the name memory tags that may have
961    been associated with the various SSA_NAMEs of V.  This means that
962    the variables aliased to those name tags also need to be renamed
963    again.
964
965    FIXME 1- We should either have a better scheme for renaming
966             pointers that doesn't lose name tags or re-run alias
967             analysis to recover points-to information.
968
969          2- Currently we just invalidate *all* the name tags.  This
970             should be more selective.  */
971
972 static void
973 invalidate_name_tags (bitmap vars_to_rename)
974 {
975   size_t i;
976   bool rename_name_tags_p;
977
978   rename_name_tags_p = false;
979   EXECUTE_IF_SET_IN_BITMAP (vars_to_rename, 0, i,
980       if (POINTER_TYPE_P (TREE_TYPE (referenced_var (i))))
981         {
982           rename_name_tags_p = true;
983           break;
984         });
985
986   if (rename_name_tags_p)
987     for (i = 0; i < num_referenced_vars; i++)
988       {
989         var_ann_t ann = var_ann (referenced_var (i));
990
991         if (ann->mem_tag_kind == NAME_TAG)
992           {
993             size_t j;
994             varray_type may_aliases = ann->may_aliases;
995
996             bitmap_set_bit (vars_to_rename, ann->uid);
997             if (ann->may_aliases)
998               for (j = 0; j < VARRAY_ACTIVE_SIZE (may_aliases); j++)
999                 {
1000                   tree var = VARRAY_TREE (may_aliases, j);
1001                   bitmap_set_bit (vars_to_rename, var_ann (var)->uid);
1002                 }
1003           }
1004       }
1005 }
1006
1007
1008 /* Main entry point into the SSA builder.  The renaming process
1009    proceeds in five main phases:
1010
1011    1- If VARS_TO_RENAME has any entries, any existing PHI nodes for
1012       those variables are removed from the flow graph so that they can
1013       be computed again.
1014
1015    2- Compute dominance frontier and immediate dominators, needed to
1016       insert PHI nodes and rename the function in dominator tree
1017       order.
1018
1019    3- Find and mark all the blocks that define variables
1020       (mark_def_sites).
1021
1022    4- Insert PHI nodes at dominance frontiers (insert_phi_nodes).
1023
1024    5- Rename all the blocks (rewrite_initialize_block,
1025       rewrite_add_phi_arguments) and statements in the program
1026       (rewrite_stmt).
1027
1028    Steps 3 and 5 are done using the dominator tree walker
1029    (walk_dominator_tree).  */
1030
1031 void
1032 rewrite_into_ssa (void)
1033 {
1034   bitmap *dfs;
1035   basic_block bb;
1036   struct dom_walk_data walk_data;
1037   struct mark_def_sites_global_data mark_def_sites_global_data;
1038   unsigned int i;
1039   
1040   timevar_push (TV_TREE_SSA_OTHER);
1041
1042   /* Initialize the array of variables to rename.  */
1043   if (vars_to_rename != NULL)
1044     {
1045       invalidate_name_tags (vars_to_rename);
1046
1047       /* Now remove all the existing PHI nodes (if any) for the variables
1048          that we are about to rename into SSA.  */
1049       remove_all_phi_nodes_for (vars_to_rename);
1050     }
1051
1052   /* Allocate memory for the DEF_BLOCKS hash table.  */
1053   def_blocks = htab_create (VARRAY_ACTIVE_SIZE (referenced_vars),
1054                             def_blocks_hash, def_blocks_eq, def_blocks_free);
1055
1056   /* Initialize dominance frontier and immediate dominator bitmaps. 
1057      Also count the number of predecessors for each block.  Doing so
1058      can save significant time during PHI insertion for large graphs.  */
1059   dfs = (bitmap *) xmalloc (last_basic_block * sizeof (bitmap *));
1060   FOR_EACH_BB (bb)
1061     {
1062       edge e;
1063       int count = 0;
1064
1065       for (e = bb->pred; e; e = e->pred_next)
1066         count++;
1067
1068       bb_ann (bb)->num_preds = count;
1069       dfs[bb->index] = BITMAP_XMALLOC ();
1070     }
1071
1072   for (i = 0; i < num_referenced_vars; i++)
1073     var_ann (referenced_var (i))->current_def = NULL;
1074
1075   /* Ensure that the dominance information is OK.  */
1076   calculate_dominance_info (CDI_DOMINATORS);
1077
1078   /* Compute dominance frontiers.  */
1079   compute_dominance_frontiers (dfs);
1080
1081   /* Setup callbacks for the generic dominator tree walker to find and
1082      mark definition sites.  */
1083   walk_data.walk_stmts_backward = false;
1084   walk_data.dom_direction = CDI_DOMINATORS;
1085   walk_data.initialize_block_local_data = NULL;
1086   walk_data.before_dom_children_before_stmts = mark_def_sites_initialize_block;
1087   walk_data.before_dom_children_walk_stmts = mark_def_sites;
1088   walk_data.before_dom_children_after_stmts = NULL; 
1089   walk_data.after_dom_children_before_stmts =  NULL;
1090   walk_data.after_dom_children_walk_stmts =  NULL;
1091   walk_data.after_dom_children_after_stmts =  NULL;
1092
1093   /* Notice that this bitmap is indexed using variable UIDs, so it must be
1094      large enough to accommodate all the variables referenced in the
1095      function, not just the ones we are renaming.  */
1096   mark_def_sites_global_data.kills = sbitmap_alloc (num_referenced_vars);
1097   walk_data.global_data = &mark_def_sites_global_data;
1098
1099   /* We do not have any local data.  */
1100   walk_data.block_local_data_size = 0;
1101
1102   /* Initialize the dominator walker.  */
1103   init_walk_dominator_tree (&walk_data);
1104
1105   /* Recursively walk the dominator tree.  */
1106   walk_dominator_tree (&walk_data, ENTRY_BLOCK_PTR);
1107
1108   /* Finalize the dominator walker.  */
1109   fini_walk_dominator_tree (&walk_data);
1110
1111   /* We no longer need this bitmap, clear and free it.  */
1112   sbitmap_free (mark_def_sites_global_data.kills);
1113
1114   /* Insert PHI nodes at dominance frontiers of definition blocks.  */
1115   insert_phi_nodes (dfs);
1116
1117   /* Rewrite all the basic blocks in the program.  */
1118   timevar_push (TV_TREE_SSA_REWRITE_BLOCKS);
1119
1120   /* Setup callbacks for the generic dominator tree walker.  */
1121   walk_data.walk_stmts_backward = false;
1122   walk_data.dom_direction = CDI_DOMINATORS;
1123   walk_data.initialize_block_local_data = rewrite_initialize_block_local_data;
1124   walk_data.before_dom_children_before_stmts = rewrite_initialize_block;
1125   walk_data.before_dom_children_walk_stmts = rewrite_stmt;
1126   walk_data.before_dom_children_after_stmts = rewrite_add_phi_arguments; 
1127   walk_data.after_dom_children_before_stmts =  NULL;
1128   walk_data.after_dom_children_walk_stmts =  NULL;
1129   walk_data.after_dom_children_after_stmts =  rewrite_finalize_block;
1130   walk_data.global_data = NULL;
1131   walk_data.block_local_data_size = sizeof (struct rewrite_block_data);
1132
1133   /* Initialize the dominator walker.  */
1134   init_walk_dominator_tree (&walk_data);
1135
1136   /* Recursively walk the dominator tree rewriting each statement in
1137      each basic block.  */
1138   walk_dominator_tree (&walk_data, ENTRY_BLOCK_PTR);
1139
1140   /* Finalize the dominator walker.  */
1141   fini_walk_dominator_tree (&walk_data);
1142
1143   timevar_pop (TV_TREE_SSA_REWRITE_BLOCKS);
1144
1145   /* Debugging dumps.  */
1146   if (dump_file && (dump_flags & TDF_STATS))
1147     {
1148       dump_dfa_stats (dump_file);
1149       dump_tree_ssa_stats (dump_file);
1150     }
1151
1152   /* Free allocated memory.  */
1153   FOR_EACH_BB (bb)
1154     BITMAP_XFREE (dfs[bb->index]);
1155   free (dfs);
1156
1157   htab_delete (def_blocks);
1158
1159   timevar_pop (TV_TREE_SSA_OTHER);
1160 }
1161
1162 struct tree_opt_pass pass_build_ssa = 
1163 {
1164   "ssa",                                /* name */
1165   NULL,                                 /* gate */
1166   rewrite_into_ssa,                     /* execute */
1167   NULL,                                 /* sub */
1168   NULL,                                 /* next */
1169   0,                                    /* static_pass_number */
1170   0,                                    /* tv_id */
1171   PROP_cfg | PROP_referenced_vars,      /* properties_required */
1172   PROP_ssa,                             /* properties_provided */
1173   0,                                    /* properties_destroyed */
1174   0,                                    /* todo_flags_start */
1175   TODO_dump_func | TODO_verify_ssa      /* todo_flags_finish */
1176 };