X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fana%2Ffield_temperature.c;h=feca84af006a205a5c07f31bdb00fd257216263e;hb=1714809afac25e69694b58423430c03f5af20228;hp=541bdeda876422938d4074b8e3dc249083f4bfa1;hpb=1e93b290c56e13ffe54c8cff2b413d29efa72e72;p=libfirm diff --git a/ir/ana/field_temperature.c b/ir/ana/field_temperature.c index 541bdeda8..feca84af0 100644 --- a/ir/ana/field_temperature.c +++ b/ir/ana/field_temperature.c @@ -24,11 +24,75 @@ #include "irgwalk.h" #include "array.h" +#include "set.h" +#include "hashptr.h" + /* *************************************************************************** */ /* initialize, global variables. */ /* *************************************************************************** */ +/* *************************************************************************** */ +/* Another hash table, this time containing temperature values. */ +/* *************************************************************************** */ + +typedef struct { + firm_kind *kind; /* An entity or type. */ + double val1; +} temperature_tp; + +/* We use this set for all types and entities. */ +static set *temperature_set = NULL; + +static int temp_cmp(const void *e1, const void *e2, size_t size) { + temperature_tp *ef1 = (temperature_tp *)e1; + temperature_tp *ef2 = (temperature_tp *)e2; + return (ef1->kind != ef2->kind); +} + +static INLINE unsigned int tem_hash(void *e) { + void *v = (void *) ((temperature_tp *)e)->kind; + return HASH_PTR(v); +} + +double get_entity_acc_estimated_n_loads (entity *ent) { + return 0; +} +double get_entity_acc_estimated_n_stores(entity *ent) { + return 0; +} + +void set_entity_acc_estimated_n_loads (entity *ent, double val) { +} +void set_entity_acc_estimated_n_stores(entity *ent, double val) { +} + +double get_type_acc_estimated_n_instances(type *tp) { + return 0; +} +void set_type_acc_estimated_n_instances(type *tp, double val) { +} + +/* +static INLINE void set_region_exec_freq(void *reg, double freq) { + reg_exec_freq ef; + ef.reg = reg; + ef.freq = freq; + set_insert(exec_freq_set, &ef, sizeof(ef), exec_freq_hash(&ef)); +} + +INLINE double get_region_exec_freq(void *reg) { + reg_exec_freq ef, *found; + ef.reg = reg; + assert(exec_freq_set); + found = set_find(exec_freq_set, &ef, sizeof(ef), exec_freq_hash(&ef)); + if (found) + return found->freq; + else + return 0; +} +*/ + /* *************************************************************************** */ /* Access routines for irnodes */ @@ -43,8 +107,6 @@ entity *get_Sel_accessed_entity(ir_node *sel, int pos) { return get_Sel_entity(sel); } - - /* *************************************************************************** */ /* The heuristic */ /* *************************************************************************** */ @@ -68,6 +130,7 @@ int get_irn_recursion_depth(ir_node *n) { } +/** @@@ the second version of the heuristic. */ int get_weighted_loop_depth(ir_node *n) { int loop_call_depth = get_irn_loop_call_depth(n); int loop_depth = get_irn_loop_depth(n); @@ -86,12 +149,14 @@ static int default_recursion_weight = 5; /* The final evaluation of a node. In this function we can adapt the heuristic. Combine execution freqency with - recursion depth. */ + recursion depth. + @@@ the second version of the heuristic. */ double get_irn_final_cost(ir_node *n) { - double cost_loop = get_irn_exec_freq(n); - int rec_depth = get_irn_recursion_depth(n); - double cost_rec = pow(default_recursion_weight, rec_depth); - return cost_loop + cost_rec; + double cost_loop = get_irn_exec_freq(n); + double cost_method = get_irg_method_execution_frequency(get_irn_irg(n)); + int rec_depth = get_irn_recursion_depth(n); + double cost_rec = pow(default_recursion_weight, rec_depth); + return cost_loop*(cost_method + cost_rec); } double get_type_estimated_n_instances(type *tp) { @@ -106,6 +171,7 @@ double get_type_estimated_n_instances(type *tp) { double get_type_estimated_mem_consumption_bytes(type *tp) { assert(0); + return 0.0; } int get_type_estimated_n_fields(type *tp) { @@ -202,8 +268,9 @@ double get_type_estimated_n_casts(type *tp) { double get_class_estimated_n_upcasts(type *clss) { double n_instances = 0; + int i, j, n_casts, n_pointertypes; - int i, n_casts = get_type_n_casts(clss); + n_casts = get_type_n_casts(clss); for (i = 0; i < n_casts; ++i) { ir_node *cast = get_type_cast(clss, i); if (get_irn_opcode(cast) != iro_Cast) continue; /* Could be optimized away. */ @@ -212,7 +279,7 @@ double get_class_estimated_n_upcasts(type *clss) { n_instances += get_irn_final_cost(cast); } - int j, n_pointertypes = get_type_n_pointertypes_to(clss); + n_pointertypes = get_type_n_pointertypes_to(clss); for (j = 0; j < n_pointertypes; ++j) { n_instances += get_class_estimated_n_upcasts(get_type_pointertype_to(clss, j)); } @@ -222,8 +289,9 @@ double get_class_estimated_n_upcasts(type *clss) { double get_class_estimated_n_downcasts(type *clss) { double n_instances = 0; + int i, j, n_casts, n_pointertypes; - int i, n_casts = get_type_n_casts(clss); + n_casts = get_type_n_casts(clss); for (i = 0; i < n_casts; ++i) { ir_node *cast = get_type_cast(clss, i); if (get_irn_opcode(cast) != iro_Cast) continue; /* Could be optimized away. */ @@ -232,7 +300,7 @@ double get_class_estimated_n_downcasts(type *clss) { n_instances += get_irn_final_cost(cast); } - int j, n_pointertypes = get_type_n_pointertypes_to(clss); + n_pointertypes = get_type_n_pointertypes_to(clss); for (j = 0; j < n_pointertypes; ++j) { n_instances += get_class_estimated_n_downcasts(get_type_pointertype_to(clss, j)); } @@ -324,12 +392,88 @@ double get_entity_estimated_n_dyncalls(entity *ent) { return n_calls; } +/* ------------------------------------------------------------------------- */ +/* Accumulate information in the type hierarchy. */ +/* This should go to co_read_profiling.c */ +/* ------------------------------------------------------------------------- */ -/* *************************************************************************** */ -/* Auxiliary */ -/* *************************************************************************** */ +static void acc_temp (type *tp) { + int i, n_subtypes, n_members; + double inst; + + assert(is_Class_type(tp)); + + /* Recursive descend. */ + n_subtypes = get_class_n_subtypes(tp); + for (i = 0; i < n_subtypes; ++i) { + type *stp = get_class_subtype(tp, i); + if (type_not_visited(stp)) { + acc_temp(stp); + } + } + + /* Deal with entity numbers. */ + n_members = get_class_n_members(tp); + for (i = 0; i < n_members; ++i) { + entity *mem = get_class_member(tp, i); + double acc_loads = get_entity_estimated_n_loads (mem); + double acc_writes = get_entity_estimated_n_stores(mem); + int j, n_ov = get_entity_n_overwrittenby(mem); + for (j = 0; j < n_ov; ++j) { + entity *ov_mem = get_entity_overwrittenby(mem, j); + acc_loads += get_entity_acc_estimated_n_loads (ov_mem); + acc_writes += get_entity_acc_estimated_n_stores(ov_mem); + } + set_entity_acc_estimated_n_loads (mem, acc_loads); + set_entity_acc_estimated_n_stores(mem, acc_writes); + } + + /* Deal with type numbers. */ + inst = get_type_estimated_n_instances(tp); + for (i = 0; i < n_subtypes; ++i) { + type *stp = get_class_subtype(tp, i); + inst += get_type_acc_estimated_n_instances(stp); + } + set_type_acc_estimated_n_instances(tp, inst); -int is_jack_rts_name(const ident *name) { + mark_type_visited(tp); +} + +void accumulate_temperatures(void) { + int i, n_types = get_irp_n_types(); + free_accumulated_temperatures(); + + inc_master_type_visited(); + for (i = 0; i < n_types; ++i) { + type *tp = get_irp_type(i); + if (is_Class_type(tp)) { /* For others there is nothing to accumulate. */ + int j, n_subtypes = get_class_n_subtypes(tp); + int has_unmarked_subtype = false; + for (j = 0; j < n_subtypes && !has_unmarked_subtype; ++j) { + type *stp = get_class_subtype(tp, j); + if (type_not_visited(stp)) has_unmarked_subtype = true; + } + + if (!has_unmarked_subtype) + acc_temp(tp); + } + } + + irp->temperature_state = temperature_consistent; +} + + +void free_accumulated_temperatures(void) { + if (temperature_set) del_set(temperature_set); + temperature_set = NULL; + irp->temperature_state = temperature_none; +} + +/* ------------------------------------------------------------------------- */ +/* Auxiliary */ +/* ------------------------------------------------------------------------- */ + +int is_jack_rts_name(ident *name) { return 0; if (id_is_prefix(new_id_from_str("java/"), name)) return 1; if (id_is_prefix(new_id_from_str("["), name)) return 1; @@ -349,8 +493,10 @@ int is_jack_rts_class(type *t) { #include "entity_t.h" // for the assertion. int is_jack_rts_entity(entity *e) { + ident *name; + assert(e->ld_name); - ident *name = get_entity_ld_ident(e); + name = get_entity_ld_ident(e); return is_jack_rts_name(name); }