Ensure we don't print duplicate entries for the instruction-set help - #119368

Merged
tannergooding merged 1 commit into
dotnet:mainfrom
tannergooding:fix-119353
Sep 9, 2025
Merged

Ensure we don't print duplicate entries for the instruction-set help#119368
tannergooding merged 1 commit into
dotnet:mainfrom
tannergooding:fix-119353

Conversation

@tannergooding

Copy link
Copy Markdown
Member

This fixes the command line output to ensure we don't get base, base, base, base or similar listed as detailed in #119353

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull Request Overview

This PR fixes duplicate entries in command-line help output for instruction sets by ensuring each instruction set is only listed once per architecture. The changes prevent scenarios where the same instruction set name appears multiple times (like base, base, base, base) in help text.

Changes

  • Add deduplication logic to remove duplicate instruction set names when generating help text
  • Update example instruction sets in help text to use more modern examples

Reviewed Changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.

FileDescription
src/coreclr/tools/aot/crossgen2/Properties/Resources.resxUpdate instruction set example from 'avx2,bmi,lzcnt' to 'avx,aes,apx'
src/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.csAdd System.Linq import and DistinctBy() to deduplicate instruction sets
src/coreclr/tools/aot/ILCompiler/ILCompilerRootCommand.csAdd System.Linq import, DistinctBy() for deduplication, and update example

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

I'm good with this and I would support backporting it into 10.0 RC2 if the crew wants to.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

CC. @MichalStrehovsky, this is pending your sign-off for the ilc/crossgen command line help fix.

@MichalStrehovsky

Copy link
Copy Markdown
Member

CC. @MichalStrehovsky, this is pending your sign-off for the ilc/crossgen command line help fix.

Why are we ending up with multiples? I understand what the fix does, but if I am to sign off, I would like to understand what those extra entries are and why the existing if (instructionSet.Specifiable) filter doesn't work for them.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

@MichalStrehovsky because we need to maintain individual entries for R2R for back-compat (as per @jkotas in a previous PR): https://github.com/dotnet/runtime/blob/main/src/coreclr/tools/Common/JitInterface/ThunkGenerator/InstructionSetDesc.txt

All while mapping relevant groups to a single InstructionSet_* entry for the JIT and a single --instruction-set * entry for NAOT/R2R command line.

Due to the relatively simplistic nature of the tooling, this generates InstructionSetInfo entries like the following:

yieldreturnnewInstructionSetInfo("base","X86Base",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse2",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse42",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse3",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Ssse3",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse41",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Popcnt",InstructionSet.X64_X86Base,true);
and so we need to deduplicate them

We could choose to note specify "base" for one of them, but then that breaks R2R and other query checks for user code (as it assumes any managed ISA is "specifiable") resulting in a much more complex (and risky) change being required.

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

Makes sense, thanks!

@tannergooding
tannergooding merged commit 61f8055 into dotnet:mainSep 9, 2025
97 checks passed
@tannergooding

Copy link
Copy Markdown
MemberAuthor

Thanks @MichalStrehovsky. Should we backport this to .NET 10 as well to ensure a clean command line output there?

@tannergooding
tannergooding deleted the fix-119353 branch September 9, 2025 22:31
@MichalStrehovsky

Copy link
Copy Markdown
Member

Thanks @MichalStrehovsky. Should we backport this to .NET 10 as well to ensure a clean command line output there?

I don't have a strong opinion on this. IlcInstructionSet is not officially documented on the ILC side and is soft-supported. Not sure where it stands on the crossgen2 side.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

I believe it's the same for crossgen2. CC. @jkotas ?

@jkotas

Copy link
Copy Markdown
Member

I believe it's the same for crossgen2. CC. @jkotas ?

Right.

@tannergooding

tannergooding commented Sep 11, 2025

Copy link
Copy Markdown
MemberAuthor

I'll leave it as is for now, unless someone feels strongly, and wait for a customer report then.

It's a bit odd that it prints the same name multiple times, but ultimately harmless and its unlikely many users will encounter the issue. It's been fixed in .NET 11 so will be correct moving forward.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Oct 12, 2025
@jtschuster

Copy link
Copy Markdown
Member

We did get an issue reported here: #125730

Seems like a minor enough change to consider backporting to 10.

@jkotas

Copy link
Copy Markdown
Member

Seems like a minor enough change to consider backporting to 10.

ilc is an internal implementation detail of the NativeAOT toolset. We do not document how to run it directly.

I do not think that the backport would meet the servicing bar.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@tannergooding@MichalStrehovsky@jkotas@jtschuster@jeffhandley
, '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

Ensure we don't print duplicate entries for the instruction-set help - #119368

Merged
tannergooding merged 1 commit into
dotnet:mainfrom
tannergooding:fix-119353
Sep 9, 2025
Merged

Ensure we don't print duplicate entries for the instruction-set help#119368
tannergooding merged 1 commit into
dotnet:mainfrom
tannergooding:fix-119353

Conversation

@tannergooding

Copy link
Copy Markdown
Member

This fixes the command line output to ensure we don't get base, base, base, base or similar listed as detailed in #119353

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull Request Overview

This PR fixes duplicate entries in command-line help output for instruction sets by ensuring each instruction set is only listed once per architecture. The changes prevent scenarios where the same instruction set name appears multiple times (like base, base, base, base) in help text.

Changes

  • Add deduplication logic to remove duplicate instruction set names when generating help text
  • Update example instruction sets in help text to use more modern examples

Reviewed Changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.

FileDescription
src/coreclr/tools/aot/crossgen2/Properties/Resources.resxUpdate instruction set example from 'avx2,bmi,lzcnt' to 'avx,aes,apx'
src/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.csAdd System.Linq import and DistinctBy() to deduplicate instruction sets
src/coreclr/tools/aot/ILCompiler/ILCompilerRootCommand.csAdd System.Linq import, DistinctBy() for deduplication, and update example

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

I'm good with this and I would support backporting it into 10.0 RC2 if the crew wants to.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

CC. @MichalStrehovsky, this is pending your sign-off for the ilc/crossgen command line help fix.

@MichalStrehovsky

Copy link
Copy Markdown
Member

CC. @MichalStrehovsky, this is pending your sign-off for the ilc/crossgen command line help fix.

Why are we ending up with multiples? I understand what the fix does, but if I am to sign off, I would like to understand what those extra entries are and why the existing if (instructionSet.Specifiable) filter doesn't work for them.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

@MichalStrehovsky because we need to maintain individual entries for R2R for back-compat (as per @jkotas in a previous PR): https://github.com/dotnet/runtime/blob/main/src/coreclr/tools/Common/JitInterface/ThunkGenerator/InstructionSetDesc.txt

All while mapping relevant groups to a single InstructionSet_* entry for the JIT and a single --instruction-set * entry for NAOT/R2R command line.

Due to the relatively simplistic nature of the tooling, this generates InstructionSetInfo entries like the following:

yieldreturnnewInstructionSetInfo("base","X86Base",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse2",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse42",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse3",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Ssse3",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse41",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Popcnt",InstructionSet.X64_X86Base,true);
and so we need to deduplicate them

We could choose to note specify "base" for one of them, but then that breaks R2R and other query checks for user code (as it assumes any managed ISA is "specifiable") resulting in a much more complex (and risky) change being required.

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

Makes sense, thanks!

@tannergooding
tannergooding merged commit 61f8055 into dotnet:mainSep 9, 2025
97 checks passed
@tannergooding

Copy link
Copy Markdown
MemberAuthor

Thanks @MichalStrehovsky. Should we backport this to .NET 10 as well to ensure a clean command line output there?

@tannergooding
tannergooding deleted the fix-119353 branch September 9, 2025 22:31
@MichalStrehovsky

Copy link
Copy Markdown
Member

Thanks @MichalStrehovsky. Should we backport this to .NET 10 as well to ensure a clean command line output there?

I don't have a strong opinion on this. IlcInstructionSet is not officially documented on the ILC side and is soft-supported. Not sure where it stands on the crossgen2 side.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

I believe it's the same for crossgen2. CC. @jkotas ?

@jkotas

Copy link
Copy Markdown
Member

I believe it's the same for crossgen2. CC. @jkotas ?

Right.

@tannergooding

tannergooding commented Sep 11, 2025

Copy link
Copy Markdown
MemberAuthor

I'll leave it as is for now, unless someone feels strongly, and wait for a customer report then.

It's a bit odd that it prints the same name multiple times, but ultimately harmless and its unlikely many users will encounter the issue. It's been fixed in .NET 11 so will be correct moving forward.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Oct 12, 2025
@jtschuster

Copy link
Copy Markdown
Member

We did get an issue reported here: #125730

Seems like a minor enough change to consider backporting to 10.

@jkotas

Copy link
Copy Markdown
Member

Seems like a minor enough change to consider backporting to 10.

ilc is an internal implementation detail of the NativeAOT toolset. We do not document how to run it directly.

I do not think that the backport would meet the servicing bar.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@tannergooding@MichalStrehovsky@jkotas@jtschuster@jeffhandley
, '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

Ensure we don't print duplicate entries for the instruction-set help - #119368

Merged
tannergooding merged 1 commit into
dotnet:mainfrom
tannergooding:fix-119353
Sep 9, 2025
Merged

Ensure we don't print duplicate entries for the instruction-set help#119368
tannergooding merged 1 commit into
dotnet:mainfrom
tannergooding:fix-119353

Conversation

@tannergooding

Copy link
Copy Markdown
Member

This fixes the command line output to ensure we don't get base, base, base, base or similar listed as detailed in #119353

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull Request Overview

This PR fixes duplicate entries in command-line help output for instruction sets by ensuring each instruction set is only listed once per architecture. The changes prevent scenarios where the same instruction set name appears multiple times (like base, base, base, base) in help text.

Changes

  • Add deduplication logic to remove duplicate instruction set names when generating help text
  • Update example instruction sets in help text to use more modern examples

Reviewed Changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.

FileDescription
src/coreclr/tools/aot/crossgen2/Properties/Resources.resxUpdate instruction set example from 'avx2,bmi,lzcnt' to 'avx,aes,apx'
src/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.csAdd System.Linq import and DistinctBy() to deduplicate instruction sets
src/coreclr/tools/aot/ILCompiler/ILCompilerRootCommand.csAdd System.Linq import, DistinctBy() for deduplication, and update example

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

I'm good with this and I would support backporting it into 10.0 RC2 if the crew wants to.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

CC. @MichalStrehovsky, this is pending your sign-off for the ilc/crossgen command line help fix.

@MichalStrehovsky

Copy link
Copy Markdown
Member

CC. @MichalStrehovsky, this is pending your sign-off for the ilc/crossgen command line help fix.

Why are we ending up with multiples? I understand what the fix does, but if I am to sign off, I would like to understand what those extra entries are and why the existing if (instructionSet.Specifiable) filter doesn't work for them.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

@MichalStrehovsky because we need to maintain individual entries for R2R for back-compat (as per @jkotas in a previous PR): https://github.com/dotnet/runtime/blob/main/src/coreclr/tools/Common/JitInterface/ThunkGenerator/InstructionSetDesc.txt

All while mapping relevant groups to a single InstructionSet_* entry for the JIT and a single --instruction-set * entry for NAOT/R2R command line.

Due to the relatively simplistic nature of the tooling, this generates InstructionSetInfo entries like the following:

yieldreturnnewInstructionSetInfo("base","X86Base",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse2",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse42",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse3",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Ssse3",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse41",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Popcnt",InstructionSet.X64_X86Base,true);
and so we need to deduplicate them

We could choose to note specify "base" for one of them, but then that breaks R2R and other query checks for user code (as it assumes any managed ISA is "specifiable") resulting in a much more complex (and risky) change being required.

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

Makes sense, thanks!

@tannergooding
tannergooding merged commit 61f8055 into dotnet:mainSep 9, 2025
97 checks passed
@tannergooding

Copy link
Copy Markdown
MemberAuthor

Thanks @MichalStrehovsky. Should we backport this to .NET 10 as well to ensure a clean command line output there?

@tannergooding
tannergooding deleted the fix-119353 branch September 9, 2025 22:31
@MichalStrehovsky

Copy link
Copy Markdown
Member

Thanks @MichalStrehovsky. Should we backport this to .NET 10 as well to ensure a clean command line output there?

I don't have a strong opinion on this. IlcInstructionSet is not officially documented on the ILC side and is soft-supported. Not sure where it stands on the crossgen2 side.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

I believe it's the same for crossgen2. CC. @jkotas ?

@jkotas

Copy link
Copy Markdown
Member

I believe it's the same for crossgen2. CC. @jkotas ?

Right.

@tannergooding

tannergooding commented Sep 11, 2025

Copy link
Copy Markdown
MemberAuthor

I'll leave it as is for now, unless someone feels strongly, and wait for a customer report then.

It's a bit odd that it prints the same name multiple times, but ultimately harmless and its unlikely many users will encounter the issue. It's been fixed in .NET 11 so will be correct moving forward.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Oct 12, 2025
@jtschuster

Copy link
Copy Markdown
Member

We did get an issue reported here: #125730

Seems like a minor enough change to consider backporting to 10.

@jkotas

Copy link
Copy Markdown
Member

Seems like a minor enough change to consider backporting to 10.

ilc is an internal implementation detail of the NativeAOT toolset. We do not document how to run it directly.

I do not think that the backport would meet the servicing bar.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@tannergooding@MichalStrehovsky@jkotas@jtschuster@jeffhandley
, '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

Ensure we don't print duplicate entries for the instruction-set help - #119368

Merged
tannergooding merged 1 commit into
dotnet:mainfrom
tannergooding:fix-119353
Sep 9, 2025
Merged

Ensure we don't print duplicate entries for the instruction-set help#119368
tannergooding merged 1 commit into
dotnet:mainfrom
tannergooding:fix-119353

Conversation

@tannergooding

Copy link
Copy Markdown
Member

This fixes the command line output to ensure we don't get base, base, base, base or similar listed as detailed in #119353

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull Request Overview

This PR fixes duplicate entries in command-line help output for instruction sets by ensuring each instruction set is only listed once per architecture. The changes prevent scenarios where the same instruction set name appears multiple times (like base, base, base, base) in help text.

Changes

  • Add deduplication logic to remove duplicate instruction set names when generating help text
  • Update example instruction sets in help text to use more modern examples

Reviewed Changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.

FileDescription
src/coreclr/tools/aot/crossgen2/Properties/Resources.resxUpdate instruction set example from 'avx2,bmi,lzcnt' to 'avx,aes,apx'
src/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.csAdd System.Linq import and DistinctBy() to deduplicate instruction sets
src/coreclr/tools/aot/ILCompiler/ILCompilerRootCommand.csAdd System.Linq import, DistinctBy() for deduplication, and update example

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

I'm good with this and I would support backporting it into 10.0 RC2 if the crew wants to.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

CC. @MichalStrehovsky, this is pending your sign-off for the ilc/crossgen command line help fix.

@MichalStrehovsky

Copy link
Copy Markdown
Member

CC. @MichalStrehovsky, this is pending your sign-off for the ilc/crossgen command line help fix.

Why are we ending up with multiples? I understand what the fix does, but if I am to sign off, I would like to understand what those extra entries are and why the existing if (instructionSet.Specifiable) filter doesn't work for them.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

@MichalStrehovsky because we need to maintain individual entries for R2R for back-compat (as per @jkotas in a previous PR): https://github.com/dotnet/runtime/blob/main/src/coreclr/tools/Common/JitInterface/ThunkGenerator/InstructionSetDesc.txt

All while mapping relevant groups to a single InstructionSet_* entry for the JIT and a single --instruction-set * entry for NAOT/R2R command line.

Due to the relatively simplistic nature of the tooling, this generates InstructionSetInfo entries like the following:

yieldreturnnewInstructionSetInfo("base","X86Base",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse2",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse42",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse3",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Ssse3",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse41",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Popcnt",InstructionSet.X64_X86Base,true);
and so we need to deduplicate them

We could choose to note specify "base" for one of them, but then that breaks R2R and other query checks for user code (as it assumes any managed ISA is "specifiable") resulting in a much more complex (and risky) change being required.

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

Makes sense, thanks!

@tannergooding
tannergooding merged commit 61f8055 into dotnet:mainSep 9, 2025
97 checks passed
@tannergooding

Copy link
Copy Markdown
MemberAuthor

Thanks @MichalStrehovsky. Should we backport this to .NET 10 as well to ensure a clean command line output there?

@tannergooding
tannergooding deleted the fix-119353 branch September 9, 2025 22:31
@MichalStrehovsky

Copy link
Copy Markdown
Member

Thanks @MichalStrehovsky. Should we backport this to .NET 10 as well to ensure a clean command line output there?

I don't have a strong opinion on this. IlcInstructionSet is not officially documented on the ILC side and is soft-supported. Not sure where it stands on the crossgen2 side.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

I believe it's the same for crossgen2. CC. @jkotas ?

@jkotas

Copy link
Copy Markdown
Member

I believe it's the same for crossgen2. CC. @jkotas ?

Right.

@tannergooding

tannergooding commented Sep 11, 2025

Copy link
Copy Markdown
MemberAuthor

I'll leave it as is for now, unless someone feels strongly, and wait for a customer report then.

It's a bit odd that it prints the same name multiple times, but ultimately harmless and its unlikely many users will encounter the issue. It's been fixed in .NET 11 so will be correct moving forward.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Oct 12, 2025
@jtschuster

Copy link
Copy Markdown
Member

We did get an issue reported here: #125730

Seems like a minor enough change to consider backporting to 10.

@jkotas

Copy link
Copy Markdown
Member

Seems like a minor enough change to consider backporting to 10.

ilc is an internal implementation detail of the NativeAOT toolset. We do not document how to run it directly.

I do not think that the backport would meet the servicing bar.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@tannergooding@MichalStrehovsky@jkotas@jtschuster@jeffhandley
, '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

Ensure we don't print duplicate entries for the instruction-set help - #119368

Merged
tannergooding merged 1 commit into
dotnet:mainfrom
tannergooding:fix-119353
Sep 9, 2025
Merged

Ensure we don't print duplicate entries for the instruction-set help#119368
tannergooding merged 1 commit into
dotnet:mainfrom
tannergooding:fix-119353

Conversation

@tannergooding

Copy link
Copy Markdown
Member

This fixes the command line output to ensure we don't get base, base, base, base or similar listed as detailed in #119353

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull Request Overview

This PR fixes duplicate entries in command-line help output for instruction sets by ensuring each instruction set is only listed once per architecture. The changes prevent scenarios where the same instruction set name appears multiple times (like base, base, base, base) in help text.

Changes

  • Add deduplication logic to remove duplicate instruction set names when generating help text
  • Update example instruction sets in help text to use more modern examples

Reviewed Changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.

FileDescription
src/coreclr/tools/aot/crossgen2/Properties/Resources.resxUpdate instruction set example from 'avx2,bmi,lzcnt' to 'avx,aes,apx'
src/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.csAdd System.Linq import and DistinctBy() to deduplicate instruction sets
src/coreclr/tools/aot/ILCompiler/ILCompilerRootCommand.csAdd System.Linq import, DistinctBy() for deduplication, and update example

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

I'm good with this and I would support backporting it into 10.0 RC2 if the crew wants to.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

CC. @MichalStrehovsky, this is pending your sign-off for the ilc/crossgen command line help fix.

@MichalStrehovsky

Copy link
Copy Markdown
Member

CC. @MichalStrehovsky, this is pending your sign-off for the ilc/crossgen command line help fix.

Why are we ending up with multiples? I understand what the fix does, but if I am to sign off, I would like to understand what those extra entries are and why the existing if (instructionSet.Specifiable) filter doesn't work for them.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

@MichalStrehovsky because we need to maintain individual entries for R2R for back-compat (as per @jkotas in a previous PR): https://github.com/dotnet/runtime/blob/main/src/coreclr/tools/Common/JitInterface/ThunkGenerator/InstructionSetDesc.txt

All while mapping relevant groups to a single InstructionSet_* entry for the JIT and a single --instruction-set * entry for NAOT/R2R command line.

Due to the relatively simplistic nature of the tooling, this generates InstructionSetInfo entries like the following:

yieldreturnnewInstructionSetInfo("base","X86Base",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse2",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse42",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse3",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Ssse3",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse41",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Popcnt",InstructionSet.X64_X86Base,true);
and so we need to deduplicate them

We could choose to note specify "base" for one of them, but then that breaks R2R and other query checks for user code (as it assumes any managed ISA is "specifiable") resulting in a much more complex (and risky) change being required.

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

Makes sense, thanks!

@tannergooding
tannergooding merged commit 61f8055 into dotnet:mainSep 9, 2025
97 checks passed
@tannergooding

Copy link
Copy Markdown
MemberAuthor

Thanks @MichalStrehovsky. Should we backport this to .NET 10 as well to ensure a clean command line output there?

@tannergooding
tannergooding deleted the fix-119353 branch September 9, 2025 22:31
@MichalStrehovsky

Copy link
Copy Markdown
Member

Thanks @MichalStrehovsky. Should we backport this to .NET 10 as well to ensure a clean command line output there?

I don't have a strong opinion on this. IlcInstructionSet is not officially documented on the ILC side and is soft-supported. Not sure where it stands on the crossgen2 side.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

I believe it's the same for crossgen2. CC. @jkotas ?

@jkotas

Copy link
Copy Markdown
Member

I believe it's the same for crossgen2. CC. @jkotas ?

Right.

@tannergooding

tannergooding commented Sep 11, 2025

Copy link
Copy Markdown
MemberAuthor

I'll leave it as is for now, unless someone feels strongly, and wait for a customer report then.

It's a bit odd that it prints the same name multiple times, but ultimately harmless and its unlikely many users will encounter the issue. It's been fixed in .NET 11 so will be correct moving forward.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Oct 12, 2025
@jtschuster

Copy link
Copy Markdown
Member

We did get an issue reported here: #125730

Seems like a minor enough change to consider backporting to 10.

@jkotas

Copy link
Copy Markdown
Member

Seems like a minor enough change to consider backporting to 10.

ilc is an internal implementation detail of the NativeAOT toolset. We do not document how to run it directly.

I do not think that the backport would meet the servicing bar.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@tannergooding@MichalStrehovsky@jkotas@jtschuster@jeffhandley
, '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

Ensure we don't print duplicate entries for the instruction-set help - #119368

Merged
tannergooding merged 1 commit into
dotnet:mainfrom
tannergooding:fix-119353
Sep 9, 2025
Merged

Ensure we don't print duplicate entries for the instruction-set help#119368
tannergooding merged 1 commit into
dotnet:mainfrom
tannergooding:fix-119353

Conversation

@tannergooding

Copy link
Copy Markdown
Member

This fixes the command line output to ensure we don't get base, base, base, base or similar listed as detailed in #119353

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull Request Overview

This PR fixes duplicate entries in command-line help output for instruction sets by ensuring each instruction set is only listed once per architecture. The changes prevent scenarios where the same instruction set name appears multiple times (like base, base, base, base) in help text.

Changes

  • Add deduplication logic to remove duplicate instruction set names when generating help text
  • Update example instruction sets in help text to use more modern examples

Reviewed Changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.

FileDescription
src/coreclr/tools/aot/crossgen2/Properties/Resources.resxUpdate instruction set example from 'avx2,bmi,lzcnt' to 'avx,aes,apx'
src/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.csAdd System.Linq import and DistinctBy() to deduplicate instruction sets
src/coreclr/tools/aot/ILCompiler/ILCompilerRootCommand.csAdd System.Linq import, DistinctBy() for deduplication, and update example

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

I'm good with this and I would support backporting it into 10.0 RC2 if the crew wants to.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

CC. @MichalStrehovsky, this is pending your sign-off for the ilc/crossgen command line help fix.

@MichalStrehovsky

Copy link
Copy Markdown
Member

CC. @MichalStrehovsky, this is pending your sign-off for the ilc/crossgen command line help fix.

Why are we ending up with multiples? I understand what the fix does, but if I am to sign off, I would like to understand what those extra entries are and why the existing if (instructionSet.Specifiable) filter doesn't work for them.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

@MichalStrehovsky because we need to maintain individual entries for R2R for back-compat (as per @jkotas in a previous PR): https://github.com/dotnet/runtime/blob/main/src/coreclr/tools/Common/JitInterface/ThunkGenerator/InstructionSetDesc.txt

All while mapping relevant groups to a single InstructionSet_* entry for the JIT and a single --instruction-set * entry for NAOT/R2R command line.

Due to the relatively simplistic nature of the tooling, this generates InstructionSetInfo entries like the following:

yieldreturnnewInstructionSetInfo("base","X86Base",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse2",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse42",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse3",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Ssse3",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse41",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Popcnt",InstructionSet.X64_X86Base,true);
and so we need to deduplicate them

We could choose to note specify "base" for one of them, but then that breaks R2R and other query checks for user code (as it assumes any managed ISA is "specifiable") resulting in a much more complex (and risky) change being required.

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

Makes sense, thanks!

@tannergooding
tannergooding merged commit 61f8055 into dotnet:mainSep 9, 2025
97 checks passed
@tannergooding

Copy link
Copy Markdown
MemberAuthor

Thanks @MichalStrehovsky. Should we backport this to .NET 10 as well to ensure a clean command line output there?

@tannergooding
tannergooding deleted the fix-119353 branch September 9, 2025 22:31
@MichalStrehovsky

Copy link
Copy Markdown
Member

Thanks @MichalStrehovsky. Should we backport this to .NET 10 as well to ensure a clean command line output there?

I don't have a strong opinion on this. IlcInstructionSet is not officially documented on the ILC side and is soft-supported. Not sure where it stands on the crossgen2 side.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

I believe it's the same for crossgen2. CC. @jkotas ?

@jkotas

Copy link
Copy Markdown
Member

I believe it's the same for crossgen2. CC. @jkotas ?

Right.

@tannergooding

tannergooding commented Sep 11, 2025

Copy link
Copy Markdown
MemberAuthor

I'll leave it as is for now, unless someone feels strongly, and wait for a customer report then.

It's a bit odd that it prints the same name multiple times, but ultimately harmless and its unlikely many users will encounter the issue. It's been fixed in .NET 11 so will be correct moving forward.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Oct 12, 2025
@jtschuster

Copy link
Copy Markdown
Member

We did get an issue reported here: #125730

Seems like a minor enough change to consider backporting to 10.

@jkotas

Copy link
Copy Markdown
Member

Seems like a minor enough change to consider backporting to 10.

ilc is an internal implementation detail of the NativeAOT toolset. We do not document how to run it directly.

I do not think that the backport would meet the servicing bar.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@tannergooding@MichalStrehovsky@jkotas@jtschuster@jeffhandley
, '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

Ensure we don't print duplicate entries for the instruction-set help - #119368

Merged
tannergooding merged 1 commit into
dotnet:mainfrom
tannergooding:fix-119353
Sep 9, 2025
Merged

Ensure we don't print duplicate entries for the instruction-set help#119368
tannergooding merged 1 commit into
dotnet:mainfrom
tannergooding:fix-119353

Conversation

@tannergooding

Copy link
Copy Markdown
Member

This fixes the command line output to ensure we don't get base, base, base, base or similar listed as detailed in #119353

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull Request Overview

This PR fixes duplicate entries in command-line help output for instruction sets by ensuring each instruction set is only listed once per architecture. The changes prevent scenarios where the same instruction set name appears multiple times (like base, base, base, base) in help text.

Changes

  • Add deduplication logic to remove duplicate instruction set names when generating help text
  • Update example instruction sets in help text to use more modern examples

Reviewed Changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.

FileDescription
src/coreclr/tools/aot/crossgen2/Properties/Resources.resxUpdate instruction set example from 'avx2,bmi,lzcnt' to 'avx,aes,apx'
src/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.csAdd System.Linq import and DistinctBy() to deduplicate instruction sets
src/coreclr/tools/aot/ILCompiler/ILCompilerRootCommand.csAdd System.Linq import, DistinctBy() for deduplication, and update example

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

I'm good with this and I would support backporting it into 10.0 RC2 if the crew wants to.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

CC. @MichalStrehovsky, this is pending your sign-off for the ilc/crossgen command line help fix.

@MichalStrehovsky

Copy link
Copy Markdown
Member

CC. @MichalStrehovsky, this is pending your sign-off for the ilc/crossgen command line help fix.

Why are we ending up with multiples? I understand what the fix does, but if I am to sign off, I would like to understand what those extra entries are and why the existing if (instructionSet.Specifiable) filter doesn't work for them.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

@MichalStrehovsky because we need to maintain individual entries for R2R for back-compat (as per @jkotas in a previous PR): https://github.com/dotnet/runtime/blob/main/src/coreclr/tools/Common/JitInterface/ThunkGenerator/InstructionSetDesc.txt

All while mapping relevant groups to a single InstructionSet_* entry for the JIT and a single --instruction-set * entry for NAOT/R2R command line.

Due to the relatively simplistic nature of the tooling, this generates InstructionSetInfo entries like the following:

yieldreturnnewInstructionSetInfo("base","X86Base",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse2",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse42",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse3",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Ssse3",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse41",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Popcnt",InstructionSet.X64_X86Base,true);
and so we need to deduplicate them

We could choose to note specify "base" for one of them, but then that breaks R2R and other query checks for user code (as it assumes any managed ISA is "specifiable") resulting in a much more complex (and risky) change being required.

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

Makes sense, thanks!

@tannergooding
tannergooding merged commit 61f8055 into dotnet:mainSep 9, 2025
97 checks passed
@tannergooding

Copy link
Copy Markdown
MemberAuthor

Thanks @MichalStrehovsky. Should we backport this to .NET 10 as well to ensure a clean command line output there?

@tannergooding
tannergooding deleted the fix-119353 branch September 9, 2025 22:31
@MichalStrehovsky

Copy link
Copy Markdown
Member

Thanks @MichalStrehovsky. Should we backport this to .NET 10 as well to ensure a clean command line output there?

I don't have a strong opinion on this. IlcInstructionSet is not officially documented on the ILC side and is soft-supported. Not sure where it stands on the crossgen2 side.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

I believe it's the same for crossgen2. CC. @jkotas ?

@jkotas

Copy link
Copy Markdown
Member

I believe it's the same for crossgen2. CC. @jkotas ?

Right.

@tannergooding

tannergooding commented Sep 11, 2025

Copy link
Copy Markdown
MemberAuthor

I'll leave it as is for now, unless someone feels strongly, and wait for a customer report then.

It's a bit odd that it prints the same name multiple times, but ultimately harmless and its unlikely many users will encounter the issue. It's been fixed in .NET 11 so will be correct moving forward.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Oct 12, 2025
@jtschuster

Copy link
Copy Markdown
Member

We did get an issue reported here: #125730

Seems like a minor enough change to consider backporting to 10.

@jkotas

Copy link
Copy Markdown
Member

Seems like a minor enough change to consider backporting to 10.

ilc is an internal implementation detail of the NativeAOT toolset. We do not document how to run it directly.

I do not think that the backport would meet the servicing bar.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@tannergooding@MichalStrehovsky@jkotas@jtschuster@jeffhandley
, '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

Ensure we don't print duplicate entries for the instruction-set help - #119368

Merged
tannergooding merged 1 commit into
dotnet:mainfrom
tannergooding:fix-119353
Sep 9, 2025
Merged

Ensure we don't print duplicate entries for the instruction-set help#119368
tannergooding merged 1 commit into
dotnet:mainfrom
tannergooding:fix-119353

Conversation

@tannergooding

Copy link
Copy Markdown
Member

This fixes the command line output to ensure we don't get base, base, base, base or similar listed as detailed in #119353

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull Request Overview

This PR fixes duplicate entries in command-line help output for instruction sets by ensuring each instruction set is only listed once per architecture. The changes prevent scenarios where the same instruction set name appears multiple times (like base, base, base, base) in help text.

Changes

  • Add deduplication logic to remove duplicate instruction set names when generating help text
  • Update example instruction sets in help text to use more modern examples

Reviewed Changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.

FileDescription
src/coreclr/tools/aot/crossgen2/Properties/Resources.resxUpdate instruction set example from 'avx2,bmi,lzcnt' to 'avx,aes,apx'
src/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.csAdd System.Linq import and DistinctBy() to deduplicate instruction sets
src/coreclr/tools/aot/ILCompiler/ILCompilerRootCommand.csAdd System.Linq import, DistinctBy() for deduplication, and update example

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

I'm good with this and I would support backporting it into 10.0 RC2 if the crew wants to.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

CC. @MichalStrehovsky, this is pending your sign-off for the ilc/crossgen command line help fix.

@MichalStrehovsky

Copy link
Copy Markdown
Member

CC. @MichalStrehovsky, this is pending your sign-off for the ilc/crossgen command line help fix.

Why are we ending up with multiples? I understand what the fix does, but if I am to sign off, I would like to understand what those extra entries are and why the existing if (instructionSet.Specifiable) filter doesn't work for them.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

@MichalStrehovsky because we need to maintain individual entries for R2R for back-compat (as per @jkotas in a previous PR): https://github.com/dotnet/runtime/blob/main/src/coreclr/tools/Common/JitInterface/ThunkGenerator/InstructionSetDesc.txt

All while mapping relevant groups to a single InstructionSet_* entry for the JIT and a single --instruction-set * entry for NAOT/R2R command line.

Due to the relatively simplistic nature of the tooling, this generates InstructionSetInfo entries like the following:

yieldreturnnewInstructionSetInfo("base","X86Base",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse2",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse42",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse3",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Ssse3",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Sse41",InstructionSet.X64_X86Base,true);
yieldreturnnewInstructionSetInfo("base","Popcnt",InstructionSet.X64_X86Base,true);
and so we need to deduplicate them

We could choose to note specify "base" for one of them, but then that breaks R2R and other query checks for user code (as it assumes any managed ISA is "specifiable") resulting in a much more complex (and risky) change being required.

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

Makes sense, thanks!

@tannergooding
tannergooding merged commit 61f8055 into dotnet:mainSep 9, 2025
97 checks passed
@tannergooding

Copy link
Copy Markdown
MemberAuthor

Thanks @MichalStrehovsky. Should we backport this to .NET 10 as well to ensure a clean command line output there?

@tannergooding
tannergooding deleted the fix-119353 branch September 9, 2025 22:31
@MichalStrehovsky

Copy link
Copy Markdown
Member

Thanks @MichalStrehovsky. Should we backport this to .NET 10 as well to ensure a clean command line output there?

I don't have a strong opinion on this. IlcInstructionSet is not officially documented on the ILC side and is soft-supported. Not sure where it stands on the crossgen2 side.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

I believe it's the same for crossgen2. CC. @jkotas ?

@jkotas

Copy link
Copy Markdown
Member

I believe it's the same for crossgen2. CC. @jkotas ?

Right.

@tannergooding

tannergooding commented Sep 11, 2025

Copy link
Copy Markdown
MemberAuthor

I'll leave it as is for now, unless someone feels strongly, and wait for a customer report then.

It's a bit odd that it prints the same name multiple times, but ultimately harmless and its unlikely many users will encounter the issue. It's been fixed in .NET 11 so will be correct moving forward.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Oct 12, 2025
@jtschuster

Copy link
Copy Markdown
Member

We did get an issue reported here: #125730

Seems like a minor enough change to consider backporting to 10.

@jkotas

Copy link
Copy Markdown
Member

Seems like a minor enough change to consider backporting to 10.

ilc is an internal implementation detail of the NativeAOT toolset. We do not document how to run it directly.

I do not think that the backport would meet the servicing bar.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@tannergooding@MichalStrehovsky@jkotas@jtschuster@jeffhandley