- tarval *tv = tarval_convert_to(get_Const_tarval(node), dest_mode);
- assert(get_tarval_mode(tv) == dest_mode);
- return new_Const(dest_mode, tv);
+ /* TODO tarval module is incomplete and can't convert floats to ints */
+ ir_tarval *tv = conv_const_tv(node, dest_mode);
+ if (tv == tarval_bad) {
+ return place_conv(node, dest_mode);
+ } else {
+ return new_r_Const(irg, tv);
+ }
+ }
+
+ if (is_Conv(node) &&
+ is_downconv(mode, dest_mode) &&
+ get_irn_mode(get_Conv_op(node)) == dest_mode) {
+ return get_Conv_op(node);
+ }
+
+ if (get_irn_n_edges(node) > 1) {
+ return place_conv(node, dest_mode);
+ }
+
+ if (!is_downconv(mode, dest_mode)) {
+ return place_conv(node, dest_mode);