never CSE nodes which have no stack entities assigned yet but need them later (this...
[libfirm] / ir / ir / ircons.c
index feec913..7cbd797 100644 (file)
@@ -104,7 +104,7 @@ new_bd_##instr(dbg_info *db, ir_node *block,                    \
 #define NEW_BD_DIVOP(instr)                                     \
 static ir_node *                                                \
 new_bd_##instr(dbg_info *db, ir_node *block,                    \
-            ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode) \
+            ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state) \
 {                                                               \
   ir_node  *in[3];                                              \
   ir_node  *res;                                                \
@@ -113,7 +113,7 @@ new_bd_##instr(dbg_info *db, ir_node *block,                    \
   in[1] = op1;                                                  \
   in[2] = op2;                                                  \
   res = new_ir_node(db, irg, block, op_##instr, mode_T, 3, in); \
-  res->attr.divmod.exc.pin_state = op_pin_state_pinned;         \
+  res->attr.divmod.exc.pin_state = state;                       \
   res->attr.divmod.res_mode = mode;                             \
   res = optimize_node(res);                                     \
   IRN_VRFY_IRG(res, irg);                                       \
@@ -152,12 +152,12 @@ new_rd_##instr(dbg_info *db, ir_graph *irg, ir_node *block,     \
 #define NEW_RD_DIVOP(instr)                                     \
 ir_node *                                                       \
 new_rd_##instr(dbg_info *db, ir_graph *irg, ir_node *block,     \
-            ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode) \
+            ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state) \
 {                                                               \
   ir_node  *res;                                                \
   ir_graph *rem = current_ir_graph;                             \
   current_ir_graph = irg;                                       \
-  res = new_bd_##instr(db, block, memop, op1, op2, mode);       \
+  res = new_bd_##instr(db, block, memop, op1, op2, mode, state);\
   current_ir_graph = rem;                                       \
   return res;                                                   \
 }
@@ -194,12 +194,14 @@ new_bd_Block(dbg_info *db, int arity, ir_node **in) {
 
        res->attr.block.is_dead     = 0;
        res->attr.block.is_mb_head  = 1;
+       res->attr.block.has_label   = 0;
        res->attr.block.irg         = irg;
        res->attr.block.backedge    = new_backedge_arr(irg->obst, arity);
        res->attr.block.in_cg       = NULL;
        res->attr.block.cg_backedge = NULL;
        res->attr.block.extblk      = NULL;
        res->attr.block.mb_depth    = 0;
+       res->attr.block.label       = 0;
 
        set_Block_matured(res, 1);
        set_Block_block_visited(res, 0);
@@ -414,8 +416,8 @@ new_bd_Jmp(dbg_info *db, ir_node *block) {
        ir_node  *res;
        ir_graph *irg = current_ir_graph;
 
-       res = new_ir_node (db, irg, block, op_Jmp, mode_X, 0, NULL);
-       res = optimize_node (res);
+       res = new_ir_node(db, irg, block, op_Jmp, mode_X, 0, NULL);
+       res = optimize_node(res);
        IRN_VRFY_IRG(res, irg);
        return res;
 }  /* new_bd_Jmp */
@@ -425,12 +427,9 @@ new_bd_IJmp(dbg_info *db, ir_node *block, ir_node *tgt) {
        ir_node  *res;
        ir_graph *irg = current_ir_graph;
 
-       res = new_ir_node (db, irg, block, op_IJmp, mode_X, 1, &tgt);
-       res = optimize_node (res);
+       res = new_ir_node(db, irg, block, op_IJmp, mode_X, 1, &tgt);
+       res = optimize_node(res);
        IRN_VRFY_IRG(res, irg);
-
-       if (get_irn_op(res) == op_IJmp) /* still an IJmp */
-               keep_alive(res);
        return res;
 }  /* new_bd_IJmp */
 
@@ -439,11 +438,11 @@ new_bd_Cond(dbg_info *db, ir_node *block, ir_node *c) {
        ir_node  *res;
        ir_graph *irg = current_ir_graph;
 
-       res = new_ir_node (db, irg, block, op_Cond, mode_T, 1, &c);
+       res = new_ir_node(db, irg, block, op_Cond, mode_T, 1, &c);
        res->attr.cond.kind         = dense;
        res->attr.cond.default_proj = 0;
        res->attr.cond.pred         = COND_JMP_PRED_NONE;
-       res = optimize_node (res);
+       res = optimize_node(res);
        IRN_VRFY_IRG(res, irg);
        return res;
 }  /* new_bd_Cond */
@@ -504,6 +503,7 @@ new_bd_Load(dbg_info *db, ir_node *block,
        res->attr.load.exc.pin_state = op_pin_state_pinned;
        res->attr.load.load_mode     = mode;
        res->attr.load.volatility    = volatility_non_volatile;
+       res->attr.load.aligned       = align_is_aligned;
        res = optimize_node(res);
        IRN_VRFY_IRG(res, irg);
        return res;
@@ -522,6 +522,7 @@ new_bd_Store(dbg_info *db, ir_node *block,
        res = new_ir_node(db, irg, block, op_Store, mode_T, 3, in);
        res->attr.store.exc.pin_state = op_pin_state_pinned;
        res->attr.store.volatility    = volatility_non_volatile;
+       res->attr.store.aligned       = align_is_aligned;
        res = optimize_node(res);
        IRN_VRFY_IRG(res, irg);
        return res;
@@ -1525,20 +1526,20 @@ ir_node *new_r_Mul(ir_graph *irg, ir_node *block,
        return new_rd_Mul(NULL, irg, block, op1, op2, mode);
 }
 ir_node *new_r_Quot(ir_graph *irg, ir_node *block,
-                    ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode) {
-       return new_rd_Quot(NULL, irg, block, memop, op1, op2, mode);
+                    ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state) {
+       return new_rd_Quot(NULL, irg, block, memop, op1, op2, mode, state);
 }
 ir_node *new_r_DivMod(ir_graph *irg, ir_node *block,
-                      ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode) {
-       return new_rd_DivMod(NULL, irg, block, memop, op1, op2, mode);
+                      ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state) {
+       return new_rd_DivMod(NULL, irg, block, memop, op1, op2, mode, state);
 }
 ir_node *new_r_Div(ir_graph *irg, ir_node *block,
-                   ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode) {
-       return new_rd_Div(NULL, irg, block, memop, op1, op2, mode);
+                   ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state) {
+       return new_rd_Div(NULL, irg, block, memop, op1, op2, mode, state);
 }
 ir_node *new_r_Mod(ir_graph *irg, ir_node *block,
-                   ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode) {
-       return new_rd_Mod(NULL, irg, block, memop, op1, op2, mode);
+                   ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state) {
+       return new_rd_Mod(NULL, irg, block, memop, op1, op2, mode, state);
 }
 ir_node *new_r_Abs(ir_graph *irg, ir_node *block,
                    ir_node *op, ir_mode *mode) {
@@ -1816,9 +1817,9 @@ Phi_in_stack *
 new_Phi_in_stack(void) {
        Phi_in_stack *res;
 
-       res = (Phi_in_stack *) malloc ( sizeof (Phi_in_stack));
+       res = (Phi_in_stack *) xmalloc(sizeof(Phi_in_stack));
 
-       res->stack = NEW_ARR_F (ir_node *, 0);
+       res->stack = NEW_ARR_F(ir_node *, 0);
        res->pos = 0;
 
        return res;
@@ -2661,9 +2662,9 @@ static void allocate_frag_arr(ir_node *res, ir_op *op, ir_node ***frag_store) {
 }  /* allocate_frag_arr */
 
 ir_node *
-new_d_Quot(dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode) {
+new_d_Quot(dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state) {
        ir_node *res;
-       res = new_bd_Quot(db, current_ir_graph->current_block, memop, op1, op2, mode);
+       res = new_bd_Quot(db, current_ir_graph->current_block, memop, op1, op2, mode, state);
 #if PRECISE_EXC_CONTEXT
        allocate_frag_arr(res, op_Quot, &res->attr.except.frag_arr);  /* Could be optimized away. */
 #endif
@@ -2672,9 +2673,9 @@ new_d_Quot(dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mo
 }  /* new_d_Quot */
 
 ir_node *
-new_d_DivMod(dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode) {
+new_d_DivMod(dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state) {
        ir_node *res;
-       res = new_bd_DivMod(db, current_ir_graph->current_block, memop, op1, op2, mode);
+       res = new_bd_DivMod(db, current_ir_graph->current_block, memop, op1, op2, mode, state);
 #if PRECISE_EXC_CONTEXT
        allocate_frag_arr(res, op_DivMod, &res->attr.except.frag_arr);  /* Could be optimized away. */
 #endif
@@ -2683,9 +2684,9 @@ new_d_DivMod(dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *
 }  /* new_d_DivMod */
 
 ir_node *
-new_d_Div(dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode) {
+new_d_Div(dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state) {
        ir_node *res;
-       res = new_bd_Div(db, current_ir_graph->current_block, memop, op1, op2, mode);
+       res = new_bd_Div(db, current_ir_graph->current_block, memop, op1, op2, mode, state);
 #if PRECISE_EXC_CONTEXT
        allocate_frag_arr(res, op_Div, &res->attr.except.frag_arr);  /* Could be optimized away. */
 #endif
@@ -2694,9 +2695,9 @@ new_d_Div(dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mod
 }
 
 ir_node *
-new_d_Mod(dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode) {
+new_d_Mod(dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state) {
        ir_node *res;
-       res = new_bd_Mod(db, current_ir_graph->current_block, memop, op1, op2, mode);
+       res = new_bd_Mod(db, current_ir_graph->current_block, memop, op1, op2, mode, state);
 #if PRECISE_EXC_CONTEXT
        allocate_frag_arr(res, op_Mod, &res->attr.except.frag_arr);  /* Could be optimized away. */
 #endif
@@ -2959,6 +2960,7 @@ new_d_immBlock(dbg_info *db) {
        res->attr.block.is_matured  = 0;
        res->attr.block.is_dead     = 0;
        res->attr.block.is_mb_head  = 1;
+       res->attr.block.has_label   = 0;
        res->attr.block.irg         = current_ir_graph;
        res->attr.block.backedge    = NULL;
        res->attr.block.in_cg       = NULL;
@@ -2966,6 +2968,7 @@ new_d_immBlock(dbg_info *db) {
        res->attr.block.extblk      = NULL;
        res->attr.block.region      = NULL;
        res->attr.block.mb_depth    = 0;
+       res->attr.block.label       = 0;
 
        set_Block_block_visited(res, 0);
 
@@ -3215,17 +3218,17 @@ ir_node *new_Minus(ir_node *op,  ir_mode *mode) {
 ir_node *new_Mul(ir_node *op1, ir_node *op2, ir_mode *mode) {
        return new_d_Mul(NULL, op1, op2, mode);
 }
-ir_node *new_Quot(ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode) {
-       return new_d_Quot(NULL, memop, op1, op2, mode);
+ir_node *new_Quot(ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state) {
+       return new_d_Quot(NULL, memop, op1, op2, mode, state);
 }
-ir_node *new_DivMod(ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode) {
-       return new_d_DivMod(NULL, memop, op1, op2, mode);
+ir_node *new_DivMod(ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state) {
+       return new_d_DivMod(NULL, memop, op1, op2, mode, state);
 }
-ir_node *new_Div(ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode) {
-       return new_d_Div(NULL, memop, op1, op2, mode);
+ir_node *new_Div(ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state) {
+       return new_d_Div(NULL, memop, op1, op2, mode, state);
 }
-ir_node *new_Mod(ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode) {
-       return new_d_Mod(NULL, memop, op1, op2, mode);
+ir_node *new_Mod(ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state) {
+       return new_d_Mod(NULL, memop, op1, op2, mode, state);
 }
 ir_node *new_Abs(ir_node *op, ir_mode *mode) {
        return new_d_Abs(NULL, op, mode);
@@ -3357,3 +3360,10 @@ ir_node *new_ASM(int arity, ir_node *in[], ir_asm_constraint *inputs,
                  int n_clobber, ident *clobber[], ident *asm_text) {
        return new_d_ASM(NULL, arity, in, inputs, n_outs, outputs, n_clobber, clobber, asm_text);
 }
+
+/* create a new anchor node */
+ir_node *new_Anchor(ir_graph *irg) {
+       ir_node *in[anchor_last];
+       memset(in, 0, sizeof(in));
+       return new_ir_node(NULL, irg, NULL, op_Anchor, mode_ANY, anchor_last, in);
+}