projects
/
libfirm
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
convopt: fix potential bug with modulo shifts, improve cost calculation for optimizab...
[libfirm]
/
ir
/
opt
/
gvn_pre.c
diff --git
a/ir/opt/gvn_pre.c
b/ir/opt/gvn_pre.c
index
58f7efa
..
996eb34
100644
(file)
--- a/
ir/opt/gvn_pre.c
+++ b/
ir/opt/gvn_pre.c
@@
-27,6
+27,7
@@
*/
#include "config.h"
*/
#include "config.h"
+#include "iroptimize.h"
#include "irflag.h"
#include "irdom.h"
#include "irouts.h"
#include "irflag.h"
#include "irdom.h"
#include "irouts.h"
@@
-82,7
+83,6
@@
typedef struct pre_env {
char first_iter; /**< non-zero for first iteration */
} pre_env;
char first_iter; /**< non-zero for first iteration */
} pre_env;
-static pset *value_table;
static ir_nodemap_t value_map;
/** The debug module handle. */
static ir_nodemap_t value_map;
/** The debug module handle. */
@@
-116,14
+116,14
@@
static ir_node *add(ir_node *e, ir_node *v)
{
if (is_Proj(v)) {
ir_node *pred = get_Proj_pred(v);
{
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));
}
}
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(v
alue_table, v
);
+ v = identify_remember(v);
ir_nodemap_insert(&value_map, e, v);
return v;
} /* add */
ir_nodemap_insert(&value_map, e, v);
return v;
} /* add */
@@
-138,11
+138,11
@@
static ir_node *add(ir_node *e, ir_node *v)
*/
static ir_node *lookup(ir_node *e)
{
*/
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)
if (value != NULL)
- return identify_remember(value
_table, value
);
+ return identify_remember(value);
return NULL;
return NULL;
-}
/* lookup */
+}
/**
* Return the block info of a block.
/**
* Return the block info of a block.
@@
-151,8
+151,8
@@
static ir_node *lookup(ir_node *e)
*/
static block_info *get_block_info(ir_node *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.
/**
* Allocate a block info for a block.
@@
-191,7
+191,7
@@
static int is_nice_value(ir_node *n)
return 0;
mode = get_irn_mode(n);
if (!mode_is_data(mode)) {
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;
return 0;
if (! is_NoMem(get_fragile_op_mem(n)))
return 0;
@@
-207,7
+207,7
@@
static int is_nice_value(ir_node *n)
* @param txt a text to describe the set
* @param block the owner block of the set
*/
* @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, c
onst c
har *txt, ir_node *block)
{
ir_valueset_iterator_t iter;
ir_node *value, *expr;
{
ir_valueset_iterator_t iter;
ir_node *value, *expr;
@@
-232,12
+232,12
@@
static void dump_value_set(ir_valueset_t *set, char *txt, ir_node *block)
#endif /* DEBUG_libfirm */
/**
#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)
{
*/
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;
ir_node *block;
block_info *info;
ir_node *value;
@@
-264,7
+264,7
@@
static void topo_walker(ir_node *irn, void *ctx)
info = get_block_info(block);
ir_valueset_insert(info->exp_gen, value, irn);
info = get_block_info(block);
ir_valueset_insert(info->exp_gen, value, irn);
-}
/* topo_walker */
+}
/**
* Computes Avail_out(block):
/**
* Computes Avail_out(block):
@@
-281,7
+281,7
@@
static void topo_walker(ir_node *irn, void *ctx)
*/
static void compute_avail_top_down(ir_node *block, void *ctx)
{
*/
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;
block_info *dom_info;
block_info *info = get_block_info(block);
ir_node *dom_blk;
@@
-307,7
+307,7
@@
static void compute_avail_top_down(ir_node *block, void *ctx)
value_union(info->avail_out, info->exp_gen);
dump_value_set(info->avail_out, "Avail_out", block);
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.
/**
* check if a node n is clean in block block.
@@
-372,16
+372,16
@@
static ir_node *phi_translate(ir_node *node, ir_node *block, int pos, ir_valuese
return node;
}
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) {
/* 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;
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;
if ((trans != NULL && trans != leader) || (is_Phi(leader) && get_nodes_block(leader) == block))
break;
@@
-394,23
+394,22
@@
static ir_node *phi_translate(ir_node *node, ir_node *block, int pos, ir_valuese
nn = new_ir_node(
get_irn_dbg_info(node),
current_ir_graph,
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,
get_irn_in(node));
/* We need the attribute copy here, because the Hash value of a
node might depend on that. */
get_irn_op(node),
get_irn_mode(node),
arity,
get_irn_in(node));
/* We need the attribute copy here, because the Hash value of a
node might depend on that. */
- copy_node_attr(node, nn);
+ copy_node_attr(
current_ir_graph,
node, nn);
- set_nodes_block(nn, get_nodes_block(node));
for (i = 0; i < arity; ++i) {
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;
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;
if (trans == NULL)
trans = leader;
@@
-431,7
+430,7
@@
static ir_node *phi_translate(ir_node *node, ir_node *block, int pos, ir_valuese
*/
static void compute_antic(ir_node *block, void *ctx)
{
*/
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;
block_info *succ_info;
block_info *info = get_block_info(block);
ir_node *succ, *value, *expr;
@@
-537,10
+536,10
@@
static void compute_antic(ir_node *block, void *ctx)
*/
static void insert_nodes(ir_node *block, void *ctx)
{
*/
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;
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;
int all_same, by_some, updated;
ir_valueset_iterator_t iter;
@@
-604,7
+603,7
@@
static void insert_nodes(ir_node *block, void *ctx)
v_prime = value;
pred_info = get_block_info(pred_blk);
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;
if (e_dprime == NULL) {
pred_info->avail = e_prime;
@@
-640,7
+639,8
@@
static void insert_nodes(ir_node *block, void *ctx)
/* ignore bad blocks. */
if (is_Bad(pred_blk)) {
/* 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;
}
continue;
}
@@
-660,7
+660,7
@@
static void insert_nodes(ir_node *block, void *ctx)
mode,
get_irn_arity(pred),
get_irn_in(pred) + 1);
mode,
get_irn_arity(pred),
get_irn_in(pred) + 1);
- copy_node_attr(pred, nn);
+ copy_node_attr(
current_ir_graph,
pred, nn);
DB((dbg, LEVEL_1, "New node %+F in block %+F created\n", nn, pred_blk));
proj_pred = nn;
DB((dbg, LEVEL_1, "New node %+F in block %+F created\n", nn, pred_blk));
proj_pred = nn;
@@
-673,7
+673,7
@@
static void insert_nodes(ir_node *block, void *ctx)
mode,
get_irn_arity(e_prime),
get_irn_in(e_prime) + 1);
mode,
get_irn_arity(e_prime),
get_irn_in(e_prime) + 1);
- copy_node_attr(e_prime, nn);
+ copy_node_attr(
current_ir_graph,
e_prime, nn);
if (proj_pred != NULL) {
set_Proj_pred(nn, proj_pred);
}
if (proj_pred != NULL) {
set_Proj_pred(nn, proj_pred);
}
@@
-716,15
+716,15
@@
static void insert_nodes(ir_node *block, void *ctx)
*/
static void eliminate(ir_node *irn, void *ctx)
{
*/
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 *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);
if (expr != NULL && expr != irn) {
elim_pair *p = OALLOC(env->obst, elim_pair);
@@
-762,7
+762,7
@@
static void eliminate_nodes(elim_pair *pairs)
int i;
ir_node *res = NULL;
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) {
ir_node *pred = get_irn_n(p->new_node, i);
if (pred != p->old_node) {
@@
-806,7
+806,7
@@
void do_gvn_pre(ir_graph *irg)
/* edges will crash if enabled due to our allocate on other obstack trick */
edges_deactivate(irg);
/* 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);
ir_nodemap_init(&value_map);
obstack_init(&obst);
@@
-816,10
+816,6
@@
void do_gvn_pre(ir_graph *irg)
a_env.end_block = get_irg_end_block(irg);
a_env.pairs = NULL;
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);
/* critical edges MUST be removed */
remove_critical_cf_edges(irg);
@@
-890,19
+886,12
@@
void do_gvn_pre(ir_graph *irg)
if (bl_info->new_set)
ir_valueset_del(bl_info->new_set);
}
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);
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);
/* 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. */
} /* do_gvn_pre */
/* Creates an ir_graph pass for do_gvn_pre. */