removed makro calls, dokumentation
[libfirm] / ir / ir / irvrfy.c
index 1775651..e51f4b7 100644 (file)
@@ -120,11 +120,26 @@ vrfy_Proj_proj(ir_node *p, ir_graph *irg) {
       break;
 
     case iro_Load:
-      ASSERT_AND_RET(
-          ((proj == 0 && mode == mode_M) ||
-           (proj == 1 && mode == mode_X) ||
-           (proj == 2 && mode_is_data(mode))),
-          "wrong Proj from Load", 0);
+      if (proj == pn_Load_res) {
+       ir_node *ptr = get_Load_ptr(pred);
+       entity *ent = NULL;
+       if (get_irn_op(ptr) == op_Sel) {
+         ent = get_Sel_entity(ptr);
+       } else if ((get_irn_op(ptr) == op_Const) &&
+                  tarval_is_entity(get_Const_tarval(ptr))) {
+         ent = get_tarval_entity(get_Const_tarval(ptr));
+       }
+       if (ent)
+         ASSERT_AND_RET((mode == get_type_mode(get_entity_type(ent))),
+                        "wrong data Proj from Load", 0);
+       else
+         ASSERT_AND_RET(mode_is_data(mode),
+                        "wrong data Proj from Load", 0);
+      } else {
+       ASSERT_AND_RET(((proj == pn_Load_M        && mode == mode_M) ||
+                       (proj == pn_Load_X_except && mode == mode_X)),
+                      "wrong Proj from Load", 0);
+      }
       break;
 
     case iro_Store:
@@ -224,8 +239,8 @@ int irn_vrfy_irg(ir_node *n, ir_graph *irg)
   int opcode, opcode1;
   ir_mode *mymode, *op1mode = NULL, *op2mode, *op3mode;
   int op_is_symmetric = 1;  /*  0: asymmetric
-1: operands have identical modes
-2: modes of operands == mode of this node */
+                               1: operands have identical modes
+                               2: modes of operands == mode of this node */
   type *mt; /* A method type */
 
   ir_node **in;
@@ -254,6 +269,26 @@ int irn_vrfy_irg(ir_node *n, ir_graph *irg)
 
   switch (opcode)
   {
+
+    case iro_Block:
+      for (i = 0; i < get_Block_n_cfgpreds(n); ++i) {
+       ir_node *pred =  get_Block_cfgpred(n, i);
+       ASSERT_AND_RET((is_Bad(pred) || get_irn_op(pred) == op_Unknown || (get_irn_mode(pred) == mode_X)), "Block node", 0);
+      }
+      // End block may only have Return, Raise or fragile ops as preds.
+      if (n == get_irg_end_block(irg))
+       for (i = 0; i < get_Block_n_cfgpreds(n); ++i) {
+         ir_node *pred =  skip_Proj(get_Block_cfgpred(n, i));
+         if (is_Proj(pred) || get_irn_op(pred) == op_Tuple)
+           break;   // We can not test properly.  How many tuples are there?
+         ASSERT_AND_RET(((get_irn_op(pred) == op_Return) ||
+                         is_Bad(pred)                    ||
+                         (get_irn_op(pred) == op_Raise)  ||
+                         is_fragile_op(pred)               ),
+                        "End Block node", 0);
+       }
+      break;
+
     case iro_Start:
       ASSERT_AND_RET(
           /* Start: BB --> X x M x ref x data1 x ... x datan x ref */
@@ -365,7 +400,7 @@ int irn_vrfy_irg(ir_node *n, ir_graph *irg)
       /* Compare arguments of node with those of type */
       mt = get_Call_type(n);
 
-      if (get_method_variadicity(mt) == variadic) {
+      if (get_method_variadicity(mt) == variadicity_variadic) {
         ASSERT_AND_RET(
             get_Call_n_params(n) >= get_method_n_params(mt),
             "Number of args for Call doesn't match number of args in variadic type.",
@@ -417,7 +452,7 @@ int irn_vrfy_irg(ir_node *n, ir_graph *irg)
           );
       if (mode_is_reference(op1mode) != mode_is_reference(op2mode)) {
         /* BB x ref x int --> ref or BB x int x ref --> ref */
-        op_is_symmetric = 0; /* ArmRoq */
+        op_is_symmetric = 0;
       } else {
         /* BB x num x num --> num or BB x ref x ref */
         op_is_symmetric = 2;
@@ -439,7 +474,7 @@ int irn_vrfy_irg(ir_node *n, ir_graph *irg)
           "Sub node", 0
           );
       if (mode_is_reference(op1mode) != mode_is_reference(op2mode)) {
-        op_is_symmetric = 0; /* ArmRoq */
+        op_is_symmetric = 0;
       } else {
         op_is_symmetric = 2;
       }
@@ -659,7 +694,7 @@ int irn_vrfy_irg(ir_node *n, ir_graph *irg)
           /* Free: BB x M x ref --> M */
           op1mode == mode_M && mode_is_reference(op2mode) &&
           mymode == mode_M,
-          "Free node",0
+          "Free node", 0
           );
       break;
 
@@ -675,6 +710,18 @@ int irn_vrfy_irg(ir_node *n, ir_graph *irg)
       return vrfy_Proj_proj(n, irg);
       break;
 
+    case iro_Confirm:
+      op1mode = get_irn_mode(in[1]);
+      op2mode = get_irn_mode(in[2]);
+      ASSERT_AND_RET(
+          /* Confirm: BB x T x T --> T */
+          op1mode == mymode &&
+         op2mode == mymode,
+          "Confirm node", 0
+          );
+
+      break;
+
     default:
       break;
   }