Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[release/8.0.1xx-xcode15.4] Reenable dedup optimization for all AOT modes #20940

Merged
merged 8 commits into from
Jul 25, 2024

Conversation

dalexsoto
Copy link
Member

Description

As part of the fix for: dotnet/runtime#99248 we disabled dedup optimization in partial/hybrid AOT mode (when both interpreter and AOT compiler are enabled). This change got backported to .NET 8 and with the latest servicing release regressed build times and app sizes significantly as reported in: #20848

However, it turns out that disabling dedup optimization is not required to fix dotnet/runtime#99248 but instead we should correct the Xamarin SDK integration with this optimization which this PR is doing. The following section describes the initial problem in more details.

Overview of AOT modes and dedup optimization

When the repro project from dotnet/runtime#99248 is built with dedup enabled in hybrid AOT+interpreter mode, the app crashes with:

024-07-23 14:32:37.524110+0200 IvansApp[12711:20244208] debug: AOT NOT FOUND: (wrapper other) object:gsharedvt_out_sig (intptr).
2024-07-23 14:32:37.524120+0200 IvansApp[12711:20244208] error: * Assertion at /Users/ivan/repos/runtime-mono-iOS/src/mono/mono/mini/interp/interp.c:2667, condition `is_ok (error)' not met, function:init_jit_call_info, Attempting to JIT compile method '(wrapper other) void object:gsharedvt_out_sig (intptr)' while running in aot-only mode. See https://learn.microsoft.com/xamarin/ios/internals/limitations for more information.

To track down why these wrappers which are used to transition from interpreter to AOT code, are not generated we need to understand when they are compiled in different AOT modes with and without dedup optimization enabled:

  • In full AOT setup - all assemblies AOT compiled

    • gsharedvt_out_sig methods are never generated
  • In hybrid AOT + interpreter setup - all assemblies AOT compiled: MtouchInterpreter=-all

    • Dedup OFF:
      • gsharedvt_out_sig methods are generated in AOT images of every assembly (to enable interpreter calling into each specific assembly - here wrappers with same signatures are duplicated)
    • Dedup ON:
      • gsharedvt_out_sig methods are generated only in aot-instances AOT image
        • during AOT compilation of individual assemblies generation of gsharedvt_out_sig is skipped
        • during AOT compilation of aot-instances assembly we collect all gsharedvt_out_sig variants from the full program scope and generate code for them in aot-instances AOT image
  • In hybrid AOT + interpreter setup - all assemblies interpreted except a given assembly: MtouchInterpreter=all,-MyAssembly

    • Dedup OFF:
      • gsharedvt_out_sig methods are generated in AOT image of MyAssembly (to enable interpreter calling into it)
    • Dedup ON: <- $${\color{red} ISSUE }$$
      • gsharedvt_out_sig methods should be generated only in aot-instances AOT image, but the aot-instances image is missing
    • explanation:
      • what happens is that generation of gsharedvt_out_sig is skipped during AOT compilation of MyAssembly (as expected).
      • But, the build does not mark aot-instances assembly as the one that should be AOT compiled.
      • The reason for this is that we have a global _IsDedupEnabled flag, but when custom linker step analysis aot-instances.dll it does not see it as an assembly which should not be interpreted.
      • To explain that better: we mark all assemblies as to be interpreted (via: MtouchInterpreter=all), but exclude only MyAssembly (via: MtouchInterpreter=all,-MyAssembly).
      • So when custom linker step processes aot-instaces.dll it treats it as an assembly to be interpreted, so it does not mark it for AOT compilation.
      • This further results with aot-instances AOT image missing, and all the methods which we skipped during AOT compilation never get generated.

The fix

To fix this and address regressions reported in: #20848 we are reenabling dedup optimization whenever AOT compilation is requested and fixing the issue where the custom linker step for generating AOT parameters always treates the dedup assembly as the one to be AOTed.

Once approved this should be backported to .NET 8 as servicing releases are also affected with it.

Backport of #20936

@vs-mobiletools-engineering-service2
Copy link
Collaborator

🔥 [CI Build] Build failed 🔥

Build failed for the job 'Build packages'

Pipeline on Agent
Hash: 939d536148d2ac18b7f696ea458c32d6117f2331 [PR build]

@dalexsoto
Copy link
Member Author

main finished green, this branch is very close to main and we need packages now to create the release branch for net9 p7

@dalexsoto dalexsoto merged commit c1e607f into release/8.0.1xx-xcode15.4 Jul 25, 2024
17 of 19 checks passed
@dalexsoto dalexsoto deleted the dev/alex/backport-pr-20936 branch July 25, 2024 23:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants