
Module: ppl/ppl Branch: bounded_arithmetic Commit: 6431f35e4360c7c8385635f1e262c2f984cf07b1 URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=6431f35e4360c...
Author: Roberto Bagnara bagnara@cs.unipr.it Date: Tue Apr 28 19:19:04 2009 +0200
In Polyhedron::wrap_assign() handled the case `o == OVERFLOW_IMPOSSIBLE'.
---
src/Polyhedron_public.cc | 11 ++++- tests/Polyhedron/wrap1.cc | 115 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 125 insertions(+), 1 deletions(-)
diff --git a/src/Polyhedron_public.cc b/src/Polyhedron_public.cc index 2bd274d..dc10b87 100644 --- a/src/Polyhedron_public.cc +++ b/src/Polyhedron_public.cc @@ -3761,9 +3761,18 @@ PPL::Polyhedron::wrap_assign(const Variables_Set& vars, //std::cout << "un = " << un << std::endl;
// Special case: this variable does not need wrapping. - if (un == 0 && ln == 0) + if (ln == 0 && un == 0) continue;
+ // If overflow is impossible, try not to add useless constraints. + if (o == OVERFLOW_IMPOSSIBLE) { + if (ln < 0) + full_range_bounds.insert(min_value <= x); + if (un > 0) + full_range_bounds.insert(x <= max_value); + continue; + } + if (o == OVERFLOW_UNDEFINED || un - ln > k_threshold) goto set_full_range;
diff --git a/tests/Polyhedron/wrap1.cc b/tests/Polyhedron/wrap1.cc index f03be15..d182ca1 100644 --- a/tests/Polyhedron/wrap1.cc +++ b/tests/Polyhedron/wrap1.cc @@ -144,6 +144,117 @@ test04() { return ok; }
+bool +test05() { + Variable x(0); + Variable y(1); + C_Polyhedron ph(2); + ph.add_constraint(x + 1024 == 8*y); + ph.add_constraint(-64 <= x); + ph.add_constraint(x <= 448); + + print_constraints(ph, "*** ph ***"); + + Variables_Set vars(x, y); + + ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_IMPOSSIBLE); + + C_Polyhedron known_result(2); + known_result.add_constraint(x >= 0); + known_result.add_constraint(x <= 255); + known_result.add_constraint(x + 1024 == 8*y); + + bool ok = (ph == known_result); + + print_constraints(ph, "*** ph.wrap_assign(...) ***"); + + return ok; +} + +bool +test06() { + Variable x(0); + Variable y(1); + C_Polyhedron ph(2); + ph.add_constraint(x + 1024 == 8*y); + ph.add_constraint(-64 <= x); + ph.add_constraint(x <= 448); + + print_constraints(ph, "*** ph ***"); + + Variables_Set vars(x, y); + + Constraint_System cs; + cs.insert(x <= y); + + ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_IMPOSSIBLE, &cs); + + C_Polyhedron known_result(2); + known_result.add_constraint(x >= 0); + known_result.add_constraint(7*x <= 1024); + known_result.add_constraint(x + 1024 == 8*y); + + bool ok = (ph == known_result); + + print_constraints(ph, "*** ph.wrap_assign(...) ***"); + + return ok; +} + +bool +test07() { + Variable x(0); + Variable y(1); + C_Polyhedron ph(2); + ph.add_constraint(x + 1024 == 8*y); + + print_constraints(ph, "*** ph ***"); + + Variables_Set vars(x, y); + + ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS); + + C_Polyhedron known_result(2); + known_result.add_constraint(x >= 0); + known_result.add_constraint(x <= 255); + known_result.add_constraint(y >= 0); + known_result.add_constraint(y <= 255); + + bool ok = (ph == known_result); + + print_constraints(ph, "*** ph.wrap_assign(...) ***"); + + return ok; +} + +bool +test08() { + Variable x(0); + Variable y(1); + C_Polyhedron ph(2); + ph.add_constraint(x + 1024 == 8*y); + + print_constraints(ph, "*** ph ***"); + + Variables_Set vars(x, y); + + Constraint_System cs; + cs.insert(x <= y); + + ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs); + + C_Polyhedron known_result(2); + known_result.add_constraint(x >= 0); + known_result.add_constraint(y <= 255); + known_result.add_constraint(x <= y); + + bool ok = (ph == known_result); + + print_constraints(ph, "*** ph.wrap_assign(...) ***"); + + return ok; +} + } // namespace
BEGIN_MAIN @@ -151,4 +262,8 @@ BEGIN_MAIN DO_TEST(test02); DO_TEST(test03); DO_TEST(test04); + DO_TEST(test05); + DO_TEST(test06); + DO_TEST(test07); + DO_TEST(test08); END_MAIN