Fixed 'inline' lossage --flo
[libfirm] / ir / ir / irnode.c
index ba1f4dc..cfeb23b 100644 (file)
 #include "array.h"
 #include "irbackedge_t.h"
 #include "irdump.h"
-#include "irflag.h"
+#include "irflag_t.h"
 #include "irop_t.h"
-
 #include "irprog_t.h"
 
+#include "firmstat.h"
+
 /* some constants fixing the positions of nodes predecessors
    in the in array */
 #define CALL_PARAM_OFFSET 2
@@ -53,11 +54,16 @@ static const char *pnc_name_arr [] = {
   "Ne", "True"
 };
 
+/**
+ * returns the pnc name from an pnc constant
+ */
 INLINE 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) {
@@ -95,10 +101,12 @@ init_irnode (void)
 {
 }
 
-/* irnode constructor                                             */
-/* create a new irnode in irg, with an op, mode, arity and        */
-/* some incoming irnodes                                          */
-/* this constructor is used in every specified irnode constructor */
+/*
+ * irnode constructor.
+ * Create a new irnode in irg, with an op, mode, arity and
+ * some incoming irnodes.
+ * If arity is negative, a node with a dynamic array is created.
+ */
 INLINE ir_node *
 new_ir_node (dbg_info *db, ir_graph *irg, ir_node *block, ir_op *op, ir_mode *mode,
             int arity, ir_node **in)
@@ -106,6 +114,7 @@ new_ir_node (dbg_info *db, ir_graph *irg, ir_node *block, ir_op *op, ir_mode *mo
   ir_node *res;
   int node_size = offsetof (ir_node, attr) +  op->attr_size;
 
+  assert(irg && op && mode);
   res = (ir_node *) obstack_alloc (irg->obst, node_size);
 
   res->kind = k_ir_node;
@@ -127,22 +136,23 @@ new_ir_node (dbg_info *db, ir_graph *irg, ir_node *block, ir_op *op, ir_mode *mo
   res->node_nr = get_irp_new_node_nr();
 #endif
 
+  stat_new_node(res);
+
   return res;
 }
 
 /* Copies all attributes stored in the old node to the new node.
    Assumes both have the same opcode and sufficient size. */
 void
-copy_attrs (ir_node *old, ir_node *new) {
-  assert (get_irn_op(old) == get_irn_op(new));
-  memcpy (&new->attr, &old->attr, get_op_attr_size(get_irn_op(old)));
+copy_attrs (const ir_node *old_node, ir_node *new_node) {
+  assert(get_irn_op(old_node) == get_irn_op(new_node));
+  memcpy(&new_node->attr, &old_node->attr, get_op_attr_size(get_irn_op(old_node)));
 }
 
 /** getting some parameters from ir_nodes **/
 
 int
-is_ir_node (void *thing) {
-  assert(thing);
+is_ir_node (const void *thing) {
   if (get_kind(thing) == k_ir_node)
     return 1;
   else
@@ -243,7 +253,7 @@ get_irn_inter_n (ir_node *node, int n) {
 
 /* to iterate through the predecessors without touching the array */
 /* To iterate over the operands iterate from 0 to i < get_irn_arity(),
-   to iterate includind the Block predecessor iterate from i = -1 to
+   to iterate including the Block predecessor iterate from i = -1 to
    i < get_irn_arity.
    If it is a block, the entry -1 is NULL. */
 INLINE ir_node *
@@ -333,7 +343,6 @@ set_irn_op (ir_node *node, ir_op *op)
 INLINE opcode
 get_irn_opcode (const ir_node *node)
 {
-  assert (node);
   assert (k_ir_node == get_kind(node));
   assert (node -> op);
   return node->op->code;
@@ -454,6 +463,13 @@ get_irn_call_attr (ir_node *node)
   return node->attr.call.cld_tp = skip_tid(node->attr.call.cld_tp);
 }
 
+INLINE type *
+get_irn_funccall_attr (ir_node *node)
+{
+  assert (node->op == op_FuncCall);
+  return node->attr.call.cld_tp = skip_tid(node->attr.call.cld_tp);
+}
+
 INLINE sel_attr
 get_irn_sel_attr (ir_node *node)
 {
@@ -527,7 +543,7 @@ int is_value_arg_pointer(ir_node *n) {
 }
 
 /* Returns an array with the predecessors of the Block. Depending on
-   the implementation of the graph datastructure this can be a copy of
+   the implementation of the graph data structure this can be a copy of
    the internal representation of predecessors as well as the internal
    array itself. Therefore writing to this array might obstruct the ir. */
 INLINE ir_node **
@@ -766,7 +782,7 @@ ir_graph *get_EndExcept_irg  (ir_node *end) {
 I know it's complicated.
 Basically there are two proglems:
  - determining the gaps between the projs
- - determining the biggest case constant to konw the proj number for
+ - determining the biggest case constant to know the proj number for
    the default node.
 I see several solutions:
 1. Introduce a ProjDefault node.  Solves both problems.
@@ -779,7 +795,7 @@ I see several solutions:
 
 Solution 2 seems to be the best:
 Computing the gaps in the Firm representation is not too hard, i.e.,
-libfirm can implement a routine that transforms betweeen the two
+libFIRM can implement a routine that transforms between the two
 flavours.  This is also possible for 1) but 2) does not require to
 change any existing optimization.
 Further it should be far simpler to determine the biggest constant than
@@ -1205,115 +1221,128 @@ void  set_CallBegin_call (ir_node *node, ir_node *call) {
 }
 
 INLINE ir_node *
-get_Add_left (ir_node *node) {
-  assert (node->op == op_Add);
+get_FuncCall_ptr (ir_node *node) {
+  assert (node->op == op_FuncCall);
   return get_irn_n(node, 0);
 }
 
 INLINE void
-set_Add_left (ir_node *node, ir_node *left) {
-  assert (node->op == op_Add);
-  set_irn_n(node, 0, left);
+set_FuncCall_ptr (ir_node *node, ir_node *ptr) {
+  assert (node->op == op_FuncCall);
+  set_irn_n(node, 0, ptr);
 }
 
-INLINE ir_node *
-get_Add_right (ir_node *node) {
-  assert (node->op == op_Add);
-  return get_irn_n(node, 1);
+INLINE ir_node **
+get_FuncCall_param_arr (ir_node *node) {
+  assert (node->op == op_FuncCall);
+  return (ir_node **)&get_irn_in(node)[CALL_PARAM_OFFSET];
 }
 
-INLINE void
-set_Add_right (ir_node *node, ir_node *right) {
-  assert (node->op == op_Add);
-  set_irn_n(node, 1, right);
+INLINE int
+get_FuncCall_n_params (ir_node *node)  {
+  assert (node->op == op_FuncCall);
+  return (get_irn_arity(node) - CALL_PARAM_OFFSET);
 }
 
-INLINE ir_node *
-get_Sub_left (ir_node *node) {
-  assert (node->op == op_Sub);
-  return get_irn_n(node, 0);
+INLINE int
+get_FuncCall_arity (ir_node *node) {
+  assert (node->op == op_FuncCall);
+  return get_FuncCall_n_params(node);
 }
 
-INLINE void
-set_Sub_left (ir_node *node, ir_node *left) {
-  assert (node->op == op_Sub);
-  set_irn_n(node, 0, left);
+/* INLINE void
+set_FuncCall_arity (ir_node *node, ir_node *arity) {
+  assert (node->op == op_FuncCall);
 }
+*/
 
 INLINE ir_node *
-get_Sub_right (ir_node *node) {
-  assert (node->op == op_Sub);
-  return get_irn_n(node, 1);
+get_FuncCall_param (ir_node *node, int pos) {
+  assert (node->op == op_FuncCall);
+  return get_irn_n(node, pos + CALL_PARAM_OFFSET);
 }
 
 INLINE void
-set_Sub_right (ir_node *node, ir_node *right) {
-  assert (node->op == op_Sub);
-  set_irn_n(node, 1, right);
+set_FuncCall_param (ir_node *node, int pos, ir_node *param) {
+  assert (node->op == op_FuncCall);
+  set_irn_n(node, pos + CALL_PARAM_OFFSET, param);
 }
 
-
-INLINE ir_node *
-get_Minus_op (ir_node *node) {
-  assert (node->op == op_Minus);
-  return get_irn_n(node, 0);
+INLINE type *
+get_FuncCall_type (ir_node *node) {
+  assert (node->op == op_FuncCall);
+  return node->attr.call.cld_tp = skip_tid(node->attr.call.cld_tp);
 }
 
 INLINE void
-set_Minus_op (ir_node *node, ir_node *op) {
-  assert (node->op == op_Minus);
-  set_irn_n(node, 0, op);
+set_FuncCall_type (ir_node *node, type *tp) {
+  assert (node->op == op_FuncCall);
+  assert (is_method_type(tp));
+  node->attr.call.cld_tp = tp;
 }
 
-
-INLINE ir_node *
-get_Mul_left (ir_node *node) {
-  assert (node->op == op_Mul);
-  return get_irn_n(node, 0);
+int FuncCall_has_callees(ir_node *node) {
+  return (node->attr.call.callee_arr != NULL);
 }
 
-INLINE void
-set_Mul_left (ir_node *node, ir_node *left) {
-  assert (node->op == op_Mul);
-  set_irn_n(node, 0, left);
+int get_FuncCall_n_callees(ir_node * node) {
+  assert(node->op == op_FuncCall && node->attr.call.callee_arr);
+  return ARR_LEN(node->attr.call.callee_arr);
 }
 
-INLINE ir_node *
-get_Mul_right (ir_node *node) {
-  assert (node->op == op_Mul);
-  return get_irn_n(node, 1);
+entity * get_FuncCall_callee(ir_node * node, int pos) {
+  assert(node->op == op_FuncCall && node->attr.call.callee_arr);
+  return node->attr.call.callee_arr[pos];
 }
 
-INLINE void
-set_Mul_right (ir_node *node, ir_node *right) {
-  assert (node->op == op_Mul);
-  set_irn_n(node, 1, right);
+void set_FuncCall_callee_arr(ir_node * node, int n, entity ** arr) {
+  assert(node->op == op_FuncCall);
+  if (node->attr.call.callee_arr == NULL || get_Call_n_callees(node) != n) {
+    node->attr.call.callee_arr = NEW_ARR_D(entity *, current_ir_graph->obst, n);
+  }
+  memcpy(node->attr.call.callee_arr, arr, n * sizeof(entity *));
 }
 
-INLINE ir_node *
-get_Quot_left (ir_node *node) {
-  assert (node->op == op_Quot);
-  return get_irn_n(node, 1);
+void remove_FuncCall_callee_arr(ir_node * node) {
+  assert(node->op == op_FuncCall);
+  node->attr.call.callee_arr = NULL;
 }
 
-INLINE void
-set_Quot_left (ir_node *node, ir_node *left) {
-  assert (node->op == op_Quot);
-  set_irn_n(node, 1, left);
-}
 
-INLINE ir_node *
-get_Quot_right (ir_node *node) {
-  assert (node->op == op_Quot);
-  return get_irn_n(node, 2);
+#define BINOP(OP)                                      \
+ir_node * get_##OP##_left(ir_node *node) {             \
+  assert(node->op == op_##OP);                         \
+  return get_irn_n(node, node->op->op_index);          \
+}                                                      \
+void set_##OP##_left(ir_node *node, ir_node *left) {   \
+  assert(node->op == op_##OP);                         \
+  set_irn_n(node, node->op->op_index, left);           \
+}                                                      \
+ir_node *get_##OP##_right(ir_node *node) {             \
+  assert(node->op == op_##OP);                         \
+  return get_irn_n(node, node->op->op_index + 1);      \
+}                                                      \
+void set_##OP##_right(ir_node *node, ir_node *right) { \
+  assert(node->op == op_##OP);                         \
+  set_irn_n(node, node->op->op_index + 1, right);      \
 }
 
-INLINE void
-set_Quot_right (ir_node *node, ir_node *right) {
-  assert (node->op == op_Quot);
-  set_irn_n(node, 2, right);
+#define UNOP(OP)                                       \
+ir_node *get_##OP##_op(ir_node *node) {                        \
+  assert(node->op == op_##OP);                         \
+  return get_irn_n(node, node->op->op_index);          \
+}                                                      \
+void set_##OP##_op (ir_node *node, ir_node *op) {      \
+  assert(node->op == op_##OP);                         \
+  set_irn_n(node, node->op->op_index, op);             \
 }
 
+BINOP(Add)
+BINOP(Sub)
+UNOP(Minus)
+BINOP(Mul)
+BINOP(Quot)
+
 INLINE ir_node *
 get_Quot_mem (ir_node *node) {
   assert (node->op == op_Quot);
@@ -1326,29 +1355,7 @@ set_Quot_mem (ir_node *node, ir_node *mem) {
   set_irn_n(node, 0, mem);
 }
 
-INLINE ir_node *
-get_DivMod_left (ir_node *node) {
-  assert (node->op == op_DivMod);
-  return get_irn_n(node, 1);
-}
-
-INLINE void
-set_DivMod_left (ir_node *node, ir_node *left) {
-  assert (node->op == op_DivMod);
-  set_irn_n(node, 1, left);
-}
-
-INLINE ir_node *
-get_DivMod_right (ir_node *node) {
-  assert (node->op == op_DivMod);
-  return get_irn_n(node, 2);
-}
-
-INLINE void
-set_DivMod_right (ir_node *node, ir_node *right) {
-  assert (node->op == op_DivMod);
-  set_irn_n(node, 2, right);
-}
+BINOP(DivMod)
 
 INLINE ir_node *
 get_DivMod_mem (ir_node *node) {
@@ -1362,29 +1369,7 @@ set_DivMod_mem (ir_node *node, ir_node *mem) {
   set_irn_n(node, 0, mem);
 }
 
-INLINE ir_node *
-get_Div_left (ir_node *node) {
-  assert (node->op == op_Div);
-  return get_irn_n(node, 1);
-}
-
-INLINE void
-set_Div_left (ir_node *node, ir_node *left) {
-  assert (node->op == op_Div);
-  set_irn_n(node, 1, left);
-}
-
-INLINE ir_node *
-get_Div_right (ir_node *node) {
-  assert (node->op == op_Div);
-  return get_irn_n(node, 2);
-}
-
-INLINE void
-set_Div_right (ir_node *node, ir_node *right) {
-  assert (node->op == op_Div);
-  set_irn_n(node, 2, right);
-}
+BINOP(Div)
 
 INLINE ir_node *
 get_Div_mem (ir_node *node) {
@@ -1398,29 +1383,7 @@ set_Div_mem (ir_node *node, ir_node *mem) {
   set_irn_n(node, 0, mem);
 }
 
-INLINE ir_node *
-get_Mod_left (ir_node *node) {
-  assert (node->op == op_Mod);
-  return get_irn_n(node, 1);
-}
-
-INLINE void
-set_Mod_left (ir_node *node, ir_node *left) {
-  assert (node->op == op_Mod);
-  set_irn_n(node, 1, left);
-}
-
-INLINE ir_node *
-get_Mod_right (ir_node *node) {
-  assert (node->op == op_Mod);
-  return get_irn_n(node, 2);
-}
-
-INLINE void
-set_Mod_right (ir_node *node, ir_node *right) {
-  assert (node->op == op_Mod);
-  set_irn_n(node, 2, right);
-}
+BINOP(Mod)
 
 INLINE ir_node *
 get_Mod_mem (ir_node *node) {
@@ -1434,247 +1397,18 @@ set_Mod_mem (ir_node *node, ir_node *mem) {
   set_irn_n(node, 0, mem);
 }
 
-INLINE ir_node *
-get_Abs_op (ir_node *node) {
-  assert (node->op == op_Abs);
-  return get_irn_n(node, 0);
-}
-
-INLINE void
-set_Abs_op (ir_node *node, ir_node *op) {
-  assert (node->op == op_Abs);
-  set_irn_n(node, 0, op);
-}
-
-INLINE ir_node *
-get_And_left (ir_node *node) {
-  assert (node->op == op_And);
-  return get_irn_n(node, 0);
-}
-
-INLINE void
-set_And_left (ir_node *node, ir_node *left) {
-  assert (node->op == op_And);
-  set_irn_n(node, 0, left);
-}
-
-INLINE ir_node *
-get_And_right (ir_node *node) {
-  assert (node->op == op_And);
-  return get_irn_n(node, 1);
-}
-
-INLINE void
-set_And_right (ir_node *node, ir_node *right) {
-  assert (node->op == op_And);
-  set_irn_n(node, 1, right);
-}
-
-INLINE ir_node *
-get_Or_left (ir_node *node) {
-  assert (node->op == op_Or);
-  return get_irn_n(node, 0);
-}
-
-INLINE void
-set_Or_left (ir_node *node, ir_node *left) {
-  assert (node->op == op_Or);
-  set_irn_n(node, 0, left);
-}
-
-INLINE ir_node *
-get_Or_right (ir_node *node) {
-  assert (node->op == op_Or);
-  return get_irn_n(node, 1);
-}
-
-INLINE void
-set_Or_right (ir_node *node, ir_node *right) {
-  assert (node->op == op_Or);
-  set_irn_n(node, 1, right);
-}
-
-INLINE ir_node *
-get_Eor_left (ir_node *node) {
-  assert (node->op == op_Eor);
-  return get_irn_n(node, 0);
-}
-
-INLINE void
-set_Eor_left (ir_node *node, ir_node *left) {
-  assert (node->op == op_Eor);
-  set_irn_n(node, 0, left);
-}
-
-INLINE ir_node *
-get_Eor_right (ir_node *node) {
-  assert (node->op == op_Eor);
-  return get_irn_n(node, 1);
-}
-
-INLINE void
-set_Eor_right (ir_node *node, ir_node *right) {
-  assert (node->op == op_Eor);
-  set_irn_n(node, 1, right);
-}
-
-
-INLINE ir_node *
-get_Not_op (ir_node *node) {
-  assert (node->op == op_Not);
-  return get_irn_n(node, 0);
-}
-
-INLINE void
-set_Not_op (ir_node *node, ir_node *op) {
-  assert (node->op == op_Not);
-  set_irn_n(node, 0, op);
-}
-
-
-INLINE ir_node *
-get_Shl_left (ir_node *node) {
-  assert (node->op == op_Shl);
-  return get_irn_n(node, 0);
-}
-
-INLINE void
-set_Shl_left (ir_node *node, ir_node *left) {
-  assert (node->op == op_Shl);
-  set_irn_n(node, 0, left);
-}
-
-INLINE ir_node *
-get_Shl_right (ir_node *node) {
-  assert (node->op == op_Shl);
-  return get_irn_n(node, 1);
-}
-
-INLINE void
-set_Shl_right (ir_node *node, ir_node *right) {
-  assert (node->op == op_Shl);
-  set_irn_n(node, 1, right);
-}
-
-INLINE ir_node *
-get_Shr_left (ir_node *node) {
-  assert (node->op == op_Shr);
-  return get_irn_n(node, 0);
-}
-
-INLINE void
-set_Shr_left (ir_node *node, ir_node *left) {
-  assert (node->op == op_Shr);
-  set_irn_n(node, 0, left);
-}
-
-INLINE ir_node *
-get_Shr_right (ir_node *node) {
-  assert (node->op == op_Shr);
-  return get_irn_n(node, 1);
-}
-
-INLINE void
-set_Shr_right (ir_node *node, ir_node *right) {
-  assert (node->op == op_Shr);
-  set_irn_n(node, 1, right);
-}
-
-INLINE ir_node *
-get_Shrs_left (ir_node *node) {
-  assert (node->op == op_Shrs);
-  return get_irn_n(node, 0);
-}
-
-INLINE void
-set_Shrs_left (ir_node *node, ir_node *left) {
-  assert (node->op == op_Shrs);
-  set_irn_n(node, 0, left);
-}
-
-INLINE ir_node *
-get_Shrs_right (ir_node *node) {
-  assert (node->op == op_Shrs);
-  return get_irn_n(node, 1);
-}
-
-INLINE void
-set_Shrs_right (ir_node *node, ir_node *right) {
-  assert (node->op == op_Shrs);
-  set_irn_n(node, 1, right);
-}
-
-INLINE ir_node *
-get_Rot_left (ir_node *node) {
-  assert (node->op == op_Rot);
-  return get_irn_n(node, 0);
-}
-
-INLINE void
-set_Rot_left (ir_node *node, ir_node *left) {
-  assert (node->op == op_Rot);
-  set_irn_n(node, 0, left);
-}
-
-INLINE ir_node *
-get_Rot_right (ir_node *node) {
-  assert (node->op == op_Rot);
-  return get_irn_n(node, 1);
-}
-
-INLINE void
-set_Rot_right (ir_node *node, ir_node *right) {
-  assert (node->op == op_Rot);
-  set_irn_n(node, 1, right);
-}
-
-INLINE ir_node *
-get_Cmp_left (ir_node *node) {
-  assert (node->op == op_Cmp);
-  return get_irn_n(node, 0);
-}
-
-INLINE void
-set_Cmp_left (ir_node *node, ir_node *left) {
-  assert (node->op == op_Cmp);
-  set_irn_n(node, 0, left);
-}
-
-INLINE ir_node *
-get_Cmp_right (ir_node *node) {
-  assert (node->op == op_Cmp);
-  return get_irn_n(node, 1);
-}
-
-INLINE void
-set_Cmp_right (ir_node *node, ir_node *right) {
-  assert (node->op == op_Cmp);
-  set_irn_n(node, 1, right);
-}
-
-INLINE ir_node *
-get_Conv_op (ir_node *node) {
-  assert (node->op == op_Conv);
-  return get_irn_n(node, 0);
-}
-
-INLINE void
-set_Conv_op (ir_node *node, ir_node *op) {
-  assert (node->op == op_Conv);
-  set_irn_n(node, 0, op);
-}
-
-INLINE ir_node *
-get_Cast_op (ir_node *node) {
-  assert (node->op == op_Cast);
-  return get_irn_n(node, 0);
-}
-
-INLINE void
-set_Cast_op (ir_node *node, ir_node *op) {
-  assert (node->op == op_Cast);
-  set_irn_n(node, 0, op);
-}
+UNOP(Abs)
+BINOP(And)
+BINOP(Or)
+BINOP(Eor)
+UNOP(Not)
+BINOP(Shl)
+BINOP(Shr)
+BINOP(Shrs)
+BINOP(Rot)
+BINOP(Cmp)
+UNOP(Conv)
+UNOP(Cast)
 
 INLINE type *
 get_Cast_type (ir_node *node) {
@@ -1695,152 +1429,66 @@ is_unop (ir_node *node) {
 
 INLINE ir_node *
 get_unop_op (ir_node *node) {
-  assert (is_unop(node));
-  switch (get_irn_opcode (node)) {
-    case iro_Minus: return get_Minus_op(node); break;
-    case iro_Abs:   return get_Abs_op(node);   break;
-    case iro_Not:   return get_Not_op(node);   break;
-    case iro_Conv:  return get_Conv_op(node);  break;
-    case iro_Cast:  return get_Cast_op(node);  break;
-    default: return NULL;
-  }
+  if (node->op->opar == oparity_unary)
+    return get_irn_n(node, node->op->op_index);
+
+  assert(node->op->opar == oparity_unary);
+  return NULL;
 }
 
 INLINE void
 set_unop_op (ir_node *node, ir_node *op) {
-  assert (is_unop(node));
-  switch (get_irn_opcode (node)) {
-    case iro_Minus:   set_Minus_op(node, op); break;
-    case iro_Abs:     set_Abs_op(node, op);   break;
-    case iro_Not:     set_Not_op(node, op);   break;
-    case iro_Conv:    set_Conv_op(node, op);  break;
-    case iro_Cast:    set_Cast_op(node, op);  break;
-    default:  ;
-  }
+  if (node->op->opar == oparity_unary)
+    set_irn_n(node, node->op->op_index, op);
 
+  assert(node->op->opar == oparity_unary);
 }
 
 int
 is_binop (ir_node *node) {
   return (node->op->opar == oparity_binary);
-  /*  return (node->op == op_Add    ||
-          node->op == op_Cmp    ||
-          node->op == op_Sub    ||
-          node->op == op_Mul    ||
-          node->op == op_Quot   ||
-          node->op == op_DivMod ||
-          node->op == op_Div    ||
-          node->op == op_Mod    ||
-          node->op == op_And    ||
-          node->op == op_Or     ||
-          node->op == op_Eor    ||
-          node->op == op_Shl    ||
-          node->op == op_Shr    ||
-          node->op == op_Shrs   ||
-         node->op == op_Rot      );
-  */
 }
 
 INLINE ir_node *
 get_binop_left (ir_node *node) {
-  assert (node->op->opar == oparity_binary);
+  if (node->op->opar == oparity_binary)
+    return get_irn_n(node, node->op->op_index);
 
-    switch (get_irn_opcode (node)) {
-      case iro_Add   :     return get_Add_left(node);  break;
-      case iro_Sub   :     return get_Sub_left(node);  break;
-      case iro_Mul   :     return get_Mul_left(node);  break;
-      case iro_Quot  :     return get_Quot_left(node); break;
-      case iro_DivMod:     return get_DivMod_left(node);  break;
-      case iro_Div   :     return get_Div_left(node);  break;
-      case iro_Mod   :     return get_Mod_left(node);  break;
-      case iro_And   :     return get_And_left(node);  break;
-      case iro_Or    :     return get_Or_left(node);   break;
-      case iro_Eor   :     return get_Eor_left(node);  break;
-      case iro_Shl   :     return get_Shl_left(node);  break;
-      case iro_Shr   :     return get_Shr_left(node);  break;
-      case iro_Shrs  :     return get_Shrs_left(node); break;
-      case iro_Rot   :     return get_Rot_left(node);  break;
-      case iro_Cmp   :     return get_Cmp_left(node);  break;
-    default:  return NULL;
-  };
+  assert(node->op->opar == oparity_binary);
+  return NULL;
 }
 
 INLINE void
 set_binop_left (ir_node *node, ir_node *left) {
-  assert (node->op->opar == oparity_binary);
+  if (node->op->opar == oparity_binary)
+    set_irn_n(node, node->op->op_index, left);
 
-    switch (get_irn_opcode (node)) {
-      case iro_Add   :     set_Add_left(node, left);  break;
-      case iro_Sub   :     set_Sub_left(node, left);  break;
-      case iro_Mul   :     set_Mul_left(node, left);  break;
-      case iro_Quot  :     set_Quot_left(node, left); break;
-      case iro_DivMod:     set_DivMod_left(node, left);  break;
-      case iro_Div   :     set_Div_left(node, left);  break;
-      case iro_Mod   :     set_Mod_left(node, left);  break;
-      case iro_And   :     set_And_left(node, left);  break;
-      case iro_Or    :     set_Or_left(node, left);   break;
-      case iro_Eor   :     set_Eor_left(node, left);  break;
-      case iro_Shl   :     set_Shl_left(node, left);  break;
-      case iro_Shr   :     set_Shr_left(node, left);  break;
-      case iro_Shrs  :     set_Shrs_left(node, left); break;
-      case iro_Rot   :     set_Rot_left(node, left);  break;
-      case iro_Cmp   :     set_Cmp_left(node, left);  break;
-    default:  ;
-  };
+  assert (node->op->opar == oparity_binary);
 }
 
 INLINE ir_node *
 get_binop_right (ir_node *node) {
-  assert (node->op->opar == oparity_binary);
+  if (node->op->opar == oparity_binary)
+    return get_irn_n(node, node->op->op_index + 1);
 
-    switch (get_irn_opcode (node)) {
-      case iro_Add   :     return get_Add_right(node);  break;
-      case iro_Sub   :     return get_Sub_right(node);  break;
-      case iro_Mul   :     return get_Mul_right(node);  break;
-      case iro_Quot  :     return get_Quot_right(node); break;
-      case iro_DivMod:     return get_DivMod_right(node);  break;
-      case iro_Div   :     return get_Div_right(node);  break;
-      case iro_Mod   :     return get_Mod_right(node);  break;
-      case iro_And   :     return get_And_right(node);  break;
-      case iro_Or    :     return get_Or_right(node);   break;
-      case iro_Eor   :     return get_Eor_right(node);  break;
-      case iro_Shl   :     return get_Shl_right(node);  break;
-      case iro_Shr   :     return get_Shr_right(node);  break;
-      case iro_Shrs  :     return get_Shrs_right(node); break;
-      case iro_Rot   :     return get_Rot_right(node);  break;
-      case iro_Cmp   :     return get_Cmp_right(node);  break;
-    default:  return NULL;
-  };
+  assert(node->op->opar == oparity_binary);
+  return NULL;
 }
 
 INLINE void
 set_binop_right (ir_node *node, ir_node *right) {
-  assert (node->op->opar == oparity_binary);
+  if (node->op->opar == oparity_binary)
+    set_irn_n(node, node->op->op_index + 1, right);
 
-    switch (get_irn_opcode (node)) {
-      case iro_Add   :     set_Add_right(node, right);  break;
-      case iro_Sub   :     set_Sub_right(node, right);  break;
-      case iro_Mul   :     set_Mul_right(node, right);  break;
-      case iro_Quot  :     set_Quot_right(node, right); break;
-      case iro_DivMod:     set_DivMod_right(node, right);  break;
-      case iro_Div   :     set_Div_right(node, right);  break;
-      case iro_Mod   :     set_Mod_right(node, right);  break;
-      case iro_And   :     set_And_right(node, right);  break;
-      case iro_Or    :     set_Or_right(node, right);   break;
-      case iro_Eor   :     set_Eor_right(node, right);  break;
-      case iro_Shl   :     set_Shl_right(node, right);  break;
-      case iro_Shr   :     set_Shr_right(node, right);  break;
-      case iro_Shrs  :     set_Shrs_right(node, right); break;
-      case iro_Rot   :     set_Rot_right(node, right);  break;
-      case iro_Cmp   :     set_Cmp_right(node, right);  break;
-    default: ;
-  };
+  assert (node->op->opar == oparity_binary);
 }
 
 INLINE int is_Phi (ir_node *n) {
+  ir_op *op;
+
   assert(n);
-  return ((get_irn_op(n) == op_Phi) ||
-         (get_irn_op(n) == op_Filter && interprocedural_view));
+  op = get_irn_op(n);
+  return (op == op_Phi) || (op == op_Filter && interprocedural_view);
 }
 
 INLINE ir_node **
@@ -2222,9 +1870,9 @@ get_irn_irg(ir_node *node) {
 }
 
 
-/******************************************************************/
+/*----------------------------------------------------------------*/
 /*  Auxiliary routines                                            */
-/******************************************************************/
+/*----------------------------------------------------------------*/
 
 INLINE ir_node *
 skip_Proj (ir_node *node) {
@@ -2291,7 +1939,7 @@ skip_nop (ir_node *node) {
   ir_node *pred;
   /* don't assert node !!! */
 
-  if (!opt_normalize) return node;
+  if (!get_opt_normalize()) return node;
 
   /* Don't use get_Id_pred:  We get into an endless loop for
      self-referencing Ids. */
@@ -2376,19 +2024,9 @@ ir_graph *get_ip_cfop_irg(ir_node *n) {
    of an exception. */
 int
 is_fragile_op(ir_node *node) {
-  return (   (get_irn_opcode(node) == iro_Call)
-          || (get_irn_opcode(node) == iro_Quot)
-          || (get_irn_opcode(node) == iro_DivMod)
-          || (get_irn_opcode(node) == iro_Div)
-          || (get_irn_opcode(node) == iro_Mod)
-          || (get_irn_opcode(node) == iro_Load)
-          || (get_irn_opcode(node) == iro_Store)
-          || (get_irn_opcode(node) == iro_Alloc)
-          || (get_irn_opcode(node) == iro_Bad)
-          || (get_irn_opcode(node) == iro_Unknown));
+  return is_op_fragile(get_irn_op(node));
 }
 
-
 /* Returns the memory operand of fragile operations. */
 ir_node *get_fragile_op_mem(ir_node *node) {
   assert(node && is_fragile_op(node));
@@ -2407,7 +2045,7 @@ ir_node *get_fragile_op_mem(ir_node *node) {
   case iro_Unknown:
     return node;
   default: ;
-    assert(0 && "not reached");
+    assert(0 && "should not be reached");
     return NULL;
   }
 }