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