xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/hsa-regalloc.c (revision e6c7e151de239c49d2e38720a061ed9d1fa99309)
1 /* HSAIL IL Register allocation and out-of-SSA.
2    Copyright (C) 2013-2017 Free Software Foundation, Inc.
3    Contributed by Michael Matz <matz@suse.de>
4 
5 This file is part of GCC.
6 
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
11 
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
20 
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "is-a.h"
26 #include "vec.h"
27 #include "tree.h"
28 #include "dominance.h"
29 #include "cfg.h"
30 #include "cfganal.h"
31 #include "function.h"
32 #include "bitmap.h"
33 #include "dumpfile.h"
34 #include "cgraph.h"
35 #include "print-tree.h"
36 #include "cfghooks.h"
37 #include "symbol-summary.h"
38 #include "hsa-common.h"
39 
40 
41 /* Process a PHI node PHI of basic block BB as a part of naive out-f-ssa.  */
42 
43 static void
44 naive_process_phi (hsa_insn_phi *phi)
45 {
46   unsigned count = phi->operand_count ();
47   for (unsigned i = 0; i < count; i++)
48     {
49       gcc_checking_assert (phi->get_op (i));
50       hsa_op_base *op = phi->get_op (i);
51       hsa_bb *hbb;
52       edge e;
53 
54       if (!op)
55 	break;
56 
57       e = EDGE_PRED (phi->m_bb, i);
58       if (single_succ_p (e->src))
59 	hbb = hsa_bb_for_bb (e->src);
60       else
61 	{
62 	  basic_block old_dest = e->dest;
63 	  hbb = hsa_init_new_bb (split_edge (e));
64 
65 	  /* If switch insn used this edge, fix jump table.  */
66 	  hsa_bb *source = hsa_bb_for_bb (e->src);
67 	  hsa_insn_sbr *sbr;
68 	  if (source->m_last_insn
69 	      && (sbr = dyn_cast <hsa_insn_sbr *> (source->m_last_insn)))
70 	    sbr->replace_all_labels (old_dest, hbb->m_bb);
71 	}
72 
73       hsa_build_append_simple_mov (phi->m_dest, op, hbb);
74     }
75 }
76 
77 /* Naive out-of SSA.  */
78 
79 static void
80 naive_outof_ssa (void)
81 {
82   basic_block bb;
83 
84   hsa_cfun->m_in_ssa = false;
85 
86   FOR_ALL_BB_FN (bb, cfun)
87   {
88     hsa_bb *hbb = hsa_bb_for_bb (bb);
89     hsa_insn_phi *phi;
90 
91     for (phi = hbb->m_first_phi;
92 	 phi;
93 	 phi = phi->m_next ? as_a <hsa_insn_phi *> (phi->m_next) : NULL)
94       naive_process_phi (phi);
95 
96     /* Zap PHI nodes, they will be deallocated when everything else will.  */
97     hbb->m_first_phi = NULL;
98     hbb->m_last_phi = NULL;
99   }
100 }
101 
102 /* Return register class number for the given HSA TYPE.  0 means the 'c' one
103    bit register class, 1 means 's' 32 bit class, 2 stands for 'd' 64 bit class
104    and 3 for 'q' 128 bit class.  */
105 
106 static int
107 m_reg_class_for_type (BrigType16_t type)
108 {
109   switch (type)
110     {
111     case BRIG_TYPE_B1:
112       return 0;
113 
114     case BRIG_TYPE_U8:
115     case BRIG_TYPE_U16:
116     case BRIG_TYPE_U32:
117     case BRIG_TYPE_S8:
118     case BRIG_TYPE_S16:
119     case BRIG_TYPE_S32:
120     case BRIG_TYPE_F16:
121     case BRIG_TYPE_F32:
122     case BRIG_TYPE_B8:
123     case BRIG_TYPE_B16:
124     case BRIG_TYPE_B32:
125     case BRIG_TYPE_U8X4:
126     case BRIG_TYPE_S8X4:
127     case BRIG_TYPE_U16X2:
128     case BRIG_TYPE_S16X2:
129     case BRIG_TYPE_F16X2:
130       return 1;
131 
132     case BRIG_TYPE_U64:
133     case BRIG_TYPE_S64:
134     case BRIG_TYPE_F64:
135     case BRIG_TYPE_B64:
136     case BRIG_TYPE_U8X8:
137     case BRIG_TYPE_S8X8:
138     case BRIG_TYPE_U16X4:
139     case BRIG_TYPE_S16X4:
140     case BRIG_TYPE_F16X4:
141     case BRIG_TYPE_U32X2:
142     case BRIG_TYPE_S32X2:
143     case BRIG_TYPE_F32X2:
144       return 2;
145 
146     case BRIG_TYPE_B128:
147     case BRIG_TYPE_U8X16:
148     case BRIG_TYPE_S8X16:
149     case BRIG_TYPE_U16X8:
150     case BRIG_TYPE_S16X8:
151     case BRIG_TYPE_F16X8:
152     case BRIG_TYPE_U32X4:
153     case BRIG_TYPE_U64X2:
154     case BRIG_TYPE_S32X4:
155     case BRIG_TYPE_S64X2:
156     case BRIG_TYPE_F32X4:
157     case BRIG_TYPE_F64X2:
158       return 3;
159 
160     default:
161       gcc_unreachable ();
162     }
163 }
164 
165 /* If the Ith operands of INSN is or contains a register (in an address),
166    return the address of that register operand.  If not return NULL.  */
167 
168 static hsa_op_reg **
169 insn_reg_addr (hsa_insn_basic *insn, int i)
170 {
171   hsa_op_base *op = insn->get_op (i);
172   if (!op)
173     return NULL;
174   hsa_op_reg *reg = dyn_cast <hsa_op_reg *> (op);
175   if (reg)
176     return (hsa_op_reg **) insn->get_op_addr (i);
177   hsa_op_address *addr = dyn_cast <hsa_op_address *> (op);
178   if (addr && addr->m_reg)
179     return &addr->m_reg;
180   return NULL;
181 }
182 
183 struct m_reg_class_desc
184 {
185   unsigned next_avail, max_num;
186   unsigned used_num, max_used;
187   uint64_t used[2];
188   char cl_char;
189 };
190 
191 /* Rewrite the instructions in BB to observe spilled live ranges.
192    CLASSES is the global register class state.  */
193 
194 static void
195 rewrite_code_bb (basic_block bb, struct m_reg_class_desc *classes)
196 {
197   hsa_bb *hbb = hsa_bb_for_bb (bb);
198   hsa_insn_basic *insn, *next_insn;
199 
200   for (insn = hbb->m_first_insn; insn; insn = next_insn)
201     {
202       next_insn = insn->m_next;
203       unsigned count = insn->operand_count ();
204       for (unsigned i = 0; i < count; i++)
205 	{
206 	  gcc_checking_assert (insn->get_op (i));
207 	  hsa_op_reg **regaddr = insn_reg_addr (insn, i);
208 
209 	  if (regaddr)
210 	    {
211 	      hsa_op_reg *reg = *regaddr;
212 	      if (reg->m_reg_class)
213 		continue;
214 	      gcc_assert (reg->m_spill_sym);
215 
216 	      int cl = m_reg_class_for_type (reg->m_type);
217 	      hsa_op_reg *tmp, *tmp2;
218 	      if (insn->op_output_p (i))
219 		tmp = hsa_spill_out (insn, reg, &tmp2);
220 	      else
221 		tmp = hsa_spill_in (insn, reg, &tmp2);
222 
223 	      *regaddr = tmp;
224 
225 	      tmp->m_reg_class = classes[cl].cl_char;
226 	      tmp->m_hard_num = (char) (classes[cl].max_num + i);
227 	      if (tmp2)
228 		{
229 		  gcc_assert (cl == 0);
230 		  tmp2->m_reg_class = classes[1].cl_char;
231 		  tmp2->m_hard_num = (char) (classes[1].max_num + i);
232 		}
233 	    }
234 	}
235     }
236 }
237 
238 /* Dump current function to dump file F, with info specific
239    to register allocation.  */
240 
241 void
242 dump_hsa_cfun_regalloc (FILE *f)
243 {
244   basic_block bb;
245 
246   fprintf (f, "\nHSAIL IL for %s\n", hsa_cfun->m_name);
247 
248   FOR_ALL_BB_FN (bb, cfun)
249   {
250     hsa_bb *hbb = (struct hsa_bb *) bb->aux;
251     bitmap_print (dump_file, hbb->m_livein, "m_livein  ", "\n");
252     dump_hsa_bb (f, hbb);
253     bitmap_print (dump_file, hbb->m_liveout, "m_liveout ", "\n");
254   }
255 }
256 
257 /* Given the global register allocation state CLASSES and a
258    register REG, try to give it a hardware register.  If successful,
259    store that hardreg in REG and return it, otherwise return -1.
260    Also changes CLASSES to accommodate for the allocated register.  */
261 
262 static int
263 try_alloc_reg (struct m_reg_class_desc *classes, hsa_op_reg *reg)
264 {
265   int cl = m_reg_class_for_type (reg->m_type);
266   int ret = -1;
267   if (classes[1].used_num + classes[2].used_num * 2 + classes[3].used_num * 4
268       >= 128 - 5)
269     return -1;
270   if (classes[cl].used_num < classes[cl].max_num)
271     {
272       unsigned int i;
273       classes[cl].used_num++;
274       if (classes[cl].used_num > classes[cl].max_used)
275 	classes[cl].max_used = classes[cl].used_num;
276       for (i = 0; i < classes[cl].used_num; i++)
277 	if (! (classes[cl].used[i / 64] & (((uint64_t)1) << (i & 63))))
278 	  break;
279       ret = i;
280       classes[cl].used[i / 64] |= (((uint64_t)1) << (i & 63));
281       reg->m_reg_class = classes[cl].cl_char;
282       reg->m_hard_num = i;
283     }
284   return ret;
285 }
286 
287 /* Free up hardregs used by REG, into allocation state CLASSES.  */
288 
289 static void
290 free_reg (struct m_reg_class_desc *classes, hsa_op_reg *reg)
291 {
292   int cl = m_reg_class_for_type (reg->m_type);
293   int ret = reg->m_hard_num;
294   gcc_assert (reg->m_reg_class == classes[cl].cl_char);
295   classes[cl].used_num--;
296   classes[cl].used[ret / 64] &= ~(((uint64_t)1) << (ret & 63));
297 }
298 
299 /* Note that the live range for REG ends at least at END.  */
300 
301 static void
302 note_lr_end (hsa_op_reg *reg, int end)
303 {
304   if (reg->m_lr_end < end)
305     reg->m_lr_end = end;
306 }
307 
308 /* Note that the live range for REG starts at least at BEGIN.  */
309 
310 static void
311 note_lr_begin (hsa_op_reg *reg, int begin)
312 {
313   if (reg->m_lr_begin > begin)
314     reg->m_lr_begin = begin;
315 }
316 
317 /* Given two registers A and B, return -1, 0 or 1 if A's live range
318    starts before, at or after B's live range.  */
319 
320 static int
321 cmp_begin (const void *a, const void *b)
322 {
323   const hsa_op_reg * const *rega = (const hsa_op_reg * const *)a;
324   const hsa_op_reg * const *regb = (const hsa_op_reg * const *)b;
325   int ret;
326   if (rega == regb)
327     return 0;
328   ret = (*rega)->m_lr_begin - (*regb)->m_lr_begin;
329   if (ret)
330     return ret;
331   return ((*rega)->m_order - (*regb)->m_order);
332 }
333 
334 /* Given two registers REGA and REGB, return true if REGA's
335    live range ends after REGB's.  This results in a sorting order
336    with earlier end points at the end.  */
337 
338 static bool
339 cmp_end (hsa_op_reg * const &rega, hsa_op_reg * const &regb)
340 {
341   int ret;
342   if (rega == regb)
343     return false;
344   ret = (regb)->m_lr_end - (rega)->m_lr_end;
345   if (ret)
346     return ret < 0;
347   return (((regb)->m_order - (rega)->m_order)) < 0;
348 }
349 
350 /* Expire all old intervals in ACTIVE (a per-regclass vector),
351    that is, those that end before the interval REG starts.  Give
352    back resources freed so into the state CLASSES.  */
353 
354 static void
355 expire_old_intervals (hsa_op_reg *reg, vec<hsa_op_reg*> *active,
356 		      struct m_reg_class_desc *classes)
357 {
358   for (int i = 0; i < 4; i++)
359     while (!active[i].is_empty ())
360       {
361 	hsa_op_reg *a = active[i].pop ();
362 	if (a->m_lr_end > reg->m_lr_begin)
363 	  {
364 	    active[i].quick_push (a);
365 	    break;
366 	  }
367 	free_reg (classes, a);
368       }
369 }
370 
371 /* The interval REG didn't get a hardreg.  Spill it or one of those
372    from ACTIVE (if the latter, then REG will become allocated to the
373    hardreg that formerly was used by it).  */
374 
375 static void
376 spill_at_interval (hsa_op_reg *reg, vec<hsa_op_reg*> *active)
377 {
378   int cl = m_reg_class_for_type (reg->m_type);
379   gcc_assert (!active[cl].is_empty ());
380   hsa_op_reg *cand = active[cl][0];
381   if (cand->m_lr_end > reg->m_lr_end)
382     {
383       reg->m_reg_class = cand->m_reg_class;
384       reg->m_hard_num = cand->m_hard_num;
385       active[cl].ordered_remove (0);
386       unsigned place = active[cl].lower_bound (reg, cmp_end);
387       active[cl].quick_insert (place, reg);
388     }
389   else
390     cand = reg;
391 
392   gcc_assert (!cand->m_spill_sym);
393   BrigType16_t type = cand->m_type;
394   if (type == BRIG_TYPE_B1)
395     type = BRIG_TYPE_U8;
396   cand->m_reg_class = 0;
397   cand->m_spill_sym = hsa_get_spill_symbol (type);
398   cand->m_spill_sym->m_name_number = cand->m_order;
399 }
400 
401 /* Given the global register state CLASSES allocate all HSA virtual
402    registers either to hardregs or to a spill symbol.  */
403 
404 static void
405 linear_scan_regalloc (struct m_reg_class_desc *classes)
406 {
407   /* Compute liveness.  */
408   bool changed;
409   int i, n;
410   int insn_order;
411   int *bbs = XNEWVEC (int, n_basic_blocks_for_fn (cfun));
412   bitmap work = BITMAP_ALLOC (NULL);
413   vec<hsa_op_reg*> ind2reg = vNULL;
414   vec<hsa_op_reg*> active[4] = {vNULL, vNULL, vNULL, vNULL};
415   hsa_insn_basic *m_last_insn;
416 
417   /* We will need the reverse post order for linearization,
418      and the post order for liveness analysis, which is the same
419      backward.  */
420   n = pre_and_rev_post_order_compute (NULL, bbs, true);
421   ind2reg.safe_grow_cleared (hsa_cfun->m_reg_count);
422 
423   /* Give all instructions a linearized number, at the same time
424      build a mapping from register index to register.  */
425   insn_order = 1;
426   for (i = 0; i < n; i++)
427     {
428       basic_block bb = BASIC_BLOCK_FOR_FN (cfun, bbs[i]);
429       hsa_bb *hbb = hsa_bb_for_bb (bb);
430       hsa_insn_basic *insn;
431       for (insn = hbb->m_first_insn; insn; insn = insn->m_next)
432 	{
433 	  unsigned opi;
434 	  insn->m_number = insn_order++;
435 	  for (opi = 0; opi < insn->operand_count (); opi++)
436 	    {
437 	      gcc_checking_assert (insn->get_op (opi));
438 	      hsa_op_reg **regaddr = insn_reg_addr (insn, opi);
439 	      if (regaddr)
440 		ind2reg[(*regaddr)->m_order] = *regaddr;
441 	    }
442 	}
443     }
444 
445   /* Initialize all live ranges to [after-end, 0).  */
446   for (i = 0; i < hsa_cfun->m_reg_count; i++)
447     if (ind2reg[i])
448       ind2reg[i]->m_lr_begin = insn_order, ind2reg[i]->m_lr_end = 0;
449 
450   /* Classic liveness analysis, as long as something changes:
451        m_liveout is union (m_livein of successors)
452        m_livein is m_liveout minus defs plus uses.  */
453   do
454     {
455       changed = false;
456       for (i = n - 1; i >= 0; i--)
457 	{
458 	  edge e;
459 	  edge_iterator ei;
460 	  basic_block bb = BASIC_BLOCK_FOR_FN (cfun, bbs[i]);
461 	  hsa_bb *hbb = hsa_bb_for_bb (bb);
462 
463 	  /* Union of successors m_livein (or empty if none).  */
464 	  bool first = true;
465 	  FOR_EACH_EDGE (e, ei, bb->succs)
466 	    if (e->dest != EXIT_BLOCK_PTR_FOR_FN (cfun))
467 	      {
468 		hsa_bb *succ = hsa_bb_for_bb (e->dest);
469 		if (first)
470 		  {
471 		    bitmap_copy (work, succ->m_livein);
472 		    first = false;
473 		  }
474 		else
475 		  bitmap_ior_into (work, succ->m_livein);
476 	      }
477 	  if (first)
478 	    bitmap_clear (work);
479 
480 	  bitmap_copy (hbb->m_liveout, work);
481 
482 	  /* Remove defs, include uses in a backward insn walk.  */
483 	  hsa_insn_basic *insn;
484 	  for (insn = hbb->m_last_insn; insn; insn = insn->m_prev)
485 	    {
486 	      unsigned opi;
487 	      unsigned ndefs = insn->input_count ();
488 	      for (opi = 0; opi < ndefs && insn->get_op (opi); opi++)
489 		{
490 		  gcc_checking_assert (insn->get_op (opi));
491 		  hsa_op_reg **regaddr = insn_reg_addr (insn, opi);
492 		  if (regaddr)
493 		    bitmap_clear_bit (work, (*regaddr)->m_order);
494 		}
495 	      for (; opi < insn->operand_count (); opi++)
496 		{
497 		  gcc_checking_assert (insn->get_op (opi));
498 		  hsa_op_reg **regaddr = insn_reg_addr (insn, opi);
499 		  if (regaddr)
500 		    bitmap_set_bit (work, (*regaddr)->m_order);
501 		}
502 	    }
503 
504 	  /* Note if that changed something.  */
505 	  if (bitmap_ior_into (hbb->m_livein, work))
506 	    changed = true;
507 	}
508     }
509   while (changed);
510 
511   /* Make one pass through all instructions in linear order,
512      noting and merging possible live range start and end points.  */
513   m_last_insn = NULL;
514   for (i = n - 1; i >= 0; i--)
515     {
516       basic_block bb = BASIC_BLOCK_FOR_FN (cfun, bbs[i]);
517       hsa_bb *hbb = hsa_bb_for_bb (bb);
518       hsa_insn_basic *insn;
519       int after_end_number;
520       unsigned bit;
521       bitmap_iterator bi;
522 
523       if (m_last_insn)
524 	after_end_number = m_last_insn->m_number;
525       else
526 	after_end_number = insn_order;
527       /* Everything live-out in this BB has at least an end point
528 	 after us.  */
529       EXECUTE_IF_SET_IN_BITMAP (hbb->m_liveout, 0, bit, bi)
530 	note_lr_end (ind2reg[bit], after_end_number);
531 
532       for (insn = hbb->m_last_insn; insn; insn = insn->m_prev)
533 	{
534 	  unsigned opi;
535 	  unsigned ndefs = insn->input_count ();
536 	  for (opi = 0; opi < insn->operand_count (); opi++)
537 	    {
538 	      gcc_checking_assert (insn->get_op (opi));
539 	      hsa_op_reg **regaddr = insn_reg_addr (insn, opi);
540 	      if (regaddr)
541 		{
542 		  hsa_op_reg *reg = *regaddr;
543 		  if (opi < ndefs)
544 		    note_lr_begin (reg, insn->m_number);
545 		  else
546 		    note_lr_end (reg, insn->m_number);
547 		}
548 	    }
549 	}
550 
551       /* Everything live-in in this BB has a start point before
552 	 our first insn.  */
553       int before_start_number;
554       if (hbb->m_first_insn)
555 	before_start_number = hbb->m_first_insn->m_number;
556       else
557 	before_start_number = after_end_number;
558       before_start_number--;
559       EXECUTE_IF_SET_IN_BITMAP (hbb->m_livein, 0, bit, bi)
560 	note_lr_begin (ind2reg[bit], before_start_number);
561 
562       if (hbb->m_first_insn)
563 	m_last_insn = hbb->m_first_insn;
564     }
565 
566   for (i = 0; i < hsa_cfun->m_reg_count; i++)
567     if (ind2reg[i])
568       {
569 	/* All regs that have still their start at after all code actually
570 	   are defined at the start of the routine (prologue).  */
571 	if (ind2reg[i]->m_lr_begin == insn_order)
572 	  ind2reg[i]->m_lr_begin = 0;
573 	/* All regs that have no use but a def will have lr_end == 0,
574 	   they are actually live from def until after the insn they are
575 	   defined in.  */
576 	if (ind2reg[i]->m_lr_end == 0)
577 	  ind2reg[i]->m_lr_end = ind2reg[i]->m_lr_begin + 1;
578       }
579 
580   /* Sort all intervals by increasing start point.  */
581   gcc_assert (ind2reg.length () == (size_t) hsa_cfun->m_reg_count);
582 
583   if (flag_checking)
584     for (unsigned i = 0; i < ind2reg.length (); i++)
585       gcc_assert (ind2reg[i]);
586 
587   ind2reg.qsort (cmp_begin);
588   for (i = 0; i < 4; i++)
589     active[i].reserve_exact (hsa_cfun->m_reg_count);
590 
591   /* Now comes the linear scan allocation.  */
592   for (i = 0; i < hsa_cfun->m_reg_count; i++)
593     {
594       hsa_op_reg *reg = ind2reg[i];
595       if (!reg)
596 	continue;
597       expire_old_intervals (reg, active, classes);
598       int cl = m_reg_class_for_type (reg->m_type);
599       if (try_alloc_reg (classes, reg) >= 0)
600 	{
601 	  unsigned place = active[cl].lower_bound (reg, cmp_end);
602 	  active[cl].quick_insert (place, reg);
603 	}
604       else
605 	spill_at_interval (reg, active);
606 
607       /* Some interesting dumping as we go.  */
608       if (dump_file && (dump_flags & TDF_DETAILS))
609 	{
610 	  fprintf (dump_file, "  reg%d: [%5d, %5d)->",
611 		   reg->m_order, reg->m_lr_begin, reg->m_lr_end);
612 	  if (reg->m_reg_class)
613 	    fprintf (dump_file, "$%c%i", reg->m_reg_class, reg->m_hard_num);
614 	  else
615 	    fprintf (dump_file, "[%%__%s_%i]",
616 		     hsa_seg_name (reg->m_spill_sym->m_segment),
617 		     reg->m_spill_sym->m_name_number);
618 	  for (int cl = 0; cl < 4; cl++)
619 	    {
620 	      bool first = true;
621 	      hsa_op_reg *r;
622 	      fprintf (dump_file, " {");
623 	      for (int j = 0; active[cl].iterate (j, &r); j++)
624 		if (first)
625 		  {
626 		    fprintf (dump_file, "%d", r->m_order);
627 		    first = false;
628 		  }
629 		else
630 		  fprintf (dump_file, ", %d", r->m_order);
631 	      fprintf (dump_file, "}");
632 	    }
633 	  fprintf (dump_file, "\n");
634 	}
635     }
636 
637   BITMAP_FREE (work);
638   free (bbs);
639 
640   if (dump_file && (dump_flags & TDF_DETAILS))
641     {
642       fprintf (dump_file, "------- After liveness: -------\n");
643       dump_hsa_cfun_regalloc (dump_file);
644       fprintf (dump_file, "  ----- Intervals:\n");
645       for (i = 0; i < hsa_cfun->m_reg_count; i++)
646 	{
647 	  hsa_op_reg *reg = ind2reg[i];
648 	  if (!reg)
649 	    continue;
650 	  fprintf (dump_file, "  reg%d: [%5d, %5d)->", reg->m_order,
651 		   reg->m_lr_begin, reg->m_lr_end);
652 	  if (reg->m_reg_class)
653 	    fprintf (dump_file, "$%c%i\n", reg->m_reg_class, reg->m_hard_num);
654 	  else
655 	    fprintf (dump_file, "[%%__%s_%i]\n",
656 		     hsa_seg_name (reg->m_spill_sym->m_segment),
657 		     reg->m_spill_sym->m_name_number);
658 	}
659     }
660 
661   for (i = 0; i < 4; i++)
662     active[i].release ();
663   ind2reg.release ();
664 }
665 
666 /* Entry point for register allocation.  */
667 
668 static void
669 regalloc (void)
670 {
671   basic_block bb;
672   m_reg_class_desc classes[4];
673 
674   /* If there are no registers used in the function, exit right away.  */
675   if (hsa_cfun->m_reg_count == 0)
676     return;
677 
678   memset (classes, 0, sizeof (classes));
679   classes[0].next_avail = 0;
680   classes[0].max_num = 7;
681   classes[0].cl_char = 'c';
682   classes[1].cl_char = 's';
683   classes[2].cl_char = 'd';
684   classes[3].cl_char = 'q';
685 
686   for (int i = 1; i < 4; i++)
687     {
688       classes[i].next_avail = 0;
689       classes[i].max_num = 20;
690     }
691 
692   linear_scan_regalloc (classes);
693 
694   FOR_ALL_BB_FN (bb, cfun)
695     rewrite_code_bb (bb, classes);
696 }
697 
698 /* Out of SSA and register allocation on HSAIL IL.  */
699 
700 void
701 hsa_regalloc (void)
702 {
703   hsa_cfun->update_dominance ();
704   naive_outof_ssa ();
705 
706   if (dump_file && (dump_flags & TDF_DETAILS))
707     {
708       fprintf (dump_file, "------- After out-of-SSA: -------\n");
709       dump_hsa_cfun (dump_file);
710     }
711 
712   regalloc ();
713 
714   if (dump_file && (dump_flags & TDF_DETAILS))
715     {
716       fprintf (dump_file, "------- After register allocation: -------\n");
717       dump_hsa_cfun (dump_file);
718     }
719 }
720