-/**
- * Author: Daniel Grund
- * Date: 25.05.2005
- * Copyright: (c) Universitaet Karlsruhe
- * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE.
+/*
+ * Copyright (C) 1995-2007 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.
*
- * Performs SSA-Destruction.
+ * 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.
+ */
+
+/**
+ * @file
+ * @brief Performs SSA-Destruction.
+ * @author Daniel Grund
+ * @date 25.05.2005
+ * @version $Id$
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#include "be_t.h"
#include "beutil.h"
#include "bechordal_t.h"
-#include "bearch.h"
+#include "bearch_t.h"
#include "belive_t.h"
#include "benode_t.h"
#include "besched_t.h"
#include "benodesets.h"
#include "bestatevent.h"
+#include "beirg_t.h"
+#include "beintlive_t.h"
DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;)
*/
static void collect_phis_walker(ir_node *irn, void *data) {
be_chordal_env_t *env = data;
- if(is_Phi(irn) && chordal_has_class(env, irn)) {
+ if (is_Phi(irn) && chordal_has_class(env, irn)) {
ir_node *bl = get_nodes_block(irn);
set_irn_link(irn, get_irn_link(bl));
set_irn_link(bl, irn);
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) {
- be_chordal_env_t *chordal_env = data;
- pmap *perm_map = chordal_env->data;
+ insert_all_perms_env_t *env = data;
+ be_chordal_env_t *chordal_env = env->chordal_env;
+ pmap *perm_map = env->perm_map;
ir_graph *irg = chordal_env->irg;
be_lv_t *lv = chordal_env->birg->lv;
int i, n;
*/
static void set_regs_or_place_dupls_walker(ir_node *bl, void *data) {
be_chordal_env_t *chordal_env = data;
- be_lv_t *lv = chordal_env->birg->lv;
ir_node *phi;
/* Consider all phis of this block */
DBG((dbg, LEVEL_1, " for %+F(%s) -- %+F(%s)\n", phi, phi_reg->name, arg, arg_reg->name));
- if(values_interfere(lv, phi, arg)) {
+ if (values_interfere(chordal_env->birg, phi, arg)) {
/*
Insert a duplicate in arguments block,
make it the new phi arg,
void be_ssa_destruction(be_chordal_env_t *chordal_env) {
pmap *perm_map = pmap_create();
ir_graph *irg = chordal_env->irg;
+ insert_all_perms_env_t insert_perms_env;
FIRM_DBG_REGISTER(dbg, "ir.be.ssadestr");
be_assure_liveness(chordal_env->birg);
/* create a map for fast lookup of perms: block --> perm */
- chordal_env->data = perm_map;
irg_walk_graph(irg, clear_link, collect_phis_walker, chordal_env);
DBG((dbg, LEVEL_1, "Placing perms...\n"));
- irg_block_walk_graph(irg, insert_all_perms_walker, NULL, chordal_env);
+ 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);
if (chordal_env->opts->dump_flags & BE_CH_DUMP_SSADESTR)
be_dump(irg, "-ssa_destr_perms_placed", dump_ir_block_graph_sched);