<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">