Intrinsify Array GetArrayDataReference for SZ arrays - #87374

Merged
EgorBo merged 12 commits into
dotnet:mainfrom
MichalPetryka:gadr-md
Jul 17, 2023
Merged

Intrinsify Array GetArrayDataReference for SZ arrays#87374
EgorBo merged 12 commits into
dotnet:mainfrom
MichalPetryka:gadr-md

Conversation

@MichalPetryka

@MichalPetrykaMichalPetryka commented Jun 10, 2023

Copy link
Copy Markdown
Contributor

Handles SZ arrays passed to the Array typed GetArrayDataReference via the intrinsic path too.

This should help JIT with avoiding UB caused by the C# implementation doing Unsafe.As on the array which can cause invalid codegen in some cases. Also makes the codegen a bit better.

@ghostghost added community-contribution Indicates that the PR has been added by a community member area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI labels Jun 10, 2023
@ghost

Copy link
Copy Markdown

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

Issue Details

Handles SZ arrays passed to the Array typed GetArrayDataReference via the intrinsic path too.

Author:MichalPetryka
Assignees:-
Labels:

area-CodeGen-coreclr, community-contribution

Milestone:-

@JulieLeeMSFT

Copy link
Copy Markdown
Member

@MichalPetryka, can you describe the issue or link the issue?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalPetryka, can you describe the issue or link the issue?

Described the motivation in the readme, worth noting is that I don't see any diffs in SPMI but I've seen examples of such code in the runtime, so I need to debug whether the type information is propagated correctly when inlining.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MihuBot

@EgorBo

Copy link
Copy Markdown
Member

@MichalPetryka So apparently jit-diff found zero diffs too, so can you explain again why exactly we need this, can you come up with a snippet that does a wrong thing and this PR fixes?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalPetryka So apparently jit-diff found zero diffs too, so can you explain again why exactly we need this, can you come up with a snippet that does a wrong thing and this PR fixes?

It found some diffs now, the motivation here is that Unsafe.As on the array can confuse VN and cause some invalid codegen, I can't find any sample that reproduces with the MD GADR though since the original ones from @SingleAccretion seem to not be problematic here/

@EgorBo

Copy link
Copy Markdown
Member

It found some diffs now

they don't look related, in fact it must be an unrelated issue @jakobbotsch fixed in #88385

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

It found some diffs now

they don't look related, in fact it must be an unrelated issue @jakobbotsch fixed in #88385

They are related, look at the static method at the bottom of the file, not at the instance one.

@EgorBo

Copy link
Copy Markdown
Member

They are related, look at the static method at the bottom of the file, not at the instance one.

can you share it here? I don't see any diffs except the if <-> cmove ones

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

They are related, look at the static method at the bottom of the file, not at the instance one.

can you share it here? I don't see any diffs except the if <-> cmove ones

@EgorBo

Copy link
Copy Markdown
Member

They are related, look at the static method at the bottom of the file, not at the instance one.

can you share it here? I don't see any diffs except the if <-> cmove ones

So, basically, it improves just one method accross all libs, right? GetPinnableReference (multiple generic versions of it because that's how PMI spawns them) - cc @dotnet/jit-contrib any thoughts about where is the line when we take changes with close to zero-diffs?

@tannergooding

Copy link
Copy Markdown
Member

So, basically, it improves just one method accross all libs, right?

The API in question is relatively new and is intended to be used in high perf scenarios. The BCL not having light-up from it doesn't mean that external users won't benefit, particularly in the places where some libraries use MD arrays more prominently.

any thoughts about where is the line when we take changes with close to zero-diffs?

I think we should be taking changes, like this, that explicitly improve these "built-in"/"foundational" high-performance helper APIs, particularly when its done via +24, -7 lines of code change and just reutilizing some existing logic we already have and where it resolves a known issue with undefined-behavior that we've seen hit in its sibling API. -- I would think that ideally this would actually be a little more complex and also handle MD arrays.

We ultimately don't have tons of these lowlevel APIs with most being already covered. We're also not adding them in a way that isn't "pay for play". This recognition is all done on import and only for the APIs in question so the actual impact to the JIT is minimal and there isn't a lot of reason to not do them when they're this small.

@EgorBo

EgorBo commented Jul 5, 2023

Copy link
Copy Markdown
Member

The API in question is relatively new and is intended to be used in high perf scenarios.

I doubt this non-generic Array overload is so, it looks more like a workaround for T*[] case

The BCL not having light-up from it doesn't mean

Nobody ever stated the otherwise, but in case of zero diff we need a solid proof it makes sense. It also means that the test coverage is only the test Michal just added (that also doesn't look complete - e.g. I don't see shared generic case).

where it resolves a known issue with undefined-behavior that we've seen hit in its sibling API.

Would be nice to see that UB in action, so far it was stated that this overload is unlikely to hit it.

Overall I am ok taking this change, just wanted to raise a question regarding JIT changes without clear benefits/which don't fix any issues

@EgorBo
EgorBo merged commit e89cfee into dotnet:mainJul 17, 2023
@EgorBo

Copy link
Copy Markdown
Member

@MichalPetryka thanks!

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIcommunity-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

@MichalPetryka@JulieLeeMSFT@EgorBo@tannergooding
, '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

Intrinsify Array GetArrayDataReference for SZ arrays - #87374

Merged
EgorBo merged 12 commits into
dotnet:mainfrom
MichalPetryka:gadr-md
Jul 17, 2023
Merged

Intrinsify Array GetArrayDataReference for SZ arrays#87374
EgorBo merged 12 commits into
dotnet:mainfrom
MichalPetryka:gadr-md

Conversation

@MichalPetryka

@MichalPetrykaMichalPetryka commented Jun 10, 2023

Copy link
Copy Markdown
Contributor

Handles SZ arrays passed to the Array typed GetArrayDataReference via the intrinsic path too.

This should help JIT with avoiding UB caused by the C# implementation doing Unsafe.As on the array which can cause invalid codegen in some cases. Also makes the codegen a bit better.

@ghostghost added community-contribution Indicates that the PR has been added by a community member area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI labels Jun 10, 2023
@ghost

Copy link
Copy Markdown

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

Issue Details

Handles SZ arrays passed to the Array typed GetArrayDataReference via the intrinsic path too.

Author:MichalPetryka
Assignees:-
Labels:

area-CodeGen-coreclr, community-contribution

Milestone:-

@JulieLeeMSFT

Copy link
Copy Markdown
Member

@MichalPetryka, can you describe the issue or link the issue?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalPetryka, can you describe the issue or link the issue?

Described the motivation in the readme, worth noting is that I don't see any diffs in SPMI but I've seen examples of such code in the runtime, so I need to debug whether the type information is propagated correctly when inlining.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MihuBot

@EgorBo

Copy link
Copy Markdown
Member

@MichalPetryka So apparently jit-diff found zero diffs too, so can you explain again why exactly we need this, can you come up with a snippet that does a wrong thing and this PR fixes?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalPetryka So apparently jit-diff found zero diffs too, so can you explain again why exactly we need this, can you come up with a snippet that does a wrong thing and this PR fixes?

It found some diffs now, the motivation here is that Unsafe.As on the array can confuse VN and cause some invalid codegen, I can't find any sample that reproduces with the MD GADR though since the original ones from @SingleAccretion seem to not be problematic here/

@EgorBo

Copy link
Copy Markdown
Member

It found some diffs now

they don't look related, in fact it must be an unrelated issue @jakobbotsch fixed in #88385

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

It found some diffs now

they don't look related, in fact it must be an unrelated issue @jakobbotsch fixed in #88385

They are related, look at the static method at the bottom of the file, not at the instance one.

@EgorBo

Copy link
Copy Markdown
Member

They are related, look at the static method at the bottom of the file, not at the instance one.

can you share it here? I don't see any diffs except the if <-> cmove ones

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

They are related, look at the static method at the bottom of the file, not at the instance one.

can you share it here? I don't see any diffs except the if <-> cmove ones

@EgorBo

Copy link
Copy Markdown
Member

They are related, look at the static method at the bottom of the file, not at the instance one.

can you share it here? I don't see any diffs except the if <-> cmove ones

So, basically, it improves just one method accross all libs, right? GetPinnableReference (multiple generic versions of it because that's how PMI spawns them) - cc @dotnet/jit-contrib any thoughts about where is the line when we take changes with close to zero-diffs?

@tannergooding

Copy link
Copy Markdown
Member

So, basically, it improves just one method accross all libs, right?

The API in question is relatively new and is intended to be used in high perf scenarios. The BCL not having light-up from it doesn't mean that external users won't benefit, particularly in the places where some libraries use MD arrays more prominently.

any thoughts about where is the line when we take changes with close to zero-diffs?

I think we should be taking changes, like this, that explicitly improve these "built-in"/"foundational" high-performance helper APIs, particularly when its done via +24, -7 lines of code change and just reutilizing some existing logic we already have and where it resolves a known issue with undefined-behavior that we've seen hit in its sibling API. -- I would think that ideally this would actually be a little more complex and also handle MD arrays.

We ultimately don't have tons of these lowlevel APIs with most being already covered. We're also not adding them in a way that isn't "pay for play". This recognition is all done on import and only for the APIs in question so the actual impact to the JIT is minimal and there isn't a lot of reason to not do them when they're this small.

@EgorBo

EgorBo commented Jul 5, 2023

Copy link
Copy Markdown
Member

The API in question is relatively new and is intended to be used in high perf scenarios.

I doubt this non-generic Array overload is so, it looks more like a workaround for T*[] case

The BCL not having light-up from it doesn't mean

Nobody ever stated the otherwise, but in case of zero diff we need a solid proof it makes sense. It also means that the test coverage is only the test Michal just added (that also doesn't look complete - e.g. I don't see shared generic case).

where it resolves a known issue with undefined-behavior that we've seen hit in its sibling API.

Would be nice to see that UB in action, so far it was stated that this overload is unlikely to hit it.

Overall I am ok taking this change, just wanted to raise a question regarding JIT changes without clear benefits/which don't fix any issues

@EgorBo
EgorBo merged commit e89cfee into dotnet:mainJul 17, 2023
@EgorBo

Copy link
Copy Markdown
Member

@MichalPetryka thanks!

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIcommunity-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

@MichalPetryka@JulieLeeMSFT@EgorBo@tannergooding
, '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

Intrinsify Array GetArrayDataReference for SZ arrays - #87374

Merged
EgorBo merged 12 commits into
dotnet:mainfrom
MichalPetryka:gadr-md
Jul 17, 2023
Merged

Intrinsify Array GetArrayDataReference for SZ arrays#87374
EgorBo merged 12 commits into
dotnet:mainfrom
MichalPetryka:gadr-md

Conversation

@MichalPetryka

@MichalPetrykaMichalPetryka commented Jun 10, 2023

Copy link
Copy Markdown
Contributor

Handles SZ arrays passed to the Array typed GetArrayDataReference via the intrinsic path too.

This should help JIT with avoiding UB caused by the C# implementation doing Unsafe.As on the array which can cause invalid codegen in some cases. Also makes the codegen a bit better.

@ghostghost added community-contribution Indicates that the PR has been added by a community member area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI labels Jun 10, 2023
@ghost

Copy link
Copy Markdown

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

Issue Details

Handles SZ arrays passed to the Array typed GetArrayDataReference via the intrinsic path too.

Author:MichalPetryka
Assignees:-
Labels:

area-CodeGen-coreclr, community-contribution

Milestone:-

@JulieLeeMSFT

Copy link
Copy Markdown
Member

@MichalPetryka, can you describe the issue or link the issue?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalPetryka, can you describe the issue or link the issue?

Described the motivation in the readme, worth noting is that I don't see any diffs in SPMI but I've seen examples of such code in the runtime, so I need to debug whether the type information is propagated correctly when inlining.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MihuBot

@EgorBo

Copy link
Copy Markdown
Member

@MichalPetryka So apparently jit-diff found zero diffs too, so can you explain again why exactly we need this, can you come up with a snippet that does a wrong thing and this PR fixes?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalPetryka So apparently jit-diff found zero diffs too, so can you explain again why exactly we need this, can you come up with a snippet that does a wrong thing and this PR fixes?

It found some diffs now, the motivation here is that Unsafe.As on the array can confuse VN and cause some invalid codegen, I can't find any sample that reproduces with the MD GADR though since the original ones from @SingleAccretion seem to not be problematic here/

@EgorBo

Copy link
Copy Markdown
Member

It found some diffs now

they don't look related, in fact it must be an unrelated issue @jakobbotsch fixed in #88385

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

It found some diffs now

they don't look related, in fact it must be an unrelated issue @jakobbotsch fixed in #88385

They are related, look at the static method at the bottom of the file, not at the instance one.

@EgorBo

Copy link
Copy Markdown
Member

They are related, look at the static method at the bottom of the file, not at the instance one.

can you share it here? I don't see any diffs except the if <-> cmove ones

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

They are related, look at the static method at the bottom of the file, not at the instance one.

can you share it here? I don't see any diffs except the if <-> cmove ones

@EgorBo

Copy link
Copy Markdown
Member

They are related, look at the static method at the bottom of the file, not at the instance one.

can you share it here? I don't see any diffs except the if <-> cmove ones

So, basically, it improves just one method accross all libs, right? GetPinnableReference (multiple generic versions of it because that's how PMI spawns them) - cc @dotnet/jit-contrib any thoughts about where is the line when we take changes with close to zero-diffs?

@tannergooding

Copy link
Copy Markdown
Member

So, basically, it improves just one method accross all libs, right?

The API in question is relatively new and is intended to be used in high perf scenarios. The BCL not having light-up from it doesn't mean that external users won't benefit, particularly in the places where some libraries use MD arrays more prominently.

any thoughts about where is the line when we take changes with close to zero-diffs?

I think we should be taking changes, like this, that explicitly improve these "built-in"/"foundational" high-performance helper APIs, particularly when its done via +24, -7 lines of code change and just reutilizing some existing logic we already have and where it resolves a known issue with undefined-behavior that we've seen hit in its sibling API. -- I would think that ideally this would actually be a little more complex and also handle MD arrays.

We ultimately don't have tons of these lowlevel APIs with most being already covered. We're also not adding them in a way that isn't "pay for play". This recognition is all done on import and only for the APIs in question so the actual impact to the JIT is minimal and there isn't a lot of reason to not do them when they're this small.

@EgorBo

EgorBo commented Jul 5, 2023

Copy link
Copy Markdown
Member

The API in question is relatively new and is intended to be used in high perf scenarios.

I doubt this non-generic Array overload is so, it looks more like a workaround for T*[] case

The BCL not having light-up from it doesn't mean

Nobody ever stated the otherwise, but in case of zero diff we need a solid proof it makes sense. It also means that the test coverage is only the test Michal just added (that also doesn't look complete - e.g. I don't see shared generic case).

where it resolves a known issue with undefined-behavior that we've seen hit in its sibling API.

Would be nice to see that UB in action, so far it was stated that this overload is unlikely to hit it.

Overall I am ok taking this change, just wanted to raise a question regarding JIT changes without clear benefits/which don't fix any issues

@EgorBo
EgorBo merged commit e89cfee into dotnet:mainJul 17, 2023
@EgorBo

Copy link
Copy Markdown
Member

@MichalPetryka thanks!

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIcommunity-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

@MichalPetryka@JulieLeeMSFT@EgorBo@tannergooding
, '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

Intrinsify Array GetArrayDataReference for SZ arrays - #87374

Merged
EgorBo merged 12 commits into
dotnet:mainfrom
MichalPetryka:gadr-md
Jul 17, 2023
Merged

Intrinsify Array GetArrayDataReference for SZ arrays#87374
EgorBo merged 12 commits into
dotnet:mainfrom
MichalPetryka:gadr-md

Conversation

@MichalPetryka

@MichalPetrykaMichalPetryka commented Jun 10, 2023

Copy link
Copy Markdown
Contributor

Handles SZ arrays passed to the Array typed GetArrayDataReference via the intrinsic path too.

This should help JIT with avoiding UB caused by the C# implementation doing Unsafe.As on the array which can cause invalid codegen in some cases. Also makes the codegen a bit better.

@ghostghost added community-contribution Indicates that the PR has been added by a community member area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI labels Jun 10, 2023
@ghost

Copy link
Copy Markdown

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

Issue Details

Handles SZ arrays passed to the Array typed GetArrayDataReference via the intrinsic path too.

Author:MichalPetryka
Assignees:-
Labels:

area-CodeGen-coreclr, community-contribution

Milestone:-

@JulieLeeMSFT

Copy link
Copy Markdown
Member

@MichalPetryka, can you describe the issue or link the issue?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalPetryka, can you describe the issue or link the issue?

Described the motivation in the readme, worth noting is that I don't see any diffs in SPMI but I've seen examples of such code in the runtime, so I need to debug whether the type information is propagated correctly when inlining.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MihuBot

@EgorBo

Copy link
Copy Markdown
Member

@MichalPetryka So apparently jit-diff found zero diffs too, so can you explain again why exactly we need this, can you come up with a snippet that does a wrong thing and this PR fixes?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalPetryka So apparently jit-diff found zero diffs too, so can you explain again why exactly we need this, can you come up with a snippet that does a wrong thing and this PR fixes?

It found some diffs now, the motivation here is that Unsafe.As on the array can confuse VN and cause some invalid codegen, I can't find any sample that reproduces with the MD GADR though since the original ones from @SingleAccretion seem to not be problematic here/

@EgorBo

Copy link
Copy Markdown
Member

It found some diffs now

they don't look related, in fact it must be an unrelated issue @jakobbotsch fixed in #88385

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

It found some diffs now

they don't look related, in fact it must be an unrelated issue @jakobbotsch fixed in #88385

They are related, look at the static method at the bottom of the file, not at the instance one.

@EgorBo

Copy link
Copy Markdown
Member

They are related, look at the static method at the bottom of the file, not at the instance one.

can you share it here? I don't see any diffs except the if <-> cmove ones

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

They are related, look at the static method at the bottom of the file, not at the instance one.

can you share it here? I don't see any diffs except the if <-> cmove ones

@EgorBo

Copy link
Copy Markdown
Member

They are related, look at the static method at the bottom of the file, not at the instance one.

can you share it here? I don't see any diffs except the if <-> cmove ones

So, basically, it improves just one method accross all libs, right? GetPinnableReference (multiple generic versions of it because that's how PMI spawns them) - cc @dotnet/jit-contrib any thoughts about where is the line when we take changes with close to zero-diffs?

@tannergooding

Copy link
Copy Markdown
Member

So, basically, it improves just one method accross all libs, right?

The API in question is relatively new and is intended to be used in high perf scenarios. The BCL not having light-up from it doesn't mean that external users won't benefit, particularly in the places where some libraries use MD arrays more prominently.

any thoughts about where is the line when we take changes with close to zero-diffs?

I think we should be taking changes, like this, that explicitly improve these "built-in"/"foundational" high-performance helper APIs, particularly when its done via +24, -7 lines of code change and just reutilizing some existing logic we already have and where it resolves a known issue with undefined-behavior that we've seen hit in its sibling API. -- I would think that ideally this would actually be a little more complex and also handle MD arrays.

We ultimately don't have tons of these lowlevel APIs with most being already covered. We're also not adding them in a way that isn't "pay for play". This recognition is all done on import and only for the APIs in question so the actual impact to the JIT is minimal and there isn't a lot of reason to not do them when they're this small.

@EgorBo

EgorBo commented Jul 5, 2023

Copy link
Copy Markdown
Member

The API in question is relatively new and is intended to be used in high perf scenarios.

I doubt this non-generic Array overload is so, it looks more like a workaround for T*[] case

The BCL not having light-up from it doesn't mean

Nobody ever stated the otherwise, but in case of zero diff we need a solid proof it makes sense. It also means that the test coverage is only the test Michal just added (that also doesn't look complete - e.g. I don't see shared generic case).

where it resolves a known issue with undefined-behavior that we've seen hit in its sibling API.

Would be nice to see that UB in action, so far it was stated that this overload is unlikely to hit it.

Overall I am ok taking this change, just wanted to raise a question regarding JIT changes without clear benefits/which don't fix any issues

@EgorBo
EgorBo merged commit e89cfee into dotnet:mainJul 17, 2023
@EgorBo

Copy link
Copy Markdown
Member

@MichalPetryka thanks!

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIcommunity-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

@MichalPetryka@JulieLeeMSFT@EgorBo@tannergooding
, '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

Intrinsify Array GetArrayDataReference for SZ arrays - #87374

Merged
EgorBo merged 12 commits into
dotnet:mainfrom
MichalPetryka:gadr-md
Jul 17, 2023
Merged

Intrinsify Array GetArrayDataReference for SZ arrays#87374
EgorBo merged 12 commits into
dotnet:mainfrom
MichalPetryka:gadr-md

Conversation

@MichalPetryka

@MichalPetrykaMichalPetryka commented Jun 10, 2023

Copy link
Copy Markdown
Contributor

Handles SZ arrays passed to the Array typed GetArrayDataReference via the intrinsic path too.

This should help JIT with avoiding UB caused by the C# implementation doing Unsafe.As on the array which can cause invalid codegen in some cases. Also makes the codegen a bit better.

@ghostghost added community-contribution Indicates that the PR has been added by a community member area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI labels Jun 10, 2023
@ghost

Copy link
Copy Markdown

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

Issue Details

Handles SZ arrays passed to the Array typed GetArrayDataReference via the intrinsic path too.

Author:MichalPetryka
Assignees:-
Labels:

area-CodeGen-coreclr, community-contribution

Milestone:-

@JulieLeeMSFT

Copy link
Copy Markdown
Member

@MichalPetryka, can you describe the issue or link the issue?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalPetryka, can you describe the issue or link the issue?

Described the motivation in the readme, worth noting is that I don't see any diffs in SPMI but I've seen examples of such code in the runtime, so I need to debug whether the type information is propagated correctly when inlining.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MihuBot

@EgorBo

Copy link
Copy Markdown
Member

@MichalPetryka So apparently jit-diff found zero diffs too, so can you explain again why exactly we need this, can you come up with a snippet that does a wrong thing and this PR fixes?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalPetryka So apparently jit-diff found zero diffs too, so can you explain again why exactly we need this, can you come up with a snippet that does a wrong thing and this PR fixes?

It found some diffs now, the motivation here is that Unsafe.As on the array can confuse VN and cause some invalid codegen, I can't find any sample that reproduces with the MD GADR though since the original ones from @SingleAccretion seem to not be problematic here/

@EgorBo

Copy link
Copy Markdown
Member

It found some diffs now

they don't look related, in fact it must be an unrelated issue @jakobbotsch fixed in #88385

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

It found some diffs now

they don't look related, in fact it must be an unrelated issue @jakobbotsch fixed in #88385

They are related, look at the static method at the bottom of the file, not at the instance one.

@EgorBo

Copy link
Copy Markdown
Member

They are related, look at the static method at the bottom of the file, not at the instance one.

can you share it here? I don't see any diffs except the if <-> cmove ones

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

They are related, look at the static method at the bottom of the file, not at the instance one.

can you share it here? I don't see any diffs except the if <-> cmove ones

@EgorBo

Copy link
Copy Markdown
Member

They are related, look at the static method at the bottom of the file, not at the instance one.

can you share it here? I don't see any diffs except the if <-> cmove ones

So, basically, it improves just one method accross all libs, right? GetPinnableReference (multiple generic versions of it because that's how PMI spawns them) - cc @dotnet/jit-contrib any thoughts about where is the line when we take changes with close to zero-diffs?

@tannergooding

Copy link
Copy Markdown
Member

So, basically, it improves just one method accross all libs, right?

The API in question is relatively new and is intended to be used in high perf scenarios. The BCL not having light-up from it doesn't mean that external users won't benefit, particularly in the places where some libraries use MD arrays more prominently.

any thoughts about where is the line when we take changes with close to zero-diffs?

I think we should be taking changes, like this, that explicitly improve these "built-in"/"foundational" high-performance helper APIs, particularly when its done via +24, -7 lines of code change and just reutilizing some existing logic we already have and where it resolves a known issue with undefined-behavior that we've seen hit in its sibling API. -- I would think that ideally this would actually be a little more complex and also handle MD arrays.

We ultimately don't have tons of these lowlevel APIs with most being already covered. We're also not adding them in a way that isn't "pay for play". This recognition is all done on import and only for the APIs in question so the actual impact to the JIT is minimal and there isn't a lot of reason to not do them when they're this small.

@EgorBo

EgorBo commented Jul 5, 2023

Copy link
Copy Markdown
Member

The API in question is relatively new and is intended to be used in high perf scenarios.

I doubt this non-generic Array overload is so, it looks more like a workaround for T*[] case

The BCL not having light-up from it doesn't mean

Nobody ever stated the otherwise, but in case of zero diff we need a solid proof it makes sense. It also means that the test coverage is only the test Michal just added (that also doesn't look complete - e.g. I don't see shared generic case).

where it resolves a known issue with undefined-behavior that we've seen hit in its sibling API.

Would be nice to see that UB in action, so far it was stated that this overload is unlikely to hit it.

Overall I am ok taking this change, just wanted to raise a question regarding JIT changes without clear benefits/which don't fix any issues

@EgorBo
EgorBo merged commit e89cfee into dotnet:mainJul 17, 2023
@EgorBo

Copy link
Copy Markdown
Member

@MichalPetryka thanks!

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIcommunity-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

@MichalPetryka@JulieLeeMSFT@EgorBo@tannergooding
, '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

Intrinsify Array GetArrayDataReference for SZ arrays - #87374

Merged
EgorBo merged 12 commits into
dotnet:mainfrom
MichalPetryka:gadr-md
Jul 17, 2023
Merged

Intrinsify Array GetArrayDataReference for SZ arrays#87374
EgorBo merged 12 commits into
dotnet:mainfrom
MichalPetryka:gadr-md

Conversation

@MichalPetryka

@MichalPetrykaMichalPetryka commented Jun 10, 2023

Copy link
Copy Markdown
Contributor

Handles SZ arrays passed to the Array typed GetArrayDataReference via the intrinsic path too.

This should help JIT with avoiding UB caused by the C# implementation doing Unsafe.As on the array which can cause invalid codegen in some cases. Also makes the codegen a bit better.

@ghostghost added community-contribution Indicates that the PR has been added by a community member area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI labels Jun 10, 2023
@ghost

Copy link
Copy Markdown

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

Issue Details

Handles SZ arrays passed to the Array typed GetArrayDataReference via the intrinsic path too.

Author:MichalPetryka
Assignees:-
Labels:

area-CodeGen-coreclr, community-contribution

Milestone:-

@JulieLeeMSFT

Copy link
Copy Markdown
Member

@MichalPetryka, can you describe the issue or link the issue?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalPetryka, can you describe the issue or link the issue?

Described the motivation in the readme, worth noting is that I don't see any diffs in SPMI but I've seen examples of such code in the runtime, so I need to debug whether the type information is propagated correctly when inlining.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MihuBot

@EgorBo

Copy link
Copy Markdown
Member

@MichalPetryka So apparently jit-diff found zero diffs too, so can you explain again why exactly we need this, can you come up with a snippet that does a wrong thing and this PR fixes?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalPetryka So apparently jit-diff found zero diffs too, so can you explain again why exactly we need this, can you come up with a snippet that does a wrong thing and this PR fixes?

It found some diffs now, the motivation here is that Unsafe.As on the array can confuse VN and cause some invalid codegen, I can't find any sample that reproduces with the MD GADR though since the original ones from @SingleAccretion seem to not be problematic here/

@EgorBo

Copy link
Copy Markdown
Member

It found some diffs now

they don't look related, in fact it must be an unrelated issue @jakobbotsch fixed in #88385

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

It found some diffs now

they don't look related, in fact it must be an unrelated issue @jakobbotsch fixed in #88385

They are related, look at the static method at the bottom of the file, not at the instance one.

@EgorBo

Copy link
Copy Markdown
Member

They are related, look at the static method at the bottom of the file, not at the instance one.

can you share it here? I don't see any diffs except the if <-> cmove ones

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

They are related, look at the static method at the bottom of the file, not at the instance one.

can you share it here? I don't see any diffs except the if <-> cmove ones

@EgorBo

Copy link
Copy Markdown
Member

They are related, look at the static method at the bottom of the file, not at the instance one.

can you share it here? I don't see any diffs except the if <-> cmove ones

So, basically, it improves just one method accross all libs, right? GetPinnableReference (multiple generic versions of it because that's how PMI spawns them) - cc @dotnet/jit-contrib any thoughts about where is the line when we take changes with close to zero-diffs?

@tannergooding

Copy link
Copy Markdown
Member

So, basically, it improves just one method accross all libs, right?

The API in question is relatively new and is intended to be used in high perf scenarios. The BCL not having light-up from it doesn't mean that external users won't benefit, particularly in the places where some libraries use MD arrays more prominently.

any thoughts about where is the line when we take changes with close to zero-diffs?

I think we should be taking changes, like this, that explicitly improve these "built-in"/"foundational" high-performance helper APIs, particularly when its done via +24, -7 lines of code change and just reutilizing some existing logic we already have and where it resolves a known issue with undefined-behavior that we've seen hit in its sibling API. -- I would think that ideally this would actually be a little more complex and also handle MD arrays.

We ultimately don't have tons of these lowlevel APIs with most being already covered. We're also not adding them in a way that isn't "pay for play". This recognition is all done on import and only for the APIs in question so the actual impact to the JIT is minimal and there isn't a lot of reason to not do them when they're this small.

@EgorBo

EgorBo commented Jul 5, 2023

Copy link
Copy Markdown
Member

The API in question is relatively new and is intended to be used in high perf scenarios.

I doubt this non-generic Array overload is so, it looks more like a workaround for T*[] case

The BCL not having light-up from it doesn't mean

Nobody ever stated the otherwise, but in case of zero diff we need a solid proof it makes sense. It also means that the test coverage is only the test Michal just added (that also doesn't look complete - e.g. I don't see shared generic case).

where it resolves a known issue with undefined-behavior that we've seen hit in its sibling API.

Would be nice to see that UB in action, so far it was stated that this overload is unlikely to hit it.

Overall I am ok taking this change, just wanted to raise a question regarding JIT changes without clear benefits/which don't fix any issues

@EgorBo
EgorBo merged commit e89cfee into dotnet:mainJul 17, 2023
@EgorBo

Copy link
Copy Markdown
Member

@MichalPetryka thanks!

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIcommunity-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

@MichalPetryka@JulieLeeMSFT@EgorBo@tannergooding
, '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

Intrinsify Array GetArrayDataReference for SZ arrays - #87374

Merged
EgorBo merged 12 commits into
dotnet:mainfrom
MichalPetryka:gadr-md
Jul 17, 2023
Merged

Intrinsify Array GetArrayDataReference for SZ arrays#87374
EgorBo merged 12 commits into
dotnet:mainfrom
MichalPetryka:gadr-md

Conversation

@MichalPetryka

@MichalPetrykaMichalPetryka commented Jun 10, 2023

Copy link
Copy Markdown
Contributor

Handles SZ arrays passed to the Array typed GetArrayDataReference via the intrinsic path too.

This should help JIT with avoiding UB caused by the C# implementation doing Unsafe.As on the array which can cause invalid codegen in some cases. Also makes the codegen a bit better.

@ghostghost added community-contribution Indicates that the PR has been added by a community member area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI labels Jun 10, 2023
@ghost

Copy link
Copy Markdown

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

Issue Details

Handles SZ arrays passed to the Array typed GetArrayDataReference via the intrinsic path too.

Author:MichalPetryka
Assignees:-
Labels:

area-CodeGen-coreclr, community-contribution

Milestone:-

@JulieLeeMSFT

Copy link
Copy Markdown
Member

@MichalPetryka, can you describe the issue or link the issue?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalPetryka, can you describe the issue or link the issue?

Described the motivation in the readme, worth noting is that I don't see any diffs in SPMI but I've seen examples of such code in the runtime, so I need to debug whether the type information is propagated correctly when inlining.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MihuBot

@EgorBo

Copy link
Copy Markdown
Member

@MichalPetryka So apparently jit-diff found zero diffs too, so can you explain again why exactly we need this, can you come up with a snippet that does a wrong thing and this PR fixes?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalPetryka So apparently jit-diff found zero diffs too, so can you explain again why exactly we need this, can you come up with a snippet that does a wrong thing and this PR fixes?

It found some diffs now, the motivation here is that Unsafe.As on the array can confuse VN and cause some invalid codegen, I can't find any sample that reproduces with the MD GADR though since the original ones from @SingleAccretion seem to not be problematic here/

@EgorBo

Copy link
Copy Markdown
Member

It found some diffs now

they don't look related, in fact it must be an unrelated issue @jakobbotsch fixed in #88385

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

It found some diffs now

they don't look related, in fact it must be an unrelated issue @jakobbotsch fixed in #88385

They are related, look at the static method at the bottom of the file, not at the instance one.

@EgorBo

Copy link
Copy Markdown
Member

They are related, look at the static method at the bottom of the file, not at the instance one.

can you share it here? I don't see any diffs except the if <-> cmove ones

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

They are related, look at the static method at the bottom of the file, not at the instance one.

can you share it here? I don't see any diffs except the if <-> cmove ones

@EgorBo

Copy link
Copy Markdown
Member

They are related, look at the static method at the bottom of the file, not at the instance one.

can you share it here? I don't see any diffs except the if <-> cmove ones

So, basically, it improves just one method accross all libs, right? GetPinnableReference (multiple generic versions of it because that's how PMI spawns them) - cc @dotnet/jit-contrib any thoughts about where is the line when we take changes with close to zero-diffs?

@tannergooding

Copy link
Copy Markdown
Member

So, basically, it improves just one method accross all libs, right?

The API in question is relatively new and is intended to be used in high perf scenarios. The BCL not having light-up from it doesn't mean that external users won't benefit, particularly in the places where some libraries use MD arrays more prominently.

any thoughts about where is the line when we take changes with close to zero-diffs?

I think we should be taking changes, like this, that explicitly improve these "built-in"/"foundational" high-performance helper APIs, particularly when its done via +24, -7 lines of code change and just reutilizing some existing logic we already have and where it resolves a known issue with undefined-behavior that we've seen hit in its sibling API. -- I would think that ideally this would actually be a little more complex and also handle MD arrays.

We ultimately don't have tons of these lowlevel APIs with most being already covered. We're also not adding them in a way that isn't "pay for play". This recognition is all done on import and only for the APIs in question so the actual impact to the JIT is minimal and there isn't a lot of reason to not do them when they're this small.

@EgorBo

EgorBo commented Jul 5, 2023

Copy link
Copy Markdown
Member

The API in question is relatively new and is intended to be used in high perf scenarios.

I doubt this non-generic Array overload is so, it looks more like a workaround for T*[] case

The BCL not having light-up from it doesn't mean

Nobody ever stated the otherwise, but in case of zero diff we need a solid proof it makes sense. It also means that the test coverage is only the test Michal just added (that also doesn't look complete - e.g. I don't see shared generic case).

where it resolves a known issue with undefined-behavior that we've seen hit in its sibling API.

Would be nice to see that UB in action, so far it was stated that this overload is unlikely to hit it.

Overall I am ok taking this change, just wanted to raise a question regarding JIT changes without clear benefits/which don't fix any issues

@EgorBo
EgorBo merged commit e89cfee into dotnet:mainJul 17, 2023
@EgorBo

Copy link
Copy Markdown
Member

@MichalPetryka thanks!

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIcommunity-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

@MichalPetryka@JulieLeeMSFT@EgorBo@tannergooding
, '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

Intrinsify Array GetArrayDataReference for SZ arrays - #87374

Merged
EgorBo merged 12 commits into
dotnet:mainfrom
MichalPetryka:gadr-md
Jul 17, 2023
Merged

Intrinsify Array GetArrayDataReference for SZ arrays#87374
EgorBo merged 12 commits into
dotnet:mainfrom
MichalPetryka:gadr-md

Conversation

@MichalPetryka

@MichalPetrykaMichalPetryka commented Jun 10, 2023

Copy link
Copy Markdown
Contributor

Handles SZ arrays passed to the Array typed GetArrayDataReference via the intrinsic path too.

This should help JIT with avoiding UB caused by the C# implementation doing Unsafe.As on the array which can cause invalid codegen in some cases. Also makes the codegen a bit better.

@ghostghost added community-contribution Indicates that the PR has been added by a community member area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI labels Jun 10, 2023
@ghost

Copy link
Copy Markdown

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

Issue Details

Handles SZ arrays passed to the Array typed GetArrayDataReference via the intrinsic path too.

Author:MichalPetryka
Assignees:-
Labels:

area-CodeGen-coreclr, community-contribution

Milestone:-

@JulieLeeMSFT

Copy link
Copy Markdown
Member

@MichalPetryka, can you describe the issue or link the issue?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalPetryka, can you describe the issue or link the issue?

Described the motivation in the readme, worth noting is that I don't see any diffs in SPMI but I've seen examples of such code in the runtime, so I need to debug whether the type information is propagated correctly when inlining.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MihuBot

@EgorBo

Copy link
Copy Markdown
Member

@MichalPetryka So apparently jit-diff found zero diffs too, so can you explain again why exactly we need this, can you come up with a snippet that does a wrong thing and this PR fixes?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MichalPetryka So apparently jit-diff found zero diffs too, so can you explain again why exactly we need this, can you come up with a snippet that does a wrong thing and this PR fixes?

It found some diffs now, the motivation here is that Unsafe.As on the array can confuse VN and cause some invalid codegen, I can't find any sample that reproduces with the MD GADR though since the original ones from @SingleAccretion seem to not be problematic here/

@EgorBo

Copy link
Copy Markdown
Member

It found some diffs now

they don't look related, in fact it must be an unrelated issue @jakobbotsch fixed in #88385

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

It found some diffs now

they don't look related, in fact it must be an unrelated issue @jakobbotsch fixed in #88385

They are related, look at the static method at the bottom of the file, not at the instance one.

@EgorBo

Copy link
Copy Markdown
Member

They are related, look at the static method at the bottom of the file, not at the instance one.

can you share it here? I don't see any diffs except the if <-> cmove ones

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

They are related, look at the static method at the bottom of the file, not at the instance one.

can you share it here? I don't see any diffs except the if <-> cmove ones

@EgorBo

Copy link
Copy Markdown
Member

They are related, look at the static method at the bottom of the file, not at the instance one.

can you share it here? I don't see any diffs except the if <-> cmove ones

So, basically, it improves just one method accross all libs, right? GetPinnableReference (multiple generic versions of it because that's how PMI spawns them) - cc @dotnet/jit-contrib any thoughts about where is the line when we take changes with close to zero-diffs?

@tannergooding

Copy link
Copy Markdown
Member

So, basically, it improves just one method accross all libs, right?

The API in question is relatively new and is intended to be used in high perf scenarios. The BCL not having light-up from it doesn't mean that external users won't benefit, particularly in the places where some libraries use MD arrays more prominently.

any thoughts about where is the line when we take changes with close to zero-diffs?

I think we should be taking changes, like this, that explicitly improve these "built-in"/"foundational" high-performance helper APIs, particularly when its done via +24, -7 lines of code change and just reutilizing some existing logic we already have and where it resolves a known issue with undefined-behavior that we've seen hit in its sibling API. -- I would think that ideally this would actually be a little more complex and also handle MD arrays.

We ultimately don't have tons of these lowlevel APIs with most being already covered. We're also not adding them in a way that isn't "pay for play". This recognition is all done on import and only for the APIs in question so the actual impact to the JIT is minimal and there isn't a lot of reason to not do them when they're this small.

@EgorBo

EgorBo commented Jul 5, 2023

Copy link
Copy Markdown
Member

The API in question is relatively new and is intended to be used in high perf scenarios.

I doubt this non-generic Array overload is so, it looks more like a workaround for T*[] case

The BCL not having light-up from it doesn't mean

Nobody ever stated the otherwise, but in case of zero diff we need a solid proof it makes sense. It also means that the test coverage is only the test Michal just added (that also doesn't look complete - e.g. I don't see shared generic case).

where it resolves a known issue with undefined-behavior that we've seen hit in its sibling API.

Would be nice to see that UB in action, so far it was stated that this overload is unlikely to hit it.

Overall I am ok taking this change, just wanted to raise a question regarding JIT changes without clear benefits/which don't fix any issues

@EgorBo
EgorBo merged commit e89cfee into dotnet:mainJul 17, 2023
@EgorBo

Copy link
Copy Markdown
Member

@MichalPetryka thanks!

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIcommunity-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

@MichalPetryka@JulieLeeMSFT@EgorBo@tannergooding