* Copyright (C) 2005 Universitaet Karlsruhe
* Released under the GPL
*/
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef WITH_ILP
+
#include <math.h>
#include "hashptr.h"
#include "benode_t.h"
#include "beutil.h"
#include "bespillilp.h"
+#include "bespill.h"
+
+#include "bechordal_t.h"
#define BIGM 100000.0
typedef struct _spill_ilp_t {
spill_stat_t stats;
const arch_register_class_t *cls;
- const be_main_session_env_t *session;
- firm_dbg_module_t *dbg;
+ const be_chordal_env_t *chordal_env;
lpp_t *lpp;
set *irn_use_heads;
set *live_ranges;
struct obstack *obst;
int enable_store : 1;
int enable_remat : 1;
+ DEBUG_ONLY(firm_dbg_module_t *dbg;)
} spill_ilp_t;
typedef struct _live_range_t live_range_t;
static double get_weight(const ir_node *irn)
{
ir_loop *loop = get_irn_loop((ir_node *) irn);
- int res = 1.0;
+ int res = 1;
if(loop) {
int depth = get_loop_depth(loop);
res += depth * depth;
-
- // ir_printf("%+F has loop depth %d\n", irn, depth);
}
return res;
static INLINE int has_reg_class(const spill_ilp_t *si, const ir_node *irn)
{
- return arch_irn_has_reg_class(si->session->main_env->arch_env,
- irn, arch_pos_make_out(0), si->cls);
+ return chordal_has_class(si->chordal_env, irn);
}
static int cmp_live_range(const void *a, const void *b, size_t n)
static INLINE int can_remat(const spill_ilp_t *si, const ir_node *irn, pset *live)
{
int i, n;
- const arch_env_t *arch_env = si->session->main_env->arch_env;
+ const arch_env_t *arch_env = si->chordal_env->birg->main_env->arch_env;
int remat = (arch_irn_get_flags(arch_env, irn) & arch_irn_flags_rematerializable) != 0;
for(i = 0, n = get_irn_arity(irn); i < n && remat; ++i) {
be_insert_spills_reloads(si->senv, NULL);
}
-void be_spill_ilp(const be_main_session_env_t *session_env,
- const arch_register_class_t *cls)
+void be_spill_ilp(const be_chordal_env_t *chordal_env)
{
char problem_name[256];
struct obstack obst;
spill_ilp_t si;
- ir_snprintf(problem_name, sizeof(problem_name), "%F_%s", session_env->irg, cls->name);
+ ir_snprintf(problem_name, sizeof(problem_name), "%F_%s",
+ chordal_env->irg, chordal_env->cls->name);
obstack_init(&obst);
memset(&si.stats, 0, sizeof(si.stats));
- si.session = session_env;
+ si.chordal_env = chordal_env;
si.obst = &obst;
- si.dbg = firm_dbg_register("be.ra.spillilp");
- si.senv = be_new_spill_env(si.dbg, session_env, cls, is_mem_phi, &si);
- si.cls = cls;
+ si.senv = be_new_spill_env(chordal_env, is_mem_phi, &si);
+// DEBUG_ONLY(si.senv->dbg = si.dbg;)
+ si.cls = chordal_env->cls;
si.lpp = new_lpp(problem_name, lpp_minimize);
si.irn_use_heads = new_set(cmp_irn_use_head, 4096);
si.live_ranges = new_set(cmp_live_range, 16384);
si.edges = NULL;
si.enable_remat = 0;
si.enable_store = 1;
+ FIRM_DBG_REGISTER(si.dbg, "firm.be.ra.spillilp");
- firm_dbg_set_mask(si.dbg, DBG_LEVEL);
- irg_block_walk_graph(session_env->irg, process_block, NULL, &si);
+ irg_block_walk_graph(chordal_env->irg, process_block, NULL, &si);
if(si.enable_store)
add_store_costs(&si);
}
#endif
- DBG((si.dbg, LEVEL_1, "%F\n", session_env->irg));
+ DBG((si.dbg, LEVEL_1, "%F\n", chordal_env->irg));
#ifdef SOLVE_LOCAL
lpp_solve_cplex(si.lpp);
#else
free_lpp(si.lpp);
obstack_free(&obst, NULL);
}
+
+#else /* WITH_ILP */
+
+static void only_that_you_can_compile_without_WITH_ILP_defined(void) {
+}
+
+#endif /* WITH_ILP */