return;
++ctx->n_calls_removed_SymConst;
}
- else if (get_irn_op(ptr) == op_Sel &&
+ else if (is_Sel(ptr) &&
get_irg_callee_info_state(current_ir_graph) == irg_callee_info_consistent) {
/* If all possible callees are real functions, we can remove the memory edge. */
int i, n_callees = get_Call_n_callees(call);
return;
for (i = 0; i < n_callees; ++i) {
ent = get_Call_callee(call, i);
+ if (ent == unknown_entity) {
+ /* we don't know which entity is called here */
+ return;
+ }
if ((get_entity_additional_properties(ent) & mtp_property_const) == 0)
- return;
+ return;
}
++ctx->n_calls_removed_Sel;
}
switch (get_Proj_proj(node)) {
case pn_Call_M_regular: {
ir_node *old_mem = get_irn_link(call);
- if (old_mem)
+ if (old_mem) {
exchange(node, old_mem);
+ ctx->changed = 1;
+ }
} break;
case pn_Call_X_except:
case pn_Call_M_except:
exchange(node, new_Bad());
+ ctx->changed = 1;
break;
default: ;
}
int change;
unsigned num_pure = 0;
- if (! get_opt_real_func_call())
+ if (! get_opt_real_function_call())
return;
/* first step: detect, which functions are const, i.e. do NOT touch any memory */
irg_walk_graph(irg, NULL, rem_mem_from_const_fkt_calls, &ctx);
if (ctx.changed) {
- /* changes were done */
+ /* changes were done including exception edges */
set_irg_outs_inconsistent(irg);
+ set_irg_doms_inconsistent(irg);
set_irg_loopinfo_state(current_ir_graph, loopinfo_cf_inconsistent);
}
}