Added support for out edges.
[libfirm] / ir / ir / irvrfy.c
index a7f3ef3..e53c692 100644 (file)
@@ -133,6 +133,24 @@ static void show_unop_failure(ir_node *n, const char *text)
       text);
 }
 
+/**
+ * Prints a failure message for an op with 3 operands
+ */
+static void show_triop_failure(ir_node *n, const char *text)
+{
+  ir_node *op0  = get_irn_n(n, 0);
+  ir_node *op1  = get_irn_n(n, 1);
+  ir_node *op2  = get_irn_n(n, 2);
+
+  fprintf(stderr, "\nFIRM: irn_vrfy_irg() of node %ld %s%s(%s%s, %s%s, %s%s) did not match (%s)\n",
+      get_irn_node_nr(n),
+      get_irn_opname(n), get_irn_modename(n),
+      get_irn_opname(op0), get_irn_modename(op0),
+      get_irn_opname(op1), get_irn_modename(op1),
+      get_irn_opname(op2), get_irn_modename(op2),
+      text);
+}
+
 /**
  * Prints a failure message for a proj
  */
@@ -638,22 +656,22 @@ int irn_vrfy_irg(ir_node *n, ir_graph *irg)
         "Number of results for Return doesn't match number of results in type.", 0,
       show_return_nres(irg, n, mt););
       for (i = 0; i < get_Return_n_ress(n); i++) {
-    type *res_type = get_method_res_type(mt, i);
+        type *res_type = get_method_res_type(mt, i);
 
         if (is_atomic_type(res_type)) {
-      ASSERT_AND_RET_DBG(
-        get_irn_mode(get_Return_res(n, i)) == get_type_mode(res_type),
-        "Mode of result for Return doesn't match mode of result type.", 0,
-        show_return_modes(irg, n, mt, i);
-      );
-    }
-    else {
-      ASSERT_AND_RET_DBG(
-        mode_is_reference(get_irn_mode(get_Return_res(n, i))),
-        "Mode of result for Return doesn't match mode of result type.", 0,
-        show_return_modes(irg, n, mt, i);
-      );
-    }
+          ASSERT_AND_RET_DBG(
+            get_irn_mode(get_Return_res(n, i)) == get_type_mode(res_type),
+            "Mode of result for Return doesn't match mode of result type.", 0,
+            show_return_modes(irg, n, mt, i);
+          );
+        }
+        else {
+          ASSERT_AND_RET_DBG(
+            mode_is_reference(get_irn_mode(get_Return_res(n, i))),
+            "Mode of result for Return doesn't match mode of result type.", 0,
+            show_return_modes(irg, n, mt, i);
+          );
+        }
       }
       break;
 
@@ -678,7 +696,7 @@ int irn_vrfy_irg(ir_node *n, ir_graph *irg)
     case iro_SymConst:
       if (get_SymConst_kind(n) == symconst_addr_ent) {
         entity *ent = get_SymConst_entity(n);
-        if (is_method_type(get_entity_type(ent)) &&
+        if (is_Method_type(get_entity_type(ent)) &&
             get_irn_irg(n) != get_const_code_irg()) {
 #if 1
           ASSERT_AND_RET((get_entity_peculiarity(ent) != peculiarity_description),
@@ -1055,7 +1073,9 @@ int irn_vrfy_irg(ir_node *n, ir_graph *irg)
 
       break;
 
-    case iro_Store:
+    case iro_Store: {
+      entity *target;
+
       op1mode = get_irn_mode(in[1]);
       op2mode = get_irn_mode(in[2]);
       op3mode = get_irn_mode(in[3]);
@@ -1066,7 +1086,7 @@ int irn_vrfy_irg(ir_node *n, ir_graph *irg)
                      );
       ASSERT_AND_RET(mymode == mode_T, "Store node", 0);
 
-      entity *target = get_ptr_entity(in[2]);
+      target = get_ptr_entity(in[2]);
       if (vrfy_entities && target && get_irg_phase_state(current_ir_graph) == phase_high) {
         /*
          * If lowered code, any Sels that add 0 may be removed, causing
@@ -1078,6 +1098,7 @@ int irn_vrfy_irg(ir_node *n, ir_graph *irg)
       }
 
       break;
+    }
 
     case iro_Alloc:
       op1mode = get_irn_mode(in[1]);
@@ -1096,12 +1117,15 @@ int irn_vrfy_irg(ir_node *n, ir_graph *irg)
     case iro_Free:
       op1mode = get_irn_mode(in[1]);
       op2mode = get_irn_mode(in[2]);
+      op3mode = get_irn_mode(in[3]);
       ASSERT_AND_RET_DBG(
-                         /* Free: BB x M x ref --> M */
+                         /* Free: BB x M x ref x int_u --> M */
                          op1mode == mode_M && mode_is_reference(op2mode) &&
+                         mode_is_int(op3mode) &&
+                         !mode_is_signed(op3mode) &&
                          mymode == mode_M,
                          "Free node", 0,
-                         show_binop_failure(n, "/* Free: BB x M x ref --> M */");
+                         show_triop_failure(n, "/* Free: BB x M x ref x int_u --> M */");
                          );
       break;
 
@@ -1129,6 +1153,20 @@ int irn_vrfy_irg(ir_node *n, ir_graph *irg)
                          );
       break;
 
+    case iro_Mux:
+      op1mode = get_irn_mode(in[1]);
+      op2mode = get_irn_mode(in[2]);
+      op3mode = get_irn_mode(in[3]);
+      ASSERT_AND_RET(
+                         /* Mux: BB x b x numP x numP --> numP */
+                         op1mode == mode_b &&
+                         op2mode == mymode &&
+                         op3mode == mymode &&
+                         mode_is_numP(mymode),
+                         "Mux node", 0
+                         );
+      break;
+
     default:
       break;
     }