* @brief Performs SSA-Destruction.
* @author Daniel Grund
* @date 25.05.2005
- * @version $Id$
*/
#include "config.h"
return !(p->arg == q->arg);
}
-typedef struct insert_all_perms_env_t {
- be_chordal_env_t *chordal_env;
- pmap *perm_map;
-} insert_all_perms_env_t;
-
/**
* Insert Perms in all predecessors of a block containing a phi
*/
static void insert_all_perms_walker(ir_node *bl, void *data)
{
- insert_all_perms_env_t *env = (insert_all_perms_env_t*)data;
- be_chordal_env_t *chordal_env = env->chordal_env;
- pmap *perm_map = env->perm_map;
+ be_chordal_env_t *const chordal_env = (be_chordal_env_t*)data;
be_lv_t *lv = be_get_irg_liveness(chordal_env->irg);
int i, n;
ir_node *pred_bl = get_Block_cfgpred_block(bl, i);
int n_projs = 0;
- assert(!pmap_contains(perm_map, pred_bl) && "Already permed that block");
-
/*
* Note that all phis in the list are in the same
* register class by construction.
* above in the arg_set and insert it into the schedule.
*/
in = XMALLOCN(ir_node*, n_projs);
- foreach_set(arg_set, perm_proj_t*, pp) {
+ foreach_set(arg_set, perm_proj_t, pp) {
in[pp->pos] = pp->arg;
}
* arguments to the projs (new phi arguments).
*/
insert_after = perm;
- foreach_set(arg_set, perm_proj_t*, pp) {
+ foreach_set(arg_set, perm_proj_t, pp) {
ir_node *proj = new_r_Proj(perm, get_irn_mode(pp->arg), pp->pos);
pp->proj = proj;
assert(arch_get_irn_register(pp->arg));
be_liveness_update(lv, in[i]);
}
free(in);
-
- /* register in perm map */
- pmap_insert(perm_map, pred_bl, perm);
}
del_set(arg_set);
void be_ssa_destruction(be_chordal_env_t *chordal_env)
{
- insert_all_perms_env_t insert_perms_env;
- pmap *perm_map = pmap_create();
- ir_graph *irg = chordal_env->irg;
- be_lv_t *lv = be_assure_liveness(irg);
+ ir_graph *irg = chordal_env->irg;
FIRM_DBG_REGISTER(dbg, "ir.be.ssadestr");
- be_liveness_invalidate(lv);
+ be_invalidate_live_sets(irg);
/* create a map for fast lookup of perms: block --> perm */
irg_walk_graph(irg, clear_link, collect_phis_walker, chordal_env);
DBG((dbg, LEVEL_1, "Placing perms...\n"));
- insert_perms_env.chordal_env = chordal_env;
- insert_perms_env.perm_map = perm_map;
- irg_block_walk_graph(irg, insert_all_perms_walker, NULL, &insert_perms_env);
-
- // Matze: really needed here?
- // Sebastian: Yes. the walker function uses interference.
- be_liveness_invalidate(lv);
+ irg_block_walk_graph(irg, insert_all_perms_walker, NULL, chordal_env);
if (chordal_env->opts->dump_flags & BE_CH_DUMP_SSADESTR)
dump_ir_graph(irg, "ssa_destr_perms_placed");
- be_liveness_assure_chk(lv);
+ be_assure_live_chk(irg);
DBG((dbg, LEVEL_1, "Setting regs and placing dupls...\n"));
irg_block_walk_graph(irg, set_regs_or_place_dupls_walker, NULL, chordal_env);
- /* TODO: unfortunately updating doesn't work yet. */
- be_liveness_invalidate(lv);
+ /* unfortunately updating doesn't work yet. */
+ be_invalidate_live_chk(irg);
if (chordal_env->opts->dump_flags & BE_CH_DUMP_SSADESTR)
dump_ir_graph(irg, "ssa_destr_regs_set");
-
- pmap_destroy(perm_map);
}
static void ssa_destruction_check_walker(ir_node *bl, void *data)