789017afcdc6dce27119650ed46f69d5f023a866
[libfirm] / ir / be / bechordal.c
1 /**
2  * Chordal register allocation.
3  * @author Sebastian Hack
4  * @date 8.12.2004
5  *
6  * Copyright (C) Universitaet Karlsruhe
7  * Released under the GPL
8  */
9
10 #ifdef HAVE_CONFIG_H
11 #include "config.h"
12 #endif
13
14 #ifdef HAVE_MALLOC_H
15 #include <malloc.h>
16 #endif
17
18 #ifdef HAVE_ALLOCA_H
19 #include <alloca.h>
20 #endif
21
22 #include <ctype.h>
23
24 #include "obst.h"
25 #include "pset.h"
26 #include "list.h"
27 #include "bitset.h"
28 #include "iterator.h"
29 #include "bipartite.h"
30
31 #include "irmode_t.h"
32 #include "irgraph_t.h"
33 #include "irprintf_t.h"
34 #include "irgwalk.h"
35 #include "irdump.h"
36 #include "irdom.h"
37 #include "debug.h"
38 #include "xmalloc.h"
39
40 #include "beutil.h"
41 #include "besched.h"
42 #include "benumb_t.h"
43 #include "besched_t.h"
44 #include "belive_t.h"
45 #include "benode_t.h"
46 #include "bearch.h"
47 #include "beifg.h"
48
49 #include "bechordal_t.h"
50 #include "bechordal_draw.h"
51
52 #define DBG_LEVEL SET_LEVEL_0
53 #define DBG_LEVEL_CHECK SET_LEVEL_0
54
55 #define NO_COLOR (-1)
56
57 #define DUMP_INTERVALS
58
59 typedef struct _be_chordal_alloc_env_t {
60         be_chordal_env_t *chordal_env;
61
62         pset *pre_colored;    /**< Set of precolored nodes. */
63         bitset_t *live;                         /**< A liveness bitset. */
64         bitset_t *colors;                       /**< The color mask. */
65         bitset_t *in_colors;        /**< Colors used by live in values. */
66         int colors_n;               /**< The number of colors. */
67 } be_chordal_alloc_env_t;
68
69 #include "fourcc.h"
70
71 /* Make a fourcc for border checking. */
72 #define BORDER_FOURCC                           FOURCC('B', 'O', 'R', 'D')
73
74 static void check_border_list(struct list_head *head)
75 {
76   border_t *x;
77   list_for_each_entry(border_t, x, head, list) {
78     assert(x->magic == BORDER_FOURCC);
79   }
80 }
81
82 static void check_heads(be_chordal_env_t *env)
83 {
84   pmap_entry *ent;
85   for(ent = pmap_first(env->border_heads); ent; ent = pmap_next(env->border_heads)) {
86     /* ir_printf("checking border list of block %+F\n", ent->key); */
87     check_border_list(ent->value);
88   }
89 }
90
91
92 /**
93  * Add an interval border to the list of a block's list
94  * of interval border.
95  * @note You always have to create the use before the def.
96  * @param env The environment.
97  * @param head The list head to enqueue the borders.
98  * @param irn The node (value) the border belongs to.
99  * @param pressure The pressure at this point in time.
100  * @param step A time step for the border.
101  * @param is_def Is the border a use or a def.
102  * @return The created border.
103  */
104 static INLINE border_t *border_add(be_chordal_env_t *env, struct list_head *head,
105                         ir_node *irn, unsigned step, unsigned pressure,
106                         unsigned is_def, unsigned is_real)
107 {
108         border_t *b;
109
110         if(!is_def) {
111                 border_t *def;
112
113                 b = obstack_alloc(&env->obst, sizeof(*b));
114
115                 /* also allocate the def and tie it to the use. */
116                 def = obstack_alloc(&env->obst, sizeof(*def));
117                 memset(def, 0, sizeof(*def));
118                 b->other_end = def;
119                 def->other_end = b;
120
121                 /*
122                  * Set the link field of the irn to the def.
123                  * This strongly relies on the fact, that the use is always
124                  * made before the def.
125                  */
126                 set_irn_link(irn, def);
127
128                 b->magic = BORDER_FOURCC;
129                 def->magic = BORDER_FOURCC;
130         }
131
132         /*
133          * If the def is encountered, the use was made and so was the
134          * the def node (see the code above). It was placed into the
135          * link field of the irn, so we can get it there.
136          */
137         else {
138                 b = get_irn_link(irn);
139
140                 assert(b && b->magic == BORDER_FOURCC && "Illegal border encountered");
141         }
142
143         b->pressure = pressure;
144         b->is_def = is_def;
145         b->is_real = is_real;
146         b->irn = irn;
147         b->step = step;
148         list_add_tail(&b->list, head);
149         DBG((env->dbg, LEVEL_5, "\t\t%s adding %+F, step: %d\n", is_def ? "def" : "use", irn, step));
150
151
152         return b;
153 }
154
155 /**
156  * Check, if an irn is of the register class currently under processing.
157  * @param env The chordal environment.
158  * @param irn The node.
159  * @return 1, if the node is of that register class, 0 if not.
160  */
161 static INLINE int has_reg_class(const be_chordal_env_t *env, const ir_node *irn)
162 {
163         // return arch_irn_has_reg_class(env->main_env->arch_env, irn, -1, env->cls);
164         return arch_irn_consider_in_reg_alloc(env->birg->main_env->arch_env, env->cls, irn);
165 }
166
167 #define has_limited_constr(req, irn) \
168         (arch_get_register_req(arch_env, (req), irn, -1) && (req)->type == arch_register_req_type_limited)
169
170 typedef struct _operand_t operand_t;
171
172 struct _operand_t {
173         ir_node *irn;
174         ir_node *carrier;
175         operand_t *partner;
176         int pos;
177         arch_register_req_t req;
178 };
179
180 typedef struct {
181         operand_t *ops;
182         int n_ops;
183         int use_start;
184         ir_node *next_insn;
185         unsigned in_constraints  : 1;
186         unsigned out_constraints : 1;
187         unsigned has_constraints : 1;
188         unsigned pre_colored     : 1;
189 } insn_t;
190
191 static insn_t *scan_insn(be_chordal_env_t *env, ir_node *irn, struct obstack *obst)
192 {
193         const arch_env_t *arch_env = env->birg->main_env->arch_env;
194         operand_t o;
195         insn_t *insn;
196         int i, n;
197         int pre_colored = 0;
198
199         insn = obstack_alloc(obst, sizeof(insn[0]));
200         memset(insn, 0, sizeof(insn[0]));
201
202         insn->next_insn = sched_next(irn);
203         if(get_irn_mode(irn) == mode_T) {
204                 ir_node *p;
205
206                 for(p = sched_next(irn); is_Proj(p); p = sched_next(p)) {
207                         if(arch_irn_consider_in_reg_alloc(arch_env, env->cls, p)) {
208                                 o.carrier = p;
209                                 o.irn     = irn;
210                                 o.pos     = -(get_Proj_proj(p) + 1);
211                                 o.partner = NULL;
212                                 arch_get_register_req(arch_env, &o.req, p, -1);
213                                 obstack_grow(obst, &o, sizeof(o));
214                                 insn->n_ops++;
215                                 insn->out_constraints |= arch_register_req_is(&o.req, limited);
216                                 pre_colored += arch_get_irn_register(arch_env, p) != NULL;
217                         }
218                 }
219
220                 insn->next_insn = p;
221         }
222
223         else if(arch_irn_consider_in_reg_alloc(arch_env, env->cls, irn)) {
224                 o.carrier = irn;
225                 o.irn     = irn;
226                 o.pos     = -1;
227                 o.partner = NULL;
228                 arch_get_register_req(arch_env, &o.req, irn, -1);
229                 obstack_grow(obst, &o, sizeof(o));
230                 insn->n_ops++;
231                 insn->out_constraints |= arch_register_req_is(&o.req, limited);
232                 pre_colored += arch_get_irn_register(arch_env, irn) != NULL;
233         }
234
235         insn->pre_colored = pre_colored == insn->n_ops;
236         insn->use_start   = insn->n_ops;
237
238         for(i = 0, n = get_irn_arity(irn); i < n; ++i) {
239                 ir_node *op = get_irn_n(irn, i);
240
241                 if(arch_irn_consider_in_reg_alloc(arch_env, env->cls, op)) {
242                         o.carrier = op;
243                         o.irn     = irn;
244                         o.pos     = i;
245                         o.partner = NULL;
246                         arch_get_register_req(arch_env, &o.req, irn, i);
247                         obstack_grow(obst, &o, sizeof(o));
248                         insn->n_ops++;
249                         insn->in_constraints |= arch_register_req_is(&o.req, limited);
250                 }
251         }
252
253         insn->has_constraints = insn->in_constraints | insn->out_constraints;
254         insn->ops = obstack_finish(obst);
255         return insn;
256 }
257
258 #if 0
259 static operand_t *find_unpaired_use(insn_t *insn, const operand_t *op, int can_be_constrained)
260 {
261         int i;
262         operand_t *res = NULL;
263
264         for(i = insn->use_start; i < insn->n_ops; ++i) {
265                 operand_t *op = &insn->ops[i];
266                 int has_constraint = arch_register_req_is(&op->req, limited);
267
268                 if(!values_interfere(op->carrier, op->irn) && !op->partner) {
269
270                         if(!has_constraint || can_be_constrained) {
271                                 if(arch_register_req_is(&op->req, should_be_same) && op->req.other_same == op->carrier)
272                                         return op;
273                                 else
274                                         res = op;
275                         }
276                 }
277         }
278
279         return res;
280 }
281
282 static void pair_up_operands(insn_t *insn)
283 {
284         firm_dbg_module_t *dbg = firm_dbg_register("firm.be.chordal.constr");
285         int i;
286
287         for(i = 0; i < insn->use_start; ++i) {
288                 operand_t *op      = &insn->ops[i];
289                 int has_constraint = arch_register_req_is(&op->req, limited);
290                 operand_t *partner = find_unpaired_use(insn, op, !has_constraint);
291
292                 if(partner) {
293                         op->partner = partner;
294                         partner->partner = op;
295                 }
296         }
297 }
298 #endif
299
300 static void add_possible_partners(insn_t *insn, int curr, const arch_register_t *out_reg, bipartite_t *bp, int can_be_constrained)
301 {
302         bitset_t *bs;
303         int i;
304
305         if(out_reg)
306                 bs = bitset_alloca(out_reg->reg_class->n_regs);
307
308         for(i = insn->use_start; i < insn->n_ops; ++i) {
309                 const operand_t *op = &insn->ops[i];
310
311                 /*
312                         The in operand can only be paired with a def, if the node defining the
313                         operand's value does not interfere with the instruction itself. That
314                         would mean, that it is live at the instruction, so no result of the instruction
315                         can have the same register as the operand.
316
317                         Furthermore, if the operand has already been paired (due to previous calls)
318                         to this function, we do not touch this partnership.
319                 */
320                 if(!values_interfere(op->irn, op->carrier) && !op->partner) {
321                         int has_constraint = arch_register_req_is(&op->req, limited);
322
323                         if(has_constraint && out_reg && out_reg->reg_class == op->req.cls) {
324                                 bitset_clear_all(bs);
325                                 op->req.limited(op->req.limited_env, bs);
326                                 if(bitset_is_set(bs, out_reg->index)) {
327                                         bipartite_add(bp, curr, i - insn->use_start);
328                                         return;
329                                 }
330                         }
331
332                         if(!has_constraint || can_be_constrained) {
333                                 bipartite_add(bp, curr, i - insn->use_start);
334                                 if(arch_register_req_is(&op->req, should_be_same) && op->req.other_same == op->carrier)
335                                         return;
336                         }
337                 }
338         }
339 }
340
341 static void pair_up_operands(const arch_env_t *arch_env, insn_t *insn) {
342         int i;
343         bipartite_t *bp = bipartite_new(insn->use_start, insn->n_ops - insn->use_start);
344         int *match      = alloca(insn->use_start * sizeof(match[0]));
345
346         for(i = 0; i < insn->use_start; ++i) {
347                 operand_t *op = &insn->ops[i];
348                 const arch_register_t *reg = arch_get_irn_register(arch_env, op->carrier);
349                 int has_constraint         = arch_register_req_is(&op->req, limited);
350                 add_possible_partners(insn, i, reg, bp, !has_constraint);
351         }
352
353         bipartite_matching(bp, match);
354         for(i = 0; i < insn->use_start; ++i) {
355                 int p = match[i] + insn->use_start;
356
357                 if(p >= insn->use_start) {
358                         insn->ops[i].partner = &insn->ops[p];
359                         insn->ops[p].partner = &insn->ops[i];
360                 }
361         }
362
363         bipartite_free(bp);
364 }
365
366 static ir_node *handle_constraints(be_chordal_alloc_env_t *alloc_env, ir_node *irn)
367 {
368         be_chordal_env_t *env  = alloc_env->chordal_env;
369         void *base             = obstack_base(&env->obst);
370         insn_t *insn           = scan_insn(env, irn, &env->obst);
371         ir_node *res           = insn->next_insn;
372
373         if(insn->pre_colored) {
374                 int i;
375                 for(i = 0; i < insn->use_start; ++i)
376                         pset_insert_ptr(alloc_env->pre_colored, insn->ops[i].carrier);
377         }
378
379         /*
380                 Perms inserted before the constraint handling phase are considered to be
381                 correctly precolored. These Perms arise during the ABI handling phase.
382         */
383         if(insn->has_constraints && !be_is_Perm(irn)) {
384                 firm_dbg_module_t *dbg = firm_dbg_register("firm.be.chordal.constr");
385                 const arch_env_t *aenv = env->birg->main_env->arch_env;
386                 int n_regs             = env->cls->n_regs;
387                 bitset_t *bs           = bitset_alloca(n_regs);
388                 bitset_t *non_ignore   = bitset_alloca(n_regs);
389                 ir_node **alloc_nodes  = alloca(n_regs * sizeof(alloc_nodes[0]));
390                 bipartite_t *bp        = bipartite_new(n_regs, n_regs);
391                 int *assignment        = alloca(n_regs * sizeof(assignment[0]));
392                 pmap *partners         = pmap_create();
393
394                 int i, n_alloc;
395                 long col;
396                 const ir_edge_t *edge;
397                 ir_node *perm = insert_Perm_after(aenv, env->cls, env->dom_front, sched_prev(irn));
398
399                 arch_put_non_ignore_regs(aenv, env->cls, non_ignore);
400
401                 /* Registers are propagated by insert_Perm_after(). Clean them here! */
402                 if(perm) {
403                         foreach_out_edge(perm, edge) {
404                                 ir_node *proj = get_edge_src_irn(edge);
405                                 arch_set_irn_register(aenv, proj, NULL);
406                         }
407                 }
408
409
410                 be_liveness(env->irg);
411                 insn = scan_insn(env, irn, &env->obst);
412
413                 DBG((dbg, LEVEL_1, "handling constraints for %+F\n", irn));
414
415                 /*
416                  * If there was no Perm made, nothing was alive in this register class.
417                  * This means, that the node has no operands, thus no input constraints.
418                  * so it had output constraints. The other results then can be assigned freely.
419                  */
420
421                 pair_up_operands(aenv, insn);
422
423                 for(i = 0, n_alloc = 0; i < insn->n_ops; ++i) {
424                         operand_t *op = &insn->ops[i];
425                         if((op->partner ? !pmap_contains(partners, op->partner->carrier) : 1)
426                                 && arch_register_req_is(&op->req, limited)
427                                 && arch_irn_consider_in_reg_alloc(aenv, env->cls, op->carrier)) {
428
429                                 pmap_insert(partners, op->carrier, op->partner ? op->partner->carrier : NULL);
430                                 alloc_nodes[n_alloc] = op->carrier;
431
432                                 DBG((dbg, LEVEL_2, "\tassociating %+F and %+F\n", op->carrier, pmap_get(partners, op->carrier)));
433
434                                 bitset_clear_all(bs);
435                                 op->req.limited(op->req.limited_env, bs);
436                                 bitset_and(bs, non_ignore);
437
438                                 DBG((dbg, LEVEL_2, "\tallowed registers for %+F: %B\n", op->carrier, bs));
439
440                                 bitset_foreach(bs, col)
441                                         bipartite_add(bp, n_alloc, col);
442
443                                 n_alloc++;
444                         }
445                 }
446
447                 if(perm) {
448                         /* Make the input constraints of the node to output constraints of the Perm's Projs */
449                         for(i = insn->use_start; i < insn->n_ops; ++i) {
450                                 operand_t *op = &insn->ops[i];
451
452                                 /*
453                                         If the operand is an "in" operand, constrained and the carrier is a Proj to the Perm,
454                                         then copy the in constraint to the Perm's out constraint
455                                 */
456                                 if(arch_register_req_is(&op->req, limited) && is_Proj(op->carrier) && perm == get_Proj_pred(op->carrier))
457                                         be_set_constr_limited(perm, BE_OUT_POS(get_Proj_proj(op->carrier)), &op->req);
458                         }
459
460                         foreach_out_edge(perm, edge) {
461                                 ir_node *proj = get_edge_src_irn(edge);
462
463                                 assert(is_Proj(proj));
464
465                                 if(values_interfere(proj, irn)) {
466                                         assert(n_alloc < n_regs);
467                                         alloc_nodes[n_alloc] = proj;
468                                         pmap_insert(partners, proj, NULL);
469
470                                         bitset_clear_all(bs);
471                                         arch_get_allocatable_regs(aenv, proj, -1, bs);
472                                         bitset_and(bs, non_ignore);
473                                         bitset_foreach(bs, col)
474                                                 bipartite_add(bp, n_alloc, col);
475
476                                         n_alloc++;
477                                 }
478                         }
479                 }
480
481                 bipartite_matching(bp, assignment);
482
483                 /* Assign colors obtained from the matching. */
484                 for(i = 0; i < n_alloc; ++i) {
485                         int j;
486                         ir_node *nodes[2];
487                         const arch_register_t *reg;
488
489                         assert(assignment[i] >= 0 && "there must have been a register assigned");
490                         reg = arch_register_for_index(env->cls, assignment[i]);
491
492                         nodes[0] = alloc_nodes[i];
493                         nodes[1] = pmap_get(partners, alloc_nodes[i]);
494
495                         for(j = 0; j < 2; ++j) {
496                                 if(!nodes[j])
497                                         continue;
498
499                                 arch_set_irn_register(aenv, nodes[j], reg);
500                                 pset_hinsert_ptr(alloc_env->pre_colored, nodes[j]);
501                                 DBG((dbg, LEVEL_2, "\tsetting %+F to register %s\n", nodes[j], reg->name));
502                         }
503                 }
504
505
506                 /* Allocate the non-constrained Projs of the Perm. */
507                 if(perm) {
508                         bitset_clear_all(bs);
509
510                         /* Put the colors of all Projs in a bitset. */
511                         foreach_out_edge(perm, edge) {
512                                 ir_node *proj              = get_edge_src_irn(edge);
513                                 const arch_register_t *reg = arch_get_irn_register(aenv, proj);
514
515                                 if(reg != NULL)
516                                         bitset_set(bs, reg->index);
517                         }
518
519                         /* Assign the not yet assigned Projs of the Perm a suitable color. */
520                         foreach_out_edge(perm, edge) {
521                                 ir_node *proj              = get_edge_src_irn(edge);
522                                 const arch_register_t *reg = arch_get_irn_register(aenv, proj);
523
524                                 DBG((dbg, LEVEL_2, "\tchecking reg of %+F: %s\n", proj, reg ? reg->name : "<none>"));
525
526                                 if(reg == NULL) {
527                                         col = bitset_next_clear(bs, 0);
528                                         reg = arch_register_for_index(env->cls, col);
529                                         bitset_set(bs, reg->index);
530                                         arch_set_irn_register(aenv, proj, reg);
531                                         pset_insert_ptr(alloc_env->pre_colored, proj);
532                                         DBG((dbg, LEVEL_2, "\tsetting %+F to register %s\n", proj, reg->name));
533                                 }
534                         }
535                 }
536
537                 pmap_destroy(partners);
538         }
539
540         obstack_free(&env->obst, base);
541         return res;
542 }
543
544 /**
545  * Handle constraint nodes in each basic block.
546  * be_insert_constr_perms() inserts Perm nodes which perm
547  * over all values live at the constrained node right in front
548  * of the constrained node. These Perms signal a constrained node.
549  * For further comments, refer to handle_constraints_at_perm().
550  */
551 static void constraints(ir_node *bl, void *data)
552 {
553         firm_dbg_module_t *dbg      = firm_dbg_register("firm.be.chordal.constr");
554         be_chordal_alloc_env_t *env = data;
555         arch_env_t *arch_env        = env->chordal_env->birg->main_env->arch_env;
556         ir_node *irn;
557
558         for(irn = sched_first(bl); !sched_is_end(irn);) {
559                 irn = handle_constraints(env, irn);
560         }
561 }
562
563 /**
564  * Annotate the register pressure to the nodes and compute
565  * the liveness intervals.
566  * @param block The block to do it for.
567  * @param env_ptr The environment.
568  */
569 static void pressure(ir_node *block, void *env_ptr)
570 {
571 /* Convenience macro for a def */
572 #define border_def(irn, step, real) \
573         border_add(env, head, irn, step, pressure--, 1, real)
574
575 /* Convenience macro for a use */
576 #define border_use(irn, step, real) \
577         border_add(env, head, irn, step, ++pressure, 0, real)
578
579         be_chordal_alloc_env_t *alloc_env = env_ptr;
580         be_chordal_env_t *env             = alloc_env->chordal_env;
581         const arch_env_t *arch_env        = env->birg->main_env->arch_env;
582         bitset_t *live                    = alloc_env->live;
583         firm_dbg_module_t *dbg            = env->dbg;
584         ir_node *irn;
585
586         int i, n;
587         unsigned step = 0;
588         unsigned pressure = 0;
589         struct list_head *head;
590         pset *live_in = put_live_in(block, pset_new_ptr_default());
591         pset *live_end = put_live_end(block, pset_new_ptr_default());
592
593         DBG((dbg, LEVEL_1, "Computing pressure in block %+F\n", block));
594         bitset_clear_all(live);
595
596         /* Set up the border list in the block info */
597         head = obstack_alloc(&env->obst, sizeof(*head));
598         INIT_LIST_HEAD(head);
599         assert(pmap_get(env->border_heads, block) == NULL);
600         pmap_insert(env->border_heads, block, head);
601
602         /*
603          * Make final uses of all values live out of the block.
604          * They are necessary to build up real intervals.
605          */
606         for(irn = pset_first(live_end); irn; irn = pset_next(live_end)) {
607                 if(has_reg_class(env, irn)) {
608                         DBG((dbg, LEVEL_3, "\tMaking live: %+F/%d\n", irn, get_irn_graph_nr(irn)));
609                         bitset_set(live, get_irn_graph_nr(irn));
610                         border_use(irn, step, 0);
611                 }
612         }
613         ++step;
614
615         /*
616          * Determine the last uses of a value inside the block, since they are
617          * relevant for the interval borders.
618          */
619         sched_foreach_reverse(block, irn) {
620                 DBG((dbg, LEVEL_1, "\tinsn: %+F, pressure: %d\n", irn, pressure));
621                 DBG((dbg, LEVEL_2, "\tlive: %b\n", live));
622
623                 /*
624                  * If the node defines some value, which can put into a
625                  * register of the current class, make a border for it.
626                  */
627                 if(has_reg_class(env, irn)) {
628                         int nr = get_irn_graph_nr(irn);
629
630                         bitset_clear(live, nr);
631                         border_def(irn, step, 1);
632                 }
633
634                 /*
635                  * If the node is no phi node we can examine the uses.
636                  */
637                 if(!is_Phi(irn)) {
638                         for(i = 0, n = get_irn_arity(irn); i < n; ++i) {
639                                 ir_node *op = get_irn_n(irn, i);
640
641                                 if(has_reg_class(env, op)) {
642                                         int nr = get_irn_graph_nr(op);
643
644                                         DBG((dbg, LEVEL_4, "\t\tpos: %d, use: %+F\n", i, op));
645
646                                         if(!bitset_is_set(live, nr)) {
647                                                 border_use(op, step, 1);
648                                                 bitset_set(live, nr);
649                                         }
650                                 }
651                         }
652                 }
653                 ++step;
654         }
655
656         /*
657          * Add initial defs for all values live in.
658          */
659         for(irn = pset_first(live_in); irn; irn = pset_next(live_in)) {
660                 if(has_reg_class(env, irn)) {
661
662                         /* Mark the value live in. */
663                         bitset_set(live, get_irn_graph_nr(irn));
664
665                         /* Add the def */
666                         border_def(irn, step, 0);
667                 }
668         }
669
670
671   del_pset(live_in);
672   del_pset(live_end);
673 }
674
675 static void assign(ir_node *block, void *env_ptr)
676 {
677         be_chordal_alloc_env_t *alloc_env = env_ptr;
678         be_chordal_env_t *env       = alloc_env->chordal_env;
679         firm_dbg_module_t *dbg      = env->dbg;
680         bitset_t *live              = alloc_env->live;
681         bitset_t *colors            = alloc_env->colors;
682         bitset_t *in_colors         = alloc_env->in_colors;
683         const arch_env_t *arch_env  = env->birg->main_env->arch_env;
684
685         const ir_node *irn;
686         border_t *b;
687         struct list_head *head = get_block_border_head(env, block);
688         pset *live_in = put_live_in(block, pset_new_ptr_default());
689
690         bitset_clear_all(colors);
691         bitset_clear_all(live);
692         bitset_clear_all(in_colors);
693
694         DBG((dbg, LEVEL_4, "Assigning colors for block %+F\n", block));
695         DBG((dbg, LEVEL_4, "\tusedef chain for block\n"));
696         list_for_each_entry(border_t, b, head, list) {
697                 DBG((dbg, LEVEL_4, "\t%s %+F/%d\n", b->is_def ? "def" : "use",
698                                         b->irn, get_irn_graph_nr(b->irn)));
699         }
700
701         /*
702          * Add initial defs for all values live in.
703          * Since their colors have already been assigned (The dominators were
704          * allocated before), we have to mark their colors as used also.
705          */
706         for(irn = pset_first(live_in); irn; irn = pset_next(live_in)) {
707                 if(has_reg_class(env, irn)) {
708                         const arch_register_t *reg = arch_get_irn_register(arch_env, irn);
709                         int col;
710
711                         assert(reg && "Node must have been assigned a register");
712                         col = arch_register_get_index(reg);
713
714                         /* Mark the color of the live in value as used. */
715                         bitset_set(colors, col);
716                         bitset_set(in_colors, col);
717
718                         /* Mark the value live in. */
719                         bitset_set(live, get_irn_graph_nr(irn));
720                 }
721         }
722
723         /*
724          * Mind that the sequence
725          * of defs from back to front defines a perfect
726          * elimination order. So, coloring the definitions from first to last
727          * will work.
728          */
729         list_for_each_entry_reverse(border_t, b, head, list) {
730                 ir_node *irn = b->irn;
731                 int nr = get_irn_graph_nr(irn);
732
733                 /*
734                  * Assign a color, if it is a local def. Global defs already have a
735                  * color.
736                  */
737                 if(b->is_def && !is_live_in(block, irn)) {
738                         const arch_register_t *reg;
739                         int col = NO_COLOR;
740
741                         if(pset_find_ptr(alloc_env->pre_colored, irn)) {
742                                 reg = arch_get_irn_register(arch_env, irn);
743                                 col = reg->index;
744                                 assert(!bitset_is_set(colors, col) && "pre-colored register must be free");
745                         }
746
747                         else {
748                                 col = bitset_next_clear(colors, 0);
749                                 reg = arch_register_for_index(env->cls, col);
750                                 assert(arch_get_irn_register(arch_env, irn) == NULL && "This node must not have been assigned a register yet");
751                         }
752
753                         bitset_set(colors, col);
754
755                         assert(!arch_register_type_is(reg, ignore) && "Must not assign ignore register");
756                         arch_set_irn_register(arch_env, irn, reg);
757
758                         DBG((dbg, LEVEL_1, "\tassigning register %s(%d) to %+F\n",
759             arch_register_get_name(reg), col, irn));
760
761                         assert(!bitset_is_set(live, nr) && "Value's definition must not have been encountered");
762                         bitset_set(live, nr);
763                 }
764
765                 /* Clear the color upon a use. */
766                 else if(!b->is_def) {
767                         const arch_register_t *reg = arch_get_irn_register(arch_env, irn);
768                         int col;
769
770                         assert(reg && "Register must have been assigned");
771
772                         col = arch_register_get_index(reg);
773                         assert(bitset_is_set(live, nr) && "Cannot have a non live use");
774
775                         bitset_clear(colors, col);
776                         bitset_clear(live, nr);
777                 }
778         }
779
780         del_pset(live_in);
781 }
782
783 void be_ra_chordal_color(be_chordal_env_t *chordal_env)
784 {
785         be_chordal_alloc_env_t env;
786         char buf[256];
787
788         int colors_n          = arch_register_class_n_regs(chordal_env->cls);
789         ir_graph *irg         = chordal_env->irg;
790
791
792         if(get_irg_dom_state(irg) != dom_consistent)
793                 compute_doms(irg);
794
795         env.chordal_env   = chordal_env;
796         env.colors_n      = colors_n;
797         env.colors        = bitset_malloc(colors_n);
798         env.in_colors     = bitset_malloc(colors_n);
799         env.pre_colored   = pset_new_ptr_default();
800
801         /* Handle register targeting constraints */
802         dom_tree_walk_irg(irg, constraints, NULL, &env);
803
804         if(chordal_env->opts->dump_flags & BE_CH_DUMP_CONSTR) {
805                 snprintf(buf, sizeof(buf), "-%s-constr", chordal_env->cls->name);
806                 be_dump(chordal_env->irg, buf, dump_ir_block_graph_sched);
807         }
808
809         be_numbering(irg);
810         env.live = bitset_malloc(get_graph_node_count(chordal_env->irg));
811
812         /* First, determine the pressure */
813         dom_tree_walk_irg(irg, pressure, NULL, &env);
814
815         /* Assign the colors */
816         dom_tree_walk_irg(irg, assign, NULL, &env);
817
818         be_numbering_done(irg);
819
820         if(chordal_env->opts->dump_flags & BE_CH_DUMP_TREE_INTV) {
821         plotter_t *plotter;
822                 ir_snprintf(buf, sizeof(buf), "ifg_%s_%F.eps", chordal_env->cls->name, irg);
823         plotter = new_plotter_ps(buf);
824         draw_interval_tree(&draw_chordal_def_opts, chordal_env, plotter);
825         plotter_free(plotter);
826         }
827
828         free(env.live);
829         free(env.colors);
830         free(env.in_colors);
831         del_pset(env.pre_colored);
832 }