<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/107754>107754</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[LTO] [lld:ELF] Compiler performance regression in Clang 19
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang,
lld
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
vient
</td>
</tr>
</table>
<pre>
I'm building the same code with clang 18 and 19, and noticed that some target build times are disproportionately affected by switching to new compiler - in general Clang 19 is 5-10% slower but an LTO build of one particular target slowed down x2.5
Tried `--time-trace` but don't know what to make of it other than that OptModule got some long tails in Clang 19. First worker under main thread is building the same module in both images so can be directly compared - time increased from 1m20s to 5m24s, x4

```
913.621213 Total OptModule
856.716409 Total OptFunction
856.192565 Total RunPass
556.340514 Total PassManager<Function>
512.635569 Total ModuleInlinerWrapperPass
510.885891 Total ModuleToPostOrderCGSCCPassAdaptor
509.09462 Total DevirtSCCRepeatedPass
507.621024 Total PassManager<LazyCallGraph::SCC, CGSCCAnalysisManager, LazyCallGraph &, CGSCCUpdateResult &>
434.932548 Total CGSCCToFunctionPassAdaptor
142.495075 Total ExecuteLinker
142.421367 Total Link
141.506523 Total LTO
132.923099 Total InstCombinePass
124.003487 Total ModuleToFunctionPassAdaptor
```

```
3237.53794 Total OptModule
845.04484 Total OptFunction
844.38391 Total RunPass
552.922664 Total PassManager<Function>
497.867448 Total ModuleInlinerWrapperPass
495.840083 Total ModuleToPostOrderCGSCCPassAdaptor
493.816647 Total DevirtSCCRepeatedPass
492.195245 Total PassManager<LazyCallGraph::SCC, CGSCCAnalysisManager, LazyCallGraph &, CGSCCUpdateResult &>
417.747014 Total CGSCCToFunctionPassAdaptor
385.505297 Total ExecuteLinker
385.437975 Total Link
384.301031 Total LTO
141.092082 Total InstCombinePass
137.907089 Total ModuleToFunctionPassAdaptor
```
`perf` trace and manual breaking in gdb show that a lot of time is spent around
```
llvm::MCAssembler::layout() ()
llvm::MCObjectStreamer::finishImpl() ()
llvm::MCELFStreamer::finishImpl() ()
llvm::AsmPrinter::doFinalization(llvm::Module&) ()
llvm::FPPassManager::doFinalization(llvm::Module&) ()
llvm::legacy::PassManagerImpl::run(llvm::Module&) ()
```
and also `llvm::MCExpr::evaluateAsRelocatableImpl`. My current build is stripped though, I'll return back with trace results with debug symbols later.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzEVt1u2zoSfhr5hpBA8UcSL3zhOvVBgRQp2iz2eiSNbW4oUiCpuD5Pv6BkJ2ly0p7tLrBAENOcP84383kGQtAHi7jO5IdM3qxgikfn148abVy1rj-vP2WsHkg7adNreyDxiCTAgKRzPZKTjkfSGbAHUjYEbE9KlbHtfLIu6g57Eo8QSXADkgj-gHHxRaIeMBDwSHodRu9G56N2FiKaM4H9HruIPWnPJJx07I5zbEcsnkjnhlEb9CQn2pIDWvRgyHZ5hSI6EJmXNGOSBONO6Ek7RQKW3N7fXWK7PXEWyQg-6m4y4K9Pmw160ruTJd9ZITN6k9HN8v_ea-xJVtE8T2_Po4cOs4rO7ntnM1ZH8mDdiZxSxtGRAR4wxdKRuHhEn6CwCx53Y_zs-skgObgLOsalFEGbkNK6plOQnfYhkpPzD-jJZHv0ZACd_HiEPqX7tjjD4ltb0rp4JHqAAwYSHOnAkjZB7rGL5jxjCR57ks8FIdp2HiFgT_beDaQcGA0pFTkwEVJlv4sLJqzM5IfZcSZvMtYcYxxDxjcZ22Vsd9DxOLVF54aM7aaAPocYoTsOaGPI2A5CwPnQq1aWjexygZLmAlSfK8lU3jW83quqrxgXGVOXoBW9_M1fVcmLipWs5OTeRTDPqC7yRlZFXVaCqmf5brJd6rNnjVIxWcmLxtfJfoEQFqmUVcEFlaW4SJPoM1g4oM_49skV_3jRL1lRcSmra7zlMZ-s0Rb9Pz2MI_oX7ktaNI1sVPmD-r374kK88z367R_ftttksOlhjM5f7KgqqBIVu5jd4KP28dt2-xVHhIj9ixC0TghR9tcZ3MKf5y0Y84eH8ZhqxzfftttU5jnyxoI5B_1kwLbkBwuSsepJ-R9jDxG_YphMnAVXVAQXheJMiubyhln93l3he5NfKVghlKT1tSgfv2M3RbzV9gFf6rCSV_VFJwmvorKQtJLs2hW393cXCWeFYpyqa30-2RC3bmi1xWfMSiYKSrlo6ldleffBr9ryf0YNlFB1e8gpgzoXZd_lai_3eVVT0TVSdKD4e9TgjNeF5LUS71BDyIIK0Yh3mSFEwRv-1JuviJGAZFX1N4khVF00VS2eWuDnxBBKFo2gtOH_GTGE4kVTVpWof80MoVhRKsmE_D8yo6yLWtT06fflV8zgjSwklUzV7zMj6Qheqyf2PDODN6LgtKS8fMMMURZUMdqwnzKD14WiNW3U7zLjejmi36fROc_QeVsYwE5gSOsRHtIoS5O9b0k4utMyMYEYF9M0XeZUIGFEGwl4N9n-L6MZ8zgspfu83YSAQ2tSbdOFgbObYsaajCmyfLy1uWv_hV38Fj3CcDXca6vD8dMwml8Yf7zd_ZblJgxfvLbxata7nbZg9J8wM4o1L4IsfE6d9p633Zcf2vq_d2jwAN15Ob9wPac1X_rpb_p8VazUA2CCSwvWDzh-Hy8Px0cwE0TchK9oXAcRWoNz4IoW5POZdJP3qSWWHS91SPR6HOcV1E2HYyJk2maNIR7j5C1poXtYdtilEf3M0bBc9dhOBxLOQ-tMIAYi-mLVr3mvuIIVrsuayYbKmtLVca32gLytyk5y2tUSKGLfAMMO2rKSUK_0mlEmqKJNKVjDaFGj7OpKgmwb3lBVZYLiANoUKfvC-cNKhzDhuqR1LcXKQIsmzGs6Y_PGnTGWsW3GmDF9OsublV8n47ydDiET1OgQw7O7qKOZ9_zEenlDMvkhWfLNx9td-r69rtWJnM4PYGdEDh5D0M6-XEpXkzfrn0y1uYDLRz56l2iUsd2cTxpsl5Qe1-zfAQAA___Nzd6Z">