74ccaac4c7ad088560ead0d9547592abc5f6ebd0
[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 results.
344                    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                         out_op->partner  = partner;
419                         partner->partner = out_op;
420                 }
421         }
422 }
423
424
425 static ir_node *pre_process_constraints(be_chordal_alloc_env_t *alloc_env,
426                                         be_insn_t **the_insn)
427 {
428         be_chordal_env_t *env       = alloc_env->chordal_env;
429         const arch_env_t *aenv      = env->birg->main_env->arch_env;
430         be_insn_t *insn             = *the_insn;
431         ir_node *perm               = NULL;
432         bitset_t *out_constr        = bitset_alloca(env->cls->n_regs);
433         const ir_edge_t *edge;
434         int i;
435
436         assert(insn->has_constraints && "only do this for constrained nodes");
437
438         /*
439                 Collect all registers that occur in output constraints.
440                 This is necessary, since if the insn has one of these as an input constraint
441                 and the corresponding operand interferes with the insn, the operand must
442                 be copied.
443         */
444         for(i = 0; i < insn->use_start; ++i) {
445                 be_operand_t *op = &insn->ops[i];
446                 if(op->has_constraints)
447                         bitset_or(out_constr, op->regs);
448         }
449
450         /*
451                 Make the Perm, recompute liveness and re-scan the insn since the
452                 in operands are now the Projs of the Perm.
453         */
454         perm = insert_Perm_after(env->birg, env->cls, sched_prev(insn->irn));
455
456         /* Registers are propagated by insert_Perm_after(). Clean them here! */
457         if(perm == NULL)
458                 return NULL;
459
460         be_stat_ev("constr_perm", get_irn_arity(perm));
461         foreach_out_edge(perm, edge) {
462                 ir_node *proj = get_edge_src_irn(edge);
463                 arch_set_irn_register(aenv, proj, NULL);
464         }
465
466         /*
467                 We also have to re-build the insn since the input operands are now the Projs of
468                 the Perm. Recomputing liveness is also a good idea if a Perm is inserted, since
469                 the live sets may change.
470         */
471         // be_liveness_recompute(lv);
472         obstack_free(env->obst, insn);
473         *the_insn = insn = chordal_scan_insn(env, insn->irn);
474
475         /*
476                 Copy the input constraints of the insn to the Perm as output
477                 constraints. Succeeding phases (coalescing) will need that.
478         */
479         for(i = insn->use_start; i < insn->n_ops; ++i) {
480                 be_operand_t *op = &insn->ops[i];
481                 ir_node *proj = op->carrier;
482                 /*
483                         Note that the predecessor must not be a Proj of the Perm,
484                         since ignore-nodes are not Perm'ed.
485                 */
486                 if(op->has_constraints &&  is_Proj(proj) && get_Proj_pred(proj) == perm) {
487                         be_set_constr_limited(perm, BE_OUT_POS(get_Proj_proj(proj)), op->req);
488                 }
489         }
490
491         return perm;
492 }
493
494 static ir_node *handle_constraints(be_chordal_alloc_env_t *alloc_env, ir_node *irn, int *silent)
495 {
496         const arch_env_t *aenv;
497         int n_regs;
498         bitset_t *bs;
499         ir_node **alloc_nodes;
500         hungarian_problem_t *bp;
501         int *assignment;
502         pmap *partners;
503         int i, n_alloc;
504         bitset_pos_t col;
505         const ir_edge_t *edge;
506         ir_node *perm = NULL;
507         int match_res, cost;
508         be_chordal_env_t *env  = alloc_env->chordal_env;
509         void *base             = obstack_base(env->obst);
510         be_insn_t *insn        = chordal_scan_insn(env, irn);
511         ir_node *res           = insn->next_insn;
512         int be_silent          = *silent;
513         be_irg_t *birg         = env->birg;
514
515         if(insn->pre_colored) {
516                 int i;
517                 for(i = 0; i < insn->use_start; ++i)
518                         pset_insert_ptr(alloc_env->pre_colored, insn->ops[i].carrier);
519         }
520
521         /*
522                 If the current node is a barrier toggle the silent flag.
523                 If we are in the start block, we are ought to be silent at the beginning,
524                 so the toggling activates the constraint handling but skips the barrier.
525                 If we are in the end block we handle the in requirements of the barrier
526                 and set the rest to silent.
527         */
528         if(be_is_Barrier(irn))
529                 *silent = !*silent;
530
531         if(be_silent)
532                 goto end;
533
534         /*
535                 Perms inserted before the constraint handling phase are considered to be
536                 correctly precolored. These Perms arise during the ABI handling phase.
537         */
538         if(!insn->has_constraints)
539                 goto end;
540
541         aenv        = env->birg->main_env->arch_env;
542         n_regs      = env->cls->n_regs;
543         bs          = bitset_alloca(n_regs);
544         alloc_nodes = alloca(n_regs * sizeof(alloc_nodes[0]));
545         bp          = hungarian_new(n_regs, n_regs, 2, HUNGARIAN_MATCH_PERFECT);
546         // bipartite_t *bp        = bipartite_new(n_regs, n_regs);
547         assignment  = alloca(n_regs * sizeof(assignment[0]));
548         partners    = pmap_create();
549
550         /*
551                 prepare the constraint handling of this node.
552                 Perms are constructed and Copies are created for constrained values
553                 interfering with the instruction.
554         */
555         perm = pre_process_constraints(alloc_env, &insn);
556
557         /* find suitable in operands to the out operands of the node. */
558         pair_up_operands(alloc_env, insn);
559
560         /*
561                 look at the in/out operands and add each operand (and its possible partner)
562                 to a bipartite graph (left: nodes with partners, right: admissible colors).
563         */
564         for(i = 0, n_alloc = 0; i < insn->n_ops; ++i) {
565                 be_operand_t *op = &insn->ops[i];
566
567                 /*
568                         If the operand has no partner or the partner has not been marked
569                         for allocation, determine the admissible registers and mark it
570                         for allocation by associating the node and its partner with the
571                         set of admissible registers via a bipartite graph.
572                 */
573                 if(!op->partner || !pmap_contains(partners, op->partner->carrier)) {
574
575                         pmap_insert(partners, op->carrier, op->partner ? op->partner->carrier : NULL);
576                         alloc_nodes[n_alloc] = op->carrier;
577
578                         DBG((dbg, LEVEL_2, "\tassociating %+F and %+F\n", op->carrier, op->partner ? op->partner->carrier : NULL));
579
580                         bitset_clear_all(bs);
581                         get_decisive_partner_regs(bs, op, op->partner);
582
583                         DBG((dbg, LEVEL_2, "\tallowed registers for %+F: %B\n", op->carrier, bs));
584
585                         bitset_foreach(bs, col) {
586                                 hungarian_add(bp, n_alloc, col, 1);
587                                 // bipartite_add(bp, n_alloc, col);
588                         }
589
590                         n_alloc++;
591                 }
592         }
593
594         /*
595                 Put all nodes which live through the constrained instruction also to the
596                 allocation bipartite graph. They are considered unconstrained.
597         */
598         if(perm != NULL) {
599                 foreach_out_edge(perm, edge) {
600                         ir_node *proj = get_edge_src_irn(edge);
601
602                         assert(is_Proj(proj));
603
604                         if(!values_interfere(birg, proj, irn) || pmap_contains(partners, proj))
605                                 continue;
606
607                         assert(n_alloc < n_regs);
608                         alloc_nodes[n_alloc] = proj;
609                         pmap_insert(partners, proj, NULL);
610
611                         bitset_clear_all(bs);
612                         arch_put_non_ignore_regs(aenv, env->cls, bs);
613                         bitset_andnot(bs, env->ignore_colors);
614                         bitset_foreach(bs, col) {
615                                 hungarian_add(bp, n_alloc, col, 1);
616                                 // bipartite_add(bp, n_alloc, col);
617                         }
618
619                         n_alloc++;
620                 }
621         }
622
623         /* Compute a valid register allocation. */
624         hungarian_prepare_cost_matrix(bp, HUNGARIAN_MODE_MAXIMIZE_UTIL);
625         match_res = hungarian_solve(bp, assignment, &cost, 1);
626         assert(match_res == 0 && "matching failed");
627         //bipartite_matching(bp, assignment);
628
629         /* Assign colors obtained from the matching. */
630         for(i = 0; i < n_alloc; ++i) {
631                 const arch_register_t *reg;
632                 ir_node *nodes[2];
633                 int j;
634
635                 assert(assignment[i] >= 0 && "there must have been a register assigned");
636                 reg = arch_register_for_index(env->cls, assignment[i]);
637
638                 nodes[0] = alloc_nodes[i];
639                 nodes[1] = pmap_get(partners, alloc_nodes[i]);
640
641                 for(j = 0; j < 2; ++j) {
642                         if(!nodes[j])
643                                 continue;
644
645                         arch_set_irn_register(aenv, nodes[j], reg);
646                         (void) pset_hinsert_ptr(alloc_env->pre_colored, nodes[j]);
647                         DBG((dbg, LEVEL_2, "\tsetting %+F to register %s\n", nodes[j], reg->name));
648                 }
649         }
650
651         /* Allocate the non-constrained Projs of the Perm. */
652         if(perm != NULL) {
653                 bitset_clear_all(bs);
654
655                 /* Put the colors of all Projs in a bitset. */
656                 foreach_out_edge(perm, edge) {
657                         ir_node *proj              = get_edge_src_irn(edge);
658                         const arch_register_t *reg = arch_get_irn_register(aenv, proj);
659
660                         if(reg != NULL)
661                                 bitset_set(bs, reg->index);
662                 }
663
664                 /* Assign the not yet assigned Projs of the Perm a suitable color. */
665                 foreach_out_edge(perm, edge) {
666                         ir_node *proj              = get_edge_src_irn(edge);
667                         const arch_register_t *reg = arch_get_irn_register(aenv, proj);
668
669                         DBG((dbg, LEVEL_2, "\tchecking reg of %+F: %s\n", proj, reg ? reg->name : "<none>"));
670
671                         if(reg == NULL) {
672                                 col = get_next_free_reg(alloc_env, bs);
673                                 reg = arch_register_for_index(env->cls, col);
674                                 bitset_set(bs, reg->index);
675                                 arch_set_irn_register(aenv, proj, reg);
676                                 pset_insert_ptr(alloc_env->pre_colored, proj);
677                                 DBG((dbg, LEVEL_2, "\tsetting %+F to register %s\n", proj, reg->name));
678                         }
679                 }
680         }
681
682         //bipartite_free(bp);
683         hungarian_free(bp);
684         pmap_destroy(partners);
685
686 end:
687         obstack_free(env->obst, base);
688         return res;
689 }
690
691 /**
692  * Handle constraint nodes in each basic block.
693  * handle_constraints() inserts Perm nodes which perm
694  * over all values live at the constrained node right in front
695  * of the constrained node. These Perms signal a constrained node.
696  * For further comments, refer to handle_constraints().
697  */
698 static void constraints(ir_node *bl, void *data)
699 {
700         be_chordal_alloc_env_t *env = data;
701
702         /*
703                 Start silent in the start block.
704                 The silence remains until the first barrier is seen.
705                 Each other block is begun loud.
706         */
707         int silent                  = bl == get_irg_start_block(get_irn_irg(bl));
708         ir_node *irn;
709
710         /*
711                 If the block is the start block search the barrier and
712                 start handling constraints from there.
713         */
714
715         for(irn = sched_first(bl); !sched_is_end(irn);) {
716                 irn = handle_constraints(env, irn, &silent);
717         }
718 }
719
720 /**
721  * Annotate the register pressure to the nodes and compute
722  * the liveness intervals.
723  * @param block The block to do it for.
724  * @param env_ptr The environment.
725  */
726 static void pressure(ir_node *block, void *env_ptr)
727 {
728 /* Convenience macro for a def */
729 #define border_def(irn, step, real) \
730         border_add(env, head, irn, step, pressure--, 1, real)
731
732 /* Convenience macro for a use */
733 #define border_use(irn, step, real) \
734         border_add(env, head, irn, step, ++pressure, 0, real)
735
736         be_chordal_alloc_env_t *alloc_env = env_ptr;
737         be_chordal_env_t *env             = alloc_env->chordal_env;
738         bitset_t *live                    = alloc_env->live;
739         ir_node *irn;
740         be_lv_t *lv                       = env->birg->lv;
741
742         int i, n;
743         unsigned step = 0;
744         unsigned pressure = 0;
745         struct list_head *head;
746         pset *live_in  = be_lv_pset_put_in(lv, block, pset_new_ptr_default());
747         pset *live_end = be_lv_pset_put_end(lv, block, pset_new_ptr_default());
748
749         DBG((dbg, LEVEL_1, "Computing pressure in block %+F\n", block));
750         bitset_clear_all(live);
751
752         /* Set up the border list in the block info */
753         head = obstack_alloc(env->obst, sizeof(*head));
754         INIT_LIST_HEAD(head);
755         assert(pmap_get(env->border_heads, block) == NULL);
756         pmap_insert(env->border_heads, block, head);
757
758         /*
759          * Make final uses of all values live out of the block.
760          * They are necessary to build up real intervals.
761          */
762         foreach_pset(live_end, irn) {
763                 if(has_reg_class(env, irn)) {
764                         DBG((dbg, LEVEL_3, "\tMaking live: %+F/%d\n", irn, get_irn_idx(irn)));
765                         bitset_set(live, get_irn_idx(irn));
766                         border_use(irn, step, 0);
767                 }
768         }
769         ++step;
770
771         /*
772          * Determine the last uses of a value inside the block, since they are
773          * relevant for the interval borders.
774          */
775         sched_foreach_reverse(block, irn) {
776                 DBG((dbg, LEVEL_1, "\tinsn: %+F, pressure: %d\n", irn, pressure));
777                 DBG((dbg, LEVEL_2, "\tlive: %B\n", live));
778
779 #ifndef SCHEDULE_PROJS
780                 if (get_irn_mode(irn) == mode_T) {
781                         const ir_edge_t *edge;
782
783                         foreach_out_edge(irn, edge) {
784                                 ir_node *proj = get_edge_src_irn(edge);
785
786                                 /*
787                                  * If the node defines some value, which can put into a
788                                  * register of the current class, make a border for it.
789                                  */
790                                 if(has_reg_class(env, proj)) {
791                                         int nr = get_irn_idx(proj);
792
793                                         bitset_clear(live, nr);
794                                         border_def(proj, step, 1);
795                                 }
796                         }
797                 }
798 #endif
799                 /*
800                  * If the node defines some value, which can put into a
801                  * register of the current class, make a border for it.
802                  */
803                 if(has_reg_class(env, irn)) {
804                         int nr = get_irn_idx(irn);
805
806                         bitset_clear(live, nr);
807                         border_def(irn, step, 1);
808                 }
809
810                 /*
811                  * If the node is no phi node we can examine the uses.
812                  */
813                 if(!is_Phi(irn)) {
814                         for(i = 0, n = get_irn_arity(irn); i < n; ++i) {
815                                 ir_node *op = get_irn_n(irn, i);
816
817                                 if(has_reg_class(env, op)) {
818                                         int nr = get_irn_idx(op);
819                                         const char *msg = "-";
820
821                                         if(!bitset_is_set(live, nr)) {
822                                                 border_use(op, step, 1);
823                                                 bitset_set(live, nr);
824                                                 msg = "X";
825                                         }
826
827                                         DBG((dbg, LEVEL_4, "\t\t%s pos: %d, use: %+F\n", msg, i, op));
828                                 }
829                         }
830                 }
831                 ++step;
832         }
833
834         /*
835          * Add initial defs for all values live in.
836          */
837         foreach_pset(live_in, irn) {
838                 if(has_reg_class(env, irn)) {
839
840                         /* Mark the value live in. */
841                         bitset_set(live, get_irn_idx(irn));
842
843                         /* Add the def */
844                         border_def(irn, step, 0);
845                 }
846         }
847
848         del_pset(live_in);
849         del_pset(live_end);
850 }
851
852 static void assign(ir_node *block, void *env_ptr)
853 {
854         be_chordal_alloc_env_t *alloc_env = env_ptr;
855         be_chordal_env_t *env       = alloc_env->chordal_env;
856         bitset_t *live              = alloc_env->live;
857         bitset_t *colors            = alloc_env->colors;
858         bitset_t *in_colors         = alloc_env->in_colors;
859         const arch_env_t *arch_env  = env->birg->main_env->arch_env;
860         struct list_head *head      = get_block_border_head(env, block);
861         be_lv_t *lv                 = env->birg->lv;
862         pset *live_in               = be_lv_pset_put_in(lv, block, pset_new_ptr_default());
863
864         const ir_node *irn;
865         border_t *b;
866
867         bitset_clear_all(colors);
868         bitset_clear_all(live);
869         bitset_clear_all(in_colors);
870
871         DBG((dbg, LEVEL_4, "Assigning colors for block %+F\n", block));
872         DBG((dbg, LEVEL_4, "\tusedef chain for block\n"));
873         list_for_each_entry(border_t, b, head, list) {
874                 DBG((dbg, LEVEL_4, "\t%s %+F/%d\n", b->is_def ? "def" : "use",
875                                         b->irn, get_irn_idx(b->irn)));
876         }
877
878         /*
879          * Add initial defs for all values live in.
880          * Since their colors have already been assigned (The dominators were
881          * allocated before), we have to mark their colors as used also.
882          */
883         foreach_pset(live_in, irn) {
884                 if(has_reg_class(env, irn)) {
885                         const arch_register_t *reg = arch_get_irn_register(arch_env, irn);
886                         int col;
887
888                         assert(reg && "Node must have been assigned a register");
889                         col = arch_register_get_index(reg);
890
891                         DBG((dbg, LEVEL_4, "%+F has reg %s\n", irn, reg->name));
892
893                         /* Mark the color of the live in value as used. */
894                         bitset_set(colors, col);
895                         bitset_set(in_colors, col);
896
897                         /* Mark the value live in. */
898                         bitset_set(live, get_irn_idx(irn));
899                 }
900         }
901
902         /*
903          * Mind that the sequence of defs from back to front defines a perfect
904          * elimination order. So, coloring the definitions from first to last
905          * will work.
906          */
907         list_for_each_entry_reverse(border_t, b, head, list) {
908                 ir_node *irn = b->irn;
909                 int nr       = get_irn_idx(irn);
910                 int ignore   = arch_irn_is(arch_env, irn, ignore);
911
912                 /*
913                  * Assign a color, if it is a local def. Global defs already have a
914                  * color.
915                  */
916                 if(b->is_def && !be_is_live_in(lv, block, irn)) {
917                         const arch_register_t *reg;
918                         int col = NO_COLOR;
919
920                         if(ignore || pset_find_ptr(alloc_env->pre_colored, irn)) {
921                                 reg = arch_get_irn_register(arch_env, irn);
922                                 col = reg->index;
923                                 assert(!bitset_is_set(colors, col) && "pre-colored register must be free");
924                         } else {
925                                 col = get_next_free_reg(alloc_env, colors);
926                                 reg = arch_register_for_index(env->cls, col);
927                                 assert(arch_get_irn_register(arch_env, irn) == NULL && "This node must not have been assigned a register yet");
928                                 assert(!arch_register_type_is(reg, ignore) && "Must not assign ignore register");
929                         }
930
931                         bitset_set(colors, col);
932                         arch_set_irn_register(arch_env, irn, reg);
933
934                         DBG((dbg, LEVEL_1, "\tassigning register %s(%d) to %+F\n", arch_register_get_name(reg), col, irn));
935
936                         assert(!bitset_is_set(live, nr) && "Value's definition must not have been encountered");
937                         bitset_set(live, nr);
938                 }
939
940                 /* Clear the color upon a use. */
941                 else if(!b->is_def) {
942                         const arch_register_t *reg = arch_get_irn_register(arch_env, irn);
943                         int col;
944
945                         assert(reg && "Register must have been assigned");
946
947                         col = arch_register_get_index(reg);
948 #ifndef NDEBUG
949                         if(!arch_register_type_is(reg, ignore)) {
950                                 assert(bitset_is_set(live, nr) && "Cannot have a non live use");
951                         }
952 #endif
953
954                         bitset_clear(colors, col);
955                         bitset_clear(live, nr);
956                 }
957         }
958
959         del_pset(live_in);
960 }
961
962 /**
963  * A new assign...
964  */
965 static void assign_new(ir_node *block, be_chordal_alloc_env_t *alloc_env, bitset_t *live_end_dom)
966 {
967         be_chordal_env_t *env      = alloc_env->chordal_env;
968         bitset_t *colors           = alloc_env->colors;
969         bitset_t *in_colors        = alloc_env->in_colors;
970         bitset_t *live             = bitset_irg_malloc(env->irg);
971         const arch_env_t *arch_env = env->birg->main_env->arch_env;
972         be_irg_t *birg             = env->birg;
973
974         bitset_pos_t elm;
975         ir_node *irn;
976
977         bitset_clear_all(colors);
978         bitset_clear_all(in_colors);
979
980         /*
981          * All variables which are live in to this block are live out
982          * of the immediate dominator thanks to SSA properties. As we
983          * have already visited the immediate dominator, we know these
984          * variables. The only tjing left is to check wheather they are live
985          * in here (they also could be phi arguments to some ohi not
986          * in this block, hence we have to check).
987          */
988         bitset_foreach (live_end_dom, elm) {
989                 ir_node *irn = get_idx_irn(env->irg, elm);
990                 if (be_is_live_in(birg->lv, block, irn)) {
991                         const arch_register_t *reg = arch_get_irn_register(arch_env, irn);
992                         int col;
993
994                         assert(be_is_live_in(env->birg->lv, block, irn));
995                         assert(reg && "Node must have been assigned a register");
996                         col = arch_register_get_index(reg);
997
998                         DBG((dbg, LEVEL_4, "%+F has reg %s\n", irn, reg->name));
999
1000                         /* Mark the color of the live in value as used. */
1001                         bitset_set(colors, col);
1002                         bitset_set(in_colors, col);
1003
1004                         /* Mark the value live in. */
1005                         bitset_set(live, elm);
1006                 }
1007
1008                 else {
1009                         assert(!be_is_live_in(env->birg->lv, block, irn));
1010                 }
1011         }
1012
1013         /*
1014          * Mind that the sequence of defs from back to front defines a perfect
1015          * elimination order. So, coloring the definitions from first to last
1016          * will work.
1017          */
1018         sched_foreach (block, irn) {
1019                 int nr       = get_irn_idx(irn);
1020                 int ignore   = arch_irn_is(arch_env, irn, ignore);
1021
1022                 /* Clear the color upon a last use. */
1023                 if(!is_Phi(irn)) {
1024                         int i;
1025                         for (i = get_irn_arity(irn) - 1; i >= 0; --i) {
1026                                 ir_node *op = get_irn_n(irn, i);
1027
1028                                 /*
1029                                  * If the reg class matches and the operand is not live after
1030                                  * the node, irn is a last use of op and the register can
1031                                  * be freed.
1032                                  */
1033                                 if (has_reg_class(env, op)) {
1034                                         if (!be_lv_chk_after_irn(birg, op, irn)) {
1035                                                 const arch_register_t *reg = arch_get_irn_register(arch_env, op);
1036                                                 int col;
1037
1038                                                 assert(reg && "Register must have been assigned");
1039                                                 col = arch_register_get_index(reg);
1040                                                 bitset_clear(colors, col);
1041                                                 bitset_clear(live, nr);
1042                                         }
1043                                 }
1044                         }
1045                 }
1046
1047                 if (has_reg_class(env, irn)) {
1048                         const arch_register_t *reg;
1049                         int col = NO_COLOR;
1050
1051                         /*
1052                          * Assign a color, if it is a local def. Global defs already have a
1053                          * color.
1054                          */
1055                         if(ignore || pset_find_ptr(alloc_env->pre_colored, irn)) {
1056                                 reg = arch_get_irn_register(arch_env, irn);
1057                                 col = reg->index;
1058                                 assert(!bitset_is_set(colors, col) && "pre-colored register must be free");
1059                         } else {
1060                                 col = get_next_free_reg(alloc_env, colors);
1061                                 reg = arch_register_for_index(env->cls, col);
1062                                 assert(arch_get_irn_register(arch_env, irn) == NULL && "This node must not have been assigned a register yet");
1063                                 assert(!arch_register_type_is(reg, ignore) && "Must not assign ignore register");
1064                         }
1065
1066                         bitset_set(colors, col);
1067                         arch_set_irn_register(arch_env, irn, reg);
1068
1069                         DBG((dbg, LEVEL_1, "\tassigning register %s(%d) to %+F\n", arch_register_get_name(reg), col, irn));
1070
1071                         assert(!bitset_is_set(live, nr) && "Value's definition must not have been encountered");
1072                         bitset_set(live, nr);
1073                 }
1074
1075         }
1076
1077         dominates_for_each (block, irn) {
1078                 assign_new(irn, alloc_env, live);
1079         }
1080
1081         bitset_free(live);
1082 }
1083
1084 void be_ra_chordal_color(be_chordal_env_t *chordal_env)
1085 {
1086         be_chordal_alloc_env_t env;
1087         char buf[256];
1088         be_lv_t *lv;
1089         be_irg_t *birg = chordal_env->birg;
1090         const arch_register_class_t *cls = chordal_env->cls;
1091
1092         int colors_n          = arch_register_class_n_regs(cls);
1093         ir_graph *irg         = chordal_env->irg;
1094         int allocatable_regs  = colors_n - be_put_ignore_regs(birg, cls, NULL);
1095
1096         /* some special classes contain only ignore regs, no work to be done */
1097         if(allocatable_regs == 0)
1098                 return;
1099
1100         be_assure_dom_front(birg);
1101         lv = be_assure_liveness(birg);
1102         be_liveness_assure_sets(lv);
1103         be_liveness_assure_chk(lv);
1104
1105         assure_doms(irg);
1106
1107         env.chordal_env   = chordal_env;
1108         env.colors_n      = colors_n;
1109         env.colors        = bitset_alloca(colors_n);
1110         env.tmp_colors    = bitset_alloca(colors_n);
1111         env.in_colors     = bitset_alloca(colors_n);
1112         env.pre_colored   = pset_new_ptr_default();
1113
1114         /* Handle register targeting constraints */
1115         dom_tree_walk_irg(irg, constraints, NULL, &env);
1116
1117         if(chordal_env->opts->dump_flags & BE_CH_DUMP_CONSTR) {
1118                 snprintf(buf, sizeof(buf), "-%s-constr", chordal_env->cls->name);
1119                 be_dump(chordal_env->irg, buf, dump_ir_block_graph_sched);
1120         }
1121
1122         env.live = bitset_malloc(get_irg_last_idx(chordal_env->irg));
1123
1124         /* First, determine the pressure */
1125         dom_tree_walk_irg(irg, pressure, NULL, &env);
1126
1127         /* Assign the colors */
1128 #ifdef NEW_STYLE_ASSIGN
1129         assign_new(get_irg_start_block(irg), &env, env.live);
1130 #else
1131         dom_tree_walk_irg(irg, assign, NULL, &env);
1132 #endif
1133
1134         if(chordal_env->opts->dump_flags & BE_CH_DUMP_TREE_INTV) {
1135                 plotter_t *plotter;
1136                 ir_snprintf(buf, sizeof(buf), "ifg_%s_%F.eps", chordal_env->cls->name, irg);
1137                 plotter = new_plotter_ps(buf);
1138                 draw_interval_tree(&draw_chordal_def_opts, chordal_env, plotter);
1139                 plotter_free(plotter);
1140         }
1141
1142         bitset_free(env.live);
1143         del_pset(env.pre_colored);
1144 }
1145
1146 void be_init_chordal(void)
1147 {
1148         FIRM_DBG_REGISTER(dbg, "firm.be.chordal");
1149 }
1150
1151 BE_REGISTER_MODULE_CONSTRUCTOR(be_init_chordal);