Enable ICF on Linux - #129762

Merged
jkotas merged 7 commits into
dotnet:mainfrom
MichalPetryka:patch-64
Jul 3, 2026
Merged

Enable ICF on Linux#129762
jkotas merged 7 commits into
dotnet:mainfrom
MichalPetryka:patch-64

Conversation

@MichalPetryka

@MichalPetrykaMichalPetryka commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

CI is green and it saves on average 2% in size.

Opening to see CI results and size diffs
@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@am11 Since I think you worked in this area the most, what do you think about this? It seems that the GCC build job failed cause ld does not support the flag.

Do the official builds use lld instead? If not, it probably doesn't make sense to do any checking for linker here.

Also, it seems like NativeAOT doesn't use the flags from here.

Comment threadeng/native/configurecompiler.cmake Outdated
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

@MichalStrehovsky, experimented with it earlier. We may need changes from #87045.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalStrehovsky, experimented with it earlier. We may need changes from #87045.

My intent here was to only enable it for native code in the runtime, I'd leave the handling of NAOT outputs to @MichalStrehovsky.

@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

Do you see any size difference before/after on linux?

$ ./build.sh clr+libs -c Release
$ find artifacts/bin/coreclr/linux.x64.Release -name '*.so*' -exec du -sh {} \;

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

Do you see any size difference before/after on linux?

$ ./build.sh clr+libs -c Release
$ find artifacts/bin/coreclr/linux.x64.Release -name '*.so*' -exec du -sh {} \;

I currently do not have a Linux machine on hand to test it, that's why I wanted to see how it impacts rt-sz.

@github-actionsgithub-actionsBot mentioned this pull request Jun 24, 2026
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member
Before (bytes)After (bytes)Diff (bytes)Diff %Path
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm64_arm64.so
14257201295560-130160-9.13%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordbi.so
17657121723664-42048-2.38%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordaccore.so
35424483529920-12528-0.35%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrjit.so
6414818464237208+89024+0.14%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordaccore.so.dbg
648744540616-108128-16.67%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclrtraceptprovider.so
40859284140104+54176+1.33%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgcexp.so.dbg
756904745544-11360-1.50%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgcexp.so
1950434419491816-12528-0.06%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrjit.so.dbg
1366076013661672+912+0.01%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordbi.so.dbg
58196565801704-17952-0.31%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgc.so.dbg
53078965216440-91456-1.72%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclr.so
714296696344-17952-2.51%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgc.so
125775536125815144+39608+0.03%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclr.so.dbg
16367281594136-42592-2.60%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclrtraceptprovider.so.dbg
14257201295560-130160-9.13%artifacts/bin/coreclr/linux.arm64.Release/libmscordbi.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x86_arm64.so
4659357646598952+5376+0.01%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x64_arm64.so.dbg
17657121723664-42048-2.38%artifacts/bin/coreclr/linux.arm64.Release/libmscordaccore.so
42528644284640+31776+0.75%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-collector.so.dbg
41905364189608-928-0.02%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-counter.so.dbg
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_universal_wasm_arm64.so
35424483529920-12528-0.35%artifacts/bin/coreclr/linux.arm64.Release/libclrjit.so
4836465648437168+72512+0.15%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm64_arm64.so.dbg
6414818464237208+89024+0.14%artifacts/bin/coreclr/linux.arm64.Release/libmscordaccore.so.dbg
319464318312-1152-0.36%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-simple.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm_arm64.so
648744540616-108128-16.67%artifacts/bin/coreclr/linux.arm64.Release/libcoreclrtraceptprovider.so
40859284140104+54176+1.33%artifacts/bin/coreclr/linux.arm64.Release/libclrgcexp.so.dbg
4672465646794416+69760+0.15%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_unix_x64_arm64.so.dbg
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/libjitinterface_arm64.so
756904745544-11360-1.50%artifacts/bin/coreclr/linux.arm64.Release/libclrgcexp.so
1950434419491816-12528-0.06%artifacts/bin/coreclr/linux.arm64.Release/libclrjit.so.dbg
39717443970592-1152-0.03%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-simple.so.dbg
1366076013661672+912+0.01%artifacts/bin/coreclr/linux.arm64.Release/libmscordbi.so.dbg
58196565801704-17952-0.31%artifacts/bin/coreclr/linux.arm64.Release/libclrgc.so.dbg
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_unix_x64_arm64.so
3833342438348496+15072+0.04%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm_arm64.so.dbg
4654174446547728+5984+0.01%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x86_arm64.so.dbg
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_universal_wasm_arm64.so
352648351720-928-0.26%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-counter.so
53078965216440-91456-1.72%artifacts/bin/coreclr/linux.arm64.Release/libcoreclr.so
1595335215953352+0+0.00%artifacts/bin/coreclr/linux.arm64.Release/R2RDump/libcoredistools.so
714296696344-17952-2.51%artifacts/bin/coreclr/linux.arm64.Release/libclrgc.so
382832349072-33760-8.82%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-collector.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_wasm_arm64.so
278832278752-80-0.03%artifacts/bin/coreclr/linux.arm64.Release/libjitinterface_arm64.so.dbg
125775536125815144+39608+0.03%artifacts/bin/coreclr/linux.arm64.Release/libcoreclr.so.dbg
316056316056+0+0.00%artifacts/bin/coreclr/linux.arm64.Release/SuperFileCheck/runtimes/linux-arm64/native/libc++abi.so.1
14692801469280+0+0.00%artifacts/bin/coreclr/linux.arm64.Release/SuperFileCheck/runtimes/linux-arm64/native/libc++.so.1
16367281594136-42592-2.60%artifacts/bin/coreclr/linux.arm64.Release/libcoreclrtraceptprovider.so.dbg
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_universal_wasm_arm64.so
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_universal_wasm_arm64.so
3887396838950512+76544+0.20%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_wasm_arm64.so.dbg
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_universal_wasm_arm64.so
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/ilc/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_universal_wasm_arm64.so
106664103208-3456-3.24%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Native.so
36258163622568-3248-0.09%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Compression.Native.so.dbg
4208842088+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Ports.Native.so.dbg
1406414064+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Ports.Native.so
574672573520-1152-0.20%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Security.Cryptography.Native.OpenSsl.so.dbg
13692161365968-3248-0.24%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Compression.Native.so
238032238032+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Globalization.Native.so.dbg
395408391952-3456-0.87%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Native.so.dbg
237544236392-1152-0.48%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Security.Cryptography.Native.OpenSsl.so
6483264832+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Globalization.Native.so
4234442344+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Net.Security.Native.so.dbg
1528015280+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Net.Security.Native.so
909602336906807088-2795248-0.31%TOTAL

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@am11 Can you show the total without .dbg files?

Also, it seems like emscripten doesn't support icf even with lld, what's the proper condition for excluding that?

Comment threadeng/native/configurecompiler.cmake Outdated
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

@am11 Can you show the total without .dbg files?

| 157295704 | 154012152 | -3283552 | -2.09% | TOTAL |

@MichalPetryka
MichalPetryka marked this pull request as ready for review June 24, 2026 09:22
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

captured befroe.md and after.md with this:

echo "| Size (human) | Size (bytes) | Path |"; find artifacts/bin/coreclr/linux.arm64.Release artifacts/bin/native/net11.0-linux-Release-arm64 -name '*.so*' | xargs -I{} bash -c 'echo "| $(du -sh "$0" | cut -f1) | $(du -sb "$0" | cut -f1) | $0 |"' {}

then asked AI to compute deltas (which used python script).

@AndyAyersMS

Copy link
Copy Markdown
Member

/azp run runtime-coreclr outerloop, runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 2 pipeline(s).

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

Failures all unrelated, either non Linux or networking errors.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@jkotas Do you know who'd be the right person to review this?

@jkotas

Copy link
Copy Markdown
Member

This change is not risk-free. --icf=all violates the C/C++ spec guarantees about pointer equality. E.g. from the C23 spec: "Two pointers compare equal if and only if both are null pointers, both are pointers to the same object
(including a pointer to an object and a subobject at its beginning) or function, ...".

We have the equivalent option enabled on Windows, and copilot is not able to find any dependencies on the pointer equality behavior in non-Windows code, so the risk should be acceptable.

@jkotas
jkotas merged commit 986fba0 into dotnet:mainJul 3, 2026
153 of 159 checks passed
@jkotas

Copy link
Copy Markdown
Member

Thanks!

@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview7 milestone Jul 4, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
It saves on average 2% in size.
---------
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@MichalPetrykaMichalPetryka mentioned this pull request Jul 17, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 4, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Infrastructurecommunity-contributionIndicates that the PR has been added by a community member

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

5 participants

@MichalPetryka@am11@AndyAyersMS@jkotas@teo-tsirpanis
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Enable ICF on Linux - #129762

Merged
jkotas merged 7 commits into
dotnet:mainfrom
MichalPetryka:patch-64
Jul 3, 2026
Merged

Enable ICF on Linux#129762
jkotas merged 7 commits into
dotnet:mainfrom
MichalPetryka:patch-64

Conversation

@MichalPetryka

@MichalPetrykaMichalPetryka commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

CI is green and it saves on average 2% in size.

Opening to see CI results and size diffs
@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@am11 Since I think you worked in this area the most, what do you think about this? It seems that the GCC build job failed cause ld does not support the flag.

Do the official builds use lld instead? If not, it probably doesn't make sense to do any checking for linker here.

Also, it seems like NativeAOT doesn't use the flags from here.

Comment threadeng/native/configurecompiler.cmake Outdated
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

@MichalStrehovsky, experimented with it earlier. We may need changes from #87045.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalStrehovsky, experimented with it earlier. We may need changes from #87045.

My intent here was to only enable it for native code in the runtime, I'd leave the handling of NAOT outputs to @MichalStrehovsky.

@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

Do you see any size difference before/after on linux?

$ ./build.sh clr+libs -c Release
$ find artifacts/bin/coreclr/linux.x64.Release -name '*.so*' -exec du -sh {} \;

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

Do you see any size difference before/after on linux?

$ ./build.sh clr+libs -c Release
$ find artifacts/bin/coreclr/linux.x64.Release -name '*.so*' -exec du -sh {} \;

I currently do not have a Linux machine on hand to test it, that's why I wanted to see how it impacts rt-sz.

@github-actionsgithub-actionsBot mentioned this pull request Jun 24, 2026
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member
Before (bytes)After (bytes)Diff (bytes)Diff %Path
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm64_arm64.so
14257201295560-130160-9.13%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordbi.so
17657121723664-42048-2.38%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordaccore.so
35424483529920-12528-0.35%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrjit.so
6414818464237208+89024+0.14%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordaccore.so.dbg
648744540616-108128-16.67%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclrtraceptprovider.so
40859284140104+54176+1.33%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgcexp.so.dbg
756904745544-11360-1.50%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgcexp.so
1950434419491816-12528-0.06%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrjit.so.dbg
1366076013661672+912+0.01%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordbi.so.dbg
58196565801704-17952-0.31%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgc.so.dbg
53078965216440-91456-1.72%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclr.so
714296696344-17952-2.51%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgc.so
125775536125815144+39608+0.03%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclr.so.dbg
16367281594136-42592-2.60%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclrtraceptprovider.so.dbg
14257201295560-130160-9.13%artifacts/bin/coreclr/linux.arm64.Release/libmscordbi.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x86_arm64.so
4659357646598952+5376+0.01%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x64_arm64.so.dbg
17657121723664-42048-2.38%artifacts/bin/coreclr/linux.arm64.Release/libmscordaccore.so
42528644284640+31776+0.75%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-collector.so.dbg
41905364189608-928-0.02%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-counter.so.dbg
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_universal_wasm_arm64.so
35424483529920-12528-0.35%artifacts/bin/coreclr/linux.arm64.Release/libclrjit.so
4836465648437168+72512+0.15%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm64_arm64.so.dbg
6414818464237208+89024+0.14%artifacts/bin/coreclr/linux.arm64.Release/libmscordaccore.so.dbg
319464318312-1152-0.36%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-simple.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm_arm64.so
648744540616-108128-16.67%artifacts/bin/coreclr/linux.arm64.Release/libcoreclrtraceptprovider.so
40859284140104+54176+1.33%artifacts/bin/coreclr/linux.arm64.Release/libclrgcexp.so.dbg
4672465646794416+69760+0.15%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_unix_x64_arm64.so.dbg
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/libjitinterface_arm64.so
756904745544-11360-1.50%artifacts/bin/coreclr/linux.arm64.Release/libclrgcexp.so
1950434419491816-12528-0.06%artifacts/bin/coreclr/linux.arm64.Release/libclrjit.so.dbg
39717443970592-1152-0.03%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-simple.so.dbg
1366076013661672+912+0.01%artifacts/bin/coreclr/linux.arm64.Release/libmscordbi.so.dbg
58196565801704-17952-0.31%artifacts/bin/coreclr/linux.arm64.Release/libclrgc.so.dbg
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_unix_x64_arm64.so
3833342438348496+15072+0.04%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm_arm64.so.dbg
4654174446547728+5984+0.01%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x86_arm64.so.dbg
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_universal_wasm_arm64.so
352648351720-928-0.26%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-counter.so
53078965216440-91456-1.72%artifacts/bin/coreclr/linux.arm64.Release/libcoreclr.so
1595335215953352+0+0.00%artifacts/bin/coreclr/linux.arm64.Release/R2RDump/libcoredistools.so
714296696344-17952-2.51%artifacts/bin/coreclr/linux.arm64.Release/libclrgc.so
382832349072-33760-8.82%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-collector.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_wasm_arm64.so
278832278752-80-0.03%artifacts/bin/coreclr/linux.arm64.Release/libjitinterface_arm64.so.dbg
125775536125815144+39608+0.03%artifacts/bin/coreclr/linux.arm64.Release/libcoreclr.so.dbg
316056316056+0+0.00%artifacts/bin/coreclr/linux.arm64.Release/SuperFileCheck/runtimes/linux-arm64/native/libc++abi.so.1
14692801469280+0+0.00%artifacts/bin/coreclr/linux.arm64.Release/SuperFileCheck/runtimes/linux-arm64/native/libc++.so.1
16367281594136-42592-2.60%artifacts/bin/coreclr/linux.arm64.Release/libcoreclrtraceptprovider.so.dbg
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_universal_wasm_arm64.so
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_universal_wasm_arm64.so
3887396838950512+76544+0.20%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_wasm_arm64.so.dbg
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_universal_wasm_arm64.so
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/ilc/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_universal_wasm_arm64.so
106664103208-3456-3.24%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Native.so
36258163622568-3248-0.09%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Compression.Native.so.dbg
4208842088+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Ports.Native.so.dbg
1406414064+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Ports.Native.so
574672573520-1152-0.20%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Security.Cryptography.Native.OpenSsl.so.dbg
13692161365968-3248-0.24%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Compression.Native.so
238032238032+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Globalization.Native.so.dbg
395408391952-3456-0.87%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Native.so.dbg
237544236392-1152-0.48%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Security.Cryptography.Native.OpenSsl.so
6483264832+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Globalization.Native.so
4234442344+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Net.Security.Native.so.dbg
1528015280+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Net.Security.Native.so
909602336906807088-2795248-0.31%TOTAL

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@am11 Can you show the total without .dbg files?

Also, it seems like emscripten doesn't support icf even with lld, what's the proper condition for excluding that?

Comment threadeng/native/configurecompiler.cmake Outdated
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

@am11 Can you show the total without .dbg files?

| 157295704 | 154012152 | -3283552 | -2.09% | TOTAL |

@MichalPetryka
MichalPetryka marked this pull request as ready for review June 24, 2026 09:22
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

captured befroe.md and after.md with this:

echo "| Size (human) | Size (bytes) | Path |"; find artifacts/bin/coreclr/linux.arm64.Release artifacts/bin/native/net11.0-linux-Release-arm64 -name '*.so*' | xargs -I{} bash -c 'echo "| $(du -sh "$0" | cut -f1) | $(du -sb "$0" | cut -f1) | $0 |"' {}

then asked AI to compute deltas (which used python script).

@AndyAyersMS

Copy link
Copy Markdown
Member

/azp run runtime-coreclr outerloop, runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 2 pipeline(s).

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

Failures all unrelated, either non Linux or networking errors.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@jkotas Do you know who'd be the right person to review this?

@jkotas

Copy link
Copy Markdown
Member

This change is not risk-free. --icf=all violates the C/C++ spec guarantees about pointer equality. E.g. from the C23 spec: "Two pointers compare equal if and only if both are null pointers, both are pointers to the same object
(including a pointer to an object and a subobject at its beginning) or function, ...".

We have the equivalent option enabled on Windows, and copilot is not able to find any dependencies on the pointer equality behavior in non-Windows code, so the risk should be acceptable.

@jkotas
jkotas merged commit 986fba0 into dotnet:mainJul 3, 2026
153 of 159 checks passed
@jkotas

Copy link
Copy Markdown
Member

Thanks!

@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview7 milestone Jul 4, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
It saves on average 2% in size.
---------
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@MichalPetrykaMichalPetryka mentioned this pull request Jul 17, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 4, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Infrastructurecommunity-contributionIndicates that the PR has been added by a community member

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

5 participants

@MichalPetryka@am11@AndyAyersMS@jkotas@teo-tsirpanis
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Enable ICF on Linux - #129762

Merged
jkotas merged 7 commits into
dotnet:mainfrom
MichalPetryka:patch-64
Jul 3, 2026
Merged

Enable ICF on Linux#129762
jkotas merged 7 commits into
dotnet:mainfrom
MichalPetryka:patch-64

Conversation

@MichalPetryka

@MichalPetrykaMichalPetryka commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

CI is green and it saves on average 2% in size.

Opening to see CI results and size diffs
@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@am11 Since I think you worked in this area the most, what do you think about this? It seems that the GCC build job failed cause ld does not support the flag.

Do the official builds use lld instead? If not, it probably doesn't make sense to do any checking for linker here.

Also, it seems like NativeAOT doesn't use the flags from here.

Comment threadeng/native/configurecompiler.cmake Outdated
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

@MichalStrehovsky, experimented with it earlier. We may need changes from #87045.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalStrehovsky, experimented with it earlier. We may need changes from #87045.

My intent here was to only enable it for native code in the runtime, I'd leave the handling of NAOT outputs to @MichalStrehovsky.

@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

Do you see any size difference before/after on linux?

$ ./build.sh clr+libs -c Release
$ find artifacts/bin/coreclr/linux.x64.Release -name '*.so*' -exec du -sh {} \;

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

Do you see any size difference before/after on linux?

$ ./build.sh clr+libs -c Release
$ find artifacts/bin/coreclr/linux.x64.Release -name '*.so*' -exec du -sh {} \;

I currently do not have a Linux machine on hand to test it, that's why I wanted to see how it impacts rt-sz.

@github-actionsgithub-actionsBot mentioned this pull request Jun 24, 2026
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member
Before (bytes)After (bytes)Diff (bytes)Diff %Path
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm64_arm64.so
14257201295560-130160-9.13%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordbi.so
17657121723664-42048-2.38%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordaccore.so
35424483529920-12528-0.35%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrjit.so
6414818464237208+89024+0.14%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordaccore.so.dbg
648744540616-108128-16.67%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclrtraceptprovider.so
40859284140104+54176+1.33%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgcexp.so.dbg
756904745544-11360-1.50%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgcexp.so
1950434419491816-12528-0.06%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrjit.so.dbg
1366076013661672+912+0.01%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordbi.so.dbg
58196565801704-17952-0.31%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgc.so.dbg
53078965216440-91456-1.72%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclr.so
714296696344-17952-2.51%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgc.so
125775536125815144+39608+0.03%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclr.so.dbg
16367281594136-42592-2.60%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclrtraceptprovider.so.dbg
14257201295560-130160-9.13%artifacts/bin/coreclr/linux.arm64.Release/libmscordbi.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x86_arm64.so
4659357646598952+5376+0.01%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x64_arm64.so.dbg
17657121723664-42048-2.38%artifacts/bin/coreclr/linux.arm64.Release/libmscordaccore.so
42528644284640+31776+0.75%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-collector.so.dbg
41905364189608-928-0.02%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-counter.so.dbg
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_universal_wasm_arm64.so
35424483529920-12528-0.35%artifacts/bin/coreclr/linux.arm64.Release/libclrjit.so
4836465648437168+72512+0.15%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm64_arm64.so.dbg
6414818464237208+89024+0.14%artifacts/bin/coreclr/linux.arm64.Release/libmscordaccore.so.dbg
319464318312-1152-0.36%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-simple.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm_arm64.so
648744540616-108128-16.67%artifacts/bin/coreclr/linux.arm64.Release/libcoreclrtraceptprovider.so
40859284140104+54176+1.33%artifacts/bin/coreclr/linux.arm64.Release/libclrgcexp.so.dbg
4672465646794416+69760+0.15%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_unix_x64_arm64.so.dbg
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/libjitinterface_arm64.so
756904745544-11360-1.50%artifacts/bin/coreclr/linux.arm64.Release/libclrgcexp.so
1950434419491816-12528-0.06%artifacts/bin/coreclr/linux.arm64.Release/libclrjit.so.dbg
39717443970592-1152-0.03%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-simple.so.dbg
1366076013661672+912+0.01%artifacts/bin/coreclr/linux.arm64.Release/libmscordbi.so.dbg
58196565801704-17952-0.31%artifacts/bin/coreclr/linux.arm64.Release/libclrgc.so.dbg
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_unix_x64_arm64.so
3833342438348496+15072+0.04%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm_arm64.so.dbg
4654174446547728+5984+0.01%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x86_arm64.so.dbg
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_universal_wasm_arm64.so
352648351720-928-0.26%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-counter.so
53078965216440-91456-1.72%artifacts/bin/coreclr/linux.arm64.Release/libcoreclr.so
1595335215953352+0+0.00%artifacts/bin/coreclr/linux.arm64.Release/R2RDump/libcoredistools.so
714296696344-17952-2.51%artifacts/bin/coreclr/linux.arm64.Release/libclrgc.so
382832349072-33760-8.82%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-collector.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_wasm_arm64.so
278832278752-80-0.03%artifacts/bin/coreclr/linux.arm64.Release/libjitinterface_arm64.so.dbg
125775536125815144+39608+0.03%artifacts/bin/coreclr/linux.arm64.Release/libcoreclr.so.dbg
316056316056+0+0.00%artifacts/bin/coreclr/linux.arm64.Release/SuperFileCheck/runtimes/linux-arm64/native/libc++abi.so.1
14692801469280+0+0.00%artifacts/bin/coreclr/linux.arm64.Release/SuperFileCheck/runtimes/linux-arm64/native/libc++.so.1
16367281594136-42592-2.60%artifacts/bin/coreclr/linux.arm64.Release/libcoreclrtraceptprovider.so.dbg
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_universal_wasm_arm64.so
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_universal_wasm_arm64.so
3887396838950512+76544+0.20%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_wasm_arm64.so.dbg
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_universal_wasm_arm64.so
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/ilc/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_universal_wasm_arm64.so
106664103208-3456-3.24%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Native.so
36258163622568-3248-0.09%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Compression.Native.so.dbg
4208842088+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Ports.Native.so.dbg
1406414064+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Ports.Native.so
574672573520-1152-0.20%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Security.Cryptography.Native.OpenSsl.so.dbg
13692161365968-3248-0.24%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Compression.Native.so
238032238032+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Globalization.Native.so.dbg
395408391952-3456-0.87%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Native.so.dbg
237544236392-1152-0.48%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Security.Cryptography.Native.OpenSsl.so
6483264832+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Globalization.Native.so
4234442344+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Net.Security.Native.so.dbg
1528015280+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Net.Security.Native.so
909602336906807088-2795248-0.31%TOTAL

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@am11 Can you show the total without .dbg files?

Also, it seems like emscripten doesn't support icf even with lld, what's the proper condition for excluding that?

Comment threadeng/native/configurecompiler.cmake Outdated
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

@am11 Can you show the total without .dbg files?

| 157295704 | 154012152 | -3283552 | -2.09% | TOTAL |

@MichalPetryka
MichalPetryka marked this pull request as ready for review June 24, 2026 09:22
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

captured befroe.md and after.md with this:

echo "| Size (human) | Size (bytes) | Path |"; find artifacts/bin/coreclr/linux.arm64.Release artifacts/bin/native/net11.0-linux-Release-arm64 -name '*.so*' | xargs -I{} bash -c 'echo "| $(du -sh "$0" | cut -f1) | $(du -sb "$0" | cut -f1) | $0 |"' {}

then asked AI to compute deltas (which used python script).

@AndyAyersMS

Copy link
Copy Markdown
Member

/azp run runtime-coreclr outerloop, runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 2 pipeline(s).

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

Failures all unrelated, either non Linux or networking errors.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@jkotas Do you know who'd be the right person to review this?

@jkotas

Copy link
Copy Markdown
Member

This change is not risk-free. --icf=all violates the C/C++ spec guarantees about pointer equality. E.g. from the C23 spec: "Two pointers compare equal if and only if both are null pointers, both are pointers to the same object
(including a pointer to an object and a subobject at its beginning) or function, ...".

We have the equivalent option enabled on Windows, and copilot is not able to find any dependencies on the pointer equality behavior in non-Windows code, so the risk should be acceptable.

@jkotas
jkotas merged commit 986fba0 into dotnet:mainJul 3, 2026
153 of 159 checks passed
@jkotas

Copy link
Copy Markdown
Member

Thanks!

@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview7 milestone Jul 4, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
It saves on average 2% in size.
---------
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@MichalPetrykaMichalPetryka mentioned this pull request Jul 17, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 4, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Infrastructurecommunity-contributionIndicates that the PR has been added by a community member

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

5 participants

@MichalPetryka@am11@AndyAyersMS@jkotas@teo-tsirpanis
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Enable ICF on Linux - #129762

Merged
jkotas merged 7 commits into
dotnet:mainfrom
MichalPetryka:patch-64
Jul 3, 2026
Merged

Enable ICF on Linux#129762
jkotas merged 7 commits into
dotnet:mainfrom
MichalPetryka:patch-64

Conversation

@MichalPetryka

@MichalPetrykaMichalPetryka commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

CI is green and it saves on average 2% in size.

Opening to see CI results and size diffs
@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@am11 Since I think you worked in this area the most, what do you think about this? It seems that the GCC build job failed cause ld does not support the flag.

Do the official builds use lld instead? If not, it probably doesn't make sense to do any checking for linker here.

Also, it seems like NativeAOT doesn't use the flags from here.

Comment threadeng/native/configurecompiler.cmake Outdated
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

@MichalStrehovsky, experimented with it earlier. We may need changes from #87045.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalStrehovsky, experimented with it earlier. We may need changes from #87045.

My intent here was to only enable it for native code in the runtime, I'd leave the handling of NAOT outputs to @MichalStrehovsky.

@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

Do you see any size difference before/after on linux?

$ ./build.sh clr+libs -c Release
$ find artifacts/bin/coreclr/linux.x64.Release -name '*.so*' -exec du -sh {} \;

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

Do you see any size difference before/after on linux?

$ ./build.sh clr+libs -c Release
$ find artifacts/bin/coreclr/linux.x64.Release -name '*.so*' -exec du -sh {} \;

I currently do not have a Linux machine on hand to test it, that's why I wanted to see how it impacts rt-sz.

@github-actionsgithub-actionsBot mentioned this pull request Jun 24, 2026
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member
Before (bytes)After (bytes)Diff (bytes)Diff %Path
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm64_arm64.so
14257201295560-130160-9.13%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordbi.so
17657121723664-42048-2.38%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordaccore.so
35424483529920-12528-0.35%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrjit.so
6414818464237208+89024+0.14%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordaccore.so.dbg
648744540616-108128-16.67%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclrtraceptprovider.so
40859284140104+54176+1.33%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgcexp.so.dbg
756904745544-11360-1.50%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgcexp.so
1950434419491816-12528-0.06%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrjit.so.dbg
1366076013661672+912+0.01%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordbi.so.dbg
58196565801704-17952-0.31%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgc.so.dbg
53078965216440-91456-1.72%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclr.so
714296696344-17952-2.51%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgc.so
125775536125815144+39608+0.03%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclr.so.dbg
16367281594136-42592-2.60%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclrtraceptprovider.so.dbg
14257201295560-130160-9.13%artifacts/bin/coreclr/linux.arm64.Release/libmscordbi.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x86_arm64.so
4659357646598952+5376+0.01%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x64_arm64.so.dbg
17657121723664-42048-2.38%artifacts/bin/coreclr/linux.arm64.Release/libmscordaccore.so
42528644284640+31776+0.75%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-collector.so.dbg
41905364189608-928-0.02%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-counter.so.dbg
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_universal_wasm_arm64.so
35424483529920-12528-0.35%artifacts/bin/coreclr/linux.arm64.Release/libclrjit.so
4836465648437168+72512+0.15%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm64_arm64.so.dbg
6414818464237208+89024+0.14%artifacts/bin/coreclr/linux.arm64.Release/libmscordaccore.so.dbg
319464318312-1152-0.36%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-simple.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm_arm64.so
648744540616-108128-16.67%artifacts/bin/coreclr/linux.arm64.Release/libcoreclrtraceptprovider.so
40859284140104+54176+1.33%artifacts/bin/coreclr/linux.arm64.Release/libclrgcexp.so.dbg
4672465646794416+69760+0.15%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_unix_x64_arm64.so.dbg
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/libjitinterface_arm64.so
756904745544-11360-1.50%artifacts/bin/coreclr/linux.arm64.Release/libclrgcexp.so
1950434419491816-12528-0.06%artifacts/bin/coreclr/linux.arm64.Release/libclrjit.so.dbg
39717443970592-1152-0.03%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-simple.so.dbg
1366076013661672+912+0.01%artifacts/bin/coreclr/linux.arm64.Release/libmscordbi.so.dbg
58196565801704-17952-0.31%artifacts/bin/coreclr/linux.arm64.Release/libclrgc.so.dbg
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_unix_x64_arm64.so
3833342438348496+15072+0.04%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm_arm64.so.dbg
4654174446547728+5984+0.01%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x86_arm64.so.dbg
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_universal_wasm_arm64.so
352648351720-928-0.26%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-counter.so
53078965216440-91456-1.72%artifacts/bin/coreclr/linux.arm64.Release/libcoreclr.so
1595335215953352+0+0.00%artifacts/bin/coreclr/linux.arm64.Release/R2RDump/libcoredistools.so
714296696344-17952-2.51%artifacts/bin/coreclr/linux.arm64.Release/libclrgc.so
382832349072-33760-8.82%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-collector.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_wasm_arm64.so
278832278752-80-0.03%artifacts/bin/coreclr/linux.arm64.Release/libjitinterface_arm64.so.dbg
125775536125815144+39608+0.03%artifacts/bin/coreclr/linux.arm64.Release/libcoreclr.so.dbg
316056316056+0+0.00%artifacts/bin/coreclr/linux.arm64.Release/SuperFileCheck/runtimes/linux-arm64/native/libc++abi.so.1
14692801469280+0+0.00%artifacts/bin/coreclr/linux.arm64.Release/SuperFileCheck/runtimes/linux-arm64/native/libc++.so.1
16367281594136-42592-2.60%artifacts/bin/coreclr/linux.arm64.Release/libcoreclrtraceptprovider.so.dbg
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_universal_wasm_arm64.so
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_universal_wasm_arm64.so
3887396838950512+76544+0.20%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_wasm_arm64.so.dbg
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_universal_wasm_arm64.so
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/ilc/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_universal_wasm_arm64.so
106664103208-3456-3.24%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Native.so
36258163622568-3248-0.09%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Compression.Native.so.dbg
4208842088+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Ports.Native.so.dbg
1406414064+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Ports.Native.so
574672573520-1152-0.20%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Security.Cryptography.Native.OpenSsl.so.dbg
13692161365968-3248-0.24%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Compression.Native.so
238032238032+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Globalization.Native.so.dbg
395408391952-3456-0.87%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Native.so.dbg
237544236392-1152-0.48%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Security.Cryptography.Native.OpenSsl.so
6483264832+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Globalization.Native.so
4234442344+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Net.Security.Native.so.dbg
1528015280+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Net.Security.Native.so
909602336906807088-2795248-0.31%TOTAL

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@am11 Can you show the total without .dbg files?

Also, it seems like emscripten doesn't support icf even with lld, what's the proper condition for excluding that?

Comment threadeng/native/configurecompiler.cmake Outdated
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

@am11 Can you show the total without .dbg files?

| 157295704 | 154012152 | -3283552 | -2.09% | TOTAL |

@MichalPetryka
MichalPetryka marked this pull request as ready for review June 24, 2026 09:22
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

captured befroe.md and after.md with this:

echo "| Size (human) | Size (bytes) | Path |"; find artifacts/bin/coreclr/linux.arm64.Release artifacts/bin/native/net11.0-linux-Release-arm64 -name '*.so*' | xargs -I{} bash -c 'echo "| $(du -sh "$0" | cut -f1) | $(du -sb "$0" | cut -f1) | $0 |"' {}

then asked AI to compute deltas (which used python script).

@AndyAyersMS

Copy link
Copy Markdown
Member

/azp run runtime-coreclr outerloop, runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 2 pipeline(s).

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

Failures all unrelated, either non Linux or networking errors.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@jkotas Do you know who'd be the right person to review this?

@jkotas

Copy link
Copy Markdown
Member

This change is not risk-free. --icf=all violates the C/C++ spec guarantees about pointer equality. E.g. from the C23 spec: "Two pointers compare equal if and only if both are null pointers, both are pointers to the same object
(including a pointer to an object and a subobject at its beginning) or function, ...".

We have the equivalent option enabled on Windows, and copilot is not able to find any dependencies on the pointer equality behavior in non-Windows code, so the risk should be acceptable.

@jkotas
jkotas merged commit 986fba0 into dotnet:mainJul 3, 2026
153 of 159 checks passed
@jkotas

Copy link
Copy Markdown
Member

Thanks!

@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview7 milestone Jul 4, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
It saves on average 2% in size.
---------
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@MichalPetrykaMichalPetryka mentioned this pull request Jul 17, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 4, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Infrastructurecommunity-contributionIndicates that the PR has been added by a community member

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

5 participants

@MichalPetryka@am11@AndyAyersMS@jkotas@teo-tsirpanis
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Enable ICF on Linux - #129762

Merged
jkotas merged 7 commits into
dotnet:mainfrom
MichalPetryka:patch-64
Jul 3, 2026
Merged

Enable ICF on Linux#129762
jkotas merged 7 commits into
dotnet:mainfrom
MichalPetryka:patch-64

Conversation

@MichalPetryka

@MichalPetrykaMichalPetryka commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

CI is green and it saves on average 2% in size.

Opening to see CI results and size diffs
@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@am11 Since I think you worked in this area the most, what do you think about this? It seems that the GCC build job failed cause ld does not support the flag.

Do the official builds use lld instead? If not, it probably doesn't make sense to do any checking for linker here.

Also, it seems like NativeAOT doesn't use the flags from here.

Comment threadeng/native/configurecompiler.cmake Outdated
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

@MichalStrehovsky, experimented with it earlier. We may need changes from #87045.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalStrehovsky, experimented with it earlier. We may need changes from #87045.

My intent here was to only enable it for native code in the runtime, I'd leave the handling of NAOT outputs to @MichalStrehovsky.

@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

Do you see any size difference before/after on linux?

$ ./build.sh clr+libs -c Release
$ find artifacts/bin/coreclr/linux.x64.Release -name '*.so*' -exec du -sh {} \;

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

Do you see any size difference before/after on linux?

$ ./build.sh clr+libs -c Release
$ find artifacts/bin/coreclr/linux.x64.Release -name '*.so*' -exec du -sh {} \;

I currently do not have a Linux machine on hand to test it, that's why I wanted to see how it impacts rt-sz.

@github-actionsgithub-actionsBot mentioned this pull request Jun 24, 2026
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member
Before (bytes)After (bytes)Diff (bytes)Diff %Path
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm64_arm64.so
14257201295560-130160-9.13%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordbi.so
17657121723664-42048-2.38%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordaccore.so
35424483529920-12528-0.35%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrjit.so
6414818464237208+89024+0.14%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordaccore.so.dbg
648744540616-108128-16.67%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclrtraceptprovider.so
40859284140104+54176+1.33%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgcexp.so.dbg
756904745544-11360-1.50%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgcexp.so
1950434419491816-12528-0.06%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrjit.so.dbg
1366076013661672+912+0.01%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordbi.so.dbg
58196565801704-17952-0.31%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgc.so.dbg
53078965216440-91456-1.72%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclr.so
714296696344-17952-2.51%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgc.so
125775536125815144+39608+0.03%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclr.so.dbg
16367281594136-42592-2.60%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclrtraceptprovider.so.dbg
14257201295560-130160-9.13%artifacts/bin/coreclr/linux.arm64.Release/libmscordbi.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x86_arm64.so
4659357646598952+5376+0.01%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x64_arm64.so.dbg
17657121723664-42048-2.38%artifacts/bin/coreclr/linux.arm64.Release/libmscordaccore.so
42528644284640+31776+0.75%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-collector.so.dbg
41905364189608-928-0.02%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-counter.so.dbg
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_universal_wasm_arm64.so
35424483529920-12528-0.35%artifacts/bin/coreclr/linux.arm64.Release/libclrjit.so
4836465648437168+72512+0.15%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm64_arm64.so.dbg
6414818464237208+89024+0.14%artifacts/bin/coreclr/linux.arm64.Release/libmscordaccore.so.dbg
319464318312-1152-0.36%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-simple.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm_arm64.so
648744540616-108128-16.67%artifacts/bin/coreclr/linux.arm64.Release/libcoreclrtraceptprovider.so
40859284140104+54176+1.33%artifacts/bin/coreclr/linux.arm64.Release/libclrgcexp.so.dbg
4672465646794416+69760+0.15%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_unix_x64_arm64.so.dbg
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/libjitinterface_arm64.so
756904745544-11360-1.50%artifacts/bin/coreclr/linux.arm64.Release/libclrgcexp.so
1950434419491816-12528-0.06%artifacts/bin/coreclr/linux.arm64.Release/libclrjit.so.dbg
39717443970592-1152-0.03%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-simple.so.dbg
1366076013661672+912+0.01%artifacts/bin/coreclr/linux.arm64.Release/libmscordbi.so.dbg
58196565801704-17952-0.31%artifacts/bin/coreclr/linux.arm64.Release/libclrgc.so.dbg
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_unix_x64_arm64.so
3833342438348496+15072+0.04%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm_arm64.so.dbg
4654174446547728+5984+0.01%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x86_arm64.so.dbg
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_universal_wasm_arm64.so
352648351720-928-0.26%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-counter.so
53078965216440-91456-1.72%artifacts/bin/coreclr/linux.arm64.Release/libcoreclr.so
1595335215953352+0+0.00%artifacts/bin/coreclr/linux.arm64.Release/R2RDump/libcoredistools.so
714296696344-17952-2.51%artifacts/bin/coreclr/linux.arm64.Release/libclrgc.so
382832349072-33760-8.82%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-collector.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_wasm_arm64.so
278832278752-80-0.03%artifacts/bin/coreclr/linux.arm64.Release/libjitinterface_arm64.so.dbg
125775536125815144+39608+0.03%artifacts/bin/coreclr/linux.arm64.Release/libcoreclr.so.dbg
316056316056+0+0.00%artifacts/bin/coreclr/linux.arm64.Release/SuperFileCheck/runtimes/linux-arm64/native/libc++abi.so.1
14692801469280+0+0.00%artifacts/bin/coreclr/linux.arm64.Release/SuperFileCheck/runtimes/linux-arm64/native/libc++.so.1
16367281594136-42592-2.60%artifacts/bin/coreclr/linux.arm64.Release/libcoreclrtraceptprovider.so.dbg
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_universal_wasm_arm64.so
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_universal_wasm_arm64.so
3887396838950512+76544+0.20%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_wasm_arm64.so.dbg
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_universal_wasm_arm64.so
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/ilc/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_universal_wasm_arm64.so
106664103208-3456-3.24%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Native.so
36258163622568-3248-0.09%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Compression.Native.so.dbg
4208842088+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Ports.Native.so.dbg
1406414064+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Ports.Native.so
574672573520-1152-0.20%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Security.Cryptography.Native.OpenSsl.so.dbg
13692161365968-3248-0.24%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Compression.Native.so
238032238032+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Globalization.Native.so.dbg
395408391952-3456-0.87%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Native.so.dbg
237544236392-1152-0.48%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Security.Cryptography.Native.OpenSsl.so
6483264832+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Globalization.Native.so
4234442344+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Net.Security.Native.so.dbg
1528015280+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Net.Security.Native.so
909602336906807088-2795248-0.31%TOTAL

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@am11 Can you show the total without .dbg files?

Also, it seems like emscripten doesn't support icf even with lld, what's the proper condition for excluding that?

Comment threadeng/native/configurecompiler.cmake Outdated
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

@am11 Can you show the total without .dbg files?

| 157295704 | 154012152 | -3283552 | -2.09% | TOTAL |

@MichalPetryka
MichalPetryka marked this pull request as ready for review June 24, 2026 09:22
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

captured befroe.md and after.md with this:

echo "| Size (human) | Size (bytes) | Path |"; find artifacts/bin/coreclr/linux.arm64.Release artifacts/bin/native/net11.0-linux-Release-arm64 -name '*.so*' | xargs -I{} bash -c 'echo "| $(du -sh "$0" | cut -f1) | $(du -sb "$0" | cut -f1) | $0 |"' {}

then asked AI to compute deltas (which used python script).

@AndyAyersMS

Copy link
Copy Markdown
Member

/azp run runtime-coreclr outerloop, runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 2 pipeline(s).

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

Failures all unrelated, either non Linux or networking errors.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@jkotas Do you know who'd be the right person to review this?

@jkotas

Copy link
Copy Markdown
Member

This change is not risk-free. --icf=all violates the C/C++ spec guarantees about pointer equality. E.g. from the C23 spec: "Two pointers compare equal if and only if both are null pointers, both are pointers to the same object
(including a pointer to an object and a subobject at its beginning) or function, ...".

We have the equivalent option enabled on Windows, and copilot is not able to find any dependencies on the pointer equality behavior in non-Windows code, so the risk should be acceptable.

@jkotas
jkotas merged commit 986fba0 into dotnet:mainJul 3, 2026
153 of 159 checks passed
@jkotas

Copy link
Copy Markdown
Member

Thanks!

@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview7 milestone Jul 4, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
It saves on average 2% in size.
---------
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@MichalPetrykaMichalPetryka mentioned this pull request Jul 17, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 4, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Infrastructurecommunity-contributionIndicates that the PR has been added by a community member

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

5 participants

@MichalPetryka@am11@AndyAyersMS@jkotas@teo-tsirpanis
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Enable ICF on Linux - #129762

Merged
jkotas merged 7 commits into
dotnet:mainfrom
MichalPetryka:patch-64
Jul 3, 2026
Merged

Enable ICF on Linux#129762
jkotas merged 7 commits into
dotnet:mainfrom
MichalPetryka:patch-64

Conversation

@MichalPetryka

@MichalPetrykaMichalPetryka commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

CI is green and it saves on average 2% in size.

Opening to see CI results and size diffs
@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@am11 Since I think you worked in this area the most, what do you think about this? It seems that the GCC build job failed cause ld does not support the flag.

Do the official builds use lld instead? If not, it probably doesn't make sense to do any checking for linker here.

Also, it seems like NativeAOT doesn't use the flags from here.

Comment threadeng/native/configurecompiler.cmake Outdated
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

@MichalStrehovsky, experimented with it earlier. We may need changes from #87045.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalStrehovsky, experimented with it earlier. We may need changes from #87045.

My intent here was to only enable it for native code in the runtime, I'd leave the handling of NAOT outputs to @MichalStrehovsky.

@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

Do you see any size difference before/after on linux?

$ ./build.sh clr+libs -c Release
$ find artifacts/bin/coreclr/linux.x64.Release -name '*.so*' -exec du -sh {} \;

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

Do you see any size difference before/after on linux?

$ ./build.sh clr+libs -c Release
$ find artifacts/bin/coreclr/linux.x64.Release -name '*.so*' -exec du -sh {} \;

I currently do not have a Linux machine on hand to test it, that's why I wanted to see how it impacts rt-sz.

@github-actionsgithub-actionsBot mentioned this pull request Jun 24, 2026
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member
Before (bytes)After (bytes)Diff (bytes)Diff %Path
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm64_arm64.so
14257201295560-130160-9.13%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordbi.so
17657121723664-42048-2.38%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordaccore.so
35424483529920-12528-0.35%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrjit.so
6414818464237208+89024+0.14%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordaccore.so.dbg
648744540616-108128-16.67%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclrtraceptprovider.so
40859284140104+54176+1.33%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgcexp.so.dbg
756904745544-11360-1.50%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgcexp.so
1950434419491816-12528-0.06%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrjit.so.dbg
1366076013661672+912+0.01%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordbi.so.dbg
58196565801704-17952-0.31%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgc.so.dbg
53078965216440-91456-1.72%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclr.so
714296696344-17952-2.51%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgc.so
125775536125815144+39608+0.03%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclr.so.dbg
16367281594136-42592-2.60%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclrtraceptprovider.so.dbg
14257201295560-130160-9.13%artifacts/bin/coreclr/linux.arm64.Release/libmscordbi.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x86_arm64.so
4659357646598952+5376+0.01%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x64_arm64.so.dbg
17657121723664-42048-2.38%artifacts/bin/coreclr/linux.arm64.Release/libmscordaccore.so
42528644284640+31776+0.75%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-collector.so.dbg
41905364189608-928-0.02%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-counter.so.dbg
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_universal_wasm_arm64.so
35424483529920-12528-0.35%artifacts/bin/coreclr/linux.arm64.Release/libclrjit.so
4836465648437168+72512+0.15%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm64_arm64.so.dbg
6414818464237208+89024+0.14%artifacts/bin/coreclr/linux.arm64.Release/libmscordaccore.so.dbg
319464318312-1152-0.36%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-simple.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm_arm64.so
648744540616-108128-16.67%artifacts/bin/coreclr/linux.arm64.Release/libcoreclrtraceptprovider.so
40859284140104+54176+1.33%artifacts/bin/coreclr/linux.arm64.Release/libclrgcexp.so.dbg
4672465646794416+69760+0.15%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_unix_x64_arm64.so.dbg
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/libjitinterface_arm64.so
756904745544-11360-1.50%artifacts/bin/coreclr/linux.arm64.Release/libclrgcexp.so
1950434419491816-12528-0.06%artifacts/bin/coreclr/linux.arm64.Release/libclrjit.so.dbg
39717443970592-1152-0.03%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-simple.so.dbg
1366076013661672+912+0.01%artifacts/bin/coreclr/linux.arm64.Release/libmscordbi.so.dbg
58196565801704-17952-0.31%artifacts/bin/coreclr/linux.arm64.Release/libclrgc.so.dbg
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_unix_x64_arm64.so
3833342438348496+15072+0.04%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm_arm64.so.dbg
4654174446547728+5984+0.01%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x86_arm64.so.dbg
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_universal_wasm_arm64.so
352648351720-928-0.26%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-counter.so
53078965216440-91456-1.72%artifacts/bin/coreclr/linux.arm64.Release/libcoreclr.so
1595335215953352+0+0.00%artifacts/bin/coreclr/linux.arm64.Release/R2RDump/libcoredistools.so
714296696344-17952-2.51%artifacts/bin/coreclr/linux.arm64.Release/libclrgc.so
382832349072-33760-8.82%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-collector.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_wasm_arm64.so
278832278752-80-0.03%artifacts/bin/coreclr/linux.arm64.Release/libjitinterface_arm64.so.dbg
125775536125815144+39608+0.03%artifacts/bin/coreclr/linux.arm64.Release/libcoreclr.so.dbg
316056316056+0+0.00%artifacts/bin/coreclr/linux.arm64.Release/SuperFileCheck/runtimes/linux-arm64/native/libc++abi.so.1
14692801469280+0+0.00%artifacts/bin/coreclr/linux.arm64.Release/SuperFileCheck/runtimes/linux-arm64/native/libc++.so.1
16367281594136-42592-2.60%artifacts/bin/coreclr/linux.arm64.Release/libcoreclrtraceptprovider.so.dbg
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_universal_wasm_arm64.so
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_universal_wasm_arm64.so
3887396838950512+76544+0.20%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_wasm_arm64.so.dbg
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_universal_wasm_arm64.so
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/ilc/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_universal_wasm_arm64.so
106664103208-3456-3.24%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Native.so
36258163622568-3248-0.09%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Compression.Native.so.dbg
4208842088+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Ports.Native.so.dbg
1406414064+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Ports.Native.so
574672573520-1152-0.20%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Security.Cryptography.Native.OpenSsl.so.dbg
13692161365968-3248-0.24%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Compression.Native.so
238032238032+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Globalization.Native.so.dbg
395408391952-3456-0.87%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Native.so.dbg
237544236392-1152-0.48%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Security.Cryptography.Native.OpenSsl.so
6483264832+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Globalization.Native.so
4234442344+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Net.Security.Native.so.dbg
1528015280+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Net.Security.Native.so
909602336906807088-2795248-0.31%TOTAL

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@am11 Can you show the total without .dbg files?

Also, it seems like emscripten doesn't support icf even with lld, what's the proper condition for excluding that?

Comment threadeng/native/configurecompiler.cmake Outdated
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

@am11 Can you show the total without .dbg files?

| 157295704 | 154012152 | -3283552 | -2.09% | TOTAL |

@MichalPetryka
MichalPetryka marked this pull request as ready for review June 24, 2026 09:22
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

captured befroe.md and after.md with this:

echo "| Size (human) | Size (bytes) | Path |"; find artifacts/bin/coreclr/linux.arm64.Release artifacts/bin/native/net11.0-linux-Release-arm64 -name '*.so*' | xargs -I{} bash -c 'echo "| $(du -sh "$0" | cut -f1) | $(du -sb "$0" | cut -f1) | $0 |"' {}

then asked AI to compute deltas (which used python script).

@AndyAyersMS

Copy link
Copy Markdown
Member

/azp run runtime-coreclr outerloop, runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 2 pipeline(s).

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

Failures all unrelated, either non Linux or networking errors.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@jkotas Do you know who'd be the right person to review this?

@jkotas

Copy link
Copy Markdown
Member

This change is not risk-free. --icf=all violates the C/C++ spec guarantees about pointer equality. E.g. from the C23 spec: "Two pointers compare equal if and only if both are null pointers, both are pointers to the same object
(including a pointer to an object and a subobject at its beginning) or function, ...".

We have the equivalent option enabled on Windows, and copilot is not able to find any dependencies on the pointer equality behavior in non-Windows code, so the risk should be acceptable.

@jkotas
jkotas merged commit 986fba0 into dotnet:mainJul 3, 2026
153 of 159 checks passed
@jkotas

Copy link
Copy Markdown
Member

Thanks!

@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview7 milestone Jul 4, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
It saves on average 2% in size.
---------
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@MichalPetrykaMichalPetryka mentioned this pull request Jul 17, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 4, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Infrastructurecommunity-contributionIndicates that the PR has been added by a community member

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

5 participants

@MichalPetryka@am11@AndyAyersMS@jkotas@teo-tsirpanis
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Enable ICF on Linux - #129762

Merged
jkotas merged 7 commits into
dotnet:mainfrom
MichalPetryka:patch-64
Jul 3, 2026
Merged

Enable ICF on Linux#129762
jkotas merged 7 commits into
dotnet:mainfrom
MichalPetryka:patch-64

Conversation

@MichalPetryka

@MichalPetrykaMichalPetryka commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

CI is green and it saves on average 2% in size.

Opening to see CI results and size diffs
@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@am11 Since I think you worked in this area the most, what do you think about this? It seems that the GCC build job failed cause ld does not support the flag.

Do the official builds use lld instead? If not, it probably doesn't make sense to do any checking for linker here.

Also, it seems like NativeAOT doesn't use the flags from here.

Comment threadeng/native/configurecompiler.cmake Outdated
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

@MichalStrehovsky, experimented with it earlier. We may need changes from #87045.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalStrehovsky, experimented with it earlier. We may need changes from #87045.

My intent here was to only enable it for native code in the runtime, I'd leave the handling of NAOT outputs to @MichalStrehovsky.

@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

Do you see any size difference before/after on linux?

$ ./build.sh clr+libs -c Release
$ find artifacts/bin/coreclr/linux.x64.Release -name '*.so*' -exec du -sh {} \;

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

Do you see any size difference before/after on linux?

$ ./build.sh clr+libs -c Release
$ find artifacts/bin/coreclr/linux.x64.Release -name '*.so*' -exec du -sh {} \;

I currently do not have a Linux machine on hand to test it, that's why I wanted to see how it impacts rt-sz.

@github-actionsgithub-actionsBot mentioned this pull request Jun 24, 2026
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member
Before (bytes)After (bytes)Diff (bytes)Diff %Path
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm64_arm64.so
14257201295560-130160-9.13%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordbi.so
17657121723664-42048-2.38%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordaccore.so
35424483529920-12528-0.35%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrjit.so
6414818464237208+89024+0.14%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordaccore.so.dbg
648744540616-108128-16.67%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclrtraceptprovider.so
40859284140104+54176+1.33%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgcexp.so.dbg
756904745544-11360-1.50%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgcexp.so
1950434419491816-12528-0.06%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrjit.so.dbg
1366076013661672+912+0.01%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordbi.so.dbg
58196565801704-17952-0.31%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgc.so.dbg
53078965216440-91456-1.72%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclr.so
714296696344-17952-2.51%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgc.so
125775536125815144+39608+0.03%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclr.so.dbg
16367281594136-42592-2.60%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclrtraceptprovider.so.dbg
14257201295560-130160-9.13%artifacts/bin/coreclr/linux.arm64.Release/libmscordbi.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x86_arm64.so
4659357646598952+5376+0.01%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x64_arm64.so.dbg
17657121723664-42048-2.38%artifacts/bin/coreclr/linux.arm64.Release/libmscordaccore.so
42528644284640+31776+0.75%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-collector.so.dbg
41905364189608-928-0.02%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-counter.so.dbg
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_universal_wasm_arm64.so
35424483529920-12528-0.35%artifacts/bin/coreclr/linux.arm64.Release/libclrjit.so
4836465648437168+72512+0.15%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm64_arm64.so.dbg
6414818464237208+89024+0.14%artifacts/bin/coreclr/linux.arm64.Release/libmscordaccore.so.dbg
319464318312-1152-0.36%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-simple.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm_arm64.so
648744540616-108128-16.67%artifacts/bin/coreclr/linux.arm64.Release/libcoreclrtraceptprovider.so
40859284140104+54176+1.33%artifacts/bin/coreclr/linux.arm64.Release/libclrgcexp.so.dbg
4672465646794416+69760+0.15%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_unix_x64_arm64.so.dbg
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/libjitinterface_arm64.so
756904745544-11360-1.50%artifacts/bin/coreclr/linux.arm64.Release/libclrgcexp.so
1950434419491816-12528-0.06%artifacts/bin/coreclr/linux.arm64.Release/libclrjit.so.dbg
39717443970592-1152-0.03%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-simple.so.dbg
1366076013661672+912+0.01%artifacts/bin/coreclr/linux.arm64.Release/libmscordbi.so.dbg
58196565801704-17952-0.31%artifacts/bin/coreclr/linux.arm64.Release/libclrgc.so.dbg
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_unix_x64_arm64.so
3833342438348496+15072+0.04%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm_arm64.so.dbg
4654174446547728+5984+0.01%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x86_arm64.so.dbg
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_universal_wasm_arm64.so
352648351720-928-0.26%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-counter.so
53078965216440-91456-1.72%artifacts/bin/coreclr/linux.arm64.Release/libcoreclr.so
1595335215953352+0+0.00%artifacts/bin/coreclr/linux.arm64.Release/R2RDump/libcoredistools.so
714296696344-17952-2.51%artifacts/bin/coreclr/linux.arm64.Release/libclrgc.so
382832349072-33760-8.82%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-collector.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_wasm_arm64.so
278832278752-80-0.03%artifacts/bin/coreclr/linux.arm64.Release/libjitinterface_arm64.so.dbg
125775536125815144+39608+0.03%artifacts/bin/coreclr/linux.arm64.Release/libcoreclr.so.dbg
316056316056+0+0.00%artifacts/bin/coreclr/linux.arm64.Release/SuperFileCheck/runtimes/linux-arm64/native/libc++abi.so.1
14692801469280+0+0.00%artifacts/bin/coreclr/linux.arm64.Release/SuperFileCheck/runtimes/linux-arm64/native/libc++.so.1
16367281594136-42592-2.60%artifacts/bin/coreclr/linux.arm64.Release/libcoreclrtraceptprovider.so.dbg
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_universal_wasm_arm64.so
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_universal_wasm_arm64.so
3887396838950512+76544+0.20%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_wasm_arm64.so.dbg
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_universal_wasm_arm64.so
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/ilc/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_universal_wasm_arm64.so
106664103208-3456-3.24%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Native.so
36258163622568-3248-0.09%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Compression.Native.so.dbg
4208842088+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Ports.Native.so.dbg
1406414064+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Ports.Native.so
574672573520-1152-0.20%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Security.Cryptography.Native.OpenSsl.so.dbg
13692161365968-3248-0.24%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Compression.Native.so
238032238032+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Globalization.Native.so.dbg
395408391952-3456-0.87%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Native.so.dbg
237544236392-1152-0.48%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Security.Cryptography.Native.OpenSsl.so
6483264832+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Globalization.Native.so
4234442344+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Net.Security.Native.so.dbg
1528015280+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Net.Security.Native.so
909602336906807088-2795248-0.31%TOTAL

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@am11 Can you show the total without .dbg files?

Also, it seems like emscripten doesn't support icf even with lld, what's the proper condition for excluding that?

Comment threadeng/native/configurecompiler.cmake Outdated
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

@am11 Can you show the total without .dbg files?

| 157295704 | 154012152 | -3283552 | -2.09% | TOTAL |

@MichalPetryka
MichalPetryka marked this pull request as ready for review June 24, 2026 09:22
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

captured befroe.md and after.md with this:

echo "| Size (human) | Size (bytes) | Path |"; find artifacts/bin/coreclr/linux.arm64.Release artifacts/bin/native/net11.0-linux-Release-arm64 -name '*.so*' | xargs -I{} bash -c 'echo "| $(du -sh "$0" | cut -f1) | $(du -sb "$0" | cut -f1) | $0 |"' {}

then asked AI to compute deltas (which used python script).

@AndyAyersMS

Copy link
Copy Markdown
Member

/azp run runtime-coreclr outerloop, runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 2 pipeline(s).

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

Failures all unrelated, either non Linux or networking errors.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@jkotas Do you know who'd be the right person to review this?

@jkotas

Copy link
Copy Markdown
Member

This change is not risk-free. --icf=all violates the C/C++ spec guarantees about pointer equality. E.g. from the C23 spec: "Two pointers compare equal if and only if both are null pointers, both are pointers to the same object
(including a pointer to an object and a subobject at its beginning) or function, ...".

We have the equivalent option enabled on Windows, and copilot is not able to find any dependencies on the pointer equality behavior in non-Windows code, so the risk should be acceptable.

@jkotas
jkotas merged commit 986fba0 into dotnet:mainJul 3, 2026
153 of 159 checks passed
@jkotas

Copy link
Copy Markdown
Member

Thanks!

@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview7 milestone Jul 4, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
It saves on average 2% in size.
---------
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@MichalPetrykaMichalPetryka mentioned this pull request Jul 17, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 4, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Infrastructurecommunity-contributionIndicates that the PR has been added by a community member

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

5 participants

@MichalPetryka@am11@AndyAyersMS@jkotas@teo-tsirpanis
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Enable ICF on Linux - #129762

Merged
jkotas merged 7 commits into
dotnet:mainfrom
MichalPetryka:patch-64
Jul 3, 2026
Merged

Enable ICF on Linux#129762
jkotas merged 7 commits into
dotnet:mainfrom
MichalPetryka:patch-64

Conversation

@MichalPetryka

@MichalPetrykaMichalPetryka commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

CI is green and it saves on average 2% in size.

Opening to see CI results and size diffs
@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@am11 Since I think you worked in this area the most, what do you think about this? It seems that the GCC build job failed cause ld does not support the flag.

Do the official builds use lld instead? If not, it probably doesn't make sense to do any checking for linker here.

Also, it seems like NativeAOT doesn't use the flags from here.

Comment threadeng/native/configurecompiler.cmake Outdated
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

@MichalStrehovsky, experimented with it earlier. We may need changes from #87045.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalStrehovsky, experimented with it earlier. We may need changes from #87045.

My intent here was to only enable it for native code in the runtime, I'd leave the handling of NAOT outputs to @MichalStrehovsky.

@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

Do you see any size difference before/after on linux?

$ ./build.sh clr+libs -c Release
$ find artifacts/bin/coreclr/linux.x64.Release -name '*.so*' -exec du -sh {} \;

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

Do you see any size difference before/after on linux?

$ ./build.sh clr+libs -c Release
$ find artifacts/bin/coreclr/linux.x64.Release -name '*.so*' -exec du -sh {} \;

I currently do not have a Linux machine on hand to test it, that's why I wanted to see how it impacts rt-sz.

@github-actionsgithub-actionsBot mentioned this pull request Jun 24, 2026
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member
Before (bytes)After (bytes)Diff (bytes)Diff %Path
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm64_arm64.so
14257201295560-130160-9.13%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordbi.so
17657121723664-42048-2.38%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordaccore.so
35424483529920-12528-0.35%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrjit.so
6414818464237208+89024+0.14%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordaccore.so.dbg
648744540616-108128-16.67%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclrtraceptprovider.so
40859284140104+54176+1.33%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgcexp.so.dbg
756904745544-11360-1.50%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgcexp.so
1950434419491816-12528-0.06%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrjit.so.dbg
1366076013661672+912+0.01%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordbi.so.dbg
58196565801704-17952-0.31%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgc.so.dbg
53078965216440-91456-1.72%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclr.so
714296696344-17952-2.51%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgc.so
125775536125815144+39608+0.03%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclr.so.dbg
16367281594136-42592-2.60%artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclrtraceptprovider.so.dbg
14257201295560-130160-9.13%artifacts/bin/coreclr/linux.arm64.Release/libmscordbi.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x86_arm64.so
4659357646598952+5376+0.01%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x64_arm64.so.dbg
17657121723664-42048-2.38%artifacts/bin/coreclr/linux.arm64.Release/libmscordaccore.so
42528644284640+31776+0.75%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-collector.so.dbg
41905364189608-928-0.02%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-counter.so.dbg
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_universal_wasm_arm64.so
35424483529920-12528-0.35%artifacts/bin/coreclr/linux.arm64.Release/libclrjit.so
4836465648437168+72512+0.15%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm64_arm64.so.dbg
6414818464237208+89024+0.14%artifacts/bin/coreclr/linux.arm64.Release/libmscordaccore.so.dbg
319464318312-1152-0.36%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-simple.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm_arm64.so
648744540616-108128-16.67%artifacts/bin/coreclr/linux.arm64.Release/libcoreclrtraceptprovider.so
40859284140104+54176+1.33%artifacts/bin/coreclr/linux.arm64.Release/libclrgcexp.so.dbg
4672465646794416+69760+0.15%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_unix_x64_arm64.so.dbg
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/libjitinterface_arm64.so
756904745544-11360-1.50%artifacts/bin/coreclr/linux.arm64.Release/libclrgcexp.so
1950434419491816-12528-0.06%artifacts/bin/coreclr/linux.arm64.Release/libclrjit.so.dbg
39717443970592-1152-0.03%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-simple.so.dbg
1366076013661672+912+0.01%artifacts/bin/coreclr/linux.arm64.Release/libmscordbi.so.dbg
58196565801704-17952-0.31%artifacts/bin/coreclr/linux.arm64.Release/libclrgc.so.dbg
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_unix_x64_arm64.so
3833342438348496+15072+0.04%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm_arm64.so.dbg
4654174446547728+5984+0.01%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x86_arm64.so.dbg
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_universal_wasm_arm64.so
352648351720-928-0.26%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-counter.so
53078965216440-91456-1.72%artifacts/bin/coreclr/linux.arm64.Release/libcoreclr.so
1595335215953352+0+0.00%artifacts/bin/coreclr/linux.arm64.Release/R2RDump/libcoredistools.so
714296696344-17952-2.51%artifacts/bin/coreclr/linux.arm64.Release/libclrgc.so
382832349072-33760-8.82%artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-collector.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_wasm_arm64.so
278832278752-80-0.03%artifacts/bin/coreclr/linux.arm64.Release/libjitinterface_arm64.so.dbg
125775536125815144+39608+0.03%artifacts/bin/coreclr/linux.arm64.Release/libcoreclr.so.dbg
316056316056+0+0.00%artifacts/bin/coreclr/linux.arm64.Release/SuperFileCheck/runtimes/linux-arm64/native/libc++abi.so.1
14692801469280+0+0.00%artifacts/bin/coreclr/linux.arm64.Release/SuperFileCheck/runtimes/linux-arm64/native/libc++.so.1
16367281594136-42592-2.60%artifacts/bin/coreclr/linux.arm64.Release/libcoreclrtraceptprovider.so.dbg
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_universal_wasm_arm64.so
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_universal_wasm_arm64.so
3887396838950512+76544+0.20%artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_wasm_arm64.so.dbg
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_universal_wasm_arm64.so
28048242746264-58560-2.09%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_universal_arm64_arm64.so
27625762703024-59552-2.16%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_win_x86_arm64.so
21170882066624-50464-2.38%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_universal_arm_arm64.so
4939249312-80-0.16%artifacts/bin/coreclr/linux.arm64.Release/ilc/libjitinterface_arm64.so
28492242789064-60160-2.11%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_win_x64_arm64.so
28707842809472-61312-2.14%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_unix_x64_arm64.so
20276881973160-54528-2.69%artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_universal_wasm_arm64.so
106664103208-3456-3.24%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Native.so
36258163622568-3248-0.09%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Compression.Native.so.dbg
4208842088+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Ports.Native.so.dbg
1406414064+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Ports.Native.so
574672573520-1152-0.20%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Security.Cryptography.Native.OpenSsl.so.dbg
13692161365968-3248-0.24%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Compression.Native.so
238032238032+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Globalization.Native.so.dbg
395408391952-3456-0.87%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Native.so.dbg
237544236392-1152-0.48%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Security.Cryptography.Native.OpenSsl.so
6483264832+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Globalization.Native.so
4234442344+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Net.Security.Native.so.dbg
1528015280+0+0.00%artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Net.Security.Native.so
909602336906807088-2795248-0.31%TOTAL

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@am11 Can you show the total without .dbg files?

Also, it seems like emscripten doesn't support icf even with lld, what's the proper condition for excluding that?

Comment threadeng/native/configurecompiler.cmake Outdated
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

@am11 Can you show the total without .dbg files?

| 157295704 | 154012152 | -3283552 | -2.09% | TOTAL |

@MichalPetryka
MichalPetryka marked this pull request as ready for review June 24, 2026 09:22
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

captured befroe.md and after.md with this:

echo "| Size (human) | Size (bytes) | Path |"; find artifacts/bin/coreclr/linux.arm64.Release artifacts/bin/native/net11.0-linux-Release-arm64 -name '*.so*' | xargs -I{} bash -c 'echo "| $(du -sh "$0" | cut -f1) | $(du -sb "$0" | cut -f1) | $0 |"' {}

then asked AI to compute deltas (which used python script).

@AndyAyersMS

Copy link
Copy Markdown
Member

/azp run runtime-coreclr outerloop, runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 2 pipeline(s).

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

Failures all unrelated, either non Linux or networking errors.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@jkotas Do you know who'd be the right person to review this?

@jkotas

Copy link
Copy Markdown
Member

This change is not risk-free. --icf=all violates the C/C++ spec guarantees about pointer equality. E.g. from the C23 spec: "Two pointers compare equal if and only if both are null pointers, both are pointers to the same object
(including a pointer to an object and a subobject at its beginning) or function, ...".

We have the equivalent option enabled on Windows, and copilot is not able to find any dependencies on the pointer equality behavior in non-Windows code, so the risk should be acceptable.

@jkotas
jkotas merged commit 986fba0 into dotnet:mainJul 3, 2026
153 of 159 checks passed
@jkotas

Copy link
Copy Markdown
Member

Thanks!

@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview7 milestone Jul 4, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
It saves on average 2% in size.
---------
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@MichalPetrykaMichalPetryka mentioned this pull request Jul 17, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 4, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Infrastructurecommunity-contributionIndicates that the PR has been added by a community member

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

5 participants

@MichalPetryka@am11@AndyAyersMS@jkotas@teo-tsirpanis