avoid dangerous use of memcmp
[libfirm] / ir / opt / ifconv.c
index 07dd0ab..2492e85 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1995-2007 University of Karlsruhe.  All right reserved.
+ * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
  *
  * This file is part of libFirm.
  *
@@ -46,7 +46,7 @@
 #include "irdump.h"
 #include "debug.h"
 
-DEBUG_ONLY(firm_dbg_module_t *dbg);
+DEBUG_ONLY(static firm_dbg_module_t *dbg);
 
 /** allow every Psi to be created. */
 static int default_allow_ifconv(ir_node *sel, ir_node* phi_list, int i, int j)
@@ -61,7 +61,7 @@ static int default_allow_ifconv(ir_node *sel, ir_node* phi_list, int i, int j)
 /**
  * Default options.
  */
-static const opt_if_conv_info_t default_info = {
+static const ir_settings_if_conv_t default_info = {
        0,    /* doesn't matter for Psi */
        default_allow_ifconv
 };
@@ -74,9 +74,8 @@ typedef struct block_info {
        int has_pinned; /**< set if the block contains instructions that cannot be moved */
 } block_info;
 
-
-static INLINE block_info* get_block_blockinfo(const ir_node* block)
-{
+/** Returns the additional block info of a block. */
+static INLINE block_info* get_block_blockinfo(const ir_node* block) {
        return get_irn_link(block);
 }
 
@@ -84,8 +83,7 @@ static INLINE block_info* get_block_blockinfo(const ir_node* block)
 /**
  * Returns non-zero if a Block can be emptied.
  */
-static int can_empty_block(ir_node *block)
-{
+static int can_empty_block(ir_node *block) {
        return !get_block_blockinfo(block)->has_pinned;
 }
 
@@ -263,7 +261,7 @@ static void prepare_path(ir_node* block, int i, const ir_node* dependency)
 
 static void if_conv_walker(ir_node* block, void* env)
 {
-       opt_if_conv_info_t* opt_info = env;
+       ir_settings_if_conv_t* opt_info = env;
        int arity;
        int i;
 
@@ -274,7 +272,7 @@ restart:
        arity = get_irn_arity(block);
        for (i = 0; i < arity; ++i) {
                ir_node* pred0;
-               cdep* cdep;
+               ir_cdep* cdep;
 
                pred0 = get_nodes_block(get_irn_n(block, i));
                for (cdep = find_cdep(pred0); cdep != NULL; cdep = cdep->next) {
@@ -405,10 +403,9 @@ static void init_block_link(ir_node *block, void *env)
 
 /**
  * Daisy-chain all phis in a block
- * If a non-movable node is encountered set the has_pinned flag
+ * If a non-movable node is encountered set the has_pinned flag in its block.
  */
-static void collect_phis(ir_node *node, void *env)
-{
+static void collect_phis(ir_node *node, void *env) {
        (void) env;
 
        if (is_Phi(node)) {
@@ -511,6 +508,7 @@ static void optimise_psis_1(ir_node* psi, void* env)
 {
        ir_node* t;
        ir_node* f;
+       ir_mode* mode;
 
        (void) env;
 
@@ -521,9 +519,10 @@ static void optimise_psis_1(ir_node* psi, void* env)
 
        DB((dbg, LEVEL_3, "Simplify %+F T=%+F F=%+F\n", psi, t, f));
 
-       if (is_Const(t) && is_Const(f)) {
+       mode = get_irn_mode(psi);
+
+       if (is_Const(t) && is_Const(f) && (mode_is_int(mode))) {
                ir_node* block = get_nodes_block(psi);
-               ir_mode* mode  = get_irn_mode(psi);
                ir_node* c     = get_Psi_cond(psi, 0);
                tarval* tv_t = get_Const_tarval(t);
                tarval* tv_f = get_Const_tarval(f);
@@ -539,10 +538,10 @@ static void optimise_psis_1(ir_node* psi, void* env)
 }
 
 
-void opt_if_conv(ir_graph *irg, const opt_if_conv_info_t *params)
+void opt_if_conv(ir_graph *irg, const ir_settings_if_conv_t *params)
 {
        struct obstack obst;
-       opt_if_conv_info_t p;
+       ir_settings_if_conv_t p;
 
        /* get the parameters */
        p = (params != NULL ? *params : default_info);
@@ -557,11 +556,15 @@ void opt_if_conv(ir_graph *irg, const opt_if_conv_info_t *params)
        compute_cdep(irg);
        assure_doms(irg);
 
+       set_using_irn_link(irg);
+
        obstack_init(&obst);
        irg_block_walk_graph(irg, init_block_link, NULL, &obst);
        irg_walk_graph(irg, collect_phis, NULL, NULL);
        irg_block_walk_graph(irg, NULL, if_conv_walker, &p);
 
+       clear_using_irn_link(irg);
+
        local_optimize_graph(irg);
 
        irg_walk_graph(irg, NULL, optimise_psis_0, NULL);
@@ -571,6 +574,9 @@ void opt_if_conv(ir_graph *irg, const opt_if_conv_info_t *params)
 
        obstack_free(&obst, NULL);
 
+       /* TODO: graph might be changed, handle more gracefull */
+       set_irg_outs_inconsistent(irg);
        free_dom(irg);
+
        free_cdep(irg);
 }