OSDN Git Service

* config/rs6000/rs6000.md (movsi): Constify 'name'.
[pf3gnuchains/gcc-fork.git] / gcc / ssa.c
1 /* Static Single Assignment conversion routines for the GNU compiler.
2    Copyright (C) 2000 Free Software Foundation, Inc.
3
4 This file is part of GNU CC.
5
6 GNU CC is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
9 later version.
10
11 GNU CC is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING.  If not, write to the Free
18 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
19 02111-1307, USA.  */
20
21 /* References:
22
23    Building an Optimizing Compiler
24    Robert Morgan
25    Butterworth-Heinemann, 1998
26
27    Static Single Assignment Construction
28    Preston Briggs, Tim Harvey, Taylor Simpson
29    Technical Report, Rice University, 1995
30    ftp://ftp.cs.rice.edu/public/preston/optimizer/SSA.ps.gz
31 */
32
33 #include "config.h"
34 #include "system.h"
35
36 #include "rtl.h"
37 #include "regs.h"
38 #include "hard-reg-set.h"
39 #include "flags.h"
40 #include "function.h"
41 #include "real.h"
42 #include "insn-config.h"
43 #include "recog.h"
44 #include "basic-block.h"
45 #include "output.h"
46 #include "partition.h"
47
48
49 /* TODO: 
50
51    Handle subregs better, maybe.  For now, if a reg that's set in a
52    subreg expression is duplicated going into SSA form, an extra copy
53    is inserted first that copies the entire reg into the duplicate, so
54    that the other bits are preserved.  This isn't strictly SSA, since
55    at least part of the reg is assigned in more than one place (though
56    they are adjacent).
57
58    ??? What to do about strict_low_part.  Probably I'll have to split
59    them out of their current instructions first thing.
60
61    Actually the best solution may be to have a kind of "mid-level rtl"
62    in which the RTL encodes exactly what we want, without exposing a
63    lot of niggling processor details.  At some later point we lower
64    the representation, calling back into optabs to finish any necessary
65    expansion.  */
66
67
68 /* If conservative_reg_partition is non-zero, use a conservative
69    register partitioning algorithm (which leaves more regs after
70    emerging from SSA) instead of the coalescing one.  This is being
71    left in for a limited time only, as a debugging tool until the
72    coalescing algorithm is validated.  */
73 static int conservative_reg_partition;
74
75 /* This flag is set when the CFG is in SSA form.  */
76 int in_ssa_form = 0;
77
78 /* Element I is the single instruction that sets register I+PSEUDO.  */
79 varray_type ssa_definition;
80
81 /* Element I is an INSN_LIST of instructions that use register I+PSEUDO.  */
82 varray_type ssa_uses;
83
84 /* Element I-PSEUDO is the normal register that originated the ssa
85    register in question.  */
86 varray_type ssa_rename_from;
87
88 /* The running target ssa register for a given normal register.  */
89 static rtx *ssa_rename_to;
90
91 /* The number of registers that were live on entry to the SSA routines.  */
92 static unsigned int ssa_max_reg_num;
93
94 /* Local function prototypes.  */
95
96 static inline rtx * phi_alternative
97   PARAMS ((rtx, int));
98
99 static int remove_phi_alternative
100   PARAMS ((rtx, int));
101 static void simplify_to_immediate_dominators 
102   PARAMS ((int *idom, sbitmap *dominators));
103 static void compute_dominance_frontiers_1
104   PARAMS ((sbitmap *frontiers, int *idom, int bb, sbitmap done));
105 static void compute_dominance_frontiers
106   PARAMS ((sbitmap *frontiers, int *idom));
107 static void find_evaluations_1
108   PARAMS ((rtx dest, rtx set, void *data));
109 static void find_evaluations
110   PARAMS ((sbitmap *evals, int nregs));
111 static void compute_iterated_dominance_frontiers
112   PARAMS ((sbitmap *idfs, sbitmap *frontiers, sbitmap *evals, int nregs));
113 static void insert_phi_node
114   PARAMS ((int regno, int b));
115 static void insert_phi_nodes
116   PARAMS ((sbitmap *idfs, sbitmap *evals, int nregs));
117 static int rename_insn_1 
118   PARAMS ((rtx *ptr, void *data));
119 static void rename_block 
120   PARAMS ((int b, int *idom));
121 static void rename_registers 
122   PARAMS ((int nregs, int *idom));
123
124 static inline int ephi_add_node
125   PARAMS ((rtx reg, rtx *nodes, int *n_nodes));
126 static int * ephi_forward
127   PARAMS ((int t, sbitmap visited, sbitmap *succ, int *tstack));
128 static void ephi_backward
129   PARAMS ((int t, sbitmap visited, sbitmap *pred, rtx *nodes));
130 static void ephi_create
131   PARAMS ((int t, sbitmap visited, sbitmap *pred, sbitmap *succ, rtx *nodes));
132 static void eliminate_phi
133   PARAMS ((edge e, partition reg_partition));
134 static int make_regs_equivalent_over_bad_edges 
135   PARAMS ((int bb, partition reg_partition));
136
137 /* These are used only in the conservative register partitioning
138    algorithms.  */
139 static int make_equivalent_phi_alternatives_equivalent 
140   PARAMS ((int bb, partition reg_partition));
141 static partition compute_conservative_reg_partition 
142   PARAMS ((void));
143 static int rename_equivalent_regs_in_insn 
144   PARAMS ((rtx *ptr, void *data));
145
146 /* These are used in the register coalescing algorithm.  */
147 static int coalesce_if_unconflicting
148   PARAMS ((partition p, conflict_graph conflicts, int reg1, int reg2));
149 static int coalesce_regs_in_copies
150   PARAMS ((basic_block bb, partition p, conflict_graph conflicts));
151 static int coalesce_reg_in_phi
152   PARAMS ((rtx, int dest_regno, int src_regno, void *data));
153 static int coalesce_regs_in_successor_phi_nodes
154   PARAMS ((basic_block bb, partition p, conflict_graph conflicts));
155 static partition compute_coalesced_reg_partition
156   PARAMS ((void));
157 static int mark_reg_in_phi 
158   PARAMS ((rtx *ptr, void *data));
159 static void mark_phi_and_copy_regs
160   PARAMS ((regset phi_set));
161
162 static int rename_equivalent_regs_in_insn 
163   PARAMS ((rtx *ptr, void *data));
164 static void rename_equivalent_regs 
165   PARAMS ((partition reg_partition));
166
167
168 /* Given the SET of a PHI node, return the address of the alternative
169    for predecessor block C.  */
170
171 static inline rtx *
172 phi_alternative (set, c)
173      rtx set;
174      int c;
175 {
176   rtvec phi_vec = XVEC (SET_SRC (set), 0);
177   int v;
178
179   for (v = GET_NUM_ELEM (phi_vec) - 2; v >= 0; v -= 2)
180     if (INTVAL (RTVEC_ELT (phi_vec, v + 1)) == c)
181       return &RTVEC_ELT (phi_vec, v);
182
183   return NULL;
184 }
185
186 /* Given the SET of a phi node, remove the alternative for predecessor
187    block C.  Return non-zero on success, or zero if no alternative is
188    found for C.  */
189
190 static int
191 remove_phi_alternative (set, c)
192      rtx set;
193      int c;
194 {
195   rtvec phi_vec = XVEC (SET_SRC (set), 0);
196   int num_elem = GET_NUM_ELEM (phi_vec);
197   int v;
198
199   for (v = num_elem - 2; v >= 0; v -= 2)
200     if (INTVAL (RTVEC_ELT (phi_vec, v + 1)) == c)
201       {
202         if (v < num_elem - 2)
203           {
204             RTVEC_ELT (phi_vec, v) = RTVEC_ELT (phi_vec, num_elem - 2);
205             RTVEC_ELT (phi_vec, v + 1) = RTVEC_ELT (phi_vec, num_elem - 1);
206           }
207         PUT_NUM_ELEM (phi_vec, num_elem - 2);
208         return 1;
209       }
210
211   return 0;
212 }
213
214 /* Computing the Immediate Dominators:
215
216    Throughout, we don't actually want the full dominators set as
217    calculated by flow, but rather the immediate dominators.
218 */
219
220 static void
221 simplify_to_immediate_dominators (idom, dominators)
222      int *idom;
223      sbitmap *dominators;
224 {
225   sbitmap *tmp;
226   int b;
227
228   tmp = sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks);
229
230   /* Begin with tmp(n) = dom(n) - { n }.  */
231   for (b = n_basic_blocks; --b >= 0; )
232     {
233       sbitmap_copy (tmp[b], dominators[b]);
234       RESET_BIT (tmp[b], b);
235     }
236
237   /* Subtract out all of our dominator's dominators.  */
238   for (b = n_basic_blocks; --b >= 0; )
239     {
240       sbitmap tmp_b = tmp[b];
241       int s;
242
243       for (s = n_basic_blocks; --s >= 0; )
244         if (TEST_BIT (tmp_b, s))
245           sbitmap_difference (tmp_b, tmp_b, tmp[s]);
246     }
247
248   /* Find the one bit set in the bitmap and put it in the output array.  */
249   for (b = n_basic_blocks; --b >= 0; )
250     {
251       int t;
252       EXECUTE_IF_SET_IN_SBITMAP (tmp[b], 0, t, { idom[b] = t; });
253     }
254
255   sbitmap_vector_free (tmp);
256 }
257
258
259 /* For all registers, find all blocks in which they are set.
260
261    This is the transform of what would be local kill information that
262    we ought to be getting from flow.  */
263
264 static sbitmap *fe_evals;
265 static int fe_current_bb;
266
267 static void
268 find_evaluations_1 (dest, set, data)
269      rtx dest;
270      rtx set ATTRIBUTE_UNUSED;
271      void *data ATTRIBUTE_UNUSED;
272 {
273   if (GET_CODE (dest) == REG
274       && REGNO (dest) >= FIRST_PSEUDO_REGISTER)
275     SET_BIT (fe_evals[REGNO (dest) - FIRST_PSEUDO_REGISTER], fe_current_bb);
276 }
277
278 static void
279 find_evaluations (evals, nregs)
280      sbitmap *evals;
281      int nregs;
282 {
283   int bb;
284
285   sbitmap_vector_zero (evals, nregs);
286   fe_evals = evals;
287
288   for (bb = n_basic_blocks; --bb >= 0; )
289     {
290       rtx p, last;
291
292       fe_current_bb = bb;
293       p = BLOCK_HEAD (bb);
294       last = BLOCK_END (bb);
295       while (1)
296         {
297           if (GET_RTX_CLASS (GET_CODE (p)) == 'i')
298             note_stores (PATTERN (p), find_evaluations_1, NULL);
299
300           if (p == last)
301             break;
302           p = NEXT_INSN (p);
303         }
304     }
305 }
306
307
308 /* Computing the Dominance Frontier:
309   
310    As decribed in Morgan, section 3.5, this may be done simply by 
311    walking the dominator tree bottom-up, computing the frontier for
312    the children before the parent.  When considering a block B,
313    there are two cases:
314
315    (1) A flow graph edge leaving B that does not lead to a child
316    of B in the dominator tree must be a block that is either equal
317    to B or not dominated by B.  Such blocks belong in the frontier
318    of B.
319
320    (2) Consider a block X in the frontier of one of the children C
321    of B.  If X is not equal to B and is not dominated by B, it
322    is in the frontier of B.
323 */
324
325 static void
326 compute_dominance_frontiers_1 (frontiers, idom, bb, done)
327      sbitmap *frontiers;
328      int *idom;
329      int bb;
330      sbitmap done;
331 {
332   basic_block b = BASIC_BLOCK (bb);
333   edge e;
334   int c;
335
336   SET_BIT (done, bb);
337   sbitmap_zero (frontiers[bb]);
338
339   /* Do the frontier of the children first.  Not all children in the
340      dominator tree (blocks dominated by this one) are children in the
341      CFG, so check all blocks.  */
342   for (c = 0; c < n_basic_blocks; ++c)
343     if (idom[c] == bb && ! TEST_BIT (done, c))
344       compute_dominance_frontiers_1 (frontiers, idom, c, done);
345
346   /* Find blocks conforming to rule (1) above.  */
347   for (e = b->succ; e; e = e->succ_next)
348     {
349       if (e->dest == EXIT_BLOCK_PTR)
350         continue;
351       if (idom[e->dest->index] != bb)
352         SET_BIT (frontiers[bb], e->dest->index);
353     }
354
355   /* Find blocks conforming to rule (2).  */
356   for (c = 0; c < n_basic_blocks; ++c)
357     if (idom[c] == bb)
358       {
359         int x;
360         EXECUTE_IF_SET_IN_SBITMAP (frontiers[c], 0, x,
361           {
362             if (idom[x] != bb)
363               SET_BIT (frontiers[bb], x);
364           });
365       }
366 }
367
368 static void
369 compute_dominance_frontiers (frontiers, idom)
370      sbitmap *frontiers;
371      int *idom;
372 {
373   sbitmap done = sbitmap_alloc (n_basic_blocks);
374   sbitmap_zero (done);
375
376   compute_dominance_frontiers_1 (frontiers, idom, 0, done);
377
378   sbitmap_free (done);
379 }
380
381
382 /* Computing the Iterated Dominance Frontier:
383
384    This is the set of merge points for a given register.
385
386    This is not particularly intuitive.  See section 7.1 of Morgan, in
387    particular figures 7.3 and 7.4 and the immediately surrounding text.
388 */
389
390 static void
391 compute_iterated_dominance_frontiers (idfs, frontiers, evals, nregs)
392      sbitmap *idfs;
393      sbitmap *frontiers;
394      sbitmap *evals;
395      int nregs;
396 {
397   sbitmap worklist;
398   int reg, passes = 0;
399
400   worklist = sbitmap_alloc (n_basic_blocks);
401
402   for (reg = 0; reg < nregs; ++reg)
403     {
404       sbitmap idf = idfs[reg];
405       int b, changed;
406
407       /* Start the iterative process by considering those blocks that
408          evaluate REG.  We'll add their dominance frontiers to the
409          IDF, and then consider the blocks we just added.  */
410       sbitmap_copy (worklist, evals[reg]);
411
412       /* Morgan's algorithm is incorrect here.  Blocks that evaluate
413          REG aren't necessarily in REG's IDF.  Start with an empty IDF.  */
414       sbitmap_zero (idf);
415
416       /* Iterate until the worklist is empty.  */
417       do
418         {
419           changed = 0;
420           passes++;
421           EXECUTE_IF_SET_IN_SBITMAP (worklist, 0, b,
422             {
423               RESET_BIT (worklist, b);
424               /* For each block on the worklist, add to the IDF all
425                  blocks on its dominance frontier that aren't already
426                  on the IDF.  Every block that's added is also added
427                  to the worklist.  */
428               sbitmap_union_of_diff (worklist, worklist, frontiers[b], idf);
429               sbitmap_a_or_b (idf, idf, frontiers[b]);
430               changed = 1;
431             });
432         }
433       while (changed);
434     }
435
436   sbitmap_free (worklist);
437
438   if (rtl_dump_file)
439     {
440       fprintf(rtl_dump_file,
441               "Iterated dominance frontier: %d passes on %d regs.\n",
442               passes, nregs);
443     }
444 }
445
446
447 /* Insert the phi nodes.  */
448
449 static void
450 insert_phi_node (regno, bb)
451      int regno, bb;
452 {
453   basic_block b = BASIC_BLOCK (bb);
454   edge e;
455   int npred, i;
456   rtvec vec;
457   rtx phi, reg;
458
459   /* Find out how many predecessors there are.  */
460   for (e = b->pred, npred = 0; e; e = e->pred_next)
461     if (e->src != ENTRY_BLOCK_PTR)
462       npred++;
463
464   /* If this block has no "interesting" preds, then there is nothing to
465      do.  Consider a block that only has the entry block as a pred.  */
466   if (npred == 0)
467     return;
468
469   /* This is the register to which the phi function will be assinged.  */
470   reg = regno_reg_rtx[regno + FIRST_PSEUDO_REGISTER];
471
472   /* Construct the arguments to the PHI node.  The use of pc_rtx is just
473      a placeholder; we'll insert the proper value in rename_registers.  */
474   vec = rtvec_alloc (npred * 2);
475   for (e = b->pred, i = 0; e ; e = e->pred_next, i += 2)
476     if (e->src != ENTRY_BLOCK_PTR)
477       {
478         RTVEC_ELT (vec, i + 0) = pc_rtx;
479         RTVEC_ELT (vec, i + 1) = GEN_INT (e->src->index);
480       }
481
482   phi = gen_rtx_PHI (VOIDmode, vec);
483   phi = gen_rtx_SET (VOIDmode, reg, phi);
484
485   if (GET_CODE (b->head) == CODE_LABEL)
486     emit_insn_after (phi, b->head);
487   else
488     b->head = emit_insn_before (phi, b->head);
489 }
490
491
492 static void
493 insert_phi_nodes (idfs, evals, nregs)
494      sbitmap *idfs;
495      sbitmap *evals ATTRIBUTE_UNUSED;
496      int nregs;
497 {
498   int reg;
499
500   for (reg = 0; reg < nregs; ++reg)
501     {
502       int b;
503       EXECUTE_IF_SET_IN_SBITMAP (idfs[reg], 0, b,
504         {
505           if (REGNO_REG_SET_P (BASIC_BLOCK (b)->global_live_at_start, 
506                                reg + FIRST_PSEUDO_REGISTER))
507             insert_phi_node (reg, b);
508         });
509     }
510 }
511
512 /* Rename the registers to conform to SSA. 
513
514    This is essentially the algorithm presented in Figure 7.8 of Morgan,
515    with a few changes to reduce pattern search time in favour of a bit
516    more memory usage.  */
517
518
519 /* One of these is created for each set.  It will live in a list local
520    to its basic block for the duration of that block's processing.  */
521 struct rename_set_data
522 {
523   struct rename_set_data *next;
524   rtx *reg_loc;
525   rtx set_dest;
526   rtx new_reg;
527   rtx prev_reg;
528   rtx set_insn;
529 };
530
531 /* This struct is used to pass information to callback functions while
532    renaming registers.  */
533 struct rename_context
534 {
535   struct rename_set_data *set_data;
536   rtx current_insn;
537 };
538
539 static void new_registers_for_updates 
540   PARAMS ((struct rename_set_data *set_data,
541            struct rename_set_data *old_set_data, rtx insn));
542
543 /* This is part of a rather ugly hack to allow the pre-ssa regno to be
544    reused.  If, during processing, a register has not yet been touched,
545    ssa_rename_to[regno] will be NULL.  Now, in the course of pushing
546    and popping values from ssa_rename_to, when we would ordinarily 
547    pop NULL back in, we pop RENAME_NO_RTX.  We treat this exactly the
548    same as NULL, except that it signals that the original regno has
549    already been reused.  */
550 #define RENAME_NO_RTX  pc_rtx
551
552 /* Part one of the first step of rename_block, called through for_each_rtx. 
553    Mark pseudos that are set for later update.  Transform uses of pseudos.  */
554
555 static int
556 rename_insn_1 (ptr, data)
557      rtx *ptr;
558      void *data;
559 {
560   rtx x = *ptr;
561   struct rename_context *context = data;
562   struct rename_set_data **set_datap = &(context->set_data);
563
564   if (x == NULL_RTX)
565     return 0;
566
567   switch (GET_CODE (x))
568     {
569     case SET:
570       {
571         rtx *destp = &SET_DEST (x);
572         rtx dest = SET_DEST (x);
573
574         /* Subregs at word 0 are interesting.  Subregs at word != 0 are
575            presumed to be part of a contiguous multi-word set sequence.  */
576         while (GET_CODE (dest) == SUBREG
577                && SUBREG_WORD (dest) == 0)
578           {
579             destp = &SUBREG_REG (dest);
580             dest = SUBREG_REG (dest);
581           }
582
583         if (GET_CODE (dest) == REG
584             && REGNO (dest) >= FIRST_PSEUDO_REGISTER)
585           {
586             /* We found a genuine set of an interesting register.  Tag
587                it so that we can create a new name for it after we finish
588                processing this insn.  */
589
590             struct rename_set_data *r;
591             r = (struct rename_set_data *) xmalloc (sizeof(*r));
592
593             r->reg_loc = destp;
594             r->set_dest = SET_DEST (x);
595             r->set_insn = context->current_insn;
596             r->next = *set_datap;
597             *set_datap = r;
598
599             /* Since we do not wish to (directly) traverse the
600                SET_DEST, recurse through for_each_rtx for the SET_SRC
601                and return.  */
602             for_each_rtx (&SET_SRC (x), rename_insn_1, data);
603             return -1;
604           }
605
606         /* Otherwise, this was not an interesting destination.  Continue
607            on, marking uses as normal.  */
608         return 0;
609       }
610
611     case REG:
612       if (REGNO (x) >= FIRST_PSEUDO_REGISTER
613           && REGNO (x) < ssa_max_reg_num)
614         {
615           rtx new_reg = ssa_rename_to[REGNO(x) - FIRST_PSEUDO_REGISTER];
616
617           if (new_reg != NULL_RTX && new_reg != RENAME_NO_RTX)
618             {
619               if (GET_MODE (x) != GET_MODE (new_reg))
620                 abort ();
621               *ptr = new_reg;
622             }
623           /* Else this is a use before a set.  Warn?  */
624         }
625       return -1;
626
627     case PHI:
628       /* Never muck with the phi.  We do that elsewhere, special-like.  */
629       return -1;
630
631     default:
632       /* Anything else, continue traversing.  */
633       return 0;
634     }
635 }
636
637 /* Second part of the first step of rename_block.  The portion of the list
638    beginning at SET_DATA through OLD_SET_DATA contain the sets present in
639    INSN.  Update data structures accordingly.  */
640
641 static void
642 new_registers_for_updates (set_data, old_set_data, insn)
643      struct rename_set_data *set_data, *old_set_data;
644      rtx insn;
645 {
646   while (set_data != old_set_data)
647     {
648       int regno, new_regno;
649       rtx old_reg, new_reg, prev_reg;
650
651       old_reg = *set_data->reg_loc;
652       regno = REGNO (*set_data->reg_loc);
653
654       /* For the first set we come across, reuse the original regno.  */
655       if (ssa_rename_to[regno - FIRST_PSEUDO_REGISTER] == NULL_RTX)
656         {
657           new_reg = old_reg;
658           prev_reg = RENAME_NO_RTX;
659         }
660       else
661         {
662           prev_reg = ssa_rename_to[regno - FIRST_PSEUDO_REGISTER];
663           new_reg = gen_reg_rtx (GET_MODE (old_reg));
664         }
665
666       set_data->new_reg = new_reg;
667       set_data->prev_reg = prev_reg;
668       new_regno = REGNO (new_reg);
669       ssa_rename_to[regno - FIRST_PSEUDO_REGISTER] = new_reg;
670
671       if (new_regno >= (int) ssa_definition->num_elements)
672         {
673           int new_limit = new_regno * 5 / 4;
674           ssa_definition = VARRAY_GROW (ssa_definition, new_limit);
675           ssa_uses = VARRAY_GROW (ssa_uses, new_limit);
676           ssa_rename_from = VARRAY_GROW (ssa_rename_from, new_limit);
677         }
678
679       VARRAY_RTX (ssa_definition, new_regno) = insn;
680       VARRAY_RTX (ssa_rename_from, new_regno) = old_reg;
681
682       set_data = set_data->next;
683     }
684 }
685
686 static void
687 rename_block (bb, idom)
688      int bb;
689      int *idom;
690 {
691   basic_block b = BASIC_BLOCK (bb);
692   edge e;
693   rtx insn, next, last;
694   struct rename_set_data *set_data = NULL;
695   int c;
696
697   /* Step One: Walk the basic block, adding new names for sets and
698      replacing uses.  */
699      
700   next = b->head;
701   last = b->end;
702   do
703     {
704       insn = next;
705       if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
706         {
707           struct rename_context context;
708           context.set_data = set_data;
709           context.current_insn = insn;
710
711           for_each_rtx (&PATTERN (insn), rename_insn_1, &context);
712           for_each_rtx (&REG_NOTES (insn), rename_insn_1, &context);
713           
714           new_registers_for_updates (context.set_data, set_data, insn);
715           set_data = context.set_data;
716         }
717
718       next = NEXT_INSN (insn);
719     }
720   while (insn != last);
721
722   /* Step Two: Update the phi nodes of this block's successors.  */
723
724   for (e = b->succ; e; e = e->succ_next)
725     {
726       if (e->dest == EXIT_BLOCK_PTR)
727         continue;
728
729       insn = e->dest->head;
730       if (GET_CODE (insn) == CODE_LABEL)
731         insn = NEXT_INSN (insn);
732
733       while (PHI_NODE_P (insn))
734         {
735           rtx phi = PATTERN (insn);
736           unsigned int regno;
737           rtx reg;
738
739           /* Find out which of our outgoing registers this node is
740              indended to replace.  Note that if this not the first PHI
741              node to have been created for this register, we have to
742              jump through rename links to figure out which register
743              we're talking about.  This can easily be recognized by
744              noting that the regno is new to this pass.  */
745           regno = REGNO (SET_DEST (phi));
746           if (regno >= ssa_max_reg_num)
747             regno = REGNO (VARRAY_RTX (ssa_rename_from, regno));
748           reg = ssa_rename_to[regno - FIRST_PSEUDO_REGISTER];
749
750           /* It is possible for the variable to be uninitialized on
751              edges in.  Reduce the arity of the PHI so that we don't
752              consider those edges.  */
753           if (reg == NULL || reg == RENAME_NO_RTX)
754             {
755               if (! remove_phi_alternative (phi, bb))
756                 abort ();
757             }
758           else
759             {
760               /* When we created the PHI nodes, we did not know what mode
761              the register should be.  Now that we've found an original,
762              we can fill that in.  */
763               if (GET_MODE (SET_DEST (phi)) == VOIDmode)
764                 PUT_MODE (SET_DEST (phi), GET_MODE (reg));
765               else if (GET_MODE (SET_DEST (phi)) != GET_MODE (reg))
766                 abort();
767
768               *phi_alternative (phi, bb) = reg;
769               /* ??? Mark for a new ssa_uses entry.  */
770             }
771
772           insn = NEXT_INSN (insn);
773         }
774     }
775
776   /* Step Three: Do the same to the children of this block in
777      dominator order.  */
778
779   for (c = 0; c < n_basic_blocks; ++c)
780     if (idom[c] == bb)
781       rename_block (c, idom);
782
783   /* Step Four: Update the sets to refer to their new register.  */
784
785   while (set_data)
786     {
787       struct rename_set_data *next;
788       rtx old_reg = *set_data->reg_loc;
789
790       /* If the set is of a subreg only, copy the entire reg first so
791          that unmodified bits are preserved.  Of course, we don't
792          strictly have SSA any more, but that's the best we can do
793          without a lot of hard work.  */
794
795       if (GET_CODE (set_data->set_dest) == SUBREG) 
796         {
797           if (old_reg != set_data->new_reg)
798             {
799               rtx copy = gen_rtx_SET (GET_MODE (old_reg), 
800                                       set_data->new_reg, old_reg);
801               emit_insn_before (copy, set_data->set_insn);
802             }
803         }
804
805       *set_data->reg_loc = set_data->new_reg;
806       ssa_rename_to[REGNO (old_reg)-FIRST_PSEUDO_REGISTER]
807         = set_data->prev_reg;
808
809       next = set_data->next;
810       free (set_data);
811       set_data = next;
812     }      
813 }
814
815 static void
816 rename_registers (nregs, idom)
817      int nregs;
818      int *idom;
819 {
820   VARRAY_RTX_INIT (ssa_definition, nregs * 3, "ssa_definition");
821   VARRAY_RTX_INIT (ssa_uses, nregs * 3, "ssa_uses");
822   VARRAY_RTX_INIT (ssa_rename_from, nregs * 3, "ssa_rename_from");
823
824   ssa_rename_to = (rtx *) alloca (nregs * sizeof(rtx));
825   bzero ((char *) ssa_rename_to, nregs * sizeof(rtx));
826
827   rename_block (0, idom);
828
829   /* ??? Update basic_block_live_at_start, and other flow info 
830      as needed.  */
831
832   ssa_rename_to = NULL;
833 }
834
835
836 /* The main entry point for moving to SSA.  */
837
838 void
839 convert_to_ssa()
840 {
841   /* Element I is the set of blocks that set register I.  */
842   sbitmap *evals;
843
844   /* Dominator bitmaps.  */
845   sbitmap *dominators;
846   sbitmap *dfs;
847   sbitmap *idfs;
848
849   /* Element I is the immediate dominator of block I.  */
850   int *idom;
851
852   int nregs;
853
854   /* Don't do it twice.  */
855   if (in_ssa_form)
856     abort ();
857
858   /* Need global_live_at_{start,end} up to date.  */
859   life_analysis (get_insns (), NULL, PROP_KILL_DEAD_CODE | PROP_SCAN_DEAD_CODE);
860
861   /* Compute dominators.  */
862   dominators = sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks);
863   compute_flow_dominators (dominators, NULL);
864
865   idom = (int *) alloca (n_basic_blocks * sizeof (int));
866   memset ((void *)idom, -1, (size_t)n_basic_blocks * sizeof (int));
867   simplify_to_immediate_dominators (idom, dominators);
868
869   sbitmap_vector_free (dominators);
870
871   if (rtl_dump_file)
872     {
873       int i;
874       fputs (";; Immediate Dominators:\n", rtl_dump_file);
875       for (i = 0; i < n_basic_blocks; ++i)
876         fprintf (rtl_dump_file, ";\t%3d = %3d\n", i, idom[i]);
877       fflush (rtl_dump_file);
878     }
879
880   /* Compute dominance frontiers.  */
881
882   dfs = sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks);
883   compute_dominance_frontiers (dfs, idom);
884
885   if (rtl_dump_file)
886     {
887       dump_sbitmap_vector (rtl_dump_file, ";; Dominance Frontiers:",
888                            "; Basic Block", dfs, n_basic_blocks);
889       fflush (rtl_dump_file);
890     }
891
892   /* Compute register evaluations.  */
893
894   ssa_max_reg_num = max_reg_num();
895   nregs = ssa_max_reg_num - FIRST_PSEUDO_REGISTER;
896   evals = sbitmap_vector_alloc (nregs, n_basic_blocks);
897   find_evaluations (evals, nregs);
898
899   /* Compute the iterated dominance frontier for each register.  */
900
901   idfs = sbitmap_vector_alloc (nregs, n_basic_blocks);
902   compute_iterated_dominance_frontiers (idfs, dfs, evals, nregs);
903
904   if (rtl_dump_file)
905     {
906       dump_sbitmap_vector (rtl_dump_file, ";; Iterated Dominance Frontiers:",
907                            "; Register-FIRST_PSEUDO_REGISTER", idfs, nregs);
908       fflush (rtl_dump_file);
909     }
910
911   /* Insert the phi nodes.  */
912
913   insert_phi_nodes (idfs, evals, nregs);
914
915   /* Rename the registers to satisfy SSA.  */
916
917   rename_registers (nregs, idom);
918
919   /* All done!  Clean up and go home.  */
920
921   sbitmap_vector_free (dfs);
922   sbitmap_vector_free (evals);
923   sbitmap_vector_free (idfs);
924   in_ssa_form = 1;
925
926   reg_scan (get_insns (), max_reg_num (), 1);
927 }
928
929
930 /* REG is the representative temporary of its partition.  Add it to the
931    set of nodes to be processed, if it hasn't been already.  Return the
932    index of this register in the node set.  */
933
934 static inline int
935 ephi_add_node (reg, nodes, n_nodes)
936      rtx reg, *nodes;
937      int *n_nodes;
938 {
939   int i;
940   for (i = *n_nodes - 1; i >= 0; --i)
941     if (REGNO (reg) == REGNO (nodes[i]))
942       return i;
943
944   nodes[i = (*n_nodes)++] = reg;
945   return i;
946 }
947
948 /* Part one of the topological sort.  This is a forward (downward) search
949    through the graph collecting a stack of nodes to process.  Assuming no
950    cycles, the nodes at top of the stack when we are finished will have
951    no other dependancies.  */
952
953 static int *
954 ephi_forward (t, visited, succ, tstack)
955      int t;
956      sbitmap visited;
957      sbitmap *succ;
958      int *tstack;
959 {
960   int s;
961
962   SET_BIT (visited, t);
963
964   EXECUTE_IF_SET_IN_SBITMAP (succ[t], 0, s,
965     {
966       if (! TEST_BIT (visited, s))
967         tstack = ephi_forward (s, visited, succ, tstack);
968     });
969
970   *tstack++ = t;
971   return tstack;
972 }
973
974 /* Part two of the topological sort.  The is a backward search through
975    a cycle in the graph, copying the data forward as we go.  */
976
977 static void
978 ephi_backward (t, visited, pred, nodes)
979      int t;
980      sbitmap visited, *pred;
981      rtx *nodes;
982 {
983   int p;
984
985   SET_BIT (visited, t);
986
987   EXECUTE_IF_SET_IN_SBITMAP (pred[t], 0, p,
988     {
989       if (! TEST_BIT (visited, p))
990         {
991           ephi_backward (p, visited, pred, nodes);
992           emit_move_insn (nodes[p], nodes[t]);
993         }
994     });
995 }
996
997 /* Part two of the topological sort.  Create the copy for a register
998    and any cycle of which it is a member.  */
999
1000 static void
1001 ephi_create (t, visited, pred, succ, nodes)
1002      int t;
1003      sbitmap visited, *pred, *succ;
1004      rtx *nodes;
1005 {
1006   rtx reg_u = NULL_RTX;
1007   int unvisited_predecessors = 0;
1008   int p;
1009
1010   /* Iterate through the predecessor list looking for unvisited nodes.
1011      If there are any, we have a cycle, and must deal with that.  At 
1012      the same time, look for a visited predecessor.  If there is one,
1013      we won't need to create a temporary.  */
1014
1015   EXECUTE_IF_SET_IN_SBITMAP (pred[t], 0, p,
1016     {
1017       if (! TEST_BIT (visited, p))
1018         unvisited_predecessors = 1;
1019       else if (!reg_u)
1020         reg_u = nodes[p];
1021     });
1022
1023   if (unvisited_predecessors)
1024     {
1025       /* We found a cycle.  Copy out one element of the ring (if necessary),
1026          then traverse the ring copying as we go.  */
1027
1028       if (!reg_u)
1029         {
1030           reg_u = gen_reg_rtx (GET_MODE (nodes[t]));
1031           emit_move_insn (reg_u, nodes[t]);
1032         }
1033
1034       EXECUTE_IF_SET_IN_SBITMAP (pred[t], 0, p,
1035         {
1036           if (! TEST_BIT (visited, p))
1037             {
1038               ephi_backward (p, visited, pred, nodes);
1039               emit_move_insn (nodes[p], reg_u);
1040             }
1041         });
1042     }  
1043   else 
1044     {
1045       /* No cycle.  Just copy the value from a successor.  */
1046
1047       int s;
1048       EXECUTE_IF_SET_IN_SBITMAP (succ[t], 0, s,
1049         {
1050           SET_BIT (visited, t);
1051           emit_move_insn (nodes[t], nodes[s]);
1052           return;
1053         });
1054     }
1055 }
1056
1057 /* Convert the edge to normal form.  */
1058
1059 static void
1060 eliminate_phi (e, reg_partition)
1061      edge e;
1062      partition reg_partition;
1063 {
1064   int n_nodes;
1065   sbitmap *pred, *succ;
1066   sbitmap visited;
1067   rtx *nodes;
1068   int *stack, *tstack;
1069   rtx insn;
1070   int i;
1071
1072   /* Collect an upper bound on the number of registers needing processing.  */
1073
1074   insn = e->dest->head;
1075   if (GET_CODE (insn) == CODE_LABEL)
1076     insn = next_nonnote_insn (insn);
1077
1078   n_nodes = 0;
1079   while (PHI_NODE_P (insn))
1080     {
1081       insn = next_nonnote_insn (insn);
1082       n_nodes += 2;
1083     }
1084
1085   if (n_nodes == 0)
1086     return;
1087
1088   /* Build the auxilliary graph R(B). 
1089
1090      The nodes of the graph are the members of the register partition
1091      present in Phi(B).  There is an edge from FIND(T0)->FIND(T1) for
1092      each T0 = PHI(...,T1,...), where T1 is for the edge from block C.  */
1093
1094   nodes = (rtx *) alloca (n_nodes * sizeof(rtx));
1095   pred = sbitmap_vector_alloc (n_nodes, n_nodes);
1096   succ = sbitmap_vector_alloc (n_nodes, n_nodes);
1097   sbitmap_vector_zero (pred, n_nodes);
1098   sbitmap_vector_zero (succ, n_nodes);
1099
1100   insn = e->dest->head;
1101   if (GET_CODE (insn) == CODE_LABEL)
1102     insn = next_nonnote_insn (insn);
1103
1104   n_nodes = 0;
1105   for (; PHI_NODE_P (insn); insn = next_nonnote_insn (insn))
1106     {
1107       rtx* preg = phi_alternative (PATTERN (insn), e->src->index);
1108       rtx tgt = SET_DEST (PATTERN (insn));
1109       rtx reg;
1110
1111       /* There may be no phi alternative corresponding to this edge.
1112          This indicates that the phi variable is undefined along this
1113          edge.  */
1114       if (preg == NULL)
1115         continue;
1116       reg = *preg;
1117
1118       if (GET_CODE (reg) != REG || GET_CODE (tgt) != REG)
1119         abort();
1120
1121       reg = regno_reg_rtx[partition_find (reg_partition, REGNO (reg))];
1122       tgt = regno_reg_rtx[partition_find (reg_partition, REGNO (tgt))];
1123       /* If the two registers are already in the same partition, 
1124          nothing will need to be done.  */
1125       if (reg != tgt)
1126         {
1127           int ireg, itgt;
1128
1129           ireg = ephi_add_node (reg, nodes, &n_nodes);
1130           itgt = ephi_add_node (tgt, nodes, &n_nodes);
1131
1132           SET_BIT (pred[ireg], itgt);
1133           SET_BIT (succ[itgt], ireg);
1134         }
1135     }
1136
1137   if (n_nodes == 0)
1138     goto out;
1139
1140   /* Begin a topological sort of the graph.  */
1141
1142   visited = sbitmap_alloc (n_nodes);
1143   sbitmap_zero (visited);
1144
1145   tstack = stack = (int *) alloca (n_nodes * sizeof (int));
1146
1147   for (i = 0; i < n_nodes; ++i)
1148     if (! TEST_BIT (visited, i))
1149       tstack = ephi_forward (i, visited, succ, tstack);
1150
1151   sbitmap_zero (visited);
1152
1153   /* As we find a solution to the tsort, collect the implementation 
1154      insns in a sequence.  */
1155   start_sequence ();
1156   
1157   while (tstack != stack)
1158     {
1159       i = *--tstack;
1160       if (! TEST_BIT (visited, i))
1161         ephi_create (i, visited, pred, succ, nodes);
1162     }
1163
1164   insn = gen_sequence ();
1165   end_sequence ();
1166   insert_insn_on_edge (insn, e);
1167   if (rtl_dump_file)
1168     fprintf (rtl_dump_file, "Emitting copy on edge (%d,%d)\n",
1169              e->src->index, e->dest->index);
1170
1171   sbitmap_free (visited);
1172 out:
1173   sbitmap_vector_free (pred);
1174   sbitmap_vector_free (succ);
1175 }
1176
1177
1178 /* For basic block B, consider all phi insns which provide an
1179    alternative corresponding to an incoming abnormal critical edge.
1180    Place the phi alternative corresponding to that abnormal critical
1181    edge in the same register class as the destination of the set.  
1182
1183    From Morgan, p. 178:
1184
1185      For each abnormal critical edge (C, B), 
1186      if T0 = phi (T1, ..., Ti, ..., Tm) is a phi node in B, 
1187      and C is the ith predecessor of B, 
1188      then T0 and Ti must be equivalent. 
1189
1190    Return non-zero iff any such cases were found for which the two
1191    regs were not already in the same class.  */
1192
1193 static int
1194 make_regs_equivalent_over_bad_edges (bb, reg_partition)
1195      int bb;
1196      partition reg_partition;
1197 {
1198   int changed = 0;
1199   basic_block b = BASIC_BLOCK (bb);
1200   rtx phi = b->head;
1201
1202   /* Advance to the first phi node.  */
1203   if (GET_CODE (phi) == CODE_LABEL)
1204     phi = next_nonnote_insn (phi);
1205
1206   /* Scan all the phi nodes.  */
1207   for (; 
1208        PHI_NODE_P (phi);
1209        phi = next_nonnote_insn (phi))
1210     {
1211       edge e;
1212       int tgt_regno;
1213       rtx set = PATTERN (phi);
1214       rtx tgt = SET_DEST (set);
1215
1216       /* The set target is expected to be a pseudo.  */
1217       if (GET_CODE (tgt) != REG 
1218           || REGNO (tgt) < FIRST_PSEUDO_REGISTER)
1219         abort ();
1220       tgt_regno = REGNO (tgt);
1221
1222       /* Scan incoming abnormal critical edges.  */
1223       for (e = b->pred; e; e = e->pred_next)
1224         if ((e->flags & (EDGE_ABNORMAL | EDGE_CRITICAL)) 
1225                 == (EDGE_ABNORMAL | EDGE_CRITICAL))
1226           {
1227             rtx *alt = phi_alternative (set, e->src->index);
1228             int alt_regno;
1229
1230             /* If there is no alternative corresponding to this edge,
1231                the value is undefined along the edge, so just go on.  */
1232             if (alt == 0)
1233               continue;
1234
1235             /* The phi alternative is expected to be a pseudo.  */
1236             if (GET_CODE (*alt) != REG 
1237                 || REGNO (*alt) < FIRST_PSEUDO_REGISTER)
1238               abort ();
1239             alt_regno = REGNO (*alt);
1240
1241             /* If the set destination and the phi alternative aren't
1242                already in the same class...  */
1243             if (partition_find (reg_partition, tgt_regno) 
1244                 != partition_find (reg_partition, alt_regno))
1245               {
1246                 /* ... make them such.  */
1247                 partition_union (reg_partition, 
1248                                  tgt_regno, alt_regno);
1249                 ++changed;
1250               }
1251           }
1252     }
1253
1254   return changed;
1255 }
1256
1257
1258 /* Consider phi insns in basic block BB pairwise.  If the set target
1259    of both isns are equivalent pseudos, make the corresponding phi
1260    alternatives in each phi corresponding equivalent.
1261
1262    Return nonzero if any new register classes were unioned.  */
1263
1264 static int
1265 make_equivalent_phi_alternatives_equivalent (bb, reg_partition)
1266      int bb;
1267      partition reg_partition;
1268 {
1269   int changed = 0;
1270   rtx phi = BLOCK_HEAD (bb);
1271   basic_block b = BASIC_BLOCK (bb);
1272
1273   /* Advance to the first phi node.  */
1274   if (GET_CODE (phi) == CODE_LABEL)
1275     phi = next_nonnote_insn (phi);
1276
1277   /* Scan all the phi nodes.  */
1278   for (; 
1279        PHI_NODE_P (phi);
1280        phi = next_nonnote_insn (phi))
1281     {
1282       rtx set = PATTERN (phi);
1283       /* The regno of the destination of the set.  */
1284       int tgt_regno = REGNO (SET_DEST (PATTERN (phi)));
1285
1286       rtx phi2 = next_nonnote_insn (phi);
1287
1288       /* Scan all phi nodes following this one.  */
1289       for (;
1290            PHI_NODE_P (phi2);
1291            phi2 = next_nonnote_insn (phi2))
1292         {
1293           rtx set2 = PATTERN (phi2);
1294           /* The regno of the destination of the set.  */
1295           int tgt2_regno = REGNO (SET_DEST (set2));
1296                   
1297           /* Are the set destinations equivalent regs?  */
1298           if (partition_find (reg_partition, tgt_regno) ==
1299               partition_find (reg_partition, tgt2_regno))
1300             {
1301               edge e;
1302               /* Scan over edges.  */
1303               for (e = b->pred; e; e = e->pred_next)
1304                 {
1305                   int pred_block = e->src->index;
1306                   /* Identify the phi altnernatives from both phi
1307                      nodes corresponding to this edge.  */
1308                   rtx *alt = phi_alternative (set, pred_block);
1309                   rtx *alt2 = phi_alternative (set2, pred_block);
1310
1311                   /* If one of the phi nodes doesn't have a
1312                      corresponding alternative, just skip it.  */
1313                   if (alt == 0 || alt2 == 0)
1314                     continue;
1315
1316                   /* Both alternatives should be pseudos.  */
1317                   if (GET_CODE (*alt) != REG
1318                       || REGNO (*alt) < FIRST_PSEUDO_REGISTER)
1319                     abort ();
1320                   if (GET_CODE (*alt2) != REG
1321                       || REGNO (*alt2) < FIRST_PSEUDO_REGISTER)
1322                     abort ();
1323
1324                   /* If the altneratives aren't already in the same
1325                      class ... */
1326                   if (partition_find (reg_partition, REGNO (*alt)) 
1327                       != partition_find (reg_partition, REGNO (*alt2)))
1328                     {
1329                       /* ... make them so.  */
1330                       partition_union (reg_partition, 
1331                                        REGNO (*alt), REGNO (*alt2));
1332                       ++changed;
1333                     }
1334                 }
1335             }
1336         }
1337     }
1338
1339   return changed;
1340 }
1341
1342 /* Compute a conservative partition of outstanding pseudo registers.
1343    See Morgan 7.3.1.  */
1344
1345 static partition
1346 compute_conservative_reg_partition ()
1347 {
1348   int bb;
1349   int changed = 0;
1350
1351   /* We don't actually work with hard registers, but it's easier to
1352      carry them around anyway rather than constantly doing register
1353      number arithmetic.  */
1354   partition p = 
1355     partition_new (ssa_definition->num_elements + FIRST_PSEUDO_REGISTER);
1356
1357   /* The first priority is to make sure registers that might have to
1358      be copied on abnormal critical edges are placed in the same
1359      partition.  This saves us from having to split abnormal critical
1360      edges.  */
1361   for (bb = n_basic_blocks; --bb >= 0; )
1362     changed += make_regs_equivalent_over_bad_edges (bb, p);
1363   
1364   /* Now we have to insure that corresponding arguments of phi nodes
1365      assigning to corresponding regs are equivalent.  Iterate until
1366      nothing changes.  */
1367   while (changed > 0)
1368     {
1369       changed = 0;
1370       for (bb = n_basic_blocks; --bb >= 0; )
1371         changed += make_equivalent_phi_alternatives_equivalent (bb, p);
1372     }
1373
1374   return p;
1375 }
1376
1377 /* The following functions compute a register partition that attempts
1378    to eliminate as many reg copies and phi node copies as possible by
1379    coalescing registers.   This is the strategy:
1380
1381     1. As in the conservative case, the top priority is to coalesce
1382        registers that otherwise would cause copies to be placed on
1383        abnormal critical edges (which isn't possible).
1384
1385     2. Figure out which regs are involved (in the LHS or RHS) of
1386        copies and phi nodes.  Compute conflicts among these regs.  
1387
1388     3. Walk around the instruction stream, placing two regs in the
1389        same class of the partition if one appears on the LHS and the
1390        other on the RHS of a copy or phi node and the two regs don't
1391        conflict.  The conflict information of course needs to be
1392        updated.  
1393
1394     4. If anything has changed, there may be new opportunities to
1395        coalesce regs, so go back to 2.
1396 */
1397
1398 /* If REG1 and REG2 don't conflict in CONFLICTS, place them in the
1399    same class of partition P, if they aren't already.  Update
1400    CONFLICTS appropriately.  
1401
1402    Returns one if REG1 and REG2 were placed in the same class but were
1403    not previously; zero otherwise.  
1404
1405    See Morgan figure 11.15.  */
1406
1407 static int 
1408 coalesce_if_unconflicting (p, conflicts, reg1, reg2)
1409      partition p;
1410      conflict_graph conflicts;
1411      int reg1;
1412      int reg2;
1413 {
1414   int reg;
1415
1416   /* Don't mess with hard regs.  */
1417   if (reg1 < FIRST_PSEUDO_REGISTER || reg2 < FIRST_PSEUDO_REGISTER)
1418     return 0;
1419
1420   /* Find the canonical regs for the classes containing REG1 and
1421      REG2.  */
1422   reg1 = partition_find (p, reg1);
1423   reg2 = partition_find (p, reg2);
1424   
1425   /* If they're already in the same class, there's nothing to do.  */
1426   if (reg1 == reg2)
1427     return 0;
1428
1429   /* If the regs conflict, our hands are tied.  */
1430   if (conflict_graph_conflict_p (conflicts, reg1, reg2))
1431     return 0;
1432
1433   /* We're good to go.  Put the regs in the same partition.  */
1434   partition_union (p, reg1, reg2);
1435
1436   /* Find the new canonical reg for the merged class.  */
1437   reg = partition_find (p, reg1);
1438   
1439   /* Merge conflicts from the two previous classes.  */
1440   conflict_graph_merge_regs (conflicts, reg, reg1);
1441   conflict_graph_merge_regs (conflicts, reg, reg2);
1442
1443   return 1;
1444 }
1445
1446 /* For each register copy insn in basic block BB, place the LHS and
1447    RHS regs in the same class in partition P if they do not conflict
1448    according to CONFLICTS.
1449
1450    Returns the number of changes that were made to P.
1451
1452    See Morgan figure 11.14.  */
1453
1454 static int
1455 coalesce_regs_in_copies (bb, p, conflicts)
1456      basic_block bb;
1457      partition p;
1458      conflict_graph conflicts;
1459 {
1460   int changed = 0;
1461   rtx insn;
1462   rtx end = bb->end;
1463
1464   /* Scan the instruction stream of the block.  */
1465   for (insn = bb->head; insn != end; insn = NEXT_INSN (insn))
1466     {
1467       rtx pattern;
1468       rtx src;
1469       rtx dest;
1470
1471       /* If this isn't a set insn, go to the next insn.  */
1472       if (GET_CODE (insn) != INSN)
1473         continue;
1474       pattern = PATTERN (insn);
1475       if (GET_CODE (pattern) != SET)
1476         continue;
1477
1478       src = SET_SRC (pattern);
1479       dest = SET_DEST (pattern);
1480
1481       /* If src or dest are subregs, find the underlying reg.  */
1482       while (GET_CODE (src) == SUBREG
1483              && SUBREG_WORD (src) != 0)
1484         src = SUBREG_REG (src);
1485       while (GET_CODE (dest) == SUBREG
1486              && SUBREG_WORD (dest) != 0)
1487         dest = SUBREG_REG (dest);
1488
1489       /* We're only looking for copies.  */
1490       if (GET_CODE (src) != REG || GET_CODE (dest) != REG)
1491         continue;
1492
1493       /* Coalesce only if the reg modes are the same.  As long as
1494          each reg's rtx is unique, it can have only one mode, so two
1495          pseudos of different modes can't be coalesced into one.  
1496
1497          FIXME: We can probably get around this by inserting SUBREGs
1498          where appropriate, but for now we don't bother.  */
1499       if (GET_MODE (src) != GET_MODE (dest))
1500         continue;
1501
1502       /* Found a copy; see if we can use the same reg for both the
1503          source and destination (and thus eliminate the copy,
1504          ultimately).  */
1505       changed += coalesce_if_unconflicting (p, conflicts, 
1506                                             REGNO (src), REGNO (dest));
1507     }
1508
1509   return changed;
1510 }
1511
1512
1513 struct phi_coalesce_context
1514 {
1515   partition p;
1516   conflict_graph conflicts;
1517   int changed;
1518 };
1519
1520 /* Callback function for for_each_successor_phi.  If the set
1521    destination and the phi alternative regs do not conflict, place
1522    them in the same paritition class.  DATA is a pointer to a
1523    phi_coalesce_context struct.  */
1524
1525 static int
1526 coalesce_reg_in_phi (insn, dest_regno, src_regno, data)
1527      rtx insn ATTRIBUTE_UNUSED;
1528      int dest_regno;
1529      int src_regno;
1530      void *data;
1531 {
1532   struct phi_coalesce_context *context = 
1533     (struct phi_coalesce_context *) data;
1534   
1535   /* Attempt to use the same reg, if they don't conflict.  */
1536   context->changed 
1537     += coalesce_if_unconflicting (context->p, context->conflicts, 
1538                                   dest_regno, src_regno);
1539   return 0;
1540 }
1541
1542 /* For each alternative in a phi function corresponding to basic block
1543    BB (in phi nodes in successor block to BB), place the reg in the
1544    phi alternative and the reg to which the phi value is set into the
1545    same class in partition P, if allowed by CONFLICTS.  
1546
1547    Return the number of changes that were made to P.
1548    
1549    See Morgan figure 11.14.  */
1550
1551 static int
1552 coalesce_regs_in_successor_phi_nodes (bb, p, conflicts)
1553      basic_block bb;
1554      partition p;
1555      conflict_graph conflicts;
1556 {
1557   struct phi_coalesce_context context;
1558   context.p = p;
1559   context.conflicts = conflicts;
1560   context.changed = 0;
1561
1562   for_each_successor_phi (bb, &coalesce_reg_in_phi, &context);
1563
1564   return context.changed;
1565 }
1566
1567 /* Compute and return a partition of pseudos.  Where possible,
1568    non-conflicting pseudos are placed in the same class.  
1569
1570    The caller is responsible for deallocating the returned partition.  */
1571
1572 static partition
1573 compute_coalesced_reg_partition ()
1574 {
1575   int bb;
1576   int changed = 0;
1577
1578   /* We don't actually work with hard registers, but it's easier to
1579      carry them around anyway rather than constantly doing register
1580      number arithmetic.  */
1581   partition p = 
1582     partition_new (ssa_definition->num_elements + FIRST_PSEUDO_REGISTER);
1583
1584   /* The first priority is to make sure registers that might have to
1585      be copied on abnormal critical edges are placed in the same
1586      partition.  This saves us from having to split abnormal critical
1587      edges (which can't be done).  */
1588   for (bb = n_basic_blocks; --bb >= 0; )
1589     make_regs_equivalent_over_bad_edges (bb, p);
1590
1591   do
1592     {
1593       regset_head phi_set;
1594       conflict_graph conflicts;
1595
1596       changed = 0;
1597
1598       /* Build the set of registers involved in phi nodes, either as
1599          arguments to the phi function or as the target of a set.  */
1600       INITIALIZE_REG_SET (phi_set);
1601       mark_phi_and_copy_regs (&phi_set);
1602
1603       /* Compute conflicts.  */
1604       conflicts = conflict_graph_compute (&phi_set, p);
1605
1606       /* FIXME: Better would be to process most frequently executed
1607          blocks first, so that most frequently executed copies would
1608          be more likely to be removed by register coalescing.  But any
1609          order will generate correct, if non-optimal, results.  */
1610       for (bb = n_basic_blocks; --bb >= 0; )
1611         {
1612           basic_block block = BASIC_BLOCK (bb);
1613           changed += coalesce_regs_in_copies (block, p, conflicts);
1614           changed += 
1615             coalesce_regs_in_successor_phi_nodes (block, p, conflicts);
1616         }
1617
1618       conflict_graph_delete (conflicts);
1619     }
1620   while (changed > 0);
1621
1622   return p;
1623 }
1624
1625 /* Mark the regs in a phi node.  PTR is a phi expression or one of its
1626    components (a REG or a CONST_INT).  DATA is a reg set in which to
1627    set all regs.  Called from for_each_rtx.  */
1628
1629 static int
1630 mark_reg_in_phi (ptr, data)
1631      rtx *ptr;
1632      void *data;
1633 {
1634   rtx expr = *ptr;
1635   regset set = (regset) data;
1636
1637   switch (GET_CODE (expr))
1638     {
1639     case REG:
1640       SET_REGNO_REG_SET (set, REGNO (expr));
1641       /* Fall through.  */
1642     case CONST_INT:
1643     case PHI:
1644       return 0;
1645     default:
1646       abort ();
1647     }
1648 }
1649
1650 /* Mark in PHI_SET all pseudos that are used in a phi node -- either
1651    set from a phi expression, or used as an argument in one.  Also
1652    mark regs that are the source or target of a reg copy.  Uses
1653    ssa_definition.  */
1654
1655 static void
1656 mark_phi_and_copy_regs (phi_set)
1657      regset phi_set;
1658 {
1659   int reg;
1660
1661   /* Scan the definitions of all regs.  */
1662   for (reg = VARRAY_SIZE (ssa_definition); 
1663        --reg >= FIRST_PSEUDO_REGISTER; 
1664        ) 
1665     {
1666       rtx insn = VARRAY_RTX (ssa_definition, reg);
1667       rtx pattern;
1668       rtx src;
1669
1670       if (insn == NULL)
1671         continue;
1672       pattern = PATTERN (insn);
1673       /* Sometimes we get PARALLEL insns.  These aren't phi nodes or
1674          copies.  */
1675       if (GET_CODE (pattern) != SET)
1676         continue;
1677       src = SET_SRC (pattern);
1678
1679       if (GET_CODE (src) == REG)
1680         {
1681           /* It's a reg copy.  */
1682           SET_REGNO_REG_SET (phi_set, reg);
1683           SET_REGNO_REG_SET (phi_set, REGNO (src));
1684         }
1685       else if (GET_CODE (src) == PHI)
1686         {
1687           /* It's a phi node.  Mark the reg being set.  */
1688           SET_REGNO_REG_SET (phi_set, reg);
1689           /* Mark the regs used in the phi function.  */
1690           for_each_rtx (&src, mark_reg_in_phi, phi_set);
1691         }
1692       /* ... else nothing to do.  */
1693     }
1694 }
1695
1696 /* Rename regs in insn PTR that are equivalent.  DATA is the register
1697    partition which specifies equivalences.  */
1698
1699 static int
1700 rename_equivalent_regs_in_insn (ptr, data)
1701      rtx *ptr;
1702      void* data;
1703 {
1704   rtx x = *ptr;
1705   partition reg_partition = (partition) data;
1706
1707   if (x == NULL_RTX)
1708     return 0;
1709
1710   switch (GET_CODE (x))
1711     {
1712     case SET:
1713       {
1714         rtx *destp = &SET_DEST (x);
1715         rtx dest = SET_DEST (x);
1716
1717         /* Subregs at word 0 are interesting.  Subregs at word != 0 are
1718            presumed to be part of a contiguous multi-word set sequence.  */
1719         while (GET_CODE (dest) == SUBREG
1720                && SUBREG_WORD (dest) == 0)
1721           {
1722             destp = &SUBREG_REG (dest);
1723             dest = SUBREG_REG (dest);
1724           }
1725
1726         if (GET_CODE (dest) == REG
1727             && REGNO (dest) >= FIRST_PSEUDO_REGISTER)
1728           {
1729             /* Got a pseudo; replace it.  */
1730             int regno = REGNO (dest);
1731             int new_regno = partition_find (reg_partition, regno);
1732             if (regno != new_regno)
1733               *destp = regno_reg_rtx[new_regno];
1734
1735             for_each_rtx (&SET_SRC (x), 
1736                           rename_equivalent_regs_in_insn, 
1737                           data);
1738             return -1;
1739           }
1740
1741         /* Otherwise, this was not an interesting destination.  Continue
1742            on, marking uses as normal.  */
1743         return 0;
1744       }
1745
1746     case REG:
1747       if (REGNO (x) >= FIRST_PSEUDO_REGISTER)
1748         {
1749           int regno = REGNO (x);
1750           int new_regno = partition_find (reg_partition, regno);
1751           if (regno != new_regno)
1752             {
1753               rtx new_reg = regno_reg_rtx[new_regno];
1754               if (GET_MODE (x) != GET_MODE (new_reg))
1755                 abort ();
1756               *ptr = new_reg;
1757             }
1758         }
1759       return -1;
1760
1761     case PHI:
1762       /* No need to rename the phi nodes.  We'll check equivalence
1763          when inserting copies.  */
1764       return -1;
1765
1766     default:
1767       /* Anything else, continue traversing.  */
1768       return 0;
1769     }
1770 }
1771
1772 /* Rename regs that are equivalent in REG_PARTITION.  */
1773
1774 static void
1775 rename_equivalent_regs (reg_partition)
1776      partition reg_partition;
1777 {
1778   int bb;
1779
1780   for (bb = n_basic_blocks; --bb >= 0; )
1781     {
1782       basic_block b = BASIC_BLOCK (bb);
1783       rtx next = b->head;
1784       rtx last = b->end;
1785       rtx insn;
1786
1787       do
1788         {
1789           insn = next;
1790           if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
1791             {
1792               for_each_rtx (&PATTERN (insn), 
1793                             rename_equivalent_regs_in_insn, 
1794                             reg_partition);
1795               for_each_rtx (&REG_NOTES (insn), 
1796                             rename_equivalent_regs_in_insn, 
1797                             reg_partition);
1798             }
1799
1800           next = NEXT_INSN (insn);
1801         }
1802       while (insn != last);
1803     }
1804 }
1805
1806 /* The main entry point for moving from SSA.  */
1807
1808 void
1809 convert_from_ssa()
1810 {
1811   int bb;
1812   partition reg_partition;
1813   rtx insns = get_insns ();
1814     
1815   /* Need global_live_at_{start,end} up to date.  */
1816   life_analysis (insns, NULL, 
1817           PROP_KILL_DEAD_CODE | PROP_SCAN_DEAD_CODE | PROP_DEATH_NOTES);
1818
1819   /* Figure out which regs in copies and phi nodes don't conflict and
1820      therefore can be coalesced.  */
1821   if (conservative_reg_partition)
1822     reg_partition = compute_conservative_reg_partition ();
1823   else
1824     reg_partition = compute_coalesced_reg_partition ();
1825
1826   rename_equivalent_regs (reg_partition);
1827
1828   /* Eliminate the PHI nodes.  */
1829   for (bb = n_basic_blocks; --bb >= 0; )
1830     {
1831       basic_block b = BASIC_BLOCK (bb);
1832       edge e;
1833
1834       for (e = b->pred; e; e = e->pred_next)
1835         if (e->src != ENTRY_BLOCK_PTR)
1836           eliminate_phi (e, reg_partition);
1837     }
1838
1839   partition_delete (reg_partition);
1840
1841   /* Actually delete the PHI nodes.  */
1842   for (bb = n_basic_blocks; --bb >= 0; )
1843     {
1844       rtx insn = BLOCK_HEAD (bb);
1845       int start = (GET_CODE (insn) != CODE_LABEL);
1846
1847       if (! start)
1848         insn = next_nonnote_insn (insn);
1849       while (PHI_NODE_P (insn))
1850         {
1851           /* If a phi node is the last insn in the block, there must
1852              have been nothing else.  Set the block end to the block
1853              head.  */
1854           if (insn == BLOCK_END (bb))
1855             BLOCK_END (bb) = BLOCK_HEAD (bb);
1856           insn = delete_insn (insn);
1857           if (GET_CODE (insn) == NOTE)
1858             insn = next_nonnote_insn (insn);
1859         }
1860       if (start)
1861         BLOCK_HEAD (bb) = insn;
1862     }
1863
1864   /* Commit all the copy nodes needed to convert out of SSA form.  */
1865   commit_edge_insertions ();
1866
1867   in_ssa_form = 0;
1868
1869   count_or_remove_death_notes (NULL, 1);
1870 }
1871
1872 /* Scan phi nodes in successors to BB.  For each such phi node that
1873    has a phi alternative value corresponding to BB, invoke FN.  FN
1874    is passed the entire phi node insn, the regno of the set
1875    destination, the regno of the phi argument corresponding to BB,
1876    and DATA.
1877
1878    If FN ever returns non-zero, stops immediately and returns this
1879    value.  Otherwise, returns zero.  */
1880
1881 int
1882 for_each_successor_phi (bb, fn, data)
1883      basic_block bb;
1884      successor_phi_fn fn;
1885      void *data;
1886 {
1887   edge e;
1888   
1889   if (bb == EXIT_BLOCK_PTR)
1890     return 0;
1891
1892   /* Scan outgoing edges.  */
1893   for (e = bb->succ; e != NULL; e = e->succ_next)
1894     {
1895       rtx insn;
1896
1897       basic_block successor = e->dest;
1898       if (successor == ENTRY_BLOCK_PTR 
1899           || successor == EXIT_BLOCK_PTR)
1900         continue;
1901
1902       /* Advance to the first non-label insn of the successor block.  */
1903       insn = successor->head;
1904       while (insn != NULL 
1905              && (GET_CODE (insn) == CODE_LABEL
1906                  || GET_CODE (insn) == NOTE))
1907         insn = NEXT_INSN (insn);
1908
1909       if (insn == NULL)
1910         continue;
1911
1912       /* Scan phi nodes in the successor.  */
1913       for ( ; PHI_NODE_P (insn); insn = NEXT_INSN (insn))
1914         {
1915           int result;
1916           rtx phi_set = PATTERN (insn);
1917           rtx *alternative = phi_alternative (phi_set, bb->index);
1918           rtx phi_src;
1919           
1920           /* This phi function may not have an alternative
1921              corresponding to the incoming edge, indicating the
1922              assigned variable is not defined along the edge.  */
1923           if (alternative == NULL)
1924             continue;
1925           phi_src = *alternative;
1926
1927           /* Invoke the callback.  */
1928           result = (*fn) (insn, REGNO (SET_DEST (phi_set)), 
1929                           REGNO (phi_src), data);
1930
1931           /* Terminate if requested.  */
1932           if (result != 0)
1933             return result;
1934         }
1935     }
1936
1937   return 0;
1938 }