X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Flower%2Flower_mode_b.c;h=b5a139fdcc69d99236bbfe14c8cbbb4691ae9d0a;hb=003c4dbcb432c50c45b1028b82bd9a62fc727094;hp=73f9e24e13e4affa1edcefb940dd85304c687569;hpb=ae7ae8f37729730266f184f9b2d1bef97887a6a8;p=libfirm diff --git a/ir/lower/lower_mode_b.c b/ir/lower/lower_mode_b.c index 73f9e24e1..b5a139fdc 100644 --- a/ir/lower/lower_mode_b.c +++ b/ir/lower/lower_mode_b.c @@ -35,6 +35,7 @@ #include "tv.h" #include "error.h" #include "lowering.h" +#include "benode_t.h" static ir_mode *lowered_mode = NULL; static int lower_direct_cmp = 0; @@ -49,6 +50,24 @@ static ir_node *create_not(dbg_info *dbgi, ir_node *node) return new_rd_Eor(dbgi, irg, block, node, one, lowered_mode); } +static ir_node *create_convb(ir_node *node) +{ + ir_graph *irg = current_ir_graph; + ir_node *block = get_nodes_block(node); + ir_node *conv = new_rd_Conv(NULL, irg, block, node, mode_b); + + return conv; +} + +static ir_node *create_conv_lowered_mode(ir_node *node) +{ + ir_graph *irg = current_ir_graph; + ir_node *block = get_nodes_block(node); + ir_node *conv = new_rd_Conv(NULL, irg, block, node, lowered_mode); + + return conv; +} + static ir_node *lower_node(ir_node *node) { ir_graph *irg = current_ir_graph; @@ -121,7 +140,7 @@ static ir_node *lower_node(ir_node *node) ir_node *v_false = get_Psi_default(node); ir_node *low_v_false = lower_node(v_false); - ir_node *and0 = new_rd_And(dbgi, irg, block, cond, low_v_true, + ir_node *and0 = new_rd_And(dbgi, irg, block, low_cond, low_v_true, lowered_mode); ir_node *not_cond = create_not(dbgi, low_cond); @@ -140,11 +159,12 @@ static ir_node *lower_node(ir_node *node) ir_node *one = new_d_Const(dbgi, lowered_mode, tv_one); tarval *tv_zero = get_tarval_null(lowered_mode); ir_node *zero = new_d_Const(dbgi, lowered_mode, tv_zero); - ir_mode *mode = get_irn_mode(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 *cmp = new_rd_Cmp(dbgi, irg, block, node, zero_cmp); + ir_node *cmp = new_rd_Cmp(dbgi, irg, block, pred, zero_cmp); ir_node *proj = new_rd_Proj(dbgi, irg, block, cmp, mode_b, pn_Cmp_Lg); ir_node *vals[2] = { one, zero }; @@ -155,16 +175,14 @@ static ir_node *lower_node(ir_node *node) return psi; } if(op == op_Proj) { - ir_node *pred = get_Proj_pred(node); + ir_node *pred = get_Proj_pred(node); - assert(!is_Load(pred)); if(is_Cmp(pred)) { - ir_mode *mode = get_irn_mode(pred); ir_node *left = get_Cmp_left(pred); ir_node *right = get_Cmp_right(pred); + ir_mode *mode = get_irn_mode(left); - if( (mode_is_int(mode) || mode_is_character(mode) - || mode_is_reference(mode)) && + if( (mode_is_int(mode) || mode_is_reference(mode)) && (get_mode_size_bits(mode) < get_mode_size_bits(lowered_mode) || classify_Const(right) == CNST_NULL)) { int pnc = get_Proj_proj(node); @@ -227,6 +245,13 @@ static ir_node *lower_node(ir_node *node) set_irn_link(node, psi); return psi; } + } else if(is_Proj(pred) && is_Call(get_Proj_pred(pred))) { + return create_conv_lowered_mode(node); + } else if(is_Proj(pred) && is_Start(get_Proj_pred(pred))) { + return create_conv_lowered_mode(node); + } else if (be_is_Barrier(pred)) { + /* nothing to do */ + return node; } panic("unexpected projb: %+F (pred: %+F)", node, pred); @@ -249,15 +274,6 @@ static ir_node *lower_node(ir_node *node) panic("didn't expect %+F to have mode_b", node); } -static ir_node *create_convb(ir_node *node) -{ - ir_graph *irg = current_ir_graph; - ir_node *block = get_nodes_block(node); - ir_node *conv = new_rd_Conv(NULL, irg, block, node, mode_b); - - return conv; -} - static void lower_mode_b_walker(ir_node *node, void *env) { int i, arity;