Commit f1b19d7d authored by Matthias Braun's avatar Matthias Braun
Browse files

- More verification checks before code emit

- Respect vrfy option
parent 48071aea
......@@ -12,6 +12,7 @@
#include "irgwalk.h"
#include "irprintf_t.h"
#include "irbitset.h"
#include "irdump_t.h"
#include "beutil.h"
#include "belive_t.h"
......@@ -637,6 +638,8 @@ void be_liveness_dumpto(const be_lv_t *lv, const char *cls_name)
*/
static void dom_check(ir_node *irn, void *data)
{
int *problem_found = data;
if(!is_Block(irn) && irn != get_irg_end(get_irn_irg(irn))) {
int i, n;
ir_node *bl = get_nodes_block(irn);
......@@ -649,18 +652,24 @@ static void dom_check(ir_node *irn, void *data)
if(is_Phi(irn))
use_bl = get_Block_cfgpred_block(bl, i);
if(!block_dominates(def_bl, use_bl)) {
ir_fprintf(stderr, "%+F in %+F must dominate %+F for user %+F\n", op, def_bl, use_bl, irn);
assert(0);
if(get_irn_opcode(use_bl) != iro_Bad
&& get_irn_opcode(def_bl) != iro_Bad
&& !block_dominates(def_bl, use_bl)) {
ir_fprintf(stderr, "Verify warning: %+F in %+F must dominate %+F for user %+F (%s)\n", op, def_bl, use_bl, irn, get_irg_dump_name(get_irn_irg(op)));
*problem_found = 1;
}
}
}
}
/* Check, if the SSA dominance property is fulfilled. */
void be_check_dominance(ir_graph *irg)
int be_check_dominance(ir_graph *irg)
{
irg_walk_graph(irg, dom_check, NULL, NULL);
int problem_found = 0;
irg_walk_graph(irg, dom_check, NULL, &problem_found);
return !problem_found;
}
pset *be_liveness_transfer(const arch_env_t *arch_env, const arch_register_class_t *cls, ir_node *irn, pset *live)
......
......@@ -116,8 +116,9 @@ int (be_is_live_end)(const be_lv_t *lv, const ir_node *block, const ir_node *irn
/**
* Check, if the SSA dominance property is fulfilled.
* @param irg The graph.
* @return 1 if dominance property is fulfilled, 0 otherwise
*/
void be_check_dominance(ir_graph *irg);
int be_check_dominance(ir_graph *irg);
/**
* The liveness transfer function.
......
......@@ -28,6 +28,7 @@
#include "iredges_t.h"
#include "irloop_t.h"
#include "irtools.h"
#include "irvrfy.h"
#include "return.h"
#include "firmstat.h"
......@@ -560,8 +561,19 @@ static void be_main_loop(FILE *file_handle)
/* check schedule and register allocation */
BE_TIMER_PUSH(t_verify);
be_sched_vrfy(birg.irg, vrfy_option);
be_verify_register_allocation(env.arch_env, birg.irg);
if (vrfy_option == BE_VRFY_WARN) {
//irg_verify(birg.irg, VRFY_ENFORCE_SSA);
be_check_dominance(birg.irg);
be_verify_schedule(birg.irg);
be_verify_register_allocation(env.arch_env, birg.irg);
}
else if (vrfy_option == BE_VRFY_ASSERT) {
//assert(irg_verify(birg.irg, VRFY_ENFORCE_SSA) && "irg verification failed");
assert(be_check_dominance(birg.irg) && "Dominance verification failed");
assert(be_verify_schedule(birg.irg) && "Schedule verification failed");
assert(be_verify_register_allocation(env.arch_env, birg.irg)
&& "register allocation verification failed");
}
BE_TIMER_POP(t_verify);
/* emit assembler code */
......
EDG_BIN="edgcpfe"
EDG_CFLAGS="--c --gnu=30305 -I/usr/lib/gcc-lib/i586-suse-linux/3.3.5/include"
EDG_BIN="edg"
EDG_CFLAGS="--c --gnu=30305 -I/usr/lib/gcc-lib/i686-pc-linux-gnu/4.1.1/include"
GCC_CFLAGS="-O3 -g -fomit-frame-pointer"
LINKFLAGS="-lm"
TIMEOUT_COMPILE=300
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment