aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPiotr Trojanek <trojanek@adacore.com>2022-10-06 23:42:46 +0200
committerMarc Poulhiès <poulhies@adacore.com>2022-11-04 14:47:25 +0100
commit533d79ac93b7757060a901df055575320e2ca422 (patch)
tree130b0b5a349fa4239af7c719ff4c2913337e57d4 /gcc
parent41d5a493ede13740a30b4a66cc666ac4daa92fb7 (diff)
downloadgcc-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.adb4
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