Remove CORINFO_HELP_ASSIGN_BYREF and related dead code - #128687

Merged
EgorBo merged 9 commits into
mainfrom
dev/egorbo/remove-byref-wb
May 29, 2026
Merged

Remove CORINFO_HELP_ASSIGN_BYREF and related dead code#128687
EgorBo merged 9 commits into
mainfrom
dev/egorbo/remove-byref-wb

Conversation

@EgorBo

@EgorBoEgorBo commented May 28, 2026

Copy link
Copy Markdown
Member

Follow up #128542

The JIT no longer emits CORINFO_HELP_ASSIGN_BYREF anywhere. This change
removes the helper and all related dead code:
- Drops CORINFO_HELP_ASSIGN_BYREF from the JIT-EE enum and its
per-architecture VM asm implementations (JIT_ByRefWriteBarrier on
amd64/arm/arm64/i386/loongarch64/riscv64, plus wasm fakes).
- Drops the matching NativeAOT helpers (RhpByRefAssignRef and
RhpByRefAssignRefArm64) and their AVLocation tracking.
- Bumps R2R MAJOR_VERSION 18 -> 19 (MINIMUM_READYTORUN_MAJOR_VERSION
also bumped to 19) since old R2R images may reference the removed
READYTORUN_HELPER_ByRefWriteBarrier. The enum value 0x32 is
tombstoned with a 'Unused since 19.0' comment, matching the
precedent set by previously removed helpers.
- Regenerates jiteeversionguid.h.
- Cleans up the ARM stubs.cpp write-barrier patching machinery
(MaxWriteBarrierIndex 3 -> 2).
- Updates contract comments and regression-test docs to no longer
reference the removed helper name.
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke
See info in area-owners.md if you want to be subscribed.

CopilotAI 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 PR removes the CORINFO_HELP_ASSIGN_BYREF / JIT_ByRefWriteBarrier helper and associated runtime/JIT/AOT plumbing, updates ReadyToRun (R2R) helper mappings accordingly, and bumps the JIT/EE version GUID to keep the interface in sync.

Changes:

  • Remove CORINFO_HELP_ASSIGN_BYREF from the JIT-EE helper enums and delete JIT_ByRefWriteBarrier / RhpByRefAssignRef implementations across architectures.
  • Update R2R helper mapping/tooling to stop emitting or resolving the ByRef write barrier helper, and bump R2R major version constants.
  • Update tests/comments and exception helper marking logic to reflect the removed helper.

Reviewed changes

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

Show a summary per file
FileDescription
src/tests/JIT/Regression/JitBlue/Runtime_125169/Runtime_125169.csUpdates regression test comment to avoid helper-specific naming.
src/tests/JIT/Regression/JitBlue/GitHub_19444/GitHub_19444.csUpdates test header comment wording for the write barrier helper context.
src/tests/JIT/Regression/JitBlue/GitHub_19361/GitHub_19361.csUpdates test header comment to remove the specific helper name.
src/coreclr/vm/wasm/helpers.cppRemoves wasm stubs/markers related to JIT_ByRefWriteBarrier.
src/coreclr/vm/threads.cppStops registering CORINFO_HELP_ASSIGN_BYREF helper entrypoints.
src/coreclr/vm/riscv64/asmhelpers.SRemoves JIT_ByRefWriteBarrier implementation and updates comments.
src/coreclr/vm/loongarch64/asmhelpers.SRemoves JIT_ByRefWriteBarrier implementation and updates comments.
src/coreclr/vm/jitinterface.hRemoves RhpByRefAssignRef declarations/mappings.
src/coreclr/vm/i386/jithelp.SRemoves x86 JIT_ByRefWriteBarrier helper implementation.
src/coreclr/vm/i386/jithelp.asmRemoves x86 JIT_ByRefWriteBarrier helper implementation (MASM).
src/coreclr/vm/excep.cppRemoves ByRef write barrier range checks / AV-location tracking.
src/coreclr/vm/arm64/patchedcode.SRemoves ARM64 JIT_ByRefWriteBarrier and updates barrier comments.
src/coreclr/vm/arm64/patchedcode.asmRemoves ARM64 JIT_ByRefWriteBarrier and updates barrier comments (ASM).
src/coreclr/vm/arm/stubs.cppRemoves ByRef write barrier entry from ARM write-barrier patch/copy mapping.
src/coreclr/vm/arm/patchedcode.SRemoves ARM JIT_ByRefWriteBarrier placeholder from patched-code block.
src/coreclr/vm/arm/asmhelpers.SRemoves ARM ByRef write barrier macro + descriptor entries.
src/coreclr/vm/amd64/jithelpers_fast.SRemoves AMD64 JIT_ByRefWriteBarrier helper implementation (Unix asm).
src/coreclr/vm/amd64/JitHelpers_Fast.asmRemoves AMD64 JIT_ByRefWriteBarrier helper implementation (MASM).
src/coreclr/tools/Common/JitInterface/CorInfoHelpFunc.csRemoves CORINFO_HELP_ASSIGN_BYREF from managed helper enum used by tooling.
src/coreclr/tools/Common/Internal/Runtime/ReadyToRunConstants.csDocuments ByRef write barrier helper ID as unsupported post-v19.
src/coreclr/tools/Common/Internal/Runtime/ModuleHeaders.csBumps managed R2R header major/minor constants to 19.0.
src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.csRemoves mapping from CORINFO_HELP_ASSIGN_BYREF to R2R ByRef helper.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.csRemoves mapping from CORINFO_HELP_ASSIGN_BYREF to R2R ByRef helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/JitHelper.csRemoves ReadyToRunHelper.ByRefWriteBarrier entrypoint resolution logic.
src/coreclr/runtime/riscv64/WriteBarriers.SRemoves RhpByRefAssignRef implementation on RISC-V.
src/coreclr/runtime/portable/WriteBarriers.cppRemoves portable RhpByRefAssignRef stub.
src/coreclr/runtime/loongarch64/WriteBarriers.SRemoves RhpByRefAssignRef implementation and updates comments.
src/coreclr/runtime/i386/WriteBarriers.SRemoves x86 RhpByRefAssignRef implementation.
src/coreclr/runtime/i386/WriteBarriers.asmRemoves x86 RhpByRefAssignRef implementation (ASM).
src/coreclr/runtime/arm64/WriteBarriers.SRemoves ARM64 RhpByRefAssignRefArm64 implementation.
src/coreclr/runtime/arm64/WriteBarriers.asmRemoves ARM64 RhpByRefAssignRefArm64 implementation (ASM).
src/coreclr/runtime/arm/WriteBarriers.SRemoves ARM RhpByRefAssignRef implementation.
src/coreclr/runtime/amd64/WriteBarriers.SRemoves AMD64 RhpByRefAssignRef implementation (Unix asm).
src/coreclr/runtime/amd64/WriteBarriers.asmRemoves AMD64 RhpByRefAssignRef implementation (ASM).
src/coreclr/nativeaot/Runtime/inc/ModuleHeaders.hBumps NativeAOT R2R header major/minor constants to 19.0.
src/coreclr/nativeaot/Runtime/EHHelpers.cppRemoves ByRef write barrier AV-location tracking in NativeAOT EH helper logic.
src/coreclr/jit/codegenwasm.cppRemoves comment references to the ByRef helper signature variant.
src/coreclr/inc/readytorunhelpers.hRemoves mapping entry for READYTORUN_HELPER_ByRefWriteBarrier.
src/coreclr/inc/readytorun.hBumps R2R major/minimum major to 19 and annotates ByRef helper as unsupported.
src/coreclr/inc/jithelpers.hRemoves CORINFO_HELP_ASSIGN_BYREF helper registration.
src/coreclr/inc/jiteeversionguid.hUpdates the JIT/EE interface GUID due to helper enum/interface change.
src/coreclr/inc/corinfo.hRemoves CORINFO_HELP_ASSIGN_BYREF from the native helper enum.
docs/design/coreclr/botr/readytorun-format.mdUpdates R2R helper enum docs to mark ByRef write barrier as unused post-v19.

Comment threadsrc/coreclr/inc/readytorun.h
EgorBoand others added 2 commits May 28, 2026 14:46
Removing JIT_ByRefWriteBarrier from patchedcode.S/patchedcode.asm
shifted JIT_WriteBarrier 12 bytes earlier (2 instructions + a
LEAF_END_MARKED nop). The .balign 64 directive before
JIT_WriteBarrier_Table now produces 12 more bytes of padding, so
JIT_WriteBarrier_Table_Offset increases by 0xC.
This was caught by the CALC_TABLE_LOCATION assertion in
writebarriermanager.cpp:337 on ARM64.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions

This comment has been minimized.

@EgorBo

EgorBo commented May 28, 2026

Copy link
Copy Markdown
MemberAuthor

@jkotas it looks like we already bumped the major version of R2R in .NET 11 (~ P1 in #122704) so it should be fine to bump again?

@EgorBo
EgorBo marked this pull request as ready for review May 28, 2026 17:13
CopilotAI review requested due to automatic review settings May 28, 2026 17:13
@jkotas

jkotas commented May 28, 2026

Copy link
Copy Markdown
Member

it should be fine to bump again?

Yes (BTW: We have been doing a lot async v2 breaking changes without bumps.)

CopilotAI 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 44 out of 44 changed files in this pull request and generated 2 comments.

Comment threadsrc/coreclr/inc/readytorun.h
Comment threadsrc/coreclr/runtime/loongarch64/WriteBarriers.S Outdated
Comment threadsrc/coreclr/runtime/loongarch64/WriteBarriers.S Outdated
Comment threadsrc/coreclr/runtime/riscv64/WriteBarriers.S Outdated
Comment threadsrc/coreclr/vm/arm64/patchedcode.asm Outdated
Comment threadsrc/coreclr/inc/jiteeversionguid.h Outdated
@github-actions

This comment has been minimized.

@EgorBo

Copy link
Copy Markdown
MemberAuthor

@MihuBot -arm

@EgorBo

EgorBo commented May 28, 2026

Copy link
Copy Markdown
MemberAuthor

Looks like removing RBM_WRITE_BARRIER_DST from RBM_CALLEE_TRASH_WRITEBARRIER brings some nice diffs for arm64 in this PR (as we assume dst reg value doesn't change).

No impact on x64 where we seem to treat call to write barriers with just normal calling convention so all volatiles regs are trashed (I am not sure why, probably can be improved).

NOGC_WRITE_BARRIERS is 0 for amd64, arm32, wasm. And is 1 for arm64, LA64 and RISC-V

@EgorBo

EgorBo commented May 28, 2026

Copy link
Copy Markdown
MemberAuthor

Yeah, looks like there are perf opportunities for x64 around write-barriers. I am not sure about GPR as write-barriers clobber rax, rcx, rdx, r8–r11 so not much left to save (pre-APX), but what is interesting is that we should be able to say that all XMM/YMM/ZMM regs are never touched by it (today LSRA doesn't take that into account)

Filed #128720

Comment threadsrc/coreclr/vm/arm64/patchedcodeconstants.h Outdated
Comment threadsrc/coreclr/vm/arm64/patchedcodeconstants.h
Comment threadsrc/coreclr/vm/threads.cpp

@jkotasjkotas left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks!

Co-authored-by: Jan Kotas <jkotas@microsoft.com>
CopilotAI review requested due to automatic review settings May 28, 2026 21:15
@github-actions

This comment was marked as resolved.

CopilotAI 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 47 out of 47 changed files in this pull request and generated 1 comment.

Comment threadsrc/coreclr/inc/readytorun.h
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@EgorBo@jkotas@am11
, '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

Remove CORINFO_HELP_ASSIGN_BYREF and related dead code - #128687

Merged
EgorBo merged 9 commits into
mainfrom
dev/egorbo/remove-byref-wb
May 29, 2026
Merged

Remove CORINFO_HELP_ASSIGN_BYREF and related dead code#128687
EgorBo merged 9 commits into
mainfrom
dev/egorbo/remove-byref-wb

Conversation

@EgorBo

@EgorBoEgorBo commented May 28, 2026

Copy link
Copy Markdown
Member

Follow up #128542

The JIT no longer emits CORINFO_HELP_ASSIGN_BYREF anywhere. This change
removes the helper and all related dead code:
- Drops CORINFO_HELP_ASSIGN_BYREF from the JIT-EE enum and its
per-architecture VM asm implementations (JIT_ByRefWriteBarrier on
amd64/arm/arm64/i386/loongarch64/riscv64, plus wasm fakes).
- Drops the matching NativeAOT helpers (RhpByRefAssignRef and
RhpByRefAssignRefArm64) and their AVLocation tracking.
- Bumps R2R MAJOR_VERSION 18 -> 19 (MINIMUM_READYTORUN_MAJOR_VERSION
also bumped to 19) since old R2R images may reference the removed
READYTORUN_HELPER_ByRefWriteBarrier. The enum value 0x32 is
tombstoned with a 'Unused since 19.0' comment, matching the
precedent set by previously removed helpers.
- Regenerates jiteeversionguid.h.
- Cleans up the ARM stubs.cpp write-barrier patching machinery
(MaxWriteBarrierIndex 3 -> 2).
- Updates contract comments and regression-test docs to no longer
reference the removed helper name.
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke
See info in area-owners.md if you want to be subscribed.

CopilotAI 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 PR removes the CORINFO_HELP_ASSIGN_BYREF / JIT_ByRefWriteBarrier helper and associated runtime/JIT/AOT plumbing, updates ReadyToRun (R2R) helper mappings accordingly, and bumps the JIT/EE version GUID to keep the interface in sync.

Changes:

  • Remove CORINFO_HELP_ASSIGN_BYREF from the JIT-EE helper enums and delete JIT_ByRefWriteBarrier / RhpByRefAssignRef implementations across architectures.
  • Update R2R helper mapping/tooling to stop emitting or resolving the ByRef write barrier helper, and bump R2R major version constants.
  • Update tests/comments and exception helper marking logic to reflect the removed helper.

Reviewed changes

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

Show a summary per file
FileDescription
src/tests/JIT/Regression/JitBlue/Runtime_125169/Runtime_125169.csUpdates regression test comment to avoid helper-specific naming.
src/tests/JIT/Regression/JitBlue/GitHub_19444/GitHub_19444.csUpdates test header comment wording for the write barrier helper context.
src/tests/JIT/Regression/JitBlue/GitHub_19361/GitHub_19361.csUpdates test header comment to remove the specific helper name.
src/coreclr/vm/wasm/helpers.cppRemoves wasm stubs/markers related to JIT_ByRefWriteBarrier.
src/coreclr/vm/threads.cppStops registering CORINFO_HELP_ASSIGN_BYREF helper entrypoints.
src/coreclr/vm/riscv64/asmhelpers.SRemoves JIT_ByRefWriteBarrier implementation and updates comments.
src/coreclr/vm/loongarch64/asmhelpers.SRemoves JIT_ByRefWriteBarrier implementation and updates comments.
src/coreclr/vm/jitinterface.hRemoves RhpByRefAssignRef declarations/mappings.
src/coreclr/vm/i386/jithelp.SRemoves x86 JIT_ByRefWriteBarrier helper implementation.
src/coreclr/vm/i386/jithelp.asmRemoves x86 JIT_ByRefWriteBarrier helper implementation (MASM).
src/coreclr/vm/excep.cppRemoves ByRef write barrier range checks / AV-location tracking.
src/coreclr/vm/arm64/patchedcode.SRemoves ARM64 JIT_ByRefWriteBarrier and updates barrier comments.
src/coreclr/vm/arm64/patchedcode.asmRemoves ARM64 JIT_ByRefWriteBarrier and updates barrier comments (ASM).
src/coreclr/vm/arm/stubs.cppRemoves ByRef write barrier entry from ARM write-barrier patch/copy mapping.
src/coreclr/vm/arm/patchedcode.SRemoves ARM JIT_ByRefWriteBarrier placeholder from patched-code block.
src/coreclr/vm/arm/asmhelpers.SRemoves ARM ByRef write barrier macro + descriptor entries.
src/coreclr/vm/amd64/jithelpers_fast.SRemoves AMD64 JIT_ByRefWriteBarrier helper implementation (Unix asm).
src/coreclr/vm/amd64/JitHelpers_Fast.asmRemoves AMD64 JIT_ByRefWriteBarrier helper implementation (MASM).
src/coreclr/tools/Common/JitInterface/CorInfoHelpFunc.csRemoves CORINFO_HELP_ASSIGN_BYREF from managed helper enum used by tooling.
src/coreclr/tools/Common/Internal/Runtime/ReadyToRunConstants.csDocuments ByRef write barrier helper ID as unsupported post-v19.
src/coreclr/tools/Common/Internal/Runtime/ModuleHeaders.csBumps managed R2R header major/minor constants to 19.0.
src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.csRemoves mapping from CORINFO_HELP_ASSIGN_BYREF to R2R ByRef helper.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.csRemoves mapping from CORINFO_HELP_ASSIGN_BYREF to R2R ByRef helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/JitHelper.csRemoves ReadyToRunHelper.ByRefWriteBarrier entrypoint resolution logic.
src/coreclr/runtime/riscv64/WriteBarriers.SRemoves RhpByRefAssignRef implementation on RISC-V.
src/coreclr/runtime/portable/WriteBarriers.cppRemoves portable RhpByRefAssignRef stub.
src/coreclr/runtime/loongarch64/WriteBarriers.SRemoves RhpByRefAssignRef implementation and updates comments.
src/coreclr/runtime/i386/WriteBarriers.SRemoves x86 RhpByRefAssignRef implementation.
src/coreclr/runtime/i386/WriteBarriers.asmRemoves x86 RhpByRefAssignRef implementation (ASM).
src/coreclr/runtime/arm64/WriteBarriers.SRemoves ARM64 RhpByRefAssignRefArm64 implementation.
src/coreclr/runtime/arm64/WriteBarriers.asmRemoves ARM64 RhpByRefAssignRefArm64 implementation (ASM).
src/coreclr/runtime/arm/WriteBarriers.SRemoves ARM RhpByRefAssignRef implementation.
src/coreclr/runtime/amd64/WriteBarriers.SRemoves AMD64 RhpByRefAssignRef implementation (Unix asm).
src/coreclr/runtime/amd64/WriteBarriers.asmRemoves AMD64 RhpByRefAssignRef implementation (ASM).
src/coreclr/nativeaot/Runtime/inc/ModuleHeaders.hBumps NativeAOT R2R header major/minor constants to 19.0.
src/coreclr/nativeaot/Runtime/EHHelpers.cppRemoves ByRef write barrier AV-location tracking in NativeAOT EH helper logic.
src/coreclr/jit/codegenwasm.cppRemoves comment references to the ByRef helper signature variant.
src/coreclr/inc/readytorunhelpers.hRemoves mapping entry for READYTORUN_HELPER_ByRefWriteBarrier.
src/coreclr/inc/readytorun.hBumps R2R major/minimum major to 19 and annotates ByRef helper as unsupported.
src/coreclr/inc/jithelpers.hRemoves CORINFO_HELP_ASSIGN_BYREF helper registration.
src/coreclr/inc/jiteeversionguid.hUpdates the JIT/EE interface GUID due to helper enum/interface change.
src/coreclr/inc/corinfo.hRemoves CORINFO_HELP_ASSIGN_BYREF from the native helper enum.
docs/design/coreclr/botr/readytorun-format.mdUpdates R2R helper enum docs to mark ByRef write barrier as unused post-v19.

Comment threadsrc/coreclr/inc/readytorun.h
EgorBoand others added 2 commits May 28, 2026 14:46
Removing JIT_ByRefWriteBarrier from patchedcode.S/patchedcode.asm
shifted JIT_WriteBarrier 12 bytes earlier (2 instructions + a
LEAF_END_MARKED nop). The .balign 64 directive before
JIT_WriteBarrier_Table now produces 12 more bytes of padding, so
JIT_WriteBarrier_Table_Offset increases by 0xC.
This was caught by the CALC_TABLE_LOCATION assertion in
writebarriermanager.cpp:337 on ARM64.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions

This comment has been minimized.

@EgorBo

EgorBo commented May 28, 2026

Copy link
Copy Markdown
MemberAuthor

@jkotas it looks like we already bumped the major version of R2R in .NET 11 (~ P1 in #122704) so it should be fine to bump again?

@EgorBo
EgorBo marked this pull request as ready for review May 28, 2026 17:13
CopilotAI review requested due to automatic review settings May 28, 2026 17:13
@jkotas

jkotas commented May 28, 2026

Copy link
Copy Markdown
Member

it should be fine to bump again?

Yes (BTW: We have been doing a lot async v2 breaking changes without bumps.)

CopilotAI 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 44 out of 44 changed files in this pull request and generated 2 comments.

Comment threadsrc/coreclr/inc/readytorun.h
Comment threadsrc/coreclr/runtime/loongarch64/WriteBarriers.S Outdated
Comment threadsrc/coreclr/runtime/loongarch64/WriteBarriers.S Outdated
Comment threadsrc/coreclr/runtime/riscv64/WriteBarriers.S Outdated
Comment threadsrc/coreclr/vm/arm64/patchedcode.asm Outdated
Comment threadsrc/coreclr/inc/jiteeversionguid.h Outdated
@github-actions

This comment has been minimized.

@EgorBo

Copy link
Copy Markdown
MemberAuthor

@MihuBot -arm

@EgorBo

EgorBo commented May 28, 2026

Copy link
Copy Markdown
MemberAuthor

Looks like removing RBM_WRITE_BARRIER_DST from RBM_CALLEE_TRASH_WRITEBARRIER brings some nice diffs for arm64 in this PR (as we assume dst reg value doesn't change).

No impact on x64 where we seem to treat call to write barriers with just normal calling convention so all volatiles regs are trashed (I am not sure why, probably can be improved).

NOGC_WRITE_BARRIERS is 0 for amd64, arm32, wasm. And is 1 for arm64, LA64 and RISC-V

@EgorBo

EgorBo commented May 28, 2026

Copy link
Copy Markdown
MemberAuthor

Yeah, looks like there are perf opportunities for x64 around write-barriers. I am not sure about GPR as write-barriers clobber rax, rcx, rdx, r8–r11 so not much left to save (pre-APX), but what is interesting is that we should be able to say that all XMM/YMM/ZMM regs are never touched by it (today LSRA doesn't take that into account)

Filed #128720

Comment threadsrc/coreclr/vm/arm64/patchedcodeconstants.h Outdated
Comment threadsrc/coreclr/vm/arm64/patchedcodeconstants.h
Comment threadsrc/coreclr/vm/threads.cpp

@jkotasjkotas left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks!

Co-authored-by: Jan Kotas <jkotas@microsoft.com>
CopilotAI review requested due to automatic review settings May 28, 2026 21:15
@github-actions

This comment was marked as resolved.

CopilotAI 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 47 out of 47 changed files in this pull request and generated 1 comment.

Comment threadsrc/coreclr/inc/readytorun.h
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@EgorBo@jkotas@am11
, '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

Remove CORINFO_HELP_ASSIGN_BYREF and related dead code - #128687

Merged
EgorBo merged 9 commits into
mainfrom
dev/egorbo/remove-byref-wb
May 29, 2026
Merged

Remove CORINFO_HELP_ASSIGN_BYREF and related dead code#128687
EgorBo merged 9 commits into
mainfrom
dev/egorbo/remove-byref-wb

Conversation

@EgorBo

@EgorBoEgorBo commented May 28, 2026

Copy link
Copy Markdown
Member

Follow up #128542

The JIT no longer emits CORINFO_HELP_ASSIGN_BYREF anywhere. This change
removes the helper and all related dead code:
- Drops CORINFO_HELP_ASSIGN_BYREF from the JIT-EE enum and its
per-architecture VM asm implementations (JIT_ByRefWriteBarrier on
amd64/arm/arm64/i386/loongarch64/riscv64, plus wasm fakes).
- Drops the matching NativeAOT helpers (RhpByRefAssignRef and
RhpByRefAssignRefArm64) and their AVLocation tracking.
- Bumps R2R MAJOR_VERSION 18 -> 19 (MINIMUM_READYTORUN_MAJOR_VERSION
also bumped to 19) since old R2R images may reference the removed
READYTORUN_HELPER_ByRefWriteBarrier. The enum value 0x32 is
tombstoned with a 'Unused since 19.0' comment, matching the
precedent set by previously removed helpers.
- Regenerates jiteeversionguid.h.
- Cleans up the ARM stubs.cpp write-barrier patching machinery
(MaxWriteBarrierIndex 3 -> 2).
- Updates contract comments and regression-test docs to no longer
reference the removed helper name.
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke
See info in area-owners.md if you want to be subscribed.

CopilotAI 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 PR removes the CORINFO_HELP_ASSIGN_BYREF / JIT_ByRefWriteBarrier helper and associated runtime/JIT/AOT plumbing, updates ReadyToRun (R2R) helper mappings accordingly, and bumps the JIT/EE version GUID to keep the interface in sync.

Changes:

  • Remove CORINFO_HELP_ASSIGN_BYREF from the JIT-EE helper enums and delete JIT_ByRefWriteBarrier / RhpByRefAssignRef implementations across architectures.
  • Update R2R helper mapping/tooling to stop emitting or resolving the ByRef write barrier helper, and bump R2R major version constants.
  • Update tests/comments and exception helper marking logic to reflect the removed helper.

Reviewed changes

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

Show a summary per file
FileDescription
src/tests/JIT/Regression/JitBlue/Runtime_125169/Runtime_125169.csUpdates regression test comment to avoid helper-specific naming.
src/tests/JIT/Regression/JitBlue/GitHub_19444/GitHub_19444.csUpdates test header comment wording for the write barrier helper context.
src/tests/JIT/Regression/JitBlue/GitHub_19361/GitHub_19361.csUpdates test header comment to remove the specific helper name.
src/coreclr/vm/wasm/helpers.cppRemoves wasm stubs/markers related to JIT_ByRefWriteBarrier.
src/coreclr/vm/threads.cppStops registering CORINFO_HELP_ASSIGN_BYREF helper entrypoints.
src/coreclr/vm/riscv64/asmhelpers.SRemoves JIT_ByRefWriteBarrier implementation and updates comments.
src/coreclr/vm/loongarch64/asmhelpers.SRemoves JIT_ByRefWriteBarrier implementation and updates comments.
src/coreclr/vm/jitinterface.hRemoves RhpByRefAssignRef declarations/mappings.
src/coreclr/vm/i386/jithelp.SRemoves x86 JIT_ByRefWriteBarrier helper implementation.
src/coreclr/vm/i386/jithelp.asmRemoves x86 JIT_ByRefWriteBarrier helper implementation (MASM).
src/coreclr/vm/excep.cppRemoves ByRef write barrier range checks / AV-location tracking.
src/coreclr/vm/arm64/patchedcode.SRemoves ARM64 JIT_ByRefWriteBarrier and updates barrier comments.
src/coreclr/vm/arm64/patchedcode.asmRemoves ARM64 JIT_ByRefWriteBarrier and updates barrier comments (ASM).
src/coreclr/vm/arm/stubs.cppRemoves ByRef write barrier entry from ARM write-barrier patch/copy mapping.
src/coreclr/vm/arm/patchedcode.SRemoves ARM JIT_ByRefWriteBarrier placeholder from patched-code block.
src/coreclr/vm/arm/asmhelpers.SRemoves ARM ByRef write barrier macro + descriptor entries.
src/coreclr/vm/amd64/jithelpers_fast.SRemoves AMD64 JIT_ByRefWriteBarrier helper implementation (Unix asm).
src/coreclr/vm/amd64/JitHelpers_Fast.asmRemoves AMD64 JIT_ByRefWriteBarrier helper implementation (MASM).
src/coreclr/tools/Common/JitInterface/CorInfoHelpFunc.csRemoves CORINFO_HELP_ASSIGN_BYREF from managed helper enum used by tooling.
src/coreclr/tools/Common/Internal/Runtime/ReadyToRunConstants.csDocuments ByRef write barrier helper ID as unsupported post-v19.
src/coreclr/tools/Common/Internal/Runtime/ModuleHeaders.csBumps managed R2R header major/minor constants to 19.0.
src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.csRemoves mapping from CORINFO_HELP_ASSIGN_BYREF to R2R ByRef helper.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.csRemoves mapping from CORINFO_HELP_ASSIGN_BYREF to R2R ByRef helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/JitHelper.csRemoves ReadyToRunHelper.ByRefWriteBarrier entrypoint resolution logic.
src/coreclr/runtime/riscv64/WriteBarriers.SRemoves RhpByRefAssignRef implementation on RISC-V.
src/coreclr/runtime/portable/WriteBarriers.cppRemoves portable RhpByRefAssignRef stub.
src/coreclr/runtime/loongarch64/WriteBarriers.SRemoves RhpByRefAssignRef implementation and updates comments.
src/coreclr/runtime/i386/WriteBarriers.SRemoves x86 RhpByRefAssignRef implementation.
src/coreclr/runtime/i386/WriteBarriers.asmRemoves x86 RhpByRefAssignRef implementation (ASM).
src/coreclr/runtime/arm64/WriteBarriers.SRemoves ARM64 RhpByRefAssignRefArm64 implementation.
src/coreclr/runtime/arm64/WriteBarriers.asmRemoves ARM64 RhpByRefAssignRefArm64 implementation (ASM).
src/coreclr/runtime/arm/WriteBarriers.SRemoves ARM RhpByRefAssignRef implementation.
src/coreclr/runtime/amd64/WriteBarriers.SRemoves AMD64 RhpByRefAssignRef implementation (Unix asm).
src/coreclr/runtime/amd64/WriteBarriers.asmRemoves AMD64 RhpByRefAssignRef implementation (ASM).
src/coreclr/nativeaot/Runtime/inc/ModuleHeaders.hBumps NativeAOT R2R header major/minor constants to 19.0.
src/coreclr/nativeaot/Runtime/EHHelpers.cppRemoves ByRef write barrier AV-location tracking in NativeAOT EH helper logic.
src/coreclr/jit/codegenwasm.cppRemoves comment references to the ByRef helper signature variant.
src/coreclr/inc/readytorunhelpers.hRemoves mapping entry for READYTORUN_HELPER_ByRefWriteBarrier.
src/coreclr/inc/readytorun.hBumps R2R major/minimum major to 19 and annotates ByRef helper as unsupported.
src/coreclr/inc/jithelpers.hRemoves CORINFO_HELP_ASSIGN_BYREF helper registration.
src/coreclr/inc/jiteeversionguid.hUpdates the JIT/EE interface GUID due to helper enum/interface change.
src/coreclr/inc/corinfo.hRemoves CORINFO_HELP_ASSIGN_BYREF from the native helper enum.
docs/design/coreclr/botr/readytorun-format.mdUpdates R2R helper enum docs to mark ByRef write barrier as unused post-v19.

Comment threadsrc/coreclr/inc/readytorun.h
EgorBoand others added 2 commits May 28, 2026 14:46
Removing JIT_ByRefWriteBarrier from patchedcode.S/patchedcode.asm
shifted JIT_WriteBarrier 12 bytes earlier (2 instructions + a
LEAF_END_MARKED nop). The .balign 64 directive before
JIT_WriteBarrier_Table now produces 12 more bytes of padding, so
JIT_WriteBarrier_Table_Offset increases by 0xC.
This was caught by the CALC_TABLE_LOCATION assertion in
writebarriermanager.cpp:337 on ARM64.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions

This comment has been minimized.

@EgorBo

EgorBo commented May 28, 2026

Copy link
Copy Markdown
MemberAuthor

@jkotas it looks like we already bumped the major version of R2R in .NET 11 (~ P1 in #122704) so it should be fine to bump again?

@EgorBo
EgorBo marked this pull request as ready for review May 28, 2026 17:13
CopilotAI review requested due to automatic review settings May 28, 2026 17:13
@jkotas

jkotas commented May 28, 2026

Copy link
Copy Markdown
Member

it should be fine to bump again?

Yes (BTW: We have been doing a lot async v2 breaking changes without bumps.)

CopilotAI 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 44 out of 44 changed files in this pull request and generated 2 comments.

Comment threadsrc/coreclr/inc/readytorun.h
Comment threadsrc/coreclr/runtime/loongarch64/WriteBarriers.S Outdated
Comment threadsrc/coreclr/runtime/loongarch64/WriteBarriers.S Outdated
Comment threadsrc/coreclr/runtime/riscv64/WriteBarriers.S Outdated
Comment threadsrc/coreclr/vm/arm64/patchedcode.asm Outdated
Comment threadsrc/coreclr/inc/jiteeversionguid.h Outdated
@github-actions

This comment has been minimized.

@EgorBo

Copy link
Copy Markdown
MemberAuthor

@MihuBot -arm

@EgorBo

EgorBo commented May 28, 2026

Copy link
Copy Markdown
MemberAuthor

Looks like removing RBM_WRITE_BARRIER_DST from RBM_CALLEE_TRASH_WRITEBARRIER brings some nice diffs for arm64 in this PR (as we assume dst reg value doesn't change).

No impact on x64 where we seem to treat call to write barriers with just normal calling convention so all volatiles regs are trashed (I am not sure why, probably can be improved).

NOGC_WRITE_BARRIERS is 0 for amd64, arm32, wasm. And is 1 for arm64, LA64 and RISC-V

@EgorBo

EgorBo commented May 28, 2026

Copy link
Copy Markdown
MemberAuthor

Yeah, looks like there are perf opportunities for x64 around write-barriers. I am not sure about GPR as write-barriers clobber rax, rcx, rdx, r8–r11 so not much left to save (pre-APX), but what is interesting is that we should be able to say that all XMM/YMM/ZMM regs are never touched by it (today LSRA doesn't take that into account)

Filed #128720

Comment threadsrc/coreclr/vm/arm64/patchedcodeconstants.h Outdated
Comment threadsrc/coreclr/vm/arm64/patchedcodeconstants.h
Comment threadsrc/coreclr/vm/threads.cpp

@jkotasjkotas left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks!

Co-authored-by: Jan Kotas <jkotas@microsoft.com>
CopilotAI review requested due to automatic review settings May 28, 2026 21:15
@github-actions

This comment was marked as resolved.

CopilotAI 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 47 out of 47 changed files in this pull request and generated 1 comment.

Comment threadsrc/coreclr/inc/readytorun.h
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@EgorBo@jkotas@am11
, '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

Remove CORINFO_HELP_ASSIGN_BYREF and related dead code - #128687

Merged
EgorBo merged 9 commits into
mainfrom
dev/egorbo/remove-byref-wb
May 29, 2026
Merged

Remove CORINFO_HELP_ASSIGN_BYREF and related dead code#128687
EgorBo merged 9 commits into
mainfrom
dev/egorbo/remove-byref-wb

Conversation

@EgorBo

@EgorBoEgorBo commented May 28, 2026

Copy link
Copy Markdown
Member

Follow up #128542

The JIT no longer emits CORINFO_HELP_ASSIGN_BYREF anywhere. This change
removes the helper and all related dead code:
- Drops CORINFO_HELP_ASSIGN_BYREF from the JIT-EE enum and its
per-architecture VM asm implementations (JIT_ByRefWriteBarrier on
amd64/arm/arm64/i386/loongarch64/riscv64, plus wasm fakes).
- Drops the matching NativeAOT helpers (RhpByRefAssignRef and
RhpByRefAssignRefArm64) and their AVLocation tracking.
- Bumps R2R MAJOR_VERSION 18 -> 19 (MINIMUM_READYTORUN_MAJOR_VERSION
also bumped to 19) since old R2R images may reference the removed
READYTORUN_HELPER_ByRefWriteBarrier. The enum value 0x32 is
tombstoned with a 'Unused since 19.0' comment, matching the
precedent set by previously removed helpers.
- Regenerates jiteeversionguid.h.
- Cleans up the ARM stubs.cpp write-barrier patching machinery
(MaxWriteBarrierIndex 3 -> 2).
- Updates contract comments and regression-test docs to no longer
reference the removed helper name.
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke
See info in area-owners.md if you want to be subscribed.

CopilotAI 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 PR removes the CORINFO_HELP_ASSIGN_BYREF / JIT_ByRefWriteBarrier helper and associated runtime/JIT/AOT plumbing, updates ReadyToRun (R2R) helper mappings accordingly, and bumps the JIT/EE version GUID to keep the interface in sync.

Changes:

  • Remove CORINFO_HELP_ASSIGN_BYREF from the JIT-EE helper enums and delete JIT_ByRefWriteBarrier / RhpByRefAssignRef implementations across architectures.
  • Update R2R helper mapping/tooling to stop emitting or resolving the ByRef write barrier helper, and bump R2R major version constants.
  • Update tests/comments and exception helper marking logic to reflect the removed helper.

Reviewed changes

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

Show a summary per file
FileDescription
src/tests/JIT/Regression/JitBlue/Runtime_125169/Runtime_125169.csUpdates regression test comment to avoid helper-specific naming.
src/tests/JIT/Regression/JitBlue/GitHub_19444/GitHub_19444.csUpdates test header comment wording for the write barrier helper context.
src/tests/JIT/Regression/JitBlue/GitHub_19361/GitHub_19361.csUpdates test header comment to remove the specific helper name.
src/coreclr/vm/wasm/helpers.cppRemoves wasm stubs/markers related to JIT_ByRefWriteBarrier.
src/coreclr/vm/threads.cppStops registering CORINFO_HELP_ASSIGN_BYREF helper entrypoints.
src/coreclr/vm/riscv64/asmhelpers.SRemoves JIT_ByRefWriteBarrier implementation and updates comments.
src/coreclr/vm/loongarch64/asmhelpers.SRemoves JIT_ByRefWriteBarrier implementation and updates comments.
src/coreclr/vm/jitinterface.hRemoves RhpByRefAssignRef declarations/mappings.
src/coreclr/vm/i386/jithelp.SRemoves x86 JIT_ByRefWriteBarrier helper implementation.
src/coreclr/vm/i386/jithelp.asmRemoves x86 JIT_ByRefWriteBarrier helper implementation (MASM).
src/coreclr/vm/excep.cppRemoves ByRef write barrier range checks / AV-location tracking.
src/coreclr/vm/arm64/patchedcode.SRemoves ARM64 JIT_ByRefWriteBarrier and updates barrier comments.
src/coreclr/vm/arm64/patchedcode.asmRemoves ARM64 JIT_ByRefWriteBarrier and updates barrier comments (ASM).
src/coreclr/vm/arm/stubs.cppRemoves ByRef write barrier entry from ARM write-barrier patch/copy mapping.
src/coreclr/vm/arm/patchedcode.SRemoves ARM JIT_ByRefWriteBarrier placeholder from patched-code block.
src/coreclr/vm/arm/asmhelpers.SRemoves ARM ByRef write barrier macro + descriptor entries.
src/coreclr/vm/amd64/jithelpers_fast.SRemoves AMD64 JIT_ByRefWriteBarrier helper implementation (Unix asm).
src/coreclr/vm/amd64/JitHelpers_Fast.asmRemoves AMD64 JIT_ByRefWriteBarrier helper implementation (MASM).
src/coreclr/tools/Common/JitInterface/CorInfoHelpFunc.csRemoves CORINFO_HELP_ASSIGN_BYREF from managed helper enum used by tooling.
src/coreclr/tools/Common/Internal/Runtime/ReadyToRunConstants.csDocuments ByRef write barrier helper ID as unsupported post-v19.
src/coreclr/tools/Common/Internal/Runtime/ModuleHeaders.csBumps managed R2R header major/minor constants to 19.0.
src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.csRemoves mapping from CORINFO_HELP_ASSIGN_BYREF to R2R ByRef helper.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.csRemoves mapping from CORINFO_HELP_ASSIGN_BYREF to R2R ByRef helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/JitHelper.csRemoves ReadyToRunHelper.ByRefWriteBarrier entrypoint resolution logic.
src/coreclr/runtime/riscv64/WriteBarriers.SRemoves RhpByRefAssignRef implementation on RISC-V.
src/coreclr/runtime/portable/WriteBarriers.cppRemoves portable RhpByRefAssignRef stub.
src/coreclr/runtime/loongarch64/WriteBarriers.SRemoves RhpByRefAssignRef implementation and updates comments.
src/coreclr/runtime/i386/WriteBarriers.SRemoves x86 RhpByRefAssignRef implementation.
src/coreclr/runtime/i386/WriteBarriers.asmRemoves x86 RhpByRefAssignRef implementation (ASM).
src/coreclr/runtime/arm64/WriteBarriers.SRemoves ARM64 RhpByRefAssignRefArm64 implementation.
src/coreclr/runtime/arm64/WriteBarriers.asmRemoves ARM64 RhpByRefAssignRefArm64 implementation (ASM).
src/coreclr/runtime/arm/WriteBarriers.SRemoves ARM RhpByRefAssignRef implementation.
src/coreclr/runtime/amd64/WriteBarriers.SRemoves AMD64 RhpByRefAssignRef implementation (Unix asm).
src/coreclr/runtime/amd64/WriteBarriers.asmRemoves AMD64 RhpByRefAssignRef implementation (ASM).
src/coreclr/nativeaot/Runtime/inc/ModuleHeaders.hBumps NativeAOT R2R header major/minor constants to 19.0.
src/coreclr/nativeaot/Runtime/EHHelpers.cppRemoves ByRef write barrier AV-location tracking in NativeAOT EH helper logic.
src/coreclr/jit/codegenwasm.cppRemoves comment references to the ByRef helper signature variant.
src/coreclr/inc/readytorunhelpers.hRemoves mapping entry for READYTORUN_HELPER_ByRefWriteBarrier.
src/coreclr/inc/readytorun.hBumps R2R major/minimum major to 19 and annotates ByRef helper as unsupported.
src/coreclr/inc/jithelpers.hRemoves CORINFO_HELP_ASSIGN_BYREF helper registration.
src/coreclr/inc/jiteeversionguid.hUpdates the JIT/EE interface GUID due to helper enum/interface change.
src/coreclr/inc/corinfo.hRemoves CORINFO_HELP_ASSIGN_BYREF from the native helper enum.
docs/design/coreclr/botr/readytorun-format.mdUpdates R2R helper enum docs to mark ByRef write barrier as unused post-v19.

Comment threadsrc/coreclr/inc/readytorun.h
EgorBoand others added 2 commits May 28, 2026 14:46
Removing JIT_ByRefWriteBarrier from patchedcode.S/patchedcode.asm
shifted JIT_WriteBarrier 12 bytes earlier (2 instructions + a
LEAF_END_MARKED nop). The .balign 64 directive before
JIT_WriteBarrier_Table now produces 12 more bytes of padding, so
JIT_WriteBarrier_Table_Offset increases by 0xC.
This was caught by the CALC_TABLE_LOCATION assertion in
writebarriermanager.cpp:337 on ARM64.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions

This comment has been minimized.

@EgorBo

EgorBo commented May 28, 2026

Copy link
Copy Markdown
MemberAuthor

@jkotas it looks like we already bumped the major version of R2R in .NET 11 (~ P1 in #122704) so it should be fine to bump again?

@EgorBo
EgorBo marked this pull request as ready for review May 28, 2026 17:13
CopilotAI review requested due to automatic review settings May 28, 2026 17:13
@jkotas

jkotas commented May 28, 2026

Copy link
Copy Markdown
Member

it should be fine to bump again?

Yes (BTW: We have been doing a lot async v2 breaking changes without bumps.)

CopilotAI 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 44 out of 44 changed files in this pull request and generated 2 comments.

Comment threadsrc/coreclr/inc/readytorun.h
Comment threadsrc/coreclr/runtime/loongarch64/WriteBarriers.S Outdated
Comment threadsrc/coreclr/runtime/loongarch64/WriteBarriers.S Outdated
Comment threadsrc/coreclr/runtime/riscv64/WriteBarriers.S Outdated
Comment threadsrc/coreclr/vm/arm64/patchedcode.asm Outdated
Comment threadsrc/coreclr/inc/jiteeversionguid.h Outdated
@github-actions

This comment has been minimized.

@EgorBo

Copy link
Copy Markdown
MemberAuthor

@MihuBot -arm

@EgorBo

EgorBo commented May 28, 2026

Copy link
Copy Markdown
MemberAuthor

Looks like removing RBM_WRITE_BARRIER_DST from RBM_CALLEE_TRASH_WRITEBARRIER brings some nice diffs for arm64 in this PR (as we assume dst reg value doesn't change).

No impact on x64 where we seem to treat call to write barriers with just normal calling convention so all volatiles regs are trashed (I am not sure why, probably can be improved).

NOGC_WRITE_BARRIERS is 0 for amd64, arm32, wasm. And is 1 for arm64, LA64 and RISC-V

@EgorBo

EgorBo commented May 28, 2026

Copy link
Copy Markdown
MemberAuthor

Yeah, looks like there are perf opportunities for x64 around write-barriers. I am not sure about GPR as write-barriers clobber rax, rcx, rdx, r8–r11 so not much left to save (pre-APX), but what is interesting is that we should be able to say that all XMM/YMM/ZMM regs are never touched by it (today LSRA doesn't take that into account)

Filed #128720

Comment threadsrc/coreclr/vm/arm64/patchedcodeconstants.h Outdated
Comment threadsrc/coreclr/vm/arm64/patchedcodeconstants.h
Comment threadsrc/coreclr/vm/threads.cpp

@jkotasjkotas left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks!

Co-authored-by: Jan Kotas <jkotas@microsoft.com>
CopilotAI review requested due to automatic review settings May 28, 2026 21:15
@github-actions

This comment was marked as resolved.

CopilotAI 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 47 out of 47 changed files in this pull request and generated 1 comment.

Comment threadsrc/coreclr/inc/readytorun.h
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@EgorBo@jkotas@am11
, '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

Remove CORINFO_HELP_ASSIGN_BYREF and related dead code - #128687

Merged
EgorBo merged 9 commits into
mainfrom
dev/egorbo/remove-byref-wb
May 29, 2026
Merged

Remove CORINFO_HELP_ASSIGN_BYREF and related dead code#128687
EgorBo merged 9 commits into
mainfrom
dev/egorbo/remove-byref-wb

Conversation

@EgorBo

@EgorBoEgorBo commented May 28, 2026

Copy link
Copy Markdown
Member

Follow up #128542

The JIT no longer emits CORINFO_HELP_ASSIGN_BYREF anywhere. This change
removes the helper and all related dead code:
- Drops CORINFO_HELP_ASSIGN_BYREF from the JIT-EE enum and its
per-architecture VM asm implementations (JIT_ByRefWriteBarrier on
amd64/arm/arm64/i386/loongarch64/riscv64, plus wasm fakes).
- Drops the matching NativeAOT helpers (RhpByRefAssignRef and
RhpByRefAssignRefArm64) and their AVLocation tracking.
- Bumps R2R MAJOR_VERSION 18 -> 19 (MINIMUM_READYTORUN_MAJOR_VERSION
also bumped to 19) since old R2R images may reference the removed
READYTORUN_HELPER_ByRefWriteBarrier. The enum value 0x32 is
tombstoned with a 'Unused since 19.0' comment, matching the
precedent set by previously removed helpers.
- Regenerates jiteeversionguid.h.
- Cleans up the ARM stubs.cpp write-barrier patching machinery
(MaxWriteBarrierIndex 3 -> 2).
- Updates contract comments and regression-test docs to no longer
reference the removed helper name.
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke
See info in area-owners.md if you want to be subscribed.

CopilotAI 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 PR removes the CORINFO_HELP_ASSIGN_BYREF / JIT_ByRefWriteBarrier helper and associated runtime/JIT/AOT plumbing, updates ReadyToRun (R2R) helper mappings accordingly, and bumps the JIT/EE version GUID to keep the interface in sync.

Changes:

  • Remove CORINFO_HELP_ASSIGN_BYREF from the JIT-EE helper enums and delete JIT_ByRefWriteBarrier / RhpByRefAssignRef implementations across architectures.
  • Update R2R helper mapping/tooling to stop emitting or resolving the ByRef write barrier helper, and bump R2R major version constants.
  • Update tests/comments and exception helper marking logic to reflect the removed helper.

Reviewed changes

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

Show a summary per file
FileDescription
src/tests/JIT/Regression/JitBlue/Runtime_125169/Runtime_125169.csUpdates regression test comment to avoid helper-specific naming.
src/tests/JIT/Regression/JitBlue/GitHub_19444/GitHub_19444.csUpdates test header comment wording for the write barrier helper context.
src/tests/JIT/Regression/JitBlue/GitHub_19361/GitHub_19361.csUpdates test header comment to remove the specific helper name.
src/coreclr/vm/wasm/helpers.cppRemoves wasm stubs/markers related to JIT_ByRefWriteBarrier.
src/coreclr/vm/threads.cppStops registering CORINFO_HELP_ASSIGN_BYREF helper entrypoints.
src/coreclr/vm/riscv64/asmhelpers.SRemoves JIT_ByRefWriteBarrier implementation and updates comments.
src/coreclr/vm/loongarch64/asmhelpers.SRemoves JIT_ByRefWriteBarrier implementation and updates comments.
src/coreclr/vm/jitinterface.hRemoves RhpByRefAssignRef declarations/mappings.
src/coreclr/vm/i386/jithelp.SRemoves x86 JIT_ByRefWriteBarrier helper implementation.
src/coreclr/vm/i386/jithelp.asmRemoves x86 JIT_ByRefWriteBarrier helper implementation (MASM).
src/coreclr/vm/excep.cppRemoves ByRef write barrier range checks / AV-location tracking.
src/coreclr/vm/arm64/patchedcode.SRemoves ARM64 JIT_ByRefWriteBarrier and updates barrier comments.
src/coreclr/vm/arm64/patchedcode.asmRemoves ARM64 JIT_ByRefWriteBarrier and updates barrier comments (ASM).
src/coreclr/vm/arm/stubs.cppRemoves ByRef write barrier entry from ARM write-barrier patch/copy mapping.
src/coreclr/vm/arm/patchedcode.SRemoves ARM JIT_ByRefWriteBarrier placeholder from patched-code block.
src/coreclr/vm/arm/asmhelpers.SRemoves ARM ByRef write barrier macro + descriptor entries.
src/coreclr/vm/amd64/jithelpers_fast.SRemoves AMD64 JIT_ByRefWriteBarrier helper implementation (Unix asm).
src/coreclr/vm/amd64/JitHelpers_Fast.asmRemoves AMD64 JIT_ByRefWriteBarrier helper implementation (MASM).
src/coreclr/tools/Common/JitInterface/CorInfoHelpFunc.csRemoves CORINFO_HELP_ASSIGN_BYREF from managed helper enum used by tooling.
src/coreclr/tools/Common/Internal/Runtime/ReadyToRunConstants.csDocuments ByRef write barrier helper ID as unsupported post-v19.
src/coreclr/tools/Common/Internal/Runtime/ModuleHeaders.csBumps managed R2R header major/minor constants to 19.0.
src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.csRemoves mapping from CORINFO_HELP_ASSIGN_BYREF to R2R ByRef helper.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.csRemoves mapping from CORINFO_HELP_ASSIGN_BYREF to R2R ByRef helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/JitHelper.csRemoves ReadyToRunHelper.ByRefWriteBarrier entrypoint resolution logic.
src/coreclr/runtime/riscv64/WriteBarriers.SRemoves RhpByRefAssignRef implementation on RISC-V.
src/coreclr/runtime/portable/WriteBarriers.cppRemoves portable RhpByRefAssignRef stub.
src/coreclr/runtime/loongarch64/WriteBarriers.SRemoves RhpByRefAssignRef implementation and updates comments.
src/coreclr/runtime/i386/WriteBarriers.SRemoves x86 RhpByRefAssignRef implementation.
src/coreclr/runtime/i386/WriteBarriers.asmRemoves x86 RhpByRefAssignRef implementation (ASM).
src/coreclr/runtime/arm64/WriteBarriers.SRemoves ARM64 RhpByRefAssignRefArm64 implementation.
src/coreclr/runtime/arm64/WriteBarriers.asmRemoves ARM64 RhpByRefAssignRefArm64 implementation (ASM).
src/coreclr/runtime/arm/WriteBarriers.SRemoves ARM RhpByRefAssignRef implementation.
src/coreclr/runtime/amd64/WriteBarriers.SRemoves AMD64 RhpByRefAssignRef implementation (Unix asm).
src/coreclr/runtime/amd64/WriteBarriers.asmRemoves AMD64 RhpByRefAssignRef implementation (ASM).
src/coreclr/nativeaot/Runtime/inc/ModuleHeaders.hBumps NativeAOT R2R header major/minor constants to 19.0.
src/coreclr/nativeaot/Runtime/EHHelpers.cppRemoves ByRef write barrier AV-location tracking in NativeAOT EH helper logic.
src/coreclr/jit/codegenwasm.cppRemoves comment references to the ByRef helper signature variant.
src/coreclr/inc/readytorunhelpers.hRemoves mapping entry for READYTORUN_HELPER_ByRefWriteBarrier.
src/coreclr/inc/readytorun.hBumps R2R major/minimum major to 19 and annotates ByRef helper as unsupported.
src/coreclr/inc/jithelpers.hRemoves CORINFO_HELP_ASSIGN_BYREF helper registration.
src/coreclr/inc/jiteeversionguid.hUpdates the JIT/EE interface GUID due to helper enum/interface change.
src/coreclr/inc/corinfo.hRemoves CORINFO_HELP_ASSIGN_BYREF from the native helper enum.
docs/design/coreclr/botr/readytorun-format.mdUpdates R2R helper enum docs to mark ByRef write barrier as unused post-v19.

Comment threadsrc/coreclr/inc/readytorun.h
EgorBoand others added 2 commits May 28, 2026 14:46
Removing JIT_ByRefWriteBarrier from patchedcode.S/patchedcode.asm
shifted JIT_WriteBarrier 12 bytes earlier (2 instructions + a
LEAF_END_MARKED nop). The .balign 64 directive before
JIT_WriteBarrier_Table now produces 12 more bytes of padding, so
JIT_WriteBarrier_Table_Offset increases by 0xC.
This was caught by the CALC_TABLE_LOCATION assertion in
writebarriermanager.cpp:337 on ARM64.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions

This comment has been minimized.

@EgorBo

EgorBo commented May 28, 2026

Copy link
Copy Markdown
MemberAuthor

@jkotas it looks like we already bumped the major version of R2R in .NET 11 (~ P1 in #122704) so it should be fine to bump again?

@EgorBo
EgorBo marked this pull request as ready for review May 28, 2026 17:13
CopilotAI review requested due to automatic review settings May 28, 2026 17:13
@jkotas

jkotas commented May 28, 2026

Copy link
Copy Markdown
Member

it should be fine to bump again?

Yes (BTW: We have been doing a lot async v2 breaking changes without bumps.)

CopilotAI 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 44 out of 44 changed files in this pull request and generated 2 comments.

Comment threadsrc/coreclr/inc/readytorun.h
Comment threadsrc/coreclr/runtime/loongarch64/WriteBarriers.S Outdated
Comment threadsrc/coreclr/runtime/loongarch64/WriteBarriers.S Outdated
Comment threadsrc/coreclr/runtime/riscv64/WriteBarriers.S Outdated
Comment threadsrc/coreclr/vm/arm64/patchedcode.asm Outdated
Comment threadsrc/coreclr/inc/jiteeversionguid.h Outdated
@github-actions

This comment has been minimized.

@EgorBo

Copy link
Copy Markdown
MemberAuthor

@MihuBot -arm

@EgorBo

EgorBo commented May 28, 2026

Copy link
Copy Markdown
MemberAuthor

Looks like removing RBM_WRITE_BARRIER_DST from RBM_CALLEE_TRASH_WRITEBARRIER brings some nice diffs for arm64 in this PR (as we assume dst reg value doesn't change).

No impact on x64 where we seem to treat call to write barriers with just normal calling convention so all volatiles regs are trashed (I am not sure why, probably can be improved).

NOGC_WRITE_BARRIERS is 0 for amd64, arm32, wasm. And is 1 for arm64, LA64 and RISC-V

@EgorBo

EgorBo commented May 28, 2026

Copy link
Copy Markdown
MemberAuthor

Yeah, looks like there are perf opportunities for x64 around write-barriers. I am not sure about GPR as write-barriers clobber rax, rcx, rdx, r8–r11 so not much left to save (pre-APX), but what is interesting is that we should be able to say that all XMM/YMM/ZMM regs are never touched by it (today LSRA doesn't take that into account)

Filed #128720

Comment threadsrc/coreclr/vm/arm64/patchedcodeconstants.h Outdated
Comment threadsrc/coreclr/vm/arm64/patchedcodeconstants.h
Comment threadsrc/coreclr/vm/threads.cpp

@jkotasjkotas left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks!

Co-authored-by: Jan Kotas <jkotas@microsoft.com>
CopilotAI review requested due to automatic review settings May 28, 2026 21:15
@github-actions

This comment was marked as resolved.

CopilotAI 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 47 out of 47 changed files in this pull request and generated 1 comment.

Comment threadsrc/coreclr/inc/readytorun.h
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@EgorBo@jkotas@am11
, '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

Remove CORINFO_HELP_ASSIGN_BYREF and related dead code - #128687

Merged
EgorBo merged 9 commits into
mainfrom
dev/egorbo/remove-byref-wb
May 29, 2026
Merged

Remove CORINFO_HELP_ASSIGN_BYREF and related dead code#128687
EgorBo merged 9 commits into
mainfrom
dev/egorbo/remove-byref-wb

Conversation

@EgorBo

@EgorBoEgorBo commented May 28, 2026

Copy link
Copy Markdown
Member

Follow up #128542

The JIT no longer emits CORINFO_HELP_ASSIGN_BYREF anywhere. This change
removes the helper and all related dead code:
- Drops CORINFO_HELP_ASSIGN_BYREF from the JIT-EE enum and its
per-architecture VM asm implementations (JIT_ByRefWriteBarrier on
amd64/arm/arm64/i386/loongarch64/riscv64, plus wasm fakes).
- Drops the matching NativeAOT helpers (RhpByRefAssignRef and
RhpByRefAssignRefArm64) and their AVLocation tracking.
- Bumps R2R MAJOR_VERSION 18 -> 19 (MINIMUM_READYTORUN_MAJOR_VERSION
also bumped to 19) since old R2R images may reference the removed
READYTORUN_HELPER_ByRefWriteBarrier. The enum value 0x32 is
tombstoned with a 'Unused since 19.0' comment, matching the
precedent set by previously removed helpers.
- Regenerates jiteeversionguid.h.
- Cleans up the ARM stubs.cpp write-barrier patching machinery
(MaxWriteBarrierIndex 3 -> 2).
- Updates contract comments and regression-test docs to no longer
reference the removed helper name.
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke
See info in area-owners.md if you want to be subscribed.

CopilotAI 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 PR removes the CORINFO_HELP_ASSIGN_BYREF / JIT_ByRefWriteBarrier helper and associated runtime/JIT/AOT plumbing, updates ReadyToRun (R2R) helper mappings accordingly, and bumps the JIT/EE version GUID to keep the interface in sync.

Changes:

  • Remove CORINFO_HELP_ASSIGN_BYREF from the JIT-EE helper enums and delete JIT_ByRefWriteBarrier / RhpByRefAssignRef implementations across architectures.
  • Update R2R helper mapping/tooling to stop emitting or resolving the ByRef write barrier helper, and bump R2R major version constants.
  • Update tests/comments and exception helper marking logic to reflect the removed helper.

Reviewed changes

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

Show a summary per file
FileDescription
src/tests/JIT/Regression/JitBlue/Runtime_125169/Runtime_125169.csUpdates regression test comment to avoid helper-specific naming.
src/tests/JIT/Regression/JitBlue/GitHub_19444/GitHub_19444.csUpdates test header comment wording for the write barrier helper context.
src/tests/JIT/Regression/JitBlue/GitHub_19361/GitHub_19361.csUpdates test header comment to remove the specific helper name.
src/coreclr/vm/wasm/helpers.cppRemoves wasm stubs/markers related to JIT_ByRefWriteBarrier.
src/coreclr/vm/threads.cppStops registering CORINFO_HELP_ASSIGN_BYREF helper entrypoints.
src/coreclr/vm/riscv64/asmhelpers.SRemoves JIT_ByRefWriteBarrier implementation and updates comments.
src/coreclr/vm/loongarch64/asmhelpers.SRemoves JIT_ByRefWriteBarrier implementation and updates comments.
src/coreclr/vm/jitinterface.hRemoves RhpByRefAssignRef declarations/mappings.
src/coreclr/vm/i386/jithelp.SRemoves x86 JIT_ByRefWriteBarrier helper implementation.
src/coreclr/vm/i386/jithelp.asmRemoves x86 JIT_ByRefWriteBarrier helper implementation (MASM).
src/coreclr/vm/excep.cppRemoves ByRef write barrier range checks / AV-location tracking.
src/coreclr/vm/arm64/patchedcode.SRemoves ARM64 JIT_ByRefWriteBarrier and updates barrier comments.
src/coreclr/vm/arm64/patchedcode.asmRemoves ARM64 JIT_ByRefWriteBarrier and updates barrier comments (ASM).
src/coreclr/vm/arm/stubs.cppRemoves ByRef write barrier entry from ARM write-barrier patch/copy mapping.
src/coreclr/vm/arm/patchedcode.SRemoves ARM JIT_ByRefWriteBarrier placeholder from patched-code block.
src/coreclr/vm/arm/asmhelpers.SRemoves ARM ByRef write barrier macro + descriptor entries.
src/coreclr/vm/amd64/jithelpers_fast.SRemoves AMD64 JIT_ByRefWriteBarrier helper implementation (Unix asm).
src/coreclr/vm/amd64/JitHelpers_Fast.asmRemoves AMD64 JIT_ByRefWriteBarrier helper implementation (MASM).
src/coreclr/tools/Common/JitInterface/CorInfoHelpFunc.csRemoves CORINFO_HELP_ASSIGN_BYREF from managed helper enum used by tooling.
src/coreclr/tools/Common/Internal/Runtime/ReadyToRunConstants.csDocuments ByRef write barrier helper ID as unsupported post-v19.
src/coreclr/tools/Common/Internal/Runtime/ModuleHeaders.csBumps managed R2R header major/minor constants to 19.0.
src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.csRemoves mapping from CORINFO_HELP_ASSIGN_BYREF to R2R ByRef helper.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.csRemoves mapping from CORINFO_HELP_ASSIGN_BYREF to R2R ByRef helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/JitHelper.csRemoves ReadyToRunHelper.ByRefWriteBarrier entrypoint resolution logic.
src/coreclr/runtime/riscv64/WriteBarriers.SRemoves RhpByRefAssignRef implementation on RISC-V.
src/coreclr/runtime/portable/WriteBarriers.cppRemoves portable RhpByRefAssignRef stub.
src/coreclr/runtime/loongarch64/WriteBarriers.SRemoves RhpByRefAssignRef implementation and updates comments.
src/coreclr/runtime/i386/WriteBarriers.SRemoves x86 RhpByRefAssignRef implementation.
src/coreclr/runtime/i386/WriteBarriers.asmRemoves x86 RhpByRefAssignRef implementation (ASM).
src/coreclr/runtime/arm64/WriteBarriers.SRemoves ARM64 RhpByRefAssignRefArm64 implementation.
src/coreclr/runtime/arm64/WriteBarriers.asmRemoves ARM64 RhpByRefAssignRefArm64 implementation (ASM).
src/coreclr/runtime/arm/WriteBarriers.SRemoves ARM RhpByRefAssignRef implementation.
src/coreclr/runtime/amd64/WriteBarriers.SRemoves AMD64 RhpByRefAssignRef implementation (Unix asm).
src/coreclr/runtime/amd64/WriteBarriers.asmRemoves AMD64 RhpByRefAssignRef implementation (ASM).
src/coreclr/nativeaot/Runtime/inc/ModuleHeaders.hBumps NativeAOT R2R header major/minor constants to 19.0.
src/coreclr/nativeaot/Runtime/EHHelpers.cppRemoves ByRef write barrier AV-location tracking in NativeAOT EH helper logic.
src/coreclr/jit/codegenwasm.cppRemoves comment references to the ByRef helper signature variant.
src/coreclr/inc/readytorunhelpers.hRemoves mapping entry for READYTORUN_HELPER_ByRefWriteBarrier.
src/coreclr/inc/readytorun.hBumps R2R major/minimum major to 19 and annotates ByRef helper as unsupported.
src/coreclr/inc/jithelpers.hRemoves CORINFO_HELP_ASSIGN_BYREF helper registration.
src/coreclr/inc/jiteeversionguid.hUpdates the JIT/EE interface GUID due to helper enum/interface change.
src/coreclr/inc/corinfo.hRemoves CORINFO_HELP_ASSIGN_BYREF from the native helper enum.
docs/design/coreclr/botr/readytorun-format.mdUpdates R2R helper enum docs to mark ByRef write barrier as unused post-v19.

Comment threadsrc/coreclr/inc/readytorun.h
EgorBoand others added 2 commits May 28, 2026 14:46
Removing JIT_ByRefWriteBarrier from patchedcode.S/patchedcode.asm
shifted JIT_WriteBarrier 12 bytes earlier (2 instructions + a
LEAF_END_MARKED nop). The .balign 64 directive before
JIT_WriteBarrier_Table now produces 12 more bytes of padding, so
JIT_WriteBarrier_Table_Offset increases by 0xC.
This was caught by the CALC_TABLE_LOCATION assertion in
writebarriermanager.cpp:337 on ARM64.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions

This comment has been minimized.

@EgorBo

EgorBo commented May 28, 2026

Copy link
Copy Markdown
MemberAuthor

@jkotas it looks like we already bumped the major version of R2R in .NET 11 (~ P1 in #122704) so it should be fine to bump again?

@EgorBo
EgorBo marked this pull request as ready for review May 28, 2026 17:13
CopilotAI review requested due to automatic review settings May 28, 2026 17:13
@jkotas

jkotas commented May 28, 2026

Copy link
Copy Markdown
Member

it should be fine to bump again?

Yes (BTW: We have been doing a lot async v2 breaking changes without bumps.)

CopilotAI 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 44 out of 44 changed files in this pull request and generated 2 comments.

Comment threadsrc/coreclr/inc/readytorun.h
Comment threadsrc/coreclr/runtime/loongarch64/WriteBarriers.S Outdated
Comment threadsrc/coreclr/runtime/loongarch64/WriteBarriers.S Outdated
Comment threadsrc/coreclr/runtime/riscv64/WriteBarriers.S Outdated
Comment threadsrc/coreclr/vm/arm64/patchedcode.asm Outdated
Comment threadsrc/coreclr/inc/jiteeversionguid.h Outdated
@github-actions

This comment has been minimized.

@EgorBo

Copy link
Copy Markdown
MemberAuthor

@MihuBot -arm

@EgorBo

EgorBo commented May 28, 2026

Copy link
Copy Markdown
MemberAuthor

Looks like removing RBM_WRITE_BARRIER_DST from RBM_CALLEE_TRASH_WRITEBARRIER brings some nice diffs for arm64 in this PR (as we assume dst reg value doesn't change).

No impact on x64 where we seem to treat call to write barriers with just normal calling convention so all volatiles regs are trashed (I am not sure why, probably can be improved).

NOGC_WRITE_BARRIERS is 0 for amd64, arm32, wasm. And is 1 for arm64, LA64 and RISC-V

@EgorBo

EgorBo commented May 28, 2026

Copy link
Copy Markdown
MemberAuthor

Yeah, looks like there are perf opportunities for x64 around write-barriers. I am not sure about GPR as write-barriers clobber rax, rcx, rdx, r8–r11 so not much left to save (pre-APX), but what is interesting is that we should be able to say that all XMM/YMM/ZMM regs are never touched by it (today LSRA doesn't take that into account)

Filed #128720

Comment threadsrc/coreclr/vm/arm64/patchedcodeconstants.h Outdated
Comment threadsrc/coreclr/vm/arm64/patchedcodeconstants.h
Comment threadsrc/coreclr/vm/threads.cpp

@jkotasjkotas left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks!

Co-authored-by: Jan Kotas <jkotas@microsoft.com>
CopilotAI review requested due to automatic review settings May 28, 2026 21:15
@github-actions

This comment was marked as resolved.

CopilotAI 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 47 out of 47 changed files in this pull request and generated 1 comment.

Comment threadsrc/coreclr/inc/readytorun.h
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@EgorBo@jkotas@am11
, '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

Remove CORINFO_HELP_ASSIGN_BYREF and related dead code - #128687

Merged
EgorBo merged 9 commits into
mainfrom
dev/egorbo/remove-byref-wb
May 29, 2026
Merged

Remove CORINFO_HELP_ASSIGN_BYREF and related dead code#128687
EgorBo merged 9 commits into
mainfrom
dev/egorbo/remove-byref-wb

Conversation

@EgorBo

@EgorBoEgorBo commented May 28, 2026

Copy link
Copy Markdown
Member

Follow up #128542

The JIT no longer emits CORINFO_HELP_ASSIGN_BYREF anywhere. This change
removes the helper and all related dead code:
- Drops CORINFO_HELP_ASSIGN_BYREF from the JIT-EE enum and its
per-architecture VM asm implementations (JIT_ByRefWriteBarrier on
amd64/arm/arm64/i386/loongarch64/riscv64, plus wasm fakes).
- Drops the matching NativeAOT helpers (RhpByRefAssignRef and
RhpByRefAssignRefArm64) and their AVLocation tracking.
- Bumps R2R MAJOR_VERSION 18 -> 19 (MINIMUM_READYTORUN_MAJOR_VERSION
also bumped to 19) since old R2R images may reference the removed
READYTORUN_HELPER_ByRefWriteBarrier. The enum value 0x32 is
tombstoned with a 'Unused since 19.0' comment, matching the
precedent set by previously removed helpers.
- Regenerates jiteeversionguid.h.
- Cleans up the ARM stubs.cpp write-barrier patching machinery
(MaxWriteBarrierIndex 3 -> 2).
- Updates contract comments and regression-test docs to no longer
reference the removed helper name.
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke
See info in area-owners.md if you want to be subscribed.

CopilotAI 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 PR removes the CORINFO_HELP_ASSIGN_BYREF / JIT_ByRefWriteBarrier helper and associated runtime/JIT/AOT plumbing, updates ReadyToRun (R2R) helper mappings accordingly, and bumps the JIT/EE version GUID to keep the interface in sync.

Changes:

  • Remove CORINFO_HELP_ASSIGN_BYREF from the JIT-EE helper enums and delete JIT_ByRefWriteBarrier / RhpByRefAssignRef implementations across architectures.
  • Update R2R helper mapping/tooling to stop emitting or resolving the ByRef write barrier helper, and bump R2R major version constants.
  • Update tests/comments and exception helper marking logic to reflect the removed helper.

Reviewed changes

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

Show a summary per file
FileDescription
src/tests/JIT/Regression/JitBlue/Runtime_125169/Runtime_125169.csUpdates regression test comment to avoid helper-specific naming.
src/tests/JIT/Regression/JitBlue/GitHub_19444/GitHub_19444.csUpdates test header comment wording for the write barrier helper context.
src/tests/JIT/Regression/JitBlue/GitHub_19361/GitHub_19361.csUpdates test header comment to remove the specific helper name.
src/coreclr/vm/wasm/helpers.cppRemoves wasm stubs/markers related to JIT_ByRefWriteBarrier.
src/coreclr/vm/threads.cppStops registering CORINFO_HELP_ASSIGN_BYREF helper entrypoints.
src/coreclr/vm/riscv64/asmhelpers.SRemoves JIT_ByRefWriteBarrier implementation and updates comments.
src/coreclr/vm/loongarch64/asmhelpers.SRemoves JIT_ByRefWriteBarrier implementation and updates comments.
src/coreclr/vm/jitinterface.hRemoves RhpByRefAssignRef declarations/mappings.
src/coreclr/vm/i386/jithelp.SRemoves x86 JIT_ByRefWriteBarrier helper implementation.
src/coreclr/vm/i386/jithelp.asmRemoves x86 JIT_ByRefWriteBarrier helper implementation (MASM).
src/coreclr/vm/excep.cppRemoves ByRef write barrier range checks / AV-location tracking.
src/coreclr/vm/arm64/patchedcode.SRemoves ARM64 JIT_ByRefWriteBarrier and updates barrier comments.
src/coreclr/vm/arm64/patchedcode.asmRemoves ARM64 JIT_ByRefWriteBarrier and updates barrier comments (ASM).
src/coreclr/vm/arm/stubs.cppRemoves ByRef write barrier entry from ARM write-barrier patch/copy mapping.
src/coreclr/vm/arm/patchedcode.SRemoves ARM JIT_ByRefWriteBarrier placeholder from patched-code block.
src/coreclr/vm/arm/asmhelpers.SRemoves ARM ByRef write barrier macro + descriptor entries.
src/coreclr/vm/amd64/jithelpers_fast.SRemoves AMD64 JIT_ByRefWriteBarrier helper implementation (Unix asm).
src/coreclr/vm/amd64/JitHelpers_Fast.asmRemoves AMD64 JIT_ByRefWriteBarrier helper implementation (MASM).
src/coreclr/tools/Common/JitInterface/CorInfoHelpFunc.csRemoves CORINFO_HELP_ASSIGN_BYREF from managed helper enum used by tooling.
src/coreclr/tools/Common/Internal/Runtime/ReadyToRunConstants.csDocuments ByRef write barrier helper ID as unsupported post-v19.
src/coreclr/tools/Common/Internal/Runtime/ModuleHeaders.csBumps managed R2R header major/minor constants to 19.0.
src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.csRemoves mapping from CORINFO_HELP_ASSIGN_BYREF to R2R ByRef helper.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.csRemoves mapping from CORINFO_HELP_ASSIGN_BYREF to R2R ByRef helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/JitHelper.csRemoves ReadyToRunHelper.ByRefWriteBarrier entrypoint resolution logic.
src/coreclr/runtime/riscv64/WriteBarriers.SRemoves RhpByRefAssignRef implementation on RISC-V.
src/coreclr/runtime/portable/WriteBarriers.cppRemoves portable RhpByRefAssignRef stub.
src/coreclr/runtime/loongarch64/WriteBarriers.SRemoves RhpByRefAssignRef implementation and updates comments.
src/coreclr/runtime/i386/WriteBarriers.SRemoves x86 RhpByRefAssignRef implementation.
src/coreclr/runtime/i386/WriteBarriers.asmRemoves x86 RhpByRefAssignRef implementation (ASM).
src/coreclr/runtime/arm64/WriteBarriers.SRemoves ARM64 RhpByRefAssignRefArm64 implementation.
src/coreclr/runtime/arm64/WriteBarriers.asmRemoves ARM64 RhpByRefAssignRefArm64 implementation (ASM).
src/coreclr/runtime/arm/WriteBarriers.SRemoves ARM RhpByRefAssignRef implementation.
src/coreclr/runtime/amd64/WriteBarriers.SRemoves AMD64 RhpByRefAssignRef implementation (Unix asm).
src/coreclr/runtime/amd64/WriteBarriers.asmRemoves AMD64 RhpByRefAssignRef implementation (ASM).
src/coreclr/nativeaot/Runtime/inc/ModuleHeaders.hBumps NativeAOT R2R header major/minor constants to 19.0.
src/coreclr/nativeaot/Runtime/EHHelpers.cppRemoves ByRef write barrier AV-location tracking in NativeAOT EH helper logic.
src/coreclr/jit/codegenwasm.cppRemoves comment references to the ByRef helper signature variant.
src/coreclr/inc/readytorunhelpers.hRemoves mapping entry for READYTORUN_HELPER_ByRefWriteBarrier.
src/coreclr/inc/readytorun.hBumps R2R major/minimum major to 19 and annotates ByRef helper as unsupported.
src/coreclr/inc/jithelpers.hRemoves CORINFO_HELP_ASSIGN_BYREF helper registration.
src/coreclr/inc/jiteeversionguid.hUpdates the JIT/EE interface GUID due to helper enum/interface change.
src/coreclr/inc/corinfo.hRemoves CORINFO_HELP_ASSIGN_BYREF from the native helper enum.
docs/design/coreclr/botr/readytorun-format.mdUpdates R2R helper enum docs to mark ByRef write barrier as unused post-v19.

Comment threadsrc/coreclr/inc/readytorun.h
EgorBoand others added 2 commits May 28, 2026 14:46
Removing JIT_ByRefWriteBarrier from patchedcode.S/patchedcode.asm
shifted JIT_WriteBarrier 12 bytes earlier (2 instructions + a
LEAF_END_MARKED nop). The .balign 64 directive before
JIT_WriteBarrier_Table now produces 12 more bytes of padding, so
JIT_WriteBarrier_Table_Offset increases by 0xC.
This was caught by the CALC_TABLE_LOCATION assertion in
writebarriermanager.cpp:337 on ARM64.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions

This comment has been minimized.

@EgorBo

EgorBo commented May 28, 2026

Copy link
Copy Markdown
MemberAuthor

@jkotas it looks like we already bumped the major version of R2R in .NET 11 (~ P1 in #122704) so it should be fine to bump again?

@EgorBo
EgorBo marked this pull request as ready for review May 28, 2026 17:13
CopilotAI review requested due to automatic review settings May 28, 2026 17:13
@jkotas

jkotas commented May 28, 2026

Copy link
Copy Markdown
Member

it should be fine to bump again?

Yes (BTW: We have been doing a lot async v2 breaking changes without bumps.)

CopilotAI 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 44 out of 44 changed files in this pull request and generated 2 comments.

Comment threadsrc/coreclr/inc/readytorun.h
Comment threadsrc/coreclr/runtime/loongarch64/WriteBarriers.S Outdated
Comment threadsrc/coreclr/runtime/loongarch64/WriteBarriers.S Outdated
Comment threadsrc/coreclr/runtime/riscv64/WriteBarriers.S Outdated
Comment threadsrc/coreclr/vm/arm64/patchedcode.asm Outdated
Comment threadsrc/coreclr/inc/jiteeversionguid.h Outdated
@github-actions

This comment has been minimized.

@EgorBo

Copy link
Copy Markdown
MemberAuthor

@MihuBot -arm

@EgorBo

EgorBo commented May 28, 2026

Copy link
Copy Markdown
MemberAuthor

Looks like removing RBM_WRITE_BARRIER_DST from RBM_CALLEE_TRASH_WRITEBARRIER brings some nice diffs for arm64 in this PR (as we assume dst reg value doesn't change).

No impact on x64 where we seem to treat call to write barriers with just normal calling convention so all volatiles regs are trashed (I am not sure why, probably can be improved).

NOGC_WRITE_BARRIERS is 0 for amd64, arm32, wasm. And is 1 for arm64, LA64 and RISC-V

@EgorBo

EgorBo commented May 28, 2026

Copy link
Copy Markdown
MemberAuthor

Yeah, looks like there are perf opportunities for x64 around write-barriers. I am not sure about GPR as write-barriers clobber rax, rcx, rdx, r8–r11 so not much left to save (pre-APX), but what is interesting is that we should be able to say that all XMM/YMM/ZMM regs are never touched by it (today LSRA doesn't take that into account)

Filed #128720

Comment threadsrc/coreclr/vm/arm64/patchedcodeconstants.h Outdated
Comment threadsrc/coreclr/vm/arm64/patchedcodeconstants.h
Comment threadsrc/coreclr/vm/threads.cpp

@jkotasjkotas left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks!

Co-authored-by: Jan Kotas <jkotas@microsoft.com>
CopilotAI review requested due to automatic review settings May 28, 2026 21:15
@github-actions

This comment was marked as resolved.

CopilotAI 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 47 out of 47 changed files in this pull request and generated 1 comment.

Comment threadsrc/coreclr/inc/readytorun.h
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@EgorBo@jkotas@am11
, '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

Remove CORINFO_HELP_ASSIGN_BYREF and related dead code - #128687

Merged
EgorBo merged 9 commits into
mainfrom
dev/egorbo/remove-byref-wb
May 29, 2026
Merged

Remove CORINFO_HELP_ASSIGN_BYREF and related dead code#128687
EgorBo merged 9 commits into
mainfrom
dev/egorbo/remove-byref-wb

Conversation

@EgorBo

@EgorBoEgorBo commented May 28, 2026

Copy link
Copy Markdown
Member

Follow up #128542

The JIT no longer emits CORINFO_HELP_ASSIGN_BYREF anywhere. This change
removes the helper and all related dead code:
- Drops CORINFO_HELP_ASSIGN_BYREF from the JIT-EE enum and its
per-architecture VM asm implementations (JIT_ByRefWriteBarrier on
amd64/arm/arm64/i386/loongarch64/riscv64, plus wasm fakes).
- Drops the matching NativeAOT helpers (RhpByRefAssignRef and
RhpByRefAssignRefArm64) and their AVLocation tracking.
- Bumps R2R MAJOR_VERSION 18 -> 19 (MINIMUM_READYTORUN_MAJOR_VERSION
also bumped to 19) since old R2R images may reference the removed
READYTORUN_HELPER_ByRefWriteBarrier. The enum value 0x32 is
tombstoned with a 'Unused since 19.0' comment, matching the
precedent set by previously removed helpers.
- Regenerates jiteeversionguid.h.
- Cleans up the ARM stubs.cpp write-barrier patching machinery
(MaxWriteBarrierIndex 3 -> 2).
- Updates contract comments and regression-test docs to no longer
reference the removed helper name.
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke
See info in area-owners.md if you want to be subscribed.

CopilotAI 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 PR removes the CORINFO_HELP_ASSIGN_BYREF / JIT_ByRefWriteBarrier helper and associated runtime/JIT/AOT plumbing, updates ReadyToRun (R2R) helper mappings accordingly, and bumps the JIT/EE version GUID to keep the interface in sync.

Changes:

  • Remove CORINFO_HELP_ASSIGN_BYREF from the JIT-EE helper enums and delete JIT_ByRefWriteBarrier / RhpByRefAssignRef implementations across architectures.
  • Update R2R helper mapping/tooling to stop emitting or resolving the ByRef write barrier helper, and bump R2R major version constants.
  • Update tests/comments and exception helper marking logic to reflect the removed helper.

Reviewed changes

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

Show a summary per file
FileDescription
src/tests/JIT/Regression/JitBlue/Runtime_125169/Runtime_125169.csUpdates regression test comment to avoid helper-specific naming.
src/tests/JIT/Regression/JitBlue/GitHub_19444/GitHub_19444.csUpdates test header comment wording for the write barrier helper context.
src/tests/JIT/Regression/JitBlue/GitHub_19361/GitHub_19361.csUpdates test header comment to remove the specific helper name.
src/coreclr/vm/wasm/helpers.cppRemoves wasm stubs/markers related to JIT_ByRefWriteBarrier.
src/coreclr/vm/threads.cppStops registering CORINFO_HELP_ASSIGN_BYREF helper entrypoints.
src/coreclr/vm/riscv64/asmhelpers.SRemoves JIT_ByRefWriteBarrier implementation and updates comments.
src/coreclr/vm/loongarch64/asmhelpers.SRemoves JIT_ByRefWriteBarrier implementation and updates comments.
src/coreclr/vm/jitinterface.hRemoves RhpByRefAssignRef declarations/mappings.
src/coreclr/vm/i386/jithelp.SRemoves x86 JIT_ByRefWriteBarrier helper implementation.
src/coreclr/vm/i386/jithelp.asmRemoves x86 JIT_ByRefWriteBarrier helper implementation (MASM).
src/coreclr/vm/excep.cppRemoves ByRef write barrier range checks / AV-location tracking.
src/coreclr/vm/arm64/patchedcode.SRemoves ARM64 JIT_ByRefWriteBarrier and updates barrier comments.
src/coreclr/vm/arm64/patchedcode.asmRemoves ARM64 JIT_ByRefWriteBarrier and updates barrier comments (ASM).
src/coreclr/vm/arm/stubs.cppRemoves ByRef write barrier entry from ARM write-barrier patch/copy mapping.
src/coreclr/vm/arm/patchedcode.SRemoves ARM JIT_ByRefWriteBarrier placeholder from patched-code block.
src/coreclr/vm/arm/asmhelpers.SRemoves ARM ByRef write barrier macro + descriptor entries.
src/coreclr/vm/amd64/jithelpers_fast.SRemoves AMD64 JIT_ByRefWriteBarrier helper implementation (Unix asm).
src/coreclr/vm/amd64/JitHelpers_Fast.asmRemoves AMD64 JIT_ByRefWriteBarrier helper implementation (MASM).
src/coreclr/tools/Common/JitInterface/CorInfoHelpFunc.csRemoves CORINFO_HELP_ASSIGN_BYREF from managed helper enum used by tooling.
src/coreclr/tools/Common/Internal/Runtime/ReadyToRunConstants.csDocuments ByRef write barrier helper ID as unsupported post-v19.
src/coreclr/tools/Common/Internal/Runtime/ModuleHeaders.csBumps managed R2R header major/minor constants to 19.0.
src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.csRemoves mapping from CORINFO_HELP_ASSIGN_BYREF to R2R ByRef helper.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.csRemoves mapping from CORINFO_HELP_ASSIGN_BYREF to R2R ByRef helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/JitHelper.csRemoves ReadyToRunHelper.ByRefWriteBarrier entrypoint resolution logic.
src/coreclr/runtime/riscv64/WriteBarriers.SRemoves RhpByRefAssignRef implementation on RISC-V.
src/coreclr/runtime/portable/WriteBarriers.cppRemoves portable RhpByRefAssignRef stub.
src/coreclr/runtime/loongarch64/WriteBarriers.SRemoves RhpByRefAssignRef implementation and updates comments.
src/coreclr/runtime/i386/WriteBarriers.SRemoves x86 RhpByRefAssignRef implementation.
src/coreclr/runtime/i386/WriteBarriers.asmRemoves x86 RhpByRefAssignRef implementation (ASM).
src/coreclr/runtime/arm64/WriteBarriers.SRemoves ARM64 RhpByRefAssignRefArm64 implementation.
src/coreclr/runtime/arm64/WriteBarriers.asmRemoves ARM64 RhpByRefAssignRefArm64 implementation (ASM).
src/coreclr/runtime/arm/WriteBarriers.SRemoves ARM RhpByRefAssignRef implementation.
src/coreclr/runtime/amd64/WriteBarriers.SRemoves AMD64 RhpByRefAssignRef implementation (Unix asm).
src/coreclr/runtime/amd64/WriteBarriers.asmRemoves AMD64 RhpByRefAssignRef implementation (ASM).
src/coreclr/nativeaot/Runtime/inc/ModuleHeaders.hBumps NativeAOT R2R header major/minor constants to 19.0.
src/coreclr/nativeaot/Runtime/EHHelpers.cppRemoves ByRef write barrier AV-location tracking in NativeAOT EH helper logic.
src/coreclr/jit/codegenwasm.cppRemoves comment references to the ByRef helper signature variant.
src/coreclr/inc/readytorunhelpers.hRemoves mapping entry for READYTORUN_HELPER_ByRefWriteBarrier.
src/coreclr/inc/readytorun.hBumps R2R major/minimum major to 19 and annotates ByRef helper as unsupported.
src/coreclr/inc/jithelpers.hRemoves CORINFO_HELP_ASSIGN_BYREF helper registration.
src/coreclr/inc/jiteeversionguid.hUpdates the JIT/EE interface GUID due to helper enum/interface change.
src/coreclr/inc/corinfo.hRemoves CORINFO_HELP_ASSIGN_BYREF from the native helper enum.
docs/design/coreclr/botr/readytorun-format.mdUpdates R2R helper enum docs to mark ByRef write barrier as unused post-v19.

Comment threadsrc/coreclr/inc/readytorun.h
EgorBoand others added 2 commits May 28, 2026 14:46
Removing JIT_ByRefWriteBarrier from patchedcode.S/patchedcode.asm
shifted JIT_WriteBarrier 12 bytes earlier (2 instructions + a
LEAF_END_MARKED nop). The .balign 64 directive before
JIT_WriteBarrier_Table now produces 12 more bytes of padding, so
JIT_WriteBarrier_Table_Offset increases by 0xC.
This was caught by the CALC_TABLE_LOCATION assertion in
writebarriermanager.cpp:337 on ARM64.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions

This comment has been minimized.

@EgorBo

EgorBo commented May 28, 2026

Copy link
Copy Markdown
MemberAuthor

@jkotas it looks like we already bumped the major version of R2R in .NET 11 (~ P1 in #122704) so it should be fine to bump again?

@EgorBo
EgorBo marked this pull request as ready for review May 28, 2026 17:13
CopilotAI review requested due to automatic review settings May 28, 2026 17:13
@jkotas

jkotas commented May 28, 2026

Copy link
Copy Markdown
Member

it should be fine to bump again?

Yes (BTW: We have been doing a lot async v2 breaking changes without bumps.)

CopilotAI 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 44 out of 44 changed files in this pull request and generated 2 comments.

Comment threadsrc/coreclr/inc/readytorun.h
Comment threadsrc/coreclr/runtime/loongarch64/WriteBarriers.S Outdated
Comment threadsrc/coreclr/runtime/loongarch64/WriteBarriers.S Outdated
Comment threadsrc/coreclr/runtime/riscv64/WriteBarriers.S Outdated
Comment threadsrc/coreclr/vm/arm64/patchedcode.asm Outdated
Comment threadsrc/coreclr/inc/jiteeversionguid.h Outdated
@github-actions

This comment has been minimized.

@EgorBo

Copy link
Copy Markdown
MemberAuthor

@MihuBot -arm

@EgorBo

EgorBo commented May 28, 2026

Copy link
Copy Markdown
MemberAuthor

Looks like removing RBM_WRITE_BARRIER_DST from RBM_CALLEE_TRASH_WRITEBARRIER brings some nice diffs for arm64 in this PR (as we assume dst reg value doesn't change).

No impact on x64 where we seem to treat call to write barriers with just normal calling convention so all volatiles regs are trashed (I am not sure why, probably can be improved).

NOGC_WRITE_BARRIERS is 0 for amd64, arm32, wasm. And is 1 for arm64, LA64 and RISC-V

@EgorBo

EgorBo commented May 28, 2026

Copy link
Copy Markdown
MemberAuthor

Yeah, looks like there are perf opportunities for x64 around write-barriers. I am not sure about GPR as write-barriers clobber rax, rcx, rdx, r8–r11 so not much left to save (pre-APX), but what is interesting is that we should be able to say that all XMM/YMM/ZMM regs are never touched by it (today LSRA doesn't take that into account)

Filed #128720

Comment threadsrc/coreclr/vm/arm64/patchedcodeconstants.h Outdated
Comment threadsrc/coreclr/vm/arm64/patchedcodeconstants.h
Comment threadsrc/coreclr/vm/threads.cpp

@jkotasjkotas left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks!

Co-authored-by: Jan Kotas <jkotas@microsoft.com>
CopilotAI review requested due to automatic review settings May 28, 2026 21:15
@github-actions

This comment was marked as resolved.

CopilotAI 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 47 out of 47 changed files in this pull request and generated 1 comment.

Comment threadsrc/coreclr/inc/readytorun.h
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@EgorBo@jkotas@am11