- renamed access offset functions
[libfirm] / ir / be / bechordal.c
1 /**
2  * Chordal register allocation.
3  * @author Sebastian Hack
4  * @date   8.12.2004
5  * @cvs-id $Id$
6  *
7  * Copyright (C) Universitaet Karlsruhe
8  * Released under the GPL
9  */
10
11 #ifdef HAVE_CONFIG_H
12 #include "config.h"
13 #endif
14
15 #ifdef HAVE_MALLOC_H
16 #include <malloc.h>
17 #endif
18
19 #ifdef HAVE_ALLOCA_H
20 #include <alloca.h>
21 #endif
22
23 #include <ctype.h>
24
25 #include "obst.h"
26 #include "pset.h"
27 #include "list.h"
28 #include "bitset.h"
29 #include "iterator.h"
30 #include "bipartite.h"
31 #include "hungarian.h"
32
33 #include "irmode_t.h"
34 #include "irgraph_t.h"
35 #include "irprintf_t.h"
36 #include "irgwalk.h"
37 #include "irdump.h"
38 #include "irdom.h"
39 #include "irtools.h"
40 #include "debug.h"
41 #include "xmalloc.h"
42
43 #include "beutil.h"
44 #include "besched.h"
45 #include "besched_t.h"
46 #include "belive_t.h"
47 #include "benode_t.h"
48 #include "bearch.h"
49 #include "beirgmod.h"
50 #include "beifg.h"
51 #include "beinsn_t.h"
52 #include "bestatevent.h"
53
54 #include "bechordal_t.h"
55 #include "bechordal_draw.h"
56
57 #define DBG_LEVEL SET_LEVEL_0
58 #define DBG_LEVEL_CHECK SET_LEVEL_0
59
60 #define NO_COLOR (-1)
61
62 #define DUMP_INTERVALS
63
64 typedef struct _be_chordal_alloc_env_t {
65         be_chordal_env_t *chordal_env;
66
67         pset *pre_colored;              /**< Set of precolored nodes. */
68         bitset_t *live;                             /**< A liveness bitset. */
69         bitset_t *tmp_colors;           /**< An auxiliary bitset which is as long as the number of colors in the class. */
70         bitset_t *colors;                           /**< The color mask. */
71         bitset_t *in_colors;            /**< Colors used by live in values. */
72         int colors_n;                   /**< The number of colors. */
73         DEBUG_ONLY(firm_dbg_module_t *constr_dbg;)  /**< Debug output for the constraint handler. */
74 } be_chordal_alloc_env_t;
75
76 #include "fourcc.h"
77
78 /* Make a fourcc for border checking. */
79 #define BORDER_FOURCC                           FOURCC('B', 'O', 'R', 'D')
80
81 #if 0
82 static void check_border_list(struct list_head *head)
83 {
84   border_t *x;
85   list_for_each_entry(border_t, x, head, list) {
86     assert(x->magic == BORDER_FOURCC);
87   }
88 }
89
90 static void check_heads(be_chordal_env_t *env)
91 {
92   pmap_entry *ent;
93   for(ent = pmap_first(env->border_heads); ent; ent = pmap_next(env->border_heads)) {
94     /* ir_printf("checking border list of block %+F\n", ent->key); */
95     check_border_list(ent->value);
96   }
97 }
98 #endif
99
100 /**
101  * Add an interval border to the list of a block's list
102  * of interval border.
103  * @note You always have to create the use before the def.
104  * @param env The environment.
105  * @param head The list head to enqueue the borders.
106  * @param irn The node (value) the border belongs to.
107  * @param pressure The pressure at this point in time.
108  * @param step A time step for the border.
109  * @param is_def Is the border a use or a def.
110  * @return The created border.
111  */
112 static INLINE border_t *border_add(be_chordal_env_t *env, struct list_head *head,
113                         ir_node *irn, unsigned step, unsigned pressure,
114                         unsigned is_def, unsigned is_real)
115 {
116         border_t *b;
117
118         if(!is_def) {
119                 border_t *def;
120
121                 b = obstack_alloc(&env->obst, sizeof(*b));
122
123                 /* also allocate the def and tie it to the use. */
124                 def = obstack_alloc(&env->obst, sizeof(*def));
125                 memset(def, 0, sizeof(*def));
126                 b->other_end = def;
127                 def->other_end = b;
128
129                 /*
130                  * Set the link field of the irn to the def.
131                  * This strongly relies on the fact, that the use is always
132                  * made before the def.
133                  */
134                 set_irn_link(irn, def);
135
136                 b->magic = BORDER_FOURCC;
137                 def->magic = BORDER_FOURCC;
138         }
139
140         /*
141          * If the def is encountered, the use was made and so was the
142          * the def node (see the code above). It was placed into the
143          * link field of the irn, so we can get it there.
144          */
145         else {
146                 b = get_irn_link(irn);
147
148                 assert(b && b->magic == BORDER_FOURCC && "Illegal border encountered");
149         }
150
151         b->pressure = pressure;
152         b->is_def = is_def;
153         b->is_real = is_real;
154         b->irn = irn;
155         b->step = step;
156         list_add_tail(&b->list, head);
157         DBG((env->dbg, LEVEL_5, "\t\t%s adding %+F, step: %d\n", is_def ? "def" : "use", irn, step));
158
159
160         return b;
161 }
162
163 /**
164  * Check, if an irn is of the register class currently under processing.
165  * @param env The chordal environment.
166  * @param irn The node.
167  * @return 1, if the node is of that register class, 0 if not.
168  */
169 static INLINE int has_reg_class(const be_chordal_env_t *env, const ir_node *irn)
170 {
171         return arch_irn_has_reg_class(env->birg->main_env->arch_env, irn, -1, env->cls);
172         // return arch_irn_consider_in_reg_alloc(env->birg->main_env->arch_env, env->cls, irn);
173 }
174
175 #define has_limited_constr(req, irn) \
176         (arch_get_register_req(arch_env, (req), irn, -1) && (req)->type == arch_register_req_type_limited)
177
178 static int get_next_free_reg(const be_chordal_alloc_env_t *alloc_env, bitset_t *colors)
179 {
180         bitset_t *tmp = alloc_env->tmp_colors;
181         bitset_copy(tmp, colors);
182         bitset_or(tmp, alloc_env->chordal_env->ignore_colors);
183         return bitset_next_clear(tmp, 0);
184 }
185
186 static bitset_t *get_decisive_partner_regs(bitset_t *bs, const be_operand_t *o1, const be_operand_t *o2)
187 {
188         bitset_t *res = bs;
189
190         if(!o1) {
191                 bitset_copy(bs, o2->regs);
192                 return bs;
193         }
194
195         if(!o2) {
196                 bitset_copy(bs, o1->regs);
197                 return bs;
198         }
199
200         assert(o1->req.cls == o2->req.cls);
201
202         if(bitset_contains(o1->regs, o2->regs))
203                 bitset_copy(bs, o1->regs);
204         else if(bitset_contains(o2->regs, o1->regs))
205                 bitset_copy(bs, o2->regs);
206         else
207                 res = NULL;
208
209         return res;
210 }
211
212 static be_insn_t *chordal_scan_insn(be_chordal_env_t *env, ir_node *irn)
213 {
214         be_insn_env_t ie;
215
216         ie.ignore_colors = env->ignore_colors;
217         ie.aenv          = env->birg->main_env->arch_env;
218         ie.obst          = &env->obst;
219         ie.cls           = env->cls;
220         return be_scan_insn(&ie, irn);
221 }
222
223 static ir_node *prepare_constr_insn(be_chordal_env_t *env, ir_node *irn)
224 {
225         const arch_env_t *aenv = env->birg->main_env->arch_env;
226         bitset_t *def_constr   = bitset_alloca(env->cls->n_regs);
227         bitset_t *tmp          = bitset_alloca(env->cls->n_regs);
228         ir_node *bl            = get_nodes_block(irn);
229         be_lv_t *lv            = env->birg->lv;
230
231         be_insn_t *insn;
232         int i, j;
233
234         for (i = get_irn_arity(irn) - 1; i >= 0; --i) {
235                 ir_node *op = get_irn_n(irn, i);
236
237                 const arch_register_t *reg;
238                 arch_register_req_t req;
239
240                 if (arch_get_irn_reg_class(aenv, irn, i) == env->cls) {
241                         reg = arch_get_irn_register(aenv, op);
242
243                         if (reg && arch_register_type_is(reg, ignore)) {
244                                 arch_get_register_req(aenv, &req, irn, i);
245
246                                 if (arch_register_req_is(&req, limited)) {
247                                         bitset_clear_all(tmp);
248                                         req.limited(req.limited_env, tmp);
249
250                                         if (! bitset_is_set(tmp, reg->index)) {
251                                                 ir_node *copy = be_new_Copy(env->cls, env->irg, bl, op);
252                                                 be_stat_ev("constr_copy", 1);
253
254                                                 sched_add_before(irn, copy);
255                                                 set_irn_n(irn, i, copy);
256                                                 DBG((env->dbg, LEVEL_3, "inserting ignore arg copy %+F for %+F pos %d\n", copy, irn, i));
257                                         }
258                                 }
259                         }
260                 }
261         }
262
263     insn = chordal_scan_insn(env, irn);
264
265         if(!insn->has_constraints)
266                 goto end;
267
268         /* insert copies for nodes that occur constrained more than once. */
269         for(i = insn->use_start; i < insn->n_ops; ++i) {
270                 be_operand_t *op = &insn->ops[i];
271
272                 if(op->has_constraints) {
273                         for(j = i + 1; j < insn->n_ops; ++j) {
274                                 be_operand_t *a_op = &insn->ops[j];
275
276                                 if(a_op->carrier == op->carrier && a_op->has_constraints) {
277                                         ir_node *copy = be_new_Copy(env->cls, env->irg, bl, op->carrier);
278                                         be_stat_ev("constr_copy", 1);
279
280                                         sched_add_before(insn->irn, copy);
281                                         set_irn_n(insn->irn, a_op->pos, copy);
282                                         DBG((env->dbg, LEVEL_3, "inserting multiple constr copy %+F for %+F pos %d\n", copy, insn->irn, a_op->pos));
283                                 }
284                         }
285                 }
286         }
287
288         /* collect all registers occuring in out constraints. */
289         for(i = 0; i < insn->use_start; ++i) {
290                 be_operand_t *op = &insn->ops[i];
291                 if(op->has_constraints)
292                         bitset_or(def_constr, op->regs);
293         }
294
295         /*
296                 insert copies for all constrained arguments living through the node
297                 and being constrained to a register which also occurs in out constraints.
298         */
299         for(i = insn->use_start; i < insn->n_ops; ++i) {
300                 be_operand_t *op = &insn->ops[i];
301
302                 bitset_copy(tmp, op->regs);
303                 bitset_and(tmp, def_constr);
304
305                 /*
306                         Check, if
307                         1) the operand is constrained.
308                         2) lives through the node.
309                         3) is constrained to a register occuring in out constraints.
310                 */
311                 if(op->has_constraints && values_interfere(lv, insn->irn, op->carrier) && bitset_popcnt(tmp) > 0) {
312                         /*
313                                 only create the copy if the operand is no copy.
314                                 this is necessary since the assure constraints phase inserts
315                                 Copies and Keeps for operands which must be different from the results.
316                                 Additional copies here would destroy this.
317                         */
318                         if(!be_is_Copy(op->carrier)) {
319                                 ir_node *copy = be_new_Copy(env->cls, env->irg, bl, op->carrier);
320
321                                 sched_add_before(insn->irn, copy);
322                                 set_irn_n(insn->irn, op->pos, copy);
323                                 DBG((env->dbg, LEVEL_3, "inserting constr copy %+F for %+F pos %d\n", copy, insn->irn, op->pos));
324                                 be_liveness_update(lv, op->carrier);
325                         }
326                 }
327         }
328
329 end:
330         obstack_free(&env->obst, insn);
331         return insn->next_insn;
332 }
333
334 static void pre_spill_prepare_constr_walker(ir_node *bl, void *data)
335 {
336         be_chordal_env_t *env = data;
337         ir_node *irn;
338         for(irn = sched_first(bl); !sched_is_end(irn);) {
339                 irn = prepare_constr_insn(env, irn);
340         }
341 }
342
343 void be_pre_spill_prepare_constr(be_chordal_env_t *cenv) {
344         irg_block_walk_graph(cenv->irg, pre_spill_prepare_constr_walker, NULL, (void *) cenv);
345 }
346
347 static void pair_up_operands(const be_chordal_alloc_env_t *alloc_env, be_insn_t *insn)
348 {
349         const be_chordal_env_t *env = alloc_env->chordal_env;
350
351         int n_uses   = be_insn_n_uses(insn);
352         int n_defs   = be_insn_n_defs(insn);
353         bitset_t *bs = bitset_alloca(env->cls->n_regs);
354         int *pairing = alloca(MAX(n_defs, n_uses) * sizeof(pairing[0]));
355         be_lv_t *lv  = env->birg->lv;
356
357         int i, j;
358
359         /*
360                 For each out operand, try to find an in operand which can be assigned the
361                 same register as the out operand.
362         */
363         for (j = 0; j < insn->use_start; ++j) {
364                 int smallest         = -1;
365                 int smallest_n_regs  = 2 * env->cls->n_regs + 1;
366                 be_operand_t *out_op = &insn->ops[j];
367
368                 /* Try to find an in operand which has ... */
369                 for(i = insn->use_start; i < insn->n_ops; ++i) {
370                         int n_total;
371                         const be_operand_t *op = &insn->ops[i];
372
373                         if (! values_interfere(lv, op->irn, op->carrier) && ! op->partner) {
374                                 bitset_clear_all(bs);
375                                 bitset_copy(bs, op->regs);
376                                 bitset_and(bs, out_op->regs);
377                                 n_total = bitset_popcnt(op->regs) + bitset_popcnt(out_op->regs);
378
379                                 if (bitset_popcnt(bs) > 0 && n_total < smallest_n_regs) {
380                                         smallest = i;
381                                         smallest_n_regs = n_total;
382                                 }
383                         }
384                 }
385
386                 if (smallest >= 0) {
387                         be_operand_t *partner = &insn->ops[smallest];
388                         out_op->partner  = partner;
389                         partner->partner = out_op;
390                 }
391         }
392 }
393
394
395 static ir_node *pre_process_constraints(be_chordal_alloc_env_t *alloc_env, be_insn_t **the_insn)
396 {
397         be_chordal_env_t *env       = alloc_env->chordal_env;
398         const arch_env_t *aenv      = env->birg->main_env->arch_env;
399         be_insn_t *insn             = *the_insn;
400         ir_node *bl                 = get_nodes_block(insn->irn);
401         ir_node *copy               = NULL;
402         ir_node *perm               = NULL;
403         bitset_t *out_constr        = bitset_alloca(env->cls->n_regs);
404         bitset_t *bs                = bitset_alloca(env->cls->n_regs);
405         be_lv_t *lv                 = env->birg->lv;
406         DEBUG_ONLY(firm_dbg_module_t *dbg      = alloc_env->constr_dbg;)
407
408         int i;
409
410         assert(insn->has_constraints && "only do this for constrained nodes");
411
412         /*
413                 Collect all registers that occur in output constraints.
414                 This is necessary, since if the insn has one of these as an input constraint
415                 and the corresponding operand interferes with the insn, the operand must
416                 be copied.
417         */
418         for(i = 0; i < insn->use_start; ++i) {
419                 be_operand_t *op = &insn->ops[i];
420                 if(op->has_constraints)
421                         bitset_or(out_constr, op->regs);
422         }
423
424         (void) bl;
425         (void) copy;
426         (void) bs;
427         DEBUG_ONLY((void) dbg;)
428
429         /*
430                 Make the Perm, recompute liveness and re-scan the insn since the
431                 in operands are now the Projs of the Perm.
432         */
433         perm = insert_Perm_after(aenv, lv, env->cls, env->birg->dom_front, sched_prev(insn->irn));
434
435         /* Registers are propagated by insert_Perm_after(). Clean them here! */
436         if(perm) {
437                 const ir_edge_t *edge;
438
439                 be_stat_ev("constr_perm", get_irn_arity(perm));
440                 foreach_out_edge(perm, edge) {
441                         ir_node *proj = get_edge_src_irn(edge);
442                         arch_set_irn_register(aenv, proj, NULL);
443                 }
444
445                 /*
446                         We also have to re-build the insn since the input operands are now the Projs of
447                         the Perm. Recomputing liveness is also a good idea if a Perm is inserted, since
448                         the live sets may change.
449                 */
450                 // be_liveness_recompute(lv);
451                 obstack_free(&env->obst, insn);
452                 *the_insn = insn = chordal_scan_insn(env, insn->irn);
453
454                 /*
455                         Copy the input constraints of the insn to the Perm as output
456                         constraints. Succeeding phases (coalescing will need that).
457                 */
458                 for(i = insn->use_start; i < insn->n_ops; ++i) {
459                         be_operand_t *op = &insn->ops[i];
460                         ir_node *proj = op->carrier;
461                         /*
462                                 Note that the predecessor must not be a Proj of the Perm,
463                                 since ignore-nodes are not Perm'ed.
464                         */
465                         if(op->has_constraints &&  is_Proj(proj) && get_Proj_pred(proj) == perm) {
466                                 be_set_constr_limited(perm, BE_OUT_POS(get_Proj_proj(proj)), &op->req);
467                         }
468                 }
469         }
470
471         return perm;
472 }
473
474 static ir_node *handle_constraints(be_chordal_alloc_env_t *alloc_env, ir_node *irn, int *silent)
475 {
476         be_chordal_env_t *env  = alloc_env->chordal_env;
477         void *base             = obstack_base(&env->obst);
478         be_insn_t *insn        = chordal_scan_insn(env, irn);
479         ir_node *res           = insn->next_insn;
480         int be_silent          = *silent;
481         be_lv_t *lv            = env->birg->lv;
482
483         if(insn->pre_colored) {
484                 int i;
485                 for(i = 0; i < insn->use_start; ++i)
486                         pset_insert_ptr(alloc_env->pre_colored, insn->ops[i].carrier);
487         }
488
489         /*
490                 If the current node is a barrier toggle the silent flag.
491                 If we are in the start block, we are ought to be silent at the beginning,
492                 so the toggling activates the constraint handling but skips the barrier.
493                 If we are in the end block we handle the in requirements of the barrier
494                 and set the rest to silent.
495         */
496         if(be_is_Barrier(irn))
497                 *silent = !*silent;
498
499         if(be_silent)
500                 goto end;
501
502         /*
503                 Perms inserted before the constraint handling phase are considered to be
504                 correctly precolored. These Perms arise during the ABI handling phase.
505         */
506         if(insn->has_constraints) {
507                 const arch_env_t *aenv = env->birg->main_env->arch_env;
508                 int n_regs             = env->cls->n_regs;
509                 bitset_t *bs           = bitset_alloca(n_regs);
510                 ir_node **alloc_nodes  = alloca(n_regs * sizeof(alloc_nodes[0]));
511                 hungarian_problem_t *bp= hungarian_new(n_regs, n_regs, 2, HUNGARIAN_MATCH_PERFECT);
512 //              bipartite_t *bp        = bipartite_new(n_regs, n_regs);
513                 int *assignment        = alloca(n_regs * sizeof(assignment[0]));
514                 pmap *partners         = pmap_create();
515                 DEBUG_ONLY(firm_dbg_module_t *dbg = alloc_env->constr_dbg;)
516
517                 int i, n_alloc;
518                 long col;
519                 const ir_edge_t *edge;
520                 ir_node *perm = NULL;
521                 int match_res, cost;
522
523                 /*
524                         prepare the constraint handling of this node.
525                         Perms are constructed and Copies are created for constrained values
526                         interfering with the instruction.
527                 */
528                 perm = pre_process_constraints(alloc_env, &insn);
529
530                 /* find suitable in operands to the out operands of the node. */
531                 pair_up_operands(alloc_env, insn);
532
533                 /*
534                         look at the in/out operands and add each operand (and its possible partner)
535                         to a bipartite graph (left: nodes with partners, right: admissible colors).
536                 */
537                 for(i = 0, n_alloc = 0; i < insn->n_ops; ++i) {
538                         be_operand_t *op = &insn->ops[i];
539
540                         /*
541                                 If the operand has no partner or the partner has not been marked
542                                 for allocation, determine the admissible registers and mark it
543                                 for allocation by associating the node and its partner with the
544                                 set of admissible registers via a bipartite graph.
545                         */
546                         if(!op->partner || !pmap_contains(partners, op->partner->carrier)) {
547
548                                 pmap_insert(partners, op->carrier, op->partner ? op->partner->carrier : NULL);
549                                 alloc_nodes[n_alloc] = op->carrier;
550
551                                 DBG((dbg, LEVEL_2, "\tassociating %+F and %+F\n", op->carrier, op->partner ? op->partner->carrier : NULL));
552
553                                 bitset_clear_all(bs);
554                                 get_decisive_partner_regs(bs, op, op->partner);
555
556                                 DBG((dbg, LEVEL_2, "\tallowed registers for %+F: %B\n", op->carrier, bs));
557
558                                 bitset_foreach(bs, col)
559                                         hungarian_add(bp, n_alloc, col, 1);
560 //                                      bipartite_add(bp, n_alloc, col);
561
562                                 n_alloc++;
563                         }
564                 }
565
566                 /*
567                         Put all nodes which live through the constrained instruction also to the
568                         allocation bipartite graph. They are considered unconstrained.
569                 */
570                 if(perm) {
571                         foreach_out_edge(perm, edge) {
572                                 ir_node *proj = get_edge_src_irn(edge);
573
574                                 assert(is_Proj(proj));
575
576                                 if(values_interfere(lv, proj, irn) && !pmap_contains(partners, proj)) {
577                                         assert(n_alloc < n_regs);
578                                         alloc_nodes[n_alloc] = proj;
579                                         pmap_insert(partners, proj, NULL);
580
581                                         bitset_clear_all(bs);
582                                         arch_put_non_ignore_regs(aenv, env->cls, bs);
583                                         bitset_andnot(bs, env->ignore_colors);
584                                         bitset_foreach(bs, col)
585                                                 hungarian_add(bp, n_alloc, col, 1);
586 //                                              bipartite_add(bp, n_alloc, col);
587
588                                         n_alloc++;
589                                 }
590                         }
591                 }
592
593                 /* Compute a valid register allocation. */
594                 hungarian_prepare_cost_matrix(bp, HUNGARIAN_MODE_MAXIMIZE_UTIL);
595                 match_res = hungarian_solve(bp, assignment, &cost, 1);
596                 assert(match_res == 0 && "matching failed");
597                 //bipartite_matching(bp, assignment);
598
599                 /* Assign colors obtained from the matching. */
600                 for(i = 0; i < n_alloc; ++i) {
601                         const arch_register_t *reg;
602                         ir_node *nodes[2];
603                         int j;
604
605                         assert(assignment[i] >= 0 && "there must have been a register assigned");
606                         reg = arch_register_for_index(env->cls, assignment[i]);
607
608                         nodes[0] = alloc_nodes[i];
609                         nodes[1] = pmap_get(partners, alloc_nodes[i]);
610
611                         for(j = 0; j < 2; ++j) {
612                                 if(!nodes[j])
613                                         continue;
614
615                                 arch_set_irn_register(aenv, nodes[j], reg);
616                                 (void) pset_hinsert_ptr(alloc_env->pre_colored, nodes[j]);
617                                 DBG((dbg, LEVEL_2, "\tsetting %+F to register %s\n", nodes[j], reg->name));
618                         }
619                 }
620
621
622                 /* Allocate the non-constrained Projs of the Perm. */
623                 if(perm) {
624
625                         bitset_clear_all(bs);
626
627                         /* Put the colors of all Projs in a bitset. */
628                         foreach_out_edge(perm, edge) {
629                                 ir_node *proj              = get_edge_src_irn(edge);
630                                 const arch_register_t *reg = arch_get_irn_register(aenv, proj);
631
632                                 if(reg != NULL)
633                                         bitset_set(bs, reg->index);
634                         }
635
636                         /* Assign the not yet assigned Projs of the Perm a suitable color. */
637                         foreach_out_edge(perm, edge) {
638                                 ir_node *proj              = get_edge_src_irn(edge);
639                                 const arch_register_t *reg = arch_get_irn_register(aenv, proj);
640
641                                 DBG((dbg, LEVEL_2, "\tchecking reg of %+F: %s\n", proj, reg ? reg->name : "<none>"));
642
643                                 if(reg == NULL) {
644                                         col = get_next_free_reg(alloc_env, bs);
645                                         reg = arch_register_for_index(env->cls, col);
646                                         bitset_set(bs, reg->index);
647                                         arch_set_irn_register(aenv, proj, reg);
648                                         pset_insert_ptr(alloc_env->pre_colored, proj);
649                                         DBG((dbg, LEVEL_2, "\tsetting %+F to register %s\n", proj, reg->name));
650                                 }
651                         }
652                 }
653
654                 //bipartite_free(bp);
655                 hungarian_free(bp);
656                 pmap_destroy(partners);
657         }
658
659 end:
660         obstack_free(&env->obst, base);
661         return res;
662 }
663
664 /**
665  * Handle constraint nodes in each basic block.
666  * handle_constraints() inserts Perm nodes which perm
667  * over all values live at the constrained node right in front
668  * of the constrained node. These Perms signal a constrained node.
669  * For further comments, refer to handle_constraints().
670  */
671 static void constraints(ir_node *bl, void *data)
672 {
673         be_chordal_alloc_env_t *env = data;
674
675         /*
676                 Start silent in the start block.
677                 The silence remains until the first barrier is seen.
678                 Each other block is begun loud.
679         */
680         int silent                  = bl == get_irg_start_block(get_irn_irg(bl));
681         ir_node *irn;
682
683         /*
684                 If the block is the start block search the barrier and
685                 start handling constraints from there.
686         */
687
688         for(irn = sched_first(bl); !sched_is_end(irn);) {
689                 irn = handle_constraints(env, irn, &silent);
690         }
691 }
692
693 /**
694  * Annotate the register pressure to the nodes and compute
695  * the liveness intervals.
696  * @param block The block to do it for.
697  * @param env_ptr The environment.
698  */
699 static void pressure(ir_node *block, void *env_ptr)
700 {
701 /* Convenience macro for a def */
702 #define border_def(irn, step, real) \
703         border_add(env, head, irn, step, pressure--, 1, real)
704
705 /* Convenience macro for a use */
706 #define border_use(irn, step, real) \
707         border_add(env, head, irn, step, ++pressure, 0, real)
708
709         be_chordal_alloc_env_t *alloc_env = env_ptr;
710         be_chordal_env_t *env             = alloc_env->chordal_env;
711         bitset_t *live                    = alloc_env->live;
712         ir_node *irn;
713         be_lv_t *lv                       = env->birg->lv;
714         DEBUG_ONLY(firm_dbg_module_t *dbg            = env->dbg;)
715
716         int i, n;
717         unsigned step = 0;
718         unsigned pressure = 0;
719         struct list_head *head;
720         pset *live_in  = be_lv_pset_put_in(lv, block, pset_new_ptr_default());
721         pset *live_end = be_lv_pset_put_end(lv, block, pset_new_ptr_default());
722
723         DBG((dbg, LEVEL_1, "Computing pressure in block %+F\n", block));
724         bitset_clear_all(live);
725
726         /* Set up the border list in the block info */
727         head = obstack_alloc(&env->obst, sizeof(*head));
728         INIT_LIST_HEAD(head);
729         assert(pmap_get(env->border_heads, block) == NULL);
730         pmap_insert(env->border_heads, block, head);
731
732         /*
733          * Make final uses of all values live out of the block.
734          * They are necessary to build up real intervals.
735          */
736         foreach_pset(live_end, irn) {
737                 if(has_reg_class(env, irn)) {
738                         DBG((dbg, LEVEL_3, "\tMaking live: %+F/%d\n", irn, get_irn_idx(irn)));
739                         bitset_set(live, get_irn_idx(irn));
740                         border_use(irn, step, 0);
741                 }
742         }
743         ++step;
744
745         /*
746          * Determine the last uses of a value inside the block, since they are
747          * relevant for the interval borders.
748          */
749         sched_foreach_reverse(block, irn) {
750                 DBG((dbg, LEVEL_1, "\tinsn: %+F, pressure: %d\n", irn, pressure));
751                 DBG((dbg, LEVEL_2, "\tlive: %B\n", live));
752
753                 /*
754                  * If the node defines some value, which can put into a
755                  * register of the current class, make a border for it.
756                  */
757                 if(has_reg_class(env, irn)) {
758                         int nr = get_irn_idx(irn);
759
760                         bitset_clear(live, nr);
761                         border_def(irn, step, 1);
762                 }
763
764                 /*
765                  * If the node is no phi node we can examine the uses.
766                  */
767                 if(!is_Phi(irn)) {
768                         for(i = 0, n = get_irn_arity(irn); i < n; ++i) {
769                                 ir_node *op = get_irn_n(irn, i);
770
771                                 if(has_reg_class(env, op)) {
772                                         int nr = get_irn_idx(op);
773                                         const char *msg = "-";
774
775                                         if(!bitset_is_set(live, nr)) {
776                                                 border_use(op, step, 1);
777                                                 bitset_set(live, nr);
778                                                 msg = "X";
779                                         }
780
781                                         DBG((dbg, LEVEL_4, "\t\t%s pos: %d, use: %+F\n", msg, i, op));
782                                 }
783                         }
784                 }
785                 ++step;
786         }
787
788         /*
789          * Add initial defs for all values live in.
790          */
791         foreach_pset(live_in, irn) {
792                 if(has_reg_class(env, irn)) {
793
794                         /* Mark the value live in. */
795                         bitset_set(live, get_irn_idx(irn));
796
797                         /* Add the def */
798                         border_def(irn, step, 0);
799                 }
800         }
801
802         del_pset(live_in);
803         del_pset(live_end);
804 }
805
806 static void assign(ir_node *block, void *env_ptr)
807 {
808         be_chordal_alloc_env_t *alloc_env = env_ptr;
809         be_chordal_env_t *env       = alloc_env->chordal_env;
810         bitset_t *live              = alloc_env->live;
811         bitset_t *colors            = alloc_env->colors;
812         bitset_t *in_colors         = alloc_env->in_colors;
813         const arch_env_t *arch_env  = env->birg->main_env->arch_env;
814         struct list_head *head      = get_block_border_head(env, block);
815         be_lv_t *lv                 = env->birg->lv;
816         pset *live_in               = be_lv_pset_put_in(lv, block, pset_new_ptr_default());
817
818         const ir_node *irn;
819         border_t *b;
820         DEBUG_ONLY(firm_dbg_module_t *dbg = env->dbg;)
821
822         bitset_clear_all(colors);
823         bitset_clear_all(live);
824         bitset_clear_all(in_colors);
825
826         DBG((dbg, LEVEL_4, "Assigning colors for block %+F\n", block));
827         DBG((dbg, LEVEL_4, "\tusedef chain for block\n"));
828         list_for_each_entry(border_t, b, head, list) {
829                 DBG((dbg, LEVEL_4, "\t%s %+F/%d\n", b->is_def ? "def" : "use",
830                                         b->irn, get_irn_idx(b->irn)));
831         }
832
833         /*
834          * Add initial defs for all values live in.
835          * Since their colors have already been assigned (The dominators were
836          * allocated before), we have to mark their colors as used also.
837          */
838         foreach_pset(live_in, irn) {
839                 if(has_reg_class(env, irn)) {
840                         const arch_register_t *reg = arch_get_irn_register(arch_env, irn);
841                         int col;
842
843                         assert(reg && "Node must have been assigned a register");
844                         col = arch_register_get_index(reg);
845
846                         DBG((dbg, LEVEL_4, "%+F has reg %s\n", irn, reg->name));
847
848                         /* Mark the color of the live in value as used. */
849                         bitset_set(colors, col);
850                         bitset_set(in_colors, col);
851
852                         /* Mark the value live in. */
853                         bitset_set(live, get_irn_idx(irn));
854                 }
855         }
856
857         /*
858          * Mind that the sequence
859          * of defs from back to front defines a perfect
860          * elimination order. So, coloring the definitions from first to last
861          * will work.
862          */
863         list_for_each_entry_reverse(border_t, b, head, list) {
864                 ir_node *irn = b->irn;
865                 int nr       = get_irn_idx(irn);
866                 int ignore   = arch_irn_is(arch_env, irn, ignore);
867
868                 /*
869                  * Assign a color, if it is a local def. Global defs already have a
870                  * color.
871                  */
872                 if(b->is_def && !be_is_live_in(lv, block, irn)) {
873                         const arch_register_t *reg;
874                         int col = NO_COLOR;
875
876                         if(pset_find_ptr(alloc_env->pre_colored, irn) || ignore) {
877                                 reg = arch_get_irn_register(arch_env, irn);
878                                 col = reg->index;
879                                 assert(!bitset_is_set(colors, col) && "pre-colored register must be free");
880                         }
881
882                         else {
883                                 col = get_next_free_reg(alloc_env, colors);
884                                 reg = arch_register_for_index(env->cls, col);
885                                 assert(arch_get_irn_register(arch_env, irn) == NULL && "This node must not have been assigned a register yet");
886                                 assert(!arch_register_type_is(reg, ignore) && "Must not assign ignore register");
887                         }
888
889                         bitset_set(colors, col);
890                         arch_set_irn_register(arch_env, irn, reg);
891
892                         DBG((dbg, LEVEL_1, "\tassigning register %s(%d) to %+F\n", arch_register_get_name(reg), col, irn));
893
894                         assert(!bitset_is_set(live, nr) && "Value's definition must not have been encountered");
895                         bitset_set(live, nr);
896                 }
897
898                 /* Clear the color upon a use. */
899                 else if(!b->is_def) {
900                         const arch_register_t *reg = arch_get_irn_register(arch_env, irn);
901                         int col;
902
903                         assert(reg && "Register must have been assigned");
904
905                         col = arch_register_get_index(reg);
906                         assert(bitset_is_set(live, nr) && "Cannot have a non live use");
907
908                         bitset_clear(colors, col);
909                         bitset_clear(live, nr);
910                 }
911         }
912
913         del_pset(live_in);
914 }
915
916 void be_ra_chordal_color(be_chordal_env_t *chordal_env)
917 {
918         be_chordal_alloc_env_t env;
919         char buf[256];
920         be_irg_t *birg = chordal_env->birg;
921
922         int colors_n          = arch_register_class_n_regs(chordal_env->cls);
923         ir_graph *irg         = chordal_env->irg;
924
925
926         be_assure_dom_front(birg);
927         be_assure_liveness(birg);
928         assure_doms(irg);
929
930         env.chordal_env   = chordal_env;
931         env.colors_n      = colors_n;
932         env.colors        = bitset_alloca(colors_n);
933         env.tmp_colors    = bitset_alloca(colors_n);
934         env.in_colors     = bitset_alloca(colors_n);
935         env.pre_colored   = pset_new_ptr_default();
936         FIRM_DBG_REGISTER(env.constr_dbg, "firm.be.chordal.constr");
937
938
939         /* Handle register targeting constraints */
940         dom_tree_walk_irg(irg, constraints, NULL, &env);
941
942         if(chordal_env->opts->dump_flags & BE_CH_DUMP_CONSTR) {
943                 snprintf(buf, sizeof(buf), "-%s-constr", chordal_env->cls->name);
944                 be_dump(chordal_env->irg, buf, dump_ir_block_graph_sched);
945         }
946
947         env.live = bitset_malloc(get_irg_last_idx(chordal_env->irg));
948
949         /* First, determine the pressure */
950         dom_tree_walk_irg(irg, pressure, NULL, &env);
951
952         /* Assign the colors */
953         dom_tree_walk_irg(irg, assign, NULL, &env);
954
955         if(chordal_env->opts->dump_flags & BE_CH_DUMP_TREE_INTV) {
956                 plotter_t *plotter;
957                 ir_snprintf(buf, sizeof(buf), "ifg_%s_%F.eps", chordal_env->cls->name, irg);
958                 plotter = new_plotter_ps(buf);
959                 draw_interval_tree(&draw_chordal_def_opts, chordal_env, plotter);
960                 plotter_free(plotter);
961         }
962
963         bitset_free(env.live);
964         del_pset(env.pre_colored);
965 }