projects
/
libfirm
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
cfopt must maintain Bad structure
[libfirm]
/
ir
/
opt
/
ldstopt.c
diff --git
a/ir/opt/ldstopt.c
b/ir/opt/ldstopt.c
index
f69fbf6
..
6fd5f49
100644
(file)
--- a/
ir/opt/ldstopt.c
+++ b/
ir/opt/ldstopt.c
@@
-215,7
+215,7
@@
static void collect_nodes(ir_node *node, void *env)
if (is_Proj(proj)) {
pred = get_Proj_pred(proj);
if (is_Proj(proj)) {
pred = get_Proj_pred(proj);
- is_exc =
get_Proj_proj(proj) == pn_Generic_X_except
;
+ is_exc =
is_x_except_Proj(proj)
;
}
/* ignore Bad predecessors, they will be removed later */
}
/* ignore Bad predecessors, they will be removed later */
@@
-913,7
+913,7
@@
static int try_load_after_store(ir_node *load,
/* no exception */
if (info->projs[pn_Load_X_except]) {
ir_graph *irg = get_irn_irg(load);
/* no exception */
if (info->projs[pn_Load_X_except]) {
ir_graph *irg = get_irn_irg(load);
- exchange( info->projs[pn_Load_X_except], new_r_Bad(irg));
+ exchange( info->projs[pn_Load_X_except], new_r_Bad(irg
, mode_X
));
res |= CF_CHANGED;
}
if (info->projs[pn_Load_X_regular]) {
res |= CF_CHANGED;
}
if (info->projs[pn_Load_X_regular]) {
@@
-1019,7
+1019,7
@@
static unsigned follow_Mem_chain(ir_node *load, ir_node *curr)
/* no exception */
if (info->projs[pn_Load_X_except]) {
ir_graph *irg = get_irn_irg(load);
/* no exception */
if (info->projs[pn_Load_X_except]) {
ir_graph *irg = get_irn_irg(load);
- exchange(info->projs[pn_Load_X_except], new_r_Bad(irg));
+ exchange(info->projs[pn_Load_X_except], new_r_Bad(irg
, mode_X
));
res |= CF_CHANGED;
}
if (info->projs[pn_Load_X_regular]) {
res |= CF_CHANGED;
}
if (info->projs[pn_Load_X_regular]) {
@@
-1156,7
+1156,7
@@
static unsigned optimize_load(ir_node *load)
/* no exception, clear the info field as it might be checked later again */
if (info->projs[pn_Load_X_except]) {
ir_graph *irg = get_irn_irg(load);
/* no exception, clear the info field as it might be checked later again */
if (info->projs[pn_Load_X_except]) {
ir_graph *irg = get_irn_irg(load);
- exchange(info->projs[pn_Load_X_except], new_r_Bad(irg));
+ exchange(info->projs[pn_Load_X_except], new_r_Bad(irg
, mode_X
));
info->projs[pn_Load_X_except] = NULL;
res |= CF_CHANGED;
}
info->projs[pn_Load_X_except] = NULL;
res |= CF_CHANGED;
}
@@
-1191,7
+1191,7
@@
static unsigned optimize_load(ir_node *load)
/* we completely replace the load by this value */
if (info->projs[pn_Load_X_except]) {
ir_graph *irg = get_irn_irg(load);
/* we completely replace the load by this value */
if (info->projs[pn_Load_X_except]) {
ir_graph *irg = get_irn_irg(load);
- exchange(info->projs[pn_Load_X_except], new_r_Bad(irg));
+ exchange(info->projs[pn_Load_X_except], new_r_Bad(irg
, mode_X
));
info->projs[pn_Load_X_except] = NULL;
res |= CF_CHANGED;
}
info->projs[pn_Load_X_except] = NULL;
res |= CF_CHANGED;
}
@@
-1480,7
+1480,10
@@
static unsigned optimize_store(ir_node *store)
static unsigned optimize_phi(ir_node *phi, walk_env_t *wenv)
{
int i, n;
static unsigned optimize_phi(ir_node *phi, walk_env_t *wenv)
{
int i, n;
- ir_node *store, *old_store, *ptr, *block, *phi_block, *phiM, *phiD, *exc, *projM;
+ ir_node *store, *ptr, *block, *phi_block, *phiM, *phiD, *exc, *projM;
+#ifdef DO_CACHEOPT
+ ir_node *old_store;
+#endif
ir_mode *mode;
ir_node **inM, **inD, **projMs;
int *idx;
ir_mode *mode;
ir_node **inM, **inD, **projMs;
int *idx;
@@
-1503,16
+1506,14
@@
static unsigned optimize_phi(ir_node *phi, walk_env_t *wenv)
return 0;
store = skip_Proj(projM);
return 0;
store = skip_Proj(projM);
+#ifdef DO_CACHEOPT
old_store = store;
old_store = store;
+#endif
if (!is_Store(store))
return 0;
block = get_nodes_block(store);
if (!is_Store(store))
return 0;
block = get_nodes_block(store);
- /* abort on dead blocks */
- if (is_Block_dead(block))
- return 0;
-
/* check if the block is post dominated by Phi-block
and has no exception exit */
bl_info = (block_info_t*)get_irn_link(block);
/* check if the block is post dominated by Phi-block
and has no exception exit */
bl_info = (block_info_t*)get_irn_link(block);
@@
-1548,10
+1549,7
@@
static unsigned optimize_phi(ir_node *phi, walk_env_t *wenv)
if (exc != info->exc_block)
return 0;
if (exc != info->exc_block)
return 0;
- /* abort on dead blocks */
block = get_nodes_block(pred);
block = get_nodes_block(pred);
- if (is_Block_dead(block))
- return 0;
/* check if the block is post dominated by Phi-block
and has no exception exit. Note that block must be different from
/* check if the block is post dominated by Phi-block
and has no exception exit. Note that block must be different from
@@
-1821,7
+1819,6
@@
static unsigned hash_cache_entry(const avail_entry_t *entry)
static void move_loads_out_of_loops(scc *pscc, loop_env *env)
{
ir_node *phi, *load, *next, *other, *next_other;
static void move_loads_out_of_loops(scc *pscc, loop_env *env)
{
ir_node *phi, *load, *next, *other, *next_other;
- ir_entity *ent;
int j;
phi_entry *phi_list = NULL;
set *avail;
int j;
phi_entry *phi_list = NULL;
set *avail;
@@
-1877,7
+1874,6
@@
static void move_loads_out_of_loops(scc *pscc, loop_env *env)
/* for now, we can only move Load(Global) */
if (! is_Global(ptr))
continue;
/* for now, we can only move Load(Global) */
if (! is_Global(ptr))
continue;
- ent = get_Global_entity(ptr);
load_mode = get_Load_mode(load);
for (other = pscc->head; other != NULL; other = next_other) {
node_entry *ne = get_irn_ne(other, env);
load_mode = get_Load_mode(load);
for (other = pscc->head; other != NULL; other = next_other) {
node_entry *ne = get_irn_ne(other, env);
@@
-1926,7
+1922,12
@@
static void move_loads_out_of_loops(scc *pscc, loop_env *env)
ninfo = get_ldst_info(irn, phase_obst(&env->ph));
ninfo->projs[pn_Load_M] = mem = new_r_Proj(irn, mode_M, pn_Load_M);
ninfo = get_ldst_info(irn, phase_obst(&env->ph));
ninfo->projs[pn_Load_M] = mem = new_r_Proj(irn, mode_M, pn_Load_M);
- set_Phi_pred(phi, pos, mem);
+ if (res == NULL) {
+ /* irn is from cache, so do not set phi pred again.
+ * There might be other Loads between phi and irn already.
+ */
+ set_Phi_pred(phi, pos, mem);
+ }
ninfo->projs[pn_Load_res] = new_r_Proj(irn, load_mode, pn_Load_res);
}
ninfo->projs[pn_Load_res] = new_r_Proj(irn, load_mode, pn_Load_res);
}
@@
-2285,8
+2286,8
@@
int optimize_load_store(ir_graph *irg)
/* Handle graph state */
if (env.changes) {
/* Handle graph state */
if (env.changes) {
- set_irg_outs_inconsistent(irg);
set_irg_entity_usage_state(irg, ir_entity_usage_not_computed);
set_irg_entity_usage_state(irg, ir_entity_usage_not_computed);
+ edges_deactivate(irg);
}
if (env.changes & CF_CHANGED) {
}
if (env.changes & CF_CHANGED) {