<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/55798>55798</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Slow optimization of global array of structs on 32-bit architectures
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
jfgoog
</td>
</tr>
</table>
<pre>
This bug was originally reported in the Android NDK as https://github.com/android/ndk/issues/1418. I have tried to significantly reduce the code compared to the original report.
[slow-compile.tar.gz](https://github.com/llvm/llvm-project/files/8807399/slow-compile.tar.gz)
[settings.ll.txt](https://github.com/llvm/llvm-project/files/8807436/settings.ll.txt)
The attached code declares a global array of structs in table/settings.h, containing about 400 elements: `const SettingDesc _settings[] = { ... }`
The code is extremely slow to compile on several architectures, but particularly bad on 32-bit ARM and x86:
```
clang++ --target=aarch64-linux-android21
real 0m19.253s
user 0m19.206s
sys 0m0.044s
clang++ --target=x86_64-linux-android21
real 0m20.832s
user 0m20.642s
sys 0m0.188s
clang++ --target=armv7a-linux-android21
real 4m53.908s
user 4m53.748s
sys 0m0.088s
clang++ --target=i686-linux-android21
real 1m22.726s
user 1m22.565s
sys 0m0.149s
```
The slowness only occurs when optimizing. It appears to be related to trying to optimize the special function `__cxx_global_var_init`. Unfortunately, because this function does exist explicitly in the code, there is no way to set the `optnone` attribute on it.
I collected the following timing data for arm32 (for brevity, only including the parts that account for the huge amount of time):
```
===-------------------------------------------------------------------------===
Miscellaneous Ungrouped Timers
===-------------------------------------------------------------------------===
---User Time--- --System Time-- --User+System-- ---Wall Time--- --- Name ---
296.1065 (100.0%) 0.0817 ( 95.7%) 296.1882 (100.0%) 296.2507 (100.0%) Code Generation Time
0.0427 ( 0.0%) 0.0036 ( 4.3%) 0.0463 ( 0.0%) 0.0470 ( 0.0%) LLVM IR Generation Time
296.1492 (100.0%) 0.0854 (100.0%) 296.2346 (100.0%) 296.2977 (100.0%) Total
===-------------------------------------------------------------------------===
Instruction Selection and Scheduling
===-------------------------------------------------------------------------===
Total Execution Time: 295.7564 seconds (295.8187 wall clock)
---User Time--- --System Time-- --User+System-- ---Wall Time--- --- Name ---
292.1253 ( 98.8%) 0.0280 ( 87.5%) 292.1533 ( 98.8%) 292.2149 ( 98.8%) DAG Combining after legalize types
1.3959 ( 0.5%) 0.0000 ( 0.0%) 1.3959 ( 0.5%) 1.3961 ( 0.5%) DAG Combining 1
1.3061 ( 0.4%) 0.0040 ( 12.5%) 1.3101 ( 0.4%) 1.3105 ( 0.4%) Instruction Scheduling
0.8146 ( 0.3%) 0.0000 ( 0.0%) 0.8146 ( 0.3%) 0.8147 ( 0.3%) DAG Combining 2
0.0390 ( 0.0%) 0.0000 ( 0.0%) 0.0390 ( 0.0%) 0.0390 ( 0.0%) Type Legalization
0.0200 ( 0.0%) 0.0000 ( 0.0%) 0.0200 ( 0.0%) 0.0201 ( 0.0%) Instruction Selection
0.0094 ( 0.0%) 0.0000 ( 0.0%) 0.0094 ( 0.0%) 0.0094 ( 0.0%) Instruction Creation
0.0079 ( 0.0%) 0.0000 ( 0.0%) 0.0079 ( 0.0%) 0.0079 ( 0.0%) Vector Legalization
0.0060 ( 0.0%) 0.0000 ( 0.0%) 0.0060 ( 0.0%) 0.0060 ( 0.0%) DAG Legalization
0.0003 ( 0.0%) 0.0000 ( 0.0%) 0.0003 ( 0.0%) 0.0003 ( 0.0%) Instruction Scheduling Cleanup
295.7244 (100.0%) 0.0320 (100.0%) 295.7564 (100.0%) 295.8187 (100.0%) Total
===-------------------------------------------------------------------------===
... Pass execution timing report ...
===-------------------------------------------------------------------------===
Total Execution Time: 295.9915 seconds (296.0539 wall clock)
---User Time--- --System Time-- --User+System-- ---Wall Time--- --- Name ---
295.7507 ( 99.9%) 0.0358 ( 49.8%) 295.7864 ( 99.9%) 295.8489 ( 99.9%) ARM Instruction Selection
<everything else in this section deleted>
295.9198 (100.0%) 0.0717 (100.0%) 295.9915 (100.0%) 296.0539 (100.0%) Total
===-------------------------------------------------------------------------===
Clang front-end time report
===-------------------------------------------------------------------------===
Total Execution Time: 296.3532 seconds (296.4156 wall clock)
---User Time--- --System Time-- --User+System-- ---Wall Time--- --- Name ---
296.2545 (100.0%) 0.0986 (100.0%) 296.3532 (100.0%) 296.4156 (100.0%) Clang front-end timer
296.2545 (100.0%) 0.0986 (100.0%) 296.3532 (100.0%) 296.4156 (100.0%) Total
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzNWFtzmzgU_jXOi8YMCHF78EOadDuZbTs7m7T7mBEgY7UYPEgkcX_9fhL4CmSTmW4bj43Fkc5V3zm6pHW-XdytpCJpW5BHrkjdyEJWvCy3pBGbutEiJ7IieiXIZZU3tczJ5-s_CUautN6omX85o3_gW0i9alMnq9d44d1ItKr8O55SqVYoNDzmxQ65ISv-IIhuJITrmihZVHIpM15pqzZvM2E1ZnVuHusNb7qRhrizsLfPmbnXM_eyfwbvVFk_zg2PLIWjeeMUP2bB9YzGz9hblg-7v_mmqb-JTON1CQnG6Dh2Iz9J0BqTTZODaqG1rArllKWjn_RPUMv80Kg9k7tXaZ93iAnXmmcrxMhGLBdZiYgpwklR1ilCxZuGb0m9JEo3baaVnVKeluJY-mpGryCg0lxWIBCe1q0mzHWJKMVaVNq4QWahizFKk9uO71qojNzvhCAKcJvMfPyid8RxHPxfg-fcYmsocCeedAPhmHcTXDPHfXxJXRElHkRjzc9WUiM8bWNCcwW0agJQaJm18BTMKc8Ng0_nqdTk8u9PBBgkT3FoIn8MEFjSfe0r4lQVM_oOXzKfY0YLoWE7NwpDNi9l1T7NezRT71hQI2AXPu7aSxwa-Kojt0o0B7Ib9mS1VaQju47LmDox6TlL4MH9Sw2hrhP7dGAIyCGjI4Z4cfxyQ3izfoj4Swxh68B3Ejc-M8SSIxaPReQ1hsgwDl9ihrem1IloeGaGJQdhMBYPlqhRlBxQazBaCYUyWQF0dZa1jSKPK1GReqPlWv5ADqC-acI3G8HRBzynApWq5LqvYM3W5BZaPUdX6dRGZBKGL9sq0xJIhvL7--zp6b7L4PsH3twjLTXoDvlSLVH52gpCy63NB5FxeAhRSKm9jLwWJsEkklU8bUqZSVNf-2puEtCwot3YTKxqLABbW4-FtkOgC0ZWdSXQMjWmkUg8m5nytO7eQFxZIkGNk-Bc4q1-tI7CR_zlXHNQG6Ty2qcEddG8pI14kNp6YAMqq6xsc8sGISbBEcEVRzizrG4rbSWYrlVboOitLQ1VDUqEqYrP5jqw033nP-uzl9gpIFOfT1JlogScRd0qTF7R1O0GkbqD2Y36RdbtbUTXF5MMRjvalnK7VVqse5KlmCHIvK6jp83_wb7gwGcen_lamMZOOk1Cx3PDwMyw5yK1ZzTAzJgMQ5p7kaGTJHCiHd0yxDEdMJgOGrjRoOPKrBwfRIWVwaLc2LN3zpRX2mkhZ9pdP-zozPGP6Sz0R8ezyB3QP378-onc_D2l3jrDkqEz1vuAjTvps3C8I4mG3t_VmpcnKP89sL6puq2ECcGtMKlvWmbRvTUbkRYVuvhlBtqgkPdPImsPc4K9CjVIC0KGioY9S65MNA0t9uIIxQ5gzso6-362ofr_c4Q6HrYMXS7ETnyMEhp3qIsjJziAAQyBP2QwHRSAG3RcX35AnqzTfiO31PClFAUv7Xqz3Qi1d9Vz_CRIdkgPTjLGHWbA5HhDD70B_dQS71itexjOTtSyTq1HT8V77sh4Sw8G9BN4ngHSaok9Fu64_P90eno86NGAfuo0Pa5OfjIqfkrt5Pgx-h0mlnzsptkWp2PFdELBlOKp8fQwC-5otHfF4Fi5m7BXKZ8cP0I_Vn6F3d9Ad5S8TvfU-BH6V7iKLclUzN3wdTGfHD9CNxib1OuOL2mTeifHD-njmUWuSsGrdnOocai8lA1XPItd6o4seH2pHuuw9fqtroTmjPsXV2anvVt_-k1vd0FhBryJlTBJvOB0JQwdN_CT37kSmkl3-11h4iQnKAliS2fJ8YIHhrhDyQmDRQmLk0GHuQp4pjzN_Ctzx7DFwQkTJkqcoez5COch1e9pcnDgXDPz3x-bnXhJPAruyBtCdR_9sW2enYK3Cm7zuTIHcbJs6krPBTZ45rTVY_sN4Dp0_AAnyjNcMy8IfyeuzdmFjZ-Cknh8u2_dGOuwvgxOQSOT0vxC_ccAHbstucgXfp74Cb_QUpdicWtu9_orj-7ghHP71O3k4Sbv5Obvom3KxavvU_eXz0EQJfHFasGyIIoEZxljqYh4uKQijZZ5FmcRzfw0uSh5ikqw6O4yL-SCupQiSz0vognznDxCCaIuW3opS7EpnTFXrLksHaPYqZviollYG9K2UOgspdLq0ImlQhaVEDv5vNWrull8WxZ1XVxYaxfW1H8BQeEGGQ">