Skip to content

Test JsonEncodedText.GetHashCode code shape for ARM64 regression - #132399

Draft
eiriktsarpalis wants to merge 7 commits into
mainfrom
eiriktsarpalis-perf-bisect-131600
Draft

Test JsonEncodedText.GetHashCode code shape for ARM64 regression#132399
eiriktsarpalis wants to merge 7 commits into
mainfrom
eiriktsarpalis-perf-bisect-131600

Conversation

@eiriktsarpalis

Copy link
Copy Markdown
Member

Tests whether restoring the pre-#130976 ternary code shape for JsonEncodedText.GetHashCode() removes #131600.

Utf8JsonReader.GetUInt64, TryGetUInt64, and TryGetUInt64Core have identical IL before and after #130976. The current evidence points to an ARM64 tiering or code-layout interaction rather than a semantic reader change. This draft retains #130976's original commit history only so EgorBot can compare its internal stages. It is not ready to merge until the Ampere measurements identify the first bad stage and validate this candidate.

Note

This pull request was prepared by GitHub Copilot.

eiriktsarpalis and others added 6 commits July 20, 2026 16:24
Use C# 14 field-backed properties for private state used only by accessors, and expression-bodied members for single-expression methods.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 69ae6b80-f573-41bd-8cf9-e0f858510bbe
Replace built-in null comparisons and stable compound comparisons with equivalent C# patterns. Retain reflection comparisons that bind user-defined equality operators.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 69ae6b80-f573-41bd-8cf9-e0f858510bbe
Use the C# 14 field keyword while preserving mutable-schema validation.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 69ae6b80-f573-41bd-8cf9-e0f858510bbe
…dText.cs

Co-authored-by: Adam Sitnik <adam.sitnik@gmail.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@eiriktsarpalis

Copy link
Copy Markdown
Member Author

@EgorBot -ubuntu24_azure_ampere -pr 132399 -commits af85196,66b30d95f08c6dafb73a5006ccbf1faccfc41f01,43560bc79db55b49722afff9eeeac9704803315d,a271e683ebac9ab3d3cc2d24ffec341a558a6f86,7c12816f5c1ddd67b23ec8f0f42513b693736c29,6ca403a8a24576553af420df7e5ce0dc94671c06 --filter "System.Text.Json.Tests.Perf_Get.GetUInt64"

Note

This benchmark request was prepared by GitHub Copilot.

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This change adjusts the IL/code shape of JsonEncodedText.GetHashCode() in System.Text.Json to help investigate an ARM64 tiering/code-layout performance regression (#131600) by restoring the pre-#130976 ternary-based null check pattern.

Changes:

  • Replaces the null-conditional/?? GetHashCode implementation with an equivalent ternary (is null ? 0 : ...) to produce the desired code shape on ARM64.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings August 17, 2026 11:33
@eiriktsarpalis

Copy link
Copy Markdown
Member Author

Rerunning after restoring the private-libunwind linker fallback needed to build current main on the benchmark image.

@EgorBot -ubuntu24_azure_ampere -pr 132399 -commits af85196,66b30d95f08c6dafb73a5006ccbf1faccfc41f01,43560bc79db55b49722afff9eeeac9704803315d,a271e683ebac9ab3d3cc2d24ffec341a558a6f86,7c12816f5c1ddd67b23ec8f0f42513b693736c29,a3dd4f855a512477197fece0a8d05d56ce724188 --filter "System.Text.Json.Tests.Perf_Get.GetUInt64"

Note

This benchmark request was prepared by GitHub Copilot.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 2 out of 2 changed files in this pull request and generated no new comments.

Suppressed comments (1)

src/coreclr/nativeaot/Runtime/Full/CMakeLists.txt:39

  • This PR’s title/description focuses on testing the JsonEncodedText.GetHashCode() code shape for an ARM64 perf regression, but this hunk also changes NativeAOT’s libunwind privatization linker selection logic. Since it affects the NativeAOT build pipeline on Unix, it looks like a separate concern; consider splitting it into a dedicated PR or explicitly documenting why it’s needed for the perf investigation so reviewers can evaluate the build impact in context.
  set(NATIVEAOT_PRIVATE_LIBUNWIND_LINKER "${CMAKE_LINKER}")
  get_filename_component(NATIVEAOT_PRIVATE_LIBUNWIND_LINKER_NAME "${NATIVEAOT_PRIVATE_LIBUNWIND_LINKER}" NAME)
  if(NATIVEAOT_PRIVATE_LIBUNWIND_LINKER_NAME MATCHES "^llvm-link(-[0-9.]+)?(\\.exe)?$")
    set(NATIVEAOT_PRIVATE_LIBUNWIND_LINKER_VERSION "${CMAKE_MATCH_1}")
    set(NATIVEAOT_PRIVATE_LIBUNWIND_LINKER_EXTENSION "${CMAKE_MATCH_2}")

@eiriktsarpalis

Copy link
Copy Markdown
Member Author

Focused stage matrix 1/2: field-backed properties, pattern rewrites, and the Deprecated property follow-up.

@EgorBot -ubuntu24_azure_ampere -pr 132399 -commits 66b30d9,43560bc79db55b49722afff9eeeac9704803315d,a271e683ebac9ab3d3cc2d24ffec341a558a6f86 --filter "System.Text.Json.Tests.Perf_Get.GetUInt64"

Note

This benchmark request was prepared by GitHub Copilot.

@eiriktsarpalis

Copy link
Copy Markdown
Member Author

Focused stage matrix 2/2: the Deprecated property follow-up, final #130976 head, and the GetHashCode() code-shape candidate.

@EgorBot -ubuntu24_azure_ampere -pr 132399 -commits a271e68,7c12816f5c1ddd67b23ec8f0f42513b693736c29,a3dd4f855a512477197fece0a8d05d56ce724188 --filter "System.Text.Json.Tests.Perf_Get.GetUInt64"

Note

This benchmark request was prepared by GitHub Copilot.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants