irop_flag_highlevel flag added to Confirm and Cast
[libfirm] / ir / ir / irnode.c
index 98fbcea..11e6690 100644 (file)
@@ -53,32 +53,44 @@ const char *get_pnc_string(int pnc) {
   return pnc_name_arr[pnc];
 }
 
-/**
+/*
  * Calculates the negated pnc condition.
  */
 int
 get_negated_pnc(int pnc) {
   switch (pnc) {
-  case pn_Cmp_False: return pn_Cmp_True;  break;
-  case pn_Cmp_Eq:    return pn_Cmp_Ne;    break;
-  case pn_Cmp_Lt:    return pn_Cmp_Uge;   break;
-  case pn_Cmp_Le:    return pn_Cmp_Ug;    break;
-  case pn_Cmp_Gt:    return pn_Cmp_Ule;   break;
-  case pn_Cmp_Ge:    return pn_Cmp_Ul;    break;
-  case pn_Cmp_Lg:    return pn_Cmp_Ue;    break;
-  case pn_Cmp_Leg:   return pn_Cmp_Uo;    break;
-  case pn_Cmp_Uo:    return pn_Cmp_Leg;   break;
-  case pn_Cmp_Ue:    return pn_Cmp_Lg;    break;
-  case pn_Cmp_Ul:    return pn_Cmp_Ge;    break;
-  case pn_Cmp_Ule:   return pn_Cmp_Gt;    break;
-  case pn_Cmp_Ug:    return pn_Cmp_Le;    break;
-  case pn_Cmp_Uge:   return pn_Cmp_Lt;    break;
-  case pn_Cmp_Ne:    return pn_Cmp_Eq;    break;
-  case pn_Cmp_True:  return pn_Cmp_False; break;
+  case pn_Cmp_False: return pn_Cmp_True;
+  case pn_Cmp_Eq:    return pn_Cmp_Ne;
+  case pn_Cmp_Lt:    return pn_Cmp_Uge;
+  case pn_Cmp_Le:    return pn_Cmp_Ug;
+  case pn_Cmp_Gt:    return pn_Cmp_Ule;
+  case pn_Cmp_Ge:    return pn_Cmp_Ul;
+  case pn_Cmp_Lg:    return pn_Cmp_Ue;
+  case pn_Cmp_Leg:   return pn_Cmp_Uo;
+  case pn_Cmp_Uo:    return pn_Cmp_Leg;
+  case pn_Cmp_Ue:    return pn_Cmp_Lg;
+  case pn_Cmp_Ul:    return pn_Cmp_Ge;
+  case pn_Cmp_Ule:   return pn_Cmp_Gt;
+  case pn_Cmp_Ug:    return pn_Cmp_Le;
+  case pn_Cmp_Uge:   return pn_Cmp_Lt;
+  case pn_Cmp_Ne:    return pn_Cmp_Eq;
+  case pn_Cmp_True:  return pn_Cmp_False;
   }
   return 99; /* to shut up gcc */
 }
 
+/* Calculates the swapped pnc condition, i.e., "<" --> ">" */
+int
+get_swapped_pnc(int pnc) {
+  int code    = pnc & ~(pn_Cmp_Lt|pn_Cmp_Gt);
+  int lesser  = pnc & pn_Cmp_Lt;
+  int greater = pnc & pn_Cmp_Gt;
+
+  code |= (lesser ? pn_Cmp_Gt : 0) | (greater ? pn_Cmp_Lt : 0);
+
+  return code;
+}
+
 const char *pns_name_arr [] = {
   "initial_exec", "global_store",
   "frame_base", "globals", "args"
@@ -633,29 +645,26 @@ set_Block_matured (ir_node *node, bool matured) {
   assert (node->op == op_Block);
   node->attr.block.matured = matured;
 }
+
 unsigned long
-get_Block_block_visited (ir_node *node) {
-  assert (node->op == op_Block);
-  return node->attr.block.block_visited;
+(get_Block_block_visited)(ir_node *node) {
+  return _get_Block_block_visited(node);
 }
 
 void
-set_Block_block_visited (ir_node *node, unsigned long visit) {
-  assert (node->op == op_Block);
-  node->attr.block.block_visited = visit;
+(set_Block_block_visited)(ir_node *node, unsigned long visit) {
+  _set_Block_block_visited(node, visit);
 }
 
 /* For this current_ir_graph must be set. */
 void
-mark_Block_block_visited (ir_node *node) {
-  assert (node->op == op_Block);
-  node->attr.block.block_visited = get_irg_block_visited(current_ir_graph);
+(mark_Block_block_visited)(ir_node *node) {
+  _mark_Block_block_visited(node);
 }
 
 int
-Block_not_block_visited(ir_node *node) {
-  assert (node->op == op_Block);
-  return (node->attr.block.block_visited < get_irg_block_visited(current_ir_graph));
+(Block_not_block_visited)(ir_node *node) {
+  return _Block_not_block_visited(node);
 }
 
 ir_node *
@@ -2033,13 +2042,25 @@ skip_Tuple (ir_node *node) {
   return node;
 }
 
-/** returns operand of node if node is a Cast */
+/* returns operand of node if node is a Cast */
 ir_node *skip_Cast  (ir_node *node) {
   if (node && get_irn_op(node) == op_Cast) {
-    return skip_Id(get_irn_n(node, 0));
-  } else {
-    return node;
-  }
+    return get_Cast_op(node);
+  return node;
+}
+
+/* returns operand of node if node is a Confirm */
+ir_node *skip_Confirm  (ir_node *node) {
+  if (node && get_irn_op(node) == op_Confirm) {
+    return get_Confirm_value(node);
+  return node;
+}
+
+/* skip all high-level ops */
+ir_node *skip_HighLevel(ir_node *node) {
+  if (node && is_op_highlevel(get_irn_op(node)))
+    return get_irn_n(node, 0);
+  return node;
 }
 
 #if 0
@@ -2114,6 +2135,11 @@ int
   return _is_Bad(node);
 }
 
+int
+(is_Const)(const ir_node *node) {
+       return _is_Const(node);
+}
+
 int
 (is_no_Block)(const ir_node *node) {
   return _is_no_Block(node);
@@ -2126,9 +2152,8 @@ int
 
 /* returns true if node is a Unknown node. */
 int
-is_Unknown (const ir_node *node) {
-  assert(node);
-  return (get_irn_op(node) == op_Unknown);
+(is_Unknown)(const ir_node *node) {
+  return _is_Unknown(node);
 }
 
 int