bearch: Disallow passing Projs to get_irn_ops().
[libfirm] / ir / be / bechordal_draw.c
index c9a1edb..c317ed3 100644 (file)
@@ -1,20 +1,6 @@
 /*
- * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
- *
  * This file is part of libFirm.
- *
- * This file may be distributed and/or modified under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation and appearing in the file LICENSE.GPL included in the
- * packaging of this file.
- *
- * Licensees holding valid libFirm Professional Edition licenses may use
- * this file in accordance with the libFirm Commercial License.
- * Agreement provided with the Software.
- *
- * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
- * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE.
+ * Copyright (C) 2012 University of Karlsruhe.
  */
 
 /**
@@ -187,13 +173,9 @@ typedef struct draw_chordal_env_t {
        plotter_t                   *plotter;
        const draw_chordal_opts_t   *opts;
        struct obstack              obst;
-       int                         max_color;
 } draw_chordal_env_t;
 
 struct block_dims {
-       unsigned max_step;
-       int      min_step;
-       int      max_color;
        rect_t   box;
        rect_t   subtree_box;
 };
@@ -207,22 +189,16 @@ static void block_dims_walker(ir_node *block, void *data)
        const draw_chordal_opts_t *opts = env->opts;
        struct block_dims         *dims = OALLOCZ(&env->obst, struct block_dims);
 
-       dims->min_step = INT_MAX;
-
+       unsigned max_color = 0;
+       unsigned max_step  = 0;
        foreach_border_head(head, b) {
-               ir_node               *irn = b->irn;
-               const arch_register_t *reg = arch_get_irn_register(irn);
-               int                    col = reg->index;
-
-               dims->max_step  = MAX(dims->max_step, b->step);
-               dims->max_color = MAX(dims->max_color, col);
-               env->max_color  = MAX(env->max_color, col);
+               unsigned const col = arch_get_irn_register(b->irn)->index;
+               max_color = MAX(max_color, col);
+               max_step  = MAX(max_step,  b->step);
        }
 
-       dims->min_step = 1;
-
-       dims->box.w = (dims->max_color + 2) * opts->h_inter_gap;
-       dims->box.h = dims->max_step * opts->v_inter_gap;
+       dims->box.w = (max_color + 2) * opts->h_inter_gap;
+       dims->box.h =  max_step       * opts->v_inter_gap;
 
        pmap_insert(env->block_dims, block, dims);
 }
@@ -313,14 +289,20 @@ static void draw_block(ir_node *bl, void *data)
 
        foreach_border_head(head, b) {
                if (b->is_def) {
-                       const arch_register_t *reg = arch_get_irn_register(b->irn);
-                       int live_out = be_is_live_out(lv, bl, b->irn);
+                       /* Walk from def to use, so the link is set before retrieved. */
+                       set_irn_link(b->irn, b);
+               } else {
+                       ir_node               *const irn = b->irn;
+                       border_t        const *const def = (border_t const*)get_irn_link(irn);
+                       arch_register_t const *const reg = arch_get_irn_register(irn);
+
+                       int live_out = be_is_live_out(lv, bl, irn);
                        int x        = (reg->index + 1) * opts->h_inter_gap;
-                       int ystart   = (b->step) * opts->v_inter_gap;
-                       int ystop    = (b->other_end->step) * opts->v_inter_gap + (live_out ? 0 : opts->v_inter_gap / 2);
+                       int ystart   = def->step * opts->v_inter_gap;
+                       int ystop    =   b->step * opts->v_inter_gap + (live_out ? 0 : opts->v_inter_gap / 2);
 
                        color_t color;
-                       reg_to_color(env, bl, b->irn, &color);
+                       reg_to_color(env, bl, irn, &color);
 
                        x      += dims->box.x;
                        ystart += dims->box.y;
@@ -368,7 +350,9 @@ static void draw(draw_chordal_env_t *env, const rect_t *start_box)
        be_assure_live_chk(irg);
 
        p->vtab->begin(p, &bbox);
-       irg_block_walk_graph(env->chordal_env->irg, draw_block, NULL, env);
+       ir_reserve_resources(irg, IR_RESOURCE_IRN_LINK);
+       irg_block_walk_graph(irg, draw_block, NULL, env);
+       ir_free_resources(irg, IR_RESOURCE_IRN_LINK);
        p->vtab->finish(p);
 }
 
@@ -383,7 +367,6 @@ void draw_interval_tree(const draw_chordal_opts_t *opts,
        env.block_dims  = pmap_create();
        env.plotter     = plotter;
        env.cls         = chordal_env->cls;
-       env.max_color   = 0;
        env.chordal_env = chordal_env;
        obstack_init(&env.obst);