fix some warnings, represent mode size as unsigned value
[libfirm] / ir / ir / irnode.c
index 99a09a4..478a42a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1995-2007 University of Karlsruhe.  All right reserved.
+ * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
  *
  * This file is part of libFirm.
  *
@@ -35,7 +35,6 @@
 #include "irnode_t.h"
 #include "irgraph_t.h"
 #include "irmode_t.h"
-#include "typegmod.h"
 #include "irbackedge_t.h"
 #include "irdump.h"
 #include "irop_t.h"
@@ -65,32 +64,33 @@ static const char *pnc_name_arr [] = {
  * returns the pnc name from an pnc constant
  */
 const char *get_pnc_string(int pnc) {
+       assert(pnc >= 0 && pnc <
+                       (int) (sizeof(pnc_name_arr)/sizeof(pnc_name_arr[0])));
        return pnc_name_arr[pnc];
 }
 
 /*
  * Calculates the negated (Complement(R)) pnc condition.
  */
-int get_negated_pnc(int pnc, ir_mode *mode) {
+pn_Cmp get_negated_pnc(long pnc, ir_mode *mode) {
        pnc ^= pn_Cmp_True;
 
        /* do NOT add the Uo bit for non-floating point values */
        if (! mode_is_float(mode))
                pnc &= ~pn_Cmp_Uo;
 
-       return pnc;
+       return (pn_Cmp) pnc;
 }
 
 /* Calculates the inversed (R^-1) pnc condition, i.e., "<" --> ">" */
-int
-get_inversed_pnc(int pnc) {
-       int code    = pnc & ~(pn_Cmp_Lt|pn_Cmp_Gt);
-       int lesser  = pnc & pn_Cmp_Lt;
-       int greater = pnc & pn_Cmp_Gt;
+pn_Cmp get_inversed_pnc(long pnc) {
+       long code    = pnc & ~(pn_Cmp_Lt|pn_Cmp_Gt);
+       long lesser  = pnc & pn_Cmp_Lt;
+       long greater = pnc & pn_Cmp_Gt;
 
        code |= (lesser ? pn_Cmp_Gt : 0) | (greater ? pn_Cmp_Lt : 0);
 
-       return code;
+       return (pn_Cmp) code;
 }
 
 /**
@@ -107,7 +107,7 @@ unsigned firm_add_node_size = 0;
 
 
 /* register new space for every node */
-unsigned register_additional_node_data(unsigned size) {
+unsigned firm_register_additional_node_data(unsigned size) {
        assert(!forbid_new_data && "Too late to register additional node data");
 
        if (forbid_new_data)
@@ -130,8 +130,8 @@ init_irnode(void) {
  * If arity is negative, a node with a dynamic array is created.
  */
 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)
+new_ir_node(dbg_info *db, ir_graph *irg, ir_node *block, ir_op *op, ir_mode *mode,
+            int arity, ir_node **in)
 {
        ir_node *res;
        size_t node_size = offsetof(ir_node, attr) + op->attr_size + firm_add_node_size;
@@ -430,7 +430,7 @@ void
        _set_irn_op(node, op);
 }
 
-ir_opcode
+unsigned
 (get_irn_opcode)(const ir_node *node) {
        return _get_irn_opcode(node);
 }
@@ -522,10 +522,22 @@ void firm_set_irn_section(ir_node *n, struct section *s) {
 }
 #else
 /* Dummies needed for firmjni. */
-struct abstval *get_irn_abst_value(ir_node *n) { return NULL; }
-void set_irn_abst_value(ir_node *n, struct abstval *os) {}
-struct section *firm_get_irn_section(ir_node *n) { return NULL; }
-void firm_set_irn_section(ir_node *n, struct section *s) {}
+struct abstval *get_irn_abst_value(ir_node *n) {
+       (void) n;
+       return NULL;
+}
+void set_irn_abst_value(ir_node *n, struct abstval *os) {
+       (void) n;
+       (void) os;
+}
+struct section *firm_get_irn_section(ir_node *n) {
+       (void) n;
+       return NULL;
+}
+void firm_set_irn_section(ir_node *n, struct section *s) {
+       (void) n;
+       (void) s;
+}
 #endif /* DO_HEAPANALYSIS */
 
 
@@ -539,10 +551,10 @@ long get_irn_node_nr(const ir_node *node) {
 #endif
 }
 
-const_attr
+const_attr *
 get_irn_const_attr(ir_node *node) {
        assert(node->op == op_Const);
-       return node->attr.con;
+       return &node->attr.con;
 }
 
 long
@@ -551,22 +563,22 @@ get_irn_proj_attr(ir_node *node) {
        return node->attr.proj;
 }
 
-alloc_attr
+alloc_attr *
 get_irn_alloc_attr(ir_node *node) {
        assert(node->op == op_Alloc);
-       return node->attr.alloc;
+       return &node->attr.alloc;
 }
 
-free_attr
+free_attr *
 get_irn_free_attr(ir_node *node) {
        assert(node->op == op_Free);
-       return node->attr.free;
+       return &node->attr.free;
 }
 
-symconst_attr
+symconst_attr *
 get_irn_symconst_attr(ir_node *node) {
        assert(node->op == op_SymConst);
-       return node->attr.symc;
+       return &node->attr.symc;
 }
 
 ir_type *
@@ -575,10 +587,10 @@ get_irn_call_attr(ir_node *node) {
        return node->attr.call.cld_tp = skip_tid(node->attr.call.cld_tp);
 }
 
-sel_attr
+sel_attr *
 get_irn_sel_attr(ir_node *node) {
        assert(node->op == op_Sel);
-       return node->attr.sel;
+       return &node->attr.sel;
 }
 
 int
@@ -587,29 +599,29 @@ get_irn_phi0_attr(ir_node *node) {
        return node->attr.phi0.pos;
 }
 
-block_attr
+block_attr *
 get_irn_block_attr(ir_node *node) {
        assert(node->op == op_Block);
-       return node->attr.block;
+       return &node->attr.block;
 }
 
-load_attr
+load_attr *
 get_irn_load_attr(ir_node *node) {
        assert(node->op == op_Load);
-       return node->attr.load;
+       return &node->attr.load;
 }
 
-store_attr
+store_attr *
 get_irn_store_attr(ir_node *node) {
        assert(node->op == op_Store);
-       return node->attr.store;
+       return &node->attr.store;
 }
 
-except_attr
+except_attr *
 get_irn_except_attr(ir_node *node) {
        assert(node->op == op_Div || node->op == op_Quot ||
               node->op == op_DivMod || node->op == op_Mod || node->op == op_Call || node->op == op_Alloc);
-       return node->attr.except;
+       return &node->attr.except;
 }
 
 void *(get_irn_generic_attr)(ir_node *node) {
@@ -642,7 +654,6 @@ int get_irn_pred_pos(ir_node *node, ir_node *arg) {
 ir_node *
 get_nodes_block(const ir_node *node) {
        assert(node->op != op_Block);
-       assert(is_irn_pinned_in_irg(node) && "block info may be incorrect");
        return get_irn_n(node, -1);
 }
 
@@ -652,12 +663,19 @@ set_nodes_block(ir_node *node, ir_node *block) {
        set_irn_n(node, -1, block);
 }
 
+/* this works for all except Block */
+ir_node *
+get_nodes_MacroBlock(const ir_node *node) {
+       assert(node->op != op_Block);
+       return get_Block_MacroBlock(get_irn_n(node, -1));
+}
+
 /* Test whether arbitrary node is frame pointer, i.e. Proj(pn_Start_P_frame_base)
  * from Start.  If so returns frame type, else Null. */
-ir_type *is_frame_pointer(ir_node *n) {
+ir_type *is_frame_pointer(const ir_node *n) {
        if (is_Proj(n) && (get_Proj_proj(n) == pn_Start_P_frame_base)) {
                ir_node *start = get_Proj_pred(n);
-               if (get_irn_op(start) == op_Start) {
+               if (is_Start(start)) {
                        return get_irg_frame_type(get_irn_irg(start));
                }
        }
@@ -666,10 +684,10 @@ ir_type *is_frame_pointer(ir_node *n) {
 
 /* Test whether arbitrary node is globals pointer, i.e. Proj(pn_Start_P_globals)
  * from Start.  If so returns global type, else Null. */
-ir_type *is_globals_pointer(ir_node *n) {
+ir_type *is_globals_pointer(const ir_node *n) {
        if (is_Proj(n) && (get_Proj_proj(n) == pn_Start_P_globals)) {
                ir_node *start = get_Proj_pred(n);
-               if (get_irn_op(start) == op_Start) {
+               if (is_Start(start)) {
                        return get_glob_type();
                }
        }
@@ -678,10 +696,10 @@ ir_type *is_globals_pointer(ir_node *n) {
 
 /* Test whether arbitrary node is tls pointer, i.e. Proj(pn_Start_P_tls)
  * from Start.  If so returns tls type, else Null. */
-ir_type *is_tls_pointer(ir_node *n) {
+ir_type *is_tls_pointer(const ir_node *n) {
        if (is_Proj(n) && (get_Proj_proj(n) == pn_Start_P_globals)) {
                ir_node *start = get_Proj_pred(n);
-               if (get_irn_op(start) == op_Start) {
+               if (is_Start(start)) {
                        return get_tls_type();
                }
        }
@@ -690,10 +708,10 @@ ir_type *is_tls_pointer(ir_node *n) {
 
 /* Test whether arbitrary node is value arg base, i.e. Proj(pn_Start_P_value_arg_base)
  * from Start.  If so returns 1, else 0. */
-int is_value_arg_pointer(ir_node *n) {
-       if ((get_irn_op(n) == op_Proj) &&
+int is_value_arg_pointer(const ir_node *n) {
+       if (is_Proj(n) &&
                (get_Proj_proj(n) == pn_Start_P_value_arg_base) &&
-               (get_irn_op(get_Proj_pred(n)) == op_Start))
+               is_Start(get_Proj_pred(n)))
                return 1;
        return 0;
 }
@@ -714,7 +732,7 @@ int
 }
 
 ir_node *
-(get_Block_cfgpred)(ir_node *node, int pos) {
+(get_Block_cfgpred)(const ir_node *node, int pos) {
        return _get_Block_cfgpred(node, pos);
 }
 
@@ -725,12 +743,12 @@ set_Block_cfgpred(ir_node *node, int pos, ir_node *pred) {
 }
 
 ir_node  *
-(get_Block_cfgpred_block)(ir_node *node, int pos) {
+(get_Block_cfgpred_block)(const ir_node *node, int pos) {
        return _get_Block_cfgpred_block(node, pos);
 }
 
 int
-get_Block_matured(ir_node *node) {
+get_Block_matured(const ir_node *node) {
        assert(node->op == op_Block);
        return (int)node->attr.block.is_matured;
 }
@@ -768,17 +786,18 @@ int
 }
 
 ir_node *
-get_Block_graph_arr (ir_node *node, int pos) {
+get_Block_graph_arr(ir_node *node, int pos) {
        assert(node->op == op_Block);
        return node->attr.block.graph_arr[pos+1];
 }
 
 void
-set_Block_graph_arr (ir_node *node, int pos, ir_node *value) {
+set_Block_graph_arr(ir_node *node, int pos, ir_node *value) {
        assert(node->op == op_Block);
        node->attr.block.graph_arr[pos+1] = value;
 }
 
+#ifdef INTERPROCEDURAL_VIEW
 void set_Block_cg_cfgpred_arr(ir_node *node, int arity, ir_node *in[]) {
        assert(node->op == op_Block);
        if (node->attr.block.in_cg == NULL || arity != ARR_LEN(node->attr.block.in_cg) - 1) {
@@ -809,12 +828,12 @@ ir_node **get_Block_cg_cfgpred_arr(ir_node *node) {
        return node->attr.block.in_cg == NULL ? NULL : node->attr.block.in_cg  + 1;
 }
 
-int get_Block_cg_n_cfgpreds(ir_node *node) {
+int get_Block_cg_n_cfgpreds(const ir_node *node) {
        assert(node->op == op_Block);
        return node->attr.block.in_cg == NULL ? 0 : ARR_LEN(node->attr.block.in_cg) - 1;
 }
 
-ir_node *get_Block_cg_cfgpred(ir_node *node, int pos) {
+ir_node *get_Block_cg_cfgpred(const ir_node *node, int pos) {
        assert(node->op == op_Block && node->attr.block.in_cg);
        return node->attr.block.in_cg[pos + 1];
 }
@@ -823,6 +842,7 @@ void remove_Block_cg_cfgpred_arr(ir_node *node) {
        assert(node->op == op_Block);
        node->attr.block.in_cg = NULL;
 }
+#endif
 
 ir_node *(set_Block_dead)(ir_node *block) {
        return _set_Block_dead(block);
@@ -846,19 +866,47 @@ void set_Block_extbb(ir_node *block, ir_extblk *extblk) {
        block->attr.block.extblk = extblk;
 }
 
+/* returns the macro block header of a block. */
 ir_node *get_Block_MacroBlock(const ir_node *block) {
+       ir_node *mbh;
+       assert(is_Block(block));
+       mbh = get_irn_n(block, -1);
+       /* once macro block header is respected by all optimizations,
+          this assert can be removed */
+       assert(mbh != NULL);
+       return mbh;
+}
+
+/* returns the graph of a Block. */
+ir_graph *get_Block_irg(const ir_node *block) {
+       assert(is_Block(block));
+       return block->attr.block.irg;
+}
+
+int has_Block_label(const ir_node *block) {
+       assert(is_Block(block));
+       return block->attr.block.has_label;
+}
+
+ir_label_t get_Block_label(const ir_node *block) {
+       assert(is_Block(block));
+       return block->attr.block.label;
+}
+
+void set_Block_label(ir_node *block, ir_label_t label) {
        assert(is_Block(block));
-       return get_irn_n(block, -1);
+       block->attr.block.has_label = 1;
+       block->attr.block.label = label;
 }
 
 int
-get_End_n_keepalives(ir_node *end) {
+get_End_n_keepalives(const ir_node *end) {
        assert(end->op == op_End);
        return (get_irn_arity(end) - END_KEEPALIVE_OFFSET);
 }
 
 ir_node *
-get_End_keepalive(ir_node *end, int pos) {
+get_End_keepalive(const ir_node *end, int pos) {
        assert(end->op == op_End);
        return get_irn_n(end, pos + END_KEEPALIVE_OFFSET);
 }
@@ -914,7 +962,7 @@ void remove_End_keepalive(ir_node *end, ir_node *irn) {
 }
 
 void
-free_End (ir_node *end) {
+free_End(ir_node *end) {
        assert(end->op == op_End);
        end->kind = k_BAD;
        DEL_ARR_F(end->in);
@@ -923,7 +971,7 @@ free_End (ir_node *end) {
 }
 
 /* Return the target address of an IJmp */
-ir_node *get_IJmp_target(ir_node *ijmp) {
+ir_node *get_IJmp_target(const ir_node *ijmp) {
        assert(ijmp->op == op_IJmp);
        return get_irn_n(ijmp, 0);
 }
@@ -941,15 +989,15 @@ void set_IJmp_target(ir_node *ijmp, ir_node *tgt) {
 > Firm to the target machine.  That could be done if there was some way of
 > projecting "default" out of the Cond node.
 I know it's complicated.
-Basically there are two proglems:
- - determining the gaps between the projs
+Basically there are two problems:
+ - determining the gaps between the Projs
  - 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.
    This means to extend all optimizations executed during construction.
 2. Give the Cond node for switch two flavors:
-   a) there are no gaps in the projs  (existing flavor)
+   a) there are no gaps in the Projs  (existing flavor)
    b) gaps may exist, default proj is still the Proj with the largest
       projection number.  This covers also the gaps.
 3. Fix the semantic of the Cond to that of 2b)
@@ -966,7 +1014,7 @@ dataflow analysis and 3) does not allow to convert the representation to
 2a).
 */
 ir_node *
-get_Cond_selector(ir_node *node) {
+get_Cond_selector(const ir_node *node) {
        assert(node->op == op_Cond);
        return get_irn_n(node, 0);
 }
@@ -978,7 +1026,7 @@ set_Cond_selector(ir_node *node, ir_node *selector) {
 }
 
 cond_kind
-get_Cond_kind(ir_node *node) {
+get_Cond_kind(const ir_node *node) {
        assert(node->op == op_Cond);
        return node->attr.cond.kind;
 }
@@ -990,13 +1038,13 @@ set_Cond_kind(ir_node *node, cond_kind kind) {
 }
 
 long
-get_Cond_defaultProj(ir_node *node) {
+get_Cond_defaultProj(const ir_node *node) {
        assert(node->op == op_Cond);
        return node->attr.cond.default_proj;
 }
 
 ir_node *
-get_Return_mem(ir_node *node) {
+get_Return_mem(const ir_node *node) {
        assert(node->op == op_Return);
        return get_irn_n(node, 0);
 }
@@ -1008,13 +1056,13 @@ set_Return_mem(ir_node *node, ir_node *mem) {
 }
 
 int
-get_Return_n_ress(ir_node *node) {
+get_Return_n_ress(const ir_node *node) {
        assert(node->op == op_Return);
        return (get_irn_arity(node) - RETURN_RESULT_OFFSET);
 }
 
 ir_node **
-get_Return_res_arr (ir_node *node) {
+get_Return_res_arr(ir_node *node) {
        assert((node->op == op_Return));
        if (get_Return_n_ress(node) > 0)
                return (ir_node **)&(get_irn_in(node)[1 + RETURN_RESULT_OFFSET]);
@@ -1030,7 +1078,7 @@ set_Return_n_res(ir_node *node, int results) {
 */
 
 ir_node *
-get_Return_res(ir_node *node, int pos) {
+get_Return_res(const ir_node *node, int pos) {
        assert(node->op == op_Return);
        assert(get_Return_n_ress(node) > pos);
        return get_irn_n(node, pos + RETURN_RESULT_OFFSET);
@@ -1052,8 +1100,16 @@ set_Const_tarval(ir_node *node, tarval *con) {
        node->attr.con.tv = con;
 }
 
-cnst_classify_t (classify_Const)(ir_node *node) {
-       return _classify_Const(node);
+int (is_Const_null)(const ir_node *node) {
+       return _is_Const_null(node);
+}
+
+int (is_Const_one)(const ir_node *node) {
+       return _is_Const_one(node);
+}
+
+int (is_Const_all_one)(const ir_node *node) {
+       return _is_Const_all_one(node);
 }
 
 
@@ -1063,6 +1119,7 @@ cnst_classify_t (classify_Const)(ir_node *node) {
 ir_type *
 get_Const_type(ir_node *node) {
        assert(node->op == op_Const);
+       node->attr.con.tp = skip_tid(node->attr.con.tp);
        return node->attr.con.tp;
 }
 
@@ -1149,6 +1206,16 @@ set_SymConst_symbol(ir_node *node, union symconst_symbol sym) {
        node->attr.symc.sym = sym;
 }
 
+ir_label_t get_SymConst_label(const ir_node *node) {
+       assert(node->op == op_SymConst && SYMCONST_HAS_LABEL(get_SymConst_kind(node)));
+       return node->attr.symc.sym.label;
+}
+
+void set_SymConst_label(ir_node *node, ir_label_t label) {
+       assert(node->op == op_SymConst && SYMCONST_HAS_LABEL(get_SymConst_kind(node)));
+       node->attr.symc.sym.label = label;
+}
+
 ir_type *
 get_SymConst_value_type(ir_node *node) {
        assert(node->op == op_SymConst);
@@ -1163,7 +1230,7 @@ set_SymConst_value_type(ir_node *node, ir_type *tp) {
 }
 
 ir_node *
-get_Sel_mem(ir_node *node) {
+get_Sel_mem(const ir_node *node) {
        assert(node->op == op_Sel);
        return get_irn_n(node, 0);
 }
@@ -1175,7 +1242,7 @@ set_Sel_mem(ir_node *node, ir_node *mem) {
 }
 
 ir_node *
-get_Sel_ptr(ir_node *node) {
+get_Sel_ptr(const ir_node *node) {
        assert(node->op == op_Sel);
        return get_irn_n(node, 1);
 }
@@ -1187,7 +1254,7 @@ set_Sel_ptr(ir_node *node, ir_node *ptr) {
 }
 
 int
-get_Sel_n_indexs(ir_node *node) {
+get_Sel_n_indexs(const ir_node *node) {
        assert(node->op == op_Sel);
        return (get_irn_arity(node) - SEL_INDEX_OFFSET);
 }
@@ -1202,7 +1269,7 @@ get_Sel_index_arr(ir_node *node) {
 }
 
 ir_node *
-get_Sel_index(ir_node *node, int pos) {
+get_Sel_index(const ir_node *node, int pos) {
        assert(node->op == op_Sel);
        return get_irn_n(node, pos + SEL_INDEX_OFFSET);
 }
@@ -1214,11 +1281,15 @@ set_Sel_index(ir_node *node, int pos, ir_node *index) {
 }
 
 ir_entity *
-get_Sel_entity(ir_node *node) {
+get_Sel_entity(const ir_node *node) {
        assert(node->op == op_Sel);
        return node->attr.sel.ent;
 }
 
+ir_entity *_get_Sel_entity(ir_node *node) {
+       return get_Sel_entity(node);
+}
+
 void
 set_Sel_entity(ir_node *node, ir_entity *ent) {
        assert(node->op == op_Sel);
@@ -1235,7 +1306,7 @@ set_Sel_entity(ir_node *node, ir_entity *ent) {
 
 
 ir_node *
-get_Call_mem(ir_node *node) {
+get_Call_mem(const ir_node *node) {
        assert(node->op == op_Call);
        return get_irn_n(node, 0);
 }
@@ -1247,7 +1318,7 @@ set_Call_mem(ir_node *node, ir_node *mem) {
 }
 
 ir_node *
-get_Call_ptr(ir_node *node) {
+get_Call_ptr(const ir_node *node) {
        assert(node->op == op_Call);
        return get_irn_n(node, 1);
 }
@@ -1265,13 +1336,13 @@ get_Call_param_arr(ir_node *node) {
 }
 
 int
-get_Call_n_params(ir_node *node)  {
+get_Call_n_params(const ir_node *node)  {
        assert(node->op == op_Call);
        return (get_irn_arity(node) - CALL_PARAM_OFFSET);
 }
 
 int
-get_Call_arity(ir_node *node) {
+get_Call_arity(const ir_node *node) {
        assert(node->op == op_Call);
        return get_Call_n_params(node);
 }
@@ -1283,7 +1354,7 @@ set_Call_arity(ir_node *node, ir_node *arity) {
 */
 
 ir_node *
-get_Call_param(ir_node *node, int pos) {
+get_Call_param(const ir_node *node, int pos) {
        assert(node->op == op_Call);
        return get_irn_n(node, pos + CALL_PARAM_OFFSET);
 }
@@ -1307,23 +1378,23 @@ set_Call_type(ir_node *node, ir_type *tp) {
        node->attr.call.cld_tp = tp;
 }
 
-int Call_has_callees(ir_node *node) {
+int Call_has_callees(const ir_node *node) {
        assert(node && node->op == op_Call);
        return ((get_irg_callee_info_state(get_irn_irg(node)) != irg_callee_info_none) &&
                (node->attr.call.callee_arr != NULL));
 }
 
-int get_Call_n_callees(ir_node * node) {
+int get_Call_n_callees(const ir_node *node) {
   assert(node && node->op == op_Call && node->attr.call.callee_arr);
   return ARR_LEN(node->attr.call.callee_arr);
 }
 
-ir_entity * get_Call_callee(ir_node * node, int pos) {
+ir_entity *get_Call_callee(const ir_node *node, int pos) {
        assert(pos >= 0 && pos < get_Call_n_callees(node));
        return node->attr.call.callee_arr[pos];
 }
 
-void set_Call_callee_arr(ir_node * node, const int n, ir_entity ** arr) {
+void set_Call_callee_arr(ir_node *node, const int n, ir_entity ** arr) {
        assert(node->op == op_Call);
        if (node->attr.call.callee_arr == NULL || get_Call_n_callees(node) != n) {
                node->attr.call.callee_arr = NEW_ARR_D(ir_entity *, current_ir_graph->obst, n);
@@ -1331,12 +1402,12 @@ void set_Call_callee_arr(ir_node * node, const int n, ir_entity ** arr) {
        memcpy(node->attr.call.callee_arr, arr, n * sizeof(ir_entity *));
 }
 
-void remove_Call_callee_arr(ir_node * node) {
+void remove_Call_callee_arr(ir_node *node) {
        assert(node->op == op_Call);
        node->attr.call.callee_arr = NULL;
 }
 
-ir_node * get_CallBegin_ptr(ir_node *node) {
+ir_node *get_CallBegin_ptr(const ir_node *node) {
        assert(node->op == op_CallBegin);
        return get_irn_n(node, 0);
 }
@@ -1346,12 +1417,12 @@ void set_CallBegin_ptr(ir_node *node, ir_node *ptr) {
        set_irn_n(node, 0, ptr);
 }
 
-ir_node * get_CallBegin_call(ir_node *node) {
+ir_node *get_CallBegin_call(const ir_node *node) {
        assert(node->op == op_CallBegin);
        return node->attr.callbegin.call;
 }
 
-void  set_CallBegin_call(ir_node *node, ir_node *call) {
+void set_CallBegin_call(ir_node *node, ir_node *call) {
        assert(node->op == op_CallBegin);
        node->attr.callbegin.call = call;
 }
@@ -1380,7 +1451,7 @@ ir_node *get_##OP##_op(const 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) { \
+void set_##OP##_op(ir_node *node, ir_node *op) {  \
   assert(node->op == op_##OP);                    \
   set_irn_n(node, node->op->op_index, op);        \
 }
@@ -1389,7 +1460,7 @@ void set_##OP##_op (ir_node *node, ir_node *op) { \
 BINOP(OP)                                     \
                                               \
 ir_node *                                     \
-get_##OP##_mem(ir_node *node) {               \
+get_##OP##_mem(const ir_node *node) {         \
   assert(node->op == op_##OP);                \
   return get_irn_n(node, 0);                  \
 }                                             \
@@ -1418,6 +1489,7 @@ BINOP(Add)
 BINOP(Sub)
 UNOP(Minus)
 BINOP(Mul)
+BINOP(Mulh)
 DIVOP(Quot)
 DIVOP(DivMod)
 DIVOP(Div)
@@ -1435,7 +1507,7 @@ BINOP(Cmp)
 UNOP(Conv)
 UNOP(Cast)
 
-int get_Conv_strict(ir_node *node) {
+int get_Conv_strict(const ir_node *node) {
        assert(node->op == op_Conv);
        return node->attr.conv.strict;
 }
@@ -1448,6 +1520,7 @@ void set_Conv_strict(ir_node *node, int strict_flag) {
 ir_type *
 get_Cast_type(ir_node *node) {
        assert(node->op == op_Cast);
+       node->attr.cast.totype = skip_tid(node->attr.cast.totype);
        return node->attr.cast.totype;
 }
 
@@ -1465,9 +1538,8 @@ set_Cast_type(ir_node *node, ir_type *to_tp) {
 int is_Cast_upcast(ir_node *node) {
        ir_type *totype   = get_Cast_type(node);
        ir_type *fromtype = get_irn_typeinfo_type(get_Cast_op(node));
-       ir_graph *myirg = get_irn_irg(node);
 
-       assert(get_irg_typeinfo_state(myirg) == ir_typeinfo_consistent);
+       assert(get_irg_typeinfo_state(get_irn_irg(node)) == ir_typeinfo_consistent);
        assert(fromtype);
 
        while (is_Pointer_type(totype) && is_Pointer_type(fromtype)) {
@@ -1554,19 +1626,9 @@ set_binop_right(ir_node *node, ir_node *right) {
        set_irn_n(node, node->op->op_index + 1, right);
 }
 
-int is_Phi(const ir_node *n) {
-       ir_op *op;
-
-       assert(n);
-       op = get_irn_op(n);
-
-       if (op == op_Filter) return get_interprocedural_view();
-
-       if (op == op_Phi)
-               return ((get_irg_phase_state(get_irn_irg(n)) !=  phase_building) ||
-                       (get_irn_arity(n) > 0));
-
-       return 0;
+int
+(is_Phi)(const ir_node *n) {
+       return _is_Phi(n);
 }
 
 int is_Phi0(const ir_node *n) {
@@ -1608,11 +1670,12 @@ set_Phi_pred(ir_node *node, int pos, ir_node *pred) {
 }
 
 
-int is_memop(ir_node *node) {
-       return ((get_irn_op(node) == op_Load) || (get_irn_op(node) == op_Store));
+int is_memop(const ir_node *node) {
+       ir_opcode code = get_irn_opcode(node);
+       return (code == iro_Load || code == iro_Store);
 }
 
-ir_node *get_memop_mem(ir_node *node) {
+ir_node *get_memop_mem(const ir_node *node) {
        assert(is_memop(node));
        return get_irn_n(node, 0);
 }
@@ -1622,7 +1685,7 @@ void set_memop_mem(ir_node *node, ir_node *mem) {
        set_irn_n(node, 0, mem);
 }
 
-ir_node *get_memop_ptr(ir_node *node) {
+ir_node *get_memop_ptr(const ir_node *node) {
        assert(is_memop(node));
        return get_irn_n(node, 1);
 }
@@ -1633,7 +1696,7 @@ void set_memop_ptr(ir_node *node, ir_node *ptr) {
 }
 
 ir_node *
-get_Load_mem(ir_node *node) {
+get_Load_mem(const ir_node *node) {
        assert(node->op == op_Load);
        return get_irn_n(node, 0);
 }
@@ -1645,7 +1708,7 @@ set_Load_mem(ir_node *node, ir_node *mem) {
 }
 
 ir_node *
-get_Load_ptr(ir_node *node) {
+get_Load_ptr(const ir_node *node) {
        assert(node->op == op_Load);
        return get_irn_n(node, 1);
 }
@@ -1657,7 +1720,7 @@ set_Load_ptr(ir_node *node, ir_node *ptr) {
 }
 
 ir_mode *
-get_Load_mode(ir_node *node) {
+get_Load_mode(const ir_node *node) {
        assert(node->op == op_Load);
        return node->attr.load.load_mode;
 }
@@ -1669,7 +1732,7 @@ set_Load_mode(ir_node *node, ir_mode *mode) {
 }
 
 ir_volatility
-get_Load_volatility(ir_node *node) {
+get_Load_volatility(const ir_node *node) {
        assert(node->op == op_Load);
        return node->attr.load.volatility;
 }
@@ -1680,9 +1743,21 @@ set_Load_volatility(ir_node *node, ir_volatility volatility) {
        node->attr.load.volatility = volatility;
 }
 
+ir_align
+get_Load_align(const ir_node *node) {
+       assert(node->op == op_Load);
+       return node->attr.load.aligned;
+}
+
+void
+set_Load_align(ir_node *node, ir_align align) {
+       assert(node->op == op_Load);
+       node->attr.load.aligned = align;
+}
+
 
 ir_node *
-get_Store_mem(ir_node *node) {
+get_Store_mem(const ir_node *node) {
        assert(node->op == op_Store);
        return get_irn_n(node, 0);
 }
@@ -1694,7 +1769,7 @@ set_Store_mem(ir_node *node, ir_node *mem) {
 }
 
 ir_node *
-get_Store_ptr(ir_node *node) {
+get_Store_ptr(const ir_node *node) {
        assert(node->op == op_Store);
        return get_irn_n(node, 1);
 }
@@ -1706,7 +1781,7 @@ set_Store_ptr(ir_node *node, ir_node *ptr) {
 }
 
 ir_node *
-get_Store_value(ir_node *node) {
+get_Store_value(const ir_node *node) {
        assert(node->op == op_Store);
        return get_irn_n(node, 2);
 }
@@ -1718,7 +1793,7 @@ set_Store_value(ir_node *node, ir_node *value) {
 }
 
 ir_volatility
-get_Store_volatility(ir_node *node) {
+get_Store_volatility(const ir_node *node) {
        assert(node->op == op_Store);
        return node->attr.store.volatility;
 }
@@ -1729,9 +1804,21 @@ set_Store_volatility(ir_node *node, ir_volatility volatility) {
        node->attr.store.volatility = volatility;
 }
 
+ir_align
+get_Store_align(const ir_node *node) {
+       assert(node->op == op_Store);
+       return node->attr.store.aligned;
+}
+
+void
+set_Store_align(ir_node *node, ir_align align) {
+       assert(node->op == op_Store);
+       node->attr.store.aligned = align;
+}
+
 
 ir_node *
-get_Alloc_mem(ir_node *node) {
+get_Alloc_mem(const ir_node *node) {
        assert(node->op == op_Alloc);
        return get_irn_n(node, 0);
 }
@@ -1743,7 +1830,7 @@ set_Alloc_mem(ir_node *node, ir_node *mem) {
 }
 
 ir_node *
-get_Alloc_size(ir_node *node) {
+get_Alloc_size(const ir_node *node) {
        assert(node->op == op_Alloc);
        return get_irn_n(node, 1);
 }
@@ -1766,21 +1853,21 @@ set_Alloc_type(ir_node *node, ir_type *tp) {
        node->attr.alloc.type = tp;
 }
 
-where_alloc
-get_Alloc_where(ir_node *node) {
+ir_where_alloc
+get_Alloc_where(const ir_node *node) {
        assert(node->op == op_Alloc);
        return node->attr.alloc.where;
 }
 
 void
-set_Alloc_where(ir_node *node, where_alloc where) {
+set_Alloc_where(ir_node *node, ir_where_alloc where) {
        assert(node->op == op_Alloc);
        node->attr.alloc.where = where;
 }
 
 
 ir_node *
-get_Free_mem(ir_node *node) {
+get_Free_mem(const ir_node *node) {
        assert(node->op == op_Free);
        return get_irn_n(node, 0);
 }
@@ -1792,7 +1879,7 @@ set_Free_mem(ir_node *node, ir_node *mem) {
 }
 
 ir_node *
-get_Free_ptr(ir_node *node) {
+get_Free_ptr(const ir_node *node) {
        assert(node->op == op_Free);
        return get_irn_n(node, 1);
 }
@@ -1804,7 +1891,7 @@ set_Free_ptr(ir_node *node, ir_node *ptr) {
 }
 
 ir_node *
-get_Free_size(ir_node *node) {
+get_Free_size(const ir_node *node) {
        assert(node->op == op_Free);
        return get_irn_n(node, 2);
 }
@@ -1827,14 +1914,14 @@ set_Free_type(ir_node *node, ir_type *tp) {
        node->attr.free.type = tp;
 }
 
-where_alloc
-get_Free_where(ir_node *node) {
+ir_where_alloc
+get_Free_where(const ir_node *node) {
        assert(node->op == op_Free);
        return node->attr.free.where;
 }
 
 void
-set_Free_where(ir_node *node, where_alloc where) {
+set_Free_where(ir_node *node, ir_where_alloc where) {
        assert(node->op == op_Free);
        node->attr.free.where = where;
 }
@@ -1844,7 +1931,7 @@ ir_node **get_Sync_preds_arr(ir_node *node) {
        return (ir_node **)&(get_irn_in(node)[1]);
 }
 
-int get_Sync_n_preds(ir_node *node) {
+int get_Sync_n_preds(const ir_node *node) {
        assert(node->op == op_Sync);
        return (get_irn_arity(node));
 }
@@ -1855,7 +1942,7 @@ void set_Sync_n_preds(ir_node *node, int n_preds) {
 }
 */
 
-ir_node *get_Sync_pred(ir_node *node, int pos) {
+ir_node *get_Sync_pred(const ir_node *node, int pos) {
        assert(node->op == op_Sync);
        return get_irn_n(node, pos);
 }
@@ -1915,16 +2002,6 @@ set_Proj_pred(ir_node *node, ir_node *pred) {
        set_irn_n(node, 0, pred);
 }
 
-long get_VProj_proj(const ir_node *node)
-{
-       return node->attr.proj;
-}
-
-void set_VProj_proj(ir_node *node, long value)
-{
-       node->attr.proj = value;
-}
-
 long
 get_Proj_proj(const ir_node *node) {
        assert(is_Proj(node));
@@ -1949,7 +2026,7 @@ get_Tuple_preds_arr(ir_node *node) {
 }
 
 int
-get_Tuple_n_preds(ir_node *node) {
+get_Tuple_n_preds(const ir_node *node) {
        assert(node->op == op_Tuple);
        return (get_irn_arity(node));
 }
@@ -1962,7 +2039,7 @@ set_Tuple_n_preds(ir_node *node, int n_preds) {
 */
 
 ir_node *
-get_Tuple_pred (ir_node *node, int pos) {
+get_Tuple_pred(const ir_node *node, int pos) {
   assert(node->op == op_Tuple);
   return get_irn_n(node, pos);
 }
@@ -1974,7 +2051,7 @@ set_Tuple_pred(ir_node *node, int pos, ir_node *pred) {
 }
 
 ir_node *
-get_Id_pred(ir_node *node) {
+get_Id_pred(const ir_node *node) {
        assert(node->op == op_Id);
        return get_irn_n(node, 0);
 }
@@ -1985,7 +2062,7 @@ set_Id_pred(ir_node *node, ir_node *pred) {
        set_irn_n(node, 0, pred);
 }
 
-ir_node *get_Confirm_value(ir_node *node) {
+ir_node *get_Confirm_value(const ir_node *node) {
        assert(node->op == op_Confirm);
        return get_irn_n(node, 0);
 }
@@ -1995,7 +2072,7 @@ void set_Confirm_value(ir_node *node, ir_node *value) {
        set_irn_n(node, 0, value);
 }
 
-ir_node *get_Confirm_bound(ir_node *node) {
+ir_node *get_Confirm_bound(const ir_node *node) {
        assert(node->op == op_Confirm);
        return get_irn_n(node, 1);
 }
@@ -2005,17 +2082,16 @@ void set_Confirm_bound(ir_node *node, ir_node *bound) {
        set_irn_n(node, 0, bound);
 }
 
-pn_Cmp get_Confirm_cmp(ir_node *node) {
+pn_Cmp get_Confirm_cmp(const ir_node *node) {
        assert(node->op == op_Confirm);
-       return node->attr.confirm_cmp;
+       return node->attr.confirm.cmp;
 }
 
 void set_Confirm_cmp(ir_node *node, pn_Cmp cmp) {
        assert(node->op == op_Confirm);
-       node->attr.confirm_cmp = cmp;
+       node->attr.confirm.cmp = cmp;
 }
 
-
 ir_node *
 get_Filter_pred(ir_node *node) {
        assert(node->op == op_Filter);
@@ -2042,12 +2118,12 @@ set_Filter_proj(ir_node *node, long proj) {
 
 /* Don't use get_irn_arity, get_irn_n in implementation as access
    shall work independent of view!!! */
-void set_Filter_cg_pred_arr(ir_node * node, int arity, ir_node ** in) {
+void set_Filter_cg_pred_arr(ir_node *node, int arity, ir_node ** in) {
        assert(node->op == op_Filter);
        if (node->attr.filter.in_cg == NULL || arity != ARR_LEN(node->attr.filter.in_cg) - 1) {
+               ir_graph *irg = get_irn_irg(node);
                node->attr.filter.in_cg = NEW_ARR_D(ir_node *, current_ir_graph->obst, arity + 1);
-               node->attr.filter.backedge = NEW_ARR_D (int, current_ir_graph->obst, arity);
-               memset(node->attr.filter.backedge, 0, sizeof(int) * arity);
+               node->attr.filter.backedge = new_backedge_arr(irg->obst, arity);
                node->attr.filter.in_cg[0] = node->in[0];
        }
        memcpy(node->attr.filter.in_cg + 1, in, sizeof(ir_node *) * arity);
@@ -2074,7 +2150,7 @@ ir_node *get_Filter_cg_pred(ir_node *node, int pos) {
 }
 
 /* Mux support */
-ir_node *get_Mux_sel(ir_node *node) {
+ir_node *get_Mux_sel(const ir_node *node) {
        if (node->op == op_Psi) {
                assert(get_irn_arity(node) == 3);
                return get_Psi_cond(node, 0);
@@ -2093,7 +2169,7 @@ void set_Mux_sel(ir_node *node, ir_node *sel) {
        }
 }
 
-ir_node *get_Mux_false(ir_node *node) {
+ir_node *get_Mux_false(const ir_node *node) {
        if (node->op == op_Psi) {
                assert(get_irn_arity(node) == 3);
                return get_Psi_default(node);
@@ -2112,7 +2188,7 @@ void set_Mux_false(ir_node *node, ir_node *ir_false) {
        }
 }
 
-ir_node *get_Mux_true(ir_node *node) {
+ir_node *get_Mux_true(const ir_node *node) {
        if (node->op == op_Psi) {
                assert(get_irn_arity(node) == 3);
                return get_Psi_val(node, 0);
@@ -2132,35 +2208,31 @@ void set_Mux_true(ir_node *node, ir_node *ir_true) {
 }
 
 /* Psi support */
-ir_node *get_Psi_cond(ir_node *node, int pos) {
-       int num_conds = get_Psi_n_conds(node);
+ir_node *get_Psi_cond(const ir_node *node, int pos) {
        assert(node->op == op_Psi);
-       assert(pos < num_conds);
+       assert(pos < get_Psi_n_conds(node));
        return get_irn_n(node, 2 * pos);
 }
 
 void set_Psi_cond(ir_node *node, int pos, ir_node *cond) {
-       int num_conds = get_Psi_n_conds(node);
        assert(node->op == op_Psi);
-       assert(pos < num_conds);
+       assert(pos < get_Psi_n_conds(node));
        set_irn_n(node, 2 * pos, cond);
 }
 
-ir_node *get_Psi_val(ir_node *node, int pos) {
-       int num_vals = get_Psi_n_conds(node);
+ir_node *get_Psi_val(const ir_node *node, int pos) {
        assert(node->op == op_Psi);
-       assert(pos < num_vals);
+       assert(pos < get_Psi_n_conds(node));
        return get_irn_n(node, 2 * pos + 1);
 }
 
 void set_Psi_val(ir_node *node, int pos, ir_node *val) {
-       int num_vals = get_Psi_n_conds(node);
        assert(node->op == op_Psi);
-       assert(pos < num_vals);
+       assert(pos < get_Psi_n_conds(node));
        set_irn_n(node, 2 * pos + 1, val);
 }
 
-ir_node *get_Psi_default(ir_node *node) {
+ir_node *get_Psi_default(const ir_node *node) {
        int def_pos = get_irn_arity(node) - 1;
        assert(node->op == op_Psi);
        return get_irn_n(node, def_pos);
@@ -2172,12 +2244,12 @@ void set_Psi_default(ir_node *node, ir_node *val) {
        set_irn_n(node, def_pos, val);
 }
 
-int (get_Psi_n_conds)(ir_node *node) {
+int (get_Psi_n_conds)(const ir_node *node) {
        return _get_Psi_n_conds(node);
 }
 
 /* CopyB support */
-ir_node *get_CopyB_mem(ir_node *node) {
+ir_node *get_CopyB_mem(const ir_node *node) {
        assert(node->op == op_CopyB);
        return get_irn_n(node, 0);
 }
@@ -2187,7 +2259,7 @@ void set_CopyB_mem(ir_node *node, ir_node *mem) {
        set_irn_n(node, 0, mem);
 }
 
-ir_node *get_CopyB_dst(ir_node *node) {
+ir_node *get_CopyB_dst(const ir_node *node) {
        assert(node->op == op_CopyB);
        return get_irn_n(node, 1);
 }
@@ -2197,7 +2269,7 @@ void set_CopyB_dst(ir_node *node, ir_node *dst) {
        set_irn_n(node, 1, dst);
 }
 
-ir_node *get_CopyB_src (ir_node *node) {
+ir_node *get_CopyB_src(const ir_node *node) {
   assert(node->op == op_CopyB);
   return get_irn_n(node, 2);
 }
@@ -2209,7 +2281,7 @@ void set_CopyB_src(ir_node *node, ir_node *src) {
 
 ir_type *get_CopyB_type(ir_node *node) {
        assert(node->op == op_CopyB);
-       return node->attr.copyb.data_type;
+       return node->attr.copyb.data_type = skip_tid(node->attr.copyb.data_type);
 }
 
 void set_CopyB_type(ir_node *node, ir_type *data_type) {
@@ -2220,43 +2292,43 @@ void set_CopyB_type(ir_node *node, ir_type *data_type) {
 
 ir_type *
 get_InstOf_type(ir_node *node) {
-       assert(node->op = op_InstOf);
-       return node->attr.instof.type;
+       assert(node->op == op_InstOf);
+       return node->attr.instof.type = skip_tid(node->attr.instof.type);
 }
 
 void
 set_InstOf_type(ir_node *node, ir_type *type) {
-       assert(node->op = op_InstOf);
+       assert(node->op == op_InstOf);
        node->attr.instof.type = type;
 }
 
 ir_node *
-get_InstOf_store(ir_node *node) {
-       assert(node->op = op_InstOf);
+get_InstOf_store(const ir_node *node) {
+       assert(node->op == op_InstOf);
        return get_irn_n(node, 0);
 }
 
 void
 set_InstOf_store(ir_node *node, ir_node *obj) {
-       assert(node->op = op_InstOf);
+       assert(node->op == op_InstOf);
        set_irn_n(node, 0, obj);
 }
 
 ir_node *
-get_InstOf_obj(ir_node *node) {
-       assert(node->op = op_InstOf);
+get_InstOf_obj(const ir_node *node) {
+       assert(node->op == op_InstOf);
        return get_irn_n(node, 1);
 }
 
 void
 set_InstOf_obj(ir_node *node, ir_node *obj) {
-       assert(node->op = op_InstOf);
+       assert(node->op == op_InstOf);
        set_irn_n(node, 1, obj);
 }
 
 /* Returns the memory input of a Raise operation. */
 ir_node *
-get_Raise_mem(ir_node *node) {
+get_Raise_mem(const ir_node *node) {
        assert(node->op == op_Raise);
        return get_irn_n(node, 0);
 }
@@ -2268,7 +2340,7 @@ set_Raise_mem(ir_node *node, ir_node *mem) {
 }
 
 ir_node *
-get_Raise_exo_ptr(ir_node *node) {
+get_Raise_exo_ptr(const ir_node *node) {
        assert(node->op == op_Raise);
        return get_irn_n(node, 1);
 }
@@ -2282,7 +2354,7 @@ set_Raise_exo_ptr(ir_node *node, ir_node *exo_ptr) {
 /* Bound support */
 
 /* Returns the memory input of a Bound operation. */
-ir_node *get_Bound_mem(ir_node *bound) {
+ir_node *get_Bound_mem(const ir_node *bound) {
        assert(bound->op == op_Bound);
        return get_irn_n(bound, 0);
 }
@@ -2293,7 +2365,7 @@ void set_Bound_mem(ir_node *bound, ir_node *mem) {
 }
 
 /* Returns the index input of a Bound operation. */
-ir_node *get_Bound_index(ir_node *bound) {
+ir_node *get_Bound_index(const ir_node *bound) {
        assert(bound->op == op_Bound);
        return get_irn_n(bound, 1);
 }
@@ -2304,7 +2376,7 @@ void set_Bound_index(ir_node *bound, ir_node *idx) {
 }
 
 /* Returns the lower bound input of a Bound operation. */
-ir_node *get_Bound_lower(ir_node *bound) {
+ir_node *get_Bound_lower(const ir_node *bound) {
        assert(bound->op == op_Bound);
        return get_irn_n(bound, 2);
 }
@@ -2315,7 +2387,7 @@ void set_Bound_lower(ir_node *bound, ir_node *lower) {
 }
 
 /* Returns the upper bound input of a Bound operation. */
-ir_node *get_Bound_upper(ir_node *bound) {
+ir_node *get_Bound_upper(const ir_node *bound) {
        assert(bound->op == op_Bound);
        return get_irn_n(bound, 3);
 }
@@ -2337,11 +2409,46 @@ void set_Pin_op(ir_node *pin, ir_node *node) {
 }
 
 /* Return the assembler text of an ASM pseudo node. */
-const char *get_ASM_text(const ir_node *node) {
+ident *get_ASM_text(const ir_node *node) {
+       assert(node->op == op_ASM);
+       return node->attr.assem.asm_text;
+}
+
+/* Return the number of input constraints for an ASM node. */
+int get_ASM_n_input_constraints(const ir_node *node) {
+       assert(node->op == op_ASM);
+       return ARR_LEN(node->attr.assem.inputs);
+}
+
+/* Return the input constraints for an ASM node. This is a flexible array. */
+const ir_asm_constraint *get_ASM_input_constraints(const ir_node *node) {
+       assert(node->op == op_ASM);
+       return node->attr.assem.inputs;
+}
+
+/* Return the number of output constraints for an ASM node.  */
+int get_ASM_n_output_constraints(const ir_node *node) {
+       assert(node->op == op_ASM);
+       return ARR_LEN(node->attr.assem.outputs);
+}
+
+/* Return the output constraints for an ASM node. */
+const ir_asm_constraint *get_ASM_output_constraints(const ir_node *node) {
        assert(node->op == op_ASM);
-       return get_id_str(node->attr.asm.asm_text);
+       return node->attr.assem.outputs;
 }
 
+/* Return the number of clobbered registers for an ASM node.  */
+int get_ASM_n_clobbers(const ir_node *node) {
+       assert(node->op == op_ASM);
+       return ARR_LEN(node->attr.assem.clobber);
+}
+
+/* Return the list of clobbered registers for an ASM node. */
+ident **get_ASM_clobbers(const ir_node *node) {
+       assert(node->op == op_ASM);
+       return node->attr.assem.clobber;
+}
 
 /* returns the graph of a node */
 ir_graph *
@@ -2504,6 +2611,11 @@ int
        return _is_NoMem(node);
 }
 
+int
+(is_Minus)(const ir_node *node) {
+       return _is_Minus(node);
+}
+
 int
 (is_Mod)(const ir_node *node) {
        return _is_Mod(node);
@@ -2529,11 +2641,61 @@ int
        return _is_Add(node);
 }
 
+int
+(is_And)(const ir_node *node) {
+       return _is_And(node);
+}
+
+int
+(is_Or)(const ir_node *node) {
+       return _is_Or(node);
+}
+
+int
+(is_Eor)(const ir_node *node) {
+       return _is_Eor(node);
+}
+
 int
 (is_Sub)(const ir_node *node) {
        return _is_Sub(node);
 }
 
+int
+(is_Shl)(const ir_node *node) {
+       return _is_Shl(node);
+}
+
+int
+(is_Shr)(const ir_node *node) {
+       return _is_Shr(node);
+}
+
+int
+(is_Shrs)(const ir_node *node) {
+       return _is_Shrs(node);
+}
+
+int
+(is_Rot)(const ir_node *node) {
+       return _is_Rot(node);
+}
+
+int
+(is_Not)(const ir_node *node) {
+       return _is_Not(node);
+}
+
+int
+(is_Psi)(const ir_node *node) {
+       return _is_Psi(node);
+}
+
+int
+(is_Tuple)(const ir_node *node) {
+       return _is_Tuple(node);
+}
+
 int
 (is_Start)(const ir_node *node) {
   return _is_Start(node);
@@ -2554,6 +2716,16 @@ int
        return _is_Conv(node);
 }
 
+int
+(is_strictConv)(const ir_node *node) {
+       return _is_strictConv(node);
+}
+
+int
+(is_Cast)(const ir_node *node) {
+       return _is_Cast(node);
+}
+
 int
 (is_no_Block)(const ir_node *node) {
        return _is_no_Block(node);
@@ -2612,25 +2784,31 @@ int
        return _is_Sync(node);
 }
 
-/* returns true if node is a Confirm node. */
+/* Returns true if node is a Confirm node. */
 int
 (is_Confirm)(const ir_node *node) {
        return _is_Confirm(node);
 }
 
-/* returns true if node is a Pin node. */
+/* Returns true if node is a Pin node. */
 int
 (is_Pin)(const ir_node *node) {
        return _is_Pin(node);
 }
 
-/* returns true if node is a SymConst node. */
+/* Returns true if node is a SymConst node. */
 int
 (is_SymConst)(const ir_node *node) {
        return _is_SymConst(node);
 }
 
-/* returns true if node is a Cond node. */
+/* Returns true if node is a SymConst node with kind symconst_addr_ent. */
+int
+(is_SymConst_addr_ent)(const ir_node *node) {
+       return _is_SymConst_addr_ent(node);
+}
+
+/* Returns true if node is a Cond node. */
 int
 (is_Cond)(const ir_node *node) {
        return _is_Cond(node);
@@ -2665,17 +2843,22 @@ int
        return _is_Raise(node);
 }
 
+/* returns true if a node is an ASM node. */
 int
-is_Proj(const ir_node *node) {
+(is_ASM)(const ir_node *node) {
+       return _is_ASM(node);
+}
+
+int
+(is_Proj)(const ir_node *node) {
        assert(node);
        return node->op == op_Proj ||
               (!get_interprocedural_view() && node->op == op_Filter);
 }
 
 /* Returns true if the operation manipulates control flow. */
-int
-is_cfop(const ir_node *node) {
-       return is_cfopcode(get_irn_op(node));
+int is_cfop(const ir_node *node) {
+       return is_op_cfopcode(get_irn_op(node));
 }
 
 /* Returns true if the operation manipulates interprocedural control flow:
@@ -2705,7 +2888,8 @@ ir_node *get_fragile_op_mem(ir_node *node) {
        case iro_Store :
        case iro_Alloc :
        case iro_Bound :
-               return get_irn_n(node, 0);
+       case iro_CopyB :
+               return get_irn_n(node, pn_Generic_M_regular);
        case iro_Bad   :
        case iro_Unknown:
                return node;
@@ -2809,6 +2993,7 @@ void (set_Cond_jmp_pred)(ir_node *cond, cond_jmp_predicate pred) {
 
 /** the get_type operation must be always implemented and return a firm type */
 static ir_type *get_Default_type(ir_node *n) {
+       (void) n;
        return get_unknown_type();
 }
 
@@ -2846,6 +3031,7 @@ static ir_entity *get_SymConst_attr_entity(ir_node *self) {
 
 /** the get_type_attr operation must be always implemented */
 static ir_type *get_Null_type(ir_node *n) {
+       (void) n;
        return firm_unknown_type;
 }
 
@@ -2868,6 +3054,7 @@ ir_op_ops *firm_set_default_get_type_attr(ir_opcode code, ir_op_ops *ops) {
 
 /** the get_entity_attr operation must be always implemented */
 static ir_entity *get_Null_ent(ir_node *n) {
+       (void) n;
        return NULL;
 }
 
@@ -2875,7 +3062,7 @@ static ir_entity *get_Null_ent(ir_node *n) {
 ir_op_ops *firm_set_default_get_entity_attr(ir_opcode code, ir_op_ops *ops) {
        switch (code) {
        case iro_SymConst: ops->get_entity_attr = get_SymConst_attr_entity; break;
-       case iro_Sel:      ops->get_entity_attr = get_Sel_entity; break;
+       case iro_Sel:      ops->get_entity_attr = _get_Sel_entity; break;
        default:
                /* not allowed to be NULL */
                if (! ops->get_entity_attr)
@@ -2885,8 +3072,24 @@ ir_op_ops *firm_set_default_get_entity_attr(ir_opcode code, ir_op_ops *ops) {
        return ops;
 }
 
+/* Sets the debug information of a node. */
+void (set_irn_dbg_info)(ir_node *n, dbg_info *db) {
+       _set_irn_dbg_info(n, db);
+}
+
+/**
+ * Returns the debug information of an node.
+ *
+ * @param n   The node.
+ */
+dbg_info *(get_irn_dbg_info)(const ir_node *n) {
+       return _get_irn_dbg_info(n);
+}
+
+
+
 #ifdef DEBUG_libfirm
-void dump_irn(ir_node *n) {
+void dump_irn(const ir_node *n) {
        int i, arity = get_irn_arity(n);
        printf("%s%s: %ld (%p)\n", get_irn_opname(n), get_mode_name(get_irn_mode(n)), get_irn_node_nr(n), (void *)n);
        if (!is_Block(n)) {
@@ -2903,5 +3106,5 @@ void dump_irn(ir_node *n) {
 }
 
 #else  /* DEBUG_libfirm */
-void dump_irn(ir_node *n) {}
+void dump_irn(const ir_node *n) { (void) n; }
 #endif /* DEBUG_libfirm */