X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbecopyopt.c;h=e624545602401b91d1d50a6960374df18d4a511d;hb=0ed495da32589b78283d9ede3cb9e33727316006;hp=0df18969678968fea1fa77ab5c419eef8b656e0c;hpb=b741c12f11b20c9566fc8704c1f4294609991142;p=libfirm diff --git a/ir/be/becopyopt.c b/ir/be/becopyopt.c index 0df189696..e62454560 100644 --- a/ir/be/becopyopt.c +++ b/ir/be/becopyopt.c @@ -30,35 +30,37 @@ */ #include "config.h" -#include "execfreq.h" -#include "xmalloc.h" #include "debug.h" -#include "pmap.h" -#include "raw_bitset.h" -#include "irnode.h" +#include "error.h" +#include "execfreq.h" +#include "irdump_t.h" +#include "iredges_t.h" #include "irgraph.h" #include "irgwalk.h" -#include "irprog.h" #include "irloop_t.h" -#include "iredges_t.h" +#include "irnode.h" #include "irprintf_t.h" +#include "irprog.h" #include "irtools.h" +#include "pmap.h" +#include "raw_bitset.h" #include "util.h" +#include "xmalloc.h" -#include "bemodule.h" #include "bearch.h" -#include "benode.h" -#include "beutil.h" -#include "beifg.h" -#include "beintlive_t.h" #include "becopyopt_t.h" #include "becopystat.h" -#include "belive_t.h" +#include "bedump.h" +#include "beifg.h" #include "beinsn_t.h" +#include "beintlive_t.h" +#include "beirg.h" +#include "belive_t.h" +#include "bemodule.h" +#include "benode.h" #include "besched.h" #include "bestatevent.h" -#include "beirg.h" -#include "error.h" +#include "beutil.h" #include "lc_opts.h" #include "lc_opts_enum.h" @@ -87,7 +89,7 @@ static int co_get_costs_exec_freq(const ir_node *root, int pos); static int co_get_costs_all_one(const ir_node *root, int pos); static unsigned dump_flags = 0; -static unsigned style_flags = 0; +static unsigned style_flags = CO_IFG_DUMP_COLORS; static int do_stats = 0; static cost_fct_t cost_func = co_get_costs_exec_freq; static int improve = 1; @@ -100,16 +102,6 @@ static const lc_opt_enum_mask_items_t dump_items[] = { { NULL, 0 } }; -/** - * Flags for dumping the IFG. - */ -enum { - CO_IFG_DUMP_COLORS = 1 << 0, /**< Dump the graph colored. */ - CO_IFG_DUMP_LABELS = 1 << 1, /**< Dump node/edge labels. */ - CO_IFG_DUMP_SHAPE = 1 << 2, /**< Give constrained nodes special shapes. */ - CO_IFG_DUMP_CONSTR = 1 << 3, /**< Dump the node constraints in the label. */ -}; - static const lc_opt_enum_mask_items_t style_items[] = { { "color", CO_IFG_DUMP_COLORS }, { "labels", CO_IFG_DUMP_LABELS }, @@ -914,7 +906,14 @@ static int co_dump_appel_disjoint_constraints(const copy_opt_t *co, ir_node *a, return !bitset_intersect(constr[0], constr[1]); } -void co_dump_appel_graph(const copy_opt_t *co, FILE *f) +/** + * Dump the interference graph according to the Appel/George coalescing contest file format. + * See: http://www.cs.princeton.edu/~appel/coalesce/format.html + * @note Requires graph structure. + * @param co The copy opt object. + * @param f A file to dump to. + */ +static void co_dump_appel_graph(const copy_opt_t *co, FILE *f) { be_ifg_t *ifg = co->cenv->ifg; int *color_map = ALLOCAN(int, co->cls->n_regs); @@ -992,158 +991,8 @@ void co_dump_appel_graph(const copy_opt_t *co, FILE *f) xfree(node_map); } -/* - ___ _____ ____ ____ ___ _____ ____ _ - |_ _| ___/ ___| | _ \ / _ \_ _| | _ \ _ _ _ __ ___ _ __ (_)_ __ __ _ - | || |_ | | _ | | | | | | || | | | | | | | | '_ ` _ \| '_ \| | '_ \ / _` | - | || _|| |_| | | |_| | |_| || | | |_| | |_| | | | | | | |_) | | | | | (_| | - |___|_| \____| |____/ \___/ |_| |____/ \__,_|_| |_| |_| .__/|_|_| |_|\__, | - |_| |___/ -*/ - -static const char *get_dot_color_name(size_t col) -{ - static const char *names[] = { - "blue", - "red", - "green", - "yellow", - "cyan", - "magenta", - "orange", - "chocolate", - "beige", - "navy", - "darkgreen", - "darkred", - "lightPink", - "chartreuse", - "lightskyblue", - "linen", - "pink", - "lightslateblue", - "mintcream", - "red", - "darkolivegreen", - "mediumblue", - "mistyrose", - "salmon", - "darkseagreen", - "mediumslateblue" - "moccasin", - "tomato", - "forestgreen", - "darkturquoise", - "palevioletred" - }; - - return col < sizeof(names)/sizeof(names[0]) ? names[col] : "white"; -} - -typedef struct co_ifg_dump_t { - const copy_opt_t *co; - unsigned flags; -} co_ifg_dump_t; - -static void ifg_dump_graph_attr(FILE *f, void *self) -{ - (void) self; - fprintf(f, "overlap=scale"); -} - -static int ifg_is_dump_node(void *self, ir_node *irn) -{ - (void)self; - return !arch_irn_is_ignore(irn); -} - -static void ifg_dump_node_attr(FILE *f, void *self, ir_node *irn) -{ - co_ifg_dump_t *env = (co_ifg_dump_t*)self; - const arch_register_t *reg = arch_get_irn_register(irn); - const arch_register_req_t *req = arch_get_irn_register_req(irn); - int limited = arch_register_req_is(req, limited); - - if (env->flags & CO_IFG_DUMP_LABELS) { - ir_fprintf(f, "label=\"%+F", irn); - - if ((env->flags & CO_IFG_DUMP_CONSTR) && limited) { - bitset_t *bs = bitset_alloca(env->co->cls->n_regs); - rbitset_copy_to_bitset(req->limited, bs); - ir_fprintf(f, "\\n%B", bs); - } - ir_fprintf(f, "\" "); - } else { - fprintf(f, "label=\"\" shape=point " ); - } - - if (env->flags & CO_IFG_DUMP_SHAPE) - fprintf(f, "shape=%s ", limited ? "diamond" : "ellipse"); - - if (env->flags & CO_IFG_DUMP_COLORS) - fprintf(f, "style=filled color=%s ", get_dot_color_name(reg->index)); -} - -static void ifg_dump_at_end(FILE *file, void *self) -{ - co_ifg_dump_t *env = (co_ifg_dump_t*)self; - affinity_node_t *a; - - co_gs_foreach_aff_node(env->co, a) { - const arch_register_t *ar = arch_get_irn_register(a->irn); - unsigned aidx = get_irn_idx(a->irn); - neighb_t *n; - - co_gs_foreach_neighb(a, n) { - const arch_register_t *nr = arch_get_irn_register(n->irn); - unsigned nidx = get_irn_idx(n->irn); - - if (aidx < nidx) { - const char *color = nr == ar ? "blue" : "red"; - fprintf(file, "\tn%u -- n%u [weight=0.01 ", aidx, nidx); - if (env->flags & CO_IFG_DUMP_LABELS) - fprintf(file, "label=\"%d\" ", n->costs); - if (env->flags & CO_IFG_DUMP_COLORS) - fprintf(file, "color=%s ", color); - else - fprintf(file, "style=dotted"); - fprintf(file, "];\n"); - } - } - } -} - - -static be_ifg_dump_dot_cb_t ifg_dot_cb = { - ifg_is_dump_node, - ifg_dump_graph_attr, - ifg_dump_node_attr, - NULL, - NULL, - ifg_dump_at_end -}; - - - -void co_dump_ifg_dot(const copy_opt_t *co, FILE *f, unsigned flags) -{ - co_ifg_dump_t cod; - - cod.co = co; - cod.flags = flags; - be_ifg_dump_dot(co->cenv->ifg, co->irg, f, &ifg_dot_cb, &cod); -} - -/* - __ __ _ ____ _ - | \/ | __ _(_)_ __ | _ \ _ __(_)_ _____ _ __ - | |\/| |/ _` | | '_ \ | | | | '__| \ \ / / _ \ '__| - | | | | (_| | | | | | | |_| | | | |\ V / __/ | - |_| |_|\__,_|_|_| |_| |____/|_| |_| \_/ \___|_| - -*/ - -static FILE *my_open(const be_chordal_env_t *env, const char *prefix, const char *suffix) +static FILE *my_open(const be_chordal_env_t *env, const char *prefix, + const char *suffix) { FILE *result; char buf[1024]; @@ -1200,8 +1049,8 @@ void co_driver(be_chordal_env_t *cenv) be_stat_ev_ull("co_init_unsat", before.unsatisfied_edges); if (dump_flags & DUMP_BEFORE) { - FILE *f = my_open(cenv, "", "-before.dot"); - co_dump_ifg_dot(co, f, style_flags); + FILE *f = my_open(cenv, "", "-before.vcg"); + be_dump_ifg_co(f, co, style_flags & CO_IFG_DUMP_LABELS, style_flags & CO_IFG_DUMP_COLORS); fclose(f); } @@ -1227,8 +1076,8 @@ void co_driver(be_chordal_env_t *cenv) ir_timer_free(timer); if (dump_flags & DUMP_AFTER) { - FILE *f = my_open(cenv, "", "-after.dot"); - co_dump_ifg_dot(co, f, style_flags); + FILE *f = my_open(cenv, "", "-after.vcg"); + be_dump_ifg_co(f, co, style_flags & CO_IFG_DUMP_LABELS, style_flags & CO_IFG_DUMP_COLORS); fclose(f); }