get_irn_mode(get_Store_value(pred)),
ptr, load_mode);
/* if the might be an alias, we cannot pass this Store */
- if (rel != no_alias)
+ if (rel != ir_no_alias)
break;
pred = skip_Proj(get_Store_mem(pred));
} else if (is_Load(pred)) {
} else {
compound_graph_path *path = get_accessed_path(ptr);
- if (path) {
+ if (path && !ent->has_initializer) {
ir_node *c;
assert(is_proper_compound_graph_path(path, get_compound_graph_path_length(path)-1));
get_nodes_MacroBlock(pred) == mblk &&
is_completely_overwritten(get_irn_mode(get_Store_value(pred)), mode)) {
/*
- * a Store after a Store in the same block -- a write after write.
+ * a Store after a Store in the same MacroBlock -- a write after write.
* We may remove the first Store, if it does not have an exception handler.
*
* TODO: What, if both have the same exception handler ???
} else if (is_Load(pred) && get_Load_ptr(pred) == ptr &&
value == pred_info->projs[pn_Load_res]) {
/*
- * a Store of a value after a Load -- a write after read.
- * We may remove the second Store, if it does not have an exception handler.
+ * a Store of a value just loaded from the same address
+ * -- a write after read.
+ * We may remove the Store, if it does not have an exception
+ * handler.
*/
if (! info->projs[pn_Store_X_except]) {
DBG_OPT_WAR(store, pred);
get_irn_mode(get_Store_value(pred)),
ptr, mode);
/* if the might be an alias, we cannot pass this Store */
- if (rel != no_alias)
+ if (rel != ir_no_alias)
break;
pred = skip_Proj(get_Store_mem(pred));
} else if (get_irn_op(pred) == op_Load) {
+ ir_alias_relation rel = get_alias_relation(
+ current_ir_graph, get_Load_ptr(pred), get_Load_mode(pred),
+ ptr, mode);
+ if (rel != ir_no_alias)
+ break;
+
pred = skip_Proj(get_Load_mem(pred));
} else {
/* follow only Load chains */
/* follow the memory chain as long as there are only Loads */
INC_MASTER();
+
return follow_Mem_chain_for_Store(store, skip_Proj(mem));
} /* optimize_store */
get_irn_mode(get_Store_value(other)),
ptr, load_mode);
/* if the might be an alias, we cannot pass this Store */
- if (rel != no_alias)
+ if (rel != ir_no_alias)
break;
}
/* only pure Calls are allowed here, so ignore them */