[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Tue, 2 May 2017 08:31:12 +0000 (10:31 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Tue, 2 May 2017 08:31:12 +0000 (10:31 +0200)
2017-05-02  Eric Botcazou  <ebotcazou@adacore.com>

* opt.ads: Add missing GNAT markers in comments.
* opt.adb (Set_Opt_Config_Switches): Do not override earlier
settings of Optimize_Alignment at the end.

2017-05-02  Hristian Kirtchev  <kirtchev@adacore.com>

* checks.adb (Apply_Constraint_Check): Do not apply
a discriminant check when the associated type is a constrained
subtype created for an unconstrained nominal type.
* exp_attr.adb: Minor reformatting.

2017-05-02  Bob Duff  <duff@adacore.com>

* sem_ch3.adb (OK_For_Limited_Init_In_05): Handle correctly
the N_Raise_Expression case.
* sem_ch6.adb (Check_Limited_Return): Minor: clarify comment,
and add assertions.

2017-05-02  Yannick Moy  <moy@adacore.com>

* exp_ch4.adb (Expand_N_Op_Ne): Do not bump parenthese level and
optimize length comparison in GNATprove mode.
* exp_spark.adb (Expand_SPARK_Op_Ne): New function to rewrite
operator /= into negation of operator = when needed.
(Expand_SPARK): Call new
function to expand operator /=.

2017-05-02  Ed Schonberg  <schonberg@adacore.com>

* exp_fixd.adb (Expand_Divide_Fixed_By_Fixed_Giving_Fixed):
Simplify the expression for a fixed-fixed division to remove
divisions by constants whenever possible, as an optimization
for restricted targets.

From-SVN: r247468

gcc/ada/ChangeLog
gcc/ada/checks.adb
gcc/ada/exp_attr.adb
gcc/ada/exp_ch4.adb
gcc/ada/exp_fixd.adb
gcc/ada/exp_spark.adb
gcc/ada/opt.adb
gcc/ada/opt.ads
gcc/ada/sem_ch3.adb
gcc/ada/sem_ch6.adb

index 59ee6e5cd95b413b99cf4560823f0040bbdb7484..5eff9e254a99f5c866b080e572c15bd136f56370 100644 (file)
@@ -1,3 +1,39 @@
+2017-05-02  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * opt.ads: Add missing GNAT markers in comments.
+       * opt.adb (Set_Opt_Config_Switches): Do not override earlier
+       settings of Optimize_Alignment at the end.
+
+2017-05-02  Hristian Kirtchev  <kirtchev@adacore.com>
+
+       * checks.adb (Apply_Constraint_Check): Do not apply
+       a discriminant check when the associated type is a constrained
+       subtype created for an unconstrained nominal type.
+       * exp_attr.adb: Minor reformatting.
+
+2017-05-02  Bob Duff  <duff@adacore.com>
+
+       * sem_ch3.adb (OK_For_Limited_Init_In_05): Handle correctly
+       the N_Raise_Expression case.
+       * sem_ch6.adb (Check_Limited_Return): Minor: clarify comment,
+       and add assertions.
+
+2017-05-02  Yannick Moy  <moy@adacore.com>
+
+       * exp_ch4.adb (Expand_N_Op_Ne): Do not bump parenthese level and
+       optimize length comparison in GNATprove mode.
+       * exp_spark.adb (Expand_SPARK_Op_Ne): New function to rewrite
+       operator /= into negation of operator = when needed.
+       (Expand_SPARK): Call new
+       function to expand operator /=.
+
+2017-05-02  Ed Schonberg  <schonberg@adacore.com>
+
+       * exp_fixd.adb (Expand_Divide_Fixed_By_Fixed_Giving_Fixed):
+       Simplify the expression for a fixed-fixed division to remove
+       divisions by constants whenever possible, as an optimization
+       for restricted targets.
+
 2017-05-02  Hristian Kirtchev  <kirtchev@adacore.com>
 
        * checks.adb, sem_ch3.adb, sem_ch6.adb: Minor reformatting.
index 40f4e65252e4bb14019e34ad4609b06a348f8b7b..e8f38f990e38fb2378ef17c1fff3c6aabddf6392 100644 (file)
@@ -1355,8 +1355,13 @@ package body Checks is
 
             Apply_Range_Check (N, Typ);
 
+         --  Do not install a discriminant check for a constrained subtype
+         --  created for an unconstrained nominal type because the subtype
+         --  has the correct constraints by construction.
+
          elsif Has_Discriminants (Base_Type (Desig_Typ))
-            and then Is_Constrained (Desig_Typ)
+           and then Is_Constrained (Desig_Typ)
+           and then not Is_Constr_Subt_For_U_Nominal (Desig_Typ)
          then
             Apply_Discriminant_Check (N, Typ);
          end if;
index 4d8417afeeb9e43ed5d6fe9b974604f9433615cc..79560ae86c0a9ff4aab7c2715548d43a5b5a5cf7 100644 (file)
@@ -83,6 +83,9 @@ package body Exp_Attr is
    --  value returned is the entity of the constructed function body. We do not
    --  bother to generate a separate spec for this subprogram.
 
+   function Build_Disp_Get_Task_Id_Call (Actual : Node_Id) return Node_Id;
+   --  Build a call to Disp_Get_Task_Id, passing Actual as actual parameter
+
    function Build_Record_VS_Func
      (R_Type : Entity_Id;
       Nod    : Node_Id) return Entity_Id;
@@ -354,6 +357,23 @@ package body Exp_Attr is
       return Func_Id;
    end Build_Array_VS_Func;
 
+   ---------------------------------
+   -- Build_Disp_Get_Task_Id_Call --
+   ---------------------------------
+
+   function Build_Disp_Get_Task_Id_Call (Actual : Node_Id) return Node_Id is
+      Typ  : constant Entity_Id := Etype (Actual);
+      Id : constant Node_Id :=
+        New_Occurrence_Of
+          (Find_Prim_Op (Typ, Name_uDisp_Get_Task_Id), Sloc (Actual));
+      Result : constant Node_Id :=
+        Make_Function_Call (Sloc (Actual),
+          Name => Id,
+          Parameter_Associations => New_List (Actual));
+   begin
+      return Result;
+   end Build_Disp_Get_Task_Id_Call;
+
    --------------------------
    -- Build_Record_VS_Func --
    --------------------------
@@ -2469,6 +2489,7 @@ package body Exp_Attr is
       --  Transforms 'Callable attribute into a call to the Callable function
 
       when Attribute_Callable =>
+
          --  We have an object of a task interface class-wide type as a prefix
          --  to Callable. Generate:
          --    callable (Task_Id (Pref._disp_get_task_id));
@@ -2478,29 +2499,18 @@ package body Exp_Attr is
            and then Is_Interface (Ptyp)
            and then Is_Task_Interface (Ptyp)
          then
-            declare
-               Id : constant Node_Id :=
-                 New_Occurrence_Of
-                   (Find_Prim_Op (Ptyp, Name_uDisp_Get_Task_Id), Loc);
-               Call : constant Node_Id :=
-                 Make_Function_Call (Loc,
-                   Name => Id,
-                   Parameter_Associations => New_List (Pref));
-            begin
-               Rewrite (N,
-                 Make_Function_Call (Loc,
-                   Name =>
-                     New_Occurrence_Of (RTE (RE_Callable), Loc),
-                   Parameter_Associations => New_List (
-                     Make_Unchecked_Type_Conversion (Loc,
-                       Subtype_Mark =>
-                         New_Occurrence_Of (RTE (RO_ST_Task_Id), Loc),
-                       Expression => Call))));
-            end;
+            Rewrite (N,
+              Make_Function_Call (Loc,
+                Name =>
+                  New_Occurrence_Of (RTE (RE_Callable), Loc),
+                Parameter_Associations => New_List (
+                  Make_Unchecked_Type_Conversion (Loc,
+                    Subtype_Mark =>
+                      New_Occurrence_Of (RTE (RO_ST_Task_Id), Loc),
+                    Expression => Build_Disp_Get_Task_Id_Call (Pref)))));
 
          else
-            Rewrite (N,
-              Build_Call_With_Task (Pref, RTE (RE_Callable)));
+            Rewrite (N, Build_Call_With_Task (Pref, RTE (RE_Callable)));
          end if;
 
          Analyze_And_Resolve (N, Standard_Boolean);
@@ -3581,17 +3591,9 @@ package body Exp_Attr is
               and then Is_Interface (Ptyp)
               and then Is_Task_Interface (Ptyp)
             then
-               declare
-                  Id : constant Node_Id :=
-                    New_Occurrence_Of
-                      (Find_Prim_Op (Ptyp, Name_uDisp_Get_Task_Id), Loc);
-                  Call : constant Node_Id :=
-                    Make_Function_Call (Loc,
-                      Name => Id,
-                      Parameter_Associations => New_List (Pref));
-               begin
-                  Rewrite (N, Unchecked_Convert_To (Id_Kind, Call));
-               end;
+               Rewrite
+                 (N, Unchecked_Convert_To
+                       (Id_Kind, Build_Disp_Get_Task_Id_Call (Pref)));
 
             else
                Rewrite (N,
@@ -6278,25 +6280,15 @@ package body Exp_Attr is
            and then Is_Interface (Ptyp)
            and then Is_Task_Interface (Ptyp)
          then
-            declare
-               Id : constant Node_Id :=
-                 New_Occurrence_Of
-                   (Find_Prim_Op (Ptyp, Name_uDisp_Get_Task_Id), Loc);
-               Call : constant Node_Id :=
-                 Make_Function_Call (Loc,
-                   Name => Id,
-                   Parameter_Associations => New_List (Pref));
-            begin
-               Rewrite (N,
-                 Make_Function_Call (Loc,
-                   Name =>
-                     New_Occurrence_Of (RTE (RE_Terminated), Loc),
-                   Parameter_Associations => New_List (
-                     Make_Unchecked_Type_Conversion (Loc,
-                       Subtype_Mark =>
-                         New_Occurrence_Of (RTE (RO_ST_Task_Id), Loc),
-                       Expression => Call))));
-            end;
+            Rewrite (N,
+              Make_Function_Call (Loc,
+                Name =>
+                  New_Occurrence_Of (RTE (RE_Terminated), Loc),
+                Parameter_Associations => New_List (
+                  Make_Unchecked_Type_Conversion (Loc,
+                    Subtype_Mark =>
+                      New_Occurrence_Of (RTE (RO_ST_Task_Id), Loc),
+                    Expression => Build_Disp_Get_Task_Id_Call (Pref)))));
 
          elsif Restricted_Profile then
             Rewrite (N,
index 57691b9f537acb9165c27c8a90682627371e3f0d..eccfcd2199368ee2fe120fa763453e3f4ed4902a 100644 (file)
@@ -8926,6 +8926,9 @@ package body Exp_Ch4 is
       --  the same visibility as in the generic unit. This avoids duplicating
       --  or factoring the complex code for record/array equality tests etc.
 
+      --  This case is also used for the minimal expansion performed in
+      --  GNATprove mode.
+
       else
          declare
             Loc : constant Source_Ptr := Sloc (N);
@@ -8941,7 +8944,14 @@ package body Exp_Ch4 is
                   Make_Op_Eq (Loc,
                     Left_Opnd =>  Left_Opnd (N),
                     Right_Opnd => Right_Opnd (N)));
-            Set_Paren_Count (Right_Opnd (Neg), 1);
+
+            --  The level of parentheses is useless in GNATprove mode, and
+            --  bumping its level here leads to wrong columns being used in
+            --  check messages, hence skip it in this mode.
+
+            if not GNATprove_Mode then
+               Set_Paren_Count (Right_Opnd (Neg), 1);
+            end if;
 
             if Scope (Ne) /= Standard_Standard then
                Set_Entity (Right_Opnd (Neg), Corresponding_Equality (Ne));
@@ -8958,7 +8968,12 @@ package body Exp_Ch4 is
          end;
       end if;
 
-      Optimize_Length_Comparison (N);
+      --  No need for optimization in GNATprove mode, where we would rather see
+      --  the original source expression.
+
+      if not GNATprove_Mode then
+         Optimize_Length_Comparison (N);
+      end if;
    end Expand_N_Op_Ne;
 
    ---------------------
index 97bc99b8370038cbf7df43692767b46904da454e..6d31eb88031a77cae32413dd7499bdfb4af82ce7 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2015, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2017, Free Software Foundation, Inc.         --
 --                                                                          --
 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
 -- terms of the  GNU General Public License as published  by the Free Soft- --
@@ -2008,6 +2008,31 @@ package body Exp_Fixd is
 
       else
          Do_Divide_Fixed_Fixed (N);
+
+         --  A focused optimization: if after constant folding the
+         --  expression is of the form:  T ((Exp * D) / D), where D is
+         --  a static constant, return  T (Exp). This form will show up
+         --  when D is the denominator of the static expression for the
+         --  'small of fixed-point types involved. This transformation
+         --  removes a division that may be expensive on some targets.
+
+         if Nkind (N) = N_Type_Conversion
+           and then Nkind (Expression (N)) = N_Op_Divide
+         then
+            declare
+               Num : constant Node_Id := Left_Opnd  (Expression (N));
+               Den : constant Node_Id := Right_Opnd (Expression (N));
+
+            begin
+               if Nkind (Den) = N_Integer_Literal
+                 and then Nkind (Num) = N_Op_Multiply
+                 and then Nkind (Right_Opnd (Num)) = N_Integer_Literal
+                 and then Intval (Den) = Intval (Right_Opnd (Num))
+               then
+                  Rewrite (Expression (N), Left_Opnd (Num));
+               end if;
+            end;
+         end if;
       end if;
    end Expand_Divide_Fixed_By_Fixed_Giving_Fixed;
 
index 7062e1373a007b4fefee1e59bfcb0118fac8f927..785652e2a43213dbc6f53cc62b95940a653880ac 100644 (file)
@@ -26,6 +26,7 @@
 with Atree;    use Atree;
 with Checks;   use Checks;
 with Einfo;    use Einfo;
+with Exp_Ch4;
 with Exp_Ch5;  use Exp_Ch5;
 with Exp_Dbug; use Exp_Dbug;
 with Exp_Util; use Exp_Util;
@@ -62,6 +63,9 @@ package body Exp_SPARK is
    procedure Expand_SPARK_N_Object_Renaming_Declaration (N : Node_Id);
    --  Perform name evaluation for a renamed object
 
+   procedure Expand_SPARK_Op_Ne (N : Node_Id);
+   --  Rewrite operator /= based on operator = when defined explicitly
+
    ------------------
    -- Expand_SPARK --
    ------------------
@@ -125,6 +129,9 @@ package body Exp_SPARK is
          when N_Object_Renaming_Declaration =>
             Expand_SPARK_N_Object_Renaming_Declaration (N);
 
+         when N_Op_Ne =>
+            Expand_SPARK_Op_Ne (N);
+
          when N_Freeze_Entity =>
             if Is_Type (Entity (N)) then
                Expand_SPARK_Freeze_Type (Entity (N));
@@ -291,6 +298,26 @@ package body Exp_SPARK is
       Evaluate_Name (Name (N));
    end Expand_SPARK_N_Object_Renaming_Declaration;
 
+   ------------------------
+   -- Expand_SPARK_Op_Ne --
+   ------------------------
+
+   procedure Expand_SPARK_Op_Ne (N : Node_Id) is
+      Typ : constant Entity_Id := Etype (Left_Opnd (N));
+
+   begin
+      --  Case of elementary type with standard operator
+
+      if Is_Elementary_Type (Typ)
+        and then Sloc (Entity (N)) = Standard_Location
+      then
+         null;
+
+      else
+         Exp_Ch4.Expand_N_Op_Ne (N);
+      end if;
+   end Expand_SPARK_Op_Ne;
+
    -------------------------------------
    -- Expand_SPARK_Potential_Renaming --
    -------------------------------------
index f1ce4a4afa370697eb74efa0968e06733ad4f742..91642ed948d2cc2980da0c0850f3bff73e00d5ab 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2015, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2017, Free Software Foundation, Inc.         --
 --                                                                          --
 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
 -- terms of the  GNU General Public License as published  by the Free Soft- --
@@ -219,11 +219,11 @@ package body Opt is
          External_Name_Exp_Casing    := As_Is;
          External_Name_Imp_Casing    := Lowercase;
          Optimize_Alignment          := 'O';
+         Optimize_Alignment_Local    := True;
          Persistent_BSS_Mode         := False;
          Prefix_Exception_Messages   := True;
          Uneval_Old                  := 'E';
          Use_VADS_Size               := False;
-         Optimize_Alignment_Local    := True;
 
          --  Note: we do not need to worry about Warnings_As_Errors_Count since
          --  we do not expect to get any warnings from compiling such a unit.
@@ -293,7 +293,6 @@ package body Opt is
       Default_Pool                   := Default_Pool_Config;
       Exception_Locations_Suppressed := Exception_Locations_Suppressed_Config;
       Fast_Math                      := Fast_Math_Config;
-      Optimize_Alignment             := Optimize_Alignment_Config;
       Polling_Required               := Polling_Required_Config;
    end Set_Opt_Config_Switches;
 
index 09ed571b533cc2363c1a8f298e0e68dc6657ba41..c73b6222ae3d1c10ee730bb048d010b15956bd0b 100644 (file)
@@ -1194,10 +1194,12 @@ package Opt is
    --  type with the semantics that each value does more than the previous one.
 
    Optimize_Alignment : Character := 'O';
+   --  GNAT
    --  Setting of Optimize_Alignment, set to T/S/O for time/space/off. Can
    --  be modified by use of pragma Optimize_Alignment.
 
    Optimize_Alignment_Local : Boolean := False;
+   --  GNAT
    --  Set True if Optimize_Alignment mode is set by a local configuration
    --  pragma that overrides the gnat.adc (or other configuration file) default
    --  so that the unit is not dependent on the default setting. Also always
@@ -1213,10 +1215,12 @@ package Opt is
 
    Optimization_Level : Int;
    pragma Import (C, Optimization_Level, "optimize");
+   --  GNAT
    --  Constant reflecting the optimization level (0,1,2,3 for -O0,-O1,-O2,-O3)
 
    Optimize_Size : Int;
    pragma Import (C, Optimize_Size, "optimize_size");
+   --  GNAT
    --  Constant reflecting setting of -Os (optimize for size). Set to nonzero
    --  in -Os mode and set to zero otherwise.
 
index 9ad370facb6a207e633f2be5fee143939c7e0427..4f7691bc392cf46471aa41d5b4c015f8b537adc8 100644 (file)
@@ -19316,6 +19316,11 @@ package body Sem_Ch3 is
          when N_Attribute_Reference =>
             return Attribute_Name (Original_Node (Exp)) = Name_Input;
 
+         --  "return raise ..." is OK
+
+         when N_Raise_Expression =>
+            return True;
+
          --  For a case expression, all dependent expressions must be legal
 
          when N_Case_Expression =>
index 5c31c428c2fac72bc62181d21e4b76a78c470c7c..61e4f86c6cacc1b3de915cf24305da5210d67a40 100644 (file)
@@ -5996,9 +5996,11 @@ package body Sem_Ch6 is
                   & "(RM-2005 6.5(5.5/2))?y?", Expr);
             end if;
 
-         --  Ada 95 mode, compatibility warnings disabled
+         --  Ada 95 mode, and compatibility warnings disabled
 
          else
+            pragma Assert (Ada_Version <= Ada_95);
+            pragma Assert (not (Warn_On_Ada_2005_Compatibility or GNAT_Mode));
             return; --  skip continuation messages below
          end if;