Added block successor edges to the iredges module.
[libfirm] / ir / ir / irop.c
index fce150a..67bdb35 100644 (file)
@@ -23,6 +23,7 @@
 # include "irhooks.h"
 
 # include "iropt_t.h"             /* for firm_set_default_operations */
+# include "irvrfy_t.h"
 
 # include "xmalloc.h"
 
@@ -118,12 +119,21 @@ call_copy_attr(const ir_node *old_node, ir_node *new_node) {
   remove_Call_callee_arr(new_node);
 }
 
+static void
+block_copy_attr(const ir_node *old_node, ir_node *new_node)
+{
+  default_copy_attr(old_node, new_node);
+  INIT_LIST_HEAD(&new_node->attr.block.succ_head);
+}
+
 /**
  * Sets the copy_attr operation for an ir_op
  */
 static ir_op *firm_set_default_copy_attr(ir_op *op) {
   if (op->code == iro_Call)
     op->copy_attr = call_copy_attr;
+  else if (op->code == iro_Block)
+    op->copy_attr = block_copy_attr;
   else
     op->copy_attr = default_copy_attr;
 
@@ -148,6 +158,7 @@ new_ir_op(opcode code, const char *name, op_pin_state p, unsigned flags, op_arit
 
   firm_set_default_operations(res);
   firm_set_default_copy_attr(res);
+  firm_set_default_verifyer(res);
 
   hook_new_ir_op(res);
   return res;
@@ -168,6 +179,7 @@ init_op(void)
 #define I   irop_flag_ip_cfopcode
 #define F   irop_flag_fragile
 #define Y   irop_flag_forking
+#define H   irop_flag_highlevel
 
   op_Block     = new_ir_op(iro_Block,     "Block",     op_pin_state_pinned, L,       oparity_variable, -1, sizeof(block_attr));
 
@@ -204,7 +216,7 @@ init_op(void)
   op_Shrs      = new_ir_op(iro_Shrs,      "Shrs",      op_pin_state_floats, L,       oparity_binary,    0, 0);
   op_Rot       = new_ir_op(iro_Rot,       "Rot",       op_pin_state_floats, L,       oparity_binary,    0, 0);
   op_Conv      = new_ir_op(iro_Conv,      "Conv",      op_pin_state_floats, N,       oparity_unary,     0, 0);
-  op_Cast      = new_ir_op(iro_Cast,      "Cast",      op_pin_state_floats, N,       oparity_unary,     0, sizeof(cast_attr));
+  op_Cast      = new_ir_op(iro_Cast,      "Cast",      op_pin_state_floats, N|H,     oparity_unary,     0, sizeof(cast_attr));
 
   op_Phi       = new_ir_op(iro_Phi,       "Phi",       op_pin_state_pinned, L,       oparity_variable, -1, sizeof(int));
 
@@ -218,7 +230,7 @@ init_op(void)
   op_Tuple     = new_ir_op(iro_Tuple,     "Tuple",     op_pin_state_floats, L,       oparity_variable, -1, 0);
   op_Id        = new_ir_op(iro_Id,        "Id",        op_pin_state_floats, N,       oparity_any,      -1, 0);
   op_Bad       = new_ir_op(iro_Bad,       "Bad",       op_pin_state_pinned, X|F,     oparity_zero,     -1, 0);
-  op_Confirm   = new_ir_op(iro_Confirm,   "Confirm",   op_pin_state_floats, L,       oparity_any,      -1, sizeof(confirm_attr));
+  op_Confirm   = new_ir_op(iro_Confirm,   "Confirm",   op_pin_state_floats, L|H,     oparity_any,      -1, sizeof(confirm_attr));
 
   op_Unknown   = new_ir_op(iro_Unknown,   "Unknown",   op_pin_state_pinned, X|F,     oparity_zero,     -1, 0);
   op_Filter    = new_ir_op(iro_Filter,    "Filter",    op_pin_state_pinned, L,       oparity_variable, -1, sizeof(filter_attr));
@@ -230,6 +242,7 @@ init_op(void)
   op_NoMem     = new_ir_op(iro_NoMem,     "NoMem",     op_pin_state_pinned, N,       oparity_zero,     -1, 0);
   op_Mux       = new_ir_op(iro_Mux,       "Mux",       op_pin_state_floats, N,       oparity_trinary,  -1, 0);
 
+#undef H
 #undef Y
 #undef F
 #undef I
@@ -309,11 +322,11 @@ const char *get_op_name (const ir_op *op) {
 }
 
 opcode (get_op_code)(const ir_op *op){
-  return __get_op_code(op);
+  return _get_op_code(op);
 }
 
 ident *(get_op_ident)(const ir_op *op){
-  return __get_op_ident(op);
+  return _get_op_ident(op);
 }
 
 const char *get_op_pin_state_name(op_pin_state s) {
@@ -328,8 +341,8 @@ const char *get_op_pin_state_name(op_pin_state s) {
        return "<none>";
 }
 
-op_pin_state (get_op_pinned)(const ir_op *op){
-  return __get_op_pinned(op);
+op_pin_state (get_op_pinned)(const ir_op *op) {
+  return _get_op_pinned(op);
 }
 
 /* Sets op_pin_state_pinned in the opcode.  Setting it to floating has no effect
@@ -339,6 +352,7 @@ void      set_op_pinned(ir_op *op, op_pin_state op_pin_state_pinned) {
   op->op_pin_state_pinned = op_pin_state_pinned;
 }
 
+/* retrieve the next free opcode */
 unsigned get_next_ir_opcode(void) {
   return next_iro++;
 }