X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fopt%2Fconvopt.c;h=43ac2d90aa2ae1ed236eb84ad6d10965b6f841e0;hb=a619ce99e40de4eb4481a590970a881e9f24627a;hp=653ef1d400ea056346683f713b8420636037f7f6;hpb=a7c6b3122cc7be047df0ceab4fe29b22fc88dff9;p=libfirm diff --git a/ir/opt/convopt.c b/ir/opt/convopt.c index 653ef1d40..43ac2d90a 100644 --- a/ir/opt/convopt.c +++ b/ir/opt/convopt.c @@ -138,6 +138,12 @@ static int get_conv_costs(const ir_node *node, ir_mode *dest_mode) } if (is_Conv(node)) { + ir_node *pred = get_Conv_op(node); + ir_mode *pred_mode = get_irn_mode(pred); + + if (!values_in_mode(dest_mode, pred_mode)) { + return 1; + } return get_conv_costs(get_Conv_op(node), dest_mode) - 1; } @@ -197,6 +203,12 @@ static ir_node *conv_transform(ir_node *node, ir_mode *dest_mode) } if (is_Conv(node)) { + ir_node *pred = get_Conv_op(node); + ir_mode *pred_mode = get_irn_mode(pred); + + if (!values_in_mode(dest_mode, pred_mode)) { + return place_conv(node, dest_mode); + } return conv_transform(get_Conv_op(node), dest_mode); } @@ -229,7 +241,7 @@ static void try_optimize_cmp(ir_node *node) ir_node *right = get_Cmp_right(node); ir_node *conv = NULL; - if(is_downconv + if (is_downconv } #endif @@ -243,7 +255,7 @@ static void conv_opt_walker(ir_node *node, void *data) bool *changed = data; #if 0 - if(is_Cmp(node)) { + if (is_Cmp(node)) { try_optimize_cmp(node); return; }