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