X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fopt%2Fifconv.c;h=2492e8546d2c6bf7d64df75b7320d53eb6b9743d;hb=f600524c363556c785b85c0dff8792d04f73e252;hp=07dd0abbd0ca7b356f959779ced35bfd62cb2968;hpb=5f4a7559628fca2ee71c641e1eb14e8ee2e9c740;p=libfirm diff --git a/ir/opt/ifconv.c b/ir/opt/ifconv.c index 07dd0abbd..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) @@ -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); }