https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108138
Bug ID: 108138
Summary: g++ 9+ takes 7-10x longer compiling constexpr
Product: gcc
Version: 11.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: peter at meraki dot com
Target Milestone: ---
Created attachment 54107
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=54107&action=edit
testcase
The attached testcase takes ~24s to compile on gcc 8.4.0 but takes ~172s with
gcc 11.1.0:
g++-8 -std=gnu++11 -Wall -Werror -ftime-report -c constexpr-testcase2.cc
Time variable usr sys wall
GGC
phase setup : 0.01 ( 0%) 0.00 ( 0%) 0.02 ( 0%)
1495 kB ( 32%)
phase parsing : 19.02 (100%) 5.05 (100%) 24.07 (100%)
3197 kB ( 68%)
|name lookup : 0.01 ( 0%) 0.01 ( 0%) 0.02 ( 0%)
102 kB ( 2%)
|overload resolution : 6.60 ( 35%) 1.61 ( 32%) 7.87 ( 33%)
474 kB ( 10%)
preprocessing : 0.01 ( 0%) 0.01 ( 0%) 0.00 ( 0%)
264 kB ( 6%)
parser (global) : 0.00 ( 0%) 0.00 ( 0%) 0.02 ( 0%)
576 kB ( 12%)
parser inl. func. body : 2.34 ( 12%) 0.72 ( 14%) 2.83 ( 12%)
2325 kB ( 49%)
constant expression evaluation : 16.67 ( 88%) 4.32 ( 86%) 21.22 ( 88%)
31 kB ( 1%)
TOTAL : 19.03 5.05 24.09
4709 kB
g++-11 -Wall -Werror -ftime-report -c constexpr-testcase2.cc
Time variable usr sys wall
GGC
phase setup : 0.00 ( 0%) 0.00 ( 0%) 0.01 ( 0%)
1553k ( 4%)
phase parsing : 165.22 (100%) 7.55 (100%) 172.78 (100%)
36M ( 96%)
|name lookup : 0.02 ( 0%) 0.00 ( 0%) 0.00 ( 0%)
102k ( 0%)
|overload resolution : 82.10 ( 50%) 4.00 ( 53%) 85.99 ( 50%)
17M ( 46%)
preprocessing : 0.01 ( 0%) 0.02 ( 0%) 0.01 ( 0%)
224k ( 1%)
parser (global) : 0.00 ( 0%) 0.00 ( 0%) 0.01 ( 0%)
579k ( 1%)
parser inl. func. body : 2.92 ( 2%) 0.12 ( 2%) 2.82 ( 2%)
5336k ( 14%)
constant expression evaluation : 162.29 ( 98%) 7.41 ( 98%) 169.94 ( 98%)
30M ( 80%)
TOTAL : 165.22 7.55 172.79
38M
The dramatic slowdown appears to have been introduced in gcc 9
The best wall time (of versions tested) was gcc 7.5 at ~15s
The worst wall time was gcc 10.3 at ~180s
The wordlist was trivially constructed from:
wget https://www.mit.edu/~ecprice/wordlist.10000
head -1000 wordlist.10000 | sed 's/\(.*\)/CHECK(\1)/' > wordlist.1000.hh