[Ada] Implement Machine_Rounding attribute in line when possible
authorEric Botcazou <ebotcazou@adacore.com>
Thu, 19 Sep 2019 08:13:38 +0000 (08:13 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Thu, 19 Sep 2019 08:13:38 +0000 (08:13 +0000)
GNAT implements Machine_Rounding as an alias for Rounding but, whereas
the implementation of the latter is in line when possible, that of the
former is always out of line, which is not aligned with the intent of
the Ada RM.

This changes the compiler to using for Machine_Rounding the same in line
implementation as Rounding when possible.

Running these commands:

  gcc -c f.adb -gnatD
  grep system f.adb.dg

On the following sources:

function F (Val : Float) return Integer is
begin
  return Integer (Float'Machine_Rounding (Val));
end;

Should execute silently.

2019-09-19  Eric Botcazou  <ebotcazou@adacore.com>

gcc/ada/

* exp_attr.adb (Is_Inline_Floating_Point_Attribute): Treat
Machine_Rounding as an alias for Rounding.
* sem_res.adb (Simplify_Type_Conversion): Likewise.

From-SVN: r275943

gcc/ada/ChangeLog
gcc/ada/exp_attr.adb
gcc/ada/sem_res.adb

index 86e9f07353fe8afbc0d2fedf182628f30b95f1ad..289213e914a8a4d38451a0067e0dea2f355b9ed8 100644 (file)
@@ -1,3 +1,9 @@
+2019-09-19  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * exp_attr.adb (Is_Inline_Floating_Point_Attribute): Treat
+       Machine_Rounding as an alias for Rounding.
+       * sem_res.adb (Simplify_Type_Conversion): Likewise.
+
 2019-09-19  Gary Dismukes  <dismukes@adacore.com>
 
        * exp_unst.adb (Unnest_Subprogram): Bypass the transformation of
index a8e68bbb033f54923ae708d650d90176471f7082..817e7ef4cabba239d14e1c2ac97b0d1bf6142c6f 100644 (file)
@@ -8360,13 +8360,13 @@ package body Exp_Attr is
          return False;
       end if;
 
-      --  Here we are in the integer conversion context
+      --  Here we are in the integer conversion context. We reuse Rounding for
+      --  Machine_Rounding as System.Fat_Gen, which is a permissible behavior.
 
-      --  Very probably we should also recognize the cases of Machine_Rounding
-      --  and unbiased rounding in this conversion context, but the back end is
-      --  not yet prepared to handle these cases ???
-
-      return Id = Attribute_Rounding or else Id = Attribute_Truncation;
+      return
+        Id = Attribute_Rounding
+          or else Id = Attribute_Machine_Rounding
+          or else Id = Attribute_Truncation;
    end Is_Inline_Floating_Point_Attribute;
 
 end Exp_Attr;
index 38de57d6cf5b378f4d77226b39ad46635dfdfc87..28d1352afb3f06398c67f9cd9351f34b712b0691 100644 (file)
@@ -12439,7 +12439,8 @@ package body Sem_Res is
             --     ityp (x)
 
             --  with the Float_Truncate flag set to False or True respectively,
-            --  which is more efficient.
+            --  which is more efficient. We reuse Rounding for Machine_Rounding
+            --  as System.Fat_Gen, which is a permissible behavior.
 
             if Is_Floating_Point_Type (Opnd_Typ)
               and then
@@ -12448,6 +12449,7 @@ package body Sem_Res is
                             and then Conversion_OK (N)))
               and then Nkind (Operand) = N_Attribute_Reference
               and then Nam_In (Attribute_Name (Operand), Name_Rounding,
+                                                         Name_Machine_Rounding,
                                                          Name_Truncation)
             then
                declare