From: Götz Lindenmaier Date: Wed, 23 Feb 2005 17:04:13 +0000 (+0000) Subject: better state handling X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=4a8e1e93a0641224e54ab8c5d1b84b57da944472;p=libfirm better state handling [r5222] --- diff --git a/ir/ana/irsimpletype.c b/ir/ana/irsimpletype.c index 04c95e31e..b3c6f8a1c 100644 --- a/ir/ana/irsimpletype.c +++ b/ir/ana/irsimpletype.c @@ -172,6 +172,7 @@ static type *find_type_for_node(ir_node *n) { case iro_Sync: case iro_Tuple: case iro_Bad: + case iro_NoMem: case iro_Break: case iro_CallBegin: case iro_EndReg: @@ -224,8 +225,10 @@ static type *find_type_for_node(ir_node *n) { if (tp1 == tp2) { tp = tp1; break; } - VERBOSE_UNKNOWN_TYPE(("Phi %ld with two different types: %s, %s: unknown type.\n", get_irn_node_nr(n), - get_type_name(tp1), get_type_name(tp2))); + if (get_firm_verbosity() > 1) { + VERBOSE_UNKNOWN_TYPE(("Phi %ld with two different types: %s, %s: unknown type.\n", get_irn_node_nr(n), + get_type_name(tp1), get_type_name(tp2))); + } tp = firm_unknown_type; } break; case iro_Load: { @@ -299,8 +302,10 @@ static type *find_type_for_node(ir_node *n) { tp = phi_cycle_type; break; } - VERBOSE_UNKNOWN_TYPE(("Binop %ld with two different types: %s, %s: unknown type \n", get_irn_node_nr(n), - get_type_name(tp1), get_type_name(tp2))); + if (get_firm_verbosity() > 1) { + VERBOSE_UNKNOWN_TYPE(("Binop %ld with two different types: %s, %s: unknown type \n", get_irn_node_nr(n), + get_type_name(tp1), get_type_name(tp2))); + } tp = firm_unknown_type; break; } @@ -340,7 +345,7 @@ static void compute_type(ir_node *n, void *env) { } static void analyse_irg (ir_graph *irg) { - set_irg_typeinfo_state(irg, irg_typeinfo_consistent); + set_irg_typeinfo_state(irg, ir_typeinfo_consistent); irg_walk_graph(irg, NULL, compute_type, NULL); } @@ -358,6 +363,7 @@ void simple_analyse_types(void) { current_ir_graph = get_irp_irg(i); analyse_irg(current_ir_graph); } + set_irp_typeinfo_state(ir_typeinfo_consistent); } void free_simple_type_information(void) { @@ -367,4 +373,5 @@ void free_simple_type_information(void) { free_type(phi_cycle_type); phi_cycle_type = NULL; } + set_irp_typeinfo_state(ir_typeinfo_none); } diff --git a/ir/ana/irtypeinfo.c b/ir/ana/irtypeinfo.c index 5375aa0cf..eba6da013 100644 --- a/ir/ana/irtypeinfo.c +++ b/ir/ana/irtypeinfo.c @@ -70,7 +70,7 @@ void init_irtypeinfo(void) { type_node_map = pmap_create(); for (i = 0; i < get_irp_n_irgs(); ++i) - set_irg_typeinfo_state(get_irp_irg(i), irg_typeinfo_none); + set_irg_typeinfo_state(get_irp_irg(i), ir_typeinfo_none); } void free_irtypeinfo(void) { @@ -89,32 +89,56 @@ void free_irtypeinfo(void) { assert(0 && "call init_type_info before freeing"); for (i = 0; i < get_irp_n_irgs(); ++i) - set_irg_typeinfo_state(get_irp_irg(i), irg_typeinfo_none); + set_irg_typeinfo_state(get_irp_irg(i), ir_typeinfo_none); } /* ------------ Irgraph state handling. ------------------------------- */ -void set_irg_typeinfo_state(ir_graph *irg, irg_typeinfo_state s) { +void set_irg_typeinfo_state(ir_graph *irg, ir_typeinfo_state s) { assert(is_ir_graph(irg)); irg->typeinfo_state = s; + if ((irg->typeinfo_state == ir_typeinfo_consistent) && + (irp->typeinfo_state == ir_typeinfo_consistent) && + (s != ir_typeinfo_consistent) ) + irp->typeinfo_state = ir_typeinfo_inconsistent; } -irg_typeinfo_state get_irg_typeinfo_state(ir_graph *irg) { +ir_typeinfo_state get_irg_typeinfo_state(ir_graph *irg) { assert(is_ir_graph(irg)); return irg->typeinfo_state; } + +/* Returns accumulated type information state information. + * + * Returns ir_typeinfo_consistent if the type information of all irgs is + * consistent. Returns ir_typeinfo_inconsistent if at least one irg has inconsistent + * or no type information. Returns ir_typeinfo_none if no irg contains type information. + */ +ir_typeinfo_state get_irp_typeinfo_state(void) { + return irp->typeinfo_state; +} +void set_irp_typeinfo_state(ir_typeinfo_state s) { + irp->typeinfo_state = s; +} +/* If typeinfo is consistent, sets it to inconsistent. */ +void set_irp_typeinfo_inconsistent(void) { + if (irp->typeinfo_state == ir_typeinfo_consistent) + irp->typeinfo_state = ir_typeinfo_inconsistent; +} + + /* ------------ Irnode type information. ------------------------------ */ /* These routines only work properly if the ir_graph is in state - * irg_typeinfo_consistent or irg_typeinfo_inconsistent. They + * ir_typeinfo_consistent or ir_typeinfo_inconsistent. They * assume current_ir_graph set properly. */ type *get_irn_typeinfo_type(ir_node *n) { type *res = initial_type; - assert(get_irg_typeinfo_state(current_ir_graph) == irg_typeinfo_consistent || - get_irg_typeinfo_state(current_ir_graph) == irg_typeinfo_inconsistent ); + assert(get_irg_typeinfo_state(current_ir_graph) == ir_typeinfo_consistent || + get_irg_typeinfo_state(current_ir_graph) == ir_typeinfo_inconsistent ); if (pmap_contains(type_node_map, (void *)n)) res = (type *) pmap_get(type_node_map, (void *)n); @@ -123,8 +147,8 @@ type *get_irn_typeinfo_type(ir_node *n) { } void set_irn_typeinfo_type(ir_node *n, type *tp) { - assert(get_irg_typeinfo_state(current_ir_graph) == irg_typeinfo_consistent || - get_irg_typeinfo_state(current_ir_graph) == irg_typeinfo_inconsistent ); + assert(get_irg_typeinfo_state(current_ir_graph) == ir_typeinfo_consistent || + get_irg_typeinfo_state(current_ir_graph) == ir_typeinfo_inconsistent ); pmap_insert(type_node_map, (void *)n, (void *)tp); } diff --git a/ir/ana/irtypeinfo.h b/ir/ana/irtypeinfo.h index 552672dc2..d39456a6d 100644 --- a/ir/ana/irtypeinfo.h +++ b/ir/ana/irtypeinfo.h @@ -54,24 +54,42 @@ void free_irtypeinfo(void); /* ------------ Irgraph state handling. ------------------------------- */ +/* +#define irg_typeinfo_none ir_typeinfo_none +#define irg_typeinfo_consistent ir_typeinfo_consistent +#define irg_typeinfo_inconsistent ir_typeinfo_inconsistent +#define irg_typeinfo_state ir_typeinfo_state +*/ + typedef enum { - irg_typeinfo_none, /**< No typeinfo computed, calls to set/get_irn_type + ir_typeinfo_none, /**< No typeinfo computed, calls to set/get_irn_type are invalid. */ - irg_typeinfo_consistent, /**< Type info valid, calls to set/get_irn_type return + ir_typeinfo_consistent, /**< Type info valid, calls to set/get_irn_type return the proper type. */ - irg_typeinfo_inconsistent /**< Type info can be accessed, but it can be invalid + ir_typeinfo_inconsistent /**< Type info can be accessed, but it can be invalid because of other transformations. */ -} irg_typeinfo_state; +} ir_typeinfo_state; + +void set_irg_typeinfo_state(ir_graph *irg, ir_typeinfo_state s); +ir_typeinfo_state get_irg_typeinfo_state(ir_graph *irg); -void set_irg_typeinfo_state(ir_graph *irg, irg_typeinfo_state s); -irg_typeinfo_state get_irg_typeinfo_state(ir_graph *irg); +/** Returns accumulated type information state information. + * + * Returns ir_typeinfo_consistent if the type information of all irgs is + * consistent. Returns ir_typeinfo_inconsistent if at least one irg has inconsistent + * or no type information. Returns ir_typeinfo_none if no irg contains type information. + */ +ir_typeinfo_state get_irp_typeinfo_state(void); +void set_irp_typeinfo_state(ir_typeinfo_state s); +/** If typeinfo is consistent, sets it to inconsistent. */ +void set_irp_typeinfo_inconsistent(void); /* ------------ Irnode type information. ------------------------------ */ /** Accessing the type information. * * These routines only work properly if the ir_graph is in state - * irg_typeinfo_consistent or irg_typeinfo_inconsistent. They + * ir_typeinfo_consistent or ir_typeinfo_inconsistent. They * assume current_ir_graph set properly. */ type *get_irn_typeinfo_type(ir_node *n);