Return type from exact method context for call returns - #100041

Closed
MichalPetryka wants to merge 9 commits into
dotnet:mainfrom
MichalPetryka:return-context
Closed

Return type from exact method context for call returns#100041
MichalPetryka wants to merge 9 commits into
dotnet:mainfrom
MichalPetryka:return-context

Conversation

@MichalPetryka

@MichalPetrykaMichalPetryka commented Mar 20, 2024

Copy link
Copy Markdown
Contributor

This should let us devirtualize and inline more calls due to seeing the real type in variables instead of _Canon.

I've reused the existing LateDevirtualizationInfo for this and enabled storing it for non virtual calls too, it seemed safe as far as I've seen as all other places still checked IsVirtual before using it.

@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Mar 20, 2024
@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MihuBot

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

@AndyAyersMS

Copy link
Copy Markdown
Member

@MichalPetryka what's the status of this PR?

@MichalPetryka

MichalPetryka commented Apr 12, 2024

Copy link
Copy Markdown
ContributorAuthor

@MichalPetryka what's the status of this PR?

NativeAOT/R2R VM doesn't like seeing non shared generic contexts here and iirc my last discussion about it with @MichalStrehovsky ended up with me asking whether that VM should be changed to behave like coreclr or if the JIT should check stuff here.

@jkotas

Copy link
Copy Markdown
Member

NativeAOT/R2R VM doesn't like seeing non shared generic contexts here

Where exactly?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

Where exactly?

In the getMethodSig path with the 2 asserts I've changed in this PR to have better messages.

@jkotas

jkotas commented Apr 15, 2024

Copy link
Copy Markdown
Member

The JIT/EE interface methods expect that the context and method should always match. If you are passing mismatched context and method around, it won't work well. I would expect that to hit problems in both AOT and JIT scenarios.

Maybe you need a new method on JIT/EE interface to compute context for a method from more derived type?

@MichalStrehovsky

Copy link
Copy Markdown
Member

NativeAOT/R2R VM doesn't like seeing non shared generic contexts here

Where exactly?

I think something along the lines of this will fix the problem:

diff --git a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs
index 2be89e7374f..07bdb48b21a 100644
--- a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs+++ b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs@@ -1452,7 +1452,14 @@ private void getCallInfo(ref CORINFO_RESOLVED_TOKEN pResolvedToken, CORINFO_RESO
// the method with a method the intrinsic expands into. If it's not the special intrinsic,
// method stays unchanged.
var methodIL = (MethodIL)HandleToObject((void*)pResolvedToken.tokenScope);
- targetMethod = _compilation.ExpandIntrinsicForCallsite(targetMethod, methodIL.OwningMethod);+ MethodDesc callsiteMethod = _compilation.ExpandIntrinsicForCallsite(targetMethod, methodIL.OwningMethod);+ if (targetMethod != callsiteMethod)+ {+ Debug.Assert(!pResult->exactContextNeedsRuntimeLookup);+ Debug.Assert(!callsiteMethod.HasInstantiation && !targetMethod.HasInstantiation);+ pResult->contextHandle = contextFromType(callsiteMethod.OwningType);+ targetMethod = callsiteMethod;+ }
// For multidim array Address method, we pretend the method requires a hidden instantiation argument
// (even though it doesn't need one). We'll actually swap the method out for a differnt one with

I'd undo the assert changes.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Draft Pull Request was automatically closed for 30 days of inactivity. Please let us know if you'd like to reopen it.

@tannergooding

Copy link
Copy Markdown
Member

@MichalPetryka asked for this to be reopened.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MihuBot

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

NativeAOT/R2R VM doesn't like seeing non shared generic contexts here

Where exactly?

I think something along the lines of this will fix the problem:

diff --git a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs
index 2be89e7374f..07bdb48b21a 100644
--- a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs+++ b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs@@ -1452,7 +1452,14 @@ private void getCallInfo(ref CORINFO_RESOLVED_TOKEN pResolvedToken, CORINFO_RESO
// the method with a method the intrinsic expands into. If it's not the special intrinsic,
// method stays unchanged.
var methodIL = (MethodIL)HandleToObject((void*)pResolvedToken.tokenScope);
- targetMethod = _compilation.ExpandIntrinsicForCallsite(targetMethod, methodIL.OwningMethod);+ MethodDesc callsiteMethod = _compilation.ExpandIntrinsicForCallsite(targetMethod, methodIL.OwningMethod);+ if (targetMethod != callsiteMethod)+ {+ Debug.Assert(!pResult->exactContextNeedsRuntimeLookup);+ Debug.Assert(!callsiteMethod.HasInstantiation && !targetMethod.HasInstantiation);+ pResult->contextHandle = contextFromType(callsiteMethod.OwningType);+ targetMethod = callsiteMethod;+ }
// For multidim array Address method, we pretend the method requires a hidden instantiation argument
// (even though it doesn't need one). We'll actually swap the method out for a differnt one with

I'd undo the assert changes.

Seems fine with this, can't say I fully understand how it fixes the issue though.

@MichalPetryka
MichalPetryka marked this pull request as ready for review June 15, 2024 15:00
@MichalPetryka

This comment was marked as resolved.

1 similar comment
@MichalPetryka

This comment was marked as resolved.

@MihuBot

This comment was marked as resolved.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MihuBot merge

@build-analysisbuild-analysisBot mentioned this pull request Jun 15, 2024
@AndyAyersMS

Copy link
Copy Markdown
Member

The diffs from this are very minimal, which is a little surprising. As is I am not sure we should take this change. Either this particular pattern doesn't come up very often, or there is something else inhibiting the JIT from acting on this information.

You should consider trying to instrument to see how often this produces a "better" type for the return value, and then look into cases where we have a better return type but no visible impact, and see if there are any blockers.

@JulieLeeMSFT

Copy link
Copy Markdown
Member

Ping @MichalPetryka on where you are on this PR and if you will address the feedback from andyayersMS.

@JulieLeeMSFTJulieLeeMSFT added the needs-author-action An issue or pull request that requires more info or actions from the author. label Jul 22, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

This pull request has been automatically marked no-recent-activity because it has not had any activity for 14 days. It will be closed if no further activity occurs within 14 more days. Any new comment (by anyone, not necessarily the author) will remove no-recent-activity.

@JulieLeeMSFTJulieLeeMSFT added this to the 10.0.0 milestone Aug 12, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

This pull request will now be closed since it had been marked no-recent-activity but received no further activity in the past 14 days. It is still possible to reopen or comment on the pull request, but please note that it will be locked if it remains inactive for another 30 days.

@dotnet-policy-servicedotnet-policy-serviceBot removed this from the 10.0.0 milestone Aug 26, 2024
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Sep 28, 2024
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 memberneeds-author-actionAn issue or pull request that requires more info or actions from the author.no-recent-activity

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@MichalPetryka@AndyAyersMS@jkotas@MichalStrehovsky@tannergooding@MihuBot@JulieLeeMSFT
, '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

Return type from exact method context for call returns - #100041

Closed
MichalPetryka wants to merge 9 commits into
dotnet:mainfrom
MichalPetryka:return-context
Closed

Return type from exact method context for call returns#100041
MichalPetryka wants to merge 9 commits into
dotnet:mainfrom
MichalPetryka:return-context

Conversation

@MichalPetryka

@MichalPetrykaMichalPetryka commented Mar 20, 2024

Copy link
Copy Markdown
Contributor

This should let us devirtualize and inline more calls due to seeing the real type in variables instead of _Canon.

I've reused the existing LateDevirtualizationInfo for this and enabled storing it for non virtual calls too, it seemed safe as far as I've seen as all other places still checked IsVirtual before using it.

@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Mar 20, 2024
@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MihuBot

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

@AndyAyersMS

Copy link
Copy Markdown
Member

@MichalPetryka what's the status of this PR?

@MichalPetryka

MichalPetryka commented Apr 12, 2024

Copy link
Copy Markdown
ContributorAuthor

@MichalPetryka what's the status of this PR?

NativeAOT/R2R VM doesn't like seeing non shared generic contexts here and iirc my last discussion about it with @MichalStrehovsky ended up with me asking whether that VM should be changed to behave like coreclr or if the JIT should check stuff here.

@jkotas

Copy link
Copy Markdown
Member

NativeAOT/R2R VM doesn't like seeing non shared generic contexts here

Where exactly?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

Where exactly?

In the getMethodSig path with the 2 asserts I've changed in this PR to have better messages.

@jkotas

jkotas commented Apr 15, 2024

Copy link
Copy Markdown
Member

The JIT/EE interface methods expect that the context and method should always match. If you are passing mismatched context and method around, it won't work well. I would expect that to hit problems in both AOT and JIT scenarios.

Maybe you need a new method on JIT/EE interface to compute context for a method from more derived type?

@MichalStrehovsky

Copy link
Copy Markdown
Member

NativeAOT/R2R VM doesn't like seeing non shared generic contexts here

Where exactly?

I think something along the lines of this will fix the problem:

diff --git a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs
index 2be89e7374f..07bdb48b21a 100644
--- a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs+++ b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs@@ -1452,7 +1452,14 @@ private void getCallInfo(ref CORINFO_RESOLVED_TOKEN pResolvedToken, CORINFO_RESO
// the method with a method the intrinsic expands into. If it's not the special intrinsic,
// method stays unchanged.
var methodIL = (MethodIL)HandleToObject((void*)pResolvedToken.tokenScope);
- targetMethod = _compilation.ExpandIntrinsicForCallsite(targetMethod, methodIL.OwningMethod);+ MethodDesc callsiteMethod = _compilation.ExpandIntrinsicForCallsite(targetMethod, methodIL.OwningMethod);+ if (targetMethod != callsiteMethod)+ {+ Debug.Assert(!pResult->exactContextNeedsRuntimeLookup);+ Debug.Assert(!callsiteMethod.HasInstantiation && !targetMethod.HasInstantiation);+ pResult->contextHandle = contextFromType(callsiteMethod.OwningType);+ targetMethod = callsiteMethod;+ }
// For multidim array Address method, we pretend the method requires a hidden instantiation argument
// (even though it doesn't need one). We'll actually swap the method out for a differnt one with

I'd undo the assert changes.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Draft Pull Request was automatically closed for 30 days of inactivity. Please let us know if you'd like to reopen it.

@tannergooding

Copy link
Copy Markdown
Member

@MichalPetryka asked for this to be reopened.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MihuBot

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

NativeAOT/R2R VM doesn't like seeing non shared generic contexts here

Where exactly?

I think something along the lines of this will fix the problem:

diff --git a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs
index 2be89e7374f..07bdb48b21a 100644
--- a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs+++ b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs@@ -1452,7 +1452,14 @@ private void getCallInfo(ref CORINFO_RESOLVED_TOKEN pResolvedToken, CORINFO_RESO
// the method with a method the intrinsic expands into. If it's not the special intrinsic,
// method stays unchanged.
var methodIL = (MethodIL)HandleToObject((void*)pResolvedToken.tokenScope);
- targetMethod = _compilation.ExpandIntrinsicForCallsite(targetMethod, methodIL.OwningMethod);+ MethodDesc callsiteMethod = _compilation.ExpandIntrinsicForCallsite(targetMethod, methodIL.OwningMethod);+ if (targetMethod != callsiteMethod)+ {+ Debug.Assert(!pResult->exactContextNeedsRuntimeLookup);+ Debug.Assert(!callsiteMethod.HasInstantiation && !targetMethod.HasInstantiation);+ pResult->contextHandle = contextFromType(callsiteMethod.OwningType);+ targetMethod = callsiteMethod;+ }
// For multidim array Address method, we pretend the method requires a hidden instantiation argument
// (even though it doesn't need one). We'll actually swap the method out for a differnt one with

I'd undo the assert changes.

Seems fine with this, can't say I fully understand how it fixes the issue though.

@MichalPetryka
MichalPetryka marked this pull request as ready for review June 15, 2024 15:00
@MichalPetryka

This comment was marked as resolved.

1 similar comment
@MichalPetryka

This comment was marked as resolved.

@MihuBot

This comment was marked as resolved.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MihuBot merge

@build-analysisbuild-analysisBot mentioned this pull request Jun 15, 2024
@AndyAyersMS

Copy link
Copy Markdown
Member

The diffs from this are very minimal, which is a little surprising. As is I am not sure we should take this change. Either this particular pattern doesn't come up very often, or there is something else inhibiting the JIT from acting on this information.

You should consider trying to instrument to see how often this produces a "better" type for the return value, and then look into cases where we have a better return type but no visible impact, and see if there are any blockers.

@JulieLeeMSFT

Copy link
Copy Markdown
Member

Ping @MichalPetryka on where you are on this PR and if you will address the feedback from andyayersMS.

@JulieLeeMSFTJulieLeeMSFT added the needs-author-action An issue or pull request that requires more info or actions from the author. label Jul 22, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

This pull request has been automatically marked no-recent-activity because it has not had any activity for 14 days. It will be closed if no further activity occurs within 14 more days. Any new comment (by anyone, not necessarily the author) will remove no-recent-activity.

@JulieLeeMSFTJulieLeeMSFT added this to the 10.0.0 milestone Aug 12, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

This pull request will now be closed since it had been marked no-recent-activity but received no further activity in the past 14 days. It is still possible to reopen or comment on the pull request, but please note that it will be locked if it remains inactive for another 30 days.

@dotnet-policy-servicedotnet-policy-serviceBot removed this from the 10.0.0 milestone Aug 26, 2024
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Sep 28, 2024
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 memberneeds-author-actionAn issue or pull request that requires more info or actions from the author.no-recent-activity

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@MichalPetryka@AndyAyersMS@jkotas@MichalStrehovsky@tannergooding@MihuBot@JulieLeeMSFT
, '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

Return type from exact method context for call returns - #100041

Closed
MichalPetryka wants to merge 9 commits into
dotnet:mainfrom
MichalPetryka:return-context
Closed

Return type from exact method context for call returns#100041
MichalPetryka wants to merge 9 commits into
dotnet:mainfrom
MichalPetryka:return-context

Conversation

@MichalPetryka

@MichalPetrykaMichalPetryka commented Mar 20, 2024

Copy link
Copy Markdown
Contributor

This should let us devirtualize and inline more calls due to seeing the real type in variables instead of _Canon.

I've reused the existing LateDevirtualizationInfo for this and enabled storing it for non virtual calls too, it seemed safe as far as I've seen as all other places still checked IsVirtual before using it.

@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Mar 20, 2024
@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MihuBot

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

@AndyAyersMS

Copy link
Copy Markdown
Member

@MichalPetryka what's the status of this PR?

@MichalPetryka

MichalPetryka commented Apr 12, 2024

Copy link
Copy Markdown
ContributorAuthor

@MichalPetryka what's the status of this PR?

NativeAOT/R2R VM doesn't like seeing non shared generic contexts here and iirc my last discussion about it with @MichalStrehovsky ended up with me asking whether that VM should be changed to behave like coreclr or if the JIT should check stuff here.

@jkotas

Copy link
Copy Markdown
Member

NativeAOT/R2R VM doesn't like seeing non shared generic contexts here

Where exactly?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

Where exactly?

In the getMethodSig path with the 2 asserts I've changed in this PR to have better messages.

@jkotas

jkotas commented Apr 15, 2024

Copy link
Copy Markdown
Member

The JIT/EE interface methods expect that the context and method should always match. If you are passing mismatched context and method around, it won't work well. I would expect that to hit problems in both AOT and JIT scenarios.

Maybe you need a new method on JIT/EE interface to compute context for a method from more derived type?

@MichalStrehovsky

Copy link
Copy Markdown
Member

NativeAOT/R2R VM doesn't like seeing non shared generic contexts here

Where exactly?

I think something along the lines of this will fix the problem:

diff --git a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs
index 2be89e7374f..07bdb48b21a 100644
--- a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs+++ b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs@@ -1452,7 +1452,14 @@ private void getCallInfo(ref CORINFO_RESOLVED_TOKEN pResolvedToken, CORINFO_RESO
// the method with a method the intrinsic expands into. If it's not the special intrinsic,
// method stays unchanged.
var methodIL = (MethodIL)HandleToObject((void*)pResolvedToken.tokenScope);
- targetMethod = _compilation.ExpandIntrinsicForCallsite(targetMethod, methodIL.OwningMethod);+ MethodDesc callsiteMethod = _compilation.ExpandIntrinsicForCallsite(targetMethod, methodIL.OwningMethod);+ if (targetMethod != callsiteMethod)+ {+ Debug.Assert(!pResult->exactContextNeedsRuntimeLookup);+ Debug.Assert(!callsiteMethod.HasInstantiation && !targetMethod.HasInstantiation);+ pResult->contextHandle = contextFromType(callsiteMethod.OwningType);+ targetMethod = callsiteMethod;+ }
// For multidim array Address method, we pretend the method requires a hidden instantiation argument
// (even though it doesn't need one). We'll actually swap the method out for a differnt one with

I'd undo the assert changes.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Draft Pull Request was automatically closed for 30 days of inactivity. Please let us know if you'd like to reopen it.

@tannergooding

Copy link
Copy Markdown
Member

@MichalPetryka asked for this to be reopened.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MihuBot

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

NativeAOT/R2R VM doesn't like seeing non shared generic contexts here

Where exactly?

I think something along the lines of this will fix the problem:

diff --git a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs
index 2be89e7374f..07bdb48b21a 100644
--- a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs+++ b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs@@ -1452,7 +1452,14 @@ private void getCallInfo(ref CORINFO_RESOLVED_TOKEN pResolvedToken, CORINFO_RESO
// the method with a method the intrinsic expands into. If it's not the special intrinsic,
// method stays unchanged.
var methodIL = (MethodIL)HandleToObject((void*)pResolvedToken.tokenScope);
- targetMethod = _compilation.ExpandIntrinsicForCallsite(targetMethod, methodIL.OwningMethod);+ MethodDesc callsiteMethod = _compilation.ExpandIntrinsicForCallsite(targetMethod, methodIL.OwningMethod);+ if (targetMethod != callsiteMethod)+ {+ Debug.Assert(!pResult->exactContextNeedsRuntimeLookup);+ Debug.Assert(!callsiteMethod.HasInstantiation && !targetMethod.HasInstantiation);+ pResult->contextHandle = contextFromType(callsiteMethod.OwningType);+ targetMethod = callsiteMethod;+ }
// For multidim array Address method, we pretend the method requires a hidden instantiation argument
// (even though it doesn't need one). We'll actually swap the method out for a differnt one with

I'd undo the assert changes.

Seems fine with this, can't say I fully understand how it fixes the issue though.

@MichalPetryka
MichalPetryka marked this pull request as ready for review June 15, 2024 15:00
@MichalPetryka

This comment was marked as resolved.

1 similar comment
@MichalPetryka

This comment was marked as resolved.

@MihuBot

This comment was marked as resolved.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MihuBot merge

@build-analysisbuild-analysisBot mentioned this pull request Jun 15, 2024
@AndyAyersMS

Copy link
Copy Markdown
Member

The diffs from this are very minimal, which is a little surprising. As is I am not sure we should take this change. Either this particular pattern doesn't come up very often, or there is something else inhibiting the JIT from acting on this information.

You should consider trying to instrument to see how often this produces a "better" type for the return value, and then look into cases where we have a better return type but no visible impact, and see if there are any blockers.

@JulieLeeMSFT

Copy link
Copy Markdown
Member

Ping @MichalPetryka on where you are on this PR and if you will address the feedback from andyayersMS.

@JulieLeeMSFTJulieLeeMSFT added the needs-author-action An issue or pull request that requires more info or actions from the author. label Jul 22, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

This pull request has been automatically marked no-recent-activity because it has not had any activity for 14 days. It will be closed if no further activity occurs within 14 more days. Any new comment (by anyone, not necessarily the author) will remove no-recent-activity.

@JulieLeeMSFTJulieLeeMSFT added this to the 10.0.0 milestone Aug 12, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

This pull request will now be closed since it had been marked no-recent-activity but received no further activity in the past 14 days. It is still possible to reopen or comment on the pull request, but please note that it will be locked if it remains inactive for another 30 days.

@dotnet-policy-servicedotnet-policy-serviceBot removed this from the 10.0.0 milestone Aug 26, 2024
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Sep 28, 2024
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 memberneeds-author-actionAn issue or pull request that requires more info or actions from the author.no-recent-activity

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@MichalPetryka@AndyAyersMS@jkotas@MichalStrehovsky@tannergooding@MihuBot@JulieLeeMSFT
, '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

Return type from exact method context for call returns - #100041

Closed
MichalPetryka wants to merge 9 commits into
dotnet:mainfrom
MichalPetryka:return-context
Closed

Return type from exact method context for call returns#100041
MichalPetryka wants to merge 9 commits into
dotnet:mainfrom
MichalPetryka:return-context

Conversation

@MichalPetryka

@MichalPetrykaMichalPetryka commented Mar 20, 2024

Copy link
Copy Markdown
Contributor

This should let us devirtualize and inline more calls due to seeing the real type in variables instead of _Canon.

I've reused the existing LateDevirtualizationInfo for this and enabled storing it for non virtual calls too, it seemed safe as far as I've seen as all other places still checked IsVirtual before using it.

@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Mar 20, 2024
@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MihuBot

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

@AndyAyersMS

Copy link
Copy Markdown
Member

@MichalPetryka what's the status of this PR?

@MichalPetryka

MichalPetryka commented Apr 12, 2024

Copy link
Copy Markdown
ContributorAuthor

@MichalPetryka what's the status of this PR?

NativeAOT/R2R VM doesn't like seeing non shared generic contexts here and iirc my last discussion about it with @MichalStrehovsky ended up with me asking whether that VM should be changed to behave like coreclr or if the JIT should check stuff here.

@jkotas

Copy link
Copy Markdown
Member

NativeAOT/R2R VM doesn't like seeing non shared generic contexts here

Where exactly?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

Where exactly?

In the getMethodSig path with the 2 asserts I've changed in this PR to have better messages.

@jkotas

jkotas commented Apr 15, 2024

Copy link
Copy Markdown
Member

The JIT/EE interface methods expect that the context and method should always match. If you are passing mismatched context and method around, it won't work well. I would expect that to hit problems in both AOT and JIT scenarios.

Maybe you need a new method on JIT/EE interface to compute context for a method from more derived type?

@MichalStrehovsky

Copy link
Copy Markdown
Member

NativeAOT/R2R VM doesn't like seeing non shared generic contexts here

Where exactly?

I think something along the lines of this will fix the problem:

diff --git a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs
index 2be89e7374f..07bdb48b21a 100644
--- a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs+++ b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs@@ -1452,7 +1452,14 @@ private void getCallInfo(ref CORINFO_RESOLVED_TOKEN pResolvedToken, CORINFO_RESO
// the method with a method the intrinsic expands into. If it's not the special intrinsic,
// method stays unchanged.
var methodIL = (MethodIL)HandleToObject((void*)pResolvedToken.tokenScope);
- targetMethod = _compilation.ExpandIntrinsicForCallsite(targetMethod, methodIL.OwningMethod);+ MethodDesc callsiteMethod = _compilation.ExpandIntrinsicForCallsite(targetMethod, methodIL.OwningMethod);+ if (targetMethod != callsiteMethod)+ {+ Debug.Assert(!pResult->exactContextNeedsRuntimeLookup);+ Debug.Assert(!callsiteMethod.HasInstantiation && !targetMethod.HasInstantiation);+ pResult->contextHandle = contextFromType(callsiteMethod.OwningType);+ targetMethod = callsiteMethod;+ }
// For multidim array Address method, we pretend the method requires a hidden instantiation argument
// (even though it doesn't need one). We'll actually swap the method out for a differnt one with

I'd undo the assert changes.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Draft Pull Request was automatically closed for 30 days of inactivity. Please let us know if you'd like to reopen it.

@tannergooding

Copy link
Copy Markdown
Member

@MichalPetryka asked for this to be reopened.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MihuBot

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

NativeAOT/R2R VM doesn't like seeing non shared generic contexts here

Where exactly?

I think something along the lines of this will fix the problem:

diff --git a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs
index 2be89e7374f..07bdb48b21a 100644
--- a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs+++ b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs@@ -1452,7 +1452,14 @@ private void getCallInfo(ref CORINFO_RESOLVED_TOKEN pResolvedToken, CORINFO_RESO
// the method with a method the intrinsic expands into. If it's not the special intrinsic,
// method stays unchanged.
var methodIL = (MethodIL)HandleToObject((void*)pResolvedToken.tokenScope);
- targetMethod = _compilation.ExpandIntrinsicForCallsite(targetMethod, methodIL.OwningMethod);+ MethodDesc callsiteMethod = _compilation.ExpandIntrinsicForCallsite(targetMethod, methodIL.OwningMethod);+ if (targetMethod != callsiteMethod)+ {+ Debug.Assert(!pResult->exactContextNeedsRuntimeLookup);+ Debug.Assert(!callsiteMethod.HasInstantiation && !targetMethod.HasInstantiation);+ pResult->contextHandle = contextFromType(callsiteMethod.OwningType);+ targetMethod = callsiteMethod;+ }
// For multidim array Address method, we pretend the method requires a hidden instantiation argument
// (even though it doesn't need one). We'll actually swap the method out for a differnt one with

I'd undo the assert changes.

Seems fine with this, can't say I fully understand how it fixes the issue though.

@MichalPetryka
MichalPetryka marked this pull request as ready for review June 15, 2024 15:00
@MichalPetryka

This comment was marked as resolved.

1 similar comment
@MichalPetryka

This comment was marked as resolved.

@MihuBot

This comment was marked as resolved.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MihuBot merge

@build-analysisbuild-analysisBot mentioned this pull request Jun 15, 2024
@AndyAyersMS

Copy link
Copy Markdown
Member

The diffs from this are very minimal, which is a little surprising. As is I am not sure we should take this change. Either this particular pattern doesn't come up very often, or there is something else inhibiting the JIT from acting on this information.

You should consider trying to instrument to see how often this produces a "better" type for the return value, and then look into cases where we have a better return type but no visible impact, and see if there are any blockers.

@JulieLeeMSFT

Copy link
Copy Markdown
Member

Ping @MichalPetryka on where you are on this PR and if you will address the feedback from andyayersMS.

@JulieLeeMSFTJulieLeeMSFT added the needs-author-action An issue or pull request that requires more info or actions from the author. label Jul 22, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

This pull request has been automatically marked no-recent-activity because it has not had any activity for 14 days. It will be closed if no further activity occurs within 14 more days. Any new comment (by anyone, not necessarily the author) will remove no-recent-activity.

@JulieLeeMSFTJulieLeeMSFT added this to the 10.0.0 milestone Aug 12, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

This pull request will now be closed since it had been marked no-recent-activity but received no further activity in the past 14 days. It is still possible to reopen or comment on the pull request, but please note that it will be locked if it remains inactive for another 30 days.

@dotnet-policy-servicedotnet-policy-serviceBot removed this from the 10.0.0 milestone Aug 26, 2024
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Sep 28, 2024
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 memberneeds-author-actionAn issue or pull request that requires more info or actions from the author.no-recent-activity

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@MichalPetryka@AndyAyersMS@jkotas@MichalStrehovsky@tannergooding@MihuBot@JulieLeeMSFT
, '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

Return type from exact method context for call returns - #100041

Closed
MichalPetryka wants to merge 9 commits into
dotnet:mainfrom
MichalPetryka:return-context
Closed

Return type from exact method context for call returns#100041
MichalPetryka wants to merge 9 commits into
dotnet:mainfrom
MichalPetryka:return-context

Conversation

@MichalPetryka

@MichalPetrykaMichalPetryka commented Mar 20, 2024

Copy link
Copy Markdown
Contributor

This should let us devirtualize and inline more calls due to seeing the real type in variables instead of _Canon.

I've reused the existing LateDevirtualizationInfo for this and enabled storing it for non virtual calls too, it seemed safe as far as I've seen as all other places still checked IsVirtual before using it.

@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Mar 20, 2024
@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MihuBot

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

@AndyAyersMS

Copy link
Copy Markdown
Member

@MichalPetryka what's the status of this PR?

@MichalPetryka

MichalPetryka commented Apr 12, 2024

Copy link
Copy Markdown
ContributorAuthor

@MichalPetryka what's the status of this PR?

NativeAOT/R2R VM doesn't like seeing non shared generic contexts here and iirc my last discussion about it with @MichalStrehovsky ended up with me asking whether that VM should be changed to behave like coreclr or if the JIT should check stuff here.

@jkotas

Copy link
Copy Markdown
Member

NativeAOT/R2R VM doesn't like seeing non shared generic contexts here

Where exactly?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

Where exactly?

In the getMethodSig path with the 2 asserts I've changed in this PR to have better messages.

@jkotas

jkotas commented Apr 15, 2024

Copy link
Copy Markdown
Member

The JIT/EE interface methods expect that the context and method should always match. If you are passing mismatched context and method around, it won't work well. I would expect that to hit problems in both AOT and JIT scenarios.

Maybe you need a new method on JIT/EE interface to compute context for a method from more derived type?

@MichalStrehovsky

Copy link
Copy Markdown
Member

NativeAOT/R2R VM doesn't like seeing non shared generic contexts here

Where exactly?

I think something along the lines of this will fix the problem:

diff --git a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs
index 2be89e7374f..07bdb48b21a 100644
--- a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs+++ b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs@@ -1452,7 +1452,14 @@ private void getCallInfo(ref CORINFO_RESOLVED_TOKEN pResolvedToken, CORINFO_RESO
// the method with a method the intrinsic expands into. If it's not the special intrinsic,
// method stays unchanged.
var methodIL = (MethodIL)HandleToObject((void*)pResolvedToken.tokenScope);
- targetMethod = _compilation.ExpandIntrinsicForCallsite(targetMethod, methodIL.OwningMethod);+ MethodDesc callsiteMethod = _compilation.ExpandIntrinsicForCallsite(targetMethod, methodIL.OwningMethod);+ if (targetMethod != callsiteMethod)+ {+ Debug.Assert(!pResult->exactContextNeedsRuntimeLookup);+ Debug.Assert(!callsiteMethod.HasInstantiation && !targetMethod.HasInstantiation);+ pResult->contextHandle = contextFromType(callsiteMethod.OwningType);+ targetMethod = callsiteMethod;+ }
// For multidim array Address method, we pretend the method requires a hidden instantiation argument
// (even though it doesn't need one). We'll actually swap the method out for a differnt one with

I'd undo the assert changes.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Draft Pull Request was automatically closed for 30 days of inactivity. Please let us know if you'd like to reopen it.

@tannergooding

Copy link
Copy Markdown
Member

@MichalPetryka asked for this to be reopened.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MihuBot

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

NativeAOT/R2R VM doesn't like seeing non shared generic contexts here

Where exactly?

I think something along the lines of this will fix the problem:

diff --git a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs
index 2be89e7374f..07bdb48b21a 100644
--- a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs+++ b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs@@ -1452,7 +1452,14 @@ private void getCallInfo(ref CORINFO_RESOLVED_TOKEN pResolvedToken, CORINFO_RESO
// the method with a method the intrinsic expands into. If it's not the special intrinsic,
// method stays unchanged.
var methodIL = (MethodIL)HandleToObject((void*)pResolvedToken.tokenScope);
- targetMethod = _compilation.ExpandIntrinsicForCallsite(targetMethod, methodIL.OwningMethod);+ MethodDesc callsiteMethod = _compilation.ExpandIntrinsicForCallsite(targetMethod, methodIL.OwningMethod);+ if (targetMethod != callsiteMethod)+ {+ Debug.Assert(!pResult->exactContextNeedsRuntimeLookup);+ Debug.Assert(!callsiteMethod.HasInstantiation && !targetMethod.HasInstantiation);+ pResult->contextHandle = contextFromType(callsiteMethod.OwningType);+ targetMethod = callsiteMethod;+ }
// For multidim array Address method, we pretend the method requires a hidden instantiation argument
// (even though it doesn't need one). We'll actually swap the method out for a differnt one with

I'd undo the assert changes.

Seems fine with this, can't say I fully understand how it fixes the issue though.

@MichalPetryka
MichalPetryka marked this pull request as ready for review June 15, 2024 15:00
@MichalPetryka

This comment was marked as resolved.

1 similar comment
@MichalPetryka

This comment was marked as resolved.

@MihuBot

This comment was marked as resolved.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MihuBot merge

@build-analysisbuild-analysisBot mentioned this pull request Jun 15, 2024
@AndyAyersMS

Copy link
Copy Markdown
Member

The diffs from this are very minimal, which is a little surprising. As is I am not sure we should take this change. Either this particular pattern doesn't come up very often, or there is something else inhibiting the JIT from acting on this information.

You should consider trying to instrument to see how often this produces a "better" type for the return value, and then look into cases where we have a better return type but no visible impact, and see if there are any blockers.

@JulieLeeMSFT

Copy link
Copy Markdown
Member

Ping @MichalPetryka on where you are on this PR and if you will address the feedback from andyayersMS.

@JulieLeeMSFTJulieLeeMSFT added the needs-author-action An issue or pull request that requires more info or actions from the author. label Jul 22, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

This pull request has been automatically marked no-recent-activity because it has not had any activity for 14 days. It will be closed if no further activity occurs within 14 more days. Any new comment (by anyone, not necessarily the author) will remove no-recent-activity.

@JulieLeeMSFTJulieLeeMSFT added this to the 10.0.0 milestone Aug 12, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

This pull request will now be closed since it had been marked no-recent-activity but received no further activity in the past 14 days. It is still possible to reopen or comment on the pull request, but please note that it will be locked if it remains inactive for another 30 days.

@dotnet-policy-servicedotnet-policy-serviceBot removed this from the 10.0.0 milestone Aug 26, 2024
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Sep 28, 2024
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 memberneeds-author-actionAn issue or pull request that requires more info or actions from the author.no-recent-activity

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@MichalPetryka@AndyAyersMS@jkotas@MichalStrehovsky@tannergooding@MihuBot@JulieLeeMSFT
, '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

Return type from exact method context for call returns - #100041

Closed
MichalPetryka wants to merge 9 commits into
dotnet:mainfrom
MichalPetryka:return-context
Closed

Return type from exact method context for call returns#100041
MichalPetryka wants to merge 9 commits into
dotnet:mainfrom
MichalPetryka:return-context

Conversation

@MichalPetryka

@MichalPetrykaMichalPetryka commented Mar 20, 2024

Copy link
Copy Markdown
Contributor

This should let us devirtualize and inline more calls due to seeing the real type in variables instead of _Canon.

I've reused the existing LateDevirtualizationInfo for this and enabled storing it for non virtual calls too, it seemed safe as far as I've seen as all other places still checked IsVirtual before using it.

@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Mar 20, 2024
@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MihuBot

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

@AndyAyersMS

Copy link
Copy Markdown
Member

@MichalPetryka what's the status of this PR?

@MichalPetryka

MichalPetryka commented Apr 12, 2024

Copy link
Copy Markdown
ContributorAuthor

@MichalPetryka what's the status of this PR?

NativeAOT/R2R VM doesn't like seeing non shared generic contexts here and iirc my last discussion about it with @MichalStrehovsky ended up with me asking whether that VM should be changed to behave like coreclr or if the JIT should check stuff here.

@jkotas

Copy link
Copy Markdown
Member

NativeAOT/R2R VM doesn't like seeing non shared generic contexts here

Where exactly?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

Where exactly?

In the getMethodSig path with the 2 asserts I've changed in this PR to have better messages.

@jkotas

jkotas commented Apr 15, 2024

Copy link
Copy Markdown
Member

The JIT/EE interface methods expect that the context and method should always match. If you are passing mismatched context and method around, it won't work well. I would expect that to hit problems in both AOT and JIT scenarios.

Maybe you need a new method on JIT/EE interface to compute context for a method from more derived type?

@MichalStrehovsky

Copy link
Copy Markdown
Member

NativeAOT/R2R VM doesn't like seeing non shared generic contexts here

Where exactly?

I think something along the lines of this will fix the problem:

diff --git a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs
index 2be89e7374f..07bdb48b21a 100644
--- a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs+++ b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs@@ -1452,7 +1452,14 @@ private void getCallInfo(ref CORINFO_RESOLVED_TOKEN pResolvedToken, CORINFO_RESO
// the method with a method the intrinsic expands into. If it's not the special intrinsic,
// method stays unchanged.
var methodIL = (MethodIL)HandleToObject((void*)pResolvedToken.tokenScope);
- targetMethod = _compilation.ExpandIntrinsicForCallsite(targetMethod, methodIL.OwningMethod);+ MethodDesc callsiteMethod = _compilation.ExpandIntrinsicForCallsite(targetMethod, methodIL.OwningMethod);+ if (targetMethod != callsiteMethod)+ {+ Debug.Assert(!pResult->exactContextNeedsRuntimeLookup);+ Debug.Assert(!callsiteMethod.HasInstantiation && !targetMethod.HasInstantiation);+ pResult->contextHandle = contextFromType(callsiteMethod.OwningType);+ targetMethod = callsiteMethod;+ }
// For multidim array Address method, we pretend the method requires a hidden instantiation argument
// (even though it doesn't need one). We'll actually swap the method out for a differnt one with

I'd undo the assert changes.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Draft Pull Request was automatically closed for 30 days of inactivity. Please let us know if you'd like to reopen it.

@tannergooding

Copy link
Copy Markdown
Member

@MichalPetryka asked for this to be reopened.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MihuBot

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

NativeAOT/R2R VM doesn't like seeing non shared generic contexts here

Where exactly?

I think something along the lines of this will fix the problem:

diff --git a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs
index 2be89e7374f..07bdb48b21a 100644
--- a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs+++ b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs@@ -1452,7 +1452,14 @@ private void getCallInfo(ref CORINFO_RESOLVED_TOKEN pResolvedToken, CORINFO_RESO
// the method with a method the intrinsic expands into. If it's not the special intrinsic,
// method stays unchanged.
var methodIL = (MethodIL)HandleToObject((void*)pResolvedToken.tokenScope);
- targetMethod = _compilation.ExpandIntrinsicForCallsite(targetMethod, methodIL.OwningMethod);+ MethodDesc callsiteMethod = _compilation.ExpandIntrinsicForCallsite(targetMethod, methodIL.OwningMethod);+ if (targetMethod != callsiteMethod)+ {+ Debug.Assert(!pResult->exactContextNeedsRuntimeLookup);+ Debug.Assert(!callsiteMethod.HasInstantiation && !targetMethod.HasInstantiation);+ pResult->contextHandle = contextFromType(callsiteMethod.OwningType);+ targetMethod = callsiteMethod;+ }
// For multidim array Address method, we pretend the method requires a hidden instantiation argument
// (even though it doesn't need one). We'll actually swap the method out for a differnt one with

I'd undo the assert changes.

Seems fine with this, can't say I fully understand how it fixes the issue though.

@MichalPetryka
MichalPetryka marked this pull request as ready for review June 15, 2024 15:00
@MichalPetryka

This comment was marked as resolved.

1 similar comment
@MichalPetryka

This comment was marked as resolved.

@MihuBot

This comment was marked as resolved.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MihuBot merge

@build-analysisbuild-analysisBot mentioned this pull request Jun 15, 2024
@AndyAyersMS

Copy link
Copy Markdown
Member

The diffs from this are very minimal, which is a little surprising. As is I am not sure we should take this change. Either this particular pattern doesn't come up very often, or there is something else inhibiting the JIT from acting on this information.

You should consider trying to instrument to see how often this produces a "better" type for the return value, and then look into cases where we have a better return type but no visible impact, and see if there are any blockers.

@JulieLeeMSFT

Copy link
Copy Markdown
Member

Ping @MichalPetryka on where you are on this PR and if you will address the feedback from andyayersMS.

@JulieLeeMSFTJulieLeeMSFT added the needs-author-action An issue or pull request that requires more info or actions from the author. label Jul 22, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

This pull request has been automatically marked no-recent-activity because it has not had any activity for 14 days. It will be closed if no further activity occurs within 14 more days. Any new comment (by anyone, not necessarily the author) will remove no-recent-activity.

@JulieLeeMSFTJulieLeeMSFT added this to the 10.0.0 milestone Aug 12, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

This pull request will now be closed since it had been marked no-recent-activity but received no further activity in the past 14 days. It is still possible to reopen or comment on the pull request, but please note that it will be locked if it remains inactive for another 30 days.

@dotnet-policy-servicedotnet-policy-serviceBot removed this from the 10.0.0 milestone Aug 26, 2024
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Sep 28, 2024
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 memberneeds-author-actionAn issue or pull request that requires more info or actions from the author.no-recent-activity

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@MichalPetryka@AndyAyersMS@jkotas@MichalStrehovsky@tannergooding@MihuBot@JulieLeeMSFT
, '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

Return type from exact method context for call returns - #100041

Closed
MichalPetryka wants to merge 9 commits into
dotnet:mainfrom
MichalPetryka:return-context
Closed

Return type from exact method context for call returns#100041
MichalPetryka wants to merge 9 commits into
dotnet:mainfrom
MichalPetryka:return-context

Conversation

@MichalPetryka

@MichalPetrykaMichalPetryka commented Mar 20, 2024

Copy link
Copy Markdown
Contributor

This should let us devirtualize and inline more calls due to seeing the real type in variables instead of _Canon.

I've reused the existing LateDevirtualizationInfo for this and enabled storing it for non virtual calls too, it seemed safe as far as I've seen as all other places still checked IsVirtual before using it.

@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Mar 20, 2024
@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MihuBot

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

@AndyAyersMS

Copy link
Copy Markdown
Member

@MichalPetryka what's the status of this PR?

@MichalPetryka

MichalPetryka commented Apr 12, 2024

Copy link
Copy Markdown
ContributorAuthor

@MichalPetryka what's the status of this PR?

NativeAOT/R2R VM doesn't like seeing non shared generic contexts here and iirc my last discussion about it with @MichalStrehovsky ended up with me asking whether that VM should be changed to behave like coreclr or if the JIT should check stuff here.

@jkotas

Copy link
Copy Markdown
Member

NativeAOT/R2R VM doesn't like seeing non shared generic contexts here

Where exactly?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

Where exactly?

In the getMethodSig path with the 2 asserts I've changed in this PR to have better messages.

@jkotas

jkotas commented Apr 15, 2024

Copy link
Copy Markdown
Member

The JIT/EE interface methods expect that the context and method should always match. If you are passing mismatched context and method around, it won't work well. I would expect that to hit problems in both AOT and JIT scenarios.

Maybe you need a new method on JIT/EE interface to compute context for a method from more derived type?

@MichalStrehovsky

Copy link
Copy Markdown
Member

NativeAOT/R2R VM doesn't like seeing non shared generic contexts here

Where exactly?

I think something along the lines of this will fix the problem:

diff --git a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs
index 2be89e7374f..07bdb48b21a 100644
--- a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs+++ b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs@@ -1452,7 +1452,14 @@ private void getCallInfo(ref CORINFO_RESOLVED_TOKEN pResolvedToken, CORINFO_RESO
// the method with a method the intrinsic expands into. If it's not the special intrinsic,
// method stays unchanged.
var methodIL = (MethodIL)HandleToObject((void*)pResolvedToken.tokenScope);
- targetMethod = _compilation.ExpandIntrinsicForCallsite(targetMethod, methodIL.OwningMethod);+ MethodDesc callsiteMethod = _compilation.ExpandIntrinsicForCallsite(targetMethod, methodIL.OwningMethod);+ if (targetMethod != callsiteMethod)+ {+ Debug.Assert(!pResult->exactContextNeedsRuntimeLookup);+ Debug.Assert(!callsiteMethod.HasInstantiation && !targetMethod.HasInstantiation);+ pResult->contextHandle = contextFromType(callsiteMethod.OwningType);+ targetMethod = callsiteMethod;+ }
// For multidim array Address method, we pretend the method requires a hidden instantiation argument
// (even though it doesn't need one). We'll actually swap the method out for a differnt one with

I'd undo the assert changes.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Draft Pull Request was automatically closed for 30 days of inactivity. Please let us know if you'd like to reopen it.

@tannergooding

Copy link
Copy Markdown
Member

@MichalPetryka asked for this to be reopened.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MihuBot

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

NativeAOT/R2R VM doesn't like seeing non shared generic contexts here

Where exactly?

I think something along the lines of this will fix the problem:

diff --git a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs
index 2be89e7374f..07bdb48b21a 100644
--- a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs+++ b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs@@ -1452,7 +1452,14 @@ private void getCallInfo(ref CORINFO_RESOLVED_TOKEN pResolvedToken, CORINFO_RESO
// the method with a method the intrinsic expands into. If it's not the special intrinsic,
// method stays unchanged.
var methodIL = (MethodIL)HandleToObject((void*)pResolvedToken.tokenScope);
- targetMethod = _compilation.ExpandIntrinsicForCallsite(targetMethod, methodIL.OwningMethod);+ MethodDesc callsiteMethod = _compilation.ExpandIntrinsicForCallsite(targetMethod, methodIL.OwningMethod);+ if (targetMethod != callsiteMethod)+ {+ Debug.Assert(!pResult->exactContextNeedsRuntimeLookup);+ Debug.Assert(!callsiteMethod.HasInstantiation && !targetMethod.HasInstantiation);+ pResult->contextHandle = contextFromType(callsiteMethod.OwningType);+ targetMethod = callsiteMethod;+ }
// For multidim array Address method, we pretend the method requires a hidden instantiation argument
// (even though it doesn't need one). We'll actually swap the method out for a differnt one with

I'd undo the assert changes.

Seems fine with this, can't say I fully understand how it fixes the issue though.

@MichalPetryka
MichalPetryka marked this pull request as ready for review June 15, 2024 15:00
@MichalPetryka

This comment was marked as resolved.

1 similar comment
@MichalPetryka

This comment was marked as resolved.

@MihuBot

This comment was marked as resolved.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MihuBot merge

@build-analysisbuild-analysisBot mentioned this pull request Jun 15, 2024
@AndyAyersMS

Copy link
Copy Markdown
Member

The diffs from this are very minimal, which is a little surprising. As is I am not sure we should take this change. Either this particular pattern doesn't come up very often, or there is something else inhibiting the JIT from acting on this information.

You should consider trying to instrument to see how often this produces a "better" type for the return value, and then look into cases where we have a better return type but no visible impact, and see if there are any blockers.

@JulieLeeMSFT

Copy link
Copy Markdown
Member

Ping @MichalPetryka on where you are on this PR and if you will address the feedback from andyayersMS.

@JulieLeeMSFTJulieLeeMSFT added the needs-author-action An issue or pull request that requires more info or actions from the author. label Jul 22, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

This pull request has been automatically marked no-recent-activity because it has not had any activity for 14 days. It will be closed if no further activity occurs within 14 more days. Any new comment (by anyone, not necessarily the author) will remove no-recent-activity.

@JulieLeeMSFTJulieLeeMSFT added this to the 10.0.0 milestone Aug 12, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

This pull request will now be closed since it had been marked no-recent-activity but received no further activity in the past 14 days. It is still possible to reopen or comment on the pull request, but please note that it will be locked if it remains inactive for another 30 days.

@dotnet-policy-servicedotnet-policy-serviceBot removed this from the 10.0.0 milestone Aug 26, 2024
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Sep 28, 2024
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 memberneeds-author-actionAn issue or pull request that requires more info or actions from the author.no-recent-activity

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@MichalPetryka@AndyAyersMS@jkotas@MichalStrehovsky@tannergooding@MihuBot@JulieLeeMSFT
, '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

Return type from exact method context for call returns - #100041

Closed
MichalPetryka wants to merge 9 commits into
dotnet:mainfrom
MichalPetryka:return-context
Closed

Return type from exact method context for call returns#100041
MichalPetryka wants to merge 9 commits into
dotnet:mainfrom
MichalPetryka:return-context

Conversation

@MichalPetryka

@MichalPetrykaMichalPetryka commented Mar 20, 2024

Copy link
Copy Markdown
Contributor

This should let us devirtualize and inline more calls due to seeing the real type in variables instead of _Canon.

I've reused the existing LateDevirtualizationInfo for this and enabled storing it for non virtual calls too, it seemed safe as far as I've seen as all other places still checked IsVirtual before using it.

@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Mar 20, 2024
@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MihuBot

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

@AndyAyersMS

Copy link
Copy Markdown
Member

@MichalPetryka what's the status of this PR?

@MichalPetryka

MichalPetryka commented Apr 12, 2024

Copy link
Copy Markdown
ContributorAuthor

@MichalPetryka what's the status of this PR?

NativeAOT/R2R VM doesn't like seeing non shared generic contexts here and iirc my last discussion about it with @MichalStrehovsky ended up with me asking whether that VM should be changed to behave like coreclr or if the JIT should check stuff here.

@jkotas

Copy link
Copy Markdown
Member

NativeAOT/R2R VM doesn't like seeing non shared generic contexts here

Where exactly?

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

Where exactly?

In the getMethodSig path with the 2 asserts I've changed in this PR to have better messages.

@jkotas

jkotas commented Apr 15, 2024

Copy link
Copy Markdown
Member

The JIT/EE interface methods expect that the context and method should always match. If you are passing mismatched context and method around, it won't work well. I would expect that to hit problems in both AOT and JIT scenarios.

Maybe you need a new method on JIT/EE interface to compute context for a method from more derived type?

@MichalStrehovsky

Copy link
Copy Markdown
Member

NativeAOT/R2R VM doesn't like seeing non shared generic contexts here

Where exactly?

I think something along the lines of this will fix the problem:

diff --git a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs
index 2be89e7374f..07bdb48b21a 100644
--- a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs+++ b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs@@ -1452,7 +1452,14 @@ private void getCallInfo(ref CORINFO_RESOLVED_TOKEN pResolvedToken, CORINFO_RESO
// the method with a method the intrinsic expands into. If it's not the special intrinsic,
// method stays unchanged.
var methodIL = (MethodIL)HandleToObject((void*)pResolvedToken.tokenScope);
- targetMethod = _compilation.ExpandIntrinsicForCallsite(targetMethod, methodIL.OwningMethod);+ MethodDesc callsiteMethod = _compilation.ExpandIntrinsicForCallsite(targetMethod, methodIL.OwningMethod);+ if (targetMethod != callsiteMethod)+ {+ Debug.Assert(!pResult->exactContextNeedsRuntimeLookup);+ Debug.Assert(!callsiteMethod.HasInstantiation && !targetMethod.HasInstantiation);+ pResult->contextHandle = contextFromType(callsiteMethod.OwningType);+ targetMethod = callsiteMethod;+ }
// For multidim array Address method, we pretend the method requires a hidden instantiation argument
// (even though it doesn't need one). We'll actually swap the method out for a differnt one with

I'd undo the assert changes.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Draft Pull Request was automatically closed for 30 days of inactivity. Please let us know if you'd like to reopen it.

@tannergooding

Copy link
Copy Markdown
Member

@MichalPetryka asked for this to be reopened.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MihuBot

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

NativeAOT/R2R VM doesn't like seeing non shared generic contexts here

Where exactly?

I think something along the lines of this will fix the problem:

diff --git a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs
index 2be89e7374f..07bdb48b21a 100644
--- a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs+++ b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs@@ -1452,7 +1452,14 @@ private void getCallInfo(ref CORINFO_RESOLVED_TOKEN pResolvedToken, CORINFO_RESO
// the method with a method the intrinsic expands into. If it's not the special intrinsic,
// method stays unchanged.
var methodIL = (MethodIL)HandleToObject((void*)pResolvedToken.tokenScope);
- targetMethod = _compilation.ExpandIntrinsicForCallsite(targetMethod, methodIL.OwningMethod);+ MethodDesc callsiteMethod = _compilation.ExpandIntrinsicForCallsite(targetMethod, methodIL.OwningMethod);+ if (targetMethod != callsiteMethod)+ {+ Debug.Assert(!pResult->exactContextNeedsRuntimeLookup);+ Debug.Assert(!callsiteMethod.HasInstantiation && !targetMethod.HasInstantiation);+ pResult->contextHandle = contextFromType(callsiteMethod.OwningType);+ targetMethod = callsiteMethod;+ }
// For multidim array Address method, we pretend the method requires a hidden instantiation argument
// (even though it doesn't need one). We'll actually swap the method out for a differnt one with

I'd undo the assert changes.

Seems fine with this, can't say I fully understand how it fixes the issue though.

@MichalPetryka
MichalPetryka marked this pull request as ready for review June 15, 2024 15:00
@MichalPetryka

This comment was marked as resolved.

1 similar comment
@MichalPetryka

This comment was marked as resolved.

@MihuBot

This comment was marked as resolved.

@MichalPetryka

Copy link
Copy Markdown
ContributorAuthor

@MihuBot merge

@build-analysisbuild-analysisBot mentioned this pull request Jun 15, 2024
@AndyAyersMS

Copy link
Copy Markdown
Member

The diffs from this are very minimal, which is a little surprising. As is I am not sure we should take this change. Either this particular pattern doesn't come up very often, or there is something else inhibiting the JIT from acting on this information.

You should consider trying to instrument to see how often this produces a "better" type for the return value, and then look into cases where we have a better return type but no visible impact, and see if there are any blockers.

@JulieLeeMSFT

Copy link
Copy Markdown
Member

Ping @MichalPetryka on where you are on this PR and if you will address the feedback from andyayersMS.

@JulieLeeMSFTJulieLeeMSFT added the needs-author-action An issue or pull request that requires more info or actions from the author. label Jul 22, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

This pull request has been automatically marked no-recent-activity because it has not had any activity for 14 days. It will be closed if no further activity occurs within 14 more days. Any new comment (by anyone, not necessarily the author) will remove no-recent-activity.

@JulieLeeMSFTJulieLeeMSFT added this to the 10.0.0 milestone Aug 12, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

This pull request will now be closed since it had been marked no-recent-activity but received no further activity in the past 14 days. It is still possible to reopen or comment on the pull request, but please note that it will be locked if it remains inactive for another 30 days.

@dotnet-policy-servicedotnet-policy-serviceBot removed this from the 10.0.0 milestone Aug 26, 2024
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Sep 28, 2024
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 memberneeds-author-actionAn issue or pull request that requires more info or actions from the author.no-recent-activity

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@MichalPetryka@AndyAyersMS@jkotas@MichalStrehovsky@tannergooding@MihuBot@JulieLeeMSFT