- removed verify and dump parameters from passes
[libfirm] / ir / opt / convopt.c
index 41e5ba7..4d06679 100644 (file)
 #include "iredges_t.h"
 #include "irgwalk.h"
 #include "irprintf.h"
+#include "irtools.h"
 
 DEBUG_ONLY(static firm_dbg_module_t *dbg);
 
-static INLINE int imin(int a, int b) { return a < b ? a : b; }
+static inline int imin(int a, int b) { return a < b ? a : b; }
 
 static
 int is_optimizable_node(const ir_node *node)
@@ -115,10 +116,6 @@ int get_conv_costs(const ir_node *node, ir_mode *dest_mode)
                return 1;
        }
 
-       if (is_Conv(node) && is_downconv(mode, dest_mode)) {
-               return get_conv_costs(get_Conv_op(node), dest_mode) - 1;
-       }
-
 #if 0 // TODO
        /* Take the minimum of the conversion costs for Phi predecessors as only one
         * branch is actually executed at a time */
@@ -138,7 +135,15 @@ int get_conv_costs(const ir_node *node, ir_mode *dest_mode)
        }
 #endif
 
-       if (!mode_is_int(mode) || !is_optimizable_node(node)) {
+       if (!is_downconv(mode, dest_mode)) {
+               return 1;
+       }
+
+       if (is_Conv(node)) {
+               return get_conv_costs(get_Conv_op(node), dest_mode) - 1;
+       }
+
+       if (!is_optimizable_node(node)) {
                return 1;
        }
 
@@ -156,7 +161,7 @@ int get_conv_costs(const ir_node *node, ir_mode *dest_mode)
 static ir_node *place_conv(ir_node *node, ir_mode *dest_mode)
 {
        ir_node *block = get_nodes_block(node);
-       ir_node *conv = new_r_Conv(current_ir_graph, block, node, dest_mode);
+       ir_node *conv = new_r_Conv(block, node, dest_mode);
        return conv;
 }
 
@@ -176,7 +181,7 @@ ir_node *conv_transform(ir_node *node, ir_mode *dest_mode)
                if (tv == tarval_bad) {
                        return place_conv(node, dest_mode);
                } else {
-                       return new_Const(dest_mode, tv);
+                       return new_Const(tv);
                }
        }
 
@@ -190,11 +195,15 @@ ir_node *conv_transform(ir_node *node, ir_mode *dest_mode)
                return place_conv(node, dest_mode);
        }
 
-       if (is_Conv(node) && is_downconv(mode, dest_mode)) {
+       if (!is_downconv(mode, dest_mode)) {
+               return place_conv(node, dest_mode);
+       }
+
+       if (is_Conv(node)) {
                return conv_transform(get_Conv_op(node), dest_mode);
        }
 
-       if (!mode_is_int(mode) || !is_optimizable_node(node)) {
+       if (!is_optimizable_node(node)) {
                return place_conv(node, dest_mode);
        }
 
@@ -292,3 +301,9 @@ int conv_opt(ir_graph *irg)
        }
        return invalidate;
 }
+
+/* Creates an ir_graph pass for conv_opt. */
+ir_graph_pass_t *conv_opt_pass(const char *name)
+{
+       return def_graph_pass_ret(name ? name : "conv_opt", conv_opt);
+}  /* conv_opt_pass */