X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbechordal_draw.c;h=10a734f839f2475d344fbf6acbe579a280138eef;hb=77f1eeaeb90f2d231b0ccc2fcbe071a9b457e6c3;hp=45e775807c96b3c7e2c13be3b775fd1793c8f74f;hpb=165e48ff9dc8753e95565ddf6c58b3f128490406;p=libfirm diff --git a/ir/be/bechordal_draw.c b/ir/be/bechordal_draw.c index 45e775807..10a734f83 100644 --- a/ir/be/bechordal_draw.c +++ b/ir/be/bechordal_draw.c @@ -151,7 +151,7 @@ extern void plotter_free(plotter_t *self) } const draw_chordal_opts_t draw_chordal_def_opts = { - 10, 10, 30, 8 + 10, 10, 30, 8, 10, 10 }; typedef struct _draw_chordal_env_t { @@ -225,7 +225,7 @@ static void layout(const draw_chordal_env_t *env, ir_node *bl, int x) struct block_dims *dims = pmap_get(env->block_dims, bl); ir_node *sub; rect_t *rect = &dims->subtree_box; - int h_space = 0; + int h_space = 0, v_space = 0; memset(rect, 0, sizeof(*rect)); rect->x = x; @@ -239,14 +239,15 @@ static void layout(const draw_chordal_env_t *env, ir_node *bl, int x) rect->h = max(rect->h, bl_dim->subtree_box.h); h_space = opts->h_gap; + v_space = opts->v_gap; } rect->w = max(rect->w, dims->box.w + opts->h_gap); dims->box.x = x + doz(rect->w, dims->box.w) / 2; - dims->box.y = rect->h + opts->v_gap; + dims->box.y = rect->h + v_space; - rect->h += dims->box.h + opts->v_gap; + rect->h += dims->box.h + v_space; } static void set_y(const draw_chordal_env_t *env, ir_node *bl, int up) @@ -268,16 +269,27 @@ static void set_y(const draw_chordal_env_t *env, ir_node *bl, int up) } static color_t *reg_to_color(const draw_chordal_env_t *env, - ir_node *irn, color_t *color) + ir_node *rel_bl, ir_node *irn, color_t *color) { int i, n, phi_arg = 0; for(i = 0, n = get_irn_n_outs(irn); i < n && !phi_arg; ++i) phi_arg |= is_Phi(get_irn_out(irn, i)); +#if 1 color->r = is_Phi(irn) ? 0.5 : 0.0; color->g = phi_arg ? 0.5 : 0.0; color->b = 0.0; +#else + { + int live_in = is_live_in(rel_bl, irn); + int live_out = is_live_out(rel_bl, irn); + + color->r = live_in; + color->g = live_out; + color->b = 0.0; + } +#endif return color; @@ -310,13 +322,15 @@ static void draw_block(ir_node *bl, void *data) if(b->is_def) { const arch_register_t *reg = arch_get_irn_register(env->arch_env, b->irn, 0); int col = arch_register_get_index(reg); + int live_in = is_live_in(bl, b->irn); + int live_out = is_live_out(bl, b->irn); int x = (col + 1) * opts->h_inter_gap; - int ystart = (b->step + dims->min_step) * opts->v_inter_gap; - int ystop = (b->other_end->step - dims->min_step) - * opts->v_inter_gap + opts->v_inter_gap / 2; + 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); color_t color; - reg_to_color(env, b->irn, &color); + reg_to_color(env, bl, b->irn, &color); x += dims->box.x; ystart += dims->box.y; @@ -324,6 +338,9 @@ static void draw_block(ir_node *bl, void *data) env->plotter->vtab->set_color(env->plotter, &color); env->plotter->vtab->line(env->plotter, x, ystart, x, ystop); + + env->plotter->vtab->line(env->plotter, x - 2, ystart, x + 2, ystart); + env->plotter->vtab->line(env->plotter, x - 2, ystop, x + 2, ystop); } } @@ -337,12 +354,14 @@ static void draw_block(ir_node *bl, void *data) int x = (col + 1) * opts->h_inter_gap; color_t color; - reg_to_color(env, irn, &color); + reg_to_color(env, bl, irn, &color); env->plotter->vtab->set_color(env->plotter, &color); env->plotter->vtab->line(env->plotter, - dims->box.x + x, dims->box.y + dims->box.h, - dom_dims->box.x + x, dom_dims->box.y); + dims->box.x + x, + dims->box.y + dims->box.h, + dom_dims->box.x + x, + dom_dims->box.y); } } } @@ -362,11 +381,16 @@ static void draw_block(ir_node *bl, void *data) #endif } -static void draw(draw_chordal_env_t *env, const rect_t *bbox) +static void draw(draw_chordal_env_t *env, const rect_t *start_box) { plotter_t *p = env->plotter; + rect_t bbox; + + bbox.x = bbox.y = 0; + bbox.w = start_box->w + 2 * env->opts->x_margin; + bbox.h = start_box->h + 2 * env->opts->y_margin; - p->vtab->begin(p, bbox); + p->vtab->begin(p, &bbox); irg_block_walk_graph(env->chordal_env->irg, draw_block, NULL, env); p->vtab->finish(p); } @@ -391,8 +415,8 @@ void draw_interval_tree(const draw_chordal_opts_t *opts, obstack_init(&env.obst); irg_block_walk_graph(chordal_env->irg, block_dims_walker, NULL, &env); - layout(&env, start_block, 0); - set_y(&env, start_block, 0); + layout(&env, start_block, opts->x_margin); + set_y(&env, start_block, opts->y_margin); start_dims = pmap_get(env.block_dims, start_block); draw(&env, &start_dims->subtree_box);