Simplify arithmetic operations on registry and memory - #125559

Draft
pedrobsaila wants to merge 33 commits into
dotnet:mainfrom
pedrobsaila:125300
Draft

Simplify arithmetic operations on registry and memory#125559
pedrobsaila wants to merge 33 commits into
dotnet:mainfrom
pedrobsaila:125300

Conversation

@pedrobsaila

@pedrobsailapedrobsaila commented Mar 14, 2026

Copy link
Copy Markdown
Contributor

Fixes#125300

Lacks tests, working on it

Before :

Program:AddReg(int):int (FullOpts):leaeax,[rdi+2*rdi]retProgram:AddMem(byref):int (FullOpts):moveax, dword ptr [rdi]leaecx,[rax+rax]addeax,ecxretProgram:SubReg(int):int (FullOpts):xoreax,eaxsubeax,ediretProgram:SubMem(byref):int (FullOpts):moveax, dword ptr [rdi]movecx,eaxsubecx,eaxsubecx,eaxmoveax,ecxret

After:

Program:AddReg(int):int (FullOpts):leaeax,[rdi+2*rdi]retProgram:AddMem(byref):int (FullOpts):moveax, dword ptr [rdi]leaeax,[rax+2*rax]retProgram:SubReg(int):int (FullOpts):moveax,ecxnegeaxretProgram:SubMem(byref):int (FullOpts):moveax, dword ptr [rdi]negeaxret

@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Mar 14, 2026
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Mar 14, 2026
@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.

@EgorBo

EgorBo commented Mar 14, 2026

Copy link
Copy Markdown
Member

haven't checked the correctness of these changes, but the diffs imply that +300 LOC to JIT are not worth it.

@pedrobsaila

pedrobsaila commented Mar 14, 2026

Copy link
Copy Markdown
ContributorAuthor

There is room to reduce LOC, I just wrote it fast to see whether their will be asm diffs or not. I'll roll more compact version in a few hours. But I agree the diffs are not that impressive.

@EgorBo

EgorBo commented Mar 14, 2026

Copy link
Copy Markdown
Member

There is room to reduce LOC, I just wrote it fast to see whether their will be asm diffs or not. I'll roll more compact version in a few hours. But I agree the diffs are not that impressive.

Right. Generally, we don't accept PRs like that unless there is a strong justification. We see it as an extra risk that is not worth the impact. To be honest, all kinds of x + x + x .. transformation should be handled elsewhere, on VN/SSA level.

@pedrobsaila

Copy link
Copy Markdown
ContributorAuthor

To be honest, all kinds of x + x + x .. transformation should be handled elsewhere, on VN/SSA level.

Sorry to bother you, but never worked on VN/SSA level, I need to ask you about which file the transformation should be valuenum.cpp/ssabuilder.cpp or elsewhere ?

@EgorBo

Copy link
Copy Markdown
Member

To be honest, all kinds of x + x + x .. transformation should be handled elsewhere, on VN/SSA level.

Sorry to bother you, but never worked on VN/SSA level, I need to ask you about which file the transformation should be valuenum.cpp/ssabuilder.cpp or elsewhere ?

I just tried myself with VN and it didn't find diffs either (mostly because we don't materialize VNs today). With SSA it's probably a more advanced task. probably like in copyprop or assertionprop, but it might also not worth it - hard to tell in advance.

@tannergooding

Copy link
Copy Markdown
Member

Do we have any info on whether the lack of diffs is because this is pattern is uncommon in all code or simply uncommon in the code that we have SPMI diffs around (i.e. corelib and partner frameworks/apps that tend to be a bit more explicit about our patterns)?

@pedrobsaila

Copy link
Copy Markdown
ContributorAuthor

@EgorBo can you tell me if I'm going in the right direction this time ? I know I still have 4 failing tests, just want to see if I'm not doing something wrong before investing more time.

@EgorBo

Copy link
Copy Markdown
Member

@EgorBo can you tell me if I'm going in the right direction this time ? I know I still have 4 failing tests, just want to see if I'm not doing something wrong before investing more time.

I haven't checked the correctness of this PR yet, but it should ideally result in massive diff improvements for so many changed lines of code

@EgorBo

EgorBo commented Apr 29, 2026

Copy link
Copy Markdown
Member

Diffs I think it's definitely too few diffs to justify that amount of changes in JIT (big risk for questionable profit)

The problem you're trying to solve probably requires some more generic / complex optimization like doing this on VN level and then materialize those VNs into actual trees. Or an SSA-based generic forward sub pass. None of which I'd recommend to waste time on 🙂

@BoyBaykiller

BoyBaykiller commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

I've basically run into the same issue in #126852 and there is some discussion on discord if you're interested @pedrobsaila.

My understanding is that there currently is no good way to handle equivalent GT_IND (and such) in these transformations. We have VNs to determine value-equality which is perfect but there is no place to freely use VNs AND do tree transformations on - as Egor said. So until then you'll be limited to comparing localNum or some hacky stuff with GenTree::Compare or CSE+gtEffectiveVal which catches some more cases.

@JulieLeeMSFT

Copy link
Copy Markdown
Member

@pedrobsaila, converting to draft. Please reopen if you have a new implementation and ready for review.

@JulieLeeMSFT
JulieLeeMSFT marked this pull request as draft May 27, 2026 20:27
@JulieLeeMSFTJulieLeeMSFT added the needs-author-action An issue or pull request that requires more info or actions from the author. label May 27, 2026
@JulieLeeMSFTJulieLeeMSFT added this to the Future milestone May 27, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIcommunity-contributionIndicates that the PR has been added by a community memberneeds-author-actionAn issue or pull request that requires more info or actions from the author.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

JIT: Simplify arithmetic operations on memory, as is already done for register

5 participants

@pedrobsaila@EgorBo@tannergooding@BoyBaykiller@JulieLeeMSFT
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Simplify arithmetic operations on registry and memory - #125559

Draft
pedrobsaila wants to merge 33 commits into
dotnet:mainfrom
pedrobsaila:125300
Draft

Simplify arithmetic operations on registry and memory#125559
pedrobsaila wants to merge 33 commits into
dotnet:mainfrom
pedrobsaila:125300

Conversation

@pedrobsaila

@pedrobsailapedrobsaila commented Mar 14, 2026

Copy link
Copy Markdown
Contributor

Fixes#125300

Lacks tests, working on it

Before :

Program:AddReg(int):int (FullOpts):leaeax,[rdi+2*rdi]retProgram:AddMem(byref):int (FullOpts):moveax, dword ptr [rdi]leaecx,[rax+rax]addeax,ecxretProgram:SubReg(int):int (FullOpts):xoreax,eaxsubeax,ediretProgram:SubMem(byref):int (FullOpts):moveax, dword ptr [rdi]movecx,eaxsubecx,eaxsubecx,eaxmoveax,ecxret

After:

Program:AddReg(int):int (FullOpts):leaeax,[rdi+2*rdi]retProgram:AddMem(byref):int (FullOpts):moveax, dword ptr [rdi]leaeax,[rax+2*rax]retProgram:SubReg(int):int (FullOpts):moveax,ecxnegeaxretProgram:SubMem(byref):int (FullOpts):moveax, dword ptr [rdi]negeaxret

@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Mar 14, 2026
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Mar 14, 2026
@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.

@EgorBo

EgorBo commented Mar 14, 2026

Copy link
Copy Markdown
Member

haven't checked the correctness of these changes, but the diffs imply that +300 LOC to JIT are not worth it.

@pedrobsaila

pedrobsaila commented Mar 14, 2026

Copy link
Copy Markdown
ContributorAuthor

There is room to reduce LOC, I just wrote it fast to see whether their will be asm diffs or not. I'll roll more compact version in a few hours. But I agree the diffs are not that impressive.

@EgorBo

EgorBo commented Mar 14, 2026

Copy link
Copy Markdown
Member

There is room to reduce LOC, I just wrote it fast to see whether their will be asm diffs or not. I'll roll more compact version in a few hours. But I agree the diffs are not that impressive.

Right. Generally, we don't accept PRs like that unless there is a strong justification. We see it as an extra risk that is not worth the impact. To be honest, all kinds of x + x + x .. transformation should be handled elsewhere, on VN/SSA level.

@pedrobsaila

Copy link
Copy Markdown
ContributorAuthor

To be honest, all kinds of x + x + x .. transformation should be handled elsewhere, on VN/SSA level.

Sorry to bother you, but never worked on VN/SSA level, I need to ask you about which file the transformation should be valuenum.cpp/ssabuilder.cpp or elsewhere ?

@EgorBo

Copy link
Copy Markdown
Member

To be honest, all kinds of x + x + x .. transformation should be handled elsewhere, on VN/SSA level.

Sorry to bother you, but never worked on VN/SSA level, I need to ask you about which file the transformation should be valuenum.cpp/ssabuilder.cpp or elsewhere ?

I just tried myself with VN and it didn't find diffs either (mostly because we don't materialize VNs today). With SSA it's probably a more advanced task. probably like in copyprop or assertionprop, but it might also not worth it - hard to tell in advance.

@tannergooding

Copy link
Copy Markdown
Member

Do we have any info on whether the lack of diffs is because this is pattern is uncommon in all code or simply uncommon in the code that we have SPMI diffs around (i.e. corelib and partner frameworks/apps that tend to be a bit more explicit about our patterns)?

@pedrobsaila

Copy link
Copy Markdown
ContributorAuthor

@EgorBo can you tell me if I'm going in the right direction this time ? I know I still have 4 failing tests, just want to see if I'm not doing something wrong before investing more time.

@EgorBo

Copy link
Copy Markdown
Member

@EgorBo can you tell me if I'm going in the right direction this time ? I know I still have 4 failing tests, just want to see if I'm not doing something wrong before investing more time.

I haven't checked the correctness of this PR yet, but it should ideally result in massive diff improvements for so many changed lines of code

@EgorBo

EgorBo commented Apr 29, 2026

Copy link
Copy Markdown
Member

Diffs I think it's definitely too few diffs to justify that amount of changes in JIT (big risk for questionable profit)

The problem you're trying to solve probably requires some more generic / complex optimization like doing this on VN level and then materialize those VNs into actual trees. Or an SSA-based generic forward sub pass. None of which I'd recommend to waste time on 🙂

@BoyBaykiller

BoyBaykiller commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

I've basically run into the same issue in #126852 and there is some discussion on discord if you're interested @pedrobsaila.

My understanding is that there currently is no good way to handle equivalent GT_IND (and such) in these transformations. We have VNs to determine value-equality which is perfect but there is no place to freely use VNs AND do tree transformations on - as Egor said. So until then you'll be limited to comparing localNum or some hacky stuff with GenTree::Compare or CSE+gtEffectiveVal which catches some more cases.

@JulieLeeMSFT

Copy link
Copy Markdown
Member

@pedrobsaila, converting to draft. Please reopen if you have a new implementation and ready for review.

@JulieLeeMSFT
JulieLeeMSFT marked this pull request as draft May 27, 2026 20:27
@JulieLeeMSFTJulieLeeMSFT added the needs-author-action An issue or pull request that requires more info or actions from the author. label May 27, 2026
@JulieLeeMSFTJulieLeeMSFT added this to the Future milestone May 27, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIcommunity-contributionIndicates that the PR has been added by a community memberneeds-author-actionAn issue or pull request that requires more info or actions from the author.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

JIT: Simplify arithmetic operations on memory, as is already done for register

5 participants

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

Simplify arithmetic operations on registry and memory - #125559

Draft
pedrobsaila wants to merge 33 commits into
dotnet:mainfrom
pedrobsaila:125300
Draft

Simplify arithmetic operations on registry and memory#125559
pedrobsaila wants to merge 33 commits into
dotnet:mainfrom
pedrobsaila:125300

Conversation

@pedrobsaila

@pedrobsailapedrobsaila commented Mar 14, 2026

Copy link
Copy Markdown
Contributor

Fixes#125300

Lacks tests, working on it

Before :

Program:AddReg(int):int (FullOpts):leaeax,[rdi+2*rdi]retProgram:AddMem(byref):int (FullOpts):moveax, dword ptr [rdi]leaecx,[rax+rax]addeax,ecxretProgram:SubReg(int):int (FullOpts):xoreax,eaxsubeax,ediretProgram:SubMem(byref):int (FullOpts):moveax, dword ptr [rdi]movecx,eaxsubecx,eaxsubecx,eaxmoveax,ecxret

After:

Program:AddReg(int):int (FullOpts):leaeax,[rdi+2*rdi]retProgram:AddMem(byref):int (FullOpts):moveax, dword ptr [rdi]leaeax,[rax+2*rax]retProgram:SubReg(int):int (FullOpts):moveax,ecxnegeaxretProgram:SubMem(byref):int (FullOpts):moveax, dword ptr [rdi]negeaxret

@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Mar 14, 2026
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Mar 14, 2026
@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.

@EgorBo

EgorBo commented Mar 14, 2026

Copy link
Copy Markdown
Member

haven't checked the correctness of these changes, but the diffs imply that +300 LOC to JIT are not worth it.

@pedrobsaila

pedrobsaila commented Mar 14, 2026

Copy link
Copy Markdown
ContributorAuthor

There is room to reduce LOC, I just wrote it fast to see whether their will be asm diffs or not. I'll roll more compact version in a few hours. But I agree the diffs are not that impressive.

@EgorBo

EgorBo commented Mar 14, 2026

Copy link
Copy Markdown
Member

There is room to reduce LOC, I just wrote it fast to see whether their will be asm diffs or not. I'll roll more compact version in a few hours. But I agree the diffs are not that impressive.

Right. Generally, we don't accept PRs like that unless there is a strong justification. We see it as an extra risk that is not worth the impact. To be honest, all kinds of x + x + x .. transformation should be handled elsewhere, on VN/SSA level.

@pedrobsaila

Copy link
Copy Markdown
ContributorAuthor

To be honest, all kinds of x + x + x .. transformation should be handled elsewhere, on VN/SSA level.

Sorry to bother you, but never worked on VN/SSA level, I need to ask you about which file the transformation should be valuenum.cpp/ssabuilder.cpp or elsewhere ?

@EgorBo

Copy link
Copy Markdown
Member

To be honest, all kinds of x + x + x .. transformation should be handled elsewhere, on VN/SSA level.

Sorry to bother you, but never worked on VN/SSA level, I need to ask you about which file the transformation should be valuenum.cpp/ssabuilder.cpp or elsewhere ?

I just tried myself with VN and it didn't find diffs either (mostly because we don't materialize VNs today). With SSA it's probably a more advanced task. probably like in copyprop or assertionprop, but it might also not worth it - hard to tell in advance.

@tannergooding

Copy link
Copy Markdown
Member

Do we have any info on whether the lack of diffs is because this is pattern is uncommon in all code or simply uncommon in the code that we have SPMI diffs around (i.e. corelib and partner frameworks/apps that tend to be a bit more explicit about our patterns)?

@pedrobsaila

Copy link
Copy Markdown
ContributorAuthor

@EgorBo can you tell me if I'm going in the right direction this time ? I know I still have 4 failing tests, just want to see if I'm not doing something wrong before investing more time.

@EgorBo

Copy link
Copy Markdown
Member

@EgorBo can you tell me if I'm going in the right direction this time ? I know I still have 4 failing tests, just want to see if I'm not doing something wrong before investing more time.

I haven't checked the correctness of this PR yet, but it should ideally result in massive diff improvements for so many changed lines of code

@EgorBo

EgorBo commented Apr 29, 2026

Copy link
Copy Markdown
Member

Diffs I think it's definitely too few diffs to justify that amount of changes in JIT (big risk for questionable profit)

The problem you're trying to solve probably requires some more generic / complex optimization like doing this on VN level and then materialize those VNs into actual trees. Or an SSA-based generic forward sub pass. None of which I'd recommend to waste time on 🙂

@BoyBaykiller

BoyBaykiller commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

I've basically run into the same issue in #126852 and there is some discussion on discord if you're interested @pedrobsaila.

My understanding is that there currently is no good way to handle equivalent GT_IND (and such) in these transformations. We have VNs to determine value-equality which is perfect but there is no place to freely use VNs AND do tree transformations on - as Egor said. So until then you'll be limited to comparing localNum or some hacky stuff with GenTree::Compare or CSE+gtEffectiveVal which catches some more cases.

@JulieLeeMSFT

Copy link
Copy Markdown
Member

@pedrobsaila, converting to draft. Please reopen if you have a new implementation and ready for review.

@JulieLeeMSFT
JulieLeeMSFT marked this pull request as draft May 27, 2026 20:27
@JulieLeeMSFTJulieLeeMSFT added the needs-author-action An issue or pull request that requires more info or actions from the author. label May 27, 2026
@JulieLeeMSFTJulieLeeMSFT added this to the Future milestone May 27, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIcommunity-contributionIndicates that the PR has been added by a community memberneeds-author-actionAn issue or pull request that requires more info or actions from the author.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

JIT: Simplify arithmetic operations on memory, as is already done for register

5 participants

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

Simplify arithmetic operations on registry and memory - #125559

Draft
pedrobsaila wants to merge 33 commits into
dotnet:mainfrom
pedrobsaila:125300
Draft

Simplify arithmetic operations on registry and memory#125559
pedrobsaila wants to merge 33 commits into
dotnet:mainfrom
pedrobsaila:125300

Conversation

@pedrobsaila

@pedrobsailapedrobsaila commented Mar 14, 2026

Copy link
Copy Markdown
Contributor

Fixes#125300

Lacks tests, working on it

Before :

Program:AddReg(int):int (FullOpts):leaeax,[rdi+2*rdi]retProgram:AddMem(byref):int (FullOpts):moveax, dword ptr [rdi]leaecx,[rax+rax]addeax,ecxretProgram:SubReg(int):int (FullOpts):xoreax,eaxsubeax,ediretProgram:SubMem(byref):int (FullOpts):moveax, dword ptr [rdi]movecx,eaxsubecx,eaxsubecx,eaxmoveax,ecxret

After:

Program:AddReg(int):int (FullOpts):leaeax,[rdi+2*rdi]retProgram:AddMem(byref):int (FullOpts):moveax, dword ptr [rdi]leaeax,[rax+2*rax]retProgram:SubReg(int):int (FullOpts):moveax,ecxnegeaxretProgram:SubMem(byref):int (FullOpts):moveax, dword ptr [rdi]negeaxret

@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Mar 14, 2026
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Mar 14, 2026
@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.

@EgorBo

EgorBo commented Mar 14, 2026

Copy link
Copy Markdown
Member

haven't checked the correctness of these changes, but the diffs imply that +300 LOC to JIT are not worth it.

@pedrobsaila

pedrobsaila commented Mar 14, 2026

Copy link
Copy Markdown
ContributorAuthor

There is room to reduce LOC, I just wrote it fast to see whether their will be asm diffs or not. I'll roll more compact version in a few hours. But I agree the diffs are not that impressive.

@EgorBo

EgorBo commented Mar 14, 2026

Copy link
Copy Markdown
Member

There is room to reduce LOC, I just wrote it fast to see whether their will be asm diffs or not. I'll roll more compact version in a few hours. But I agree the diffs are not that impressive.

Right. Generally, we don't accept PRs like that unless there is a strong justification. We see it as an extra risk that is not worth the impact. To be honest, all kinds of x + x + x .. transformation should be handled elsewhere, on VN/SSA level.

@pedrobsaila

Copy link
Copy Markdown
ContributorAuthor

To be honest, all kinds of x + x + x .. transformation should be handled elsewhere, on VN/SSA level.

Sorry to bother you, but never worked on VN/SSA level, I need to ask you about which file the transformation should be valuenum.cpp/ssabuilder.cpp or elsewhere ?

@EgorBo

Copy link
Copy Markdown
Member

To be honest, all kinds of x + x + x .. transformation should be handled elsewhere, on VN/SSA level.

Sorry to bother you, but never worked on VN/SSA level, I need to ask you about which file the transformation should be valuenum.cpp/ssabuilder.cpp or elsewhere ?

I just tried myself with VN and it didn't find diffs either (mostly because we don't materialize VNs today). With SSA it's probably a more advanced task. probably like in copyprop or assertionprop, but it might also not worth it - hard to tell in advance.

@tannergooding

Copy link
Copy Markdown
Member

Do we have any info on whether the lack of diffs is because this is pattern is uncommon in all code or simply uncommon in the code that we have SPMI diffs around (i.e. corelib and partner frameworks/apps that tend to be a bit more explicit about our patterns)?

@pedrobsaila

Copy link
Copy Markdown
ContributorAuthor

@EgorBo can you tell me if I'm going in the right direction this time ? I know I still have 4 failing tests, just want to see if I'm not doing something wrong before investing more time.

@EgorBo

Copy link
Copy Markdown
Member

@EgorBo can you tell me if I'm going in the right direction this time ? I know I still have 4 failing tests, just want to see if I'm not doing something wrong before investing more time.

I haven't checked the correctness of this PR yet, but it should ideally result in massive diff improvements for so many changed lines of code

@EgorBo

EgorBo commented Apr 29, 2026

Copy link
Copy Markdown
Member

Diffs I think it's definitely too few diffs to justify that amount of changes in JIT (big risk for questionable profit)

The problem you're trying to solve probably requires some more generic / complex optimization like doing this on VN level and then materialize those VNs into actual trees. Or an SSA-based generic forward sub pass. None of which I'd recommend to waste time on 🙂

@BoyBaykiller

BoyBaykiller commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

I've basically run into the same issue in #126852 and there is some discussion on discord if you're interested @pedrobsaila.

My understanding is that there currently is no good way to handle equivalent GT_IND (and such) in these transformations. We have VNs to determine value-equality which is perfect but there is no place to freely use VNs AND do tree transformations on - as Egor said. So until then you'll be limited to comparing localNum or some hacky stuff with GenTree::Compare or CSE+gtEffectiveVal which catches some more cases.

@JulieLeeMSFT

Copy link
Copy Markdown
Member

@pedrobsaila, converting to draft. Please reopen if you have a new implementation and ready for review.

@JulieLeeMSFT
JulieLeeMSFT marked this pull request as draft May 27, 2026 20:27
@JulieLeeMSFTJulieLeeMSFT added the needs-author-action An issue or pull request that requires more info or actions from the author. label May 27, 2026
@JulieLeeMSFTJulieLeeMSFT added this to the Future milestone May 27, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIcommunity-contributionIndicates that the PR has been added by a community memberneeds-author-actionAn issue or pull request that requires more info or actions from the author.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

JIT: Simplify arithmetic operations on memory, as is already done for register

5 participants

@pedrobsaila@EgorBo@tannergooding@BoyBaykiller@JulieLeeMSFT
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Simplify arithmetic operations on registry and memory - #125559

Draft
pedrobsaila wants to merge 33 commits into
dotnet:mainfrom
pedrobsaila:125300
Draft

Simplify arithmetic operations on registry and memory#125559
pedrobsaila wants to merge 33 commits into
dotnet:mainfrom
pedrobsaila:125300

Conversation

@pedrobsaila

@pedrobsailapedrobsaila commented Mar 14, 2026

Copy link
Copy Markdown
Contributor

Fixes#125300

Lacks tests, working on it

Before :

Program:AddReg(int):int (FullOpts):leaeax,[rdi+2*rdi]retProgram:AddMem(byref):int (FullOpts):moveax, dword ptr [rdi]leaecx,[rax+rax]addeax,ecxretProgram:SubReg(int):int (FullOpts):xoreax,eaxsubeax,ediretProgram:SubMem(byref):int (FullOpts):moveax, dword ptr [rdi]movecx,eaxsubecx,eaxsubecx,eaxmoveax,ecxret

After:

Program:AddReg(int):int (FullOpts):leaeax,[rdi+2*rdi]retProgram:AddMem(byref):int (FullOpts):moveax, dword ptr [rdi]leaeax,[rax+2*rax]retProgram:SubReg(int):int (FullOpts):moveax,ecxnegeaxretProgram:SubMem(byref):int (FullOpts):moveax, dword ptr [rdi]negeaxret

@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Mar 14, 2026
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Mar 14, 2026
@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.

@EgorBo

EgorBo commented Mar 14, 2026

Copy link
Copy Markdown
Member

haven't checked the correctness of these changes, but the diffs imply that +300 LOC to JIT are not worth it.

@pedrobsaila

pedrobsaila commented Mar 14, 2026

Copy link
Copy Markdown
ContributorAuthor

There is room to reduce LOC, I just wrote it fast to see whether their will be asm diffs or not. I'll roll more compact version in a few hours. But I agree the diffs are not that impressive.

@EgorBo

EgorBo commented Mar 14, 2026

Copy link
Copy Markdown
Member

There is room to reduce LOC, I just wrote it fast to see whether their will be asm diffs or not. I'll roll more compact version in a few hours. But I agree the diffs are not that impressive.

Right. Generally, we don't accept PRs like that unless there is a strong justification. We see it as an extra risk that is not worth the impact. To be honest, all kinds of x + x + x .. transformation should be handled elsewhere, on VN/SSA level.

@pedrobsaila

Copy link
Copy Markdown
ContributorAuthor

To be honest, all kinds of x + x + x .. transformation should be handled elsewhere, on VN/SSA level.

Sorry to bother you, but never worked on VN/SSA level, I need to ask you about which file the transformation should be valuenum.cpp/ssabuilder.cpp or elsewhere ?

@EgorBo

Copy link
Copy Markdown
Member

To be honest, all kinds of x + x + x .. transformation should be handled elsewhere, on VN/SSA level.

Sorry to bother you, but never worked on VN/SSA level, I need to ask you about which file the transformation should be valuenum.cpp/ssabuilder.cpp or elsewhere ?

I just tried myself with VN and it didn't find diffs either (mostly because we don't materialize VNs today). With SSA it's probably a more advanced task. probably like in copyprop or assertionprop, but it might also not worth it - hard to tell in advance.

@tannergooding

Copy link
Copy Markdown
Member

Do we have any info on whether the lack of diffs is because this is pattern is uncommon in all code or simply uncommon in the code that we have SPMI diffs around (i.e. corelib and partner frameworks/apps that tend to be a bit more explicit about our patterns)?

@pedrobsaila

Copy link
Copy Markdown
ContributorAuthor

@EgorBo can you tell me if I'm going in the right direction this time ? I know I still have 4 failing tests, just want to see if I'm not doing something wrong before investing more time.

@EgorBo

Copy link
Copy Markdown
Member

@EgorBo can you tell me if I'm going in the right direction this time ? I know I still have 4 failing tests, just want to see if I'm not doing something wrong before investing more time.

I haven't checked the correctness of this PR yet, but it should ideally result in massive diff improvements for so many changed lines of code

@EgorBo

EgorBo commented Apr 29, 2026

Copy link
Copy Markdown
Member

Diffs I think it's definitely too few diffs to justify that amount of changes in JIT (big risk for questionable profit)

The problem you're trying to solve probably requires some more generic / complex optimization like doing this on VN level and then materialize those VNs into actual trees. Or an SSA-based generic forward sub pass. None of which I'd recommend to waste time on 🙂

@BoyBaykiller

BoyBaykiller commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

I've basically run into the same issue in #126852 and there is some discussion on discord if you're interested @pedrobsaila.

My understanding is that there currently is no good way to handle equivalent GT_IND (and such) in these transformations. We have VNs to determine value-equality which is perfect but there is no place to freely use VNs AND do tree transformations on - as Egor said. So until then you'll be limited to comparing localNum or some hacky stuff with GenTree::Compare or CSE+gtEffectiveVal which catches some more cases.

@JulieLeeMSFT

Copy link
Copy Markdown
Member

@pedrobsaila, converting to draft. Please reopen if you have a new implementation and ready for review.

@JulieLeeMSFT
JulieLeeMSFT marked this pull request as draft May 27, 2026 20:27
@JulieLeeMSFTJulieLeeMSFT added the needs-author-action An issue or pull request that requires more info or actions from the author. label May 27, 2026
@JulieLeeMSFTJulieLeeMSFT added this to the Future milestone May 27, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIcommunity-contributionIndicates that the PR has been added by a community memberneeds-author-actionAn issue or pull request that requires more info or actions from the author.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

JIT: Simplify arithmetic operations on memory, as is already done for register

5 participants

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

Simplify arithmetic operations on registry and memory - #125559

Draft
pedrobsaila wants to merge 33 commits into
dotnet:mainfrom
pedrobsaila:125300
Draft

Simplify arithmetic operations on registry and memory#125559
pedrobsaila wants to merge 33 commits into
dotnet:mainfrom
pedrobsaila:125300

Conversation

@pedrobsaila

@pedrobsailapedrobsaila commented Mar 14, 2026

Copy link
Copy Markdown
Contributor

Fixes#125300

Lacks tests, working on it

Before :

Program:AddReg(int):int (FullOpts):leaeax,[rdi+2*rdi]retProgram:AddMem(byref):int (FullOpts):moveax, dword ptr [rdi]leaecx,[rax+rax]addeax,ecxretProgram:SubReg(int):int (FullOpts):xoreax,eaxsubeax,ediretProgram:SubMem(byref):int (FullOpts):moveax, dword ptr [rdi]movecx,eaxsubecx,eaxsubecx,eaxmoveax,ecxret

After:

Program:AddReg(int):int (FullOpts):leaeax,[rdi+2*rdi]retProgram:AddMem(byref):int (FullOpts):moveax, dword ptr [rdi]leaeax,[rax+2*rax]retProgram:SubReg(int):int (FullOpts):moveax,ecxnegeaxretProgram:SubMem(byref):int (FullOpts):moveax, dword ptr [rdi]negeaxret

@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Mar 14, 2026
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Mar 14, 2026
@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.

@EgorBo

EgorBo commented Mar 14, 2026

Copy link
Copy Markdown
Member

haven't checked the correctness of these changes, but the diffs imply that +300 LOC to JIT are not worth it.

@pedrobsaila

pedrobsaila commented Mar 14, 2026

Copy link
Copy Markdown
ContributorAuthor

There is room to reduce LOC, I just wrote it fast to see whether their will be asm diffs or not. I'll roll more compact version in a few hours. But I agree the diffs are not that impressive.

@EgorBo

EgorBo commented Mar 14, 2026

Copy link
Copy Markdown
Member

There is room to reduce LOC, I just wrote it fast to see whether their will be asm diffs or not. I'll roll more compact version in a few hours. But I agree the diffs are not that impressive.

Right. Generally, we don't accept PRs like that unless there is a strong justification. We see it as an extra risk that is not worth the impact. To be honest, all kinds of x + x + x .. transformation should be handled elsewhere, on VN/SSA level.

@pedrobsaila

Copy link
Copy Markdown
ContributorAuthor

To be honest, all kinds of x + x + x .. transformation should be handled elsewhere, on VN/SSA level.

Sorry to bother you, but never worked on VN/SSA level, I need to ask you about which file the transformation should be valuenum.cpp/ssabuilder.cpp or elsewhere ?

@EgorBo

Copy link
Copy Markdown
Member

To be honest, all kinds of x + x + x .. transformation should be handled elsewhere, on VN/SSA level.

Sorry to bother you, but never worked on VN/SSA level, I need to ask you about which file the transformation should be valuenum.cpp/ssabuilder.cpp or elsewhere ?

I just tried myself with VN and it didn't find diffs either (mostly because we don't materialize VNs today). With SSA it's probably a more advanced task. probably like in copyprop or assertionprop, but it might also not worth it - hard to tell in advance.

@tannergooding

Copy link
Copy Markdown
Member

Do we have any info on whether the lack of diffs is because this is pattern is uncommon in all code or simply uncommon in the code that we have SPMI diffs around (i.e. corelib and partner frameworks/apps that tend to be a bit more explicit about our patterns)?

@pedrobsaila

Copy link
Copy Markdown
ContributorAuthor

@EgorBo can you tell me if I'm going in the right direction this time ? I know I still have 4 failing tests, just want to see if I'm not doing something wrong before investing more time.

@EgorBo

Copy link
Copy Markdown
Member

@EgorBo can you tell me if I'm going in the right direction this time ? I know I still have 4 failing tests, just want to see if I'm not doing something wrong before investing more time.

I haven't checked the correctness of this PR yet, but it should ideally result in massive diff improvements for so many changed lines of code

@EgorBo

EgorBo commented Apr 29, 2026

Copy link
Copy Markdown
Member

Diffs I think it's definitely too few diffs to justify that amount of changes in JIT (big risk for questionable profit)

The problem you're trying to solve probably requires some more generic / complex optimization like doing this on VN level and then materialize those VNs into actual trees. Or an SSA-based generic forward sub pass. None of which I'd recommend to waste time on 🙂

@BoyBaykiller

BoyBaykiller commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

I've basically run into the same issue in #126852 and there is some discussion on discord if you're interested @pedrobsaila.

My understanding is that there currently is no good way to handle equivalent GT_IND (and such) in these transformations. We have VNs to determine value-equality which is perfect but there is no place to freely use VNs AND do tree transformations on - as Egor said. So until then you'll be limited to comparing localNum or some hacky stuff with GenTree::Compare or CSE+gtEffectiveVal which catches some more cases.

@JulieLeeMSFT

Copy link
Copy Markdown
Member

@pedrobsaila, converting to draft. Please reopen if you have a new implementation and ready for review.

@JulieLeeMSFT
JulieLeeMSFT marked this pull request as draft May 27, 2026 20:27
@JulieLeeMSFTJulieLeeMSFT added the needs-author-action An issue or pull request that requires more info or actions from the author. label May 27, 2026
@JulieLeeMSFTJulieLeeMSFT added this to the Future milestone May 27, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIcommunity-contributionIndicates that the PR has been added by a community memberneeds-author-actionAn issue or pull request that requires more info or actions from the author.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

JIT: Simplify arithmetic operations on memory, as is already done for register

5 participants

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

Simplify arithmetic operations on registry and memory - #125559

Draft
pedrobsaila wants to merge 33 commits into
dotnet:mainfrom
pedrobsaila:125300
Draft

Simplify arithmetic operations on registry and memory#125559
pedrobsaila wants to merge 33 commits into
dotnet:mainfrom
pedrobsaila:125300

Conversation

@pedrobsaila

@pedrobsailapedrobsaila commented Mar 14, 2026

Copy link
Copy Markdown
Contributor

Fixes#125300

Lacks tests, working on it

Before :

Program:AddReg(int):int (FullOpts):leaeax,[rdi+2*rdi]retProgram:AddMem(byref):int (FullOpts):moveax, dword ptr [rdi]leaecx,[rax+rax]addeax,ecxretProgram:SubReg(int):int (FullOpts):xoreax,eaxsubeax,ediretProgram:SubMem(byref):int (FullOpts):moveax, dword ptr [rdi]movecx,eaxsubecx,eaxsubecx,eaxmoveax,ecxret

After:

Program:AddReg(int):int (FullOpts):leaeax,[rdi+2*rdi]retProgram:AddMem(byref):int (FullOpts):moveax, dword ptr [rdi]leaeax,[rax+2*rax]retProgram:SubReg(int):int (FullOpts):moveax,ecxnegeaxretProgram:SubMem(byref):int (FullOpts):moveax, dword ptr [rdi]negeaxret

@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Mar 14, 2026
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Mar 14, 2026
@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.

@EgorBo

EgorBo commented Mar 14, 2026

Copy link
Copy Markdown
Member

haven't checked the correctness of these changes, but the diffs imply that +300 LOC to JIT are not worth it.

@pedrobsaila

pedrobsaila commented Mar 14, 2026

Copy link
Copy Markdown
ContributorAuthor

There is room to reduce LOC, I just wrote it fast to see whether their will be asm diffs or not. I'll roll more compact version in a few hours. But I agree the diffs are not that impressive.

@EgorBo

EgorBo commented Mar 14, 2026

Copy link
Copy Markdown
Member

There is room to reduce LOC, I just wrote it fast to see whether their will be asm diffs or not. I'll roll more compact version in a few hours. But I agree the diffs are not that impressive.

Right. Generally, we don't accept PRs like that unless there is a strong justification. We see it as an extra risk that is not worth the impact. To be honest, all kinds of x + x + x .. transformation should be handled elsewhere, on VN/SSA level.

@pedrobsaila

Copy link
Copy Markdown
ContributorAuthor

To be honest, all kinds of x + x + x .. transformation should be handled elsewhere, on VN/SSA level.

Sorry to bother you, but never worked on VN/SSA level, I need to ask you about which file the transformation should be valuenum.cpp/ssabuilder.cpp or elsewhere ?

@EgorBo

Copy link
Copy Markdown
Member

To be honest, all kinds of x + x + x .. transformation should be handled elsewhere, on VN/SSA level.

Sorry to bother you, but never worked on VN/SSA level, I need to ask you about which file the transformation should be valuenum.cpp/ssabuilder.cpp or elsewhere ?

I just tried myself with VN and it didn't find diffs either (mostly because we don't materialize VNs today). With SSA it's probably a more advanced task. probably like in copyprop or assertionprop, but it might also not worth it - hard to tell in advance.

@tannergooding

Copy link
Copy Markdown
Member

Do we have any info on whether the lack of diffs is because this is pattern is uncommon in all code or simply uncommon in the code that we have SPMI diffs around (i.e. corelib and partner frameworks/apps that tend to be a bit more explicit about our patterns)?

@pedrobsaila

Copy link
Copy Markdown
ContributorAuthor

@EgorBo can you tell me if I'm going in the right direction this time ? I know I still have 4 failing tests, just want to see if I'm not doing something wrong before investing more time.

@EgorBo

Copy link
Copy Markdown
Member

@EgorBo can you tell me if I'm going in the right direction this time ? I know I still have 4 failing tests, just want to see if I'm not doing something wrong before investing more time.

I haven't checked the correctness of this PR yet, but it should ideally result in massive diff improvements for so many changed lines of code

@EgorBo

EgorBo commented Apr 29, 2026

Copy link
Copy Markdown
Member

Diffs I think it's definitely too few diffs to justify that amount of changes in JIT (big risk for questionable profit)

The problem you're trying to solve probably requires some more generic / complex optimization like doing this on VN level and then materialize those VNs into actual trees. Or an SSA-based generic forward sub pass. None of which I'd recommend to waste time on 🙂

@BoyBaykiller

BoyBaykiller commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

I've basically run into the same issue in #126852 and there is some discussion on discord if you're interested @pedrobsaila.

My understanding is that there currently is no good way to handle equivalent GT_IND (and such) in these transformations. We have VNs to determine value-equality which is perfect but there is no place to freely use VNs AND do tree transformations on - as Egor said. So until then you'll be limited to comparing localNum or some hacky stuff with GenTree::Compare or CSE+gtEffectiveVal which catches some more cases.

@JulieLeeMSFT

Copy link
Copy Markdown
Member

@pedrobsaila, converting to draft. Please reopen if you have a new implementation and ready for review.

@JulieLeeMSFT
JulieLeeMSFT marked this pull request as draft May 27, 2026 20:27
@JulieLeeMSFTJulieLeeMSFT added the needs-author-action An issue or pull request that requires more info or actions from the author. label May 27, 2026
@JulieLeeMSFTJulieLeeMSFT added this to the Future milestone May 27, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIcommunity-contributionIndicates that the PR has been added by a community memberneeds-author-actionAn issue or pull request that requires more info or actions from the author.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

JIT: Simplify arithmetic operations on memory, as is already done for register

5 participants

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

Simplify arithmetic operations on registry and memory - #125559

Draft
pedrobsaila wants to merge 33 commits into
dotnet:mainfrom
pedrobsaila:125300
Draft

Simplify arithmetic operations on registry and memory#125559
pedrobsaila wants to merge 33 commits into
dotnet:mainfrom
pedrobsaila:125300

Conversation

@pedrobsaila

@pedrobsailapedrobsaila commented Mar 14, 2026

Copy link
Copy Markdown
Contributor

Fixes#125300

Lacks tests, working on it

Before :

Program:AddReg(int):int (FullOpts):leaeax,[rdi+2*rdi]retProgram:AddMem(byref):int (FullOpts):moveax, dword ptr [rdi]leaecx,[rax+rax]addeax,ecxretProgram:SubReg(int):int (FullOpts):xoreax,eaxsubeax,ediretProgram:SubMem(byref):int (FullOpts):moveax, dword ptr [rdi]movecx,eaxsubecx,eaxsubecx,eaxmoveax,ecxret

After:

Program:AddReg(int):int (FullOpts):leaeax,[rdi+2*rdi]retProgram:AddMem(byref):int (FullOpts):moveax, dword ptr [rdi]leaeax,[rax+2*rax]retProgram:SubReg(int):int (FullOpts):moveax,ecxnegeaxretProgram:SubMem(byref):int (FullOpts):moveax, dword ptr [rdi]negeaxret

@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Mar 14, 2026
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Mar 14, 2026
@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.

@EgorBo

EgorBo commented Mar 14, 2026

Copy link
Copy Markdown
Member

haven't checked the correctness of these changes, but the diffs imply that +300 LOC to JIT are not worth it.

@pedrobsaila

pedrobsaila commented Mar 14, 2026

Copy link
Copy Markdown
ContributorAuthor

There is room to reduce LOC, I just wrote it fast to see whether their will be asm diffs or not. I'll roll more compact version in a few hours. But I agree the diffs are not that impressive.

@EgorBo

EgorBo commented Mar 14, 2026

Copy link
Copy Markdown
Member

There is room to reduce LOC, I just wrote it fast to see whether their will be asm diffs or not. I'll roll more compact version in a few hours. But I agree the diffs are not that impressive.

Right. Generally, we don't accept PRs like that unless there is a strong justification. We see it as an extra risk that is not worth the impact. To be honest, all kinds of x + x + x .. transformation should be handled elsewhere, on VN/SSA level.

@pedrobsaila

Copy link
Copy Markdown
ContributorAuthor

To be honest, all kinds of x + x + x .. transformation should be handled elsewhere, on VN/SSA level.

Sorry to bother you, but never worked on VN/SSA level, I need to ask you about which file the transformation should be valuenum.cpp/ssabuilder.cpp or elsewhere ?

@EgorBo

Copy link
Copy Markdown
Member

To be honest, all kinds of x + x + x .. transformation should be handled elsewhere, on VN/SSA level.

Sorry to bother you, but never worked on VN/SSA level, I need to ask you about which file the transformation should be valuenum.cpp/ssabuilder.cpp or elsewhere ?

I just tried myself with VN and it didn't find diffs either (mostly because we don't materialize VNs today). With SSA it's probably a more advanced task. probably like in copyprop or assertionprop, but it might also not worth it - hard to tell in advance.

@tannergooding

Copy link
Copy Markdown
Member

Do we have any info on whether the lack of diffs is because this is pattern is uncommon in all code or simply uncommon in the code that we have SPMI diffs around (i.e. corelib and partner frameworks/apps that tend to be a bit more explicit about our patterns)?

@pedrobsaila

Copy link
Copy Markdown
ContributorAuthor

@EgorBo can you tell me if I'm going in the right direction this time ? I know I still have 4 failing tests, just want to see if I'm not doing something wrong before investing more time.

@EgorBo

Copy link
Copy Markdown
Member

@EgorBo can you tell me if I'm going in the right direction this time ? I know I still have 4 failing tests, just want to see if I'm not doing something wrong before investing more time.

I haven't checked the correctness of this PR yet, but it should ideally result in massive diff improvements for so many changed lines of code

@EgorBo

EgorBo commented Apr 29, 2026

Copy link
Copy Markdown
Member

Diffs I think it's definitely too few diffs to justify that amount of changes in JIT (big risk for questionable profit)

The problem you're trying to solve probably requires some more generic / complex optimization like doing this on VN level and then materialize those VNs into actual trees. Or an SSA-based generic forward sub pass. None of which I'd recommend to waste time on 🙂

@BoyBaykiller

BoyBaykiller commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

I've basically run into the same issue in #126852 and there is some discussion on discord if you're interested @pedrobsaila.

My understanding is that there currently is no good way to handle equivalent GT_IND (and such) in these transformations. We have VNs to determine value-equality which is perfect but there is no place to freely use VNs AND do tree transformations on - as Egor said. So until then you'll be limited to comparing localNum or some hacky stuff with GenTree::Compare or CSE+gtEffectiveVal which catches some more cases.

@JulieLeeMSFT

Copy link
Copy Markdown
Member

@pedrobsaila, converting to draft. Please reopen if you have a new implementation and ready for review.

@JulieLeeMSFT
JulieLeeMSFT marked this pull request as draft May 27, 2026 20:27
@JulieLeeMSFTJulieLeeMSFT added the needs-author-action An issue or pull request that requires more info or actions from the author. label May 27, 2026
@JulieLeeMSFTJulieLeeMSFT added this to the Future milestone May 27, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIcommunity-contributionIndicates that the PR has been added by a community memberneeds-author-actionAn issue or pull request that requires more info or actions from the author.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

JIT: Simplify arithmetic operations on memory, as is already done for register

5 participants

@pedrobsaila@EgorBo@tannergooding@BoyBaykiller@JulieLeeMSFT