projects
/
libfirm
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
use out_dx constraints instead of certain registers
[libfirm]
/
ir
/
be
/
bechordal_draw.c
diff --git
a/ir/be/bechordal_draw.c
b/ir/be/bechordal_draw.c
index
45e7758
..
8c43799
100644
(file)
--- a/
ir/be/bechordal_draw.c
+++ b/
ir/be/bechordal_draw.c
@@
-9,14
+9,18
@@
* Copyright (C) 2005 Universitaet Karlsruhe
* Released under the GPL
*/
* Copyright (C) 2005 Universitaet Karlsruhe
* Released under the GPL
*/
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
#include <limits.h>
#include "pmap.h"
#include <limits.h>
#include "pmap.h"
+#include "pset.h"
#include "irgwalk.h"
#include "irprintf.h"
#include "irgwalk.h"
#include "irprintf.h"
-#include "ir
outs
.h"
+#include "ir
edges_t
.h"
#include "belive_t.h"
#include "bechordal_t.h"
#include "belive_t.h"
#include "bechordal_t.h"
@@
-151,7
+155,7
@@
extern void plotter_free(plotter_t *self)
}
const draw_chordal_opts_t draw_chordal_def_opts = {
}
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 {
};
typedef struct _draw_chordal_env_t {
@@
-174,11
+178,13
@@
struct block_dims {
rect_t subtree_box;
};
rect_t subtree_box;
};
+#undef min
static INLINE int min(int a, int b)
{
return a < b ? a : b;
}
static INLINE int min(int a, int b)
{
return a < b ? a : b;
}
+#undef max
static INLINE int max(int a, int b)
{
return a > b ? a : b;
static INLINE int max(int a, int b)
{
return a > b ? a : b;
@@
-199,7
+205,7
@@
static void block_dims_walker(ir_node *block, void *data)
list_for_each_entry_reverse(border_t, b, head, list) {
ir_node *irn = b->irn;
list_for_each_entry_reverse(border_t, b, head, list) {
ir_node *irn = b->irn;
- const arch_register_t *reg = arch_get_irn_register(env->arch_env, irn
, 0
);
+ const arch_register_t *reg = arch_get_irn_register(env->arch_env, irn);
int col = arch_register_get_index(reg);
dims->max_step = max(dims->max_step, b->step);
int col = arch_register_get_index(reg);
dims->max_step = max(dims->max_step, b->step);
@@
-225,7
+231,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;
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;
memset(rect, 0, sizeof(*rect));
rect->x = x;
@@
-239,14
+245,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;
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;
}
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)
}
static void set_y(const draw_chordal_env_t *env, ir_node *bl, int up)
@@
-268,16
+275,28
@@
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,
}
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;
+ int phi_arg = 0;
+ const ir_edge_t *edge;
- for
(i = 0, n = get_irn_n_outs(irn); i < n && !phi_arg; ++i
)
- phi_arg |= is_Phi(
get_irn_out(irn, i)
);
+ for
each_out_edge(irn, edge
)
+ phi_arg |= is_Phi(
edge->src
);
+#if 1
color->r = is_Phi(irn) ? 0.5 : 0.0;
color->g = phi_arg ? 0.5 : 0.0;
color->b = 0.0;
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;
return color;
@@
-288,7
+307,7
@@
static void draw_block(ir_node *bl, void *data)
static const color_t black = { 0, 0, 0 };
const draw_chordal_env_t *env = data;
static const color_t black = { 0, 0, 0 };
const draw_chordal_env_t *env = data;
- pset *live_in =
get_live_in(bl
);
+ pset *live_in =
put_live_in(bl, pset_new_ptr_default()
);
ir_node *irn;
border_t *b;
struct list_head *head = get_block_border_head(env->chordal_env, bl);
ir_node *irn;
border_t *b;
struct list_head *head = get_block_border_head(env->chordal_env, bl);
@@
-308,15
+327,16
@@
static void draw_block(ir_node *bl, void *data)
list_for_each_entry(border_t, b, head, list) {
if(b->is_def) {
list_for_each_entry(border_t, b, head, list) {
if(b->is_def) {
- const arch_register_t *reg = arch_get_irn_register(env->arch_env, b->irn
, 0
);
+ const arch_register_t *reg = arch_get_irn_register(env->arch_env, b->irn);
int col = arch_register_get_index(reg);
int col = arch_register_get_index(reg);
+ int live_out = is_live_out(bl, b->irn);
int x = (col + 1) * opts->h_inter_gap;
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;
color_t color;
- reg_to_color(env, b->irn, &color);
+ reg_to_color(env, b
l, b
->irn, &color);
x += dims->box.x;
ystart += dims->box.y;
x += dims->box.x;
ystart += dims->box.y;
@@
-324,6
+344,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->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);
}
}
}
}
@@
-332,41
+355,36
@@
static void draw_block(ir_node *bl, void *data)
for(irn = pset_first(live_in); irn; irn = pset_next(live_in)) {
if(arch_irn_has_reg_class(env->arch_env, irn, 0, env->cls)) {
for(irn = pset_first(live_in); irn; irn = pset_next(live_in)) {
if(arch_irn_has_reg_class(env->arch_env, irn, 0, env->cls)) {
- const arch_register_t *reg = arch_get_irn_register(env->arch_env, irn
, 0
);
+ const arch_register_t *reg = arch_get_irn_register(env->arch_env, irn);
int col = arch_register_get_index(reg);
int x = (col + 1) * opts->h_inter_gap;
color_t color;
int col = arch_register_get_index(reg);
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,
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);
}
}
}
}
}
}
-#if 0
- if(dom) {
- struct block_dims *dom_dims = pmap_get(env->block_dims, dom);
- rect_t line;
-
- line.x = dims->box.x;
- line.y = dims->box.y;
- line.w = dom_dims->box.x;
- line.h = dom_dims->box.y;
-
- env->plotter->vtab->line(env->plotter, &line);
- }
-#endif
+ del_pset(live_in);
}
}
-static void draw(draw_chordal_env_t *env, const rect_t *
b
box)
+static void draw(draw_chordal_env_t *env, const rect_t *
start_
box)
{
plotter_t *p = env->plotter;
{
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);
}
irg_block_walk_graph(env->chordal_env->irg, draw_block, NULL, env);
p->vtab->finish(p);
}
@@
-391,8
+409,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);
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);
start_dims = pmap_get(env.block_dims, start_block);
draw(&env, &start_dims->subtree_box);