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