6ad048c16662e4bb489bb62d0e3a4d020083f3cf
[libfirm] / be / bechordal.c
1 /**
2  * Chordal register allocation.
3  * @author Sebastian Hack
4  * @date 8.12.2004
5  *
6  * Copyright (C) Universitaet Karlsruhe
7  * Released under the GPL
8  */
9
10 #ifdef HAVE_CONFIG_H
11 #include "config.h"
12 #endif
13
14 #ifdef HAVE_MALLOC_H
15 #include <malloc.h>
16 #endif
17
18 #ifdef HAVE_ALLOCA_H
19 #include <alloca.h>
20 #endif
21
22 #include <ctype.h>
23
24 #include "obst.h"
25 #include "pset.h"
26 #include "list.h"
27 #include "bitset.h"
28 #include "iterator.h"
29
30 #include "irmode_t.h"
31 #include "irgraph_t.h"
32 #include "irprintf_t.h"
33 #include "irgwalk.h"
34 #include "irdump.h"
35 #include "irdom.h"
36 #include "debug.h"
37 #include "xmalloc.h"
38
39 #include "beutil.h"
40 #include "besched.h"
41 #include "benumb_t.h"
42 #include "besched_t.h"
43 #include "belive_t.h"
44 #include "benode_t.h"
45 #include "bearch.h"
46 #include "beifg.h"
47
48 #include "bechordal_t.h"
49 #include "bechordal_draw.h"
50
51 #define DBG_LEVEL SET_LEVEL_0
52 #define DBG_LEVEL_CHECK SET_LEVEL_0
53
54 #define NO_COLOR (-1)
55
56 #undef DUMP_INTERVALS
57
58 typedef struct _be_chordal_alloc_env_t {
59         be_chordal_env_t *chordal_env;
60
61         pset *pre_colored;    /**< Set of precolored nodes. */
62         bitset_t *live;                         /**< A liveness bitset. */
63         bitset_t *colors;                       /**< The color mask. */
64         bitset_t *in_colors;        /**< Colors used by live in values. */
65         int colors_n;               /**< The number of colors. */
66 } be_chordal_alloc_env_t;
67
68 #include "fourcc.h"
69
70 /* Make a fourcc for border checking. */
71 #define BORDER_FOURCC                           FOURCC('B', 'O', 'R', 'D')
72
73 static void check_border_list(struct list_head *head)
74 {
75   border_t *x;
76   list_for_each_entry(border_t, x, head, list) {
77     assert(x->magic == BORDER_FOURCC);
78   }
79 }
80
81 static void check_heads(be_chordal_env_t *env)
82 {
83   pmap_entry *ent;
84   for(ent = pmap_first(env->border_heads); ent; ent = pmap_next(env->border_heads)) {
85     /* ir_printf("checking border list of block %+F\n", ent->key); */
86     check_border_list(ent->value);
87   }
88 }
89
90
91 /**
92  * Add an interval border to the list of a block's list
93  * of interval border.
94  * @note You always have to create the use before the def.
95  * @param env The environment.
96  * @param head The list head to enqueue the borders.
97  * @param irn The node (value) the border belongs to.
98  * @param pressure The pressure at this point in time.
99  * @param step A time step for the border.
100  * @param is_def Is the border a use or a def.
101  * @return The created border.
102  */
103 static INLINE border_t *border_add(be_chordal_env_t *env, struct list_head *head,
104                         ir_node *irn, unsigned step, unsigned pressure,
105                         unsigned is_def, unsigned is_real)
106 {
107         border_t *b;
108
109         if(!is_def) {
110                 border_t *def;
111
112                 b = obstack_alloc(&env->obst, sizeof(*b));
113
114                 /* also allocate the def and tie it to the use. */
115                 def = obstack_alloc(&env->obst, sizeof(*def));
116                 memset(def, 0, sizeof(*def));
117                 b->other_end = def;
118                 def->other_end = b;
119
120                 /*
121                  * Set the link field of the irn to the def.
122                  * This strongly relies on the fact, that the use is always
123                  * made before the def.
124                  */
125                 set_irn_link(irn, def);
126
127                 b->magic = BORDER_FOURCC;
128                 def->magic = BORDER_FOURCC;
129         }
130
131         /*
132          * If the def is encountered, the use was made and so was the
133          * the def node (see the code above). It was placed into the
134          * link field of the irn, so we can get it there.
135          */
136         else {
137                 b = get_irn_link(irn);
138
139                 assert(b && b->magic == BORDER_FOURCC && "Illegal border encountered");
140         }
141
142         b->pressure = pressure;
143         b->is_def = is_def;
144         b->is_real = is_real;
145         b->irn = irn;
146         b->step = step;
147         list_add_tail(&b->list, head);
148         DBG((env->dbg, LEVEL_5, "\t\t%s adding %+F, step: %d\n", is_def ? "def" : "use", irn, step));
149
150
151         return b;
152 }
153
154 /**
155  * Check, if an irn is of the register class currently under processing.
156  * @param env The chordal environment.
157  * @param irn The node.
158  * @return 1, if the node is of that register class, 0 if not.
159  */
160 static INLINE int has_reg_class(const be_chordal_env_t *env, const ir_node *irn)
161 {
162   return arch_irn_has_reg_class(env->main_env->arch_env, irn, -1, env->cls);
163 }
164
165 #define has_limited_constr(req, irn) \
166         (arch_get_register_req(arch_env, (req), irn, -1) && (req)->type == arch_register_req_type_limited)
167
168 static int try_pre_color(be_chordal_env_t *env, ir_node *irn,
169                                                  pset *pre_colored, bitset_t *colors_used)
170 {
171         arch_register_req_t req;
172
173         if(arch_get_register_req(env->main_env->arch_env, &req, irn, -1) && arch_register_req_is(&req, limited)) {
174
175                 bitset_t *bs          = bitset_alloca(env->cls->n_regs);
176                 const arch_register_t *reg;
177                 int col;
178
179                 req.limited(irn, -1, bs);
180                 col = bitset_next_set(bs, 0);
181                 reg = arch_register_for_index(env->cls, col);
182
183                 pset_insert_ptr(pre_colored, irn);
184                 arch_set_irn_register(env->main_env->arch_env, irn, reg);
185
186                 bitset_set(colors_used, col);
187
188                 DBG((env->dbg, LEVEL_2, "pre coloring %+F with %s\n", irn, reg->name));
189
190                 return 1;
191         }
192
193         return 0;
194 }
195
196 /**
197  * Handle register targeting constraints signaled by a Perm.
198  * @param alloc_env    Private data for the allocation phase.
199  * @param perm         The Perm node guarding the constrained node.
200  * @return             The constrained node.
201
202                 Pro-coloring works as follows:
203
204          +-----------------------------------+
205          |            Perm                   |
206          +---.-------.--------.---------.----+
207              |       |        |         |
208          +---+--+    |        |         |
209          | Proj |    |        |         |
210          +------+    |        |         |
211                      |        |         |
212                   +--+---+    |         |
213                   | Proj |    |         |
214                   +--.---+    |         |
215                      |        |         |
216                      |     +--+---+     |
217                      |     | Proj |     |
218                      |     +------+     |
219                       |                 |
220                       |             +---+--+
221                        `-.          | Proj | Result:
222                           `._       +---.--+ R1
223                              `.         |
224                                `-.      |
225                                   `._   |
226                                     +`.-+--+
227                                     |Constr| Result:
228                                     +------+ R2
229
230                 1) Look at all Projs of the Perm if they have output constraints.
231                    If one has an output constraint, pre-color it, else record it
232                    in the set leftover. Its color has to be chosen after all
233                    constrained nodes are colored. Furthermore record all colors
234                    used in the pre-coloring in the set colors_used.
235
236                 2) Look whether the first node not a Proj (this is the constrained
237                    node due to which the Perm has been inserted) has an output
238                    constraint. If yes, pre-color the node accordingly else do nothing
239                    since the node's input constraints are modelled by the Proj's
240                    output constraint.
241
242                    There's one subtle point here: If thenode has an output constraint
243                    and the live range of some Proj ends at that node, we must give
244                    that Proj the color of the constrained node. Otherwise the
245                    available colors may not suffice for the rest of the projs.
246
247                 3) At last, color the Projs which have not been colored yet with the
248                    left over colors.
249
250                    So afterwards, everything including the constrained node will
251                    be colored and the assign() phase can complete this coloring.
252                    Note that therefore, we put the pre-colored nodes in a set
253                    called pre_colored().
254
255  */
256 static ir_node *handle_constraints_at_perm(be_chordal_alloc_env_t *alloc_env, ir_node *perm)
257 {
258         be_chordal_env_t *env      = alloc_env->chordal_env;
259         firm_dbg_module_t *dbg     = env->dbg;
260         const arch_env_t *arch_env = env->main_env->arch_env;
261
262         pset *leftover        = pset_new_ptr(8);
263         pset *pre_colored     = pset_new_ptr(8);
264         bitset_t *colors_used = bitset_alloca(env->cls->n_regs);
265         ir_node *irn, *cnstr, *last;
266         int has_cnstr = 0;
267
268         assert(be_is_Perm(perm));
269
270         DBG((dbg, LEVEL_2, "Constraints on %+F\n", perm));
271
272         /*
273          * Color constrained Projs first.
274          */
275         for(irn = sched_next(perm); is_Proj(irn); irn = sched_next(irn))
276                 if(!try_pre_color(env, irn, pre_colored, colors_used))
277                         pset_insert_ptr(leftover, irn);
278
279         cnstr = irn;
280         last  = irn;
281
282         if(get_irn_mode(cnstr) == mode_T) {
283                 for(irn = sched_next(cnstr); is_Proj(irn); irn = sched_next(irn))
284                         if(!try_pre_color(env, irn, pre_colored, colors_used))
285                                 pset_insert_ptr(leftover, irn);
286
287                 last = sched_prev(irn);
288         }
289
290         else
291                 try_pre_color(env, cnstr, pre_colored, colors_used);
292
293         for(irn = pset_first(leftover); irn; irn = pset_next(leftover)) {
294                 const arch_register_t *reg;
295                 ir_node *precol;
296                 int colored = 0;
297
298                 for(precol = pset_first(pre_colored); precol; precol = pset_next(pre_colored)) {
299                         if(!values_interfere(irn, precol)) {
300                                 reg = arch_get_irn_register(arch_env, irn);
301                                 arch_set_irn_register(arch_env, irn, reg);
302                                 pset_break(pre_colored);
303                                 colored = 1;
304                                 break;
305                         }
306                 }
307
308                 if(!colored) {
309                         int col = bitset_next_clear(colors_used, 0);
310
311                         assert(col >=0 && "There must be a register left");
312                         reg = arch_register_for_index(env->cls, col);
313                         arch_set_irn_register(arch_env, irn, reg);
314                         bitset_set(colors_used, reg->index);
315                         pset_insert_ptr(alloc_env->pre_colored, irn);
316
317                         DBG((dbg, LEVEL_2, "coloring leftover %+F with %s\n", irn, reg->name));
318                 }
319         }
320
321         pset_insert_pset_ptr(alloc_env->pre_colored, pre_colored);
322
323         del_pset(leftover);
324         del_pset(pre_colored);
325
326         return last;
327 }
328
329 /**
330  * Handle constraint nodes in each basic block.
331  * be_insert_constr_perms() inserts Perm nodes which perm
332  * over all values live at the constrained node right in front
333  * of the constrained node. These Perms signal a constrained node.
334  * For further comments, refer to handle_constraints_at_perm().
335  */
336 static void constraints(ir_node *bl, void *data)
337 {
338         be_chordal_alloc_env_t *env = data;
339         arch_env_t *arch_env        = env->chordal_env->main_env->arch_env;
340         ir_node *irn;
341
342         for(irn = sched_first(bl); !sched_is_end(irn); irn = sched_next(irn)) {
343                 if(be_is_Perm(irn) && arch_irn_has_reg_class(arch_env, irn, 0, env->chordal_env->cls))
344                         irn = handle_constraints_at_perm(env, irn);
345         }
346 }
347
348 /**
349  * Annotate the register pressure to the nodes and compute
350  * the liveness intervals.
351  * @param block The block to do it for.
352  * @param env_ptr The environment.
353  */
354 static void pressure(ir_node *block, void *env_ptr)
355 {
356 /* Convenience macro for a def */
357 #define border_def(irn, step, real) \
358         border_add(env, head, irn, step, pressure--, 1, real)
359
360 /* Convenience macro for a use */
361 #define border_use(irn, step, real) \
362         border_add(env, head, irn, step, ++pressure, 0, real)
363
364         be_chordal_alloc_env_t *alloc_env = env_ptr;
365         be_chordal_env_t *env             = alloc_env->chordal_env;
366         bitset_t *live                    = alloc_env->live;
367         firm_dbg_module_t *dbg            = env->dbg;
368         ir_node *irn;
369
370         int i, n;
371         unsigned step = 0;
372         unsigned pressure = 0;
373         struct list_head *head;
374         pset *live_in = put_live_in(block, pset_new_ptr_default());
375         pset *live_end = put_live_end(block, pset_new_ptr_default());
376
377         DBG((dbg, LEVEL_1, "Computing pressure in block %+F\n", block));
378         bitset_clear_all(live);
379
380         /* Set up the border list in the block info */
381         head = obstack_alloc(&env->obst, sizeof(*head));
382         INIT_LIST_HEAD(head);
383         assert(pmap_get(env->border_heads, block) == NULL);
384         pmap_insert(env->border_heads, block, head);
385
386         /*
387          * Make final uses of all values live out of the block.
388          * They are necessary to build up real intervals.
389          */
390         for(irn = pset_first(live_end); irn; irn = pset_next(live_end)) {
391                 if(has_reg_class(env, irn)) {
392                         DBG((dbg, LEVEL_3, "\tMaking live: %+F/%d\n", irn, get_irn_graph_nr(irn)));
393                         bitset_set(live, get_irn_graph_nr(irn));
394                         border_use(irn, step, 0);
395                 }
396         }
397         ++step;
398
399         /*
400          * Determine the last uses of a value inside the block, since they are
401          * relevant for the interval borders.
402          */
403         sched_foreach_reverse(block, irn) {
404                 DBG((dbg, LEVEL_1, "\tinsn: %+F, pressure: %d\n", irn, pressure));
405                 DBG((dbg, LEVEL_2, "\tlive: %b\n", live));
406
407                 /*
408                  * If the node defines some value, which can put into a
409                  * register of the current class, make a border for it.
410                  */
411                 if(has_reg_class(env, irn)) {
412                         int nr = get_irn_graph_nr(irn);
413
414                         bitset_clear(live, nr);
415                         border_def(irn, step, 1);
416                 }
417
418                 /*
419                  * If the node is no phi node we can examine the uses.
420                  */
421                 if(!is_Phi(irn)) {
422                         for(i = 0, n = get_irn_arity(irn); i < n; ++i) {
423                                 ir_node *op = get_irn_n(irn, i);
424
425                                 if(has_reg_class(env, op)) {
426                                         int nr = get_irn_graph_nr(op);
427
428                                         DBG((dbg, LEVEL_4, "\t\tpos: %d, use: %+F\n", i, op));
429
430                                         if(!bitset_is_set(live, nr)) {
431                                                 border_use(op, step, 1);
432                                                 bitset_set(live, nr);
433                                         }
434                                 }
435                         }
436                 }
437                 ++step;
438         }
439
440         /*
441          * Add initial defs for all values live in.
442          */
443         for(irn = pset_first(live_in); irn; irn = pset_next(live_in)) {
444                 if(has_reg_class(env, irn)) {
445
446                         /* Mark the value live in. */
447                         bitset_set(live, get_irn_graph_nr(irn));
448
449                         /* Add the def */
450                         border_def(irn, step, 0);
451                 }
452         }
453
454
455   del_pset(live_in);
456   del_pset(live_end);
457 }
458
459 static void assign(ir_node *block, void *env_ptr)
460 {
461         be_chordal_alloc_env_t *alloc_env = env_ptr;
462         be_chordal_env_t *env       = alloc_env->chordal_env;
463         firm_dbg_module_t *dbg      = env->dbg;
464         bitset_t *live              = alloc_env->live;
465         bitset_t *colors            = alloc_env->colors;
466         bitset_t *in_colors         = alloc_env->in_colors;
467         const arch_env_t *arch_env  = env->main_env->arch_env;
468
469         const ir_node *irn;
470         border_t *b;
471         struct list_head *head = get_block_border_head(env, block);
472         pset *live_in = put_live_in(block, pset_new_ptr_default());
473
474         bitset_clear_all(live);
475         bitset_clear_all(colors);
476         bitset_clear_all(in_colors);
477
478         DBG((dbg, LEVEL_4, "Assigning colors for block %+F\n", block));
479         DBG((dbg, LEVEL_4, "\tusedef chain for block\n"));
480         list_for_each_entry(border_t, b, head, list) {
481                 DBG((dbg, LEVEL_4, "\t%s %+F/%d\n", b->is_def ? "def" : "use",
482                                         b->irn, get_irn_graph_nr(b->irn)));
483         }
484
485         /*
486          * Add initial defs for all values live in.
487          * Since their colors have already been assigned (The dominators were
488          * allocated before), we have to mark their colors as used also.
489          */
490         for(irn = pset_first(live_in); irn; irn = pset_next(live_in)) {
491                 if(has_reg_class(env, irn)) {
492                         const arch_register_t *reg = arch_get_irn_register(arch_env, irn);
493                         int col;
494
495                         assert(reg && "Node must have been assigned a register");
496                         col = arch_register_get_index(reg);
497
498                         /* Mark the color of the live in value as used. */
499                         bitset_set(colors, col);
500                         bitset_set(in_colors, col);
501
502                         /* Mark the value live in. */
503                         bitset_set(live, get_irn_graph_nr(irn));
504                 }
505         }
506
507         /*
508          * Mind that the sequence of defs from back to front defines a perfect
509          * elimination order. So, coloring the definitions from first to last
510          * will work.
511          */
512         list_for_each_entry_reverse(border_t, b, head, list) {
513                 ir_node *irn = b->irn;
514                 int nr = get_irn_graph_nr(irn);
515
516                 /*
517                  * Assign a color, if it is a local def. Global defs already have a
518                  * color.
519                  */
520                 if(b->is_def && !is_live_in(block, irn)) {
521                         const arch_register_t *reg;
522                         int col = NO_COLOR;
523
524                         DBG((dbg, LEVEL_4, "\tcolors in use: %b\n", colors));
525
526                         if(pset_find_ptr(alloc_env->pre_colored, irn)) {
527                                 reg = arch_get_irn_register(arch_env, irn);
528                                 col = reg->index;
529                                 assert(!bitset_is_set(colors, col) && "pre-colored register must be free");
530                         }
531
532                         else {
533                                 col = bitset_next_clear(colors, 0);
534                                 reg = arch_register_for_index(env->cls, col);
535                                 assert(arch_get_irn_register(arch_env, irn) == NULL && "This node must not have been assigned a register yet");
536                         }
537
538                         bitset_set(colors, col);
539                         arch_set_irn_register(arch_env, irn, reg);
540
541                         DBG((dbg, LEVEL_1, "\tassigning register %s(%d) to %+F\n",
542             arch_register_get_name(reg), col, irn));
543
544                         assert(!bitset_is_set(live, nr) && "Value's definition must not have been encountered");
545                         bitset_set(live, nr);
546                 }
547
548                 /* Clear the color upon a use. */
549                 else if(!b->is_def) {
550                         const arch_register_t *reg = arch_get_irn_register(arch_env, irn);
551                         int col;
552
553                         assert(reg && "Register must have been assigned");
554
555                         col = arch_register_get_index(reg);
556                         assert(bitset_is_set(live, nr) && "Cannot have a non live use");
557
558                         bitset_clear(colors, col);
559                         bitset_clear(live, nr);
560                 }
561         }
562
563         del_pset(live_in);
564 }
565
566 void be_ra_chordal_color(be_chordal_env_t *chordal_env)
567 {
568         int node_count        = get_graph_node_count(chordal_env->irg);
569         int colors_n          = arch_register_class_n_regs(chordal_env->cls);
570         ir_graph *irg         = chordal_env->irg;
571
572         be_chordal_alloc_env_t env;
573
574         if(get_irg_dom_state(irg) != dom_consistent)
575                 compute_doms(irg);
576
577         env.chordal_env  = chordal_env;
578         env.live         = bitset_malloc(node_count);
579         env.colors       = bitset_malloc(colors_n);
580         env.in_colors    = bitset_malloc(colors_n);
581         env.colors_n     = colors_n;
582         env.pre_colored  = pset_new_ptr_default();
583
584         /* Handle register targeting constraints */
585         dom_tree_walk_irg(irg, constraints, NULL, &env);
586
587         /* First, determine the pressure */
588         dom_tree_walk_irg(irg, pressure, NULL, &env);
589
590         /* Assign the colors */
591         dom_tree_walk_irg(irg, assign, NULL, &env);
592
593 #ifdef DUMP_INTERVALS
594         {
595                 char buf[128];
596         plotter_t *plotter;
597
598                 ir_snprintf(buf, sizeof(buf), "ifg_%s_%F.eps", cls->name, irg);
599         plotter = new_plotter_ps(buf);
600
601         draw_interval_tree(&draw_chordal_def_opts, chordal_env, plotter, env->arch_env, cls);
602         plotter_free(plotter);
603         }
604 #endif
605
606         free(env.live);
607         free(env.colors);
608         free(env.in_colors);
609
610         del_pset(env.pre_colored);
611 }