From 5180ebb8d84509469546f2528a59d26585652c6f Mon Sep 17 00:00:00 2001 From: Michael Beck Date: Fri, 18 Mar 2005 18:31:54 +0000 Subject: [PATCH] Remove memory Phi's from keepalives, if the Return is moved up [r5438] --- ir/opt/return.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/ir/opt/return.c b/ir/opt/return.c index 3fa0cd2c9..cc10e1d72 100644 --- a/ir/opt/return.c +++ b/ir/opt/return.c @@ -193,6 +193,7 @@ void normalize_n_returns(ir_graph *irg) ir_node *final = NULL; ir_node **in; ir_node *endbl = get_irg_end_block(irg); + ir_node *end; /* first, link all returns */ n = get_Block_n_cfgpreds(endbl); @@ -224,11 +225,13 @@ void normalize_n_returns(ir_graph *irg) * new Returns), than we check if a newly created Return can be moved even further. * If yes, we simply add it to our work list, else to the final list. */ + end = get_irg_end(irg); n_ret_vals = get_irn_arity(list); in = alloca(sizeof(*in) * n_ret_vals); while (list) { ir_node *ret = list; ir_node *block = get_nodes_block(ret); + ir_node *phiM; list = get_irn_link(ret); --n_rets; @@ -259,6 +262,22 @@ void normalize_n_returns(ir_graph *irg) ++n_finals; } } + + /* + * if the memory of the old Return is a PhiM, remove it + * from the keep-alives, or it will keep the block which + * will crash the dominator algorithm. + */ + phiM = get_Return_mem(ret); + if (is_Phi(phiM)) { + n = get_End_n_keepalives(end); + for (i = 0; i < n; ++i) { + if (get_End_keepalive(end, i) == phiM) { + set_End_keepalive(end, i, new_r_Bad(irg)); + break; + } + } + } } /* -- 2.20.1