[NativeAOT] Move Interlocked null checks to managed, RhpLockCmpXchg64 to C - #100021

Merged
jkotas merged 10 commits into
dotnet:mainfrom
filipnavara:interlocked-null-check
Mar 22, 2024
Merged

[NativeAOT] Move Interlocked null checks to managed, RhpLockCmpXchg64 to C#100021
jkotas merged 10 commits into
dotnet:mainfrom
filipnavara:interlocked-null-check

Conversation

@filipnavara

@filipnavarafilipnavara commented Mar 20, 2024

Copy link
Copy Markdown
Member
  • Move RhpLockCmpXchg[32/64] implementation to C
  • Move null checks from RhpLockCmpXchg[8/16/32/64]/RhpCheckedLockCmpXchg/RhpCheckedXchg to managed code

Ref: #99688 (comment)
Ref: #96916 (similar thing done for CoreCLR)

…ockCmpXchg64/RhpCheckedLockCmpXchg/RhpCheckedXchg to managed code
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Mar 20, 2024
CmpXchgRetry
;; Check location value is what we expect.
ALTERNATE_ENTRY RhpCheckedLockCmpXchgAVLocation2
ldaxr x10, [x0]

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

The RhpCheckedLockCmpXchgAVLocation2 and RhpCheckedXchgAVLocation2 checks are weird. They seem to be present for the same location that was already null checked and unnecessary.

@filipnavara
filipnavara requested a review from jkotasMarch 20, 2024 15:04
@filipnavara

Copy link
Copy Markdown
MemberAuthor

Kept as draft, needs to be run through CI.

Comment threadsrc/coreclr/nativeaot/Runtime/MiscHelpers.cpp Outdated
bne LOCAL_LABEL(CmpXchg64Retry)
LOCAL_LABEL(CmpXchg64Exit):
mov r0, r6
dmb

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.

The native AOT PAL implementation of InterlockedCompareExchange64 seems to be missing this barrier (PAL_InterlockedOperationBarrier in CoreCLR PAL).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

I added it but I noticed that PAL_InterlockedOperationBarrier is not enabled for arm32. That seems odd.

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.

I added it but I noticed that PAL_InterlockedOperationBarrier is not enabled for arm32. That seems odd.

IIRC the native compilers already emit a barrier of their own there so it'd do two barriers (so I guess it's kinda relying on an implementation detail).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

the native compilers already emit a barrier of their own

At very least ARM gcc and ARM clang does, so that explains why it wasn't a problem for ARM32 on CoreCLR.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

ARM64: clang generates barrier at the end (should still be fine); gcc doesn't generate a barrier


FORCEINLINE void PalInterlockedOperationBarrier()
{
#if (defined(HOST_ARM64) && !defined(LSE_INSTRUCTIONS_ENABLED_BY_DEFAULT)) || defined(HOST_ARM) || defined(HOST_LOONGARCH64) || defined(HOST_RISCV64)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Suggested change
#if (defined(HOST_ARM64) && !defined(LSE_INSTRUCTIONS_ENABLED_BY_DEFAULT)) ||defined(HOST_ARM) || defined(HOST_LOONGARCH64) || defined(HOST_RISCV64)
#if (defined(HOST_ARM64) && !defined(LSE_INSTRUCTIONS_ENABLED_BY_DEFAULT)&& !defined(__clang__)) || defined(HOST_LOONGARCH64) || defined(HOST_RISCV64)

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.

AFAIK C++ code is not supposed to have compiler specific defines in the runtime.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Well, other code in the same file already uses __clang__.

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.

Yes, also _MSC_VER and __llvm__. (I think we can replace all __llvm__ ones to __clang__ for consistency?)

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.

AFAIK C++ code is not supposed to have compiler specific defines in the runtime

I do not see a problem with this ifdef here.

Comment threadsrc/coreclr/nativeaot/Runtime/unix/PalRedhawkInline.h
Comment threadsrc/coreclr/nativeaot/Runtime/unix/PalRedhawkInline.h Outdated
@jkotas

Copy link
Copy Markdown
Member

@filipnavara Could you please resolve the conflict?

@MichalPetryka

Copy link
Copy Markdown
Contributor

I did it myself cause I have push perms to filips fork.

Comment threadsrc/coreclr/nativeaot/Runtime/CMakeLists.txt Outdated
@MichalPetryka

Copy link
Copy Markdown
Contributor
  • Move RhpLockCmpXchg64 implementation to C

Why leave the 32bit one in ASM btw?

@jkotas

Copy link
Copy Markdown
Member

Why leave the 32bit one in ASM btw?

Do you mean the one for Arm? Yes, it would be nice to move it to C as well. Filip have not done it earlier to reduce conflicts with your other PR.

@MichalPetryka

Copy link
Copy Markdown
Contributor

Do you mean the one for Arm?

Only until #97792 is merged.

Filip have not done it earlier to reduce conflicts with your other PR.

I don't think we'd even have any conflicts there since they'd both just remove it.

@filipnavara

Copy link
Copy Markdown
MemberAuthor

Yes, it would be nice to move it to C as well.

Done.

@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!

@jkotas
jkotas merged commit 2820a1e into dotnet:mainMar 22, 2024
@filipnavara
filipnavara deleted the interlocked-null-check branch March 22, 2024 07:27
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 21, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@filipnavara@jkotas@MichalPetryka@am11
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e 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

[NativeAOT] Move Interlocked null checks to managed, RhpLockCmpXchg64 to C - #100021

Merged
jkotas merged 10 commits into
dotnet:mainfrom
filipnavara:interlocked-null-check
Mar 22, 2024
Merged

[NativeAOT] Move Interlocked null checks to managed, RhpLockCmpXchg64 to C#100021
jkotas merged 10 commits into
dotnet:mainfrom
filipnavara:interlocked-null-check

Conversation

@filipnavara

@filipnavarafilipnavara commented Mar 20, 2024

Copy link
Copy Markdown
Member
  • Move RhpLockCmpXchg[32/64] implementation to C
  • Move null checks from RhpLockCmpXchg[8/16/32/64]/RhpCheckedLockCmpXchg/RhpCheckedXchg to managed code

Ref: #99688 (comment)
Ref: #96916 (similar thing done for CoreCLR)

…ockCmpXchg64/RhpCheckedLockCmpXchg/RhpCheckedXchg to managed code
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Mar 20, 2024
CmpXchgRetry
;; Check location value is what we expect.
ALTERNATE_ENTRY RhpCheckedLockCmpXchgAVLocation2
ldaxr x10, [x0]

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

The RhpCheckedLockCmpXchgAVLocation2 and RhpCheckedXchgAVLocation2 checks are weird. They seem to be present for the same location that was already null checked and unnecessary.

@filipnavara
filipnavara requested a review from jkotasMarch 20, 2024 15:04
@filipnavara

Copy link
Copy Markdown
MemberAuthor

Kept as draft, needs to be run through CI.

Comment threadsrc/coreclr/nativeaot/Runtime/MiscHelpers.cpp Outdated
bne LOCAL_LABEL(CmpXchg64Retry)
LOCAL_LABEL(CmpXchg64Exit):
mov r0, r6
dmb

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.

The native AOT PAL implementation of InterlockedCompareExchange64 seems to be missing this barrier (PAL_InterlockedOperationBarrier in CoreCLR PAL).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

I added it but I noticed that PAL_InterlockedOperationBarrier is not enabled for arm32. That seems odd.

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.

I added it but I noticed that PAL_InterlockedOperationBarrier is not enabled for arm32. That seems odd.

IIRC the native compilers already emit a barrier of their own there so it'd do two barriers (so I guess it's kinda relying on an implementation detail).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

the native compilers already emit a barrier of their own

At very least ARM gcc and ARM clang does, so that explains why it wasn't a problem for ARM32 on CoreCLR.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

ARM64: clang generates barrier at the end (should still be fine); gcc doesn't generate a barrier


FORCEINLINE void PalInterlockedOperationBarrier()
{
#if (defined(HOST_ARM64) && !defined(LSE_INSTRUCTIONS_ENABLED_BY_DEFAULT)) || defined(HOST_ARM) || defined(HOST_LOONGARCH64) || defined(HOST_RISCV64)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Suggested change
#if (defined(HOST_ARM64) && !defined(LSE_INSTRUCTIONS_ENABLED_BY_DEFAULT)) ||defined(HOST_ARM) || defined(HOST_LOONGARCH64) || defined(HOST_RISCV64)
#if (defined(HOST_ARM64) && !defined(LSE_INSTRUCTIONS_ENABLED_BY_DEFAULT)&& !defined(__clang__)) || defined(HOST_LOONGARCH64) || defined(HOST_RISCV64)

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.

AFAIK C++ code is not supposed to have compiler specific defines in the runtime.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Well, other code in the same file already uses __clang__.

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.

Yes, also _MSC_VER and __llvm__. (I think we can replace all __llvm__ ones to __clang__ for consistency?)

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.

AFAIK C++ code is not supposed to have compiler specific defines in the runtime

I do not see a problem with this ifdef here.

Comment threadsrc/coreclr/nativeaot/Runtime/unix/PalRedhawkInline.h
Comment threadsrc/coreclr/nativeaot/Runtime/unix/PalRedhawkInline.h Outdated
@jkotas

Copy link
Copy Markdown
Member

@filipnavara Could you please resolve the conflict?

@MichalPetryka

Copy link
Copy Markdown
Contributor

I did it myself cause I have push perms to filips fork.

Comment threadsrc/coreclr/nativeaot/Runtime/CMakeLists.txt Outdated
@MichalPetryka

Copy link
Copy Markdown
Contributor
  • Move RhpLockCmpXchg64 implementation to C

Why leave the 32bit one in ASM btw?

@jkotas

Copy link
Copy Markdown
Member

Why leave the 32bit one in ASM btw?

Do you mean the one for Arm? Yes, it would be nice to move it to C as well. Filip have not done it earlier to reduce conflicts with your other PR.

@MichalPetryka

Copy link
Copy Markdown
Contributor

Do you mean the one for Arm?

Only until #97792 is merged.

Filip have not done it earlier to reduce conflicts with your other PR.

I don't think we'd even have any conflicts there since they'd both just remove it.

@filipnavara

Copy link
Copy Markdown
MemberAuthor

Yes, it would be nice to move it to C as well.

Done.

@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!

@jkotas
jkotas merged commit 2820a1e into dotnet:mainMar 22, 2024
@filipnavara
filipnavara deleted the interlocked-null-check branch March 22, 2024 07:27
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 21, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@filipnavara@jkotas@MichalPetryka@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

[NativeAOT] Move Interlocked null checks to managed, RhpLockCmpXchg64 to C - #100021

Merged
jkotas merged 10 commits into
dotnet:mainfrom
filipnavara:interlocked-null-check
Mar 22, 2024
Merged

[NativeAOT] Move Interlocked null checks to managed, RhpLockCmpXchg64 to C#100021
jkotas merged 10 commits into
dotnet:mainfrom
filipnavara:interlocked-null-check

Conversation

@filipnavara

@filipnavarafilipnavara commented Mar 20, 2024

Copy link
Copy Markdown
Member
  • Move RhpLockCmpXchg[32/64] implementation to C
  • Move null checks from RhpLockCmpXchg[8/16/32/64]/RhpCheckedLockCmpXchg/RhpCheckedXchg to managed code

Ref: #99688 (comment)
Ref: #96916 (similar thing done for CoreCLR)

…ockCmpXchg64/RhpCheckedLockCmpXchg/RhpCheckedXchg to managed code
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Mar 20, 2024
CmpXchgRetry
;; Check location value is what we expect.
ALTERNATE_ENTRY RhpCheckedLockCmpXchgAVLocation2
ldaxr x10, [x0]

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

The RhpCheckedLockCmpXchgAVLocation2 and RhpCheckedXchgAVLocation2 checks are weird. They seem to be present for the same location that was already null checked and unnecessary.

@filipnavara
filipnavara requested a review from jkotasMarch 20, 2024 15:04
@filipnavara

Copy link
Copy Markdown
MemberAuthor

Kept as draft, needs to be run through CI.

Comment threadsrc/coreclr/nativeaot/Runtime/MiscHelpers.cpp Outdated
bne LOCAL_LABEL(CmpXchg64Retry)
LOCAL_LABEL(CmpXchg64Exit):
mov r0, r6
dmb

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.

The native AOT PAL implementation of InterlockedCompareExchange64 seems to be missing this barrier (PAL_InterlockedOperationBarrier in CoreCLR PAL).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

I added it but I noticed that PAL_InterlockedOperationBarrier is not enabled for arm32. That seems odd.

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.

I added it but I noticed that PAL_InterlockedOperationBarrier is not enabled for arm32. That seems odd.

IIRC the native compilers already emit a barrier of their own there so it'd do two barriers (so I guess it's kinda relying on an implementation detail).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

the native compilers already emit a barrier of their own

At very least ARM gcc and ARM clang does, so that explains why it wasn't a problem for ARM32 on CoreCLR.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

ARM64: clang generates barrier at the end (should still be fine); gcc doesn't generate a barrier


FORCEINLINE void PalInterlockedOperationBarrier()
{
#if (defined(HOST_ARM64) && !defined(LSE_INSTRUCTIONS_ENABLED_BY_DEFAULT)) || defined(HOST_ARM) || defined(HOST_LOONGARCH64) || defined(HOST_RISCV64)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Suggested change
#if (defined(HOST_ARM64) && !defined(LSE_INSTRUCTIONS_ENABLED_BY_DEFAULT)) ||defined(HOST_ARM) || defined(HOST_LOONGARCH64) || defined(HOST_RISCV64)
#if (defined(HOST_ARM64) && !defined(LSE_INSTRUCTIONS_ENABLED_BY_DEFAULT)&& !defined(__clang__)) || defined(HOST_LOONGARCH64) || defined(HOST_RISCV64)

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.

AFAIK C++ code is not supposed to have compiler specific defines in the runtime.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Well, other code in the same file already uses __clang__.

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.

Yes, also _MSC_VER and __llvm__. (I think we can replace all __llvm__ ones to __clang__ for consistency?)

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.

AFAIK C++ code is not supposed to have compiler specific defines in the runtime

I do not see a problem with this ifdef here.

Comment threadsrc/coreclr/nativeaot/Runtime/unix/PalRedhawkInline.h
Comment threadsrc/coreclr/nativeaot/Runtime/unix/PalRedhawkInline.h Outdated
@jkotas

Copy link
Copy Markdown
Member

@filipnavara Could you please resolve the conflict?

@MichalPetryka

Copy link
Copy Markdown
Contributor

I did it myself cause I have push perms to filips fork.

Comment threadsrc/coreclr/nativeaot/Runtime/CMakeLists.txt Outdated
@MichalPetryka

Copy link
Copy Markdown
Contributor
  • Move RhpLockCmpXchg64 implementation to C

Why leave the 32bit one in ASM btw?

@jkotas

Copy link
Copy Markdown
Member

Why leave the 32bit one in ASM btw?

Do you mean the one for Arm? Yes, it would be nice to move it to C as well. Filip have not done it earlier to reduce conflicts with your other PR.

@MichalPetryka

Copy link
Copy Markdown
Contributor

Do you mean the one for Arm?

Only until #97792 is merged.

Filip have not done it earlier to reduce conflicts with your other PR.

I don't think we'd even have any conflicts there since they'd both just remove it.

@filipnavara

Copy link
Copy Markdown
MemberAuthor

Yes, it would be nice to move it to C as well.

Done.

@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!

@jkotas
jkotas merged commit 2820a1e into dotnet:mainMar 22, 2024
@filipnavara
filipnavara deleted the interlocked-null-check branch March 22, 2024 07:27
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 21, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@filipnavara@jkotas@MichalPetryka@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 \u003e 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

[NativeAOT] Move Interlocked null checks to managed, RhpLockCmpXchg64 to C - #100021

Merged
jkotas merged 10 commits into
dotnet:mainfrom
filipnavara:interlocked-null-check
Mar 22, 2024
Merged

[NativeAOT] Move Interlocked null checks to managed, RhpLockCmpXchg64 to C#100021
jkotas merged 10 commits into
dotnet:mainfrom
filipnavara:interlocked-null-check

Conversation

@filipnavara

@filipnavarafilipnavara commented Mar 20, 2024

Copy link
Copy Markdown
Member
  • Move RhpLockCmpXchg[32/64] implementation to C
  • Move null checks from RhpLockCmpXchg[8/16/32/64]/RhpCheckedLockCmpXchg/RhpCheckedXchg to managed code

Ref: #99688 (comment)
Ref: #96916 (similar thing done for CoreCLR)

…ockCmpXchg64/RhpCheckedLockCmpXchg/RhpCheckedXchg to managed code
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Mar 20, 2024
CmpXchgRetry
;; Check location value is what we expect.
ALTERNATE_ENTRY RhpCheckedLockCmpXchgAVLocation2
ldaxr x10, [x0]

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

The RhpCheckedLockCmpXchgAVLocation2 and RhpCheckedXchgAVLocation2 checks are weird. They seem to be present for the same location that was already null checked and unnecessary.

@filipnavara
filipnavara requested a review from jkotasMarch 20, 2024 15:04
@filipnavara

Copy link
Copy Markdown
MemberAuthor

Kept as draft, needs to be run through CI.

Comment threadsrc/coreclr/nativeaot/Runtime/MiscHelpers.cpp Outdated
bne LOCAL_LABEL(CmpXchg64Retry)
LOCAL_LABEL(CmpXchg64Exit):
mov r0, r6
dmb

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.

The native AOT PAL implementation of InterlockedCompareExchange64 seems to be missing this barrier (PAL_InterlockedOperationBarrier in CoreCLR PAL).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

I added it but I noticed that PAL_InterlockedOperationBarrier is not enabled for arm32. That seems odd.

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.

I added it but I noticed that PAL_InterlockedOperationBarrier is not enabled for arm32. That seems odd.

IIRC the native compilers already emit a barrier of their own there so it'd do two barriers (so I guess it's kinda relying on an implementation detail).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

the native compilers already emit a barrier of their own

At very least ARM gcc and ARM clang does, so that explains why it wasn't a problem for ARM32 on CoreCLR.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

ARM64: clang generates barrier at the end (should still be fine); gcc doesn't generate a barrier


FORCEINLINE void PalInterlockedOperationBarrier()
{
#if (defined(HOST_ARM64) && !defined(LSE_INSTRUCTIONS_ENABLED_BY_DEFAULT)) || defined(HOST_ARM) || defined(HOST_LOONGARCH64) || defined(HOST_RISCV64)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Suggested change
#if (defined(HOST_ARM64) && !defined(LSE_INSTRUCTIONS_ENABLED_BY_DEFAULT)) ||defined(HOST_ARM) || defined(HOST_LOONGARCH64) || defined(HOST_RISCV64)
#if (defined(HOST_ARM64) && !defined(LSE_INSTRUCTIONS_ENABLED_BY_DEFAULT)&& !defined(__clang__)) || defined(HOST_LOONGARCH64) || defined(HOST_RISCV64)

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.

AFAIK C++ code is not supposed to have compiler specific defines in the runtime.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Well, other code in the same file already uses __clang__.

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.

Yes, also _MSC_VER and __llvm__. (I think we can replace all __llvm__ ones to __clang__ for consistency?)

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.

AFAIK C++ code is not supposed to have compiler specific defines in the runtime

I do not see a problem with this ifdef here.

Comment threadsrc/coreclr/nativeaot/Runtime/unix/PalRedhawkInline.h
Comment threadsrc/coreclr/nativeaot/Runtime/unix/PalRedhawkInline.h Outdated
@jkotas

Copy link
Copy Markdown
Member

@filipnavara Could you please resolve the conflict?

@MichalPetryka

Copy link
Copy Markdown
Contributor

I did it myself cause I have push perms to filips fork.

Comment threadsrc/coreclr/nativeaot/Runtime/CMakeLists.txt Outdated
@MichalPetryka

Copy link
Copy Markdown
Contributor
  • Move RhpLockCmpXchg64 implementation to C

Why leave the 32bit one in ASM btw?

@jkotas

Copy link
Copy Markdown
Member

Why leave the 32bit one in ASM btw?

Do you mean the one for Arm? Yes, it would be nice to move it to C as well. Filip have not done it earlier to reduce conflicts with your other PR.

@MichalPetryka

Copy link
Copy Markdown
Contributor

Do you mean the one for Arm?

Only until #97792 is merged.

Filip have not done it earlier to reduce conflicts with your other PR.

I don't think we'd even have any conflicts there since they'd both just remove it.

@filipnavara

Copy link
Copy Markdown
MemberAuthor

Yes, it would be nice to move it to C as well.

Done.

@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!

@jkotas
jkotas merged commit 2820a1e into dotnet:mainMar 22, 2024
@filipnavara
filipnavara deleted the interlocked-null-check branch March 22, 2024 07:27
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 21, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@filipnavara@jkotas@MichalPetryka@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

[NativeAOT] Move Interlocked null checks to managed, RhpLockCmpXchg64 to C - #100021

Merged
jkotas merged 10 commits into
dotnet:mainfrom
filipnavara:interlocked-null-check
Mar 22, 2024
Merged

[NativeAOT] Move Interlocked null checks to managed, RhpLockCmpXchg64 to C#100021
jkotas merged 10 commits into
dotnet:mainfrom
filipnavara:interlocked-null-check

Conversation

@filipnavara

@filipnavarafilipnavara commented Mar 20, 2024

Copy link
Copy Markdown
Member
  • Move RhpLockCmpXchg[32/64] implementation to C
  • Move null checks from RhpLockCmpXchg[8/16/32/64]/RhpCheckedLockCmpXchg/RhpCheckedXchg to managed code

Ref: #99688 (comment)
Ref: #96916 (similar thing done for CoreCLR)

…ockCmpXchg64/RhpCheckedLockCmpXchg/RhpCheckedXchg to managed code
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Mar 20, 2024
CmpXchgRetry
;; Check location value is what we expect.
ALTERNATE_ENTRY RhpCheckedLockCmpXchgAVLocation2
ldaxr x10, [x0]

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

The RhpCheckedLockCmpXchgAVLocation2 and RhpCheckedXchgAVLocation2 checks are weird. They seem to be present for the same location that was already null checked and unnecessary.

@filipnavara
filipnavara requested a review from jkotasMarch 20, 2024 15:04
@filipnavara

Copy link
Copy Markdown
MemberAuthor

Kept as draft, needs to be run through CI.

Comment threadsrc/coreclr/nativeaot/Runtime/MiscHelpers.cpp Outdated
bne LOCAL_LABEL(CmpXchg64Retry)
LOCAL_LABEL(CmpXchg64Exit):
mov r0, r6
dmb

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.

The native AOT PAL implementation of InterlockedCompareExchange64 seems to be missing this barrier (PAL_InterlockedOperationBarrier in CoreCLR PAL).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

I added it but I noticed that PAL_InterlockedOperationBarrier is not enabled for arm32. That seems odd.

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.

I added it but I noticed that PAL_InterlockedOperationBarrier is not enabled for arm32. That seems odd.

IIRC the native compilers already emit a barrier of their own there so it'd do two barriers (so I guess it's kinda relying on an implementation detail).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

the native compilers already emit a barrier of their own

At very least ARM gcc and ARM clang does, so that explains why it wasn't a problem for ARM32 on CoreCLR.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

ARM64: clang generates barrier at the end (should still be fine); gcc doesn't generate a barrier


FORCEINLINE void PalInterlockedOperationBarrier()
{
#if (defined(HOST_ARM64) && !defined(LSE_INSTRUCTIONS_ENABLED_BY_DEFAULT)) || defined(HOST_ARM) || defined(HOST_LOONGARCH64) || defined(HOST_RISCV64)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Suggested change
#if (defined(HOST_ARM64) && !defined(LSE_INSTRUCTIONS_ENABLED_BY_DEFAULT)) ||defined(HOST_ARM) || defined(HOST_LOONGARCH64) || defined(HOST_RISCV64)
#if (defined(HOST_ARM64) && !defined(LSE_INSTRUCTIONS_ENABLED_BY_DEFAULT)&& !defined(__clang__)) || defined(HOST_LOONGARCH64) || defined(HOST_RISCV64)

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.

AFAIK C++ code is not supposed to have compiler specific defines in the runtime.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Well, other code in the same file already uses __clang__.

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.

Yes, also _MSC_VER and __llvm__. (I think we can replace all __llvm__ ones to __clang__ for consistency?)

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.

AFAIK C++ code is not supposed to have compiler specific defines in the runtime

I do not see a problem with this ifdef here.

Comment threadsrc/coreclr/nativeaot/Runtime/unix/PalRedhawkInline.h
Comment threadsrc/coreclr/nativeaot/Runtime/unix/PalRedhawkInline.h Outdated
@jkotas

Copy link
Copy Markdown
Member

@filipnavara Could you please resolve the conflict?

@MichalPetryka

Copy link
Copy Markdown
Contributor

I did it myself cause I have push perms to filips fork.

Comment threadsrc/coreclr/nativeaot/Runtime/CMakeLists.txt Outdated
@MichalPetryka

Copy link
Copy Markdown
Contributor
  • Move RhpLockCmpXchg64 implementation to C

Why leave the 32bit one in ASM btw?

@jkotas

Copy link
Copy Markdown
Member

Why leave the 32bit one in ASM btw?

Do you mean the one for Arm? Yes, it would be nice to move it to C as well. Filip have not done it earlier to reduce conflicts with your other PR.

@MichalPetryka

Copy link
Copy Markdown
Contributor

Do you mean the one for Arm?

Only until #97792 is merged.

Filip have not done it earlier to reduce conflicts with your other PR.

I don't think we'd even have any conflicts there since they'd both just remove it.

@filipnavara

Copy link
Copy Markdown
MemberAuthor

Yes, it would be nice to move it to C as well.

Done.

@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!

@jkotas
jkotas merged commit 2820a1e into dotnet:mainMar 22, 2024
@filipnavara
filipnavara deleted the interlocked-null-check branch March 22, 2024 07:27
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 21, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@filipnavara@jkotas@MichalPetryka@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

[NativeAOT] Move Interlocked null checks to managed, RhpLockCmpXchg64 to C - #100021

Merged
jkotas merged 10 commits into
dotnet:mainfrom
filipnavara:interlocked-null-check
Mar 22, 2024
Merged

[NativeAOT] Move Interlocked null checks to managed, RhpLockCmpXchg64 to C#100021
jkotas merged 10 commits into
dotnet:mainfrom
filipnavara:interlocked-null-check

Conversation

@filipnavara

@filipnavarafilipnavara commented Mar 20, 2024

Copy link
Copy Markdown
Member
  • Move RhpLockCmpXchg[32/64] implementation to C
  • Move null checks from RhpLockCmpXchg[8/16/32/64]/RhpCheckedLockCmpXchg/RhpCheckedXchg to managed code

Ref: #99688 (comment)
Ref: #96916 (similar thing done for CoreCLR)

…ockCmpXchg64/RhpCheckedLockCmpXchg/RhpCheckedXchg to managed code
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Mar 20, 2024
CmpXchgRetry
;; Check location value is what we expect.
ALTERNATE_ENTRY RhpCheckedLockCmpXchgAVLocation2
ldaxr x10, [x0]

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

The RhpCheckedLockCmpXchgAVLocation2 and RhpCheckedXchgAVLocation2 checks are weird. They seem to be present for the same location that was already null checked and unnecessary.

@filipnavara
filipnavara requested a review from jkotasMarch 20, 2024 15:04
@filipnavara

Copy link
Copy Markdown
MemberAuthor

Kept as draft, needs to be run through CI.

Comment threadsrc/coreclr/nativeaot/Runtime/MiscHelpers.cpp Outdated
bne LOCAL_LABEL(CmpXchg64Retry)
LOCAL_LABEL(CmpXchg64Exit):
mov r0, r6
dmb

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.

The native AOT PAL implementation of InterlockedCompareExchange64 seems to be missing this barrier (PAL_InterlockedOperationBarrier in CoreCLR PAL).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

I added it but I noticed that PAL_InterlockedOperationBarrier is not enabled for arm32. That seems odd.

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.

I added it but I noticed that PAL_InterlockedOperationBarrier is not enabled for arm32. That seems odd.

IIRC the native compilers already emit a barrier of their own there so it'd do two barriers (so I guess it's kinda relying on an implementation detail).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

the native compilers already emit a barrier of their own

At very least ARM gcc and ARM clang does, so that explains why it wasn't a problem for ARM32 on CoreCLR.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

ARM64: clang generates barrier at the end (should still be fine); gcc doesn't generate a barrier


FORCEINLINE void PalInterlockedOperationBarrier()
{
#if (defined(HOST_ARM64) && !defined(LSE_INSTRUCTIONS_ENABLED_BY_DEFAULT)) || defined(HOST_ARM) || defined(HOST_LOONGARCH64) || defined(HOST_RISCV64)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Suggested change
#if (defined(HOST_ARM64) && !defined(LSE_INSTRUCTIONS_ENABLED_BY_DEFAULT)) ||defined(HOST_ARM) || defined(HOST_LOONGARCH64) || defined(HOST_RISCV64)
#if (defined(HOST_ARM64) && !defined(LSE_INSTRUCTIONS_ENABLED_BY_DEFAULT)&& !defined(__clang__)) || defined(HOST_LOONGARCH64) || defined(HOST_RISCV64)

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.

AFAIK C++ code is not supposed to have compiler specific defines in the runtime.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Well, other code in the same file already uses __clang__.

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.

Yes, also _MSC_VER and __llvm__. (I think we can replace all __llvm__ ones to __clang__ for consistency?)

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.

AFAIK C++ code is not supposed to have compiler specific defines in the runtime

I do not see a problem with this ifdef here.

Comment threadsrc/coreclr/nativeaot/Runtime/unix/PalRedhawkInline.h
Comment threadsrc/coreclr/nativeaot/Runtime/unix/PalRedhawkInline.h Outdated
@jkotas

Copy link
Copy Markdown
Member

@filipnavara Could you please resolve the conflict?

@MichalPetryka

Copy link
Copy Markdown
Contributor

I did it myself cause I have push perms to filips fork.

Comment threadsrc/coreclr/nativeaot/Runtime/CMakeLists.txt Outdated
@MichalPetryka

Copy link
Copy Markdown
Contributor
  • Move RhpLockCmpXchg64 implementation to C

Why leave the 32bit one in ASM btw?

@jkotas

Copy link
Copy Markdown
Member

Why leave the 32bit one in ASM btw?

Do you mean the one for Arm? Yes, it would be nice to move it to C as well. Filip have not done it earlier to reduce conflicts with your other PR.

@MichalPetryka

Copy link
Copy Markdown
Contributor

Do you mean the one for Arm?

Only until #97792 is merged.

Filip have not done it earlier to reduce conflicts with your other PR.

I don't think we'd even have any conflicts there since they'd both just remove it.

@filipnavara

Copy link
Copy Markdown
MemberAuthor

Yes, it would be nice to move it to C as well.

Done.

@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!

@jkotas
jkotas merged commit 2820a1e into dotnet:mainMar 22, 2024
@filipnavara
filipnavara deleted the interlocked-null-check branch March 22, 2024 07:27
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 21, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@filipnavara@jkotas@MichalPetryka@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

[NativeAOT] Move Interlocked null checks to managed, RhpLockCmpXchg64 to C - #100021

Merged
jkotas merged 10 commits into
dotnet:mainfrom
filipnavara:interlocked-null-check
Mar 22, 2024
Merged

[NativeAOT] Move Interlocked null checks to managed, RhpLockCmpXchg64 to C#100021
jkotas merged 10 commits into
dotnet:mainfrom
filipnavara:interlocked-null-check

Conversation

@filipnavara

@filipnavarafilipnavara commented Mar 20, 2024

Copy link
Copy Markdown
Member
  • Move RhpLockCmpXchg[32/64] implementation to C
  • Move null checks from RhpLockCmpXchg[8/16/32/64]/RhpCheckedLockCmpXchg/RhpCheckedXchg to managed code

Ref: #99688 (comment)
Ref: #96916 (similar thing done for CoreCLR)

…ockCmpXchg64/RhpCheckedLockCmpXchg/RhpCheckedXchg to managed code
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Mar 20, 2024
CmpXchgRetry
;; Check location value is what we expect.
ALTERNATE_ENTRY RhpCheckedLockCmpXchgAVLocation2
ldaxr x10, [x0]

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

The RhpCheckedLockCmpXchgAVLocation2 and RhpCheckedXchgAVLocation2 checks are weird. They seem to be present for the same location that was already null checked and unnecessary.

@filipnavara
filipnavara requested a review from jkotasMarch 20, 2024 15:04
@filipnavara

Copy link
Copy Markdown
MemberAuthor

Kept as draft, needs to be run through CI.

Comment threadsrc/coreclr/nativeaot/Runtime/MiscHelpers.cpp Outdated
bne LOCAL_LABEL(CmpXchg64Retry)
LOCAL_LABEL(CmpXchg64Exit):
mov r0, r6
dmb

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.

The native AOT PAL implementation of InterlockedCompareExchange64 seems to be missing this barrier (PAL_InterlockedOperationBarrier in CoreCLR PAL).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

I added it but I noticed that PAL_InterlockedOperationBarrier is not enabled for arm32. That seems odd.

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.

I added it but I noticed that PAL_InterlockedOperationBarrier is not enabled for arm32. That seems odd.

IIRC the native compilers already emit a barrier of their own there so it'd do two barriers (so I guess it's kinda relying on an implementation detail).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

the native compilers already emit a barrier of their own

At very least ARM gcc and ARM clang does, so that explains why it wasn't a problem for ARM32 on CoreCLR.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

ARM64: clang generates barrier at the end (should still be fine); gcc doesn't generate a barrier


FORCEINLINE void PalInterlockedOperationBarrier()
{
#if (defined(HOST_ARM64) && !defined(LSE_INSTRUCTIONS_ENABLED_BY_DEFAULT)) || defined(HOST_ARM) || defined(HOST_LOONGARCH64) || defined(HOST_RISCV64)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Suggested change
#if (defined(HOST_ARM64) && !defined(LSE_INSTRUCTIONS_ENABLED_BY_DEFAULT)) ||defined(HOST_ARM) || defined(HOST_LOONGARCH64) || defined(HOST_RISCV64)
#if (defined(HOST_ARM64) && !defined(LSE_INSTRUCTIONS_ENABLED_BY_DEFAULT)&& !defined(__clang__)) || defined(HOST_LOONGARCH64) || defined(HOST_RISCV64)

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.

AFAIK C++ code is not supposed to have compiler specific defines in the runtime.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Well, other code in the same file already uses __clang__.

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.

Yes, also _MSC_VER and __llvm__. (I think we can replace all __llvm__ ones to __clang__ for consistency?)

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.

AFAIK C++ code is not supposed to have compiler specific defines in the runtime

I do not see a problem with this ifdef here.

Comment threadsrc/coreclr/nativeaot/Runtime/unix/PalRedhawkInline.h
Comment threadsrc/coreclr/nativeaot/Runtime/unix/PalRedhawkInline.h Outdated
@jkotas

Copy link
Copy Markdown
Member

@filipnavara Could you please resolve the conflict?

@MichalPetryka

Copy link
Copy Markdown
Contributor

I did it myself cause I have push perms to filips fork.

Comment threadsrc/coreclr/nativeaot/Runtime/CMakeLists.txt Outdated
@MichalPetryka

Copy link
Copy Markdown
Contributor
  • Move RhpLockCmpXchg64 implementation to C

Why leave the 32bit one in ASM btw?

@jkotas

Copy link
Copy Markdown
Member

Why leave the 32bit one in ASM btw?

Do you mean the one for Arm? Yes, it would be nice to move it to C as well. Filip have not done it earlier to reduce conflicts with your other PR.

@MichalPetryka

Copy link
Copy Markdown
Contributor

Do you mean the one for Arm?

Only until #97792 is merged.

Filip have not done it earlier to reduce conflicts with your other PR.

I don't think we'd even have any conflicts there since they'd both just remove it.

@filipnavara

Copy link
Copy Markdown
MemberAuthor

Yes, it would be nice to move it to C as well.

Done.

@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!

@jkotas
jkotas merged commit 2820a1e into dotnet:mainMar 22, 2024
@filipnavara
filipnavara deleted the interlocked-null-check branch March 22, 2024 07:27
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 21, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@filipnavara@jkotas@MichalPetryka@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

[NativeAOT] Move Interlocked null checks to managed, RhpLockCmpXchg64 to C - #100021

Merged
jkotas merged 10 commits into
dotnet:mainfrom
filipnavara:interlocked-null-check
Mar 22, 2024
Merged

[NativeAOT] Move Interlocked null checks to managed, RhpLockCmpXchg64 to C#100021
jkotas merged 10 commits into
dotnet:mainfrom
filipnavara:interlocked-null-check

Conversation

@filipnavara

@filipnavarafilipnavara commented Mar 20, 2024

Copy link
Copy Markdown
Member
  • Move RhpLockCmpXchg[32/64] implementation to C
  • Move null checks from RhpLockCmpXchg[8/16/32/64]/RhpCheckedLockCmpXchg/RhpCheckedXchg to managed code

Ref: #99688 (comment)
Ref: #96916 (similar thing done for CoreCLR)

…ockCmpXchg64/RhpCheckedLockCmpXchg/RhpCheckedXchg to managed code
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Mar 20, 2024
CmpXchgRetry
;; Check location value is what we expect.
ALTERNATE_ENTRY RhpCheckedLockCmpXchgAVLocation2
ldaxr x10, [x0]

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

The RhpCheckedLockCmpXchgAVLocation2 and RhpCheckedXchgAVLocation2 checks are weird. They seem to be present for the same location that was already null checked and unnecessary.

@filipnavara
filipnavara requested a review from jkotasMarch 20, 2024 15:04
@filipnavara

Copy link
Copy Markdown
MemberAuthor

Kept as draft, needs to be run through CI.

Comment threadsrc/coreclr/nativeaot/Runtime/MiscHelpers.cpp Outdated
bne LOCAL_LABEL(CmpXchg64Retry)
LOCAL_LABEL(CmpXchg64Exit):
mov r0, r6
dmb

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.

The native AOT PAL implementation of InterlockedCompareExchange64 seems to be missing this barrier (PAL_InterlockedOperationBarrier in CoreCLR PAL).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

I added it but I noticed that PAL_InterlockedOperationBarrier is not enabled for arm32. That seems odd.

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.

I added it but I noticed that PAL_InterlockedOperationBarrier is not enabled for arm32. That seems odd.

IIRC the native compilers already emit a barrier of their own there so it'd do two barriers (so I guess it's kinda relying on an implementation detail).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

the native compilers already emit a barrier of their own

At very least ARM gcc and ARM clang does, so that explains why it wasn't a problem for ARM32 on CoreCLR.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

ARM64: clang generates barrier at the end (should still be fine); gcc doesn't generate a barrier


FORCEINLINE void PalInterlockedOperationBarrier()
{
#if (defined(HOST_ARM64) && !defined(LSE_INSTRUCTIONS_ENABLED_BY_DEFAULT)) || defined(HOST_ARM) || defined(HOST_LOONGARCH64) || defined(HOST_RISCV64)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Suggested change
#if (defined(HOST_ARM64) && !defined(LSE_INSTRUCTIONS_ENABLED_BY_DEFAULT)) ||defined(HOST_ARM) || defined(HOST_LOONGARCH64) || defined(HOST_RISCV64)
#if (defined(HOST_ARM64) && !defined(LSE_INSTRUCTIONS_ENABLED_BY_DEFAULT)&& !defined(__clang__)) || defined(HOST_LOONGARCH64) || defined(HOST_RISCV64)

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.

AFAIK C++ code is not supposed to have compiler specific defines in the runtime.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Well, other code in the same file already uses __clang__.

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.

Yes, also _MSC_VER and __llvm__. (I think we can replace all __llvm__ ones to __clang__ for consistency?)

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.

AFAIK C++ code is not supposed to have compiler specific defines in the runtime

I do not see a problem with this ifdef here.

Comment threadsrc/coreclr/nativeaot/Runtime/unix/PalRedhawkInline.h
Comment threadsrc/coreclr/nativeaot/Runtime/unix/PalRedhawkInline.h Outdated
@jkotas

Copy link
Copy Markdown
Member

@filipnavara Could you please resolve the conflict?

@MichalPetryka

Copy link
Copy Markdown
Contributor

I did it myself cause I have push perms to filips fork.

Comment threadsrc/coreclr/nativeaot/Runtime/CMakeLists.txt Outdated
@MichalPetryka

Copy link
Copy Markdown
Contributor
  • Move RhpLockCmpXchg64 implementation to C

Why leave the 32bit one in ASM btw?

@jkotas

Copy link
Copy Markdown
Member

Why leave the 32bit one in ASM btw?

Do you mean the one for Arm? Yes, it would be nice to move it to C as well. Filip have not done it earlier to reduce conflicts with your other PR.

@MichalPetryka

Copy link
Copy Markdown
Contributor

Do you mean the one for Arm?

Only until #97792 is merged.

Filip have not done it earlier to reduce conflicts with your other PR.

I don't think we'd even have any conflicts there since they'd both just remove it.

@filipnavara

Copy link
Copy Markdown
MemberAuthor

Yes, it would be nice to move it to C as well.

Done.

@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!

@jkotas
jkotas merged commit 2820a1e into dotnet:mainMar 22, 2024
@filipnavara
filipnavara deleted the interlocked-null-check branch March 22, 2024 07:27
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 21, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@filipnavara@jkotas@MichalPetryka@am11