/*
- * 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.
*
#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)
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);
}
/**
* 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;
}
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) {
/**
* 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)) {
{
ir_node* t;
ir_node* f;
+ ir_mode* mode;
(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);
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);
obstack_free(&obst, NULL);
+ /* TODO: graph might be changed, handle more gracefull */
+ set_irg_outs_inconsistent(irg);
free_dom(irg);
+
free_cdep(irg);
}