Commit b1523373 authored by Michael Beck's avatar Michael Beck
Browse files

Memory leak fixed

[r13483]
parent 974215da
......@@ -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;
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment