[x64][SysV] Classify empty structs for passing like padding - #103799

Merged
jakobbotsch merged 4 commits into
dotnet:mainfrom
tomeksowi:sysv-empty-struct-passing
Jun 28, 2024
Merged

[x64][SysV] Classify empty structs for passing like padding#103799
jakobbotsch merged 4 commits into
dotnet:mainfrom
tomeksowi:sysv-empty-struct-passing

Conversation

@tomeksowi

Copy link
Copy Markdown
Member

The current implementation barred a struct containing empty struct fields from enregistration. This did not match the behavior of GCC & Clang on Linux and the System V ABI which says:

NO_CLASS This class is used as initializer in the algorithms. It will be used for padding and empty structures and unions.

Stems from #101796, part of #84834, cc @dotnet/samsung

The current implementation barred a struct containing empty struct fields from enregistration. This did not match the [System V ABI](https://refspecs.linuxbase.org/elf/x86_64-abi-0.99.pdf) which says "NO_CLASS This class is used as initializer in the algorithms. It will be used for padding and **empty structures** and unions". It also does not match the behavior of GCC & Clang on Linux.
@ghostghost added the area-ReadyToRun label Jun 21, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Jun 21, 2024
@jkotas

Copy link
Copy Markdown
Member

Could you please add some tests? src\tests\JIT\Directed\StructABI looks like a good place

@jkotasjkotas added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI and removed area-ReadyToRun labels Jun 21, 2024
@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.

@jkotas

Copy link
Copy Markdown
Member

cc @dotnet/jit-contrib @jakobbotsch

// then the classification of this eightbyte might be NoClass. We can't hand a classification of NoClass to the JIT
// so set the class to Integer (as though the struct has a char[8] padding) if the class is NoClass.
//
// TODO: Fix JIT, NoClass eightbytes are valid and passing them is broken because of this.

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.

Do you plan to fix this TODO in this PR?

@tomeksowitomeksowiJun 21, 2024

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

No. It would require going through the JIT like I did in #101796 for RISC-V and fix in many places. Right now my priority is on RISC-V but when I'm done with #101796 I can revisit it. By then @jakobbotsch's ongoing effort to centralize ABI passing infos will probably be more advanced, which will also facilitate fixing x64.

@tomeksowi

tomeksowi commented Jun 21, 2024

Copy link
Copy Markdown
MemberAuthor

Could you please add some tests? src\tests\JIT\Directed\StructABI looks like a good place

Sure, I'll lift a couple from #101796.

EDIT: In fact, I think I can lift the entire test suite and disable Empty8Float tests on System V.
EDIT2: I added some dedicated tests for System V after all, RISC-V will be added in subsequent PRs.

@tomeksowi

Copy link
Copy Markdown
MemberAuthor

I think the GC\Scenarios\RanCollect\rancollect\rancollect.cmd time-out on Windows x64 is not related to this change (which is System V only).

// then the classification of this eightbyte might be NoClass. We can't hand a classification of NoClass to the JIT
// so set the class to Integer (as though the struct has a char[8] padding) if the class is NoClass.
//
// TODO: Fix JIT, NoClass eightbytes are valid and passing them is broken because of this.

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.

What does the difference between NoClass and something like char[8] end up being? For significant padding (structs with explicit layout) it seems like we have to consider them to be the same or things will end up odd/wrong.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

char[8] is an INTEGER eightbyte which gets assigned an integer register for passing; a NO_CLASS eightbyte doesn't get any register. Passing on the stack is the same, though (NO_CLASS padding does take up space).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Opened #104098 as I'll need an URL for ActiveIssue in tests in future PRs.

Meanwhile this smaller fix is ready for review.

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.

Does this fix handle the significant padding cases correctly (i.e. as before this change)?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

It should, the NO_CLASS -> INTEGER eightbyte reclassification is still there. And I didn't see any CLR tests (prio1) go off on Checked build, assuming there are tests for significant padding by now.

@jakobbotsch

Copy link
Copy Markdown
Member

@MihuBot

@jakobbotsch

Copy link
Copy Markdown
Member

It looks like there's a bunch of asm diffs with this change, can you take a look at whether they are expected?

@tomeksowi

Copy link
Copy Markdown
MemberAuthor

It looks like there's a bunch of asm diffs with this change, can you take a look at whether they are expected?

Thanks for running the bot. Diffs are to be expected, some arguments which used to be passed by reference are now enregistered but large amount of performance regressions are worrying. I'll look at it in spare time between RISC-V PRs.

@jakobbotsch

Copy link
Copy Markdown
Member

Diffs are to be expected, some arguments which used to be passed by reference are now enregistered but large amount of performance regressions are worrying

Note that they are size diffs only, and overall the size improves. I spot checked a few of the regressions and it's usually the result of some new register shuffling because of an empty struct now taking up a register, so I guess those diffs are overall expected. Some of these cases look like they could be switched to static abstracts to avoid the parameter entirely.

@jkotas I assume we are ok to take an ABI change like this one since the R2R format is already being bumped?

@jkotas

Copy link
Copy Markdown
Member

@jkotas I assume we are ok to take an ABI change like this one since the R2R format is already being bumped?

Yes. I do not see a problem with the ABI change here.

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

Thanks!

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 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.

3 participants

@tomeksowi@jkotas@jakobbotsch
, '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

[x64][SysV] Classify empty structs for passing like padding - #103799

Merged
jakobbotsch merged 4 commits into
dotnet:mainfrom
tomeksowi:sysv-empty-struct-passing
Jun 28, 2024
Merged

[x64][SysV] Classify empty structs for passing like padding#103799
jakobbotsch merged 4 commits into
dotnet:mainfrom
tomeksowi:sysv-empty-struct-passing

Conversation

@tomeksowi

Copy link
Copy Markdown
Member

The current implementation barred a struct containing empty struct fields from enregistration. This did not match the behavior of GCC & Clang on Linux and the System V ABI which says:

NO_CLASS This class is used as initializer in the algorithms. It will be used for padding and empty structures and unions.

Stems from #101796, part of #84834, cc @dotnet/samsung

The current implementation barred a struct containing empty struct fields from enregistration. This did not match the [System V ABI](https://refspecs.linuxbase.org/elf/x86_64-abi-0.99.pdf) which says "NO_CLASS This class is used as initializer in the algorithms. It will be used for padding and **empty structures** and unions". It also does not match the behavior of GCC & Clang on Linux.
@ghostghost added the area-ReadyToRun label Jun 21, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Jun 21, 2024
@jkotas

Copy link
Copy Markdown
Member

Could you please add some tests? src\tests\JIT\Directed\StructABI looks like a good place

@jkotasjkotas added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI and removed area-ReadyToRun labels Jun 21, 2024
@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.

@jkotas

Copy link
Copy Markdown
Member

cc @dotnet/jit-contrib @jakobbotsch

// then the classification of this eightbyte might be NoClass. We can't hand a classification of NoClass to the JIT
// so set the class to Integer (as though the struct has a char[8] padding) if the class is NoClass.
//
// TODO: Fix JIT, NoClass eightbytes are valid and passing them is broken because of this.

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.

Do you plan to fix this TODO in this PR?

@tomeksowitomeksowiJun 21, 2024

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

No. It would require going through the JIT like I did in #101796 for RISC-V and fix in many places. Right now my priority is on RISC-V but when I'm done with #101796 I can revisit it. By then @jakobbotsch's ongoing effort to centralize ABI passing infos will probably be more advanced, which will also facilitate fixing x64.

@tomeksowi

tomeksowi commented Jun 21, 2024

Copy link
Copy Markdown
MemberAuthor

Could you please add some tests? src\tests\JIT\Directed\StructABI looks like a good place

Sure, I'll lift a couple from #101796.

EDIT: In fact, I think I can lift the entire test suite and disable Empty8Float tests on System V.
EDIT2: I added some dedicated tests for System V after all, RISC-V will be added in subsequent PRs.

@tomeksowi

Copy link
Copy Markdown
MemberAuthor

I think the GC\Scenarios\RanCollect\rancollect\rancollect.cmd time-out on Windows x64 is not related to this change (which is System V only).

// then the classification of this eightbyte might be NoClass. We can't hand a classification of NoClass to the JIT
// so set the class to Integer (as though the struct has a char[8] padding) if the class is NoClass.
//
// TODO: Fix JIT, NoClass eightbytes are valid and passing them is broken because of this.

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.

What does the difference between NoClass and something like char[8] end up being? For significant padding (structs with explicit layout) it seems like we have to consider them to be the same or things will end up odd/wrong.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

char[8] is an INTEGER eightbyte which gets assigned an integer register for passing; a NO_CLASS eightbyte doesn't get any register. Passing on the stack is the same, though (NO_CLASS padding does take up space).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Opened #104098 as I'll need an URL for ActiveIssue in tests in future PRs.

Meanwhile this smaller fix is ready for review.

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.

Does this fix handle the significant padding cases correctly (i.e. as before this change)?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

It should, the NO_CLASS -> INTEGER eightbyte reclassification is still there. And I didn't see any CLR tests (prio1) go off on Checked build, assuming there are tests for significant padding by now.

@jakobbotsch

Copy link
Copy Markdown
Member

@MihuBot

@jakobbotsch

Copy link
Copy Markdown
Member

It looks like there's a bunch of asm diffs with this change, can you take a look at whether they are expected?

@tomeksowi

Copy link
Copy Markdown
MemberAuthor

It looks like there's a bunch of asm diffs with this change, can you take a look at whether they are expected?

Thanks for running the bot. Diffs are to be expected, some arguments which used to be passed by reference are now enregistered but large amount of performance regressions are worrying. I'll look at it in spare time between RISC-V PRs.

@jakobbotsch

Copy link
Copy Markdown
Member

Diffs are to be expected, some arguments which used to be passed by reference are now enregistered but large amount of performance regressions are worrying

Note that they are size diffs only, and overall the size improves. I spot checked a few of the regressions and it's usually the result of some new register shuffling because of an empty struct now taking up a register, so I guess those diffs are overall expected. Some of these cases look like they could be switched to static abstracts to avoid the parameter entirely.

@jkotas I assume we are ok to take an ABI change like this one since the R2R format is already being bumped?

@jkotas

Copy link
Copy Markdown
Member

@jkotas I assume we are ok to take an ABI change like this one since the R2R format is already being bumped?

Yes. I do not see a problem with the ABI change here.

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

Thanks!

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 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.

3 participants

@tomeksowi@jkotas@jakobbotsch
, '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

[x64][SysV] Classify empty structs for passing like padding - #103799

Merged
jakobbotsch merged 4 commits into
dotnet:mainfrom
tomeksowi:sysv-empty-struct-passing
Jun 28, 2024
Merged

[x64][SysV] Classify empty structs for passing like padding#103799
jakobbotsch merged 4 commits into
dotnet:mainfrom
tomeksowi:sysv-empty-struct-passing

Conversation

@tomeksowi

Copy link
Copy Markdown
Member

The current implementation barred a struct containing empty struct fields from enregistration. This did not match the behavior of GCC & Clang on Linux and the System V ABI which says:

NO_CLASS This class is used as initializer in the algorithms. It will be used for padding and empty structures and unions.

Stems from #101796, part of #84834, cc @dotnet/samsung

The current implementation barred a struct containing empty struct fields from enregistration. This did not match the [System V ABI](https://refspecs.linuxbase.org/elf/x86_64-abi-0.99.pdf) which says "NO_CLASS This class is used as initializer in the algorithms. It will be used for padding and **empty structures** and unions". It also does not match the behavior of GCC & Clang on Linux.
@ghostghost added the area-ReadyToRun label Jun 21, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Jun 21, 2024
@jkotas

Copy link
Copy Markdown
Member

Could you please add some tests? src\tests\JIT\Directed\StructABI looks like a good place

@jkotasjkotas added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI and removed area-ReadyToRun labels Jun 21, 2024
@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.

@jkotas

Copy link
Copy Markdown
Member

cc @dotnet/jit-contrib @jakobbotsch

// then the classification of this eightbyte might be NoClass. We can't hand a classification of NoClass to the JIT
// so set the class to Integer (as though the struct has a char[8] padding) if the class is NoClass.
//
// TODO: Fix JIT, NoClass eightbytes are valid and passing them is broken because of this.

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.

Do you plan to fix this TODO in this PR?

@tomeksowitomeksowiJun 21, 2024

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

No. It would require going through the JIT like I did in #101796 for RISC-V and fix in many places. Right now my priority is on RISC-V but when I'm done with #101796 I can revisit it. By then @jakobbotsch's ongoing effort to centralize ABI passing infos will probably be more advanced, which will also facilitate fixing x64.

@tomeksowi

tomeksowi commented Jun 21, 2024

Copy link
Copy Markdown
MemberAuthor

Could you please add some tests? src\tests\JIT\Directed\StructABI looks like a good place

Sure, I'll lift a couple from #101796.

EDIT: In fact, I think I can lift the entire test suite and disable Empty8Float tests on System V.
EDIT2: I added some dedicated tests for System V after all, RISC-V will be added in subsequent PRs.

@tomeksowi

Copy link
Copy Markdown
MemberAuthor

I think the GC\Scenarios\RanCollect\rancollect\rancollect.cmd time-out on Windows x64 is not related to this change (which is System V only).

// then the classification of this eightbyte might be NoClass. We can't hand a classification of NoClass to the JIT
// so set the class to Integer (as though the struct has a char[8] padding) if the class is NoClass.
//
// TODO: Fix JIT, NoClass eightbytes are valid and passing them is broken because of this.

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.

What does the difference between NoClass and something like char[8] end up being? For significant padding (structs with explicit layout) it seems like we have to consider them to be the same or things will end up odd/wrong.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

char[8] is an INTEGER eightbyte which gets assigned an integer register for passing; a NO_CLASS eightbyte doesn't get any register. Passing on the stack is the same, though (NO_CLASS padding does take up space).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Opened #104098 as I'll need an URL for ActiveIssue in tests in future PRs.

Meanwhile this smaller fix is ready for review.

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.

Does this fix handle the significant padding cases correctly (i.e. as before this change)?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

It should, the NO_CLASS -> INTEGER eightbyte reclassification is still there. And I didn't see any CLR tests (prio1) go off on Checked build, assuming there are tests for significant padding by now.

@jakobbotsch

Copy link
Copy Markdown
Member

@MihuBot

@jakobbotsch

Copy link
Copy Markdown
Member

It looks like there's a bunch of asm diffs with this change, can you take a look at whether they are expected?

@tomeksowi

Copy link
Copy Markdown
MemberAuthor

It looks like there's a bunch of asm diffs with this change, can you take a look at whether they are expected?

Thanks for running the bot. Diffs are to be expected, some arguments which used to be passed by reference are now enregistered but large amount of performance regressions are worrying. I'll look at it in spare time between RISC-V PRs.

@jakobbotsch

Copy link
Copy Markdown
Member

Diffs are to be expected, some arguments which used to be passed by reference are now enregistered but large amount of performance regressions are worrying

Note that they are size diffs only, and overall the size improves. I spot checked a few of the regressions and it's usually the result of some new register shuffling because of an empty struct now taking up a register, so I guess those diffs are overall expected. Some of these cases look like they could be switched to static abstracts to avoid the parameter entirely.

@jkotas I assume we are ok to take an ABI change like this one since the R2R format is already being bumped?

@jkotas

Copy link
Copy Markdown
Member

@jkotas I assume we are ok to take an ABI change like this one since the R2R format is already being bumped?

Yes. I do not see a problem with the ABI change here.

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

Thanks!

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 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.

3 participants

@tomeksowi@jkotas@jakobbotsch
, '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

[x64][SysV] Classify empty structs for passing like padding - #103799

Merged
jakobbotsch merged 4 commits into
dotnet:mainfrom
tomeksowi:sysv-empty-struct-passing
Jun 28, 2024
Merged

[x64][SysV] Classify empty structs for passing like padding#103799
jakobbotsch merged 4 commits into
dotnet:mainfrom
tomeksowi:sysv-empty-struct-passing

Conversation

@tomeksowi

Copy link
Copy Markdown
Member

The current implementation barred a struct containing empty struct fields from enregistration. This did not match the behavior of GCC & Clang on Linux and the System V ABI which says:

NO_CLASS This class is used as initializer in the algorithms. It will be used for padding and empty structures and unions.

Stems from #101796, part of #84834, cc @dotnet/samsung

The current implementation barred a struct containing empty struct fields from enregistration. This did not match the [System V ABI](https://refspecs.linuxbase.org/elf/x86_64-abi-0.99.pdf) which says "NO_CLASS This class is used as initializer in the algorithms. It will be used for padding and **empty structures** and unions". It also does not match the behavior of GCC & Clang on Linux.
@ghostghost added the area-ReadyToRun label Jun 21, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Jun 21, 2024
@jkotas

Copy link
Copy Markdown
Member

Could you please add some tests? src\tests\JIT\Directed\StructABI looks like a good place

@jkotasjkotas added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI and removed area-ReadyToRun labels Jun 21, 2024
@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.

@jkotas

Copy link
Copy Markdown
Member

cc @dotnet/jit-contrib @jakobbotsch

// then the classification of this eightbyte might be NoClass. We can't hand a classification of NoClass to the JIT
// so set the class to Integer (as though the struct has a char[8] padding) if the class is NoClass.
//
// TODO: Fix JIT, NoClass eightbytes are valid and passing them is broken because of this.

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.

Do you plan to fix this TODO in this PR?

@tomeksowitomeksowiJun 21, 2024

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

No. It would require going through the JIT like I did in #101796 for RISC-V and fix in many places. Right now my priority is on RISC-V but when I'm done with #101796 I can revisit it. By then @jakobbotsch's ongoing effort to centralize ABI passing infos will probably be more advanced, which will also facilitate fixing x64.

@tomeksowi

tomeksowi commented Jun 21, 2024

Copy link
Copy Markdown
MemberAuthor

Could you please add some tests? src\tests\JIT\Directed\StructABI looks like a good place

Sure, I'll lift a couple from #101796.

EDIT: In fact, I think I can lift the entire test suite and disable Empty8Float tests on System V.
EDIT2: I added some dedicated tests for System V after all, RISC-V will be added in subsequent PRs.

@tomeksowi

Copy link
Copy Markdown
MemberAuthor

I think the GC\Scenarios\RanCollect\rancollect\rancollect.cmd time-out on Windows x64 is not related to this change (which is System V only).

// then the classification of this eightbyte might be NoClass. We can't hand a classification of NoClass to the JIT
// so set the class to Integer (as though the struct has a char[8] padding) if the class is NoClass.
//
// TODO: Fix JIT, NoClass eightbytes are valid and passing them is broken because of this.

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.

What does the difference between NoClass and something like char[8] end up being? For significant padding (structs with explicit layout) it seems like we have to consider them to be the same or things will end up odd/wrong.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

char[8] is an INTEGER eightbyte which gets assigned an integer register for passing; a NO_CLASS eightbyte doesn't get any register. Passing on the stack is the same, though (NO_CLASS padding does take up space).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Opened #104098 as I'll need an URL for ActiveIssue in tests in future PRs.

Meanwhile this smaller fix is ready for review.

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.

Does this fix handle the significant padding cases correctly (i.e. as before this change)?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

It should, the NO_CLASS -> INTEGER eightbyte reclassification is still there. And I didn't see any CLR tests (prio1) go off on Checked build, assuming there are tests for significant padding by now.

@jakobbotsch

Copy link
Copy Markdown
Member

@MihuBot

@jakobbotsch

Copy link
Copy Markdown
Member

It looks like there's a bunch of asm diffs with this change, can you take a look at whether they are expected?

@tomeksowi

Copy link
Copy Markdown
MemberAuthor

It looks like there's a bunch of asm diffs with this change, can you take a look at whether they are expected?

Thanks for running the bot. Diffs are to be expected, some arguments which used to be passed by reference are now enregistered but large amount of performance regressions are worrying. I'll look at it in spare time between RISC-V PRs.

@jakobbotsch

Copy link
Copy Markdown
Member

Diffs are to be expected, some arguments which used to be passed by reference are now enregistered but large amount of performance regressions are worrying

Note that they are size diffs only, and overall the size improves. I spot checked a few of the regressions and it's usually the result of some new register shuffling because of an empty struct now taking up a register, so I guess those diffs are overall expected. Some of these cases look like they could be switched to static abstracts to avoid the parameter entirely.

@jkotas I assume we are ok to take an ABI change like this one since the R2R format is already being bumped?

@jkotas

Copy link
Copy Markdown
Member

@jkotas I assume we are ok to take an ABI change like this one since the R2R format is already being bumped?

Yes. I do not see a problem with the ABI change here.

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

Thanks!

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 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.

3 participants

@tomeksowi@jkotas@jakobbotsch
, '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

[x64][SysV] Classify empty structs for passing like padding - #103799

Merged
jakobbotsch merged 4 commits into
dotnet:mainfrom
tomeksowi:sysv-empty-struct-passing
Jun 28, 2024
Merged

[x64][SysV] Classify empty structs for passing like padding#103799
jakobbotsch merged 4 commits into
dotnet:mainfrom
tomeksowi:sysv-empty-struct-passing

Conversation

@tomeksowi

Copy link
Copy Markdown
Member

The current implementation barred a struct containing empty struct fields from enregistration. This did not match the behavior of GCC & Clang on Linux and the System V ABI which says:

NO_CLASS This class is used as initializer in the algorithms. It will be used for padding and empty structures and unions.

Stems from #101796, part of #84834, cc @dotnet/samsung

The current implementation barred a struct containing empty struct fields from enregistration. This did not match the [System V ABI](https://refspecs.linuxbase.org/elf/x86_64-abi-0.99.pdf) which says "NO_CLASS This class is used as initializer in the algorithms. It will be used for padding and **empty structures** and unions". It also does not match the behavior of GCC & Clang on Linux.
@ghostghost added the area-ReadyToRun label Jun 21, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Jun 21, 2024
@jkotas

Copy link
Copy Markdown
Member

Could you please add some tests? src\tests\JIT\Directed\StructABI looks like a good place

@jkotasjkotas added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI and removed area-ReadyToRun labels Jun 21, 2024
@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.

@jkotas

Copy link
Copy Markdown
Member

cc @dotnet/jit-contrib @jakobbotsch

// then the classification of this eightbyte might be NoClass. We can't hand a classification of NoClass to the JIT
// so set the class to Integer (as though the struct has a char[8] padding) if the class is NoClass.
//
// TODO: Fix JIT, NoClass eightbytes are valid and passing them is broken because of this.

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.

Do you plan to fix this TODO in this PR?

@tomeksowitomeksowiJun 21, 2024

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

No. It would require going through the JIT like I did in #101796 for RISC-V and fix in many places. Right now my priority is on RISC-V but when I'm done with #101796 I can revisit it. By then @jakobbotsch's ongoing effort to centralize ABI passing infos will probably be more advanced, which will also facilitate fixing x64.

@tomeksowi

tomeksowi commented Jun 21, 2024

Copy link
Copy Markdown
MemberAuthor

Could you please add some tests? src\tests\JIT\Directed\StructABI looks like a good place

Sure, I'll lift a couple from #101796.

EDIT: In fact, I think I can lift the entire test suite and disable Empty8Float tests on System V.
EDIT2: I added some dedicated tests for System V after all, RISC-V will be added in subsequent PRs.

@tomeksowi

Copy link
Copy Markdown
MemberAuthor

I think the GC\Scenarios\RanCollect\rancollect\rancollect.cmd time-out on Windows x64 is not related to this change (which is System V only).

// then the classification of this eightbyte might be NoClass. We can't hand a classification of NoClass to the JIT
// so set the class to Integer (as though the struct has a char[8] padding) if the class is NoClass.
//
// TODO: Fix JIT, NoClass eightbytes are valid and passing them is broken because of this.

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.

What does the difference between NoClass and something like char[8] end up being? For significant padding (structs with explicit layout) it seems like we have to consider them to be the same or things will end up odd/wrong.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

char[8] is an INTEGER eightbyte which gets assigned an integer register for passing; a NO_CLASS eightbyte doesn't get any register. Passing on the stack is the same, though (NO_CLASS padding does take up space).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Opened #104098 as I'll need an URL for ActiveIssue in tests in future PRs.

Meanwhile this smaller fix is ready for review.

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.

Does this fix handle the significant padding cases correctly (i.e. as before this change)?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

It should, the NO_CLASS -> INTEGER eightbyte reclassification is still there. And I didn't see any CLR tests (prio1) go off on Checked build, assuming there are tests for significant padding by now.

@jakobbotsch

Copy link
Copy Markdown
Member

@MihuBot

@jakobbotsch

Copy link
Copy Markdown
Member

It looks like there's a bunch of asm diffs with this change, can you take a look at whether they are expected?

@tomeksowi

Copy link
Copy Markdown
MemberAuthor

It looks like there's a bunch of asm diffs with this change, can you take a look at whether they are expected?

Thanks for running the bot. Diffs are to be expected, some arguments which used to be passed by reference are now enregistered but large amount of performance regressions are worrying. I'll look at it in spare time between RISC-V PRs.

@jakobbotsch

Copy link
Copy Markdown
Member

Diffs are to be expected, some arguments which used to be passed by reference are now enregistered but large amount of performance regressions are worrying

Note that they are size diffs only, and overall the size improves. I spot checked a few of the regressions and it's usually the result of some new register shuffling because of an empty struct now taking up a register, so I guess those diffs are overall expected. Some of these cases look like they could be switched to static abstracts to avoid the parameter entirely.

@jkotas I assume we are ok to take an ABI change like this one since the R2R format is already being bumped?

@jkotas

Copy link
Copy Markdown
Member

@jkotas I assume we are ok to take an ABI change like this one since the R2R format is already being bumped?

Yes. I do not see a problem with the ABI change here.

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

Thanks!

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 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.

3 participants

@tomeksowi@jkotas@jakobbotsch
, '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

[x64][SysV] Classify empty structs for passing like padding - #103799

Merged
jakobbotsch merged 4 commits into
dotnet:mainfrom
tomeksowi:sysv-empty-struct-passing
Jun 28, 2024
Merged

[x64][SysV] Classify empty structs for passing like padding#103799
jakobbotsch merged 4 commits into
dotnet:mainfrom
tomeksowi:sysv-empty-struct-passing

Conversation

@tomeksowi

Copy link
Copy Markdown
Member

The current implementation barred a struct containing empty struct fields from enregistration. This did not match the behavior of GCC & Clang on Linux and the System V ABI which says:

NO_CLASS This class is used as initializer in the algorithms. It will be used for padding and empty structures and unions.

Stems from #101796, part of #84834, cc @dotnet/samsung

The current implementation barred a struct containing empty struct fields from enregistration. This did not match the [System V ABI](https://refspecs.linuxbase.org/elf/x86_64-abi-0.99.pdf) which says "NO_CLASS This class is used as initializer in the algorithms. It will be used for padding and **empty structures** and unions". It also does not match the behavior of GCC & Clang on Linux.
@ghostghost added the area-ReadyToRun label Jun 21, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Jun 21, 2024
@jkotas

Copy link
Copy Markdown
Member

Could you please add some tests? src\tests\JIT\Directed\StructABI looks like a good place

@jkotasjkotas added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI and removed area-ReadyToRun labels Jun 21, 2024
@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.

@jkotas

Copy link
Copy Markdown
Member

cc @dotnet/jit-contrib @jakobbotsch

// then the classification of this eightbyte might be NoClass. We can't hand a classification of NoClass to the JIT
// so set the class to Integer (as though the struct has a char[8] padding) if the class is NoClass.
//
// TODO: Fix JIT, NoClass eightbytes are valid and passing them is broken because of this.

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.

Do you plan to fix this TODO in this PR?

@tomeksowitomeksowiJun 21, 2024

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

No. It would require going through the JIT like I did in #101796 for RISC-V and fix in many places. Right now my priority is on RISC-V but when I'm done with #101796 I can revisit it. By then @jakobbotsch's ongoing effort to centralize ABI passing infos will probably be more advanced, which will also facilitate fixing x64.

@tomeksowi

tomeksowi commented Jun 21, 2024

Copy link
Copy Markdown
MemberAuthor

Could you please add some tests? src\tests\JIT\Directed\StructABI looks like a good place

Sure, I'll lift a couple from #101796.

EDIT: In fact, I think I can lift the entire test suite and disable Empty8Float tests on System V.
EDIT2: I added some dedicated tests for System V after all, RISC-V will be added in subsequent PRs.

@tomeksowi

Copy link
Copy Markdown
MemberAuthor

I think the GC\Scenarios\RanCollect\rancollect\rancollect.cmd time-out on Windows x64 is not related to this change (which is System V only).

// then the classification of this eightbyte might be NoClass. We can't hand a classification of NoClass to the JIT
// so set the class to Integer (as though the struct has a char[8] padding) if the class is NoClass.
//
// TODO: Fix JIT, NoClass eightbytes are valid and passing them is broken because of this.

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.

What does the difference between NoClass and something like char[8] end up being? For significant padding (structs with explicit layout) it seems like we have to consider them to be the same or things will end up odd/wrong.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

char[8] is an INTEGER eightbyte which gets assigned an integer register for passing; a NO_CLASS eightbyte doesn't get any register. Passing on the stack is the same, though (NO_CLASS padding does take up space).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Opened #104098 as I'll need an URL for ActiveIssue in tests in future PRs.

Meanwhile this smaller fix is ready for review.

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.

Does this fix handle the significant padding cases correctly (i.e. as before this change)?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

It should, the NO_CLASS -> INTEGER eightbyte reclassification is still there. And I didn't see any CLR tests (prio1) go off on Checked build, assuming there are tests for significant padding by now.

@jakobbotsch

Copy link
Copy Markdown
Member

@MihuBot

@jakobbotsch

Copy link
Copy Markdown
Member

It looks like there's a bunch of asm diffs with this change, can you take a look at whether they are expected?

@tomeksowi

Copy link
Copy Markdown
MemberAuthor

It looks like there's a bunch of asm diffs with this change, can you take a look at whether they are expected?

Thanks for running the bot. Diffs are to be expected, some arguments which used to be passed by reference are now enregistered but large amount of performance regressions are worrying. I'll look at it in spare time between RISC-V PRs.

@jakobbotsch

Copy link
Copy Markdown
Member

Diffs are to be expected, some arguments which used to be passed by reference are now enregistered but large amount of performance regressions are worrying

Note that they are size diffs only, and overall the size improves. I spot checked a few of the regressions and it's usually the result of some new register shuffling because of an empty struct now taking up a register, so I guess those diffs are overall expected. Some of these cases look like they could be switched to static abstracts to avoid the parameter entirely.

@jkotas I assume we are ok to take an ABI change like this one since the R2R format is already being bumped?

@jkotas

Copy link
Copy Markdown
Member

@jkotas I assume we are ok to take an ABI change like this one since the R2R format is already being bumped?

Yes. I do not see a problem with the ABI change here.

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

Thanks!

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 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.

3 participants

@tomeksowi@jkotas@jakobbotsch
, '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

[x64][SysV] Classify empty structs for passing like padding - #103799

Merged
jakobbotsch merged 4 commits into
dotnet:mainfrom
tomeksowi:sysv-empty-struct-passing
Jun 28, 2024
Merged

[x64][SysV] Classify empty structs for passing like padding#103799
jakobbotsch merged 4 commits into
dotnet:mainfrom
tomeksowi:sysv-empty-struct-passing

Conversation

@tomeksowi

Copy link
Copy Markdown
Member

The current implementation barred a struct containing empty struct fields from enregistration. This did not match the behavior of GCC & Clang on Linux and the System V ABI which says:

NO_CLASS This class is used as initializer in the algorithms. It will be used for padding and empty structures and unions.

Stems from #101796, part of #84834, cc @dotnet/samsung

The current implementation barred a struct containing empty struct fields from enregistration. This did not match the [System V ABI](https://refspecs.linuxbase.org/elf/x86_64-abi-0.99.pdf) which says "NO_CLASS This class is used as initializer in the algorithms. It will be used for padding and **empty structures** and unions". It also does not match the behavior of GCC & Clang on Linux.
@ghostghost added the area-ReadyToRun label Jun 21, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Jun 21, 2024
@jkotas

Copy link
Copy Markdown
Member

Could you please add some tests? src\tests\JIT\Directed\StructABI looks like a good place

@jkotasjkotas added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI and removed area-ReadyToRun labels Jun 21, 2024
@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.

@jkotas

Copy link
Copy Markdown
Member

cc @dotnet/jit-contrib @jakobbotsch

// then the classification of this eightbyte might be NoClass. We can't hand a classification of NoClass to the JIT
// so set the class to Integer (as though the struct has a char[8] padding) if the class is NoClass.
//
// TODO: Fix JIT, NoClass eightbytes are valid and passing them is broken because of this.

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.

Do you plan to fix this TODO in this PR?

@tomeksowitomeksowiJun 21, 2024

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

No. It would require going through the JIT like I did in #101796 for RISC-V and fix in many places. Right now my priority is on RISC-V but when I'm done with #101796 I can revisit it. By then @jakobbotsch's ongoing effort to centralize ABI passing infos will probably be more advanced, which will also facilitate fixing x64.

@tomeksowi

tomeksowi commented Jun 21, 2024

Copy link
Copy Markdown
MemberAuthor

Could you please add some tests? src\tests\JIT\Directed\StructABI looks like a good place

Sure, I'll lift a couple from #101796.

EDIT: In fact, I think I can lift the entire test suite and disable Empty8Float tests on System V.
EDIT2: I added some dedicated tests for System V after all, RISC-V will be added in subsequent PRs.

@tomeksowi

Copy link
Copy Markdown
MemberAuthor

I think the GC\Scenarios\RanCollect\rancollect\rancollect.cmd time-out on Windows x64 is not related to this change (which is System V only).

// then the classification of this eightbyte might be NoClass. We can't hand a classification of NoClass to the JIT
// so set the class to Integer (as though the struct has a char[8] padding) if the class is NoClass.
//
// TODO: Fix JIT, NoClass eightbytes are valid and passing them is broken because of this.

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.

What does the difference between NoClass and something like char[8] end up being? For significant padding (structs with explicit layout) it seems like we have to consider them to be the same or things will end up odd/wrong.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

char[8] is an INTEGER eightbyte which gets assigned an integer register for passing; a NO_CLASS eightbyte doesn't get any register. Passing on the stack is the same, though (NO_CLASS padding does take up space).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Opened #104098 as I'll need an URL for ActiveIssue in tests in future PRs.

Meanwhile this smaller fix is ready for review.

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.

Does this fix handle the significant padding cases correctly (i.e. as before this change)?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

It should, the NO_CLASS -> INTEGER eightbyte reclassification is still there. And I didn't see any CLR tests (prio1) go off on Checked build, assuming there are tests for significant padding by now.

@jakobbotsch

Copy link
Copy Markdown
Member

@MihuBot

@jakobbotsch

Copy link
Copy Markdown
Member

It looks like there's a bunch of asm diffs with this change, can you take a look at whether they are expected?

@tomeksowi

Copy link
Copy Markdown
MemberAuthor

It looks like there's a bunch of asm diffs with this change, can you take a look at whether they are expected?

Thanks for running the bot. Diffs are to be expected, some arguments which used to be passed by reference are now enregistered but large amount of performance regressions are worrying. I'll look at it in spare time between RISC-V PRs.

@jakobbotsch

Copy link
Copy Markdown
Member

Diffs are to be expected, some arguments which used to be passed by reference are now enregistered but large amount of performance regressions are worrying

Note that they are size diffs only, and overall the size improves. I spot checked a few of the regressions and it's usually the result of some new register shuffling because of an empty struct now taking up a register, so I guess those diffs are overall expected. Some of these cases look like they could be switched to static abstracts to avoid the parameter entirely.

@jkotas I assume we are ok to take an ABI change like this one since the R2R format is already being bumped?

@jkotas

Copy link
Copy Markdown
Member

@jkotas I assume we are ok to take an ABI change like this one since the R2R format is already being bumped?

Yes. I do not see a problem with the ABI change here.

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

Thanks!

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 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.

3 participants

@tomeksowi@jkotas@jakobbotsch
, '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

[x64][SysV] Classify empty structs for passing like padding - #103799

Merged
jakobbotsch merged 4 commits into
dotnet:mainfrom
tomeksowi:sysv-empty-struct-passing
Jun 28, 2024
Merged

[x64][SysV] Classify empty structs for passing like padding#103799
jakobbotsch merged 4 commits into
dotnet:mainfrom
tomeksowi:sysv-empty-struct-passing

Conversation

@tomeksowi

Copy link
Copy Markdown
Member

The current implementation barred a struct containing empty struct fields from enregistration. This did not match the behavior of GCC & Clang on Linux and the System V ABI which says:

NO_CLASS This class is used as initializer in the algorithms. It will be used for padding and empty structures and unions.

Stems from #101796, part of #84834, cc @dotnet/samsung

The current implementation barred a struct containing empty struct fields from enregistration. This did not match the [System V ABI](https://refspecs.linuxbase.org/elf/x86_64-abi-0.99.pdf) which says "NO_CLASS This class is used as initializer in the algorithms. It will be used for padding and **empty structures** and unions". It also does not match the behavior of GCC & Clang on Linux.
@ghostghost added the area-ReadyToRun label Jun 21, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Jun 21, 2024
@jkotas

Copy link
Copy Markdown
Member

Could you please add some tests? src\tests\JIT\Directed\StructABI looks like a good place

@jkotasjkotas added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI and removed area-ReadyToRun labels Jun 21, 2024
@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.

@jkotas

Copy link
Copy Markdown
Member

cc @dotnet/jit-contrib @jakobbotsch

// then the classification of this eightbyte might be NoClass. We can't hand a classification of NoClass to the JIT
// so set the class to Integer (as though the struct has a char[8] padding) if the class is NoClass.
//
// TODO: Fix JIT, NoClass eightbytes are valid and passing them is broken because of this.

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.

Do you plan to fix this TODO in this PR?

@tomeksowitomeksowiJun 21, 2024

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

No. It would require going through the JIT like I did in #101796 for RISC-V and fix in many places. Right now my priority is on RISC-V but when I'm done with #101796 I can revisit it. By then @jakobbotsch's ongoing effort to centralize ABI passing infos will probably be more advanced, which will also facilitate fixing x64.

@tomeksowi

tomeksowi commented Jun 21, 2024

Copy link
Copy Markdown
MemberAuthor

Could you please add some tests? src\tests\JIT\Directed\StructABI looks like a good place

Sure, I'll lift a couple from #101796.

EDIT: In fact, I think I can lift the entire test suite and disable Empty8Float tests on System V.
EDIT2: I added some dedicated tests for System V after all, RISC-V will be added in subsequent PRs.

@tomeksowi

Copy link
Copy Markdown
MemberAuthor

I think the GC\Scenarios\RanCollect\rancollect\rancollect.cmd time-out on Windows x64 is not related to this change (which is System V only).

// then the classification of this eightbyte might be NoClass. We can't hand a classification of NoClass to the JIT
// so set the class to Integer (as though the struct has a char[8] padding) if the class is NoClass.
//
// TODO: Fix JIT, NoClass eightbytes are valid and passing them is broken because of this.

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.

What does the difference between NoClass and something like char[8] end up being? For significant padding (structs with explicit layout) it seems like we have to consider them to be the same or things will end up odd/wrong.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

char[8] is an INTEGER eightbyte which gets assigned an integer register for passing; a NO_CLASS eightbyte doesn't get any register. Passing on the stack is the same, though (NO_CLASS padding does take up space).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Opened #104098 as I'll need an URL for ActiveIssue in tests in future PRs.

Meanwhile this smaller fix is ready for review.

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.

Does this fix handle the significant padding cases correctly (i.e. as before this change)?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

It should, the NO_CLASS -> INTEGER eightbyte reclassification is still there. And I didn't see any CLR tests (prio1) go off on Checked build, assuming there are tests for significant padding by now.

@jakobbotsch

Copy link
Copy Markdown
Member

@MihuBot

@jakobbotsch

Copy link
Copy Markdown
Member

It looks like there's a bunch of asm diffs with this change, can you take a look at whether they are expected?

@tomeksowi

Copy link
Copy Markdown
MemberAuthor

It looks like there's a bunch of asm diffs with this change, can you take a look at whether they are expected?

Thanks for running the bot. Diffs are to be expected, some arguments which used to be passed by reference are now enregistered but large amount of performance regressions are worrying. I'll look at it in spare time between RISC-V PRs.

@jakobbotsch

Copy link
Copy Markdown
Member

Diffs are to be expected, some arguments which used to be passed by reference are now enregistered but large amount of performance regressions are worrying

Note that they are size diffs only, and overall the size improves. I spot checked a few of the regressions and it's usually the result of some new register shuffling because of an empty struct now taking up a register, so I guess those diffs are overall expected. Some of these cases look like they could be switched to static abstracts to avoid the parameter entirely.

@jkotas I assume we are ok to take an ABI change like this one since the R2R format is already being bumped?

@jkotas

Copy link
Copy Markdown
Member

@jkotas I assume we are ok to take an ABI change like this one since the R2R format is already being bumped?

Yes. I do not see a problem with the ABI change here.

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

Thanks!

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 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.

3 participants

@tomeksowi@jkotas@jakobbotsch