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