[Ada] Improve performance of conversion from String to Long_Float
authorNicolas Roche <roche@adacore.com>
Fri, 25 May 2018 09:05:34 +0000 (09:05 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Fri, 25 May 2018 09:05:34 +0000 (09:05 +0000)
Once it is sure that the result will be infinity, stop computation and return
the result. This ensure that the function call duration is bounded. Before that
change on some cases the computation was taking more than a few seconds.

2018-05-25  Nicolas Roche  <roche@adacore.com>

gcc/ada/

* libgnat/s-valrea.adb (Scan_Real): Abort computation once it is sure
that the result will be either -infinite or +infinite.

From-SVN: r260743

gcc/ada/ChangeLog
gcc/ada/libgnat/s-valrea.adb

index 4c6dd1fa1ecb2f36982ccff005bd35425164ba3a..39deb156fc2ecbdd2cfa5f9d204ccdec567745c3 100644 (file)
@@ -1,3 +1,8 @@
+2018-05-25  Nicolas Roche  <roche@adacore.com>
+
+       * libgnat/s-valrea.adb (Scan_Real): Abort computation once it is sure
+       that the result will be either -infinite or +infinite.
+
 2018-05-25  Patrick Bernardi  <bernardi@adacore.com>
 
        * libgnat/s-parame.ads, libgnat/s-parame__vxworks.ads,
index 70f21aafaecc1ba9c2e85f1eb013487ff94c0818..7bc7fd80afed55a0b7450a63457a3e3ed2fbae6d 100644 (file)
@@ -342,7 +342,7 @@ package body System.Val_Real is
       --  For base 10, use power of ten table, repeatedly if necessary
 
       elsif Scale > 0 then
-         while Scale > Maxpow loop
+         while Scale > Maxpow and then Uval'Valid loop
             Uval := Uval * Powten (Maxpow);
             Scale := Scale - Maxpow;
          end loop;
@@ -350,18 +350,21 @@ package body System.Val_Real is
          --  Note that we still know that Scale > 0, since the loop
          --  above leaves Scale in the range 1 .. Maxpow.
 
-         Uval := Uval * Powten (Scale);
+         if Uval'Valid then
+            Uval := Uval * Powten (Scale);
+         end if;
 
       elsif Scale < 0 then
-         while (-Scale) > Maxpow loop
+         while (-Scale) > Maxpow and then Uval'Valid loop
             Uval := Uval / Powten (Maxpow);
             Scale := Scale + Maxpow;
          end loop;
 
          --  Note that we still know that Scale < 0, since the loop
          --  above leaves Scale in the range -Maxpow .. -1.
-
-         Uval := Uval / Powten (-Scale);
+         if Uval'Valid then
+            Uval := Uval / Powten (-Scale);
+         end if;
       end if;
 
       --  Here is where we check for a bad based number