public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [Ada] Adjust expansion of perfect hash function for Value
@ 2021-05-05  8:20 Pierre-Marie de Rodat
  0 siblings, 0 replies; only message in thread
From: Pierre-Marie de Rodat @ 2021-05-05  8:20 UTC (permalink / raw)
  To: gcc-patches; +Cc: Eric Botcazou

[-- Attachment #1: Type: text/plain, Size: 375 bytes --]

This moves the declaration of the 4 tables to inside the function itself
for reasons explained in the code.

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

gcc/ada/

	* exp_imgv.ads (Build_Enumeration_Image_Tables): Adjust comment.
	* exp_imgv.adb (Build_Enumeration_Image_Tables): Add the
	declaration nodes of the 4 tables to the declaration list of the
	function body.

[-- Attachment #2: patch.diff --]
[-- Type: text/x-diff, Size: 4541 bytes --]

diff --git a/gcc/ada/exp_imgv.adb b/gcc/ada/exp_imgv.adb
--- a/gcc/ada/exp_imgv.adb
+++ b/gcc/ada/exp_imgv.adb
@@ -304,6 +304,11 @@ package body Exp_Imgv is
          --  named P, T1, T2 and G are needed. The hash function is of the form
 
          --     function Hash (S : String) return Natural is
+         --        xxxP  : constant array (0 .. X) of Natural    = [...];
+         --        xxxT1 : constant array (0 .. Y) of Index_Type = [...];
+         --        xxxT2 : constant array (0 .. Y) of Index_Type = [...];
+         --        xxxG  : constant array (0 .. Z) of Index_Type = [...];
+
          --        F    : constant Natural := S'First - 1;
          --        L    : constant Natural := S'Length;
          --        A, B : Natural := 0;
@@ -320,7 +325,13 @@ package body Exp_Imgv is
          --        return (Natural (G (A)) + Natural (G (B))) mod M;
          --     end Hash;
 
-         --  where N is the length of G and M the number of literals.
+         --  where N is the length of G and M the number of literals. Note that
+         --  we declare the tables inside the function for two reasons: first,
+         --  their analysis creates array subtypes and thus their concatenation
+         --  operators which are homonyms of the concatenation operator and may
+         --  change the homonym number of user operators declared in the scope;
+         --  second, the code generator can fold the values in the tables when
+         --  they are small and avoid emitting them in the final object code.
 
          if H_OK then
             declare
@@ -336,6 +347,8 @@ package body Exp_Imgv is
                Loop_Stmts       : List_Id;
 
             begin
+               Body_Decls := New_List;
+
                --  Generate position table
 
                SPHG.Define (SPHG.Character_Position, Siz, L1, L2);
@@ -350,7 +363,7 @@ package body Exp_Imgv is
                    Chars => New_External_Name (Chars (E), 'P'));
 
                Append_Table_To
-                 (Act, EPos, Nat (L1 - 1), Standard_Natural, Pos);
+                 (Body_Decls, EPos, Nat (L1 - 1), Standard_Natural, Pos);
 
                --  Generate function table 1
 
@@ -367,7 +380,7 @@ package body Exp_Imgv is
 
                Ityp :=
                  Small_Integer_Type_For (UI_From_Int (Int (Siz)), Uns => True);
-               Append_Table_To (Act, ET1, Nat (L1 - 1), Ityp, T1);
+               Append_Table_To (Body_Decls, ET1, Nat (L1 - 1), Ityp, T1);
 
                --  Generate function table 2
 
@@ -384,7 +397,7 @@ package body Exp_Imgv is
 
                Ityp :=
                  Small_Integer_Type_For (UI_From_Int (Int (Siz)), Uns => True);
-               Append_Table_To (Act, ET2, Nat (L1 - 1), Ityp, T2);
+               Append_Table_To (Body_Decls, ET2, Nat (L1 - 1), Ityp, T2);
 
                --  Generate graph table
 
@@ -401,13 +414,11 @@ package body Exp_Imgv is
 
                Ityp :=
                  Small_Integer_Type_For (UI_From_Int (Int (Siz)), Uns => True);
-               Append_Table_To (Act, EG, Nat (L1 - 1), Ityp, G);
-
-               --  Generate body of hash function
+               Append_Table_To (Body_Decls, EG, Nat (L1 - 1), Ityp, G);
 
                F := Make_Temporary (Loc, 'F');
 
-               Body_Decls := New_List (
+               Append_To (Body_Decls,
                  Make_Object_Declaration (Loc,
                    Defining_Identifier => F,
                    Object_Definition   =>


diff --git a/gcc/ada/exp_imgv.ads b/gcc/ada/exp_imgv.ads
--- a/gcc/ada/exp_imgv.ads
+++ b/gcc/ada/exp_imgv.ads
@@ -70,14 +70,8 @@ package Exp_Imgv is
    --
    --  If the number of enumeration literals is large enough, a (perfect) hash
    --  function mapping the literals to their position number is also built and
-   --  requires in turn to build four additional tables:
-   --
-   --    xxxP  : constant array (0 .. X - 1) of Natural = (p1, p2, ..., pX);
-   --    xxxT1 : constant array (0 .. Y - 1) of Index_Type = (q1, ..., qY);
-   --    xxxT2 : constant array (0 .. Y - 1) of Index_Type = (r1, ..., rY);
-   --    xxxG  : constant array (0 .. Z - 1) of Index_Type = (s1, ..., sZ);
-   --
-   --  See the System.Perfect_Hash_Generators unit for a complete description.
+   --  requires additional tables. See the System.Perfect_Hash_Generators unit
+   --  for a complete description of this processing.
 
    procedure Expand_Image_Attribute (N : Node_Id);
    --  This procedure is called from Exp_Attr to expand an occurrence of the



^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2021-05-05  8:20 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-05  8:20 [Ada] Adjust expansion of perfect hash function for Value Pierre-Marie de Rodat

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).