X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Fircgcons.c;h=4d47d2fd293fe8afac75c04affd3fe0dddb09324;hb=e570f00fb465d212dde403160e97ab45d36d1d7e;hp=46294036ab7831b10326ac65e7f107634f49d097;hpb=0b520909cf43a2952c6a5ee64e03c2d06cad4dee;p=libfirm diff --git a/ir/ir/ircgcons.c b/ir/ir/ircgcons.c index 46294036a..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; @@ -428,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 */ @@ -461,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); } } } @@ -479,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); } } } @@ -487,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 */ @@ -497,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); } } } @@ -600,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); @@ -650,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); } } @@ -732,7 +750,7 @@ static void construct_call(ir_node * call) { 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); } } @@ -818,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); } }