From b15233736415b8973a64aaa54e0489ed65bb88f6 Mon Sep 17 00:00:00 2001 From: Michael Beck Date: Thu, 26 Apr 2007 14:45:31 +0000 Subject: [PATCH] Memory leak fixed [r13483] --- ir/ana/execfreq.c | 122 +++++++++++++++++++++++----------------------- 1 file changed, 61 insertions(+), 61 deletions(-) diff --git a/ir/ana/execfreq.c b/ir/ana/execfreq.c index 392772486..eafdba815 100644 --- a/ir/ana/execfreq.c +++ b/ir/ana/execfreq.c @@ -182,7 +182,7 @@ solve_lgs(double * A, double * b, size_t size) return NULL; } } -#endif +#endif /* USE_GSL */ static double get_cf_probability(ir_node *bb, int pos, double loop_weight) @@ -291,90 +291,90 @@ compute_execfreq(ir_graph * irg, double loop_weight) } x = solve_lgs(matrix, rhs, size); - if(x == NULL) { + if (x == NULL) { ef->infeasible = 1; - return ef; - } + } else { + ef->max = 0.0; - ef->max = 0.0; - - set_foreach(freqs, freq) { - const ir_node *bb = freq->irn; - size_t idx = PTR_TO_INT(get_irn_link(bb)); + set_foreach(freqs, freq) { + const ir_node *bb = freq->irn; + size_t idx = PTR_TO_INT(get_irn_link(bb)); #ifdef USE_GSL - freq->freq = UNDEF(gsl_vector_get(x, idx)) ? EPSILON : gsl_vector_get(x, idx); + freq->freq = UNDEF(gsl_vector_get(x, idx)) ? EPSILON : gsl_vector_get(x, idx); #else - freq->freq = UNDEF(x[idx]) ? EPSILON : x[idx]; + freq->freq = UNDEF(x[idx]) ? EPSILON : x[idx]; #endif - /* get the maximum exec freq */ - ef->max = MAX(ef->max, freq->freq); + /* get the maximum exec freq */ + ef->max = MAX(ef->max, freq->freq); - /* Get the minimum non-zero execution frequency. */ - if(freq->freq > 0.0) - ef->min_non_zero = MIN(ef->min_non_zero, freq->freq); - } + /* Get the minimum non-zero execution frequency. */ + if(freq->freq > 0.0) + ef->min_non_zero = MIN(ef->min_non_zero, freq->freq); + } - /* compute m and b of the transformation used to convert the doubles into scaled ints */ - { - double smallest_diff = 1.0; + /* compute m and b of the transformation used to convert the doubles into scaled ints */ + { + double smallest_diff = 1.0; - double l2 = ef->min_non_zero; - double h2 = ef->max; - double l1 = 1.0; - double h1 = MAX_INT_FREQ; + double l2 = ef->min_non_zero; + double h2 = ef->max; + double l1 = 1.0; + double h1 = MAX_INT_FREQ; - double *fs = malloc(set_count(freqs) * sizeof(fs[0])); - int i, j, n = 0; + double *fs = malloc(set_count(freqs) * sizeof(fs[0])); + int i, j, n = 0; - set_foreach(freqs, freq) - fs[n++] = freq->freq; + set_foreach(freqs, freq) + fs[n++] = freq->freq; - /* - * find the smallest difference of the execution frequencies - * we try to ressolve it with 1 integer. - */ - for(i = 0; i < n; ++i) { - if(fs[i] <= 0.0) - continue; + /* + * find the smallest difference of the execution frequencies + * we try to ressolve it with 1 integer. + */ + for(i = 0; i < n; ++i) { + if(fs[i] <= 0.0) + continue; - for(j = i + 1; j < n; ++j) { - double diff = fabs(fs[i] - fs[j]); + for(j = i + 1; j < n; ++j) { + double diff = fabs(fs[i] - fs[j]); - if(!UNDEF(diff)) - smallest_diff = MIN(diff, smallest_diff); + if(!UNDEF(diff)) + smallest_diff = MIN(diff, smallest_diff); + } } - } - /* according to that the slope of the translation function is 1.0 / smallest diff */ - ef->m = 1.0 / smallest_diff; + /* according to that the slope of the translation function is 1.0 / smallest diff */ + ef->m = 1.0 / smallest_diff; - /* the abscissa is then given by */ - ef->b = l1 - ef->m * l2; - - /* - * if the slope is so high that the largest integer would be larger than MAX_INT_FREQ - * set the largest int freq to that upper limit and recompute the translation function - */ - if(ef->m * h2 + ef->b > MAX_INT_FREQ) { - ef->m = (h1 - l1) / (h2 - l2); + /* the abscissa is then given by */ ef->b = l1 - ef->m * l2; - } - // printf("smallest_diff: %g, l1: %f, h1: %f, l2: %f, h2: %f, m: %f, b: %f\n", smallest_diff, l1, h1, l2, h2, ef->m, ef->b); - free(fs); - } + /* + * if the slope is so high that the largest integer would be larger than MAX_INT_FREQ + * set the largest int freq to that upper limit and recompute the translation function + */ + if(ef->m * h2 + ef->b > MAX_INT_FREQ) { + ef->m = (h1 - l1) / (h2 - l2); + ef->b = l1 - ef->m * l2; + } + + // printf("smallest_diff: %g, l1: %f, h1: %f, l2: %f, h2: %f, m: %f, b: %f\n", smallest_diff, l1, h1, l2, h2, ef->m, ef->b); + free(fs); + } #ifdef USE_GSL - gsl_vector_free(x); + gsl_vector_free(x); #endif - free(matrix); + free(matrix); + free(rhs); - memset(&ef->hook, 0, sizeof(ef->hook)); - ef->hook.context = ef; - ef->hook.hook._hook_node_info = exec_freq_node_info; - register_hook(hook_node_info, &ef->hook); + memset(&ef->hook, 0, sizeof(ef->hook)); + ef->hook.context = ef; + ef->hook.hook._hook_node_info = exec_freq_node_info; + register_hook(hook_node_info, &ef->hook); + } return ef; } -- 2.20.1