* [Ada] Reduce compilation time
@ 2011-08-02 10:14 Arnaud Charlet
0 siblings, 0 replies; only message in thread
From: Arnaud Charlet @ 2011-08-02 10:14 UTC (permalink / raw)
To: gcc-patches; +Cc: Robert Dewar
[-- Attachment #1: Type: text/plain, Size: 456 bytes --]
This patch improves on the previous patch to reduce compilation time,
by providing better implementations for Base_Type and Is_Base_Type and
inlining Base_Type.
No functional changes.
Tested on x86_64-pc-linux-gnu, committed on trunk
2011-08-02 Robert Dewar <dewar@adacore.com>
* einfo.adb (Is_Base_Type): Improve efficiency by using a flag table
(Base_Type): Now uses improved Is_Base_Type function
* einfo.ads (Base_Type): Inline this function
[-- Attachment #2: difs --]
[-- Type: text/plain, Size: 3864 bytes --]
Index: einfo.adb
===================================================================
--- einfo.adb (revision 177122)
+++ einfo.adb (working copy)
@@ -5608,43 +5608,13 @@
---------------
function Base_Type (Id : E) return E is
- Is_Base_Type : Boolean;
begin
- -- Implementation note: this function shows up high in the profile.
- -- We use a fully static case construct so as to make it easier for
- -- the compiler to build a static table out of it, instead of using
- -- a less efficient jump table.
-
- case Ekind (Id) is
- when E_Enumeration_Subtype |
- E_Incomplete_Type |
- E_Signed_Integer_Subtype |
- E_Modular_Integer_Subtype |
- E_Floating_Point_Subtype |
- E_Ordinary_Fixed_Point_Subtype |
- E_Decimal_Fixed_Point_Subtype |
- E_Array_Subtype |
- E_String_Subtype |
- E_Record_Subtype |
- E_Private_Subtype |
- E_Record_Subtype_With_Private |
- E_Limited_Private_Subtype |
- E_Access_Subtype |
- E_Protected_Subtype |
- E_Task_Subtype |
- E_String_Literal_Subtype |
- E_Class_Wide_Subtype =>
- Is_Base_Type := False;
-
- when others =>
- Is_Base_Type := True;
- end case;
-
- if Is_Base_Type then
+ if Is_Base_Type (Id) then
return Id;
+ else
+ pragma Assert (Is_Type (Id));
+ return Etype (Id);
end if;
-
- return Etype (Id);
end Base_Type;
-------------------------
@@ -6206,9 +6176,32 @@
-- Is_Base_Type --
------------------
+ -- Global flag table allowing rapid computation of this function
+
+ Entity_Is_Base_Type : constant array (Entity_Kind) of Boolean :=
+ (E_Enumeration_Subtype |
+ E_Incomplete_Type |
+ E_Signed_Integer_Subtype |
+ E_Modular_Integer_Subtype |
+ E_Floating_Point_Subtype |
+ E_Ordinary_Fixed_Point_Subtype |
+ E_Decimal_Fixed_Point_Subtype |
+ E_Array_Subtype |
+ E_String_Subtype |
+ E_Record_Subtype |
+ E_Private_Subtype |
+ E_Record_Subtype_With_Private |
+ E_Limited_Private_Subtype |
+ E_Access_Subtype |
+ E_Protected_Subtype |
+ E_Task_Subtype |
+ E_String_Literal_Subtype |
+ E_Class_Wide_Subtype => False,
+ others => True);
+
function Is_Base_Type (Id : E) return Boolean is
begin
- return Id = Base_Type (Id);
+ return Entity_Is_Base_Type (Ekind (Id));
end Is_Base_Type;
---------------------
Index: einfo.ads
===================================================================
--- einfo.ads (revision 177110)
+++ einfo.ads (working copy)
@@ -8010,6 +8010,7 @@
-- things here which are small, but not of the canonical attribute
-- access/set format that can be handled by xeinfo.
+ pragma Inline (Base_Type);
pragma Inline (Is_Base_Type);
pragma Inline (Is_Package_Or_Generic_Package);
pragma Inline (Is_Volatile);
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2011-08-02 10:14 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-08-02 10:14 [Ada] Reduce compilation time Arnaud Charlet
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).