diff options
author | Piotr Trojanek <trojanek@adacore.com> | 2022-10-06 23:42:46 +0200 |
---|---|---|
committer | Marc Poulhiès <poulhies@adacore.com> | 2022-11-04 14:47:25 +0100 |
commit | 533d79ac93b7757060a901df055575320e2ca422 (patch) | |
tree | 130b0b5a349fa4239af7c719ff4c2913337e57d4 /gcc | |
parent | 41d5a493ede13740a30b4a66cc666ac4daa92fb7 (diff) | |
download | gcc-533d79ac93b7757060a901df055575320e2ca422.zip gcc-533d79ac93b7757060a901df055575320e2ca422.tar.gz gcc-533d79ac93b7757060a901df055575320e2ca422.tar.bz2 |
ada: Improve efficiency of scope stack restoration
We save/restore visibility by setting the Is_Immediately_Visible flag
and appending entities to / removing them from the tail of an element
list.
However, the Is_Immediately_Visible flag can be restored in any order,
while the element list is singly-linked and removal from the tail is
inefficient. This change removes a performance hot spot, which accounted
for up to 10% of compilation time of complex applications (e.g. QGen),
at least as measured on GNAT built with profiling support.
gcc/ada/
* sem_ch8.adb (Restore_Scope_Stack): Remove elements from the head
and not the tail of an element list.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/sem_ch8.adb | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/gcc/ada/sem_ch8.adb b/gcc/ada/sem_ch8.adb index c4812e2..e555de9 100644 --- a/gcc/ada/sem_ch8.adb +++ b/gcc/ada/sem_ch8.adb @@ -9717,10 +9717,10 @@ package body Sem_Ch8 is -- we saved (we use Remove, since this list will not be used again). loop - Elmt := Last_Elmt (List); + Elmt := First_Elmt (List); exit when Elmt = No_Elmt; Set_Is_Immediately_Visible (Node (Elmt)); - Remove_Last_Elmt (List); + Remove_Elmt (List, Elmt); end loop; -- Restore use clauses |