[PPL-devel] [GIT] ppl/ppl(floating_point): Fixed several mistakes in linearize and started

Fabio Bossi bossi at cs.unipr.it
Tue Jul 27 15:09:37 CEST 2010


Module: ppl/ppl
Branch: floating_point
Commit: bd7beafc7d3db06788a182b90550ff1129923e63
URL:    http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=bd7beafc7d3db06788a182b90550ff1129923e63

Author: Fabio Bossi <bossi at cs.unipr.it>
Date:   Tue Jul 27 15:08:52 2010 +0200

Fixed several mistakes in linearize and started
to test it.

---

 src/linearize.hh                            |   36 +++++++++++++-------------
 tests/Concrete_Expression/C_Expr.inlines.hh |    5 +++
 tests/Concrete_Expression/linearize.cc      |    2 +-
 3 files changed, 24 insertions(+), 19 deletions(-)

diff --git a/src/linearize.hh b/src/linearize.hh
index 37143c0..ee8abc1 100644
--- a/src/linearize.hh
+++ b/src/linearize.hh
@@ -629,22 +629,22 @@ linearize(const Concrete_Expression<Target>& expr,
     break;
   case Floating_Point_Constant<Target>::KIND:
   {
-    Floating_Point_Constant<Target> fpc_expr =
-      static_cast<Floating_Point_Constant<Target> >(expr);
-    result = FP_Linear_Form(FP_Interval(fpc_expr.get_value_as_string()));
+    const Floating_Point_Constant<Target>* fpc_expr =
+      static_cast<const Floating_Point_Constant<Target>* >(&expr);
+    result = FP_Linear_Form(FP_Interval_Type(fpc_expr->get_value_as_string()));
     return true;
     break;
   }
   case Unary_Operator<Target>::KIND:
   {
-    Unary_Operator<Target> uop_expr =
-      static_cast<Unary_Operator<Target> >(expr);
-    switch (uop_expr.unary_operator()) {
+    const Unary_Operator<Target>* uop_expr =
+      static_cast<const Unary_Operator<Target>* >(&expr);
+    switch (uop_expr->unary_operator()) {
     case Unary_Operator<Target>::UPLUS:
-      return linearize(uop_expr.argument(), int_store, lf_store, result);
+      return linearize(*(uop_expr->argument()), int_store, lf_store, result);
       break;
     case Unary_Operator<Target>::UMINUS:
-      if (!linearize(uop_expr.argument(), int_store, lf_store, result))
+      if (!linearize(*(uop_expr->argument()), int_store, lf_store, result))
         return false;
 
       result.negate();
@@ -660,20 +660,20 @@ linearize(const Concrete_Expression<Target>& expr,
   }
   case Binary_Operator<Target>::KIND:
   {
-    Binary_Operator<Target> bop_expr =
-      static_cast<Binary_Operator<Target> >(expr);
-    switch (bop_expr.binary_operator()) {
+    const Binary_Operator<Target>* bop_expr =
+      static_cast<const Binary_Operator<Target>* >(&expr);
+    switch (bop_expr->binary_operator()) {
     case Binary_Operator<Target>::ADD:
-      return add_linearize(bop_expr, int_store, lf_store, result);
+      return add_linearize(*bop_expr, int_store, lf_store, result);
       break;
     case Binary_Operator<Target>::SUB:
-      return sub_linearize(bop_expr, int_store, lf_store, result);
+      return sub_linearize(*bop_expr, int_store, lf_store, result);
       break;
     case Binary_Operator<Target>::MUL:
-      return mul_linearize(bop_expr, int_store, lf_store, result);
+      return mul_linearize(*bop_expr, int_store, lf_store, result);
       break;
     case Binary_Operator<Target>::DIV:
-      return div_linearize(bop_expr, int_store, lf_store, result);
+      return div_linearize(*bop_expr, int_store, lf_store, result);
       break;
     case Binary_Operator<Target>::REM:
     case Binary_Operator<Target>::BAND:
@@ -691,11 +691,11 @@ linearize(const Concrete_Expression<Target>& expr,
   }
   case Approximable_Reference<Target>::KIND:
   {
-    Approximable_Reference<Target> ref_expr =
-      static_cast<Approximable_Reference<Target> >(expr);
+    const Approximable_Reference<Target>* ref_expr =
+      static_cast<const Approximable_Reference<Target>* >(&expr);
     /* Variable references are the only that we are currently
        able to analyze */
-    dimension_type variable_index = ref_expr.associated_dimension();
+    dimension_type variable_index = ref_expr->associated_dimension();
     if (variable_index == not_a_dimension())
       return false;
     else {
diff --git a/tests/Concrete_Expression/C_Expr.inlines.hh b/tests/Concrete_Expression/C_Expr.inlines.hh
index 5bc06b5..5c34a55 100644
--- a/tests/Concrete_Expression/C_Expr.inlines.hh
+++ b/tests/Concrete_Expression/C_Expr.inlines.hh
@@ -31,6 +31,11 @@ Concrete_Expression(const C_Expr_Kind KIND)
   : expr_kind(KIND) {
 }
 
+inline Concrete_Expression_Kind
+Concrete_Expression<C_Expr>::kind() const {
+  return expr_kind;
+}
+
 inline Concrete_Expression_Type
 Concrete_Expression<C_Expr>::type() const {
   return Concrete_Expression_Type::floating_point(ANALYZED_FP_FORMAT);
diff --git a/tests/Concrete_Expression/linearize.cc b/tests/Concrete_Expression/linearize.cc
index f8ea4c1..14897c1 100644
--- a/tests/Concrete_Expression/linearize.cc
+++ b/tests/Concrete_Expression/linearize.cc
@@ -32,7 +32,7 @@ bool
 test01() {
   Floating_Point_Constant<C_Expr> num("3", 2);
   Floating_Point_Constant<C_Expr> den("0", 2);
-  Binary_Operator<C_Expr> div(Binary_Operator<C_Expr>::DIV, num, den);
+  Binary_Operator<C_Expr> div(Binary_Operator<C_Expr>::DIV, &num, &den);
   FP_Linear_Form result;
   if (!linearize(div, FP_Interval_Abstract_Store(),
                  FP_Linear_Form_Abstract_Store(), result)) {




More information about the PPL-devel mailing list