[PPL-devel] [GIT] ppl/ppl(master): Some efficiency improvements. Comments improved.
Patricia Hill
p.m.hill at leeds.ac.uk
Tue May 12 17:47:33 CEST 2009
Module: ppl/ppl
Branch: master
Commit: eb54ad2e7508d44ada8ef80161f416e5ec9f48a2
URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=eb54ad2e7508d44ada8ef80161f416e5ec9f48a2
Author: Patricia Hill <p.m.hill at leeds.ac.uk>
Date: Tue May 12 16:42:06 2009 +0100
Some efficiency improvements. Comments improved.
---
src/Grid_public.cc | 38 +++++++++++++++++++++-----------------
1 files changed, 21 insertions(+), 17 deletions(-)
diff --git a/src/Grid_public.cc b/src/Grid_public.cc
index 498e8a7..0fae952 100644
--- a/src/Grid_public.cc
+++ b/src/Grid_public.cc
@@ -2700,13 +2700,13 @@ PPL::Grid::wrap_assign(const Variables_Set& vars,
PPL_DIRTY_TEMP_COEFFICIENT(f_d);
PPL_DIRTY_TEMP_COEFFICIENT(v_n);
PPL_DIRTY_TEMP_COEFFICIENT(v_d);
- PPL_DIRTY_TEMP_COEFFICIENT(f);
for (Variables_Set::const_iterator i = vars.begin(),
- vars_end = vars.end(); i != vars.end(); ++i) {
+ vars_end = vars.end(); i != vars.end(); ++i) {
const Variable x = Variable(*i);
if (!gr.frequency_no_check(x, f_n, f_d, v_n, v_d))
continue;
if (f_n == 0) {
+
// `x' is a constant in `gr'.
if ((v_n > max_value * v_d) || (v_n < min_value * v_d)) {
// The value is outside the range of the bounded integer type.
@@ -2717,16 +2717,18 @@ PPL::Grid::wrap_assign(const Variables_Set& vars,
}
assert(o == OVERFLOW_WRAPS);
// The value v_n for `x' is wrapped modulo the 'wrap_frequency'.
- f = v_d * wrap_frequency;
- v_n %= f;
+ Coefficient& wrap_modulus = f_n;
+ wrap_modulus = v_d * wrap_frequency;
+ v_n %= wrap_modulus;
// `v_n' is the value closest to 0 and may be negative.
if (s == UNSIGNED && v_n < 0)
- v_n += f;
+ v_n += wrap_modulus;
unconstrain(x);
add_constraint(v_d * x == v_n);
}
continue;
}
+
// `x' is not a constant in `gr'.
if (2*f_n > f_d * wrap_frequency) {
// If the grid frequency for `x' in `vars' is more than half the
@@ -2737,18 +2739,19 @@ PPL::Grid::wrap_assign(const Variables_Set& vars,
v_n *= f_d;
add_mul_assign(v_n, f_n, v_d);
v_d *= f_d;
- PPL_DIRTY_TEMP_COEFFICIENT(gcd);
- gcd_assign(gcd, v_n, v_d);
- exact_div_assign(v_n, v_n, gcd);
- exact_div_assign(v_d, v_d, gcd);
}
add_constraint(v_d * x == v_n);
}
+ else if (o == OVERFLOW_WRAPS)
+ // We know that `x' is not a constant, so, if overflow wraps,
+ // `x' may wrap to a value modulo the `wrap_frequency'.
+ add_grid_generator(parameter(wrap_frequency * x));
else
- if (o == OVERFLOW_WRAPS)
- // We know that `x' is not a constant, so `x' may wrap
- // to a value modulo the `wrap_frequency'.
- add_grid_generator(parameter(wrap_frequency * x));
+ // If overflow is impossible but the grid frequency is no more than
+ // half the wrap frequency, then there is more than one possible
+ // value for `x' in the range of the bounded integer type,
+ // so the grid is unchanged.
+ assert(o == OVERFLOW_IMPOSSIBLE && 2*f_n <= f_d * wrap_frequency);
}
return;
}
@@ -2756,6 +2759,10 @@ PPL::Grid::wrap_assign(const Variables_Set& vars,
assert(o == OVERFLOW_UNDEFINED);
// If overflow is undefined, then all we know is that the variable
// may take any integer within the range of the bounded integer type.
+ PPL_DIRTY_TEMP_COEFFICIENT(coeff_x);
+ const Grid_Generator& point = gen_sys[0];
+ Coefficient& div_x = wrap_frequency;
+ div_x = point.divisor();
for (Variables_Set::const_iterator i = vars.begin(),
vars_end = vars.end(); i != vars.end(); ++i) {
const Variable x = Variable(*i);
@@ -2767,10 +2774,7 @@ PPL::Grid::wrap_assign(const Variables_Set& vars,
}
else {
// `x' is a constant `v' in `gr'.
- PPL_DIRTY_TEMP_COEFFICIENT(coeff_x);
- PPL_DIRTY_TEMP_COEFFICIENT(div_x);
- coeff_x = gen_sys[0].coefficient(x);
- div_x = gen_sys[0].divisor();
+ coeff_x = point.coefficient(x);
// If the value `v' for `x' is not within the range for the
// bounded integer type, then `x' may wrap to any value `v + z'
// where `z' is an integer; otherwise `x' is unchanged.
More information about the PPL-devel
mailing list