Transform STRUCT-typed uses of primitives in local morph - #78131

Merged
jakobbotsch merged 8 commits into
dotnet:mainfrom
SingleAccretion:LclMorph-StructUse-Upstream
Nov 30, 2022
Merged

Transform STRUCT-typed uses of primitives in local morph#78131
jakobbotsch merged 8 commits into
dotnet:mainfrom
SingleAccretion:LclMorph-StructUse-Upstream

Conversation

@SingleAccretion

@SingleAccretionSingleAccretion commented Nov 9, 2022

Copy link
Copy Markdown
Contributor

And update global morph accordingly. This mainly involves not DNER-ing struct local fields right away, but waiting for global morph to do this, after it has had a chance to transform the field into an LCL_VAR.

Diffs are a bit mixed, due to requiring the substitution workaround but generally positive, and overall minor. The larger regressions in tests are due to us setting some DNERs later, thus expanding things into field-by-field copies more.

Note: this change is best reviewed with the "don't show whitespace diffs" setting.

@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 Nov 9, 2022
@SingleAccretionSingleAccretion mentioned this pull request Nov 9, 2022
@ghost

ghost commented Nov 9, 2022

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

And update global morph accordingly. This mainly involves giving not DNER-ing local fields right away, but waiting for global morph to do this, after it has had a chance to transform the field into an LCL_VAR.

Diffs are a bit mixed, due to requiring the substitution workaround but generally positive, and overall minor.

Author:SingleAccretion
Assignees:-
Labels:

area-CodeGen-coreclr, community-contribution

Milestone:-

@SingleAccretion
SingleAccretionforce-pushed the LclMorph-StructUse-Upstream branch from 0c36c00 to c911fd2CompareNovember 9, 2022 21:33
@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

This now depends on #76491.

@SingleAccretion
SingleAccretionforce-pushed the LclMorph-StructUse-Upstream branch from f532bc1 to 733af07CompareNovember 10, 2022 17:02
@SingleAccretion
SingleAccretionforce-pushed the LclMorph-StructUse-Upstream branch from 733af07 to c4fe2f5CompareNovember 11, 2022 13:40
@SingleAccretion
SingleAccretionforce-pushed the LclMorph-StructUse-Upstream branch from c4fe2f5 to 320cb8aCompareNovember 11, 2022 17:09
@SingleAccretion
SingleAccretion marked this pull request as ready for review November 11, 2022 21:16
@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

This is ready for review, but still depends on #76491.

@dotnet/jit-contrib

@BruceForstall

Copy link
Copy Markdown
Contributor

@SingleAccretion Needs conflict resolution

@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

Needs conflict resolution

Also done.

@jakobbotsch

Copy link
Copy Markdown
Member

/azp run runtime-coreclr superpmi-diffs, runtime-coreclr jitstress, runtime-coreclr libraries-jitstress

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 3 pipeline(s).

@SingleAccretion

SingleAccretion commented Nov 29, 2022

Copy link
Copy Markdown
ContributorAuthor

Libraries stress failures are #78909 and #78912.

@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

Stress failures:

  1. TypeGeneratorTests400-499: https://helixre107v0xdeko0k025g8.blob.core.windows.net/dotnet-runtime-refs-pull-78131-merge-7d3e4ae48c114120a0/TypeGeneratorTests400-499/1/console.0f672ed5.log?helixlogtype=result - looks to have passed actually?
12:46:58.844 Passed test: Loader/classloader/TypeGeneratorTests/TypeGeneratorTest499/Generated499/Generated499.dll
Expected: 100
Actual: 100
END EXECUTION - PASSED
+ export _commandExitCode=0
+ /usr/bin/python3 /datadisks/disk1/work/AF3D0989/p/reporter/run.py https://dev.azure.com/dnceng-public/ public 2032048 eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Im9PdmN6NU1fN3AtSGpJS2xGWHo5M3VfVjBabyJ9.eyJuYW1laWQiOiJjNzczZjJjMi01MTIwLTQyMDctYWZlMi1hZmFmMzVhOGJjMGEiLCJzY3AiOiJhcHBfdG9rZW4iLCJhdWkiOiJmMjgxYjY5ZS0xYjAzLTRiOWEtYWEyMy0xYzA4YWFhMzRjNTMiLCJzaWQiOiIzNTc3ODYxMS0yNjgxLTRhNTQtYTBkOC1lYWY2MjBhNzE2NTQiLCJCdWlsZElkIjoiY2JiMTgyNjEtYzQ4Zi00YWJiLTg2NTEtOGNkY2I1NDc0NjQ5Ozk1OTg0IiwicHBpZCI6InZzdGZzOi8vL0J1aWxkL0J1aWxkLzk1OTg0Iiwib3JjaGlkIjoiMTEzYzBmZmUtNjg4ZS00OWYxLWIwMDEtZTNhYTM0ODJkZTA1LmJ1aWxkLnJ1bl90ZXN0X3AxX19saW51eF94NjRfY2hlY2tlZC5fX2RlZmF1bHQiLCJyZXBvSWRzIjoiIiwiaXNzIjoiYXBwLnZzdG9rZW4udmlzdWFsc3R1ZGlvLmNvbSIsImF1ZCI6ImFwcC52c3Rva2VuLnZpc3VhbHN0dWRpby5jb218dnNvOjZmY2M5MmU1LTczYTctNGY4OC04ZDEzLWQ5MDQ1YjQ1ZmIyNyIsIm5iZiI6MTY2OTcyMjIxMSwiZXhwIjoxNjY5NzQ2ODExfQ.Sll8uONVwy9ZF9KTir7KbsJEDJ1UOe-vCIk4fL6oQfD52TnPQk082mPT1YKXwTrUuE0xSxNS7ehaYTSH5CGUN-RVDJDkgiJauEH6CLZvnNQrKJySShBowW7azSX7X_XYcpOT8-XafcEKFr_x1r-VUTgbl_GviHcFCTCv-KnHHOqIsj1Ma8DJRUzX3Lax12F2coGlh-ogqt8vm566VBsgTK6lUmJJuMXL3FceWGvVJUnpjdLYdtYcMIvU3s8o2_CE5zIWeVNH7GeqDEAW4afcydK9bQTmDxfffsWiT3zlhp0BO3BGlEZPrg5by-JVspcr30yakIn5YbrYLWmns4vmNg
Killed
['TypeGeneratorTests400-499' END OF WORK ITEM LOG: Command timed out, and was killed]
  1. JIT\\Regression\\JitBlue\\Runtime_63354\\Runtime_63354\\Runtime_63354.cmd, x86: Test failure JIT\\Regression\\JitBlue\\Runtime_63354\\Runtime_63354\\Runtime_63354.cmd #78898.

@jakobbotschjakobbotsch left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Looks great to me, very nice to no longer have to think about these cases after local morph.
Are you going to optimize other uses (e.g. the liveness change we discussed) in a follow-up?

@jakobbotsch
jakobbotsch merged commit be7030f into dotnet:mainNov 30, 2022
@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

Are you going to optimize other uses (e.g. the liveness change we discussed) in a follow-up?

Yep.

@SingleAccretion
SingleAccretion deleted the LclMorph-StructUse-Upstream branch November 30, 2022 13:40
@ghostghost locked as resolved and limited conversation to collaborators Dec 30, 2022
@JulieLeeMSFT

JulieLeeMSFT commented Aug 27, 2024

Copy link
Copy Markdown
Member

Hi @SingleAccretion, we are trying to clean up TODO comments. You touched this part of the code in this PR,

// TODO: support `genReturnBB != nullptr`, it requires #11413 to avoid `Incompatible types for
// gtNewTempStore`.
if (canFold && (genReturnBB == nullptr))
{
// Fold even if types do not match, lowering will handle it. This allows the local
// to remain DNER-free and be enregistered.
assert(lclFld->GetLclOffs() == 0);
lclFld->ChangeType(varDsc->TypeGet());
lclFld->SetOper(GT_LCL_VAR);
}
elseif (!varDsc->lvDoNotEnregister)
{
lvaSetVarDoNotEnregister(lclNum DEBUGARG(DoNotEnregisterReason::BlockOpRet));
}
. Our team members do not have much context on it, so I wanted to ask you if you know what to do to support genReturnBB != nullptr.
#11413 is now supported.

 // TODO: support `genReturnBB != nullptr`, it requires #11413 to avoid `Incompatible types for
// gtNewTempStore`.
if (canFold && (genReturnBB == nullptr))
{
// Fold even if types do not match, lowering will handle it. This allows the local
// to remain DNER-free and be enregistered.
assert(lclFld->GetLclOffs() == 0);
lclFld->ChangeType(varDsc->TypeGet());
lclFld->SetOper(GT_LCL_VAR);
}
else if (!varDsc->lvDoNotEnregister)
{
lvaSetVarDoNotEnregister(lclNum DEBUGARG(DoNotEnregisterReason::BlockOpRet));
}

@JulieLeeMSFT

Copy link
Copy Markdown
Member

BTW, the bitconverter instructions from #11413 does not hit this code path.

@dotnetdotnet unlocked this conversation Aug 27, 2024
@SingleAccretion

SingleAccretion commented Aug 27, 2024

Copy link
Copy Markdown
ContributorAuthor

I wanted to ask you if you know what to do to support genReturnBB != nullptr

@JulieLeeMSFT it requires removing the property that allows "ABI-compatible" types under a GT_RETURN node in HIR. What the comment is talking about is that if you have something like:

struct Integer { int Value; }
Integer GetMyInt() {
if (...)
return new Integer(1); // A primitive - we can retype that
else
return GetAnotherInt(); // A call that return a primitive struct - we don't/can't retype that.
}

If this could be transformed by morph into something like:

if (...)
GT_RETURN<struct>(CNS_INT<int>(1))
else
GT_RETURN<struct>(CALL<struct>())

The common return local path would get mismatched types:

if (...)
getReturnLcl<struct> = CNS_INT<int>(1); // Type mismatch!
else
getReturnLcl<struct> = CALL<struct>();
GT_RETURN<struct>(getReturnLcl);

It is why this optimization is only done when we don't have a common return local - genReturnBB == nullptr.

@JulieLeeMSFT

Copy link
Copy Markdown
Member

@JulieLeeMSFT it requires removing the property that allows "ABI-compatible" types under a GT_RETURN node in HIR. What the comment is talking about is that if you have something like:

Thanks @SingleAccretion for a quick response. I will take a look.

@jakobbotsch

Copy link
Copy Markdown
Member

@JulieLeeMSFT This won't be a simple fix. It overlaps with the work I need to do to enable better ABI treatment with physical promotion, and hopefully I can get to that by .NET 10.
Basically, we can consider this TODO to be tracked by #86665. Feel free to remove the "TODO" part of the comment from the code base now that #86665 calls this scenario out explicitly.

@JulieLeeMSFT

Copy link
Copy Markdown
Member

Sounds good. I will do that.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@SingleAccretion@BruceForstall@jakobbotsch@JulieLeeMSFT
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} 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

Transform STRUCT-typed uses of primitives in local morph - #78131

Merged
jakobbotsch merged 8 commits into
dotnet:mainfrom
SingleAccretion:LclMorph-StructUse-Upstream
Nov 30, 2022
Merged

Transform STRUCT-typed uses of primitives in local morph#78131
jakobbotsch merged 8 commits into
dotnet:mainfrom
SingleAccretion:LclMorph-StructUse-Upstream

Conversation

@SingleAccretion

@SingleAccretionSingleAccretion commented Nov 9, 2022

Copy link
Copy Markdown
Contributor

And update global morph accordingly. This mainly involves not DNER-ing struct local fields right away, but waiting for global morph to do this, after it has had a chance to transform the field into an LCL_VAR.

Diffs are a bit mixed, due to requiring the substitution workaround but generally positive, and overall minor. The larger regressions in tests are due to us setting some DNERs later, thus expanding things into field-by-field copies more.

Note: this change is best reviewed with the "don't show whitespace diffs" setting.

@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 Nov 9, 2022
@SingleAccretionSingleAccretion mentioned this pull request Nov 9, 2022
@ghost

ghost commented Nov 9, 2022

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

And update global morph accordingly. This mainly involves giving not DNER-ing local fields right away, but waiting for global morph to do this, after it has had a chance to transform the field into an LCL_VAR.

Diffs are a bit mixed, due to requiring the substitution workaround but generally positive, and overall minor.

Author:SingleAccretion
Assignees:-
Labels:

area-CodeGen-coreclr, community-contribution

Milestone:-

@SingleAccretion
SingleAccretionforce-pushed the LclMorph-StructUse-Upstream branch from 0c36c00 to c911fd2CompareNovember 9, 2022 21:33
@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

This now depends on #76491.

@SingleAccretion
SingleAccretionforce-pushed the LclMorph-StructUse-Upstream branch from f532bc1 to 733af07CompareNovember 10, 2022 17:02
@SingleAccretion
SingleAccretionforce-pushed the LclMorph-StructUse-Upstream branch from 733af07 to c4fe2f5CompareNovember 11, 2022 13:40
@SingleAccretion
SingleAccretionforce-pushed the LclMorph-StructUse-Upstream branch from c4fe2f5 to 320cb8aCompareNovember 11, 2022 17:09
@SingleAccretion
SingleAccretion marked this pull request as ready for review November 11, 2022 21:16
@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

This is ready for review, but still depends on #76491.

@dotnet/jit-contrib

@BruceForstall

Copy link
Copy Markdown
Contributor

@SingleAccretion Needs conflict resolution

@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

Needs conflict resolution

Also done.

@jakobbotsch

Copy link
Copy Markdown
Member

/azp run runtime-coreclr superpmi-diffs, runtime-coreclr jitstress, runtime-coreclr libraries-jitstress

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 3 pipeline(s).

@SingleAccretion

SingleAccretion commented Nov 29, 2022

Copy link
Copy Markdown
ContributorAuthor

Libraries stress failures are #78909 and #78912.

@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

Stress failures:

  1. TypeGeneratorTests400-499: https://helixre107v0xdeko0k025g8.blob.core.windows.net/dotnet-runtime-refs-pull-78131-merge-7d3e4ae48c114120a0/TypeGeneratorTests400-499/1/console.0f672ed5.log?helixlogtype=result - looks to have passed actually?
12:46:58.844 Passed test: Loader/classloader/TypeGeneratorTests/TypeGeneratorTest499/Generated499/Generated499.dll
Expected: 100
Actual: 100
END EXECUTION - PASSED
+ export _commandExitCode=0
+ /usr/bin/python3 /datadisks/disk1/work/AF3D0989/p/reporter/run.py https://dev.azure.com/dnceng-public/ public 2032048 eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Im9PdmN6NU1fN3AtSGpJS2xGWHo5M3VfVjBabyJ9.eyJuYW1laWQiOiJjNzczZjJjMi01MTIwLTQyMDctYWZlMi1hZmFmMzVhOGJjMGEiLCJzY3AiOiJhcHBfdG9rZW4iLCJhdWkiOiJmMjgxYjY5ZS0xYjAzLTRiOWEtYWEyMy0xYzA4YWFhMzRjNTMiLCJzaWQiOiIzNTc3ODYxMS0yNjgxLTRhNTQtYTBkOC1lYWY2MjBhNzE2NTQiLCJCdWlsZElkIjoiY2JiMTgyNjEtYzQ4Zi00YWJiLTg2NTEtOGNkY2I1NDc0NjQ5Ozk1OTg0IiwicHBpZCI6InZzdGZzOi8vL0J1aWxkL0J1aWxkLzk1OTg0Iiwib3JjaGlkIjoiMTEzYzBmZmUtNjg4ZS00OWYxLWIwMDEtZTNhYTM0ODJkZTA1LmJ1aWxkLnJ1bl90ZXN0X3AxX19saW51eF94NjRfY2hlY2tlZC5fX2RlZmF1bHQiLCJyZXBvSWRzIjoiIiwiaXNzIjoiYXBwLnZzdG9rZW4udmlzdWFsc3R1ZGlvLmNvbSIsImF1ZCI6ImFwcC52c3Rva2VuLnZpc3VhbHN0dWRpby5jb218dnNvOjZmY2M5MmU1LTczYTctNGY4OC04ZDEzLWQ5MDQ1YjQ1ZmIyNyIsIm5iZiI6MTY2OTcyMjIxMSwiZXhwIjoxNjY5NzQ2ODExfQ.Sll8uONVwy9ZF9KTir7KbsJEDJ1UOe-vCIk4fL6oQfD52TnPQk082mPT1YKXwTrUuE0xSxNS7ehaYTSH5CGUN-RVDJDkgiJauEH6CLZvnNQrKJySShBowW7azSX7X_XYcpOT8-XafcEKFr_x1r-VUTgbl_GviHcFCTCv-KnHHOqIsj1Ma8DJRUzX3Lax12F2coGlh-ogqt8vm566VBsgTK6lUmJJuMXL3FceWGvVJUnpjdLYdtYcMIvU3s8o2_CE5zIWeVNH7GeqDEAW4afcydK9bQTmDxfffsWiT3zlhp0BO3BGlEZPrg5by-JVspcr30yakIn5YbrYLWmns4vmNg
Killed
['TypeGeneratorTests400-499' END OF WORK ITEM LOG: Command timed out, and was killed]
  1. JIT\\Regression\\JitBlue\\Runtime_63354\\Runtime_63354\\Runtime_63354.cmd, x86: Test failure JIT\\Regression\\JitBlue\\Runtime_63354\\Runtime_63354\\Runtime_63354.cmd #78898.

@jakobbotschjakobbotsch left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Looks great to me, very nice to no longer have to think about these cases after local morph.
Are you going to optimize other uses (e.g. the liveness change we discussed) in a follow-up?

@jakobbotsch
jakobbotsch merged commit be7030f into dotnet:mainNov 30, 2022
@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

Are you going to optimize other uses (e.g. the liveness change we discussed) in a follow-up?

Yep.

@SingleAccretion
SingleAccretion deleted the LclMorph-StructUse-Upstream branch November 30, 2022 13:40
@ghostghost locked as resolved and limited conversation to collaborators Dec 30, 2022
@JulieLeeMSFT

JulieLeeMSFT commented Aug 27, 2024

Copy link
Copy Markdown
Member

Hi @SingleAccretion, we are trying to clean up TODO comments. You touched this part of the code in this PR,

// TODO: support `genReturnBB != nullptr`, it requires #11413 to avoid `Incompatible types for
// gtNewTempStore`.
if (canFold && (genReturnBB == nullptr))
{
// Fold even if types do not match, lowering will handle it. This allows the local
// to remain DNER-free and be enregistered.
assert(lclFld->GetLclOffs() == 0);
lclFld->ChangeType(varDsc->TypeGet());
lclFld->SetOper(GT_LCL_VAR);
}
elseif (!varDsc->lvDoNotEnregister)
{
lvaSetVarDoNotEnregister(lclNum DEBUGARG(DoNotEnregisterReason::BlockOpRet));
}
. Our team members do not have much context on it, so I wanted to ask you if you know what to do to support genReturnBB != nullptr.
#11413 is now supported.

 // TODO: support `genReturnBB != nullptr`, it requires #11413 to avoid `Incompatible types for
// gtNewTempStore`.
if (canFold && (genReturnBB == nullptr))
{
// Fold even if types do not match, lowering will handle it. This allows the local
// to remain DNER-free and be enregistered.
assert(lclFld->GetLclOffs() == 0);
lclFld->ChangeType(varDsc->TypeGet());
lclFld->SetOper(GT_LCL_VAR);
}
else if (!varDsc->lvDoNotEnregister)
{
lvaSetVarDoNotEnregister(lclNum DEBUGARG(DoNotEnregisterReason::BlockOpRet));
}

@JulieLeeMSFT

Copy link
Copy Markdown
Member

BTW, the bitconverter instructions from #11413 does not hit this code path.

@dotnetdotnet unlocked this conversation Aug 27, 2024
@SingleAccretion

SingleAccretion commented Aug 27, 2024

Copy link
Copy Markdown
ContributorAuthor

I wanted to ask you if you know what to do to support genReturnBB != nullptr

@JulieLeeMSFT it requires removing the property that allows "ABI-compatible" types under a GT_RETURN node in HIR. What the comment is talking about is that if you have something like:

struct Integer { int Value; }
Integer GetMyInt() {
if (...)
return new Integer(1); // A primitive - we can retype that
else
return GetAnotherInt(); // A call that return a primitive struct - we don't/can't retype that.
}

If this could be transformed by morph into something like:

if (...)
GT_RETURN<struct>(CNS_INT<int>(1))
else
GT_RETURN<struct>(CALL<struct>())

The common return local path would get mismatched types:

if (...)
getReturnLcl<struct> = CNS_INT<int>(1); // Type mismatch!
else
getReturnLcl<struct> = CALL<struct>();
GT_RETURN<struct>(getReturnLcl);

It is why this optimization is only done when we don't have a common return local - genReturnBB == nullptr.

@JulieLeeMSFT

Copy link
Copy Markdown
Member

@JulieLeeMSFT it requires removing the property that allows "ABI-compatible" types under a GT_RETURN node in HIR. What the comment is talking about is that if you have something like:

Thanks @SingleAccretion for a quick response. I will take a look.

@jakobbotsch

Copy link
Copy Markdown
Member

@JulieLeeMSFT This won't be a simple fix. It overlaps with the work I need to do to enable better ABI treatment with physical promotion, and hopefully I can get to that by .NET 10.
Basically, we can consider this TODO to be tracked by #86665. Feel free to remove the "TODO" part of the comment from the code base now that #86665 calls this scenario out explicitly.

@JulieLeeMSFT

Copy link
Copy Markdown
Member

Sounds good. I will do that.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@SingleAccretion@BruceForstall@jakobbotsch@JulieLeeMSFT
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Transform STRUCT-typed uses of primitives in local morph - #78131

Merged
jakobbotsch merged 8 commits into
dotnet:mainfrom
SingleAccretion:LclMorph-StructUse-Upstream
Nov 30, 2022
Merged

Transform STRUCT-typed uses of primitives in local morph#78131
jakobbotsch merged 8 commits into
dotnet:mainfrom
SingleAccretion:LclMorph-StructUse-Upstream

Conversation

@SingleAccretion

@SingleAccretionSingleAccretion commented Nov 9, 2022

Copy link
Copy Markdown
Contributor

And update global morph accordingly. This mainly involves not DNER-ing struct local fields right away, but waiting for global morph to do this, after it has had a chance to transform the field into an LCL_VAR.

Diffs are a bit mixed, due to requiring the substitution workaround but generally positive, and overall minor. The larger regressions in tests are due to us setting some DNERs later, thus expanding things into field-by-field copies more.

Note: this change is best reviewed with the "don't show whitespace diffs" setting.

@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 Nov 9, 2022
@SingleAccretionSingleAccretion mentioned this pull request Nov 9, 2022
@ghost

ghost commented Nov 9, 2022

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

And update global morph accordingly. This mainly involves giving not DNER-ing local fields right away, but waiting for global morph to do this, after it has had a chance to transform the field into an LCL_VAR.

Diffs are a bit mixed, due to requiring the substitution workaround but generally positive, and overall minor.

Author:SingleAccretion
Assignees:-
Labels:

area-CodeGen-coreclr, community-contribution

Milestone:-

@SingleAccretion
SingleAccretionforce-pushed the LclMorph-StructUse-Upstream branch from 0c36c00 to c911fd2CompareNovember 9, 2022 21:33
@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

This now depends on #76491.

@SingleAccretion
SingleAccretionforce-pushed the LclMorph-StructUse-Upstream branch from f532bc1 to 733af07CompareNovember 10, 2022 17:02
@SingleAccretion
SingleAccretionforce-pushed the LclMorph-StructUse-Upstream branch from 733af07 to c4fe2f5CompareNovember 11, 2022 13:40
@SingleAccretion
SingleAccretionforce-pushed the LclMorph-StructUse-Upstream branch from c4fe2f5 to 320cb8aCompareNovember 11, 2022 17:09
@SingleAccretion
SingleAccretion marked this pull request as ready for review November 11, 2022 21:16
@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

This is ready for review, but still depends on #76491.

@dotnet/jit-contrib

@BruceForstall

Copy link
Copy Markdown
Contributor

@SingleAccretion Needs conflict resolution

@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

Needs conflict resolution

Also done.

@jakobbotsch

Copy link
Copy Markdown
Member

/azp run runtime-coreclr superpmi-diffs, runtime-coreclr jitstress, runtime-coreclr libraries-jitstress

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 3 pipeline(s).

@SingleAccretion

SingleAccretion commented Nov 29, 2022

Copy link
Copy Markdown
ContributorAuthor

Libraries stress failures are #78909 and #78912.

@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

Stress failures:

  1. TypeGeneratorTests400-499: https://helixre107v0xdeko0k025g8.blob.core.windows.net/dotnet-runtime-refs-pull-78131-merge-7d3e4ae48c114120a0/TypeGeneratorTests400-499/1/console.0f672ed5.log?helixlogtype=result - looks to have passed actually?
12:46:58.844 Passed test: Loader/classloader/TypeGeneratorTests/TypeGeneratorTest499/Generated499/Generated499.dll
Expected: 100
Actual: 100
END EXECUTION - PASSED
+ export _commandExitCode=0
+ /usr/bin/python3 /datadisks/disk1/work/AF3D0989/p/reporter/run.py https://dev.azure.com/dnceng-public/ public 2032048 eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Im9PdmN6NU1fN3AtSGpJS2xGWHo5M3VfVjBabyJ9.eyJuYW1laWQiOiJjNzczZjJjMi01MTIwLTQyMDctYWZlMi1hZmFmMzVhOGJjMGEiLCJzY3AiOiJhcHBfdG9rZW4iLCJhdWkiOiJmMjgxYjY5ZS0xYjAzLTRiOWEtYWEyMy0xYzA4YWFhMzRjNTMiLCJzaWQiOiIzNTc3ODYxMS0yNjgxLTRhNTQtYTBkOC1lYWY2MjBhNzE2NTQiLCJCdWlsZElkIjoiY2JiMTgyNjEtYzQ4Zi00YWJiLTg2NTEtOGNkY2I1NDc0NjQ5Ozk1OTg0IiwicHBpZCI6InZzdGZzOi8vL0J1aWxkL0J1aWxkLzk1OTg0Iiwib3JjaGlkIjoiMTEzYzBmZmUtNjg4ZS00OWYxLWIwMDEtZTNhYTM0ODJkZTA1LmJ1aWxkLnJ1bl90ZXN0X3AxX19saW51eF94NjRfY2hlY2tlZC5fX2RlZmF1bHQiLCJyZXBvSWRzIjoiIiwiaXNzIjoiYXBwLnZzdG9rZW4udmlzdWFsc3R1ZGlvLmNvbSIsImF1ZCI6ImFwcC52c3Rva2VuLnZpc3VhbHN0dWRpby5jb218dnNvOjZmY2M5MmU1LTczYTctNGY4OC04ZDEzLWQ5MDQ1YjQ1ZmIyNyIsIm5iZiI6MTY2OTcyMjIxMSwiZXhwIjoxNjY5NzQ2ODExfQ.Sll8uONVwy9ZF9KTir7KbsJEDJ1UOe-vCIk4fL6oQfD52TnPQk082mPT1YKXwTrUuE0xSxNS7ehaYTSH5CGUN-RVDJDkgiJauEH6CLZvnNQrKJySShBowW7azSX7X_XYcpOT8-XafcEKFr_x1r-VUTgbl_GviHcFCTCv-KnHHOqIsj1Ma8DJRUzX3Lax12F2coGlh-ogqt8vm566VBsgTK6lUmJJuMXL3FceWGvVJUnpjdLYdtYcMIvU3s8o2_CE5zIWeVNH7GeqDEAW4afcydK9bQTmDxfffsWiT3zlhp0BO3BGlEZPrg5by-JVspcr30yakIn5YbrYLWmns4vmNg
Killed
['TypeGeneratorTests400-499' END OF WORK ITEM LOG: Command timed out, and was killed]
  1. JIT\\Regression\\JitBlue\\Runtime_63354\\Runtime_63354\\Runtime_63354.cmd, x86: Test failure JIT\\Regression\\JitBlue\\Runtime_63354\\Runtime_63354\\Runtime_63354.cmd #78898.

@jakobbotschjakobbotsch left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Looks great to me, very nice to no longer have to think about these cases after local morph.
Are you going to optimize other uses (e.g. the liveness change we discussed) in a follow-up?

@jakobbotsch
jakobbotsch merged commit be7030f into dotnet:mainNov 30, 2022
@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

Are you going to optimize other uses (e.g. the liveness change we discussed) in a follow-up?

Yep.

@SingleAccretion
SingleAccretion deleted the LclMorph-StructUse-Upstream branch November 30, 2022 13:40
@ghostghost locked as resolved and limited conversation to collaborators Dec 30, 2022
@JulieLeeMSFT

JulieLeeMSFT commented Aug 27, 2024

Copy link
Copy Markdown
Member

Hi @SingleAccretion, we are trying to clean up TODO comments. You touched this part of the code in this PR,

// TODO: support `genReturnBB != nullptr`, it requires #11413 to avoid `Incompatible types for
// gtNewTempStore`.
if (canFold && (genReturnBB == nullptr))
{
// Fold even if types do not match, lowering will handle it. This allows the local
// to remain DNER-free and be enregistered.
assert(lclFld->GetLclOffs() == 0);
lclFld->ChangeType(varDsc->TypeGet());
lclFld->SetOper(GT_LCL_VAR);
}
elseif (!varDsc->lvDoNotEnregister)
{
lvaSetVarDoNotEnregister(lclNum DEBUGARG(DoNotEnregisterReason::BlockOpRet));
}
. Our team members do not have much context on it, so I wanted to ask you if you know what to do to support genReturnBB != nullptr.
#11413 is now supported.

 // TODO: support `genReturnBB != nullptr`, it requires #11413 to avoid `Incompatible types for
// gtNewTempStore`.
if (canFold && (genReturnBB == nullptr))
{
// Fold even if types do not match, lowering will handle it. This allows the local
// to remain DNER-free and be enregistered.
assert(lclFld->GetLclOffs() == 0);
lclFld->ChangeType(varDsc->TypeGet());
lclFld->SetOper(GT_LCL_VAR);
}
else if (!varDsc->lvDoNotEnregister)
{
lvaSetVarDoNotEnregister(lclNum DEBUGARG(DoNotEnregisterReason::BlockOpRet));
}

@JulieLeeMSFT

Copy link
Copy Markdown
Member

BTW, the bitconverter instructions from #11413 does not hit this code path.

@dotnetdotnet unlocked this conversation Aug 27, 2024
@SingleAccretion

SingleAccretion commented Aug 27, 2024

Copy link
Copy Markdown
ContributorAuthor

I wanted to ask you if you know what to do to support genReturnBB != nullptr

@JulieLeeMSFT it requires removing the property that allows "ABI-compatible" types under a GT_RETURN node in HIR. What the comment is talking about is that if you have something like:

struct Integer { int Value; }
Integer GetMyInt() {
if (...)
return new Integer(1); // A primitive - we can retype that
else
return GetAnotherInt(); // A call that return a primitive struct - we don't/can't retype that.
}

If this could be transformed by morph into something like:

if (...)
GT_RETURN<struct>(CNS_INT<int>(1))
else
GT_RETURN<struct>(CALL<struct>())

The common return local path would get mismatched types:

if (...)
getReturnLcl<struct> = CNS_INT<int>(1); // Type mismatch!
else
getReturnLcl<struct> = CALL<struct>();
GT_RETURN<struct>(getReturnLcl);

It is why this optimization is only done when we don't have a common return local - genReturnBB == nullptr.

@JulieLeeMSFT

Copy link
Copy Markdown
Member

@JulieLeeMSFT it requires removing the property that allows "ABI-compatible" types under a GT_RETURN node in HIR. What the comment is talking about is that if you have something like:

Thanks @SingleAccretion for a quick response. I will take a look.

@jakobbotsch

Copy link
Copy Markdown
Member

@JulieLeeMSFT This won't be a simple fix. It overlaps with the work I need to do to enable better ABI treatment with physical promotion, and hopefully I can get to that by .NET 10.
Basically, we can consider this TODO to be tracked by #86665. Feel free to remove the "TODO" part of the comment from the code base now that #86665 calls this scenario out explicitly.

@JulieLeeMSFT

Copy link
Copy Markdown
Member

Sounds good. I will do that.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@SingleAccretion@BruceForstall@jakobbotsch@JulieLeeMSFT
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Transform STRUCT-typed uses of primitives in local morph - #78131

Merged
jakobbotsch merged 8 commits into
dotnet:mainfrom
SingleAccretion:LclMorph-StructUse-Upstream
Nov 30, 2022
Merged

Transform STRUCT-typed uses of primitives in local morph#78131
jakobbotsch merged 8 commits into
dotnet:mainfrom
SingleAccretion:LclMorph-StructUse-Upstream

Conversation

@SingleAccretion

@SingleAccretionSingleAccretion commented Nov 9, 2022

Copy link
Copy Markdown
Contributor

And update global morph accordingly. This mainly involves not DNER-ing struct local fields right away, but waiting for global morph to do this, after it has had a chance to transform the field into an LCL_VAR.

Diffs are a bit mixed, due to requiring the substitution workaround but generally positive, and overall minor. The larger regressions in tests are due to us setting some DNERs later, thus expanding things into field-by-field copies more.

Note: this change is best reviewed with the "don't show whitespace diffs" setting.

@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 Nov 9, 2022
@SingleAccretionSingleAccretion mentioned this pull request Nov 9, 2022
@ghost

ghost commented Nov 9, 2022

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

And update global morph accordingly. This mainly involves giving not DNER-ing local fields right away, but waiting for global morph to do this, after it has had a chance to transform the field into an LCL_VAR.

Diffs are a bit mixed, due to requiring the substitution workaround but generally positive, and overall minor.

Author:SingleAccretion
Assignees:-
Labels:

area-CodeGen-coreclr, community-contribution

Milestone:-

@SingleAccretion
SingleAccretionforce-pushed the LclMorph-StructUse-Upstream branch from 0c36c00 to c911fd2CompareNovember 9, 2022 21:33
@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

This now depends on #76491.

@SingleAccretion
SingleAccretionforce-pushed the LclMorph-StructUse-Upstream branch from f532bc1 to 733af07CompareNovember 10, 2022 17:02
@SingleAccretion
SingleAccretionforce-pushed the LclMorph-StructUse-Upstream branch from 733af07 to c4fe2f5CompareNovember 11, 2022 13:40
@SingleAccretion
SingleAccretionforce-pushed the LclMorph-StructUse-Upstream branch from c4fe2f5 to 320cb8aCompareNovember 11, 2022 17:09
@SingleAccretion
SingleAccretion marked this pull request as ready for review November 11, 2022 21:16
@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

This is ready for review, but still depends on #76491.

@dotnet/jit-contrib

@BruceForstall

Copy link
Copy Markdown
Contributor

@SingleAccretion Needs conflict resolution

@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

Needs conflict resolution

Also done.

@jakobbotsch

Copy link
Copy Markdown
Member

/azp run runtime-coreclr superpmi-diffs, runtime-coreclr jitstress, runtime-coreclr libraries-jitstress

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 3 pipeline(s).

@SingleAccretion

SingleAccretion commented Nov 29, 2022

Copy link
Copy Markdown
ContributorAuthor

Libraries stress failures are #78909 and #78912.

@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

Stress failures:

  1. TypeGeneratorTests400-499: https://helixre107v0xdeko0k025g8.blob.core.windows.net/dotnet-runtime-refs-pull-78131-merge-7d3e4ae48c114120a0/TypeGeneratorTests400-499/1/console.0f672ed5.log?helixlogtype=result - looks to have passed actually?
12:46:58.844 Passed test: Loader/classloader/TypeGeneratorTests/TypeGeneratorTest499/Generated499/Generated499.dll
Expected: 100
Actual: 100
END EXECUTION - PASSED
+ export _commandExitCode=0
+ /usr/bin/python3 /datadisks/disk1/work/AF3D0989/p/reporter/run.py https://dev.azure.com/dnceng-public/ public 2032048 eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Im9PdmN6NU1fN3AtSGpJS2xGWHo5M3VfVjBabyJ9.eyJuYW1laWQiOiJjNzczZjJjMi01MTIwLTQyMDctYWZlMi1hZmFmMzVhOGJjMGEiLCJzY3AiOiJhcHBfdG9rZW4iLCJhdWkiOiJmMjgxYjY5ZS0xYjAzLTRiOWEtYWEyMy0xYzA4YWFhMzRjNTMiLCJzaWQiOiIzNTc3ODYxMS0yNjgxLTRhNTQtYTBkOC1lYWY2MjBhNzE2NTQiLCJCdWlsZElkIjoiY2JiMTgyNjEtYzQ4Zi00YWJiLTg2NTEtOGNkY2I1NDc0NjQ5Ozk1OTg0IiwicHBpZCI6InZzdGZzOi8vL0J1aWxkL0J1aWxkLzk1OTg0Iiwib3JjaGlkIjoiMTEzYzBmZmUtNjg4ZS00OWYxLWIwMDEtZTNhYTM0ODJkZTA1LmJ1aWxkLnJ1bl90ZXN0X3AxX19saW51eF94NjRfY2hlY2tlZC5fX2RlZmF1bHQiLCJyZXBvSWRzIjoiIiwiaXNzIjoiYXBwLnZzdG9rZW4udmlzdWFsc3R1ZGlvLmNvbSIsImF1ZCI6ImFwcC52c3Rva2VuLnZpc3VhbHN0dWRpby5jb218dnNvOjZmY2M5MmU1LTczYTctNGY4OC04ZDEzLWQ5MDQ1YjQ1ZmIyNyIsIm5iZiI6MTY2OTcyMjIxMSwiZXhwIjoxNjY5NzQ2ODExfQ.Sll8uONVwy9ZF9KTir7KbsJEDJ1UOe-vCIk4fL6oQfD52TnPQk082mPT1YKXwTrUuE0xSxNS7ehaYTSH5CGUN-RVDJDkgiJauEH6CLZvnNQrKJySShBowW7azSX7X_XYcpOT8-XafcEKFr_x1r-VUTgbl_GviHcFCTCv-KnHHOqIsj1Ma8DJRUzX3Lax12F2coGlh-ogqt8vm566VBsgTK6lUmJJuMXL3FceWGvVJUnpjdLYdtYcMIvU3s8o2_CE5zIWeVNH7GeqDEAW4afcydK9bQTmDxfffsWiT3zlhp0BO3BGlEZPrg5by-JVspcr30yakIn5YbrYLWmns4vmNg
Killed
['TypeGeneratorTests400-499' END OF WORK ITEM LOG: Command timed out, and was killed]
  1. JIT\\Regression\\JitBlue\\Runtime_63354\\Runtime_63354\\Runtime_63354.cmd, x86: Test failure JIT\\Regression\\JitBlue\\Runtime_63354\\Runtime_63354\\Runtime_63354.cmd #78898.

@jakobbotschjakobbotsch left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Looks great to me, very nice to no longer have to think about these cases after local morph.
Are you going to optimize other uses (e.g. the liveness change we discussed) in a follow-up?

@jakobbotsch
jakobbotsch merged commit be7030f into dotnet:mainNov 30, 2022
@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

Are you going to optimize other uses (e.g. the liveness change we discussed) in a follow-up?

Yep.

@SingleAccretion
SingleAccretion deleted the LclMorph-StructUse-Upstream branch November 30, 2022 13:40
@ghostghost locked as resolved and limited conversation to collaborators Dec 30, 2022
@JulieLeeMSFT

JulieLeeMSFT commented Aug 27, 2024

Copy link
Copy Markdown
Member

Hi @SingleAccretion, we are trying to clean up TODO comments. You touched this part of the code in this PR,

// TODO: support `genReturnBB != nullptr`, it requires #11413 to avoid `Incompatible types for
// gtNewTempStore`.
if (canFold && (genReturnBB == nullptr))
{
// Fold even if types do not match, lowering will handle it. This allows the local
// to remain DNER-free and be enregistered.
assert(lclFld->GetLclOffs() == 0);
lclFld->ChangeType(varDsc->TypeGet());
lclFld->SetOper(GT_LCL_VAR);
}
elseif (!varDsc->lvDoNotEnregister)
{
lvaSetVarDoNotEnregister(lclNum DEBUGARG(DoNotEnregisterReason::BlockOpRet));
}
. Our team members do not have much context on it, so I wanted to ask you if you know what to do to support genReturnBB != nullptr.
#11413 is now supported.

 // TODO: support `genReturnBB != nullptr`, it requires #11413 to avoid `Incompatible types for
// gtNewTempStore`.
if (canFold && (genReturnBB == nullptr))
{
// Fold even if types do not match, lowering will handle it. This allows the local
// to remain DNER-free and be enregistered.
assert(lclFld->GetLclOffs() == 0);
lclFld->ChangeType(varDsc->TypeGet());
lclFld->SetOper(GT_LCL_VAR);
}
else if (!varDsc->lvDoNotEnregister)
{
lvaSetVarDoNotEnregister(lclNum DEBUGARG(DoNotEnregisterReason::BlockOpRet));
}

@JulieLeeMSFT

Copy link
Copy Markdown
Member

BTW, the bitconverter instructions from #11413 does not hit this code path.

@dotnetdotnet unlocked this conversation Aug 27, 2024
@SingleAccretion

SingleAccretion commented Aug 27, 2024

Copy link
Copy Markdown
ContributorAuthor

I wanted to ask you if you know what to do to support genReturnBB != nullptr

@JulieLeeMSFT it requires removing the property that allows "ABI-compatible" types under a GT_RETURN node in HIR. What the comment is talking about is that if you have something like:

struct Integer { int Value; }
Integer GetMyInt() {
if (...)
return new Integer(1); // A primitive - we can retype that
else
return GetAnotherInt(); // A call that return a primitive struct - we don't/can't retype that.
}

If this could be transformed by morph into something like:

if (...)
GT_RETURN<struct>(CNS_INT<int>(1))
else
GT_RETURN<struct>(CALL<struct>())

The common return local path would get mismatched types:

if (...)
getReturnLcl<struct> = CNS_INT<int>(1); // Type mismatch!
else
getReturnLcl<struct> = CALL<struct>();
GT_RETURN<struct>(getReturnLcl);

It is why this optimization is only done when we don't have a common return local - genReturnBB == nullptr.

@JulieLeeMSFT

Copy link
Copy Markdown
Member

@JulieLeeMSFT it requires removing the property that allows "ABI-compatible" types under a GT_RETURN node in HIR. What the comment is talking about is that if you have something like:

Thanks @SingleAccretion for a quick response. I will take a look.

@jakobbotsch

Copy link
Copy Markdown
Member

@JulieLeeMSFT This won't be a simple fix. It overlaps with the work I need to do to enable better ABI treatment with physical promotion, and hopefully I can get to that by .NET 10.
Basically, we can consider this TODO to be tracked by #86665. Feel free to remove the "TODO" part of the comment from the code base now that #86665 calls this scenario out explicitly.

@JulieLeeMSFT

Copy link
Copy Markdown
Member

Sounds good. I will do that.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@SingleAccretion@BruceForstall@jakobbotsch@JulieLeeMSFT
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } 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

Transform STRUCT-typed uses of primitives in local morph - #78131

Merged
jakobbotsch merged 8 commits into
dotnet:mainfrom
SingleAccretion:LclMorph-StructUse-Upstream
Nov 30, 2022
Merged

Transform STRUCT-typed uses of primitives in local morph#78131
jakobbotsch merged 8 commits into
dotnet:mainfrom
SingleAccretion:LclMorph-StructUse-Upstream

Conversation

@SingleAccretion

@SingleAccretionSingleAccretion commented Nov 9, 2022

Copy link
Copy Markdown
Contributor

And update global morph accordingly. This mainly involves not DNER-ing struct local fields right away, but waiting for global morph to do this, after it has had a chance to transform the field into an LCL_VAR.

Diffs are a bit mixed, due to requiring the substitution workaround but generally positive, and overall minor. The larger regressions in tests are due to us setting some DNERs later, thus expanding things into field-by-field copies more.

Note: this change is best reviewed with the "don't show whitespace diffs" setting.

@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 Nov 9, 2022
@SingleAccretionSingleAccretion mentioned this pull request Nov 9, 2022
@ghost

ghost commented Nov 9, 2022

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

And update global morph accordingly. This mainly involves giving not DNER-ing local fields right away, but waiting for global morph to do this, after it has had a chance to transform the field into an LCL_VAR.

Diffs are a bit mixed, due to requiring the substitution workaround but generally positive, and overall minor.

Author:SingleAccretion
Assignees:-
Labels:

area-CodeGen-coreclr, community-contribution

Milestone:-

@SingleAccretion
SingleAccretionforce-pushed the LclMorph-StructUse-Upstream branch from 0c36c00 to c911fd2CompareNovember 9, 2022 21:33
@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

This now depends on #76491.

@SingleAccretion
SingleAccretionforce-pushed the LclMorph-StructUse-Upstream branch from f532bc1 to 733af07CompareNovember 10, 2022 17:02
@SingleAccretion
SingleAccretionforce-pushed the LclMorph-StructUse-Upstream branch from 733af07 to c4fe2f5CompareNovember 11, 2022 13:40
@SingleAccretion
SingleAccretionforce-pushed the LclMorph-StructUse-Upstream branch from c4fe2f5 to 320cb8aCompareNovember 11, 2022 17:09
@SingleAccretion
SingleAccretion marked this pull request as ready for review November 11, 2022 21:16
@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

This is ready for review, but still depends on #76491.

@dotnet/jit-contrib

@BruceForstall

Copy link
Copy Markdown
Contributor

@SingleAccretion Needs conflict resolution

@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

Needs conflict resolution

Also done.

@jakobbotsch

Copy link
Copy Markdown
Member

/azp run runtime-coreclr superpmi-diffs, runtime-coreclr jitstress, runtime-coreclr libraries-jitstress

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 3 pipeline(s).

@SingleAccretion

SingleAccretion commented Nov 29, 2022

Copy link
Copy Markdown
ContributorAuthor

Libraries stress failures are #78909 and #78912.

@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

Stress failures:

  1. TypeGeneratorTests400-499: https://helixre107v0xdeko0k025g8.blob.core.windows.net/dotnet-runtime-refs-pull-78131-merge-7d3e4ae48c114120a0/TypeGeneratorTests400-499/1/console.0f672ed5.log?helixlogtype=result - looks to have passed actually?
12:46:58.844 Passed test: Loader/classloader/TypeGeneratorTests/TypeGeneratorTest499/Generated499/Generated499.dll
Expected: 100
Actual: 100
END EXECUTION - PASSED
+ export _commandExitCode=0
+ /usr/bin/python3 /datadisks/disk1/work/AF3D0989/p/reporter/run.py https://dev.azure.com/dnceng-public/ public 2032048 eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Im9PdmN6NU1fN3AtSGpJS2xGWHo5M3VfVjBabyJ9.eyJuYW1laWQiOiJjNzczZjJjMi01MTIwLTQyMDctYWZlMi1hZmFmMzVhOGJjMGEiLCJzY3AiOiJhcHBfdG9rZW4iLCJhdWkiOiJmMjgxYjY5ZS0xYjAzLTRiOWEtYWEyMy0xYzA4YWFhMzRjNTMiLCJzaWQiOiIzNTc3ODYxMS0yNjgxLTRhNTQtYTBkOC1lYWY2MjBhNzE2NTQiLCJCdWlsZElkIjoiY2JiMTgyNjEtYzQ4Zi00YWJiLTg2NTEtOGNkY2I1NDc0NjQ5Ozk1OTg0IiwicHBpZCI6InZzdGZzOi8vL0J1aWxkL0J1aWxkLzk1OTg0Iiwib3JjaGlkIjoiMTEzYzBmZmUtNjg4ZS00OWYxLWIwMDEtZTNhYTM0ODJkZTA1LmJ1aWxkLnJ1bl90ZXN0X3AxX19saW51eF94NjRfY2hlY2tlZC5fX2RlZmF1bHQiLCJyZXBvSWRzIjoiIiwiaXNzIjoiYXBwLnZzdG9rZW4udmlzdWFsc3R1ZGlvLmNvbSIsImF1ZCI6ImFwcC52c3Rva2VuLnZpc3VhbHN0dWRpby5jb218dnNvOjZmY2M5MmU1LTczYTctNGY4OC04ZDEzLWQ5MDQ1YjQ1ZmIyNyIsIm5iZiI6MTY2OTcyMjIxMSwiZXhwIjoxNjY5NzQ2ODExfQ.Sll8uONVwy9ZF9KTir7KbsJEDJ1UOe-vCIk4fL6oQfD52TnPQk082mPT1YKXwTrUuE0xSxNS7ehaYTSH5CGUN-RVDJDkgiJauEH6CLZvnNQrKJySShBowW7azSX7X_XYcpOT8-XafcEKFr_x1r-VUTgbl_GviHcFCTCv-KnHHOqIsj1Ma8DJRUzX3Lax12F2coGlh-ogqt8vm566VBsgTK6lUmJJuMXL3FceWGvVJUnpjdLYdtYcMIvU3s8o2_CE5zIWeVNH7GeqDEAW4afcydK9bQTmDxfffsWiT3zlhp0BO3BGlEZPrg5by-JVspcr30yakIn5YbrYLWmns4vmNg
Killed
['TypeGeneratorTests400-499' END OF WORK ITEM LOG: Command timed out, and was killed]
  1. JIT\\Regression\\JitBlue\\Runtime_63354\\Runtime_63354\\Runtime_63354.cmd, x86: Test failure JIT\\Regression\\JitBlue\\Runtime_63354\\Runtime_63354\\Runtime_63354.cmd #78898.

@jakobbotschjakobbotsch left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Looks great to me, very nice to no longer have to think about these cases after local morph.
Are you going to optimize other uses (e.g. the liveness change we discussed) in a follow-up?

@jakobbotsch
jakobbotsch merged commit be7030f into dotnet:mainNov 30, 2022
@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

Are you going to optimize other uses (e.g. the liveness change we discussed) in a follow-up?

Yep.

@SingleAccretion
SingleAccretion deleted the LclMorph-StructUse-Upstream branch November 30, 2022 13:40
@ghostghost locked as resolved and limited conversation to collaborators Dec 30, 2022
@JulieLeeMSFT

JulieLeeMSFT commented Aug 27, 2024

Copy link
Copy Markdown
Member

Hi @SingleAccretion, we are trying to clean up TODO comments. You touched this part of the code in this PR,

// TODO: support `genReturnBB != nullptr`, it requires #11413 to avoid `Incompatible types for
// gtNewTempStore`.
if (canFold && (genReturnBB == nullptr))
{
// Fold even if types do not match, lowering will handle it. This allows the local
// to remain DNER-free and be enregistered.
assert(lclFld->GetLclOffs() == 0);
lclFld->ChangeType(varDsc->TypeGet());
lclFld->SetOper(GT_LCL_VAR);
}
elseif (!varDsc->lvDoNotEnregister)
{
lvaSetVarDoNotEnregister(lclNum DEBUGARG(DoNotEnregisterReason::BlockOpRet));
}
. Our team members do not have much context on it, so I wanted to ask you if you know what to do to support genReturnBB != nullptr.
#11413 is now supported.

 // TODO: support `genReturnBB != nullptr`, it requires #11413 to avoid `Incompatible types for
// gtNewTempStore`.
if (canFold && (genReturnBB == nullptr))
{
// Fold even if types do not match, lowering will handle it. This allows the local
// to remain DNER-free and be enregistered.
assert(lclFld->GetLclOffs() == 0);
lclFld->ChangeType(varDsc->TypeGet());
lclFld->SetOper(GT_LCL_VAR);
}
else if (!varDsc->lvDoNotEnregister)
{
lvaSetVarDoNotEnregister(lclNum DEBUGARG(DoNotEnregisterReason::BlockOpRet));
}

@JulieLeeMSFT

Copy link
Copy Markdown
Member

BTW, the bitconverter instructions from #11413 does not hit this code path.

@dotnetdotnet unlocked this conversation Aug 27, 2024
@SingleAccretion

SingleAccretion commented Aug 27, 2024

Copy link
Copy Markdown
ContributorAuthor

I wanted to ask you if you know what to do to support genReturnBB != nullptr

@JulieLeeMSFT it requires removing the property that allows "ABI-compatible" types under a GT_RETURN node in HIR. What the comment is talking about is that if you have something like:

struct Integer { int Value; }
Integer GetMyInt() {
if (...)
return new Integer(1); // A primitive - we can retype that
else
return GetAnotherInt(); // A call that return a primitive struct - we don't/can't retype that.
}

If this could be transformed by morph into something like:

if (...)
GT_RETURN<struct>(CNS_INT<int>(1))
else
GT_RETURN<struct>(CALL<struct>())

The common return local path would get mismatched types:

if (...)
getReturnLcl<struct> = CNS_INT<int>(1); // Type mismatch!
else
getReturnLcl<struct> = CALL<struct>();
GT_RETURN<struct>(getReturnLcl);

It is why this optimization is only done when we don't have a common return local - genReturnBB == nullptr.

@JulieLeeMSFT

Copy link
Copy Markdown
Member

@JulieLeeMSFT it requires removing the property that allows "ABI-compatible" types under a GT_RETURN node in HIR. What the comment is talking about is that if you have something like:

Thanks @SingleAccretion for a quick response. I will take a look.

@jakobbotsch

Copy link
Copy Markdown
Member

@JulieLeeMSFT This won't be a simple fix. It overlaps with the work I need to do to enable better ABI treatment with physical promotion, and hopefully I can get to that by .NET 10.
Basically, we can consider this TODO to be tracked by #86665. Feel free to remove the "TODO" part of the comment from the code base now that #86665 calls this scenario out explicitly.

@JulieLeeMSFT

Copy link
Copy Markdown
Member

Sounds good. I will do that.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@SingleAccretion@BruceForstall@jakobbotsch@JulieLeeMSFT
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Transform STRUCT-typed uses of primitives in local morph - #78131

Merged
jakobbotsch merged 8 commits into
dotnet:mainfrom
SingleAccretion:LclMorph-StructUse-Upstream
Nov 30, 2022
Merged

Transform STRUCT-typed uses of primitives in local morph#78131
jakobbotsch merged 8 commits into
dotnet:mainfrom
SingleAccretion:LclMorph-StructUse-Upstream

Conversation

@SingleAccretion

@SingleAccretionSingleAccretion commented Nov 9, 2022

Copy link
Copy Markdown
Contributor

And update global morph accordingly. This mainly involves not DNER-ing struct local fields right away, but waiting for global morph to do this, after it has had a chance to transform the field into an LCL_VAR.

Diffs are a bit mixed, due to requiring the substitution workaround but generally positive, and overall minor. The larger regressions in tests are due to us setting some DNERs later, thus expanding things into field-by-field copies more.

Note: this change is best reviewed with the "don't show whitespace diffs" setting.

@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 Nov 9, 2022
@SingleAccretionSingleAccretion mentioned this pull request Nov 9, 2022
@ghost

ghost commented Nov 9, 2022

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

And update global morph accordingly. This mainly involves giving not DNER-ing local fields right away, but waiting for global morph to do this, after it has had a chance to transform the field into an LCL_VAR.

Diffs are a bit mixed, due to requiring the substitution workaround but generally positive, and overall minor.

Author:SingleAccretion
Assignees:-
Labels:

area-CodeGen-coreclr, community-contribution

Milestone:-

@SingleAccretion
SingleAccretionforce-pushed the LclMorph-StructUse-Upstream branch from 0c36c00 to c911fd2CompareNovember 9, 2022 21:33
@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

This now depends on #76491.

@SingleAccretion
SingleAccretionforce-pushed the LclMorph-StructUse-Upstream branch from f532bc1 to 733af07CompareNovember 10, 2022 17:02
@SingleAccretion
SingleAccretionforce-pushed the LclMorph-StructUse-Upstream branch from 733af07 to c4fe2f5CompareNovember 11, 2022 13:40
@SingleAccretion
SingleAccretionforce-pushed the LclMorph-StructUse-Upstream branch from c4fe2f5 to 320cb8aCompareNovember 11, 2022 17:09
@SingleAccretion
SingleAccretion marked this pull request as ready for review November 11, 2022 21:16
@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

This is ready for review, but still depends on #76491.

@dotnet/jit-contrib

@BruceForstall

Copy link
Copy Markdown
Contributor

@SingleAccretion Needs conflict resolution

@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

Needs conflict resolution

Also done.

@jakobbotsch

Copy link
Copy Markdown
Member

/azp run runtime-coreclr superpmi-diffs, runtime-coreclr jitstress, runtime-coreclr libraries-jitstress

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 3 pipeline(s).

@SingleAccretion

SingleAccretion commented Nov 29, 2022

Copy link
Copy Markdown
ContributorAuthor

Libraries stress failures are #78909 and #78912.

@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

Stress failures:

  1. TypeGeneratorTests400-499: https://helixre107v0xdeko0k025g8.blob.core.windows.net/dotnet-runtime-refs-pull-78131-merge-7d3e4ae48c114120a0/TypeGeneratorTests400-499/1/console.0f672ed5.log?helixlogtype=result - looks to have passed actually?
12:46:58.844 Passed test: Loader/classloader/TypeGeneratorTests/TypeGeneratorTest499/Generated499/Generated499.dll
Expected: 100
Actual: 100
END EXECUTION - PASSED
+ export _commandExitCode=0
+ /usr/bin/python3 /datadisks/disk1/work/AF3D0989/p/reporter/run.py https://dev.azure.com/dnceng-public/ public 2032048 eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Im9PdmN6NU1fN3AtSGpJS2xGWHo5M3VfVjBabyJ9.eyJuYW1laWQiOiJjNzczZjJjMi01MTIwLTQyMDctYWZlMi1hZmFmMzVhOGJjMGEiLCJzY3AiOiJhcHBfdG9rZW4iLCJhdWkiOiJmMjgxYjY5ZS0xYjAzLTRiOWEtYWEyMy0xYzA4YWFhMzRjNTMiLCJzaWQiOiIzNTc3ODYxMS0yNjgxLTRhNTQtYTBkOC1lYWY2MjBhNzE2NTQiLCJCdWlsZElkIjoiY2JiMTgyNjEtYzQ4Zi00YWJiLTg2NTEtOGNkY2I1NDc0NjQ5Ozk1OTg0IiwicHBpZCI6InZzdGZzOi8vL0J1aWxkL0J1aWxkLzk1OTg0Iiwib3JjaGlkIjoiMTEzYzBmZmUtNjg4ZS00OWYxLWIwMDEtZTNhYTM0ODJkZTA1LmJ1aWxkLnJ1bl90ZXN0X3AxX19saW51eF94NjRfY2hlY2tlZC5fX2RlZmF1bHQiLCJyZXBvSWRzIjoiIiwiaXNzIjoiYXBwLnZzdG9rZW4udmlzdWFsc3R1ZGlvLmNvbSIsImF1ZCI6ImFwcC52c3Rva2VuLnZpc3VhbHN0dWRpby5jb218dnNvOjZmY2M5MmU1LTczYTctNGY4OC04ZDEzLWQ5MDQ1YjQ1ZmIyNyIsIm5iZiI6MTY2OTcyMjIxMSwiZXhwIjoxNjY5NzQ2ODExfQ.Sll8uONVwy9ZF9KTir7KbsJEDJ1UOe-vCIk4fL6oQfD52TnPQk082mPT1YKXwTrUuE0xSxNS7ehaYTSH5CGUN-RVDJDkgiJauEH6CLZvnNQrKJySShBowW7azSX7X_XYcpOT8-XafcEKFr_x1r-VUTgbl_GviHcFCTCv-KnHHOqIsj1Ma8DJRUzX3Lax12F2coGlh-ogqt8vm566VBsgTK6lUmJJuMXL3FceWGvVJUnpjdLYdtYcMIvU3s8o2_CE5zIWeVNH7GeqDEAW4afcydK9bQTmDxfffsWiT3zlhp0BO3BGlEZPrg5by-JVspcr30yakIn5YbrYLWmns4vmNg
Killed
['TypeGeneratorTests400-499' END OF WORK ITEM LOG: Command timed out, and was killed]
  1. JIT\\Regression\\JitBlue\\Runtime_63354\\Runtime_63354\\Runtime_63354.cmd, x86: Test failure JIT\\Regression\\JitBlue\\Runtime_63354\\Runtime_63354\\Runtime_63354.cmd #78898.

@jakobbotschjakobbotsch left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Looks great to me, very nice to no longer have to think about these cases after local morph.
Are you going to optimize other uses (e.g. the liveness change we discussed) in a follow-up?

@jakobbotsch
jakobbotsch merged commit be7030f into dotnet:mainNov 30, 2022
@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

Are you going to optimize other uses (e.g. the liveness change we discussed) in a follow-up?

Yep.

@SingleAccretion
SingleAccretion deleted the LclMorph-StructUse-Upstream branch November 30, 2022 13:40
@ghostghost locked as resolved and limited conversation to collaborators Dec 30, 2022
@JulieLeeMSFT

JulieLeeMSFT commented Aug 27, 2024

Copy link
Copy Markdown
Member

Hi @SingleAccretion, we are trying to clean up TODO comments. You touched this part of the code in this PR,

// TODO: support `genReturnBB != nullptr`, it requires #11413 to avoid `Incompatible types for
// gtNewTempStore`.
if (canFold && (genReturnBB == nullptr))
{
// Fold even if types do not match, lowering will handle it. This allows the local
// to remain DNER-free and be enregistered.
assert(lclFld->GetLclOffs() == 0);
lclFld->ChangeType(varDsc->TypeGet());
lclFld->SetOper(GT_LCL_VAR);
}
elseif (!varDsc->lvDoNotEnregister)
{
lvaSetVarDoNotEnregister(lclNum DEBUGARG(DoNotEnregisterReason::BlockOpRet));
}
. Our team members do not have much context on it, so I wanted to ask you if you know what to do to support genReturnBB != nullptr.
#11413 is now supported.

 // TODO: support `genReturnBB != nullptr`, it requires #11413 to avoid `Incompatible types for
// gtNewTempStore`.
if (canFold && (genReturnBB == nullptr))
{
// Fold even if types do not match, lowering will handle it. This allows the local
// to remain DNER-free and be enregistered.
assert(lclFld->GetLclOffs() == 0);
lclFld->ChangeType(varDsc->TypeGet());
lclFld->SetOper(GT_LCL_VAR);
}
else if (!varDsc->lvDoNotEnregister)
{
lvaSetVarDoNotEnregister(lclNum DEBUGARG(DoNotEnregisterReason::BlockOpRet));
}

@JulieLeeMSFT

Copy link
Copy Markdown
Member

BTW, the bitconverter instructions from #11413 does not hit this code path.

@dotnetdotnet unlocked this conversation Aug 27, 2024
@SingleAccretion

SingleAccretion commented Aug 27, 2024

Copy link
Copy Markdown
ContributorAuthor

I wanted to ask you if you know what to do to support genReturnBB != nullptr

@JulieLeeMSFT it requires removing the property that allows "ABI-compatible" types under a GT_RETURN node in HIR. What the comment is talking about is that if you have something like:

struct Integer { int Value; }
Integer GetMyInt() {
if (...)
return new Integer(1); // A primitive - we can retype that
else
return GetAnotherInt(); // A call that return a primitive struct - we don't/can't retype that.
}

If this could be transformed by morph into something like:

if (...)
GT_RETURN<struct>(CNS_INT<int>(1))
else
GT_RETURN<struct>(CALL<struct>())

The common return local path would get mismatched types:

if (...)
getReturnLcl<struct> = CNS_INT<int>(1); // Type mismatch!
else
getReturnLcl<struct> = CALL<struct>();
GT_RETURN<struct>(getReturnLcl);

It is why this optimization is only done when we don't have a common return local - genReturnBB == nullptr.

@JulieLeeMSFT

Copy link
Copy Markdown
Member

@JulieLeeMSFT it requires removing the property that allows "ABI-compatible" types under a GT_RETURN node in HIR. What the comment is talking about is that if you have something like:

Thanks @SingleAccretion for a quick response. I will take a look.

@jakobbotsch

Copy link
Copy Markdown
Member

@JulieLeeMSFT This won't be a simple fix. It overlaps with the work I need to do to enable better ABI treatment with physical promotion, and hopefully I can get to that by .NET 10.
Basically, we can consider this TODO to be tracked by #86665. Feel free to remove the "TODO" part of the comment from the code base now that #86665 calls this scenario out explicitly.

@JulieLeeMSFT

Copy link
Copy Markdown
Member

Sounds good. I will do that.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@SingleAccretion@BruceForstall@jakobbotsch@JulieLeeMSFT
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Transform STRUCT-typed uses of primitives in local morph - #78131

Merged
jakobbotsch merged 8 commits into
dotnet:mainfrom
SingleAccretion:LclMorph-StructUse-Upstream
Nov 30, 2022
Merged

Transform STRUCT-typed uses of primitives in local morph#78131
jakobbotsch merged 8 commits into
dotnet:mainfrom
SingleAccretion:LclMorph-StructUse-Upstream

Conversation

@SingleAccretion

@SingleAccretionSingleAccretion commented Nov 9, 2022

Copy link
Copy Markdown
Contributor

And update global morph accordingly. This mainly involves not DNER-ing struct local fields right away, but waiting for global morph to do this, after it has had a chance to transform the field into an LCL_VAR.

Diffs are a bit mixed, due to requiring the substitution workaround but generally positive, and overall minor. The larger regressions in tests are due to us setting some DNERs later, thus expanding things into field-by-field copies more.

Note: this change is best reviewed with the "don't show whitespace diffs" setting.

@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 Nov 9, 2022
@SingleAccretionSingleAccretion mentioned this pull request Nov 9, 2022
@ghost

ghost commented Nov 9, 2022

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

And update global morph accordingly. This mainly involves giving not DNER-ing local fields right away, but waiting for global morph to do this, after it has had a chance to transform the field into an LCL_VAR.

Diffs are a bit mixed, due to requiring the substitution workaround but generally positive, and overall minor.

Author:SingleAccretion
Assignees:-
Labels:

area-CodeGen-coreclr, community-contribution

Milestone:-

@SingleAccretion
SingleAccretionforce-pushed the LclMorph-StructUse-Upstream branch from 0c36c00 to c911fd2CompareNovember 9, 2022 21:33
@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

This now depends on #76491.

@SingleAccretion
SingleAccretionforce-pushed the LclMorph-StructUse-Upstream branch from f532bc1 to 733af07CompareNovember 10, 2022 17:02
@SingleAccretion
SingleAccretionforce-pushed the LclMorph-StructUse-Upstream branch from 733af07 to c4fe2f5CompareNovember 11, 2022 13:40
@SingleAccretion
SingleAccretionforce-pushed the LclMorph-StructUse-Upstream branch from c4fe2f5 to 320cb8aCompareNovember 11, 2022 17:09
@SingleAccretion
SingleAccretion marked this pull request as ready for review November 11, 2022 21:16
@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

This is ready for review, but still depends on #76491.

@dotnet/jit-contrib

@BruceForstall

Copy link
Copy Markdown
Contributor

@SingleAccretion Needs conflict resolution

@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

Needs conflict resolution

Also done.

@jakobbotsch

Copy link
Copy Markdown
Member

/azp run runtime-coreclr superpmi-diffs, runtime-coreclr jitstress, runtime-coreclr libraries-jitstress

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 3 pipeline(s).

@SingleAccretion

SingleAccretion commented Nov 29, 2022

Copy link
Copy Markdown
ContributorAuthor

Libraries stress failures are #78909 and #78912.

@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

Stress failures:

  1. TypeGeneratorTests400-499: https://helixre107v0xdeko0k025g8.blob.core.windows.net/dotnet-runtime-refs-pull-78131-merge-7d3e4ae48c114120a0/TypeGeneratorTests400-499/1/console.0f672ed5.log?helixlogtype=result - looks to have passed actually?
12:46:58.844 Passed test: Loader/classloader/TypeGeneratorTests/TypeGeneratorTest499/Generated499/Generated499.dll
Expected: 100
Actual: 100
END EXECUTION - PASSED
+ export _commandExitCode=0
+ /usr/bin/python3 /datadisks/disk1/work/AF3D0989/p/reporter/run.py https://dev.azure.com/dnceng-public/ public 2032048 eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Im9PdmN6NU1fN3AtSGpJS2xGWHo5M3VfVjBabyJ9.eyJuYW1laWQiOiJjNzczZjJjMi01MTIwLTQyMDctYWZlMi1hZmFmMzVhOGJjMGEiLCJzY3AiOiJhcHBfdG9rZW4iLCJhdWkiOiJmMjgxYjY5ZS0xYjAzLTRiOWEtYWEyMy0xYzA4YWFhMzRjNTMiLCJzaWQiOiIzNTc3ODYxMS0yNjgxLTRhNTQtYTBkOC1lYWY2MjBhNzE2NTQiLCJCdWlsZElkIjoiY2JiMTgyNjEtYzQ4Zi00YWJiLTg2NTEtOGNkY2I1NDc0NjQ5Ozk1OTg0IiwicHBpZCI6InZzdGZzOi8vL0J1aWxkL0J1aWxkLzk1OTg0Iiwib3JjaGlkIjoiMTEzYzBmZmUtNjg4ZS00OWYxLWIwMDEtZTNhYTM0ODJkZTA1LmJ1aWxkLnJ1bl90ZXN0X3AxX19saW51eF94NjRfY2hlY2tlZC5fX2RlZmF1bHQiLCJyZXBvSWRzIjoiIiwiaXNzIjoiYXBwLnZzdG9rZW4udmlzdWFsc3R1ZGlvLmNvbSIsImF1ZCI6ImFwcC52c3Rva2VuLnZpc3VhbHN0dWRpby5jb218dnNvOjZmY2M5MmU1LTczYTctNGY4OC04ZDEzLWQ5MDQ1YjQ1ZmIyNyIsIm5iZiI6MTY2OTcyMjIxMSwiZXhwIjoxNjY5NzQ2ODExfQ.Sll8uONVwy9ZF9KTir7KbsJEDJ1UOe-vCIk4fL6oQfD52TnPQk082mPT1YKXwTrUuE0xSxNS7ehaYTSH5CGUN-RVDJDkgiJauEH6CLZvnNQrKJySShBowW7azSX7X_XYcpOT8-XafcEKFr_x1r-VUTgbl_GviHcFCTCv-KnHHOqIsj1Ma8DJRUzX3Lax12F2coGlh-ogqt8vm566VBsgTK6lUmJJuMXL3FceWGvVJUnpjdLYdtYcMIvU3s8o2_CE5zIWeVNH7GeqDEAW4afcydK9bQTmDxfffsWiT3zlhp0BO3BGlEZPrg5by-JVspcr30yakIn5YbrYLWmns4vmNg
Killed
['TypeGeneratorTests400-499' END OF WORK ITEM LOG: Command timed out, and was killed]
  1. JIT\\Regression\\JitBlue\\Runtime_63354\\Runtime_63354\\Runtime_63354.cmd, x86: Test failure JIT\\Regression\\JitBlue\\Runtime_63354\\Runtime_63354\\Runtime_63354.cmd #78898.

@jakobbotschjakobbotsch left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Looks great to me, very nice to no longer have to think about these cases after local morph.
Are you going to optimize other uses (e.g. the liveness change we discussed) in a follow-up?

@jakobbotsch
jakobbotsch merged commit be7030f into dotnet:mainNov 30, 2022
@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

Are you going to optimize other uses (e.g. the liveness change we discussed) in a follow-up?

Yep.

@SingleAccretion
SingleAccretion deleted the LclMorph-StructUse-Upstream branch November 30, 2022 13:40
@ghostghost locked as resolved and limited conversation to collaborators Dec 30, 2022
@JulieLeeMSFT

JulieLeeMSFT commented Aug 27, 2024

Copy link
Copy Markdown
Member

Hi @SingleAccretion, we are trying to clean up TODO comments. You touched this part of the code in this PR,

// TODO: support `genReturnBB != nullptr`, it requires #11413 to avoid `Incompatible types for
// gtNewTempStore`.
if (canFold && (genReturnBB == nullptr))
{
// Fold even if types do not match, lowering will handle it. This allows the local
// to remain DNER-free and be enregistered.
assert(lclFld->GetLclOffs() == 0);
lclFld->ChangeType(varDsc->TypeGet());
lclFld->SetOper(GT_LCL_VAR);
}
elseif (!varDsc->lvDoNotEnregister)
{
lvaSetVarDoNotEnregister(lclNum DEBUGARG(DoNotEnregisterReason::BlockOpRet));
}
. Our team members do not have much context on it, so I wanted to ask you if you know what to do to support genReturnBB != nullptr.
#11413 is now supported.

 // TODO: support `genReturnBB != nullptr`, it requires #11413 to avoid `Incompatible types for
// gtNewTempStore`.
if (canFold && (genReturnBB == nullptr))
{
// Fold even if types do not match, lowering will handle it. This allows the local
// to remain DNER-free and be enregistered.
assert(lclFld->GetLclOffs() == 0);
lclFld->ChangeType(varDsc->TypeGet());
lclFld->SetOper(GT_LCL_VAR);
}
else if (!varDsc->lvDoNotEnregister)
{
lvaSetVarDoNotEnregister(lclNum DEBUGARG(DoNotEnregisterReason::BlockOpRet));
}

@JulieLeeMSFT

Copy link
Copy Markdown
Member

BTW, the bitconverter instructions from #11413 does not hit this code path.

@dotnetdotnet unlocked this conversation Aug 27, 2024
@SingleAccretion

SingleAccretion commented Aug 27, 2024

Copy link
Copy Markdown
ContributorAuthor

I wanted to ask you if you know what to do to support genReturnBB != nullptr

@JulieLeeMSFT it requires removing the property that allows "ABI-compatible" types under a GT_RETURN node in HIR. What the comment is talking about is that if you have something like:

struct Integer { int Value; }
Integer GetMyInt() {
if (...)
return new Integer(1); // A primitive - we can retype that
else
return GetAnotherInt(); // A call that return a primitive struct - we don't/can't retype that.
}

If this could be transformed by morph into something like:

if (...)
GT_RETURN<struct>(CNS_INT<int>(1))
else
GT_RETURN<struct>(CALL<struct>())

The common return local path would get mismatched types:

if (...)
getReturnLcl<struct> = CNS_INT<int>(1); // Type mismatch!
else
getReturnLcl<struct> = CALL<struct>();
GT_RETURN<struct>(getReturnLcl);

It is why this optimization is only done when we don't have a common return local - genReturnBB == nullptr.

@JulieLeeMSFT

Copy link
Copy Markdown
Member

@JulieLeeMSFT it requires removing the property that allows "ABI-compatible" types under a GT_RETURN node in HIR. What the comment is talking about is that if you have something like:

Thanks @SingleAccretion for a quick response. I will take a look.

@jakobbotsch

Copy link
Copy Markdown
Member

@JulieLeeMSFT This won't be a simple fix. It overlaps with the work I need to do to enable better ABI treatment with physical promotion, and hopefully I can get to that by .NET 10.
Basically, we can consider this TODO to be tracked by #86665. Feel free to remove the "TODO" part of the comment from the code base now that #86665 calls this scenario out explicitly.

@JulieLeeMSFT

Copy link
Copy Markdown
Member

Sounds good. I will do that.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@SingleAccretion@BruceForstall@jakobbotsch@JulieLeeMSFT
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Transform STRUCT-typed uses of primitives in local morph - #78131

Merged
jakobbotsch merged 8 commits into
dotnet:mainfrom
SingleAccretion:LclMorph-StructUse-Upstream
Nov 30, 2022
Merged

Transform STRUCT-typed uses of primitives in local morph#78131
jakobbotsch merged 8 commits into
dotnet:mainfrom
SingleAccretion:LclMorph-StructUse-Upstream

Conversation

@SingleAccretion

@SingleAccretionSingleAccretion commented Nov 9, 2022

Copy link
Copy Markdown
Contributor

And update global morph accordingly. This mainly involves not DNER-ing struct local fields right away, but waiting for global morph to do this, after it has had a chance to transform the field into an LCL_VAR.

Diffs are a bit mixed, due to requiring the substitution workaround but generally positive, and overall minor. The larger regressions in tests are due to us setting some DNERs later, thus expanding things into field-by-field copies more.

Note: this change is best reviewed with the "don't show whitespace diffs" setting.

@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 Nov 9, 2022
@SingleAccretionSingleAccretion mentioned this pull request Nov 9, 2022
@ghost

ghost commented Nov 9, 2022

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

And update global morph accordingly. This mainly involves giving not DNER-ing local fields right away, but waiting for global morph to do this, after it has had a chance to transform the field into an LCL_VAR.

Diffs are a bit mixed, due to requiring the substitution workaround but generally positive, and overall minor.

Author:SingleAccretion
Assignees:-
Labels:

area-CodeGen-coreclr, community-contribution

Milestone:-

@SingleAccretion
SingleAccretionforce-pushed the LclMorph-StructUse-Upstream branch from 0c36c00 to c911fd2CompareNovember 9, 2022 21:33
@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

This now depends on #76491.

@SingleAccretion
SingleAccretionforce-pushed the LclMorph-StructUse-Upstream branch from f532bc1 to 733af07CompareNovember 10, 2022 17:02
@SingleAccretion
SingleAccretionforce-pushed the LclMorph-StructUse-Upstream branch from 733af07 to c4fe2f5CompareNovember 11, 2022 13:40
@SingleAccretion
SingleAccretionforce-pushed the LclMorph-StructUse-Upstream branch from c4fe2f5 to 320cb8aCompareNovember 11, 2022 17:09
@SingleAccretion
SingleAccretion marked this pull request as ready for review November 11, 2022 21:16
@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

This is ready for review, but still depends on #76491.

@dotnet/jit-contrib

@BruceForstall

Copy link
Copy Markdown
Contributor

@SingleAccretion Needs conflict resolution

@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

Needs conflict resolution

Also done.

@jakobbotsch

Copy link
Copy Markdown
Member

/azp run runtime-coreclr superpmi-diffs, runtime-coreclr jitstress, runtime-coreclr libraries-jitstress

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 3 pipeline(s).

@SingleAccretion

SingleAccretion commented Nov 29, 2022

Copy link
Copy Markdown
ContributorAuthor

Libraries stress failures are #78909 and #78912.

@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

Stress failures:

  1. TypeGeneratorTests400-499: https://helixre107v0xdeko0k025g8.blob.core.windows.net/dotnet-runtime-refs-pull-78131-merge-7d3e4ae48c114120a0/TypeGeneratorTests400-499/1/console.0f672ed5.log?helixlogtype=result - looks to have passed actually?
12:46:58.844 Passed test: Loader/classloader/TypeGeneratorTests/TypeGeneratorTest499/Generated499/Generated499.dll
Expected: 100
Actual: 100
END EXECUTION - PASSED
+ export _commandExitCode=0
+ /usr/bin/python3 /datadisks/disk1/work/AF3D0989/p/reporter/run.py https://dev.azure.com/dnceng-public/ public 2032048 eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Im9PdmN6NU1fN3AtSGpJS2xGWHo5M3VfVjBabyJ9.eyJuYW1laWQiOiJjNzczZjJjMi01MTIwLTQyMDctYWZlMi1hZmFmMzVhOGJjMGEiLCJzY3AiOiJhcHBfdG9rZW4iLCJhdWkiOiJmMjgxYjY5ZS0xYjAzLTRiOWEtYWEyMy0xYzA4YWFhMzRjNTMiLCJzaWQiOiIzNTc3ODYxMS0yNjgxLTRhNTQtYTBkOC1lYWY2MjBhNzE2NTQiLCJCdWlsZElkIjoiY2JiMTgyNjEtYzQ4Zi00YWJiLTg2NTEtOGNkY2I1NDc0NjQ5Ozk1OTg0IiwicHBpZCI6InZzdGZzOi8vL0J1aWxkL0J1aWxkLzk1OTg0Iiwib3JjaGlkIjoiMTEzYzBmZmUtNjg4ZS00OWYxLWIwMDEtZTNhYTM0ODJkZTA1LmJ1aWxkLnJ1bl90ZXN0X3AxX19saW51eF94NjRfY2hlY2tlZC5fX2RlZmF1bHQiLCJyZXBvSWRzIjoiIiwiaXNzIjoiYXBwLnZzdG9rZW4udmlzdWFsc3R1ZGlvLmNvbSIsImF1ZCI6ImFwcC52c3Rva2VuLnZpc3VhbHN0dWRpby5jb218dnNvOjZmY2M5MmU1LTczYTctNGY4OC04ZDEzLWQ5MDQ1YjQ1ZmIyNyIsIm5iZiI6MTY2OTcyMjIxMSwiZXhwIjoxNjY5NzQ2ODExfQ.Sll8uONVwy9ZF9KTir7KbsJEDJ1UOe-vCIk4fL6oQfD52TnPQk082mPT1YKXwTrUuE0xSxNS7ehaYTSH5CGUN-RVDJDkgiJauEH6CLZvnNQrKJySShBowW7azSX7X_XYcpOT8-XafcEKFr_x1r-VUTgbl_GviHcFCTCv-KnHHOqIsj1Ma8DJRUzX3Lax12F2coGlh-ogqt8vm566VBsgTK6lUmJJuMXL3FceWGvVJUnpjdLYdtYcMIvU3s8o2_CE5zIWeVNH7GeqDEAW4afcydK9bQTmDxfffsWiT3zlhp0BO3BGlEZPrg5by-JVspcr30yakIn5YbrYLWmns4vmNg
Killed
['TypeGeneratorTests400-499' END OF WORK ITEM LOG: Command timed out, and was killed]
  1. JIT\\Regression\\JitBlue\\Runtime_63354\\Runtime_63354\\Runtime_63354.cmd, x86: Test failure JIT\\Regression\\JitBlue\\Runtime_63354\\Runtime_63354\\Runtime_63354.cmd #78898.

@jakobbotschjakobbotsch left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Looks great to me, very nice to no longer have to think about these cases after local morph.
Are you going to optimize other uses (e.g. the liveness change we discussed) in a follow-up?

@jakobbotsch
jakobbotsch merged commit be7030f into dotnet:mainNov 30, 2022
@SingleAccretion

Copy link
Copy Markdown
ContributorAuthor

Are you going to optimize other uses (e.g. the liveness change we discussed) in a follow-up?

Yep.

@SingleAccretion
SingleAccretion deleted the LclMorph-StructUse-Upstream branch November 30, 2022 13:40
@ghostghost locked as resolved and limited conversation to collaborators Dec 30, 2022
@JulieLeeMSFT

JulieLeeMSFT commented Aug 27, 2024

Copy link
Copy Markdown
Member

Hi @SingleAccretion, we are trying to clean up TODO comments. You touched this part of the code in this PR,

// TODO: support `genReturnBB != nullptr`, it requires #11413 to avoid `Incompatible types for
// gtNewTempStore`.
if (canFold && (genReturnBB == nullptr))
{
// Fold even if types do not match, lowering will handle it. This allows the local
// to remain DNER-free and be enregistered.
assert(lclFld->GetLclOffs() == 0);
lclFld->ChangeType(varDsc->TypeGet());
lclFld->SetOper(GT_LCL_VAR);
}
elseif (!varDsc->lvDoNotEnregister)
{
lvaSetVarDoNotEnregister(lclNum DEBUGARG(DoNotEnregisterReason::BlockOpRet));
}
. Our team members do not have much context on it, so I wanted to ask you if you know what to do to support genReturnBB != nullptr.
#11413 is now supported.

 // TODO: support `genReturnBB != nullptr`, it requires #11413 to avoid `Incompatible types for
// gtNewTempStore`.
if (canFold && (genReturnBB == nullptr))
{
// Fold even if types do not match, lowering will handle it. This allows the local
// to remain DNER-free and be enregistered.
assert(lclFld->GetLclOffs() == 0);
lclFld->ChangeType(varDsc->TypeGet());
lclFld->SetOper(GT_LCL_VAR);
}
else if (!varDsc->lvDoNotEnregister)
{
lvaSetVarDoNotEnregister(lclNum DEBUGARG(DoNotEnregisterReason::BlockOpRet));
}

@JulieLeeMSFT

Copy link
Copy Markdown
Member

BTW, the bitconverter instructions from #11413 does not hit this code path.

@dotnetdotnet unlocked this conversation Aug 27, 2024
@SingleAccretion

SingleAccretion commented Aug 27, 2024

Copy link
Copy Markdown
ContributorAuthor

I wanted to ask you if you know what to do to support genReturnBB != nullptr

@JulieLeeMSFT it requires removing the property that allows "ABI-compatible" types under a GT_RETURN node in HIR. What the comment is talking about is that if you have something like:

struct Integer { int Value; }
Integer GetMyInt() {
if (...)
return new Integer(1); // A primitive - we can retype that
else
return GetAnotherInt(); // A call that return a primitive struct - we don't/can't retype that.
}

If this could be transformed by morph into something like:

if (...)
GT_RETURN<struct>(CNS_INT<int>(1))
else
GT_RETURN<struct>(CALL<struct>())

The common return local path would get mismatched types:

if (...)
getReturnLcl<struct> = CNS_INT<int>(1); // Type mismatch!
else
getReturnLcl<struct> = CALL<struct>();
GT_RETURN<struct>(getReturnLcl);

It is why this optimization is only done when we don't have a common return local - genReturnBB == nullptr.

@JulieLeeMSFT

Copy link
Copy Markdown
Member

@JulieLeeMSFT it requires removing the property that allows "ABI-compatible" types under a GT_RETURN node in HIR. What the comment is talking about is that if you have something like:

Thanks @SingleAccretion for a quick response. I will take a look.

@jakobbotsch

Copy link
Copy Markdown
Member

@JulieLeeMSFT This won't be a simple fix. It overlaps with the work I need to do to enable better ABI treatment with physical promotion, and hopefully I can get to that by .NET 10.
Basically, we can consider this TODO to be tracked by #86665. Feel free to remove the "TODO" part of the comment from the code base now that #86665 calls this scenario out explicitly.

@JulieLeeMSFT

Copy link
Copy Markdown
Member

Sounds good. I will do that.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@SingleAccretion@BruceForstall@jakobbotsch@JulieLeeMSFT