/*
- * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved.
+ * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved.
*
* This file is part of libFirm.
*
* Minimum Register Instruction Sequencing to Reduce Register Spills
* in out-of-order issue superscalar architectures
*/
-#ifdef HAVE_CONFIG_H
#include "config.h"
-#endif
#include <limits.h>
#include "irgwalk.h"
#include "irtools.h"
#include "irbitset.h"
+#include "irnodeset.h"
#include "height.h"
-#include "benode_t.h"
-#include "besched_t.h"
+#include "benode.h"
+#include "besched.h"
#include "beschedmris.h"
#include "beirg.h"
struct _mris_env_t {
ir_phase ph;
heights_t *heights;
- const arch_env_t *aenv;
ir_graph *irg;
ir_node *bl;
int visited;
#define get_mris_irn(env, irn) ((mris_irn_t *) phase_get_or_set_irn_data(&env->ph, irn))
#define foreach_lineage(env, pos, tmp) list_for_each_entry_safe(mris_irn_t, pos, tmp, &(env)->lineage_head, lineage_list)
-static void *mris_irn_data_init(ir_phase *ph, ir_node *irn, void *data)
+static void *mris_irn_data_init(ir_phase *ph, const ir_node *irn, void *data)
{
mris_irn_t *mi = data ? data : phase_alloc(ph, sizeof(mi[0]));
(void) irn;
return mi;
}
-#if 0
-static int compute_height(mris_env_t *env, ir_node *irn, unsigned long visited)
-{
- mris_irn_t *mi = get_mris_irn(env, irn);
-
- if(get_irn_visited(irn) >= visited) {
- DBG((env->dbg, LEVEL_3, "\theight of %+F = %d\n", irn, mi->height));
- return mi->height;
- }
-
- else {
- const ir_edge_t *edge;
-
- set_irn_visited(irn, visited);
- mi->height = 0;
-
- foreach_out_edge(irn, edge) {
- ir_node *dep = get_edge_src_irn(edge);
-
- if(!is_Block(dep) && get_nodes_block(dep) == env->bl) {
- int dep_height = compute_height(env, dep, visited);
- mi->height = MAX(mi->height, dep_height);
- }
- }
-
- mi->height++;
- DBG((env->dbg, LEVEL_3, "\tsetting height of %+F = %d\n", irn, mi->height));
- }
-
- return mi->height;
-}
-
-static void compute_heights(mris_env_t *env)
-{
- const ir_edge_t *edge;
- unsigned long visited;
-
- visited = get_irg_visited(env->irg) + 1;
- set_irg_visited(env->irg, visited);
-
- foreach_out_edge(env->bl, edge) {
- ir_node *dep = get_edge_src_irn(edge);
- if(to_appear(env, dep))
- compute_height(env, dep, visited);
- }
-}
-#endif
-
#define valid_node(env, dep) (to_appear(env, dep) && !be_is_Keep(dep))
static void grow_all_descendands(mris_env_t *env, ir_node *irn, bitset_t *visited)
return in[0];
}
-#if 0
-static void reaches_walker(mris_env_t *env, ir_node *irn, ir_node *tgt, int *found, unsigned long visited)
-{
- if(get_irn_visited(irn) < visited && get_nodes_block(irn) == env->bl) {
-
- set_irn_visited(irn, visited);
-
- if(irn == tgt)
- *found = 1;
- else {
- int i, n;
-
- for(i = 0, n = get_irn_arity(irn); i < n; ++i) {
- ir_node *op = get_irn_n(irn, i);
- if(!*found)
- reaches_walker(env, op, tgt, found, visited);
- }
- }
- }
-}
-
-static int reaches(mris_env_t *env, ir_node *src, ir_node *tgt)
-{
- int found = 0;
- unsigned long visited = get_irg_visited(env->irg) + 1;
-
- set_irg_visited(env->irg, visited);
- reaches_walker(env, src, tgt, &found, visited);
- return found;
-}
-#endif
-
-static INLINE ir_node *skip_Projs(ir_node *irn)
+static inline ir_node *skip_Projs(ir_node *irn)
{
return is_Proj(irn) ? skip_Projs(get_Proj_pred(irn)) : irn;
}
-#if 0
-static void replace_tuple_by_repr_proj(mris_env_t *env, ir_node **in)
-{
- int i;
-
- for(i = 0; in[i]; ++i) {
- if(get_irn_mode(in[i]) == mode_T) {
- const ir_edge_t *edge;
- ir_node *proj = NULL;
- ir_node *first = NULL;
-
- foreach_out_edge(in[i], edge) {
- ir_node *desc = get_edge_src_irn(edge);
-
- first = first ? first : desc;
- if(get_irn_mode(desc) == mode_M) {
- proj = desc;
- break;
- }
- }
-
- proj = proj ? proj : first;
- assert(proj);
- in[i] = proj;
- }
- }
-}
-#endif
-
static void lineage_formation(mris_env_t *env)
{
DEBUG_ONLY(firm_dbg_module_t *dbg = env->dbg);
mris_env_t *be_sched_mris_preprocess(const be_irg_t *birg)
{
- mris_env_t *env = xmalloc(sizeof(env[0]));
+ mris_env_t *env = XMALLOC(mris_env_t);
ir_graph *irg = be_get_birg_irg(birg);
phase_init(&env->ph, "mris", irg, 2 * PHASE_DEFAULT_GROWTH, mris_irn_data_init, NULL);
- env->aenv = be_get_birg_arch_env(birg);
env->irg = irg;
env->visited = 0;
env->heights = heights_new(irg);