X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fopt%2Fifconv.c;h=2492e8546d2c6bf7d64df75b7320d53eb6b9743d;hb=f600524c363556c785b85c0dff8792d04f73e252;hp=446d7a4684395603f383eba9a0fac9cf9bbcafaa;hpb=e7ba741cdd9599ce05d7989bff60a1c6137ee0b5;p=libfirm diff --git a/ir/opt/ifconv.c b/ir/opt/ifconv.c index 446d7a468..2492e8546 100644 --- a/ir/opt/ifconv.c +++ b/ir/opt/ifconv.c @@ -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) @@ -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; } @@ -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); @@ -557,11 +556,15 @@ void opt_if_conv(ir_graph *irg, const ir_settings_if_conv_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 ir_settings_if_conv_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); }