X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Fircgcons.c;h=4d47d2fd293fe8afac75c04affd3fe0dddb09324;hb=e570f00fb465d212dde403160e97ab45d36d1d7e;hp=a1285f0680ae15b8190b7fd070f18c6a7ec9fe5b;hpb=ab885c915d20539feaf6098531e706bcf2d3c779;p=libfirm diff --git a/ir/ir/ircgcons.c b/ir/ir/ircgcons.c index a1285f068..4d47d2fd2 100644 --- a/ir/ir/ircgcons.c +++ b/ir/ir/ircgcons.c @@ -10,7 +10,9 @@ * Copyright: (c) 2002-2003 Universität Karlsruhe * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE. */ - +#ifdef HAVE_CONFIG_H +# include +#endif #include #include @@ -21,8 +23,10 @@ #include "ircons.h" #include "irgmod.h" #include "irgwalk.h" -#include "irflag.h" +#include "irflag_t.h" + +// # define CATE_jni /* Datenstruktur für jede Methode */ typedef struct { @@ -59,8 +63,10 @@ static void caller_init(int arr_length, entity ** free_methods) { entity * ent = get_Call_callee(call, j); if (ent) { irg_data_t * data = get_entity_link(ent); +# ifndef CATE_jni assert(get_entity_irg(ent) && data); ++data->count; +# endif /* ndef CATE_jni */ } } } @@ -156,7 +162,7 @@ static ir_node * exchange_proj(ir_node * proj) { /* Echt neue Block-Operation erzeugen. CSE abschalten! */ static ir_node * create_Block(int n, ir_node ** in) { /* Turn off optimizations so that blocks are not merged again. */ - int rem_opt = get_optimize(); + int rem_opt = get_opt_optimize(); ir_node * block; set_optimize(0); block = new_Block(n, in); @@ -169,6 +175,18 @@ static void prepare_irg_end(ir_graph * irg, irg_data_t * data); static void prepare_irg_end_except(ir_graph * irg, irg_data_t * data); +/* If we use new_Unknown we get the Unknown of a graph. This can + * cause cycles we don't want to see, as Unknwon is in the Start Block + * or the procedure. Use unknown of outermost irg where the start + * block has no predecessors. */ +static INLINE ir_node *get_cg_Unknown(ir_mode *m) { + assert((get_Block_n_cfgpreds(get_irg_start_block(get_irp_main_irg())) == 1) && + (get_nodes_block(get_Block_cfgpred(get_irg_start_block(get_irp_main_irg()), 0)) == + get_irg_start_block(get_irp_main_irg()))); + return new_r_Unknown(get_irp_main_irg(), m); +} + + /* IRG vorbereiten. Proj-Operationen der Start-Operation in Filter-Operationen * umwandeln. Die künstlichen Steuerzusammenflüsse EndReg und EndExcept * einfügen. An der Start-Operation hängt nach dem Aufruf eine Liste der @@ -218,10 +236,10 @@ static void prepare_irg(ir_graph * irg, irg_data_t * data) { /* Unbekannten Aufrufer sofort eintragen. */ if (data->open) { - set_Block_cg_cfgpred(start_block, 0, new_Unknown()); + set_Block_cg_cfgpred(start_block, 0, get_cg_Unknown(mode_X)); for (proj = get_irn_link(get_irg_start(irg)); proj; proj = get_irn_link(proj)) { if (get_irn_op(proj) == op_Filter) { - set_Filter_cg_pred(proj, 0, new_Unknown()); + set_Filter_cg_pred(proj, 0, get_cg_Unknown(get_irn_mode(proj))); } } data->count = 1; @@ -382,6 +400,8 @@ static void move_phis(ir_node * from_block, ir_node * to_block) { * Verschiebe ebenfalls die Projs aus diesen Operationen. */ static void move_nodes(ir_node * from_block, ir_node * to_block, ir_node * node) { int i; + ir_node *proj; + for (i = get_irn_arity(node) - 1; i >= 0; --i) { ir_node * pred = get_irn_n(node, i); if (get_nodes_Block(pred) == from_block) { @@ -391,7 +411,7 @@ static void move_nodes(ir_node * from_block, ir_node * to_block, ir_node * node) set_nodes_Block(node, to_block); /* Move projs of this node. */ - ir_node *proj = get_irn_link(node); + proj = get_irn_link(node); for (; proj; proj = skip_Id(get_irn_link(proj))) { if (get_irn_op(proj) != op_Proj && get_irn_op(proj) != op_Filter) continue; if ((get_nodes_Block(proj) == from_block) && (skip_Proj(get_irn_n(proj, 0)) == node)) @@ -426,13 +446,13 @@ static void construct_start(entity * caller, entity * callee, /* "frame_base" wird nur durch Unknown dargestellt. Man kann ihn aber * auch explizit darstellen, wenn sich daraus Vorteile für die * Datenflussanalyse ergeben. */ - set_Filter_cg_pred(filter, data->count, new_Unknown()); + set_Filter_cg_pred(filter, data->count, get_cg_Unknown(get_irn_mode(filter))); break; case pns_globals: /* "globals" wird nur durch Unknown dargestellt. Man kann ihn aber auch * explizit darstellen, wenn sich daraus Vorteile für die * Datenflussanalyse ergeben. */ - set_Filter_cg_pred(filter, data->count, new_Unknown()); + set_Filter_cg_pred(filter, data->count, get_cg_Unknown(get_irn_mode(filter))); break; default: /* not reached */ @@ -459,7 +479,7 @@ static void fill_mem(int length, irg_data_t * data[], ir_node * in[]) { in[i] = new_Bad(); } } else { /* unknown */ - in[i] = new_Unknown(); + in[i] = get_cg_Unknown(mode_M); } } } @@ -477,7 +497,7 @@ static void fill_except_mem(int length, irg_data_t * data[], ir_node * in[]) { in[i] = new_Bad(); } } else { /* unknown */ - in[i] = new_Unknown(); + in[i] = get_cg_Unknown(mode_M); } } } @@ -485,7 +505,7 @@ static void fill_except_mem(int length, irg_data_t * data[], ir_node * in[]) { /* Abhängigkeiten für ein Ergebnis über alle aufgerufenen Methoden * bestimmen. */ -static void fill_result(int pos, int length, irg_data_t * data[], ir_node * in[]) { +static void fill_result(int pos, int length, irg_data_t * data[], ir_node * in[], ir_mode *m) { int i; for (i = 0; i < length; ++i) { if (data[i]) { /* explicit */ @@ -495,7 +515,7 @@ static void fill_result(int pos, int length, irg_data_t * data[], ir_node * in[] in[i] = new_Bad(); } } else { /* unknown */ - in[i] = new_Unknown(); + in[i] = get_cg_Unknown(m); } } } @@ -598,7 +618,7 @@ static void construct_call(ir_node * call) { in[i] = new_Bad(); } } else { /* unknown */ - in[i] = new_Unknown(); + in[i] = get_cg_Unknown(mode_X); } } set_interprocedural_view(0); @@ -648,7 +668,7 @@ static void construct_call(ir_node * call) { in[i] = new_Bad(); } } else { /* unknown */ - in[i] = new_Unknown(); + in[i] = get_cg_Unknown(mode_X); } } @@ -686,8 +706,10 @@ static void construct_call(ir_node * call) { if (skip_Proj(get_Proj_pred(proj)) != call) continue; if (get_Proj_pred(proj) == call) { if (get_Proj_proj(proj) == 0) { /* memory */ + ir_node * filter; + set_nodes_Block(proj, post_block); - ir_node * filter = exchange_proj(proj); + filter = exchange_proj(proj); /* filter in die Liste der Phis aufnehmen */ if (get_irn_link(filter) == NULL) { /* note CSE */ set_irn_link(filter, get_irn_link(post_block)); @@ -700,8 +722,9 @@ static void construct_call(ir_node * call) { } else if (get_Proj_proj(proj) == 2) { /* results */ /* nothing */ } else if (get_Proj_proj(proj) == 3) { /* except_mem */ + ir_node * filter; + set_nodes_Block(proj, post_block); - ir_node * filter; assert(except_block); set_irg_current_block(current_ir_graph, except_block); filter = exchange_proj(proj); @@ -717,15 +740,17 @@ static void construct_call(ir_node * call) { assert(0 && "not reached"); } } else { /* result */ + ir_node * filter; + assert(is_Proj(get_Proj_pred(proj)) && get_Proj_pred(get_Proj_pred(proj)) == call); set_nodes_Block(proj, post_block); - ir_node * filter = exchange_proj(proj); + filter = exchange_proj(proj); /* filter in die Liste der Phis aufnehmen */ if (get_irn_link(filter) == NULL) { /* not CSE */ set_irn_link(filter, get_irn_link(post_block)); set_irn_link(post_block, filter); } - fill_result(get_Proj_proj(filter), n_callees, data, in); + fill_result(get_Proj_proj(filter), n_callees, data, in, get_irn_mode(filter)); set_Filter_cg_pred_arr(filter, n_callees, in); } } @@ -811,5 +836,6 @@ void cg_destruct(void) { irg_walk_graph(irg, destruct_walker, clear_link, NULL); set_irg_frame(irg, skip_nop(get_irg_frame(irg))); set_irg_globals(irg, skip_nop(get_irg_globals(irg))); + set_irg_callee_info_state(irg, irg_callee_info_none); } }