* @date 26.07.2006
* @version $Id$
*/
-#ifdef HAVE_CONFIG_H
#include "config.h"
-#endif
#include <stdlib.h>
#include "unionfind.h"
#include "irdump_t.h"
-#include "benode_t.h"
+#include "benode.h"
#include "besched.h"
+#include "bespill.h"
#include "bespillslots.h"
#include "bechordal_t.h"
#include "bestatevent.h"
-#include "bespilloptions.h"
#include "bemodule.h"
#include "beintlive_t.h"
-#include "beirg_t.h"
-#include "bearch_t.h"
+#include "beirg.h"
+#include "bearch.h"
#define DBG_COALESCING 1
#define DBG_INTERFERENCES 2
}
-static INLINE ir_node *get_memory_edge(const ir_node *node)
+static inline ir_node *get_memory_edge(const ir_node *node)
{
int i, arity;
}
/* add an affinity edge */
- affinty_edge = obstack_alloc(&env->obst, sizeof(affinty_edge[0]));
+ affinty_edge = OALLOC(&env->obst, affinity_edge_t);
affinty_edge->affinity = get_block_execfreq(exec_freq, get_nodes_block(arg));
affinty_edge->slot1 = res->spillslot;
affinty_edge->slot2 = arg_spill->spillslot;
/* merge spillslots and interferences */
res = uf_union(spillslot_unionfind, s1, s2);
/* we assume that we always merge s2 to s1 so swap s1, s2 if necessary */
- if(res != 0) {
+ if(res != s1) {
int t = s1;
s1 = s2;
s2 = t;
DB((dbg, DBG_COALESCING, "Coalescing %d spillslots\n", spillcount));
- interferences = alloca(spillcount * sizeof(interferences[0]));
- spillslot_unionfind = alloca(spillcount * sizeof(spillslot_unionfind[0]));
- spilllist = alloca(spillcount * sizeof(spilllist[0]));
+ interferences = ALLOCAN(bitset_t*, spillcount);
+ spillslot_unionfind = ALLOCAN(int, spillcount);
+ spilllist = ALLOCAN(spill_t*, spillcount);
- uf_init(spillslot_unionfind, 0, spillcount);
+ uf_init(spillslot_unionfind, spillcount);
DEBUG_ONLY(
memset(spilllist, 0, spillcount * sizeof(spilllist[0]));
*/
static void assign_spillslots(be_fec_env_t *env)
{
- int i;
- int spillcount;
- spill_t *spill;
- spill_slot_t* spillslots;
-
- spillcount = set_count(env->spills);
- spillslots = alloca(spillcount * sizeof(spillslots[0]));
-
- memset(spillslots, 0, spillcount * sizeof(spillslots[0]));
+ int spillcount = set_count(env->spills);
+ spill_slot_t *spillslots = ALLOCANZ(spill_slot_t, spillcount);
+ spill_t *spill;
+ int i;
/* construct spillslots */
for(spill = set_first(env->spills); spill != NULL;
memperm = get_memperm(env, predblock);
- entry = obstack_alloc(&env->obst, sizeof(entry[0]));
+ entry = OALLOC(&env->obst, memperm_entry_t);
entry->node = node;
entry->pos = i;
entry->in = argslot->entity;
memperm_t *memperm;
for(memperm = set_first(env->memperms); memperm != NULL; memperm = set_next(env->memperms)) {
- int i;
- memperm_entry_t *entry;
- ir_node *blockend;
- ir_node** nodes = alloca(memperm->entrycount * sizeof(nodes[0]));
- ir_node* mempermnode;
+ ir_node **nodes = ALLOCAN(ir_node*, memperm->entrycount);
+ memperm_entry_t *entry;
+ ir_node *blockend;
+ ir_node *mempermnode;
+ int i;
assert(memperm->entrycount > 0);
nodes[i] = arg;
}
- mempermnode = be_new_MemPerm(arch_env, irg, memperm->block,
+ mempermnode = be_new_MemPerm(arch_env, memperm->block,
memperm->entrycount, nodes);
/* insert node into schedule */
static void collect_spills_walker(ir_node *node, void *data)
{
be_fec_env_t *env = data;
- const arch_env_t *arch_env = env->arch_env;
const ir_mode *mode;
const arch_register_class_t *cls;
int align;
if (is_Proj(node))
return;
- if (!arch_irn_class_is(arch_env, node, reload))
+ if (!arch_irn_class_is(node, reload))
return;
mode = get_irn_mode(node);
- cls = arch_get_irn_reg_class(node, -1);
- align = arch_env_get_reg_class_alignment(arch_env, cls);
+ cls = arch_get_irn_reg_class_out(node);
+ align = arch_env_get_reg_class_alignment(env->arch_env, cls);
be_node_needs_frame_entity(env, node, mode, align);
}