/*
- * Author: Matthias Braun
- * Date: 05.05.2006
- * Copyright: (c) Universitaet Karlsruhe
- * License: This file protected by GPL - GNU GENERAL PUBLIC LICENSE.
- * CVS-Id: $Id$
+ * 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.
+ *
+ * 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 Various verify routines that check a scheduled graph for correctness.
+ * @author Matthias Braun
+ * @date 05.05.2006
+ * @version $Id$
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#include "belive.h"
#include "besched_t.h"
#include "benode_t.h"
+#include "beirg_t.h"
+#include "beintlive_t.h"
static int my_values_interfere(const ir_node *a, const ir_node *b);
/**
* Start a walk over the irg and check the register pressure.
*/
-int be_verify_register_pressure(const be_irg_t *birg, const arch_register_class_t *cls, ir_graph *irg) {
+int be_verify_register_pressure(const be_irg_t *birg,
+ const arch_register_class_t *cls,
+ ir_graph *irg) {
be_verify_register_pressure_env_t env;
env.lv = be_liveness(irg);
return ! env.problem_found;
}
+
+
+//---------------------------------------------------------------------------
+
+
+
typedef struct be_verify_schedule_env_t_ {
- int problem_found; /**< flags indicating if there was a problem */
- bitset_t *scheduled; /**< bitset of scheduled nodes */
- ir_graph *irg; /**< the irg to check */
+ int problem_found; /**< flags indicating if there was a problem */
+ bitset_t *scheduled; /**< bitset of scheduled nodes */
+ ir_graph *irg; /**< the irg to check */
+ const arch_env_t *arch_env; /**< the arch_env */
} be_verify_schedule_env_t;
/**
}
}
-static int should_be_scheduled(ir_node *node) {
+static int should_be_scheduled(be_verify_schedule_env_t *env, ir_node *node) {
if(is_Block(node))
return -1;
if(is_Phi(node) || is_Sync(node) || is_Pin(node))
return 0;
}
- if(is_Proj(node) && get_irn_mode(node) == mode_X)
- return 0;
+ if(is_Proj(node)) {
+ if(get_irn_mode(node) == mode_X)
+ return 0;
+ return should_be_scheduled(env, get_Proj_pred(node));
+ }
if(be_is_Keep(node) && get_irn_opcode(get_nodes_block(node)) == iro_Bad)
return 0;
break;
}
+ if(arch_irn_get_flags(env->arch_env, node) & arch_irn_flags_ignore)
+ return -1;
+
return 1;
}
int should_be;
int scheduled;
- should_be = should_be_scheduled(node);
+ should_be = should_be_scheduled(env, node);
if(should_be == -1)
return;
/**
* Start a walk over the irg and check schedule.
*/
-int be_verify_schedule(ir_graph *irg)
+int be_verify_schedule(const be_irg_t *birg)
{
be_verify_schedule_env_t env;
env.problem_found = 0;
- env.scheduled = bitset_alloca(get_irg_last_idx(irg));
- env.irg = irg;
+ env.irg = be_get_birg_irg(birg);
+ env.scheduled = bitset_alloca(get_irg_last_idx(env.irg));
+ env.arch_env = birg->main_env->arch_env;
- irg_block_walk_graph(irg, verify_schedule_walker, NULL, &env);
+ irg_block_walk_graph(env.irg, verify_schedule_walker, NULL, &env);
// check if all nodes are scheduled
- irg_walk_graph(irg, check_schedule, NULL, &env);
+ irg_walk_graph(env.irg, check_schedule, NULL, &env);
return ! env.problem_found;
}
return result;
}
-static void collect(be_verify_spillslots_env_t *env, ir_node *node, ir_node *reload, ir_entity* ent);
+static
+void collect(be_verify_spillslots_env_t *env, ir_node *node, ir_node *reload, ir_entity* ent);
-static void check_entity(be_verify_spillslots_env_t *env, ir_node *node, ir_entity *ent) {
+static
+void be_check_entity(be_verify_spillslots_env_t *env, ir_node *node, ir_entity *ent) {
if(ent == NULL) {
ir_fprintf(stderr, "Verify warning: Node %+F in block %+F(%s) should have an entity assigned\n",
node, get_nodes_block(node), get_irg_dump_name(env->irg));
}
}
-static void collect_spill(be_verify_spillslots_env_t *env, ir_node *node, ir_node *reload, ir_entity* ent) {
+static
+void collect_spill(be_verify_spillslots_env_t *env, ir_node *node, ir_node *reload, ir_entity* ent) {
ir_entity *spillent = arch_get_frame_entity(env->arch_env, node);
- check_entity(env, node, spillent);
+ be_check_entity(env, node, spillent);
get_spill(env, node, ent);
if(spillent != ent) {
out = get_Proj_proj(node);
spillent = be_get_MemPerm_out_entity(memperm, out);
- check_entity(env, memperm, spillent);
+ be_check_entity(env, memperm, spillent);
if(spillent != ent) {
ir_fprintf(stderr, "Verify warning: MemPerm %+F has different entity than reload %+F in block %+F(%s)\n",
node, reload, get_nodes_block(node), get_irg_dump_name(env->irg));
return;
}
ent = arch_get_frame_entity(env->arch_env, node);
- check_entity(env, node, ent);
+ be_check_entity(env, node, ent);
collect(env, spill, node, ent);
ARR_APP1(ir_node*, env->reloads, node);
spill_t *spill = find_spill(env, node);
if(be_is_Spill(node)) {
ir_entity *ent = arch_get_frame_entity(env->arch_env, node);
- check_entity(env, node, ent);
+ be_check_entity(env, node, ent);
}
if(spill == NULL) {