Skip to content

Enable ICF on Linux#129762

Open
MichalPetryka wants to merge 5 commits into
dotnet:mainfrom
MichalPetryka:patch-64
Open

Enable ICF on Linux#129762
MichalPetryka wants to merge 5 commits into
dotnet:mainfrom
MichalPetryka:patch-64

Conversation

@MichalPetryka

@MichalPetryka MichalPetryka 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
Contributor Author

@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 thread eng/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
Contributor Author

@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
Contributor Author

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.

@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member
Before (bytes) After (bytes) Diff (bytes) Diff % Path
2804824 2746264 -58560 -2.09% artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm64_arm64.so
1425720 1295560 -130160 -9.13% artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordbi.so
1765712 1723664 -42048 -2.38% artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordaccore.so
3542448 3529920 -12528 -0.35% artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrjit.so
64148184 64237208 +89024 +0.14% artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordaccore.so.dbg
648744 540616 -108128 -16.67% artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclrtraceptprovider.so
4085928 4140104 +54176 +1.33% artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgcexp.so.dbg
756904 745544 -11360 -1.50% artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgcexp.so
19504344 19491816 -12528 -0.06% artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrjit.so.dbg
13660760 13661672 +912 +0.01% artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordbi.so.dbg
5819656 5801704 -17952 -0.31% artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgc.so.dbg
5307896 5216440 -91456 -1.72% artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclr.so
714296 696344 -17952 -2.51% artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgc.so
125775536 125815144 +39608 +0.03% artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclr.so.dbg
1636728 1594136 -42592 -2.60% artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclrtraceptprovider.so.dbg
1425720 1295560 -130160 -9.13% artifacts/bin/coreclr/linux.arm64.Release/libmscordbi.so
2762576 2703024 -59552 -2.16% artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x86_arm64.so
46593576 46598952 +5376 +0.01% artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x64_arm64.so.dbg
1765712 1723664 -42048 -2.38% artifacts/bin/coreclr/linux.arm64.Release/libmscordaccore.so
4252864 4284640 +31776 +0.75% artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-collector.so.dbg
4190536 4189608 -928 -0.02% artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-counter.so.dbg
2804824 2746264 -58560 -2.09% artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_universal_arm64_arm64.so
2762576 2703024 -59552 -2.16% artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_win_x86_arm64.so
2117088 2066624 -50464 -2.38% artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_universal_arm_arm64.so
49392 49312 -80 -0.16% artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libjitinterface_arm64.so
2849224 2789064 -60160 -2.11% artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_win_x64_arm64.so
2870784 2809472 -61312 -2.14% artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_unix_x64_arm64.so
2027688 1973160 -54528 -2.69% artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_universal_wasm_arm64.so
3542448 3529920 -12528 -0.35% artifacts/bin/coreclr/linux.arm64.Release/libclrjit.so
48364656 48437168 +72512 +0.15% artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm64_arm64.so.dbg
64148184 64237208 +89024 +0.14% artifacts/bin/coreclr/linux.arm64.Release/libmscordaccore.so.dbg
319464 318312 -1152 -0.36% artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-simple.so
2117088 2066624 -50464 -2.38% artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm_arm64.so
648744 540616 -108128 -16.67% artifacts/bin/coreclr/linux.arm64.Release/libcoreclrtraceptprovider.so
4085928 4140104 +54176 +1.33% artifacts/bin/coreclr/linux.arm64.Release/libclrgcexp.so.dbg
46724656 46794416 +69760 +0.15% artifacts/bin/coreclr/linux.arm64.Release/libclrjit_unix_x64_arm64.so.dbg
49392 49312 -80 -0.16% artifacts/bin/coreclr/linux.arm64.Release/libjitinterface_arm64.so
756904 745544 -11360 -1.50% artifacts/bin/coreclr/linux.arm64.Release/libclrgcexp.so
19504344 19491816 -12528 -0.06% artifacts/bin/coreclr/linux.arm64.Release/libclrjit.so.dbg
3971744 3970592 -1152 -0.03% artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-simple.so.dbg
13660760 13661672 +912 +0.01% artifacts/bin/coreclr/linux.arm64.Release/libmscordbi.so.dbg
5819656 5801704 -17952 -0.31% artifacts/bin/coreclr/linux.arm64.Release/libclrgc.so.dbg
2849224 2789064 -60160 -2.11% artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x64_arm64.so
2870784 2809472 -61312 -2.14% artifacts/bin/coreclr/linux.arm64.Release/libclrjit_unix_x64_arm64.so
38333424 38348496 +15072 +0.04% artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm_arm64.so.dbg
46541744 46547728 +5984 +0.01% artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x86_arm64.so.dbg
2804824 2746264 -58560 -2.09% artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_universal_arm64_arm64.so
2762576 2703024 -59552 -2.16% artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_win_x86_arm64.so
2117088 2066624 -50464 -2.38% artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_universal_arm_arm64.so
49392 49312 -80 -0.16% artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libjitinterface_arm64.so
2849224 2789064 -60160 -2.11% artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_win_x64_arm64.so
2870784 2809472 -61312 -2.14% artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_unix_x64_arm64.so
2027688 1973160 -54528 -2.69% artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_universal_wasm_arm64.so
352648 351720 -928 -0.26% artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-counter.so
5307896 5216440 -91456 -1.72% artifacts/bin/coreclr/linux.arm64.Release/libcoreclr.so
15953352 15953352 +0 +0.00% artifacts/bin/coreclr/linux.arm64.Release/R2RDump/libcoredistools.so
714296 696344 -17952 -2.51% artifacts/bin/coreclr/linux.arm64.Release/libclrgc.so
382832 349072 -33760 -8.82% artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-collector.so
2027688 1973160 -54528 -2.69% artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_wasm_arm64.so
278832 278752 -80 -0.03% artifacts/bin/coreclr/linux.arm64.Release/libjitinterface_arm64.so.dbg
125775536 125815144 +39608 +0.03% artifacts/bin/coreclr/linux.arm64.Release/libcoreclr.so.dbg
316056 316056 +0 +0.00% artifacts/bin/coreclr/linux.arm64.Release/SuperFileCheck/runtimes/linux-arm64/native/libc++abi.so.1
1469280 1469280 +0 +0.00% artifacts/bin/coreclr/linux.arm64.Release/SuperFileCheck/runtimes/linux-arm64/native/libc++.so.1
1636728 1594136 -42592 -2.60% artifacts/bin/coreclr/linux.arm64.Release/libcoreclrtraceptprovider.so.dbg
2804824 2746264 -58560 -2.09% artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_universal_arm64_arm64.so
2762576 2703024 -59552 -2.16% artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_win_x86_arm64.so
2117088 2066624 -50464 -2.38% artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_universal_arm_arm64.so
49392 49312 -80 -0.16% artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libjitinterface_arm64.so
2849224 2789064 -60160 -2.11% artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_win_x64_arm64.so
2870784 2809472 -61312 -2.14% artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_unix_x64_arm64.so
2027688 1973160 -54528 -2.69% artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_universal_wasm_arm64.so
2804824 2746264 -58560 -2.09% artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_universal_arm64_arm64.so
2762576 2703024 -59552 -2.16% artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_win_x86_arm64.so
2117088 2066624 -50464 -2.38% artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_universal_arm_arm64.so
49392 49312 -80 -0.16% artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libjitinterface_arm64.so
2849224 2789064 -60160 -2.11% artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_win_x64_arm64.so
2870784 2809472 -61312 -2.14% artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_unix_x64_arm64.so
2027688 1973160 -54528 -2.69% artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_universal_wasm_arm64.so
38873968 38950512 +76544 +0.20% artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_wasm_arm64.so.dbg
2804824 2746264 -58560 -2.09% artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_universal_arm64_arm64.so
2762576 2703024 -59552 -2.16% artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_win_x86_arm64.so
2117088 2066624 -50464 -2.38% artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_universal_arm_arm64.so
49392 49312 -80 -0.16% artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libjitinterface_arm64.so
2849224 2789064 -60160 -2.11% artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_win_x64_arm64.so
2870784 2809472 -61312 -2.14% artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_unix_x64_arm64.so
2027688 1973160 -54528 -2.69% artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_universal_wasm_arm64.so
2804824 2746264 -58560 -2.09% artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_universal_arm64_arm64.so
2762576 2703024 -59552 -2.16% artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_win_x86_arm64.so
2117088 2066624 -50464 -2.38% artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_universal_arm_arm64.so
49392 49312 -80 -0.16% artifacts/bin/coreclr/linux.arm64.Release/ilc/libjitinterface_arm64.so
2849224 2789064 -60160 -2.11% artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_win_x64_arm64.so
2870784 2809472 -61312 -2.14% artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_unix_x64_arm64.so
2027688 1973160 -54528 -2.69% artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_universal_wasm_arm64.so
106664 103208 -3456 -3.24% artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Native.so
3625816 3622568 -3248 -0.09% artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Compression.Native.so.dbg
42088 42088 +0 +0.00% artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Ports.Native.so.dbg
14064 14064 +0 +0.00% artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Ports.Native.so
574672 573520 -1152 -0.20% artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Security.Cryptography.Native.OpenSsl.so.dbg
1369216 1365968 -3248 -0.24% artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Compression.Native.so
238032 238032 +0 +0.00% artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Globalization.Native.so.dbg
395408 391952 -3456 -0.87% artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Native.so.dbg
237544 236392 -1152 -0.48% artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Security.Cryptography.Native.OpenSsl.so
64832 64832 +0 +0.00% artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Globalization.Native.so
42344 42344 +0 +0.00% artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Net.Security.Native.so.dbg
15280 15280 +0 +0.00% artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Net.Security.Native.so
909602336 906807088 -2795248 -0.31% TOTAL

@MichalPetryka

Copy link
Copy Markdown
Contributor Author

@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 thread eng/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).

@teo-tsirpanis teo-tsirpanis added area-Infrastructure and removed area-Infrastructure-coreclr Only use for closed issues labels Jun 24, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/runtime-infrastructure
See info in area-owners.md if you want to be subscribed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-Infrastructure community-contribution Indicates that the PR has been added by a community member

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

3 participants