* ---------------------------------------------------------------- */
+#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
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) {
/* res */
data->res = NEW_ARR_F(ir_node *, n_res);
for (j = n_res - 1; j >= 0; --j) {
+ ir_mode *mode = NULL;
+ /* In[0] could be a Bad node with wrong mode. */
for (i = n_ret - 1; i >= 0; --i) {
in[i] = get_Return_res(ret_arr[i], j);
+ if (!mode && get_irn_mode(in[i]) != mode_T)
+ mode = get_irn_mode(in[i]);
}
- /* Has in[0] always the valid mode? */
- data->res[j] = new_Phi(n_ret, in, get_irn_mode(in[0]));
+ 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);
}
/* Abhängigkeiten vom Start-Block und den Filter-Operationen im
* Start-Block auf den Aufrufer hinzufügen. */
-static void construct_start(entity * caller, entity * callee, ir_node * call, ir_node * exec) {
+static void construct_start(entity * caller, entity * callee,
+ ir_node * call, ir_node * exec) {
irg_data_t * data = get_entity_link(callee);
ir_graph * irg = get_entity_irg(callee);
ir_node * start = get_irg_start(irg), * filter;
+
+ assert(irg);
+ assert(get_entity_peculiarity(callee) == existent); /* Else data is not initalized. */
+ assert((0 <= data->count) &&
+ (data->count < get_Block_cg_n_cfgpreds(get_nodes_Block(start))));
set_Block_cg_cfgpred(get_nodes_Block(start), data->count, exec);
for (filter = get_irn_link(start); filter; filter = get_irn_link(filter)) {
if (get_irn_op(filter) != op_Filter) continue;
/* post_block kann bereits interprozedurale Steuerflussvorgänger
* besitzen. Diese müssen dann auch noch für den pre_block gesetzt werden. */
if (get_Block_cg_cfgpred_arr(post_block)) {
- set_Block_cg_cfgpred_arr(pre_block, get_Block_cg_n_cfgpreds(post_block), get_Block_cg_cfgpred_arr(post_block));
+ set_Block_cg_cfgpred_arr(pre_block, get_Block_cg_n_cfgpreds(post_block),
+ get_Block_cg_cfgpred_arr(post_block));
remove_Block_cg_cfgpred_arr(post_block);
}
/* 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. */