X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeifg.c;h=8a44fe9c0b134b011b84584cb0b22d12e7cace1d;hb=2669742071b00949c6a5102f39b7df7fd7d3e3fb;hp=25f7caf2c54afe9706825775b8599969293430b1;hpb=2621ba4dee69537e8ab2017574f13f87f4d248bd;p=libfirm diff --git a/ir/be/beifg.c b/ir/be/beifg.c index 25f7caf2c..8a44fe9c0 100644 --- a/ir/be/beifg.c +++ b/ir/be/beifg.c @@ -1,86 +1,94 @@ -/** - * @file beifg.c - * @date 18.11.2005 - * @author Sebastian Hack +/* + * 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. * - * Copyright (C) 2005 Universitaet Karlsruhe - * Released under the GPL + * 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. */ -#include - +/** + * @file + * @brief Interface for interference graphs. + * @author Sebastian Hack + * @date 18.11.2005 + * @version $Id$ + */ #ifdef HAVE_CONFIG_H #include "config.h" #endif -#ifdef HAVE_MALLOC_H -#include -#endif - -#ifdef HAVE_ALLOCA_H -#include -#endif +#include -#ifdef WITH_LIBCORE -#include -#include -#include -#endif /* WITH_LIBCORE */ +#include "lc_opts.h" +#include "lc_opts_enum.h" +#include "timing.h" #include "bitset.h" - #include "irgwalk.h" #include "irnode_t.h" #include "irprintf.h" #include "irtools.h" +#include "irbitset.h" #include "beifg_t.h" #include "beifg_impl.h" -#include "irphase.h" #include "irphase_t.h" -#include "bechordal.h" +#include "error.h" +#include "xmalloc.h" #include "becopystat.h" #include "becopyopt.h" +#include "beirg_t.h" +#include "bemodule.h" /** Defines values for the ifg performance test */ #define BE_CH_PERFORMANCETEST_MIN_NODES (50) -#define BE_CH_PERFORMANCETEST_COUNT (10) +#define BE_CH_PERFORMANCETEST_COUNT (500) typedef struct _coloring_t coloring_t; struct _coloring_t { - phase_t ph; + ir_phase ph; const arch_env_t *arch_env; - ir_graph *irg; + ir_graph *irg; }; -size_t (be_ifg_nodes_iter_size)(const void *self) +size_t (be_ifg_nodes_iter_size)(const be_ifg_t *ifg) { - const be_ifg_t *ifg = self; return ifg->impl->nodes_iter_size; } -size_t (be_ifg_neighbours_iter_size)(const void *self) +size_t (be_ifg_neighbours_iter_size)(const be_ifg_t *ifg) { - const be_ifg_t *ifg = self; return ifg->impl->neighbours_iter_size; } -size_t (be_ifg_cliques_iter_size)(const void *self) +size_t (be_ifg_cliques_iter_size)(const be_ifg_t *ifg) { - const be_ifg_t *ifg = self; return ifg->impl->cliques_iter_size; } -static void *regs_irn_data_init(phase_t *ph, ir_node *irn, void *data) +static void *regs_irn_data_init(ir_phase *ph, const ir_node *irn, void *data) { coloring_t *coloring = (coloring_t *) ph; + (void) data; + return (void *) arch_get_irn_register(coloring->arch_env, irn); } coloring_t *coloring_init(coloring_t *c, ir_graph *irg, const arch_env_t *aenv) { - phase_init(&c->ph, "regs_map", irg, PHASE_DEFAULT_GROWTH, regs_irn_data_init); + phase_init(&c->ph, "regs_map", irg, PHASE_DEFAULT_GROWTH, regs_irn_data_init, NULL); c->arch_env = aenv; c->irg = irg; return c; @@ -110,76 +118,64 @@ void coloring_restore(coloring_t *c) irg_walk_graph(c->irg, NULL, restore_irn_color, c); } -void (be_ifg_free)(void *self) +void (be_ifg_free)(be_ifg_t *ifg) { - be_ifg_t *ifg = self; - ifg->impl->free(self); + ifg->impl->free(ifg); } -int (be_ifg_connected)(const void *self, const ir_node *a, const ir_node *b) +int (be_ifg_connected)(const be_ifg_t *ifg, const ir_node *a, const ir_node *b) { - const be_ifg_t *ifg = self; - return ifg->impl->connected(self, a, b); + return ifg->impl->connected(ifg, a, b); } -ir_node *(be_ifg_neighbours_begin)(const void *self, void *iter, const ir_node *irn) +ir_node *(be_ifg_neighbours_begin)(const be_ifg_t *ifg, void *iter, const ir_node *irn) { - const be_ifg_t *ifg = self; - return ifg->impl->neighbours_begin(self, iter, irn); + return ifg->impl->neighbours_begin(ifg, iter, irn); } -ir_node *(be_ifg_neighbours_next)(const void *self, void *iter) +ir_node *(be_ifg_neighbours_next)(const be_ifg_t *ifg, void *iter) { - const be_ifg_t *ifg = self; - return ifg->impl->neighbours_next(self, iter); + return ifg->impl->neighbours_next(ifg, iter); } -void (be_ifg_neighbours_break)(const void *self, void *iter) +void (be_ifg_neighbours_break)(const be_ifg_t *ifg, void *iter) { - const be_ifg_t *ifg = self; - ifg->impl->neighbours_break(self, iter); + ifg->impl->neighbours_break(ifg, iter); } -ir_node *(be_ifg_nodes_begin)(const void *self, void *iter) +ir_node *(be_ifg_nodes_begin)(const be_ifg_t *ifg, void *iter) { - const be_ifg_t *ifg = self; - return ifg->impl->nodes_begin(self, iter); + return ifg->impl->nodes_begin(ifg, iter); } -ir_node *(be_ifg_nodes_next)(const void *self, void *iter) +ir_node *(be_ifg_nodes_next)(const be_ifg_t *ifg, void *iter) { - const be_ifg_t *ifg = self; - return ifg->impl->nodes_next(self, iter); + return ifg->impl->nodes_next(ifg, iter); } -void (be_ifg_nodes_break)(const void *self, void *iter) +void (be_ifg_nodes_break)(const be_ifg_t *ifg, void *iter) { - const be_ifg_t *ifg = self; - ifg->impl->nodes_break(self, iter); + ifg->impl->nodes_break(ifg, iter); } -int (be_ifg_cliques_begin)(const void *self, void *iter, ir_node **buf) +int (be_ifg_cliques_begin)(const be_ifg_t *ifg, void *iter, ir_node **buf) { - const be_ifg_t *ifg = self; - return ifg->impl->cliques_begin(self, iter, buf); + return ifg->impl->cliques_begin(ifg, iter, buf); } -int (be_ifg_cliques_next)(const void *self, void *iter) +int (be_ifg_cliques_next)(const be_ifg_t *ifg, void *iter) { - const be_ifg_t *ifg = self; - return ifg->impl->cliques_next(self, iter); + return ifg->impl->cliques_next(ifg, iter); } -void (be_ifg_cliques_break)(const void *self, void *iter) +void (be_ifg_cliques_break)(const be_ifg_t *ifg, void *iter) { - const be_ifg_t *ifg = self; - ifg->impl->cliques_break(self, iter); + ifg->impl->cliques_break(ifg, iter); } -int (be_ifg_degree)(const void *self, const ir_node *irn) +int (be_ifg_degree)(const be_ifg_t *ifg, const ir_node *irn) { - const be_ifg_t *ifg = self; - return ifg->impl->degree(self, irn); + return ifg->impl->degree(ifg, irn); } @@ -265,26 +261,89 @@ static int be_ifg_check_cmp_nodes(const void *a, const void *b) const ir_node *node_a = *(ir_node **)a; const ir_node *node_b = *(ir_node **)b; - int nr_a = node_a->node_nr; - int nr_b = node_b->node_nr; + long nr_a = get_irn_idx(node_a); + long nr_b = get_irn_idx(node_b); return QSORT_CMP(nr_a, nr_b); } -void be_ifg_check_sorted(const be_ifg_t *ifg, FILE *f) +void be_ifg_check_sorted(const be_ifg_t *ifg) +{ + void *iter1 = be_ifg_nodes_iter_alloca(ifg); + void *iter2 = be_ifg_neighbours_iter_alloca(ifg); + + ir_node *n, *m; + const int node_count = be_ifg_check_get_node_count(ifg); + int i = 0; + + ir_node **all_nodes = xmalloc(node_count * sizeof(all_nodes[0])); + + be_ifg_foreach_node(ifg, iter1, n) + { + if(!node_is_in_irgs_storage(ifg->env->irg, n)) + { + ir_printf("+%F is in ifg but not in the current irg!", n); + assert (node_is_in_irgs_storage(ifg->env->irg, n)); + } + + all_nodes[i] = n; + i++; + } + + qsort(all_nodes, node_count, sizeof(all_nodes[0]), be_ifg_check_cmp_nodes); + + for (i = 0; i < node_count; i++) + { + ir_node **neighbours = xmalloc(node_count * sizeof(neighbours[0])); + int j = 0; + int k = 0; + int degree = 0; + + degree = be_ifg_degree(ifg, all_nodes[i]); + + be_ifg_foreach_neighbour(ifg, iter2, all_nodes[i], m) + { + neighbours[j] = m; + j++; + } + + qsort(neighbours, j, sizeof(neighbours[0]), be_ifg_check_cmp_nodes); + + ir_printf("%d. %+F's neighbours(%d): ", i+1, all_nodes[i], degree); + + for(k = 0; k < j; k++) + { + ir_printf("%+F, ", neighbours[k]); + } + + ir_printf("\n"); + + free(neighbours); + } + + free(all_nodes); + +} + +void be_ifg_check_sorted_to_file(const be_ifg_t *ifg, FILE *f) { void *iter1 = be_ifg_nodes_iter_alloca(ifg); void *iter2 = be_ifg_neighbours_iter_alloca(ifg); ir_node *n, *m; const int node_count = be_ifg_check_get_node_count(ifg); - int neighbours_count = 0; int i = 0; ir_node **all_nodes = xmalloc(node_count * sizeof(all_nodes[0])); be_ifg_foreach_node(ifg, iter1, n) { + if(!node_is_in_irgs_storage(ifg->env->irg, n)) + { + ir_fprintf (f,"+%F is in ifg but not in the current irg!",n); + assert (node_is_in_irgs_storage(ifg->env->irg, n)); + } + all_nodes[i] = n; i++; } @@ -308,14 +367,14 @@ void be_ifg_check_sorted(const be_ifg_t *ifg, FILE *f) qsort(neighbours, j, sizeof(neighbours[0]), be_ifg_check_cmp_nodes); - ir_fprintf(f, "%d. %+F's neighbours(%d): ", i+1, all_nodes[i], degree); + ir_fprintf (f,"%d. %+F's neighbours(%d): ", i+1, all_nodes[i], degree); for(k = 0; k < j; k++) { - ir_fprintf(f, "%+F, ", neighbours[k]); + ir_fprintf (f,"%+F, ", neighbours[k]); } - ir_fprintf(f, "\n"); + ir_fprintf (f,"\n"); free(neighbours); } @@ -329,46 +388,37 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env) int tests = BE_CH_PERFORMANCETEST_COUNT; coloring_t coloring; -#ifdef linux - struct mallinfo minfo; - int used_memory = 0; -#endif /* linux */ + int used_memory; int i = 0; int rt; copy_opt_t *co; be_ifg_t *old_if = chordal_env->ifg; - lc_timer_t *timer = lc_timer_register("getTime","get Time of copy minimization using the ifg"); + ir_timer_t *timer = ir_timer_register("getTime","get Time of copy minimization using the ifg"); unsigned long elapsed_usec = 0; - if ((int) get_irg_estimated_node_cnt >= BE_CH_PERFORMANCETEST_MIN_NODES) + if (get_irg_estimated_node_cnt(chordal_env->irg) >= BE_CH_PERFORMANCETEST_MIN_NODES) { - coloring_init(&coloring, chordal_env->irg, chordal_env->birg->main_env->arch_env); coloring_save(&coloring); - lc_timer_reset(timer); + ir_timer_reset(timer); for (i = 0; iifg = be_ifg_std_new(chordal_env); - lc_timer_stop(timer); - rt = lc_timer_leave_high_priority(); + ir_timer_stop(timer); + rt = ir_timer_leave_high_priority(); -#ifdef linux - minfo = mallinfo(); - used_memory = minfo.uordblks - used_memory; -#endif /* linux */ + used_memory = ir_get_heap_used_bytes() - used_memory; coloring_restore(&coloring); @@ -377,13 +427,13 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env) co_build_ou_structure(co); co_build_graph_structure(co); - rt = lc_timer_enter_high_priority(); - lc_timer_start(timer); + rt = ir_timer_enter_high_priority(); + ir_timer_start(timer); co_solve_heuristic_new(co); - lc_timer_stop(timer); - rt = lc_timer_leave_high_priority(); + ir_timer_stop(timer); + rt = ir_timer_leave_high_priority(); co_free_graph_structure(co); co_free_ou_structure(co); @@ -392,41 +442,28 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env) } - elapsed_usec = lc_timer_elapsed_usec(timer); + elapsed_usec = ir_timer_elapsed_usec(timer); /* calculating average */ elapsed_usec = elapsed_usec / tests; - ir_printf("\nstd:; %+F; ",current_ir_graph); -#ifdef linux - ir_printf("%u; ", used_memory); -#endif /* linux */ - ir_printf("%u; ", elapsed_usec); + ir_printf("\nstd:; %+F; %u; %u ",current_ir_graph, used_memory, elapsed_usec); - i=0; -#ifdef linux used_memory=0; -#endif /* linux */ elapsed_usec=0; for (i = 0; iifg = be_ifg_clique_new(chordal_env); - lc_timer_stop(timer); - rt = lc_timer_leave_high_priority(); + ir_timer_stop(timer); + rt = ir_timer_leave_high_priority(); -#ifdef linux - minfo = mallinfo(); - used_memory = minfo.uordblks - used_memory; -#endif /* linux */ + used_memory = ir_get_heap_used_bytes() - used_memory; coloring_restore(&coloring); @@ -435,13 +472,13 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env) co_build_ou_structure(co); co_build_graph_structure(co); - rt = lc_timer_enter_high_priority(); - lc_timer_start(timer); + rt = ir_timer_enter_high_priority(); + ir_timer_start(timer); co_solve_heuristic_new(co); - lc_timer_stop(timer); - rt = lc_timer_leave_high_priority(); + ir_timer_stop(timer); + rt = ir_timer_leave_high_priority(); co_free_graph_structure(co); co_free_ou_structure(co); @@ -450,41 +487,28 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env) } - elapsed_usec = lc_timer_elapsed_usec(timer); + elapsed_usec = ir_timer_elapsed_usec(timer); /* calculating average */ elapsed_usec = elapsed_usec / tests; - ir_printf("\nclique:; %+F; ",current_ir_graph); -#ifdef linux - ir_printf("%u; ", used_memory); -#endif /* linux */ - ir_printf("%u; ", elapsed_usec); + ir_printf("\nclique:; %+F; %u; %u ",current_ir_graph, used_memory, elapsed_usec); - i=0; -#ifdef linux used_memory=0; -#endif /* linux */ elapsed_usec=0; for (i = 0; iifg = be_ifg_list_new(chordal_env); - lc_timer_stop(timer); - rt = lc_timer_leave_high_priority(); + ir_timer_stop(timer); + rt = ir_timer_leave_high_priority(); -#ifdef linux - minfo = mallinfo(); - used_memory = minfo.uordblks - used_memory; -#endif /* linux */ + used_memory = ir_get_heap_used_bytes() - used_memory; coloring_restore(&coloring); @@ -493,13 +517,13 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env) co_build_ou_structure(co); co_build_graph_structure(co); - rt = lc_timer_enter_high_priority(); - lc_timer_start(timer); + rt = ir_timer_enter_high_priority(); + ir_timer_start(timer); co_solve_heuristic_new(co); - lc_timer_stop(timer); - rt = lc_timer_leave_high_priority(); + ir_timer_stop(timer); + rt = ir_timer_leave_high_priority(); co_free_graph_structure(co); co_free_ou_structure(co); @@ -508,41 +532,28 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env) } - elapsed_usec = lc_timer_elapsed_usec(timer); + elapsed_usec = ir_timer_elapsed_usec(timer); /* calculating average */ elapsed_usec = elapsed_usec / tests; - ir_printf("\nlist:; %+F; ",current_ir_graph); -#ifdef linux - ir_printf("%u; ", used_memory); -#endif /* linux */ - ir_printf("%u; ", elapsed_usec); + ir_printf("\nlist:; %+F; %u; %u ",current_ir_graph, used_memory, elapsed_usec); - i=0; -#ifdef linux used_memory=0; -#endif /* linux */ elapsed_usec=0; for (i = 0; iifg = be_ifg_pointer_new(chordal_env); - lc_timer_stop(timer); - rt = lc_timer_leave_high_priority(); + ir_timer_stop(timer); + rt = ir_timer_leave_high_priority(); -#ifdef linux - minfo = mallinfo(); - used_memory = minfo.uordblks - used_memory; -#endif /* linux */ + used_memory = ir_get_heap_used_bytes() - used_memory; coloring_restore(&coloring); @@ -551,13 +562,13 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env) co_build_ou_structure(co); co_build_graph_structure(co); - rt = lc_timer_enter_high_priority(); - lc_timer_start(timer); + rt = ir_timer_enter_high_priority(); + ir_timer_start(timer); co_solve_heuristic_new(co); - lc_timer_stop(timer); - rt = lc_timer_leave_high_priority(); + ir_timer_stop(timer); + rt = ir_timer_leave_high_priority(); co_free_graph_structure(co); co_free_ou_structure(co); @@ -566,20 +577,14 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env) } - elapsed_usec = lc_timer_elapsed_usec(timer); + elapsed_usec = ir_timer_elapsed_usec(timer); /* calculating average */ elapsed_usec = elapsed_usec / tests; - ir_printf("\npointer:; %+F; ",current_ir_graph); -#ifdef linux - ir_printf("%u; ", used_memory); -#endif /* linux */ - ir_printf("%u; ", elapsed_usec); + ir_printf("\npointer:; %+F; %u; %u ",current_ir_graph, used_memory, elapsed_usec); i=0; -#ifdef linux used_memory=0; -#endif /* linux */ elapsed_usec=0; } @@ -634,3 +639,173 @@ void be_ifg_dump_dot(be_ifg_t *ifg, ir_graph *irg, FILE *file, const be_ifg_dump fprintf(file, "}\n"); bitset_free(nodes); } + +static void int_comp_rec(be_irg_t *birg, be_ifg_t *ifg, ir_node *n, bitset_t *seen) +{ + void *neigh_it = be_ifg_neighbours_iter_alloca(ifg); + ir_node *m; + + be_ifg_foreach_neighbour(ifg, neigh_it, n, m) { + if(!bitset_contains_irn(seen, m) && !arch_irn_is(birg->main_env->arch_env, m, ignore)) { + bitset_add_irn(seen, m); + int_comp_rec(birg, ifg, m, seen); + } + } + +} + +static int int_component_stat(be_irg_t *birg, be_ifg_t *ifg) +{ + int n_comp = 0; + void *nodes_it = be_ifg_nodes_iter_alloca(ifg); + bitset_t *seen = bitset_irg_malloc(birg->irg); + + ir_node *n; + + be_ifg_foreach_node(ifg, nodes_it, n) { + if (! bitset_contains_irn(seen, n) && ! arch_irn_is(birg->main_env->arch_env, n, ignore)) { + ++n_comp; + bitset_add_irn(seen, n); + int_comp_rec(birg, ifg, n, seen); + } + } + + free(seen); + return n_comp; +} + +void be_ifg_stat(be_irg_t *birg, be_ifg_t *ifg, be_ifg_stat_t *stat) +{ + void *nodes_it = be_ifg_nodes_iter_alloca(ifg); + void *neigh_it = be_ifg_neighbours_iter_alloca(ifg); + bitset_t *nodes = bitset_irg_malloc(birg->irg); + ir_node *n, *m; + + memset(stat, 0, sizeof(stat[0])); + + be_ifg_foreach_node(ifg, nodes_it, n) { + stat->n_nodes += 1; + be_ifg_foreach_neighbour(ifg, neigh_it, n, m) { + bitset_add_irn(nodes, n); + stat->n_edges += !bitset_contains_irn(nodes, m); + } + } + + stat->n_comps = int_component_stat(birg, ifg); + bitset_free(nodes); +} + +enum { + BE_IFG_STD = 1, + BE_IFG_FAST = 2, + BE_IFG_CLIQUE = 3, + BE_IFG_POINTER = 4, + BE_IFG_LIST = 5, + BE_IFG_CHECK = 6 +}; + +static int ifg_flavor = BE_IFG_STD; + +static const lc_opt_enum_int_items_t ifg_flavor_items[] = { + { "std", BE_IFG_STD }, + { "fast", BE_IFG_FAST }, + { "clique", BE_IFG_CLIQUE }, + { "pointer", BE_IFG_POINTER }, + { "list", BE_IFG_LIST }, + { "check", BE_IFG_CHECK }, + { NULL, 0 } +}; + +static lc_opt_enum_int_var_t ifg_flavor_var = { + &ifg_flavor, ifg_flavor_items +}; + +static const lc_opt_table_entry_t be_ifg_options[] = { + LC_OPT_ENT_ENUM_PTR ("ifg", "interference graph flavour", &ifg_flavor_var), + LC_OPT_LAST +}; + +void be_init_ifg(void) +{ + lc_opt_entry_t *be_grp = lc_opt_get_grp(firm_opt_get_root(), "be"); + lc_opt_entry_t *ifg_grp = lc_opt_get_grp(be_grp, "ifg"); + + lc_opt_add_table(ifg_grp, be_ifg_options); +} + +BE_REGISTER_MODULE_CONSTRUCTOR(be_init_ifg); + +static FILE *be_ifg_open(const be_chordal_env_t *env, const char *prefix) +{ + FILE *result; + char buf[1024]; + + ir_snprintf(buf, sizeof(buf), "%s%F_%s.log", prefix, env->irg, env->cls->name); + result = fopen(buf, "wt"); + if(result == NULL) { + panic("Couldn't open '%s' for writing.", buf); + } + + return result; +} + +static void check_ifg_implementations(const be_chordal_env_t *chordal_env) +{ + be_ifg_t *ifg; + FILE *f; + + f = be_ifg_open(chordal_env, "std"); + ifg = be_ifg_std_new(chordal_env); + be_ifg_check_sorted_to_file(ifg, f); + fclose(f); + be_ifg_free(ifg); + + f = be_ifg_open(chordal_env, "list"); + ifg = be_ifg_list_new(chordal_env); + be_ifg_check_sorted_to_file(ifg, f); + fclose(f); + be_ifg_free(ifg); + + f = be_ifg_open(chordal_env, "clique"); + ifg = be_ifg_clique_new(chordal_env); + be_ifg_check_sorted_to_file(ifg, f); + fclose(f); + be_ifg_free(ifg); + + f = be_ifg_open(chordal_env, "pointer"); + ifg = be_ifg_pointer_new(chordal_env); + be_ifg_check_sorted_to_file(ifg, f); + fclose(f); + be_ifg_free(ifg); +}; + +be_ifg_t *be_create_ifg(const be_chordal_env_t *chordal_env) +{ + be_ifg_t *ifg = NULL; + + switch (ifg_flavor) { + default: + assert(0); + fprintf(stderr, "no valid ifg flavour selected. falling back to std\n"); + case BE_IFG_STD: + case BE_IFG_FAST: + ifg = be_ifg_std_new(chordal_env); + break; + case BE_IFG_CLIQUE: + ifg = be_ifg_clique_new(chordal_env); + break; + case BE_IFG_POINTER: + ifg = be_ifg_pointer_new(chordal_env); + break; + case BE_IFG_LIST: + ifg = be_ifg_list_new(chordal_env); + break; + case BE_IFG_CHECK: + check_ifg_implementations(chordal_env); + /* Build the interference graph. */ + ifg = be_ifg_std_new(chordal_env); + break; + } + + return ifg; +}