diff mbox

[Ada] Fix inefficiency in Operator_Matches_Spec

Message ID 20160418092106.GA89950@adacore.com
State New
Headers show

Commit Message

Arnaud Charlet April 18, 2016, 9:21 a.m. UTC
First_Formal is not as cheap as it used to be so this patch eliminates a few
redundant invocations in Operator_Matches_Spec.  No functional changes.

Tested on x86_64-pc-linux-gnu, committed on trunk

2016-04-18  Eric Botcazou  <ebotcazou@adacore.com>

	* sem_type.adb (Operator_Matches_Spec): Call First_Formal on
	New_S only once at the beginning of the function.
diff mbox

Patch

Index: sem_type.adb
===================================================================
--- sem_type.adb	(revision 235093)
+++ sem_type.adb	(working copy)
@@ -3026,20 +3026,21 @@ 
    ---------------------------
 
    function Operator_Matches_Spec (Op, New_S : Entity_Id) return Boolean is
-      Op_Name : constant Name_Id   := Chars (Op);
-      T       : constant Entity_Id := Etype (New_S);
-      New_F   : Entity_Id;
-      Old_F   : Entity_Id;
-      Num     : Int;
-      T1      : Entity_Id;
-      T2      : Entity_Id;
+      Op_Name     : constant Name_Id   := Chars (Op);
+      T           : constant Entity_Id := Etype (New_S);
+      New_First_F : constant Entity_Id := First_Formal (New_S);
+      New_F       : Entity_Id;
+      Old_F       : Entity_Id;
+      Num         : Int;
+      T1          : Entity_Id;
+      T2          : Entity_Id;
 
    begin
       --  To verify that a predefined operator matches a given signature,
       --  do a case analysis of the operator classes. Function can have one
       --  or two formals and must have the proper result type.
 
-      New_F := First_Formal (New_S);
+      New_F := New_First_F;
       Old_F := First_Formal (Op);
       Num := 0;
       while Present (New_F) and then Present (Old_F) loop
@@ -3056,7 +3057,7 @@ 
       --  Unary operators
 
       elsif Num = 1 then
-         T1 := Etype (First_Formal (New_S));
+         T1 := Etype (New_First_F);
 
          if Nam_In (Op_Name, Name_Op_Subtract, Name_Op_Add, Name_Op_Abs) then
             return Base_Type (T1) = Base_Type (T)
@@ -3073,8 +3074,8 @@ 
       --  Binary operators
 
       else
-         T1 := Etype (First_Formal (New_S));
-         T2 := Etype (Next_Formal (First_Formal (New_S)));
+         T1 := Etype (New_First_F);
+         T2 := Etype (Next_Formal (New_First_F));
 
          if Nam_In (Op_Name, Name_Op_And, Name_Op_Or, Name_Op_Xor) then
             return Base_Type (T1) = Base_Type (T2)