*/
#include "config.h"
+#include "iroptimize.h"
#include "irflag.h"
#include "irdom.h"
#include "irouts.h"
char first_iter; /**< non-zero for first iteration */
} pre_env;
-static pset *value_table;
static ir_nodemap_t value_map;
/** The debug module handle. */
{
if (is_Proj(v)) {
ir_node *pred = get_Proj_pred(v);
- ir_node *v_pred = identify_remember(value_table, pred);
+ ir_node *v_pred = identify_remember(pred);
if (v_pred != pred) {
/* must create a new value here */
v = new_r_Proj(v_pred, get_irn_mode(v), get_Proj_proj(v));
}
}
- v = identify_remember(value_table, v);
+ v = identify_remember(v);
ir_nodemap_insert(&value_map, e, v);
return v;
} /* add */
*/
static ir_node *lookup(ir_node *e)
{
- ir_node *value = ir_nodemap_get(&value_map, e);
+ ir_node *value = (ir_node*)ir_nodemap_get(&value_map, e);
if (value != NULL)
- return identify_remember(value_table, value);
+ return identify_remember(value);
return NULL;
-} /* lookup */
+}
/**
* Return the block info of a block.
*/
static block_info *get_block_info(ir_node *block)
{
- return get_irn_link(block);
-} /* get_block_info */
+ return (block_info*)get_irn_link(block);
+}
/**
* Allocate a block info for a block.
return 0;
mode = get_irn_mode(n);
if (!mode_is_data(mode)) {
- if (! is_Div(n) && ! is_Mod(n) && ! is_DivMod(n))
+ if (! is_Div(n) && ! is_Mod(n))
return 0;
if (! is_NoMem(get_fragile_op_mem(n)))
return 0;
* @param txt a text to describe the set
* @param block the owner block of the set
*/
-static void dump_value_set(ir_valueset_t *set, char *txt, ir_node *block)
+static void dump_value_set(ir_valueset_t *set, const char *txt, ir_node *block)
{
ir_valueset_iterator_t iter;
ir_node *value, *expr;
#endif /* DEBUG_libfirm */
/**
- * Topological walker. Allocates block info for every block and place nodes in topological
- * order into the nodes set.
+ * Topological walker. Allocates block info for every block and place nodes in
+ * topological order into the nodes set.
*/
static void topo_walker(ir_node *irn, void *ctx)
{
- pre_env *env = ctx;
+ pre_env *env = (pre_env*)ctx;
ir_node *block;
block_info *info;
ir_node *value;
info = get_block_info(block);
ir_valueset_insert(info->exp_gen, value, irn);
-} /* topo_walker */
+}
/**
* Computes Avail_out(block):
*/
static void compute_avail_top_down(ir_node *block, void *ctx)
{
- pre_env *env = ctx;
+ pre_env *env = (pre_env*)ctx;
block_info *dom_info;
block_info *info = get_block_info(block);
ir_node *dom_blk;
value_union(info->avail_out, info->exp_gen);
dump_value_set(info->avail_out, "Avail_out", block);
-} /* compute_avail_top_down */
+}
/**
* check if a node n is clean in block block.
return node;
}
- arity = get_irn_intra_arity(node);
+ arity = get_irn_arity(node);
/* check if the node has at least one Phi predecessor */
for (i = 0; i < arity; ++i) {
- ir_node *pred = get_irn_intra_n(node, i);
+ ir_node *pred = get_irn_n(node, i);
ir_node *leader = lookup(pred);
ir_node *trans;
leader = leader != NULL ? leader : pred;
- trans = ir_valueset_lookup(translated, leader);
+ trans = (ir_node*)ir_valueset_lookup(translated, leader);
if ((trans != NULL && trans != leader) || (is_Phi(leader) && get_nodes_block(leader) == block))
break;
nn = new_ir_node(
get_irn_dbg_info(node),
current_ir_graph,
- NULL,
+ get_nodes_block(node),
get_irn_op(node),
get_irn_mode(node),
arity,
node might depend on that. */
copy_node_attr(current_ir_graph, node, nn);
- set_nodes_block(nn, get_nodes_block(node));
for (i = 0; i < arity; ++i) {
- ir_node *pred = get_irn_intra_n(node, i);
+ ir_node *pred = get_irn_n(node, i);
ir_node *leader = lookup(pred);
ir_node *trans;
leader = leader != NULL ? leader : pred;
- trans = ir_valueset_lookup(translated, leader);
+ trans = (ir_node*)ir_valueset_lookup(translated, leader);
if (trans == NULL)
trans = leader;
*/
static void compute_antic(ir_node *block, void *ctx)
{
- pre_env *env = ctx;
+ pre_env *env = (pre_env*)ctx;
block_info *succ_info;
block_info *info = get_block_info(block);
ir_node *succ, *value, *expr;
*/
static void insert_nodes(ir_node *block, void *ctx)
{
- pre_env *env = ctx;
+ pre_env *env = (pre_env*)ctx;
ir_node *value, *expr, *idom, *first_s, *worklist;
block_info *curr_info, *idom_info;
- int pos, arity = get_irn_intra_arity(block);
+ int pos, arity = get_irn_arity(block);
int all_same, by_some, updated;
ir_valueset_iterator_t iter;
v_prime = value;
pred_info = get_block_info(pred_blk);
- e_dprime = ir_valueset_lookup(pred_info->avail_out, v_prime);
+ e_dprime = (ir_node*)ir_valueset_lookup(pred_info->avail_out, v_prime);
if (e_dprime == NULL) {
pred_info->avail = e_prime;
/* ignore bad blocks. */
if (is_Bad(pred_blk)) {
- in[pos] = new_Bad();
+ ir_graph *irg = get_irn_irg(pred_blk);
+ in[pos] = new_r_Bad(irg, mode_X);
continue;
}
*/
static void eliminate(ir_node *irn, void *ctx)
{
- pre_env *env = ctx;
+ pre_env *env = (pre_env*)ctx;
- if (is_no_Block(irn)) {
+ if (!is_Block(irn)) {
ir_node *block = get_nodes_block(irn);
block_info *bl = get_block_info(block);
ir_node *value = lookup(irn);
if (value != NULL) {
- ir_node *expr = ir_valueset_lookup(bl->avail_out, value);
+ ir_node *expr = (ir_node*)ir_valueset_lookup(bl->avail_out, value);
if (expr != NULL && expr != irn) {
elim_pair *p = OALLOC(env->obst, elim_pair);
int i;
ir_node *res = NULL;
- for (i = get_irn_intra_arity(p->new_node) - 1; i >= 0; --i) {
+ for (i = get_irn_arity(p->new_node) - 1; i >= 0; --i) {
ir_node *pred = get_irn_n(p->new_node, i);
if (pred != p->old_node) {
/* edges will crash if enabled due to our allocate on other obstack trick */
edges_deactivate(irg);
- value_table = new_identities();
+ new_identities(irg);
ir_nodemap_init(&value_map);
obstack_init(&obst);
a_env.end_block = get_irg_end_block(irg);
a_env.pairs = NULL;
- /* Move Proj's into the same block as their args,
- else we would assign the result to wrong blocks */
- normalize_proj_nodes(irg);
-
/* critical edges MUST be removed */
remove_critical_cf_edges(irg);
if (bl_info->new_set)
ir_valueset_del(bl_info->new_set);
}
- del_identities(value_table);
ir_nodemap_destroy(&value_map);
obstack_free(&obst, NULL);
- value_table = NULL;
/* pin the graph again: This is needed due to the use of set_opt_global_cse(1) */
set_irg_pinned(irg, op_pin_state_pinned);
restore_optimization_state(&state);
-
- if (a_env.pairs) {
- set_irg_outs_inconsistent(irg);
- set_irg_loopinfo_inconsistent(irg);
- }
} /* do_gvn_pre */
/* Creates an ir_graph pass for do_gvn_pre. */