Skip to content

JIT: Fixed containment of STOREIND of HW intrinsics ConvertTo* - #92396

Merged
TIHan merged 9 commits into
dotnet:mainfrom
TIHan:simd-scalar-cast-fix
Sep 23, 2023
Merged

JIT: Fixed containment of STOREIND of HW intrinsics ConvertTo*#92396
TIHan merged 9 commits into
dotnet:mainfrom
TIHan:simd-scalar-cast-fix

Conversation

@TIHan

@TIHanTIHan commented Sep 21, 2023

Copy link
Copy Markdown
Contributor

Resolves#92349 regarding the truncating CAST

Description

As an example, the HW Intrinsic SIMD scalar ConvertToInt32 will emit a vmovd instruction. This instruction can store a scalar value in memory or in a register, but only for 32 and 64 bits.

So, when we have something like this:

// pValue is a 'ushort*'*pValue=(ushort)(uint)Sse2.ConvertToInt32(newMinZ16);

Acceptance Criteria

  • Add test case

Note

We need to backport this to .NET 8.

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

Copy link
Copy Markdown
ContributorAuthor

cc @tannergooding

@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

Resolves #92349 regarding the truncating CAST

Description

As an example, the HW Intrinsic SIMD scalar ConvertToInt32 will emit a vmovd instruction. This instruction can store a scalar value in memory or in a register, but only for 32 and 64 bits.

So, when we have something like this:

// pValue is a 'ushort*'*pValue=(ushort)(uint)Sse2.ConvertToInt32(newMinZ16);

We need to keep the cast operation for int -> short, otherwise we will get an incorrect result which is what #92349 was telling us.

I tried to see if there was something we could do in codegen, but it is a lot easier to handle in morph where we get rid of these CASTs. The simplest thing to do is check to see if we have a SIMD scalar operation, and if we do, do not remove the CAST.

Acceptance Criteria

  • Add test case
Author:TIHan
Assignees:-
Labels:

area-CodeGen-coreclr

Milestone:-

@TIHan
TIHan marked this pull request as draft September 21, 2023 02:36
@jakobbotsch

jakobbotsch commented Sep 21, 2023

Copy link
Copy Markdown
Member

We need to keep the cast operation for int -> short, otherwise we will get an incorrect result which is what #92349 was telling us.

I tried to see if there was something we could do in codegen, but it is a lot easier to handle in morph where we get rid of these CASTs. The simplest thing to do is check to see if we have a SIMD scalar operation and we are storing the result for a small type, then do not remove the CAST.

We should fix this in the backend. STOREIND<ushort> should never be storing more than two bytes. With this PR the bug still exists, it's just harder to expose (but can definitely be done, e.g. you can write IL manually that doesn't create these casts in the first place).

It looks like a bug in ContainCheckStoreIndir. This line:

isContainable = varTypeIsIntegral(simdBaseType);

should be

isContainable = varTypeIsIntegral(simdBaseType) && (genTypeSize(src) == genTypeSize(node));

if vmovd has no 8/16 bit forms.

@TIHan

Copy link
Copy Markdown
ContributorAuthor

We should fix this in the backend

Your fix works and is a lot simpler than what I had. Thank you.

@TIHanTIHan changed the title JIT: Do not remove CAST on SIMD scalar operations for storesJIT: Fixed containment of STOREIND of HW intrinsics ConvertTo*Sep 21, 2023

@jakobbotschjakobbotsch left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Add a test?

@TIHan
TIHan marked this pull request as ready for review September 21, 2023 20:03
@TIHan

Copy link
Copy Markdown
ContributorAuthor

@dotnet/jit-contrib @jakobbotsch@tannergooding This is ready, pending CI.

@TIHan
TIHan merged commit 8c09075 into dotnet:mainSep 23, 2023
@TIHan

Copy link
Copy Markdown
ContributorAuthor

/backport to release/8.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/8.0: https://github.com/dotnet/runtime/actions/runs/6280549647

@ghostghost locked as resolved and limited conversation to collaborators Oct 23, 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.

Incorrect value after truncating cast

3 participants

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

JIT: Fixed containment of STOREIND of HW intrinsics ConvertTo* - #92396

Merged
TIHan merged 9 commits into
dotnet:mainfrom
TIHan:simd-scalar-cast-fix
Sep 23, 2023
Merged

JIT: Fixed containment of STOREIND of HW intrinsics ConvertTo*#92396
TIHan merged 9 commits into
dotnet:mainfrom
TIHan:simd-scalar-cast-fix

Conversation

@TIHan

@TIHanTIHan commented Sep 21, 2023

Copy link
Copy Markdown
Contributor

Resolves#92349 regarding the truncating CAST

Description

As an example, the HW Intrinsic SIMD scalar ConvertToInt32 will emit a vmovd instruction. This instruction can store a scalar value in memory or in a register, but only for 32 and 64 bits.

So, when we have something like this:

// pValue is a 'ushort*'*pValue=(ushort)(uint)Sse2.ConvertToInt32(newMinZ16);

Acceptance Criteria

  • Add test case

Note

We need to backport this to .NET 8.

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

Copy link
Copy Markdown
ContributorAuthor

cc @tannergooding

@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

Resolves #92349 regarding the truncating CAST

Description

As an example, the HW Intrinsic SIMD scalar ConvertToInt32 will emit a vmovd instruction. This instruction can store a scalar value in memory or in a register, but only for 32 and 64 bits.

So, when we have something like this:

// pValue is a 'ushort*'*pValue=(ushort)(uint)Sse2.ConvertToInt32(newMinZ16);

We need to keep the cast operation for int -> short, otherwise we will get an incorrect result which is what #92349 was telling us.

I tried to see if there was something we could do in codegen, but it is a lot easier to handle in morph where we get rid of these CASTs. The simplest thing to do is check to see if we have a SIMD scalar operation, and if we do, do not remove the CAST.

Acceptance Criteria

  • Add test case
Author:TIHan
Assignees:-
Labels:

area-CodeGen-coreclr

Milestone:-

@TIHan
TIHan marked this pull request as draft September 21, 2023 02:36
@jakobbotsch

jakobbotsch commented Sep 21, 2023

Copy link
Copy Markdown
Member

We need to keep the cast operation for int -> short, otherwise we will get an incorrect result which is what #92349 was telling us.

I tried to see if there was something we could do in codegen, but it is a lot easier to handle in morph where we get rid of these CASTs. The simplest thing to do is check to see if we have a SIMD scalar operation and we are storing the result for a small type, then do not remove the CAST.

We should fix this in the backend. STOREIND<ushort> should never be storing more than two bytes. With this PR the bug still exists, it's just harder to expose (but can definitely be done, e.g. you can write IL manually that doesn't create these casts in the first place).

It looks like a bug in ContainCheckStoreIndir. This line:

isContainable = varTypeIsIntegral(simdBaseType);

should be

isContainable = varTypeIsIntegral(simdBaseType) && (genTypeSize(src) == genTypeSize(node));

if vmovd has no 8/16 bit forms.

@TIHan

Copy link
Copy Markdown
ContributorAuthor

We should fix this in the backend

Your fix works and is a lot simpler than what I had. Thank you.

@TIHanTIHan changed the title JIT: Do not remove CAST on SIMD scalar operations for storesJIT: Fixed containment of STOREIND of HW intrinsics ConvertTo*Sep 21, 2023

@jakobbotschjakobbotsch left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Add a test?

@TIHan
TIHan marked this pull request as ready for review September 21, 2023 20:03
@TIHan

Copy link
Copy Markdown
ContributorAuthor

@dotnet/jit-contrib @jakobbotsch@tannergooding This is ready, pending CI.

@TIHan
TIHan merged commit 8c09075 into dotnet:mainSep 23, 2023
@TIHan

Copy link
Copy Markdown
ContributorAuthor

/backport to release/8.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/8.0: https://github.com/dotnet/runtime/actions/runs/6280549647

@ghostghost locked as resolved and limited conversation to collaborators Oct 23, 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.

Incorrect value after truncating cast

3 participants

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

JIT: Fixed containment of STOREIND of HW intrinsics ConvertTo* - #92396

Merged
TIHan merged 9 commits into
dotnet:mainfrom
TIHan:simd-scalar-cast-fix
Sep 23, 2023
Merged

JIT: Fixed containment of STOREIND of HW intrinsics ConvertTo*#92396
TIHan merged 9 commits into
dotnet:mainfrom
TIHan:simd-scalar-cast-fix

Conversation

@TIHan

@TIHanTIHan commented Sep 21, 2023

Copy link
Copy Markdown
Contributor

Resolves#92349 regarding the truncating CAST

Description

As an example, the HW Intrinsic SIMD scalar ConvertToInt32 will emit a vmovd instruction. This instruction can store a scalar value in memory or in a register, but only for 32 and 64 bits.

So, when we have something like this:

// pValue is a 'ushort*'*pValue=(ushort)(uint)Sse2.ConvertToInt32(newMinZ16);

Acceptance Criteria

  • Add test case

Note

We need to backport this to .NET 8.

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

Copy link
Copy Markdown
ContributorAuthor

cc @tannergooding

@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

Resolves #92349 regarding the truncating CAST

Description

As an example, the HW Intrinsic SIMD scalar ConvertToInt32 will emit a vmovd instruction. This instruction can store a scalar value in memory or in a register, but only for 32 and 64 bits.

So, when we have something like this:

// pValue is a 'ushort*'*pValue=(ushort)(uint)Sse2.ConvertToInt32(newMinZ16);

We need to keep the cast operation for int -> short, otherwise we will get an incorrect result which is what #92349 was telling us.

I tried to see if there was something we could do in codegen, but it is a lot easier to handle in morph where we get rid of these CASTs. The simplest thing to do is check to see if we have a SIMD scalar operation, and if we do, do not remove the CAST.

Acceptance Criteria

  • Add test case
Author:TIHan
Assignees:-
Labels:

area-CodeGen-coreclr

Milestone:-

@TIHan
TIHan marked this pull request as draft September 21, 2023 02:36
@jakobbotsch

jakobbotsch commented Sep 21, 2023

Copy link
Copy Markdown
Member

We need to keep the cast operation for int -> short, otherwise we will get an incorrect result which is what #92349 was telling us.

I tried to see if there was something we could do in codegen, but it is a lot easier to handle in morph where we get rid of these CASTs. The simplest thing to do is check to see if we have a SIMD scalar operation and we are storing the result for a small type, then do not remove the CAST.

We should fix this in the backend. STOREIND<ushort> should never be storing more than two bytes. With this PR the bug still exists, it's just harder to expose (but can definitely be done, e.g. you can write IL manually that doesn't create these casts in the first place).

It looks like a bug in ContainCheckStoreIndir. This line:

isContainable = varTypeIsIntegral(simdBaseType);

should be

isContainable = varTypeIsIntegral(simdBaseType) && (genTypeSize(src) == genTypeSize(node));

if vmovd has no 8/16 bit forms.

@TIHan

Copy link
Copy Markdown
ContributorAuthor

We should fix this in the backend

Your fix works and is a lot simpler than what I had. Thank you.

@TIHanTIHan changed the title JIT: Do not remove CAST on SIMD scalar operations for storesJIT: Fixed containment of STOREIND of HW intrinsics ConvertTo*Sep 21, 2023

@jakobbotschjakobbotsch left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Add a test?

@TIHan
TIHan marked this pull request as ready for review September 21, 2023 20:03
@TIHan

Copy link
Copy Markdown
ContributorAuthor

@dotnet/jit-contrib @jakobbotsch@tannergooding This is ready, pending CI.

@TIHan
TIHan merged commit 8c09075 into dotnet:mainSep 23, 2023
@TIHan

Copy link
Copy Markdown
ContributorAuthor

/backport to release/8.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/8.0: https://github.com/dotnet/runtime/actions/runs/6280549647

@ghostghost locked as resolved and limited conversation to collaborators Oct 23, 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.

Incorrect value after truncating cast

3 participants

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

JIT: Fixed containment of STOREIND of HW intrinsics ConvertTo* - #92396

Merged
TIHan merged 9 commits into
dotnet:mainfrom
TIHan:simd-scalar-cast-fix
Sep 23, 2023
Merged

JIT: Fixed containment of STOREIND of HW intrinsics ConvertTo*#92396
TIHan merged 9 commits into
dotnet:mainfrom
TIHan:simd-scalar-cast-fix

Conversation

@TIHan

@TIHanTIHan commented Sep 21, 2023

Copy link
Copy Markdown
Contributor

Resolves#92349 regarding the truncating CAST

Description

As an example, the HW Intrinsic SIMD scalar ConvertToInt32 will emit a vmovd instruction. This instruction can store a scalar value in memory or in a register, but only for 32 and 64 bits.

So, when we have something like this:

// pValue is a 'ushort*'*pValue=(ushort)(uint)Sse2.ConvertToInt32(newMinZ16);

Acceptance Criteria

  • Add test case

Note

We need to backport this to .NET 8.

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

Copy link
Copy Markdown
ContributorAuthor

cc @tannergooding

@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

Resolves #92349 regarding the truncating CAST

Description

As an example, the HW Intrinsic SIMD scalar ConvertToInt32 will emit a vmovd instruction. This instruction can store a scalar value in memory or in a register, but only for 32 and 64 bits.

So, when we have something like this:

// pValue is a 'ushort*'*pValue=(ushort)(uint)Sse2.ConvertToInt32(newMinZ16);

We need to keep the cast operation for int -> short, otherwise we will get an incorrect result which is what #92349 was telling us.

I tried to see if there was something we could do in codegen, but it is a lot easier to handle in morph where we get rid of these CASTs. The simplest thing to do is check to see if we have a SIMD scalar operation, and if we do, do not remove the CAST.

Acceptance Criteria

  • Add test case
Author:TIHan
Assignees:-
Labels:

area-CodeGen-coreclr

Milestone:-

@TIHan
TIHan marked this pull request as draft September 21, 2023 02:36
@jakobbotsch

jakobbotsch commented Sep 21, 2023

Copy link
Copy Markdown
Member

We need to keep the cast operation for int -> short, otherwise we will get an incorrect result which is what #92349 was telling us.

I tried to see if there was something we could do in codegen, but it is a lot easier to handle in morph where we get rid of these CASTs. The simplest thing to do is check to see if we have a SIMD scalar operation and we are storing the result for a small type, then do not remove the CAST.

We should fix this in the backend. STOREIND<ushort> should never be storing more than two bytes. With this PR the bug still exists, it's just harder to expose (but can definitely be done, e.g. you can write IL manually that doesn't create these casts in the first place).

It looks like a bug in ContainCheckStoreIndir. This line:

isContainable = varTypeIsIntegral(simdBaseType);

should be

isContainable = varTypeIsIntegral(simdBaseType) && (genTypeSize(src) == genTypeSize(node));

if vmovd has no 8/16 bit forms.

@TIHan

Copy link
Copy Markdown
ContributorAuthor

We should fix this in the backend

Your fix works and is a lot simpler than what I had. Thank you.

@TIHanTIHan changed the title JIT: Do not remove CAST on SIMD scalar operations for storesJIT: Fixed containment of STOREIND of HW intrinsics ConvertTo*Sep 21, 2023

@jakobbotschjakobbotsch left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Add a test?

@TIHan
TIHan marked this pull request as ready for review September 21, 2023 20:03
@TIHan

Copy link
Copy Markdown
ContributorAuthor

@dotnet/jit-contrib @jakobbotsch@tannergooding This is ready, pending CI.

@TIHan
TIHan merged commit 8c09075 into dotnet:mainSep 23, 2023
@TIHan

Copy link
Copy Markdown
ContributorAuthor

/backport to release/8.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/8.0: https://github.com/dotnet/runtime/actions/runs/6280549647

@ghostghost locked as resolved and limited conversation to collaborators Oct 23, 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.

Incorrect value after truncating cast

3 participants

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

JIT: Fixed containment of STOREIND of HW intrinsics ConvertTo* - #92396

Merged
TIHan merged 9 commits into
dotnet:mainfrom
TIHan:simd-scalar-cast-fix
Sep 23, 2023
Merged

JIT: Fixed containment of STOREIND of HW intrinsics ConvertTo*#92396
TIHan merged 9 commits into
dotnet:mainfrom
TIHan:simd-scalar-cast-fix

Conversation

@TIHan

@TIHanTIHan commented Sep 21, 2023

Copy link
Copy Markdown
Contributor

Resolves#92349 regarding the truncating CAST

Description

As an example, the HW Intrinsic SIMD scalar ConvertToInt32 will emit a vmovd instruction. This instruction can store a scalar value in memory or in a register, but only for 32 and 64 bits.

So, when we have something like this:

// pValue is a 'ushort*'*pValue=(ushort)(uint)Sse2.ConvertToInt32(newMinZ16);

Acceptance Criteria

  • Add test case

Note

We need to backport this to .NET 8.

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

Copy link
Copy Markdown
ContributorAuthor

cc @tannergooding

@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

Resolves #92349 regarding the truncating CAST

Description

As an example, the HW Intrinsic SIMD scalar ConvertToInt32 will emit a vmovd instruction. This instruction can store a scalar value in memory or in a register, but only for 32 and 64 bits.

So, when we have something like this:

// pValue is a 'ushort*'*pValue=(ushort)(uint)Sse2.ConvertToInt32(newMinZ16);

We need to keep the cast operation for int -> short, otherwise we will get an incorrect result which is what #92349 was telling us.

I tried to see if there was something we could do in codegen, but it is a lot easier to handle in morph where we get rid of these CASTs. The simplest thing to do is check to see if we have a SIMD scalar operation, and if we do, do not remove the CAST.

Acceptance Criteria

  • Add test case
Author:TIHan
Assignees:-
Labels:

area-CodeGen-coreclr

Milestone:-

@TIHan
TIHan marked this pull request as draft September 21, 2023 02:36
@jakobbotsch

jakobbotsch commented Sep 21, 2023

Copy link
Copy Markdown
Member

We need to keep the cast operation for int -> short, otherwise we will get an incorrect result which is what #92349 was telling us.

I tried to see if there was something we could do in codegen, but it is a lot easier to handle in morph where we get rid of these CASTs. The simplest thing to do is check to see if we have a SIMD scalar operation and we are storing the result for a small type, then do not remove the CAST.

We should fix this in the backend. STOREIND<ushort> should never be storing more than two bytes. With this PR the bug still exists, it's just harder to expose (but can definitely be done, e.g. you can write IL manually that doesn't create these casts in the first place).

It looks like a bug in ContainCheckStoreIndir. This line:

isContainable = varTypeIsIntegral(simdBaseType);

should be

isContainable = varTypeIsIntegral(simdBaseType) && (genTypeSize(src) == genTypeSize(node));

if vmovd has no 8/16 bit forms.

@TIHan

Copy link
Copy Markdown
ContributorAuthor

We should fix this in the backend

Your fix works and is a lot simpler than what I had. Thank you.

@TIHanTIHan changed the title JIT: Do not remove CAST on SIMD scalar operations for storesJIT: Fixed containment of STOREIND of HW intrinsics ConvertTo*Sep 21, 2023

@jakobbotschjakobbotsch left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Add a test?

@TIHan
TIHan marked this pull request as ready for review September 21, 2023 20:03
@TIHan

Copy link
Copy Markdown
ContributorAuthor

@dotnet/jit-contrib @jakobbotsch@tannergooding This is ready, pending CI.

@TIHan
TIHan merged commit 8c09075 into dotnet:mainSep 23, 2023
@TIHan

Copy link
Copy Markdown
ContributorAuthor

/backport to release/8.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/8.0: https://github.com/dotnet/runtime/actions/runs/6280549647

@ghostghost locked as resolved and limited conversation to collaborators Oct 23, 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.

Incorrect value after truncating cast

3 participants

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

JIT: Fixed containment of STOREIND of HW intrinsics ConvertTo* - #92396

Merged
TIHan merged 9 commits into
dotnet:mainfrom
TIHan:simd-scalar-cast-fix
Sep 23, 2023
Merged

JIT: Fixed containment of STOREIND of HW intrinsics ConvertTo*#92396
TIHan merged 9 commits into
dotnet:mainfrom
TIHan:simd-scalar-cast-fix

Conversation

@TIHan

@TIHanTIHan commented Sep 21, 2023

Copy link
Copy Markdown
Contributor

Resolves#92349 regarding the truncating CAST

Description

As an example, the HW Intrinsic SIMD scalar ConvertToInt32 will emit a vmovd instruction. This instruction can store a scalar value in memory or in a register, but only for 32 and 64 bits.

So, when we have something like this:

// pValue is a 'ushort*'*pValue=(ushort)(uint)Sse2.ConvertToInt32(newMinZ16);

Acceptance Criteria

  • Add test case

Note

We need to backport this to .NET 8.

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

Copy link
Copy Markdown
ContributorAuthor

cc @tannergooding

@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

Resolves #92349 regarding the truncating CAST

Description

As an example, the HW Intrinsic SIMD scalar ConvertToInt32 will emit a vmovd instruction. This instruction can store a scalar value in memory or in a register, but only for 32 and 64 bits.

So, when we have something like this:

// pValue is a 'ushort*'*pValue=(ushort)(uint)Sse2.ConvertToInt32(newMinZ16);

We need to keep the cast operation for int -> short, otherwise we will get an incorrect result which is what #92349 was telling us.

I tried to see if there was something we could do in codegen, but it is a lot easier to handle in morph where we get rid of these CASTs. The simplest thing to do is check to see if we have a SIMD scalar operation, and if we do, do not remove the CAST.

Acceptance Criteria

  • Add test case
Author:TIHan
Assignees:-
Labels:

area-CodeGen-coreclr

Milestone:-

@TIHan
TIHan marked this pull request as draft September 21, 2023 02:36
@jakobbotsch

jakobbotsch commented Sep 21, 2023

Copy link
Copy Markdown
Member

We need to keep the cast operation for int -> short, otherwise we will get an incorrect result which is what #92349 was telling us.

I tried to see if there was something we could do in codegen, but it is a lot easier to handle in morph where we get rid of these CASTs. The simplest thing to do is check to see if we have a SIMD scalar operation and we are storing the result for a small type, then do not remove the CAST.

We should fix this in the backend. STOREIND<ushort> should never be storing more than two bytes. With this PR the bug still exists, it's just harder to expose (but can definitely be done, e.g. you can write IL manually that doesn't create these casts in the first place).

It looks like a bug in ContainCheckStoreIndir. This line:

isContainable = varTypeIsIntegral(simdBaseType);

should be

isContainable = varTypeIsIntegral(simdBaseType) && (genTypeSize(src) == genTypeSize(node));

if vmovd has no 8/16 bit forms.

@TIHan

Copy link
Copy Markdown
ContributorAuthor

We should fix this in the backend

Your fix works and is a lot simpler than what I had. Thank you.

@TIHanTIHan changed the title JIT: Do not remove CAST on SIMD scalar operations for storesJIT: Fixed containment of STOREIND of HW intrinsics ConvertTo*Sep 21, 2023

@jakobbotschjakobbotsch left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Add a test?

@TIHan
TIHan marked this pull request as ready for review September 21, 2023 20:03
@TIHan

Copy link
Copy Markdown
ContributorAuthor

@dotnet/jit-contrib @jakobbotsch@tannergooding This is ready, pending CI.

@TIHan
TIHan merged commit 8c09075 into dotnet:mainSep 23, 2023
@TIHan

Copy link
Copy Markdown
ContributorAuthor

/backport to release/8.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/8.0: https://github.com/dotnet/runtime/actions/runs/6280549647

@ghostghost locked as resolved and limited conversation to collaborators Oct 23, 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.

Incorrect value after truncating cast

3 participants

@TIHan@jakobbotsch@tannergooding
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); JIT: Fixed containment of STOREIND of HW intrinsics ConvertTo* by TIHan · Pull Request #92396 · dotnet/runtime · GitHub
Skip to content

JIT: Fixed containment of STOREIND of HW intrinsics ConvertTo* - #92396

Merged
TIHan merged 9 commits into
dotnet:mainfrom
TIHan:simd-scalar-cast-fix
Sep 23, 2023
Merged

JIT: Fixed containment of STOREIND of HW intrinsics ConvertTo*#92396
TIHan merged 9 commits into
dotnet:mainfrom
TIHan:simd-scalar-cast-fix

Conversation

@TIHan

@TIHanTIHan commented Sep 21, 2023

Copy link
Copy Markdown
Contributor

Resolves#92349 regarding the truncating CAST

Description

As an example, the HW Intrinsic SIMD scalar ConvertToInt32 will emit a vmovd instruction. This instruction can store a scalar value in memory or in a register, but only for 32 and 64 bits.

So, when we have something like this:

// pValue is a 'ushort*'*pValue=(ushort)(uint)Sse2.ConvertToInt32(newMinZ16);

Acceptance Criteria

  • Add test case

Note

We need to backport this to .NET 8.

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

Copy link
Copy Markdown
ContributorAuthor

cc @tannergooding

@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

Resolves #92349 regarding the truncating CAST

Description

As an example, the HW Intrinsic SIMD scalar ConvertToInt32 will emit a vmovd instruction. This instruction can store a scalar value in memory or in a register, but only for 32 and 64 bits.

So, when we have something like this:

// pValue is a 'ushort*'*pValue=(ushort)(uint)Sse2.ConvertToInt32(newMinZ16);

We need to keep the cast operation for int -> short, otherwise we will get an incorrect result which is what #92349 was telling us.

I tried to see if there was something we could do in codegen, but it is a lot easier to handle in morph where we get rid of these CASTs. The simplest thing to do is check to see if we have a SIMD scalar operation, and if we do, do not remove the CAST.

Acceptance Criteria

  • Add test case
Author:TIHan
Assignees:-
Labels:

area-CodeGen-coreclr

Milestone:-

@TIHan
TIHan marked this pull request as draft September 21, 2023 02:36
@jakobbotsch

jakobbotsch commented Sep 21, 2023

Copy link
Copy Markdown
Member

We need to keep the cast operation for int -> short, otherwise we will get an incorrect result which is what #92349 was telling us.

I tried to see if there was something we could do in codegen, but it is a lot easier to handle in morph where we get rid of these CASTs. The simplest thing to do is check to see if we have a SIMD scalar operation and we are storing the result for a small type, then do not remove the CAST.

We should fix this in the backend. STOREIND<ushort> should never be storing more than two bytes. With this PR the bug still exists, it's just harder to expose (but can definitely be done, e.g. you can write IL manually that doesn't create these casts in the first place).

It looks like a bug in ContainCheckStoreIndir. This line:

isContainable = varTypeIsIntegral(simdBaseType);

should be

isContainable = varTypeIsIntegral(simdBaseType) && (genTypeSize(src) == genTypeSize(node));

if vmovd has no 8/16 bit forms.

@TIHan

Copy link
Copy Markdown
ContributorAuthor

We should fix this in the backend

Your fix works and is a lot simpler than what I had. Thank you.

@TIHanTIHan changed the title JIT: Do not remove CAST on SIMD scalar operations for storesJIT: Fixed containment of STOREIND of HW intrinsics ConvertTo*Sep 21, 2023

@jakobbotschjakobbotsch left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Add a test?

@TIHan
TIHan marked this pull request as ready for review September 21, 2023 20:03
@TIHan

Copy link
Copy Markdown
ContributorAuthor

@dotnet/jit-contrib @jakobbotsch@tannergooding This is ready, pending CI.

@TIHan
TIHan merged commit 8c09075 into dotnet:mainSep 23, 2023
@TIHan

Copy link
Copy Markdown
ContributorAuthor

/backport to release/8.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/8.0: https://github.com/dotnet/runtime/actions/runs/6280549647

@ghostghost locked as resolved and limited conversation to collaborators Oct 23, 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.

Incorrect value after truncating cast

3 participants

@TIHan@jakobbotsch@tannergooding