Fixed optimization of Div/Mod/DivMod nodes
[libfirm] / ir / ir / irvrfy.c
index 05775cf..7851fec 100644 (file)
@@ -3,7 +3,7 @@
  * File name:   ir/ir/irvrfy.c
  * Purpose:     Check irnodes for correctness.
  * Author:      Christian Schaefer
- * Modified by: Goetz Lindenmaier. Till Riedel
+ * Modified by: Goetz Lindenmaier. Till Riedel. Michael Beck.
  * Created:
  * CVS-ID:      $Id$
  * Copyright:   (c) 1998-2003 Universität Karlsruhe
@@ -25,9 +25,6 @@
 /** if this flag is set, verify entity types in Load & Store nodes */
 static int vrfy_entities = 0;
 
-/* @@@ replace use of array "in" by access functions. */
-ir_node **get_irn_in(ir_node *node);
-
 node_verification_t opt_do_node_verification = NODE_VERIFICATION_ON;
 const char *firm_vrfy_failure_msg;
 
@@ -333,7 +330,8 @@ static int verify_node_Proj_Cond(ir_node *pred, ir_node *p) {
   ASSERT_AND_RET_DBG(
     (
       (proj >= 0 && mode == mode_X && get_irn_mode(get_Cond_selector(pred)) == mode_b) ||   /* compare */
-      (mode == mode_X && mode_is_int(get_irn_mode(get_Cond_selector(pred))))                /* switch */
+      (mode == mode_X && mode_is_int(get_irn_mode(get_Cond_selector(pred)))) ||             /* switch */
+      is_Bad(get_Cond_selector(pred))                                                       /* rare */
     ),
     "wrong Proj from Cond", 0,
     show_proj_failure(p);
@@ -389,12 +387,12 @@ static int verify_node_Proj_Call(ir_node *n, ir_node *p) {
   );
   if (proj == pn_Call_X_except)
     ASSERT_AND_RET(
-      get_irn_pinned(n) == op_pin_state_pinned,
-      "Exception Proj from unpinned Call", 0);
+      get_irn_op(get_Call_mem(n)) != op_NoMem,
+      "Exception Proj from FunctionCall", 0);
   else if (proj == pn_Call_M_regular || proj == pn_Call_M_except)
     ASSERT_AND_RET(
-      get_irn_pinned(n) == op_pin_state_pinned,
-      "Memory Proj from unpinned Call", 0);
+      (get_irn_op(get_Call_mem(n)) != op_NoMem || 1),
+      "Memory Proj from FunctionCall", 0);
   return 1;
 }
 
@@ -785,6 +783,20 @@ static int verify_node_Jmp(ir_node *n, ir_graph *irg) {
   return 1;
 }
 
+/**
+ * verify an IJmp node
+ */
+static int verify_node_IJmp(ir_node *n, ir_graph *irg) {
+  ir_mode *mymode  = get_irn_mode(n);
+  ir_mode *op1mode = get_irn_mode(get_IJmp_target(n));
+
+  ASSERT_AND_RET(
+    /* IJmp: BB x ref --> X */
+    mymode == mode_X && mode_is_reference(op1mode), "IJmp node", 0
+  );
+  return 1;
+}
+
 /**
  * verify a Break node
  */
@@ -966,6 +978,12 @@ static int verify_node_Call(ir_node *n, ir_graph *irg) {
      --> M x datan+1 x ... x data n+m */
   ASSERT_AND_RET( op1mode == mode_M && mode_is_reference(op2mode), "Call node", 0 );  /* operand M x ref */
 
+  /* NoMem nodes are only allowed as memory input if the Call is NOT pinned */
+  ASSERT_AND_RET(
+    (get_irn_op(get_Call_mem(n)) == op_NoMem) ||
+    (get_irn_op(get_Call_mem(n)) != op_NoMem && get_irn_pinned(n) == op_pin_state_pinned),
+    "Call node with wrong memory input", 0 );
+
   mt = get_Call_type(n);
   if(get_unknown_type() == mt) {
     return 1;
@@ -1768,6 +1786,7 @@ void firm_set_default_verifyer(ir_op *op)
    CASE(Block);
    CASE(Start);
    CASE(Jmp);
+   CASE(IJmp);
    CASE(Break);
    CASE(Cond);
    CASE(Return);