X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Flower%2Flower_intrinsics.c;h=2e33ce80d0ddeaf9b0050463be2b2382ec40f0f2;hb=5f489a6cbb73897e6225f310df4786a1d8d64562;hp=47f7936f2cc29096515ecb72f1084438b2be33ba;hpb=dd6793ed8b75dd86637857ce795f07607a6d77ec;p=libfirm diff --git a/ir/lower/lower_intrinsics.c b/ir/lower/lower_intrinsics.c index 47f7936f2..2e33ce80d 100644 --- a/ir/lower/lower_intrinsics.c +++ b/ir/lower/lower_intrinsics.c @@ -70,7 +70,7 @@ static void call_mapper(ir_node *node, void *env) return; ent = get_SymConst_entity(symconst); - r = (const i_call_record*)pmap_get(wenv->c_map, ent); + r = pmap_get(i_call_record const, wenv->c_map, ent); if (r != NULL) { wenv->nr_of_intrinsics += r->i_mapper(node, r->ctx) ? 1 : 0; @@ -139,7 +139,7 @@ size_t lower_intrinsics(i_record *list, size_t length, int part_block_used) set_irg_callee_info_state(irg, irg_callee_info_inconsistent); /* Exception control flow might have changed / new block might have added. */ - clear_irg_state(irg, IR_GRAPH_STATE_CONSISTENT_DOMINANCE); + clear_irg_properties(irg, IR_GRAPH_PROPERTY_CONSISTENT_DOMINANCE); /* verify here */ irg_verify(irg, VERIFY_NORMAL); @@ -391,9 +391,16 @@ int i_mapper_pow(ir_node *call, void *ctx) dbg = get_irn_dbg_info(call); if (irn == NULL) { - ir_mode *mode = get_irn_mode(left); + ir_mode *result_mode = get_irn_mode(left); ir_node *div; + ir_mode *mode = result_mode; + ir_mode *float_arithmetic = be_get_backend_param()->mode_float_arithmetic; + if (float_arithmetic != NULL) { + left = new_r_Conv(block, left, float_arithmetic); + mode = float_arithmetic; + } + irn = new_r_Const(irg, get_mode_one(mode)); div = new_rd_Div(dbg, block, mem, irn, left, mode, op_pin_state_pinned); mem = new_r_Proj(div, mode_M, pn_Div_M); @@ -403,6 +410,9 @@ int i_mapper_pow(ir_node *call, void *ctx) exc_jmp = new_r_Proj(div, mode_X, pn_Div_X_except); ir_set_throws_exception(div, true); } + if (result_mode != mode) { + irn = new_r_Conv(block, irn, result_mode); + } } DBG_OPT_ALGSIM0(call, irn, FS_OPT_RTS_POW); replace_call(irn, call, mem, reg_jmp, exc_jmp); @@ -487,7 +497,7 @@ static int i_mapper_symmetric_zero_to_one(ir_node *call, void *ctx, int reason) ir_node *val = get_Call_param(call, 0); (void) ctx; - if (is_strictConv(val)) { + if (is_Conv(val)) { ir_node *op = get_Conv_op(val); if (is_Minus(op)) { /* f(-x) = f(x) with strictConv */ @@ -497,10 +507,6 @@ static int i_mapper_symmetric_zero_to_one(ir_node *call, void *ctx, int reason) op = get_Minus_op(op); val = new_rd_Conv(dbg, block, op, mode); - if (is_Conv(val)) { - /* still a Conv ? */ - set_Conv_strict(val, 1); - } DBG_OPT_ALGSIM2(call, op, call, FS_OPT_RTS_SYMMETRIC); set_Call_param(call, 0, val); changed = 1;