X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Flower%2Flower_mode_b.c;h=a6c0f753ef0c8fb295788139afa76e4b7b572cf4;hb=288b414e4d82e0aa0d4b4348d8c387db02142cdb;hp=baa151fb59594ea5c8304745dad6eebf922551dc;hpb=0fbcef83aa6060534172bb13e71cdadb04428806;p=libfirm diff --git a/ir/lower/lower_mode_b.c b/ir/lower/lower_mode_b.c index baa151fb5..a6c0f753e 100644 --- a/ir/lower/lower_mode_b.c +++ b/ir/lower/lower_mode_b.c @@ -32,6 +32,7 @@ #include "irnode_t.h" #include "ircons_t.h" +#include "irflag.h" #include "irgwalk.h" #include "irtools.h" #include "iredges.h" @@ -76,7 +77,7 @@ static ir_node *create_not(dbg_info *dbgi, ir_node *node) ir_node *block = get_nodes_block(node); ir_mode *mode = config.lowered_mode; tarval *tv_one = get_tarval_one(mode); - ir_node *one = new_d_Const(dbgi, mode, tv_one); + ir_node *one = new_d_Const(dbgi, tv_one); return new_rd_Eor(dbgi, irg, block, node, one, mode); } @@ -108,10 +109,10 @@ static ir_node *create_set(ir_node *node) dbg_info *dbgi = get_irn_dbg_info(node); ir_mode *mode = config.lowered_set_mode; tarval *tv_one = get_tarval_one(mode); - ir_node *one = new_d_Const(dbgi, mode, tv_one); + ir_node *one = new_d_Const(dbgi, tv_one); ir_node *block = get_nodes_block(node); tarval *tv_zero = get_tarval_null(mode); - ir_node *zero = new_d_Const(dbgi, mode, tv_zero); + ir_node *zero = new_d_Const(dbgi, tv_zero); ir_node *set = new_rd_Mux(dbgi, irg, block, node, zero, one, mode); @@ -166,8 +167,8 @@ static ir_node *lower_node(ir_node *node) ir_node **in; ir_node *unknown, *new_phi; - arity = get_irn_arity(node); - in = alloca(arity * sizeof(in[0])); + arity = get_irn_arity(node); + in = ALLOCAN(ir_node*, arity); unknown = new_Unknown(config.lowered_mode); for(i = 0; i < arity; ++i) { in[i] = unknown; @@ -235,7 +236,7 @@ static ir_node *lower_node(ir_node *node) ir_node *pred = get_Conv_op(node); ir_mode *mode = get_irn_mode(pred); tarval *tv_zeroc = get_tarval_null(mode); - ir_node *zero_cmp = new_d_Const(dbgi, mode, tv_zeroc); + ir_node *zero_cmp = new_d_Const(dbgi, tv_zeroc); ir_node *set; ir_node *cmp = new_rd_Cmp(dbgi, irg, block, pred, zero_cmp); @@ -288,7 +289,7 @@ static ir_node *lower_node(ir_node *node) if(a != NULL) { int bits = get_mode_size_bits(mode); tarval *tv = new_tarval_from_long(bits-1, mode_Iu); - ir_node *shift_cnt = new_d_Const(dbgi, mode_Iu, tv); + ir_node *shift_cnt = new_d_Const(dbgi, tv); if(cmp_mode != mode) { a = new_rd_Conv(dbgi, irg, block, a, mode); @@ -331,10 +332,10 @@ static ir_node *lower_node(ir_node *node) tarval *tv = get_Const_tarval(node); if(tv == get_tarval_b_true()) { tarval *tv_one = get_tarval_one(mode); - res = new_d_Const(dbgi, mode, tv_one); + res = new_d_Const(dbgi, tv_one); } else if(tv == get_tarval_b_false()) { tarval *tv_zero = get_tarval_null(mode); - res = new_d_Const(dbgi, mode, tv_zero); + res = new_d_Const(dbgi, tv_zero); } else { panic("invalid boolean const %+F", node); } @@ -404,8 +405,12 @@ void ir_lower_mode_b(ir_graph *irg, const lower_mode_b_config_t *nconfig) config = *nconfig; lowered_nodes = new_pdeq(); + /* ensure no optimisation touches muxes anymore */ + set_irg_state(irg, IR_GRAPH_STATE_KEEP_MUX); + ir_reserve_resources(irg, IR_RESOURCE_IRN_LINK); + set_opt_allow_conv_b(0); irg_walk_graph(irg, clear_links, NULL, NULL); irg_walk_graph(irg, lower_mode_b_walker, NULL, NULL);