* ---------------------------------------------------------------- */
+#include <string.h>
#include "ircgcons.h"
#include "array.h"
}
-static void clear_link(ir_node * node, void * env) {
+static INLINE void clear_link(ir_node * node, void * env) {
set_irn_link(node, NULL);
}
-
-static inline ir_node * tail(ir_node * node) {
+/*
+static INLINE ir_node * tail(ir_node * node) {
ir_node * link;
for (; (link = get_irn_link(node)); node = link) ;
return node;
}
-
+*/
/* Call-Operationen an die "link"-Liste von "call_tail" anhängen (und
* "call_tail" aktualisieren), Proj-Operationen in die Liste ihrer Definition
ir_graph * irg = get_irp_irg(i);
ir_node * start = get_irg_start(irg);
ir_node * end = get_irg_end(irg);
+ current_ir_graph = irg;
assert(irg && start);
/* Die speziellen Parameter der Start-Operation extra verlinken,
* auch wenn sie nicht im intraprozeduralen Graphen erreichbar
link(start, get_irg_frame(irg));
link(start, get_irg_globals(irg));
/* walk */
- irg_walk_graph(irg, clear_link, (irg_walk_func) collect_phicallproj_walker, &end);
+ irg_walk_graph(irg, clear_link, (irg_walk_func *) collect_phicallproj_walker, &end);
}
}
}
}
if (n_ret > 0) {
- int n_res = get_method_n_res(get_entity_type(get_irg_ent(irg)));
+ int n_res = get_method_n_ress(get_entity_type(get_irg_ent(irg)));
ir_node ** in = NEW_ARR_F(ir_node *, n_ret);
/* block */
for (i = n_ret - 1; i >= 0; --i) {
if (!mode && get_irn_mode(in[i]) != mode_T)
mode = get_irn_mode(in[i]);
}
- assert(mode); /* @@@ else we must create a Bad node */
- data->res[j] = new_Phi(n_ret, in, mode);
+ if (mode)
+ data->res[j] = new_Phi(n_ret, in, mode);
+ else /* All preds are Bad */
+ data->res[j] = new_Bad();
}
DEL_ARR_F(in);
}
/* Operationen verschieben */
move_phis(post_block, pre_block);
move_nodes(post_block, pre_block, call);
- /* @@@ GL Wer setzt die Laenge des PostBlock cgfpred array auf 1? */
+ /* @@@ GL Wer setzt die Laenge des PostBlock cgfpred array auf 1?
+ GL: na, dieser Befehl... generiert neuen array. */
set_irn_in(post_block, 1, &jmp);
/* Wiederverwendete Daten initialisieren. */
data[i] = get_entity_link(callees[i]);
}
+ /*
+ * Set flag to suppress verifying placement on proper irg:
+ * optimization can return block on other irg.
+ */
+ set_interprocedural_view(1);
+
/* Die interprozeduralen Steuerflussvorgänger des post_block
* bestimmen. */
for (i = 0; i < n_callees; ++i) {
in[i] = new_Unknown();
}
}
+ set_interprocedural_view(0);
+
set_Block_cg_cfgpred_arr(post_block, n_callees, in);
/* Die interprozeduralen Steuerflussvorgänger des except_block
set_irg_current_block(current_ir_graph, pre_block);
set_irn_n(except_block, 0, new_Proj(call, mode_X, 1));
set_irg_current_block(current_ir_graph, post_block);
+
+ /*
+ * Set flag to suppress verifying placement on proper irg:
+ * optimization can return block on other irg.
+ */
+ set_interprocedural_view(1);
+
for (i = 0; i < n_callees; ++i) {
entity * callee = get_Call_callee(call, i);
if (data[i]) { /* explicit */
set_Block_cg_cfgpred_arr(except_block, n_callees, in);
}
+ set_interprocedural_view(0);
+
/* Diesen Vorgänger in den Start-Blöcken der aufgerufenen Methoden
* eintragen. */
set_irg_current_block(current_ir_graph, pre_block);