- More verification checks before code emit
authorMatthias Braun <matze@braunis.de>
Tue, 22 Aug 2006 06:46:57 +0000 (06:46 +0000)
committerMatthias Braun <matze@braunis.de>
Tue, 22 Aug 2006 06:46:57 +0000 (06:46 +0000)
- Respect vrfy option

ir/be/belive.c
ir/be/belive.h
ir/be/bemain.c
ir/be/test/makereport.sh

index 753a510..505546f 100644 (file)
@@ -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)
index fddbcdb..f368fb3 100644 (file)
@@ -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.
index ca848c6..c476f88 100644 (file)
@@ -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 */
index 6007cc9..12d9fa8 100755 (executable)
@@ -1,5 +1,5 @@
-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