Do not mark st1 StoreSelectedScalar variant as needing consecutive registers - #95052

Merged
kunalspathak merged 2 commits into
dotnet:mainfrom
kunalspathak:store-selected-scalar
Nov 21, 2023
Merged

Do not mark st1 StoreSelectedScalar variant as needing consecutive registers#95052
kunalspathak merged 2 commits into
dotnet:mainfrom
kunalspathak:store-selected-scalar

Conversation

@kunalspathak

Copy link
Copy Markdown
Contributor

In #93223, we added StoreSelectedScalar intrinsic and some of the variants of that API that takes tuple as input needs consecutive registers. However, in the hwintrinsinc table, we were falsely marking the existing API as "NeedsConsecutiveRegister". Due to this, in jitstressregs, when we limit the available registers, we were prohibiting restricting the limited registers for a definition of internal temp, but were setting limitations on the use of that internal temp.

if (newRefPosition->isLiveAtConsecutiveRegistersLoc(consecutiveRegistersLocation))
{
// If we are assigning to refPositions that has consecutive registers requirements, skip the
// limit stress for them, because there are high chances that many registers are busy for
// consecutive requirements and
// we do not have enough remaining for other refpositions (like operands). Likewise, skip for the
// definition node that comes after that, for which, all the registers are in "delayRegFree" state.
}
else
#endif// TARGET_ARM64
{
newRefPosition->registerAssignment =
getConstrainedRegMask(newRefPosition, oldAssignment, calleeSaveMask, minRegCountForRef);
}

In codegen, we expect to see a single bit set for "one register" assigned to the temp, but in this case, we were assiging a different "copy" register to the use.

[000007] 20.#10 I6 Def ORDER(A) x0 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#11 I0 Use * Keep x19 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#12 I1 Use * Keep d8 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#13 I5 Use * Keep x20 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
──────────────────────────────────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
TreeID LocRP# Name Type Action Reg │x0 │x1 │x2 │x3 │x4 │x5 │x6 │x7 │x19 │x20 │x21 │d0 │d1 │d2 │d8 │d9 │
──────────────────────────────────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
20.#14 I6 Use * ORDER(C) x21 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│I6 a│ │ │ │I1 a│ │

I have fixed by introducing new intrinsic ids for various StoreSelectedScalarVectorNxM variants, similar to how we do for LoadAndInsertScalarVectorNxM APIs. For existing StoreSelectedScalar API that doesn't need consecutive registers, we now do not mark with that flag anymore.

Fixes: #95025

@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Nov 21, 2023
@ghost

Copy link
Copy Markdown

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

Issue Details

In #93223, we added StoreSelectedScalar intrinsic and some of the variants of that API that takes tuple as input needs consecutive registers. However, in the hwintrinsinc table, we were falsely marking the existing API as "NeedsConsecutiveRegister". Due to this, in jitstressregs, when we limit the available registers, we were prohibiting restricting the limited registers for a definition of internal temp, but were setting limitations on the use of that internal temp.

if (newRefPosition->isLiveAtConsecutiveRegistersLoc(consecutiveRegistersLocation))
{
// If we are assigning to refPositions that has consecutive registers requirements, skip the
// limit stress for them, because there are high chances that many registers are busy for
// consecutive requirements and
// we do not have enough remaining for other refpositions (like operands). Likewise, skip for the
// definition node that comes after that, for which, all the registers are in "delayRegFree" state.
}
else
#endif// TARGET_ARM64
{
newRefPosition->registerAssignment =
getConstrainedRegMask(newRefPosition, oldAssignment, calleeSaveMask, minRegCountForRef);
}

In codegen, we expect to see a single bit set for "one register" assigned to the temp, but in this case, we were assiging a different "copy" register to the use.

[000007] 20.#10 I6 Def ORDER(A) x0 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#11 I0 Use * Keep x19 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#12 I1 Use * Keep d8 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#13 I5 Use * Keep x20 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
──────────────────────────────────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
TreeID LocRP# Name Type Action Reg │x0 │x1 │x2 │x3 │x4 │x5 │x6 │x7 │x19 │x20 │x21 │d0 │d1 │d2 │d8 │d9 │
──────────────────────────────────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
20.#14 I6 Use * ORDER(C) x21 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│I6 a│ │ │ │I1 a│ │

I have fixed by introducing new intrinsic ids for various StoreSelectedScalarVectorNxM variants, similar to how we do for LoadAndInsertScalarVectorNxM APIs. For existing StoreSelectedScalar API that doesn't need consecutive registers, we now do not mark with that flag anymore.

Fixes: #95025

Author:kunalspathak
Assignees:-
Labels:

area-CodeGen-coreclr

Milestone:-

@kunalspathak

Copy link
Copy Markdown
ContributorAuthor

@SwapnilGaikwad

@SwapnilGaikwad

Copy link
Copy Markdown
Contributor

The change LGTM! Thanks for fixing it.

@kunalspathak
kunalspathak marked this pull request as ready for review November 21, 2023 17:51
@kunalspathak

Copy link
Copy Markdown
ContributorAuthor

@dotnet/jit-contrib

@kunalspathak
kunalspathak merged commit 52670e8 into dotnet:mainNov 21, 2023
@kunalspathak
kunalspathak deleted the store-selected-scalar branch November 21, 2023 21:14
@kunalspathakkunalspathak added arm-sve Work related to arm64 SVE/SVE2 support and removed arm-sve Work related to arm64 SVE/SVE2 support labels Nov 22, 2023
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Dec 22, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Assertion failed 'genCountBits(availableSet) == 1'

3 participants

@kunalspathak@SwapnilGaikwad@BruceForstall
, '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

Do not mark st1 StoreSelectedScalar variant as needing consecutive registers - #95052

Merged
kunalspathak merged 2 commits into
dotnet:mainfrom
kunalspathak:store-selected-scalar
Nov 21, 2023
Merged

Do not mark st1 StoreSelectedScalar variant as needing consecutive registers#95052
kunalspathak merged 2 commits into
dotnet:mainfrom
kunalspathak:store-selected-scalar

Conversation

@kunalspathak

Copy link
Copy Markdown
Contributor

In #93223, we added StoreSelectedScalar intrinsic and some of the variants of that API that takes tuple as input needs consecutive registers. However, in the hwintrinsinc table, we were falsely marking the existing API as "NeedsConsecutiveRegister". Due to this, in jitstressregs, when we limit the available registers, we were prohibiting restricting the limited registers for a definition of internal temp, but were setting limitations on the use of that internal temp.

if (newRefPosition->isLiveAtConsecutiveRegistersLoc(consecutiveRegistersLocation))
{
// If we are assigning to refPositions that has consecutive registers requirements, skip the
// limit stress for them, because there are high chances that many registers are busy for
// consecutive requirements and
// we do not have enough remaining for other refpositions (like operands). Likewise, skip for the
// definition node that comes after that, for which, all the registers are in "delayRegFree" state.
}
else
#endif// TARGET_ARM64
{
newRefPosition->registerAssignment =
getConstrainedRegMask(newRefPosition, oldAssignment, calleeSaveMask, minRegCountForRef);
}

In codegen, we expect to see a single bit set for "one register" assigned to the temp, but in this case, we were assiging a different "copy" register to the use.

[000007] 20.#10 I6 Def ORDER(A) x0 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#11 I0 Use * Keep x19 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#12 I1 Use * Keep d8 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#13 I5 Use * Keep x20 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
──────────────────────────────────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
TreeID LocRP# Name Type Action Reg │x0 │x1 │x2 │x3 │x4 │x5 │x6 │x7 │x19 │x20 │x21 │d0 │d1 │d2 │d8 │d9 │
──────────────────────────────────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
20.#14 I6 Use * ORDER(C) x21 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│I6 a│ │ │ │I1 a│ │

I have fixed by introducing new intrinsic ids for various StoreSelectedScalarVectorNxM variants, similar to how we do for LoadAndInsertScalarVectorNxM APIs. For existing StoreSelectedScalar API that doesn't need consecutive registers, we now do not mark with that flag anymore.

Fixes: #95025

@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Nov 21, 2023
@ghost

Copy link
Copy Markdown

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

Issue Details

In #93223, we added StoreSelectedScalar intrinsic and some of the variants of that API that takes tuple as input needs consecutive registers. However, in the hwintrinsinc table, we were falsely marking the existing API as "NeedsConsecutiveRegister". Due to this, in jitstressregs, when we limit the available registers, we were prohibiting restricting the limited registers for a definition of internal temp, but were setting limitations on the use of that internal temp.

if (newRefPosition->isLiveAtConsecutiveRegistersLoc(consecutiveRegistersLocation))
{
// If we are assigning to refPositions that has consecutive registers requirements, skip the
// limit stress for them, because there are high chances that many registers are busy for
// consecutive requirements and
// we do not have enough remaining for other refpositions (like operands). Likewise, skip for the
// definition node that comes after that, for which, all the registers are in "delayRegFree" state.
}
else
#endif// TARGET_ARM64
{
newRefPosition->registerAssignment =
getConstrainedRegMask(newRefPosition, oldAssignment, calleeSaveMask, minRegCountForRef);
}

In codegen, we expect to see a single bit set for "one register" assigned to the temp, but in this case, we were assiging a different "copy" register to the use.

[000007] 20.#10 I6 Def ORDER(A) x0 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#11 I0 Use * Keep x19 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#12 I1 Use * Keep d8 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#13 I5 Use * Keep x20 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
──────────────────────────────────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
TreeID LocRP# Name Type Action Reg │x0 │x1 │x2 │x3 │x4 │x5 │x6 │x7 │x19 │x20 │x21 │d0 │d1 │d2 │d8 │d9 │
──────────────────────────────────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
20.#14 I6 Use * ORDER(C) x21 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│I6 a│ │ │ │I1 a│ │

I have fixed by introducing new intrinsic ids for various StoreSelectedScalarVectorNxM variants, similar to how we do for LoadAndInsertScalarVectorNxM APIs. For existing StoreSelectedScalar API that doesn't need consecutive registers, we now do not mark with that flag anymore.

Fixes: #95025

Author:kunalspathak
Assignees:-
Labels:

area-CodeGen-coreclr

Milestone:-

@kunalspathak

Copy link
Copy Markdown
ContributorAuthor

@SwapnilGaikwad

@SwapnilGaikwad

Copy link
Copy Markdown
Contributor

The change LGTM! Thanks for fixing it.

@kunalspathak
kunalspathak marked this pull request as ready for review November 21, 2023 17:51
@kunalspathak

Copy link
Copy Markdown
ContributorAuthor

@dotnet/jit-contrib

@kunalspathak
kunalspathak merged commit 52670e8 into dotnet:mainNov 21, 2023
@kunalspathak
kunalspathak deleted the store-selected-scalar branch November 21, 2023 21:14
@kunalspathakkunalspathak added arm-sve Work related to arm64 SVE/SVE2 support and removed arm-sve Work related to arm64 SVE/SVE2 support labels Nov 22, 2023
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Dec 22, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Assertion failed 'genCountBits(availableSet) == 1'

3 participants

@kunalspathak@SwapnilGaikwad@BruceForstall
, '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

Do not mark st1 StoreSelectedScalar variant as needing consecutive registers - #95052

Merged
kunalspathak merged 2 commits into
dotnet:mainfrom
kunalspathak:store-selected-scalar
Nov 21, 2023
Merged

Do not mark st1 StoreSelectedScalar variant as needing consecutive registers#95052
kunalspathak merged 2 commits into
dotnet:mainfrom
kunalspathak:store-selected-scalar

Conversation

@kunalspathak

Copy link
Copy Markdown
Contributor

In #93223, we added StoreSelectedScalar intrinsic and some of the variants of that API that takes tuple as input needs consecutive registers. However, in the hwintrinsinc table, we were falsely marking the existing API as "NeedsConsecutiveRegister". Due to this, in jitstressregs, when we limit the available registers, we were prohibiting restricting the limited registers for a definition of internal temp, but were setting limitations on the use of that internal temp.

if (newRefPosition->isLiveAtConsecutiveRegistersLoc(consecutiveRegistersLocation))
{
// If we are assigning to refPositions that has consecutive registers requirements, skip the
// limit stress for them, because there are high chances that many registers are busy for
// consecutive requirements and
// we do not have enough remaining for other refpositions (like operands). Likewise, skip for the
// definition node that comes after that, for which, all the registers are in "delayRegFree" state.
}
else
#endif// TARGET_ARM64
{
newRefPosition->registerAssignment =
getConstrainedRegMask(newRefPosition, oldAssignment, calleeSaveMask, minRegCountForRef);
}

In codegen, we expect to see a single bit set for "one register" assigned to the temp, but in this case, we were assiging a different "copy" register to the use.

[000007] 20.#10 I6 Def ORDER(A) x0 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#11 I0 Use * Keep x19 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#12 I1 Use * Keep d8 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#13 I5 Use * Keep x20 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
──────────────────────────────────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
TreeID LocRP# Name Type Action Reg │x0 │x1 │x2 │x3 │x4 │x5 │x6 │x7 │x19 │x20 │x21 │d0 │d1 │d2 │d8 │d9 │
──────────────────────────────────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
20.#14 I6 Use * ORDER(C) x21 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│I6 a│ │ │ │I1 a│ │

I have fixed by introducing new intrinsic ids for various StoreSelectedScalarVectorNxM variants, similar to how we do for LoadAndInsertScalarVectorNxM APIs. For existing StoreSelectedScalar API that doesn't need consecutive registers, we now do not mark with that flag anymore.

Fixes: #95025

@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Nov 21, 2023
@ghost

Copy link
Copy Markdown

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

Issue Details

In #93223, we added StoreSelectedScalar intrinsic and some of the variants of that API that takes tuple as input needs consecutive registers. However, in the hwintrinsinc table, we were falsely marking the existing API as "NeedsConsecutiveRegister". Due to this, in jitstressregs, when we limit the available registers, we were prohibiting restricting the limited registers for a definition of internal temp, but were setting limitations on the use of that internal temp.

if (newRefPosition->isLiveAtConsecutiveRegistersLoc(consecutiveRegistersLocation))
{
// If we are assigning to refPositions that has consecutive registers requirements, skip the
// limit stress for them, because there are high chances that many registers are busy for
// consecutive requirements and
// we do not have enough remaining for other refpositions (like operands). Likewise, skip for the
// definition node that comes after that, for which, all the registers are in "delayRegFree" state.
}
else
#endif// TARGET_ARM64
{
newRefPosition->registerAssignment =
getConstrainedRegMask(newRefPosition, oldAssignment, calleeSaveMask, minRegCountForRef);
}

In codegen, we expect to see a single bit set for "one register" assigned to the temp, but in this case, we were assiging a different "copy" register to the use.

[000007] 20.#10 I6 Def ORDER(A) x0 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#11 I0 Use * Keep x19 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#12 I1 Use * Keep d8 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#13 I5 Use * Keep x20 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
──────────────────────────────────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
TreeID LocRP# Name Type Action Reg │x0 │x1 │x2 │x3 │x4 │x5 │x6 │x7 │x19 │x20 │x21 │d0 │d1 │d2 │d8 │d9 │
──────────────────────────────────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
20.#14 I6 Use * ORDER(C) x21 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│I6 a│ │ │ │I1 a│ │

I have fixed by introducing new intrinsic ids for various StoreSelectedScalarVectorNxM variants, similar to how we do for LoadAndInsertScalarVectorNxM APIs. For existing StoreSelectedScalar API that doesn't need consecutive registers, we now do not mark with that flag anymore.

Fixes: #95025

Author:kunalspathak
Assignees:-
Labels:

area-CodeGen-coreclr

Milestone:-

@kunalspathak

Copy link
Copy Markdown
ContributorAuthor

@SwapnilGaikwad

@SwapnilGaikwad

Copy link
Copy Markdown
Contributor

The change LGTM! Thanks for fixing it.

@kunalspathak
kunalspathak marked this pull request as ready for review November 21, 2023 17:51
@kunalspathak

Copy link
Copy Markdown
ContributorAuthor

@dotnet/jit-contrib

@kunalspathak
kunalspathak merged commit 52670e8 into dotnet:mainNov 21, 2023
@kunalspathak
kunalspathak deleted the store-selected-scalar branch November 21, 2023 21:14
@kunalspathakkunalspathak added arm-sve Work related to arm64 SVE/SVE2 support and removed arm-sve Work related to arm64 SVE/SVE2 support labels Nov 22, 2023
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Dec 22, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Assertion failed 'genCountBits(availableSet) == 1'

3 participants

@kunalspathak@SwapnilGaikwad@BruceForstall
, '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

Do not mark st1 StoreSelectedScalar variant as needing consecutive registers - #95052

Merged
kunalspathak merged 2 commits into
dotnet:mainfrom
kunalspathak:store-selected-scalar
Nov 21, 2023
Merged

Do not mark st1 StoreSelectedScalar variant as needing consecutive registers#95052
kunalspathak merged 2 commits into
dotnet:mainfrom
kunalspathak:store-selected-scalar

Conversation

@kunalspathak

Copy link
Copy Markdown
Contributor

In #93223, we added StoreSelectedScalar intrinsic and some of the variants of that API that takes tuple as input needs consecutive registers. However, in the hwintrinsinc table, we were falsely marking the existing API as "NeedsConsecutiveRegister". Due to this, in jitstressregs, when we limit the available registers, we were prohibiting restricting the limited registers for a definition of internal temp, but were setting limitations on the use of that internal temp.

if (newRefPosition->isLiveAtConsecutiveRegistersLoc(consecutiveRegistersLocation))
{
// If we are assigning to refPositions that has consecutive registers requirements, skip the
// limit stress for them, because there are high chances that many registers are busy for
// consecutive requirements and
// we do not have enough remaining for other refpositions (like operands). Likewise, skip for the
// definition node that comes after that, for which, all the registers are in "delayRegFree" state.
}
else
#endif// TARGET_ARM64
{
newRefPosition->registerAssignment =
getConstrainedRegMask(newRefPosition, oldAssignment, calleeSaveMask, minRegCountForRef);
}

In codegen, we expect to see a single bit set for "one register" assigned to the temp, but in this case, we were assiging a different "copy" register to the use.

[000007] 20.#10 I6 Def ORDER(A) x0 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#11 I0 Use * Keep x19 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#12 I1 Use * Keep d8 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#13 I5 Use * Keep x20 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
──────────────────────────────────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
TreeID LocRP# Name Type Action Reg │x0 │x1 │x2 │x3 │x4 │x5 │x6 │x7 │x19 │x20 │x21 │d0 │d1 │d2 │d8 │d9 │
──────────────────────────────────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
20.#14 I6 Use * ORDER(C) x21 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│I6 a│ │ │ │I1 a│ │

I have fixed by introducing new intrinsic ids for various StoreSelectedScalarVectorNxM variants, similar to how we do for LoadAndInsertScalarVectorNxM APIs. For existing StoreSelectedScalar API that doesn't need consecutive registers, we now do not mark with that flag anymore.

Fixes: #95025

@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Nov 21, 2023
@ghost

Copy link
Copy Markdown

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

Issue Details

In #93223, we added StoreSelectedScalar intrinsic and some of the variants of that API that takes tuple as input needs consecutive registers. However, in the hwintrinsinc table, we were falsely marking the existing API as "NeedsConsecutiveRegister". Due to this, in jitstressregs, when we limit the available registers, we were prohibiting restricting the limited registers for a definition of internal temp, but were setting limitations on the use of that internal temp.

if (newRefPosition->isLiveAtConsecutiveRegistersLoc(consecutiveRegistersLocation))
{
// If we are assigning to refPositions that has consecutive registers requirements, skip the
// limit stress for them, because there are high chances that many registers are busy for
// consecutive requirements and
// we do not have enough remaining for other refpositions (like operands). Likewise, skip for the
// definition node that comes after that, for which, all the registers are in "delayRegFree" state.
}
else
#endif// TARGET_ARM64
{
newRefPosition->registerAssignment =
getConstrainedRegMask(newRefPosition, oldAssignment, calleeSaveMask, minRegCountForRef);
}

In codegen, we expect to see a single bit set for "one register" assigned to the temp, but in this case, we were assiging a different "copy" register to the use.

[000007] 20.#10 I6 Def ORDER(A) x0 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#11 I0 Use * Keep x19 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#12 I1 Use * Keep d8 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#13 I5 Use * Keep x20 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
──────────────────────────────────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
TreeID LocRP# Name Type Action Reg │x0 │x1 │x2 │x3 │x4 │x5 │x6 │x7 │x19 │x20 │x21 │d0 │d1 │d2 │d8 │d9 │
──────────────────────────────────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
20.#14 I6 Use * ORDER(C) x21 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│I6 a│ │ │ │I1 a│ │

I have fixed by introducing new intrinsic ids for various StoreSelectedScalarVectorNxM variants, similar to how we do for LoadAndInsertScalarVectorNxM APIs. For existing StoreSelectedScalar API that doesn't need consecutive registers, we now do not mark with that flag anymore.

Fixes: #95025

Author:kunalspathak
Assignees:-
Labels:

area-CodeGen-coreclr

Milestone:-

@kunalspathak

Copy link
Copy Markdown
ContributorAuthor

@SwapnilGaikwad

@SwapnilGaikwad

Copy link
Copy Markdown
Contributor

The change LGTM! Thanks for fixing it.

@kunalspathak
kunalspathak marked this pull request as ready for review November 21, 2023 17:51
@kunalspathak

Copy link
Copy Markdown
ContributorAuthor

@dotnet/jit-contrib

@kunalspathak
kunalspathak merged commit 52670e8 into dotnet:mainNov 21, 2023
@kunalspathak
kunalspathak deleted the store-selected-scalar branch November 21, 2023 21:14
@kunalspathakkunalspathak added arm-sve Work related to arm64 SVE/SVE2 support and removed arm-sve Work related to arm64 SVE/SVE2 support labels Nov 22, 2023
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Dec 22, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Assertion failed 'genCountBits(availableSet) == 1'

3 participants

@kunalspathak@SwapnilGaikwad@BruceForstall
, '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

Do not mark st1 StoreSelectedScalar variant as needing consecutive registers - #95052

Merged
kunalspathak merged 2 commits into
dotnet:mainfrom
kunalspathak:store-selected-scalar
Nov 21, 2023
Merged

Do not mark st1 StoreSelectedScalar variant as needing consecutive registers#95052
kunalspathak merged 2 commits into
dotnet:mainfrom
kunalspathak:store-selected-scalar

Conversation

@kunalspathak

Copy link
Copy Markdown
Contributor

In #93223, we added StoreSelectedScalar intrinsic and some of the variants of that API that takes tuple as input needs consecutive registers. However, in the hwintrinsinc table, we were falsely marking the existing API as "NeedsConsecutiveRegister". Due to this, in jitstressregs, when we limit the available registers, we were prohibiting restricting the limited registers for a definition of internal temp, but were setting limitations on the use of that internal temp.

if (newRefPosition->isLiveAtConsecutiveRegistersLoc(consecutiveRegistersLocation))
{
// If we are assigning to refPositions that has consecutive registers requirements, skip the
// limit stress for them, because there are high chances that many registers are busy for
// consecutive requirements and
// we do not have enough remaining for other refpositions (like operands). Likewise, skip for the
// definition node that comes after that, for which, all the registers are in "delayRegFree" state.
}
else
#endif// TARGET_ARM64
{
newRefPosition->registerAssignment =
getConstrainedRegMask(newRefPosition, oldAssignment, calleeSaveMask, minRegCountForRef);
}

In codegen, we expect to see a single bit set for "one register" assigned to the temp, but in this case, we were assiging a different "copy" register to the use.

[000007] 20.#10 I6 Def ORDER(A) x0 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#11 I0 Use * Keep x19 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#12 I1 Use * Keep d8 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#13 I5 Use * Keep x20 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
──────────────────────────────────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
TreeID LocRP# Name Type Action Reg │x0 │x1 │x2 │x3 │x4 │x5 │x6 │x7 │x19 │x20 │x21 │d0 │d1 │d2 │d8 │d9 │
──────────────────────────────────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
20.#14 I6 Use * ORDER(C) x21 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│I6 a│ │ │ │I1 a│ │

I have fixed by introducing new intrinsic ids for various StoreSelectedScalarVectorNxM variants, similar to how we do for LoadAndInsertScalarVectorNxM APIs. For existing StoreSelectedScalar API that doesn't need consecutive registers, we now do not mark with that flag anymore.

Fixes: #95025

@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Nov 21, 2023
@ghost

Copy link
Copy Markdown

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

Issue Details

In #93223, we added StoreSelectedScalar intrinsic and some of the variants of that API that takes tuple as input needs consecutive registers. However, in the hwintrinsinc table, we were falsely marking the existing API as "NeedsConsecutiveRegister". Due to this, in jitstressregs, when we limit the available registers, we were prohibiting restricting the limited registers for a definition of internal temp, but were setting limitations on the use of that internal temp.

if (newRefPosition->isLiveAtConsecutiveRegistersLoc(consecutiveRegistersLocation))
{
// If we are assigning to refPositions that has consecutive registers requirements, skip the
// limit stress for them, because there are high chances that many registers are busy for
// consecutive requirements and
// we do not have enough remaining for other refpositions (like operands). Likewise, skip for the
// definition node that comes after that, for which, all the registers are in "delayRegFree" state.
}
else
#endif// TARGET_ARM64
{
newRefPosition->registerAssignment =
getConstrainedRegMask(newRefPosition, oldAssignment, calleeSaveMask, minRegCountForRef);
}

In codegen, we expect to see a single bit set for "one register" assigned to the temp, but in this case, we were assiging a different "copy" register to the use.

[000007] 20.#10 I6 Def ORDER(A) x0 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#11 I0 Use * Keep x19 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#12 I1 Use * Keep d8 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#13 I5 Use * Keep x20 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
──────────────────────────────────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
TreeID LocRP# Name Type Action Reg │x0 │x1 │x2 │x3 │x4 │x5 │x6 │x7 │x19 │x20 │x21 │d0 │d1 │d2 │d8 │d9 │
──────────────────────────────────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
20.#14 I6 Use * ORDER(C) x21 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│I6 a│ │ │ │I1 a│ │

I have fixed by introducing new intrinsic ids for various StoreSelectedScalarVectorNxM variants, similar to how we do for LoadAndInsertScalarVectorNxM APIs. For existing StoreSelectedScalar API that doesn't need consecutive registers, we now do not mark with that flag anymore.

Fixes: #95025

Author:kunalspathak
Assignees:-
Labels:

area-CodeGen-coreclr

Milestone:-

@kunalspathak

Copy link
Copy Markdown
ContributorAuthor

@SwapnilGaikwad

@SwapnilGaikwad

Copy link
Copy Markdown
Contributor

The change LGTM! Thanks for fixing it.

@kunalspathak
kunalspathak marked this pull request as ready for review November 21, 2023 17:51
@kunalspathak

Copy link
Copy Markdown
ContributorAuthor

@dotnet/jit-contrib

@kunalspathak
kunalspathak merged commit 52670e8 into dotnet:mainNov 21, 2023
@kunalspathak
kunalspathak deleted the store-selected-scalar branch November 21, 2023 21:14
@kunalspathakkunalspathak added arm-sve Work related to arm64 SVE/SVE2 support and removed arm-sve Work related to arm64 SVE/SVE2 support labels Nov 22, 2023
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Dec 22, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Assertion failed 'genCountBits(availableSet) == 1'

3 participants

@kunalspathak@SwapnilGaikwad@BruceForstall
, '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

Do not mark st1 StoreSelectedScalar variant as needing consecutive registers - #95052

Merged
kunalspathak merged 2 commits into
dotnet:mainfrom
kunalspathak:store-selected-scalar
Nov 21, 2023
Merged

Do not mark st1 StoreSelectedScalar variant as needing consecutive registers#95052
kunalspathak merged 2 commits into
dotnet:mainfrom
kunalspathak:store-selected-scalar

Conversation

@kunalspathak

Copy link
Copy Markdown
Contributor

In #93223, we added StoreSelectedScalar intrinsic and some of the variants of that API that takes tuple as input needs consecutive registers. However, in the hwintrinsinc table, we were falsely marking the existing API as "NeedsConsecutiveRegister". Due to this, in jitstressregs, when we limit the available registers, we were prohibiting restricting the limited registers for a definition of internal temp, but were setting limitations on the use of that internal temp.

if (newRefPosition->isLiveAtConsecutiveRegistersLoc(consecutiveRegistersLocation))
{
// If we are assigning to refPositions that has consecutive registers requirements, skip the
// limit stress for them, because there are high chances that many registers are busy for
// consecutive requirements and
// we do not have enough remaining for other refpositions (like operands). Likewise, skip for the
// definition node that comes after that, for which, all the registers are in "delayRegFree" state.
}
else
#endif// TARGET_ARM64
{
newRefPosition->registerAssignment =
getConstrainedRegMask(newRefPosition, oldAssignment, calleeSaveMask, minRegCountForRef);
}

In codegen, we expect to see a single bit set for "one register" assigned to the temp, but in this case, we were assiging a different "copy" register to the use.

[000007] 20.#10 I6 Def ORDER(A) x0 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#11 I0 Use * Keep x19 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#12 I1 Use * Keep d8 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#13 I5 Use * Keep x20 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
──────────────────────────────────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
TreeID LocRP# Name Type Action Reg │x0 │x1 │x2 │x3 │x4 │x5 │x6 │x7 │x19 │x20 │x21 │d0 │d1 │d2 │d8 │d9 │
──────────────────────────────────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
20.#14 I6 Use * ORDER(C) x21 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│I6 a│ │ │ │I1 a│ │

I have fixed by introducing new intrinsic ids for various StoreSelectedScalarVectorNxM variants, similar to how we do for LoadAndInsertScalarVectorNxM APIs. For existing StoreSelectedScalar API that doesn't need consecutive registers, we now do not mark with that flag anymore.

Fixes: #95025

@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Nov 21, 2023
@ghost

Copy link
Copy Markdown

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

Issue Details

In #93223, we added StoreSelectedScalar intrinsic and some of the variants of that API that takes tuple as input needs consecutive registers. However, in the hwintrinsinc table, we were falsely marking the existing API as "NeedsConsecutiveRegister". Due to this, in jitstressregs, when we limit the available registers, we were prohibiting restricting the limited registers for a definition of internal temp, but were setting limitations on the use of that internal temp.

if (newRefPosition->isLiveAtConsecutiveRegistersLoc(consecutiveRegistersLocation))
{
// If we are assigning to refPositions that has consecutive registers requirements, skip the
// limit stress for them, because there are high chances that many registers are busy for
// consecutive requirements and
// we do not have enough remaining for other refpositions (like operands). Likewise, skip for the
// definition node that comes after that, for which, all the registers are in "delayRegFree" state.
}
else
#endif// TARGET_ARM64
{
newRefPosition->registerAssignment =
getConstrainedRegMask(newRefPosition, oldAssignment, calleeSaveMask, minRegCountForRef);
}

In codegen, we expect to see a single bit set for "one register" assigned to the temp, but in this case, we were assiging a different "copy" register to the use.

[000007] 20.#10 I6 Def ORDER(A) x0 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#11 I0 Use * Keep x19 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#12 I1 Use * Keep d8 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#13 I5 Use * Keep x20 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
──────────────────────────────────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
TreeID LocRP# Name Type Action Reg │x0 │x1 │x2 │x3 │x4 │x5 │x6 │x7 │x19 │x20 │x21 │d0 │d1 │d2 │d8 │d9 │
──────────────────────────────────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
20.#14 I6 Use * ORDER(C) x21 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│I6 a│ │ │ │I1 a│ │

I have fixed by introducing new intrinsic ids for various StoreSelectedScalarVectorNxM variants, similar to how we do for LoadAndInsertScalarVectorNxM APIs. For existing StoreSelectedScalar API that doesn't need consecutive registers, we now do not mark with that flag anymore.

Fixes: #95025

Author:kunalspathak
Assignees:-
Labels:

area-CodeGen-coreclr

Milestone:-

@kunalspathak

Copy link
Copy Markdown
ContributorAuthor

@SwapnilGaikwad

@SwapnilGaikwad

Copy link
Copy Markdown
Contributor

The change LGTM! Thanks for fixing it.

@kunalspathak
kunalspathak marked this pull request as ready for review November 21, 2023 17:51
@kunalspathak

Copy link
Copy Markdown
ContributorAuthor

@dotnet/jit-contrib

@kunalspathak
kunalspathak merged commit 52670e8 into dotnet:mainNov 21, 2023
@kunalspathak
kunalspathak deleted the store-selected-scalar branch November 21, 2023 21:14
@kunalspathakkunalspathak added arm-sve Work related to arm64 SVE/SVE2 support and removed arm-sve Work related to arm64 SVE/SVE2 support labels Nov 22, 2023
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Dec 22, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Assertion failed 'genCountBits(availableSet) == 1'

3 participants

@kunalspathak@SwapnilGaikwad@BruceForstall
, '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

Do not mark st1 StoreSelectedScalar variant as needing consecutive registers - #95052

Merged
kunalspathak merged 2 commits into
dotnet:mainfrom
kunalspathak:store-selected-scalar
Nov 21, 2023
Merged

Do not mark st1 StoreSelectedScalar variant as needing consecutive registers#95052
kunalspathak merged 2 commits into
dotnet:mainfrom
kunalspathak:store-selected-scalar

Conversation

@kunalspathak

Copy link
Copy Markdown
Contributor

In #93223, we added StoreSelectedScalar intrinsic and some of the variants of that API that takes tuple as input needs consecutive registers. However, in the hwintrinsinc table, we were falsely marking the existing API as "NeedsConsecutiveRegister". Due to this, in jitstressregs, when we limit the available registers, we were prohibiting restricting the limited registers for a definition of internal temp, but were setting limitations on the use of that internal temp.

if (newRefPosition->isLiveAtConsecutiveRegistersLoc(consecutiveRegistersLocation))
{
// If we are assigning to refPositions that has consecutive registers requirements, skip the
// limit stress for them, because there are high chances that many registers are busy for
// consecutive requirements and
// we do not have enough remaining for other refpositions (like operands). Likewise, skip for the
// definition node that comes after that, for which, all the registers are in "delayRegFree" state.
}
else
#endif// TARGET_ARM64
{
newRefPosition->registerAssignment =
getConstrainedRegMask(newRefPosition, oldAssignment, calleeSaveMask, minRegCountForRef);
}

In codegen, we expect to see a single bit set for "one register" assigned to the temp, but in this case, we were assiging a different "copy" register to the use.

[000007] 20.#10 I6 Def ORDER(A) x0 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#11 I0 Use * Keep x19 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#12 I1 Use * Keep d8 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#13 I5 Use * Keep x20 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
──────────────────────────────────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
TreeID LocRP# Name Type Action Reg │x0 │x1 │x2 │x3 │x4 │x5 │x6 │x7 │x19 │x20 │x21 │d0 │d1 │d2 │d8 │d9 │
──────────────────────────────────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
20.#14 I6 Use * ORDER(C) x21 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│I6 a│ │ │ │I1 a│ │

I have fixed by introducing new intrinsic ids for various StoreSelectedScalarVectorNxM variants, similar to how we do for LoadAndInsertScalarVectorNxM APIs. For existing StoreSelectedScalar API that doesn't need consecutive registers, we now do not mark with that flag anymore.

Fixes: #95025

@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Nov 21, 2023
@ghost

Copy link
Copy Markdown

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

Issue Details

In #93223, we added StoreSelectedScalar intrinsic and some of the variants of that API that takes tuple as input needs consecutive registers. However, in the hwintrinsinc table, we were falsely marking the existing API as "NeedsConsecutiveRegister". Due to this, in jitstressregs, when we limit the available registers, we were prohibiting restricting the limited registers for a definition of internal temp, but were setting limitations on the use of that internal temp.

if (newRefPosition->isLiveAtConsecutiveRegistersLoc(consecutiveRegistersLocation))
{
// If we are assigning to refPositions that has consecutive registers requirements, skip the
// limit stress for them, because there are high chances that many registers are busy for
// consecutive requirements and
// we do not have enough remaining for other refpositions (like operands). Likewise, skip for the
// definition node that comes after that, for which, all the registers are in "delayRegFree" state.
}
else
#endif// TARGET_ARM64
{
newRefPosition->registerAssignment =
getConstrainedRegMask(newRefPosition, oldAssignment, calleeSaveMask, minRegCountForRef);
}

In codegen, we expect to see a single bit set for "one register" assigned to the temp, but in this case, we were assiging a different "copy" register to the use.

[000007] 20.#10 I6 Def ORDER(A) x0 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#11 I0 Use * Keep x19 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#12 I1 Use * Keep d8 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#13 I5 Use * Keep x20 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
──────────────────────────────────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
TreeID LocRP# Name Type Action Reg │x0 │x1 │x2 │x3 │x4 │x5 │x6 │x7 │x19 │x20 │x21 │d0 │d1 │d2 │d8 │d9 │
──────────────────────────────────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
20.#14 I6 Use * ORDER(C) x21 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│I6 a│ │ │ │I1 a│ │

I have fixed by introducing new intrinsic ids for various StoreSelectedScalarVectorNxM variants, similar to how we do for LoadAndInsertScalarVectorNxM APIs. For existing StoreSelectedScalar API that doesn't need consecutive registers, we now do not mark with that flag anymore.

Fixes: #95025

Author:kunalspathak
Assignees:-
Labels:

area-CodeGen-coreclr

Milestone:-

@kunalspathak

Copy link
Copy Markdown
ContributorAuthor

@SwapnilGaikwad

@SwapnilGaikwad

Copy link
Copy Markdown
Contributor

The change LGTM! Thanks for fixing it.

@kunalspathak
kunalspathak marked this pull request as ready for review November 21, 2023 17:51
@kunalspathak

Copy link
Copy Markdown
ContributorAuthor

@dotnet/jit-contrib

@kunalspathak
kunalspathak merged commit 52670e8 into dotnet:mainNov 21, 2023
@kunalspathak
kunalspathak deleted the store-selected-scalar branch November 21, 2023 21:14
@kunalspathakkunalspathak added arm-sve Work related to arm64 SVE/SVE2 support and removed arm-sve Work related to arm64 SVE/SVE2 support labels Nov 22, 2023
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Dec 22, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Assertion failed 'genCountBits(availableSet) == 1'

3 participants

@kunalspathak@SwapnilGaikwad@BruceForstall
, '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

Do not mark st1 StoreSelectedScalar variant as needing consecutive registers - #95052

Merged
kunalspathak merged 2 commits into
dotnet:mainfrom
kunalspathak:store-selected-scalar
Nov 21, 2023
Merged

Do not mark st1 StoreSelectedScalar variant as needing consecutive registers#95052
kunalspathak merged 2 commits into
dotnet:mainfrom
kunalspathak:store-selected-scalar

Conversation

@kunalspathak

Copy link
Copy Markdown
Contributor

In #93223, we added StoreSelectedScalar intrinsic and some of the variants of that API that takes tuple as input needs consecutive registers. However, in the hwintrinsinc table, we were falsely marking the existing API as "NeedsConsecutiveRegister". Due to this, in jitstressregs, when we limit the available registers, we were prohibiting restricting the limited registers for a definition of internal temp, but were setting limitations on the use of that internal temp.

if (newRefPosition->isLiveAtConsecutiveRegistersLoc(consecutiveRegistersLocation))
{
// If we are assigning to refPositions that has consecutive registers requirements, skip the
// limit stress for them, because there are high chances that many registers are busy for
// consecutive requirements and
// we do not have enough remaining for other refpositions (like operands). Likewise, skip for the
// definition node that comes after that, for which, all the registers are in "delayRegFree" state.
}
else
#endif// TARGET_ARM64
{
newRefPosition->registerAssignment =
getConstrainedRegMask(newRefPosition, oldAssignment, calleeSaveMask, minRegCountForRef);
}

In codegen, we expect to see a single bit set for "one register" assigned to the temp, but in this case, we were assiging a different "copy" register to the use.

[000007] 20.#10 I6 Def ORDER(A) x0 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#11 I0 Use * Keep x19 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#12 I1 Use * Keep d8 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#13 I5 Use * Keep x20 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
──────────────────────────────────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
TreeID LocRP# Name Type Action Reg │x0 │x1 │x2 │x3 │x4 │x5 │x6 │x7 │x19 │x20 │x21 │d0 │d1 │d2 │d8 │d9 │
──────────────────────────────────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
20.#14 I6 Use * ORDER(C) x21 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│I6 a│ │ │ │I1 a│ │

I have fixed by introducing new intrinsic ids for various StoreSelectedScalarVectorNxM variants, similar to how we do for LoadAndInsertScalarVectorNxM APIs. For existing StoreSelectedScalar API that doesn't need consecutive registers, we now do not mark with that flag anymore.

Fixes: #95025

@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Nov 21, 2023
@ghost

Copy link
Copy Markdown

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

Issue Details

In #93223, we added StoreSelectedScalar intrinsic and some of the variants of that API that takes tuple as input needs consecutive registers. However, in the hwintrinsinc table, we were falsely marking the existing API as "NeedsConsecutiveRegister". Due to this, in jitstressregs, when we limit the available registers, we were prohibiting restricting the limited registers for a definition of internal temp, but were setting limitations on the use of that internal temp.

if (newRefPosition->isLiveAtConsecutiveRegistersLoc(consecutiveRegistersLocation))
{
// If we are assigning to refPositions that has consecutive registers requirements, skip the
// limit stress for them, because there are high chances that many registers are busy for
// consecutive requirements and
// we do not have enough remaining for other refpositions (like operands). Likewise, skip for the
// definition node that comes after that, for which, all the registers are in "delayRegFree" state.
}
else
#endif// TARGET_ARM64
{
newRefPosition->registerAssignment =
getConstrainedRegMask(newRefPosition, oldAssignment, calleeSaveMask, minRegCountForRef);
}

In codegen, we expect to see a single bit set for "one register" assigned to the temp, but in this case, we were assiging a different "copy" register to the use.

[000007] 20.#10 I6 Def ORDER(A) x0 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#11 I0 Use * Keep x19 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#12 I1 Use * Keep d8 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
20.#13 I5 Use * Keep x20 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│ │ │ │I1 a│ │
──────────────────────────────────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
TreeID LocRP# Name Type Action Reg │x0 │x1 │x2 │x3 │x4 │x5 │x6 │x7 │x19 │x20 │x21 │d0 │d1 │d2 │d8 │d9 │
──────────────────────────────────────────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
20.#14 I6 Use * ORDER(C) x21 │I6 a│ │ │ │ │ │ │ │I0 a│I5 a│I6 a│ │ │ │I1 a│ │

I have fixed by introducing new intrinsic ids for various StoreSelectedScalarVectorNxM variants, similar to how we do for LoadAndInsertScalarVectorNxM APIs. For existing StoreSelectedScalar API that doesn't need consecutive registers, we now do not mark with that flag anymore.

Fixes: #95025

Author:kunalspathak
Assignees:-
Labels:

area-CodeGen-coreclr

Milestone:-

@kunalspathak

Copy link
Copy Markdown
ContributorAuthor

@SwapnilGaikwad

@SwapnilGaikwad

Copy link
Copy Markdown
Contributor

The change LGTM! Thanks for fixing it.

@kunalspathak
kunalspathak marked this pull request as ready for review November 21, 2023 17:51
@kunalspathak

Copy link
Copy Markdown
ContributorAuthor

@dotnet/jit-contrib

@kunalspathak
kunalspathak merged commit 52670e8 into dotnet:mainNov 21, 2023
@kunalspathak
kunalspathak deleted the store-selected-scalar branch November 21, 2023 21:14
@kunalspathakkunalspathak added arm-sve Work related to arm64 SVE/SVE2 support and removed arm-sve Work related to arm64 SVE/SVE2 support labels Nov 22, 2023
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Dec 22, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Assertion failed 'genCountBits(availableSet) == 1'

3 participants

@kunalspathak@SwapnilGaikwad@BruceForstall