Fix contained LCL_VAR_ADDR in RMW. - #50669

Merged
sandreenko merged 3 commits into
dotnet:mainfrom
sandreenko:fixIsContainedAssert
Apr 8, 2021
Merged

Fix contained LCL_VAR_ADDR in RMW.#50669
sandreenko merged 3 commits into
dotnet:mainfrom
sandreenko:fixIsContainedAssert

Conversation

@sandreenko

Copy link
Copy Markdown
Contributor

Call emitIns_S_I (stack immediate) to generate instruction like:

Generating: N008 ( 1, 1) [000005] -c---------- t5 = CNS_INT long 123 REG NA $200
/--* t4 long
+--* t5 long
Generating: N010 ( 8, 9) [000006] -c--G------- t6 = * ADD long REG NA <l:$241, c:$240>
Generating: N012 ( 3, 4) [000000] Uc-----N---- t0 = LCL_VAR_ADDR byref V00 arg0 NA REG NA
/--* t0 byref
+--* t6 long
Generating: N014 (???,???) [000012] -A--G------- * STOREIND long REG NA
IN0001: 000009 add qword ptr [rsp+08H], 123

Questions that I had:

  1. should not it be fixed in emitHandleMemOp?
    no, because emitHandleMemOp already has an instruction descriptor and it is wrong for this situation because it expects A meaning dereference Address in a register. We could change the fmt inside like we do for:
    // fmt - the instruction format to use. This must be one of the ARD, AWR, or ARW formats. If necessary (such as for
    // GT_CLS_VAR_ADDR), this function will map it to the correct format.

    but it would require a copy-paste of emitIns_S_I into this function.
    Another argument is that we already treat LCL_VAR_ADDR/LCL_FLD_ADDR differently, to show such cases I have changed OperIs(GT_LCL_VAR_ADDR, GT_LCL_FLD_ADDR) to OperIsLocalAddr().

A better long-term solution would be to rewrite emitHandleMemOp to create id but we don't have time for it now.

  1. Do we need to call genUpdateLife for the local?
    It appears not to be necessary because the variable liveness does not change there so we can skip it.
    However, we can do this, as you see 000000 is marked VAR_USEASG so call to genUpdateLife(storeInd) will give us the correct result, UpdateLifeVar just won't do anything with it. I could still add these calls if I hear an opinion that it will be less confusing.

  2. Have I caught all places that need this fix?
    I checked all calls to emitHandleMemOp and found 1 more place that was fixed in this PR, others already have it or don't work with contained LCL_VAR_ADDR.

Fixes#41073 and #49880.

No spmi-diffs.

@sandreenkosandreenko added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Apr 3, 2021
@sandreenko

Copy link
Copy Markdown
ContributorAuthor

PTAL @BruceForstall @dotnet/jit-contrib

@sandreenkosandreenko linked an issue Apr 3, 2021 that may be closed by this pull request
@sandreenkosandreenko reopened this Apr 3, 2021
@sandreenko
sandreenko merged commit a06eccb into dotnet:mainApr 8, 2021
@JulieLeeMSFTJulieLeeMSFT added this to the 6.0.0 milestone Apr 15, 2021
@sandreenkosandreenko mentioned this pull request May 10, 2021
10 tasks
@ghostghost locked as resolved and limited conversation to collaborators May 15, 2021
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 '!memBase->isContained()' contained LCL_VAR_ADDR is generated wrong in RMW.

3 participants

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

Fix contained LCL_VAR_ADDR in RMW. - #50669

Merged
sandreenko merged 3 commits into
dotnet:mainfrom
sandreenko:fixIsContainedAssert
Apr 8, 2021
Merged

Fix contained LCL_VAR_ADDR in RMW.#50669
sandreenko merged 3 commits into
dotnet:mainfrom
sandreenko:fixIsContainedAssert

Conversation

@sandreenko

Copy link
Copy Markdown
Contributor

Call emitIns_S_I (stack immediate) to generate instruction like:

Generating: N008 ( 1, 1) [000005] -c---------- t5 = CNS_INT long 123 REG NA $200
/--* t4 long
+--* t5 long
Generating: N010 ( 8, 9) [000006] -c--G------- t6 = * ADD long REG NA <l:$241, c:$240>
Generating: N012 ( 3, 4) [000000] Uc-----N---- t0 = LCL_VAR_ADDR byref V00 arg0 NA REG NA
/--* t0 byref
+--* t6 long
Generating: N014 (???,???) [000012] -A--G------- * STOREIND long REG NA
IN0001: 000009 add qword ptr [rsp+08H], 123

Questions that I had:

  1. should not it be fixed in emitHandleMemOp?
    no, because emitHandleMemOp already has an instruction descriptor and it is wrong for this situation because it expects A meaning dereference Address in a register. We could change the fmt inside like we do for:
    // fmt - the instruction format to use. This must be one of the ARD, AWR, or ARW formats. If necessary (such as for
    // GT_CLS_VAR_ADDR), this function will map it to the correct format.

    but it would require a copy-paste of emitIns_S_I into this function.
    Another argument is that we already treat LCL_VAR_ADDR/LCL_FLD_ADDR differently, to show such cases I have changed OperIs(GT_LCL_VAR_ADDR, GT_LCL_FLD_ADDR) to OperIsLocalAddr().

A better long-term solution would be to rewrite emitHandleMemOp to create id but we don't have time for it now.

  1. Do we need to call genUpdateLife for the local?
    It appears not to be necessary because the variable liveness does not change there so we can skip it.
    However, we can do this, as you see 000000 is marked VAR_USEASG so call to genUpdateLife(storeInd) will give us the correct result, UpdateLifeVar just won't do anything with it. I could still add these calls if I hear an opinion that it will be less confusing.

  2. Have I caught all places that need this fix?
    I checked all calls to emitHandleMemOp and found 1 more place that was fixed in this PR, others already have it or don't work with contained LCL_VAR_ADDR.

Fixes#41073 and #49880.

No spmi-diffs.

@sandreenkosandreenko added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Apr 3, 2021
@sandreenko

Copy link
Copy Markdown
ContributorAuthor

PTAL @BruceForstall @dotnet/jit-contrib

@sandreenkosandreenko linked an issue Apr 3, 2021 that may be closed by this pull request
@sandreenkosandreenko reopened this Apr 3, 2021
@sandreenko
sandreenko merged commit a06eccb into dotnet:mainApr 8, 2021
@JulieLeeMSFTJulieLeeMSFT added this to the 6.0.0 milestone Apr 15, 2021
@sandreenkosandreenko mentioned this pull request May 10, 2021
10 tasks
@ghostghost locked as resolved and limited conversation to collaborators May 15, 2021
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 '!memBase->isContained()' contained LCL_VAR_ADDR is generated wrong in RMW.

3 participants

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

Fix contained LCL_VAR_ADDR in RMW. - #50669

Merged
sandreenko merged 3 commits into
dotnet:mainfrom
sandreenko:fixIsContainedAssert
Apr 8, 2021
Merged

Fix contained LCL_VAR_ADDR in RMW.#50669
sandreenko merged 3 commits into
dotnet:mainfrom
sandreenko:fixIsContainedAssert

Conversation

@sandreenko

Copy link
Copy Markdown
Contributor

Call emitIns_S_I (stack immediate) to generate instruction like:

Generating: N008 ( 1, 1) [000005] -c---------- t5 = CNS_INT long 123 REG NA $200
/--* t4 long
+--* t5 long
Generating: N010 ( 8, 9) [000006] -c--G------- t6 = * ADD long REG NA <l:$241, c:$240>
Generating: N012 ( 3, 4) [000000] Uc-----N---- t0 = LCL_VAR_ADDR byref V00 arg0 NA REG NA
/--* t0 byref
+--* t6 long
Generating: N014 (???,???) [000012] -A--G------- * STOREIND long REG NA
IN0001: 000009 add qword ptr [rsp+08H], 123

Questions that I had:

  1. should not it be fixed in emitHandleMemOp?
    no, because emitHandleMemOp already has an instruction descriptor and it is wrong for this situation because it expects A meaning dereference Address in a register. We could change the fmt inside like we do for:
    // fmt - the instruction format to use. This must be one of the ARD, AWR, or ARW formats. If necessary (such as for
    // GT_CLS_VAR_ADDR), this function will map it to the correct format.

    but it would require a copy-paste of emitIns_S_I into this function.
    Another argument is that we already treat LCL_VAR_ADDR/LCL_FLD_ADDR differently, to show such cases I have changed OperIs(GT_LCL_VAR_ADDR, GT_LCL_FLD_ADDR) to OperIsLocalAddr().

A better long-term solution would be to rewrite emitHandleMemOp to create id but we don't have time for it now.

  1. Do we need to call genUpdateLife for the local?
    It appears not to be necessary because the variable liveness does not change there so we can skip it.
    However, we can do this, as you see 000000 is marked VAR_USEASG so call to genUpdateLife(storeInd) will give us the correct result, UpdateLifeVar just won't do anything with it. I could still add these calls if I hear an opinion that it will be less confusing.

  2. Have I caught all places that need this fix?
    I checked all calls to emitHandleMemOp and found 1 more place that was fixed in this PR, others already have it or don't work with contained LCL_VAR_ADDR.

Fixes#41073 and #49880.

No spmi-diffs.

@sandreenkosandreenko added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Apr 3, 2021
@sandreenko

Copy link
Copy Markdown
ContributorAuthor

PTAL @BruceForstall @dotnet/jit-contrib

@sandreenkosandreenko linked an issue Apr 3, 2021 that may be closed by this pull request
@sandreenkosandreenko reopened this Apr 3, 2021
@sandreenko
sandreenko merged commit a06eccb into dotnet:mainApr 8, 2021
@JulieLeeMSFTJulieLeeMSFT added this to the 6.0.0 milestone Apr 15, 2021
@sandreenkosandreenko mentioned this pull request May 10, 2021
10 tasks
@ghostghost locked as resolved and limited conversation to collaborators May 15, 2021
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 '!memBase->isContained()' contained LCL_VAR_ADDR is generated wrong in RMW.

3 participants

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

Fix contained LCL_VAR_ADDR in RMW. - #50669

Merged
sandreenko merged 3 commits into
dotnet:mainfrom
sandreenko:fixIsContainedAssert
Apr 8, 2021
Merged

Fix contained LCL_VAR_ADDR in RMW.#50669
sandreenko merged 3 commits into
dotnet:mainfrom
sandreenko:fixIsContainedAssert

Conversation

@sandreenko

Copy link
Copy Markdown
Contributor

Call emitIns_S_I (stack immediate) to generate instruction like:

Generating: N008 ( 1, 1) [000005] -c---------- t5 = CNS_INT long 123 REG NA $200
/--* t4 long
+--* t5 long
Generating: N010 ( 8, 9) [000006] -c--G------- t6 = * ADD long REG NA <l:$241, c:$240>
Generating: N012 ( 3, 4) [000000] Uc-----N---- t0 = LCL_VAR_ADDR byref V00 arg0 NA REG NA
/--* t0 byref
+--* t6 long
Generating: N014 (???,???) [000012] -A--G------- * STOREIND long REG NA
IN0001: 000009 add qword ptr [rsp+08H], 123

Questions that I had:

  1. should not it be fixed in emitHandleMemOp?
    no, because emitHandleMemOp already has an instruction descriptor and it is wrong for this situation because it expects A meaning dereference Address in a register. We could change the fmt inside like we do for:
    // fmt - the instruction format to use. This must be one of the ARD, AWR, or ARW formats. If necessary (such as for
    // GT_CLS_VAR_ADDR), this function will map it to the correct format.

    but it would require a copy-paste of emitIns_S_I into this function.
    Another argument is that we already treat LCL_VAR_ADDR/LCL_FLD_ADDR differently, to show such cases I have changed OperIs(GT_LCL_VAR_ADDR, GT_LCL_FLD_ADDR) to OperIsLocalAddr().

A better long-term solution would be to rewrite emitHandleMemOp to create id but we don't have time for it now.

  1. Do we need to call genUpdateLife for the local?
    It appears not to be necessary because the variable liveness does not change there so we can skip it.
    However, we can do this, as you see 000000 is marked VAR_USEASG so call to genUpdateLife(storeInd) will give us the correct result, UpdateLifeVar just won't do anything with it. I could still add these calls if I hear an opinion that it will be less confusing.

  2. Have I caught all places that need this fix?
    I checked all calls to emitHandleMemOp and found 1 more place that was fixed in this PR, others already have it or don't work with contained LCL_VAR_ADDR.

Fixes#41073 and #49880.

No spmi-diffs.

@sandreenkosandreenko added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Apr 3, 2021
@sandreenko

Copy link
Copy Markdown
ContributorAuthor

PTAL @BruceForstall @dotnet/jit-contrib

@sandreenkosandreenko linked an issue Apr 3, 2021 that may be closed by this pull request
@sandreenkosandreenko reopened this Apr 3, 2021
@sandreenko
sandreenko merged commit a06eccb into dotnet:mainApr 8, 2021
@JulieLeeMSFTJulieLeeMSFT added this to the 6.0.0 milestone Apr 15, 2021
@sandreenkosandreenko mentioned this pull request May 10, 2021
10 tasks
@ghostghost locked as resolved and limited conversation to collaborators May 15, 2021
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 '!memBase->isContained()' contained LCL_VAR_ADDR is generated wrong in RMW.

3 participants

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

Fix contained LCL_VAR_ADDR in RMW. - #50669

Merged
sandreenko merged 3 commits into
dotnet:mainfrom
sandreenko:fixIsContainedAssert
Apr 8, 2021
Merged

Fix contained LCL_VAR_ADDR in RMW.#50669
sandreenko merged 3 commits into
dotnet:mainfrom
sandreenko:fixIsContainedAssert

Conversation

@sandreenko

Copy link
Copy Markdown
Contributor

Call emitIns_S_I (stack immediate) to generate instruction like:

Generating: N008 ( 1, 1) [000005] -c---------- t5 = CNS_INT long 123 REG NA $200
/--* t4 long
+--* t5 long
Generating: N010 ( 8, 9) [000006] -c--G------- t6 = * ADD long REG NA <l:$241, c:$240>
Generating: N012 ( 3, 4) [000000] Uc-----N---- t0 = LCL_VAR_ADDR byref V00 arg0 NA REG NA
/--* t0 byref
+--* t6 long
Generating: N014 (???,???) [000012] -A--G------- * STOREIND long REG NA
IN0001: 000009 add qword ptr [rsp+08H], 123

Questions that I had:

  1. should not it be fixed in emitHandleMemOp?
    no, because emitHandleMemOp already has an instruction descriptor and it is wrong for this situation because it expects A meaning dereference Address in a register. We could change the fmt inside like we do for:
    // fmt - the instruction format to use. This must be one of the ARD, AWR, or ARW formats. If necessary (such as for
    // GT_CLS_VAR_ADDR), this function will map it to the correct format.

    but it would require a copy-paste of emitIns_S_I into this function.
    Another argument is that we already treat LCL_VAR_ADDR/LCL_FLD_ADDR differently, to show such cases I have changed OperIs(GT_LCL_VAR_ADDR, GT_LCL_FLD_ADDR) to OperIsLocalAddr().

A better long-term solution would be to rewrite emitHandleMemOp to create id but we don't have time for it now.

  1. Do we need to call genUpdateLife for the local?
    It appears not to be necessary because the variable liveness does not change there so we can skip it.
    However, we can do this, as you see 000000 is marked VAR_USEASG so call to genUpdateLife(storeInd) will give us the correct result, UpdateLifeVar just won't do anything with it. I could still add these calls if I hear an opinion that it will be less confusing.

  2. Have I caught all places that need this fix?
    I checked all calls to emitHandleMemOp and found 1 more place that was fixed in this PR, others already have it or don't work with contained LCL_VAR_ADDR.

Fixes#41073 and #49880.

No spmi-diffs.

@sandreenkosandreenko added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Apr 3, 2021
@sandreenko

Copy link
Copy Markdown
ContributorAuthor

PTAL @BruceForstall @dotnet/jit-contrib

@sandreenkosandreenko linked an issue Apr 3, 2021 that may be closed by this pull request
@sandreenkosandreenko reopened this Apr 3, 2021
@sandreenko
sandreenko merged commit a06eccb into dotnet:mainApr 8, 2021
@JulieLeeMSFTJulieLeeMSFT added this to the 6.0.0 milestone Apr 15, 2021
@sandreenkosandreenko mentioned this pull request May 10, 2021
10 tasks
@ghostghost locked as resolved and limited conversation to collaborators May 15, 2021
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 '!memBase->isContained()' contained LCL_VAR_ADDR is generated wrong in RMW.

3 participants

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

Fix contained LCL_VAR_ADDR in RMW. - #50669

Merged
sandreenko merged 3 commits into
dotnet:mainfrom
sandreenko:fixIsContainedAssert
Apr 8, 2021
Merged

Fix contained LCL_VAR_ADDR in RMW.#50669
sandreenko merged 3 commits into
dotnet:mainfrom
sandreenko:fixIsContainedAssert

Conversation

@sandreenko

Copy link
Copy Markdown
Contributor

Call emitIns_S_I (stack immediate) to generate instruction like:

Generating: N008 ( 1, 1) [000005] -c---------- t5 = CNS_INT long 123 REG NA $200
/--* t4 long
+--* t5 long
Generating: N010 ( 8, 9) [000006] -c--G------- t6 = * ADD long REG NA <l:$241, c:$240>
Generating: N012 ( 3, 4) [000000] Uc-----N---- t0 = LCL_VAR_ADDR byref V00 arg0 NA REG NA
/--* t0 byref
+--* t6 long
Generating: N014 (???,???) [000012] -A--G------- * STOREIND long REG NA
IN0001: 000009 add qword ptr [rsp+08H], 123

Questions that I had:

  1. should not it be fixed in emitHandleMemOp?
    no, because emitHandleMemOp already has an instruction descriptor and it is wrong for this situation because it expects A meaning dereference Address in a register. We could change the fmt inside like we do for:
    // fmt - the instruction format to use. This must be one of the ARD, AWR, or ARW formats. If necessary (such as for
    // GT_CLS_VAR_ADDR), this function will map it to the correct format.

    but it would require a copy-paste of emitIns_S_I into this function.
    Another argument is that we already treat LCL_VAR_ADDR/LCL_FLD_ADDR differently, to show such cases I have changed OperIs(GT_LCL_VAR_ADDR, GT_LCL_FLD_ADDR) to OperIsLocalAddr().

A better long-term solution would be to rewrite emitHandleMemOp to create id but we don't have time for it now.

  1. Do we need to call genUpdateLife for the local?
    It appears not to be necessary because the variable liveness does not change there so we can skip it.
    However, we can do this, as you see 000000 is marked VAR_USEASG so call to genUpdateLife(storeInd) will give us the correct result, UpdateLifeVar just won't do anything with it. I could still add these calls if I hear an opinion that it will be less confusing.

  2. Have I caught all places that need this fix?
    I checked all calls to emitHandleMemOp and found 1 more place that was fixed in this PR, others already have it or don't work with contained LCL_VAR_ADDR.

Fixes#41073 and #49880.

No spmi-diffs.

@sandreenkosandreenko added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Apr 3, 2021
@sandreenko

Copy link
Copy Markdown
ContributorAuthor

PTAL @BruceForstall @dotnet/jit-contrib

@sandreenkosandreenko linked an issue Apr 3, 2021 that may be closed by this pull request
@sandreenkosandreenko reopened this Apr 3, 2021
@sandreenko
sandreenko merged commit a06eccb into dotnet:mainApr 8, 2021
@JulieLeeMSFTJulieLeeMSFT added this to the 6.0.0 milestone Apr 15, 2021
@sandreenkosandreenko mentioned this pull request May 10, 2021
10 tasks
@ghostghost locked as resolved and limited conversation to collaborators May 15, 2021
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 '!memBase->isContained()' contained LCL_VAR_ADDR is generated wrong in RMW.

3 participants

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

Fix contained LCL_VAR_ADDR in RMW. - #50669

Merged
sandreenko merged 3 commits into
dotnet:mainfrom
sandreenko:fixIsContainedAssert
Apr 8, 2021
Merged

Fix contained LCL_VAR_ADDR in RMW.#50669
sandreenko merged 3 commits into
dotnet:mainfrom
sandreenko:fixIsContainedAssert

Conversation

@sandreenko

Copy link
Copy Markdown
Contributor

Call emitIns_S_I (stack immediate) to generate instruction like:

Generating: N008 ( 1, 1) [000005] -c---------- t5 = CNS_INT long 123 REG NA $200
/--* t4 long
+--* t5 long
Generating: N010 ( 8, 9) [000006] -c--G------- t6 = * ADD long REG NA <l:$241, c:$240>
Generating: N012 ( 3, 4) [000000] Uc-----N---- t0 = LCL_VAR_ADDR byref V00 arg0 NA REG NA
/--* t0 byref
+--* t6 long
Generating: N014 (???,???) [000012] -A--G------- * STOREIND long REG NA
IN0001: 000009 add qword ptr [rsp+08H], 123

Questions that I had:

  1. should not it be fixed in emitHandleMemOp?
    no, because emitHandleMemOp already has an instruction descriptor and it is wrong for this situation because it expects A meaning dereference Address in a register. We could change the fmt inside like we do for:
    // fmt - the instruction format to use. This must be one of the ARD, AWR, or ARW formats. If necessary (such as for
    // GT_CLS_VAR_ADDR), this function will map it to the correct format.

    but it would require a copy-paste of emitIns_S_I into this function.
    Another argument is that we already treat LCL_VAR_ADDR/LCL_FLD_ADDR differently, to show such cases I have changed OperIs(GT_LCL_VAR_ADDR, GT_LCL_FLD_ADDR) to OperIsLocalAddr().

A better long-term solution would be to rewrite emitHandleMemOp to create id but we don't have time for it now.

  1. Do we need to call genUpdateLife for the local?
    It appears not to be necessary because the variable liveness does not change there so we can skip it.
    However, we can do this, as you see 000000 is marked VAR_USEASG so call to genUpdateLife(storeInd) will give us the correct result, UpdateLifeVar just won't do anything with it. I could still add these calls if I hear an opinion that it will be less confusing.

  2. Have I caught all places that need this fix?
    I checked all calls to emitHandleMemOp and found 1 more place that was fixed in this PR, others already have it or don't work with contained LCL_VAR_ADDR.

Fixes#41073 and #49880.

No spmi-diffs.

@sandreenkosandreenko added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Apr 3, 2021
@sandreenko

Copy link
Copy Markdown
ContributorAuthor

PTAL @BruceForstall @dotnet/jit-contrib

@sandreenkosandreenko linked an issue Apr 3, 2021 that may be closed by this pull request
@sandreenkosandreenko reopened this Apr 3, 2021
@sandreenko
sandreenko merged commit a06eccb into dotnet:mainApr 8, 2021
@JulieLeeMSFTJulieLeeMSFT added this to the 6.0.0 milestone Apr 15, 2021
@sandreenkosandreenko mentioned this pull request May 10, 2021
10 tasks
@ghostghost locked as resolved and limited conversation to collaborators May 15, 2021
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 '!memBase->isContained()' contained LCL_VAR_ADDR is generated wrong in RMW.

3 participants

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

Fix contained LCL_VAR_ADDR in RMW. - #50669

Merged
sandreenko merged 3 commits into
dotnet:mainfrom
sandreenko:fixIsContainedAssert
Apr 8, 2021
Merged

Fix contained LCL_VAR_ADDR in RMW.#50669
sandreenko merged 3 commits into
dotnet:mainfrom
sandreenko:fixIsContainedAssert

Conversation

@sandreenko

Copy link
Copy Markdown
Contributor

Call emitIns_S_I (stack immediate) to generate instruction like:

Generating: N008 ( 1, 1) [000005] -c---------- t5 = CNS_INT long 123 REG NA $200
/--* t4 long
+--* t5 long
Generating: N010 ( 8, 9) [000006] -c--G------- t6 = * ADD long REG NA <l:$241, c:$240>
Generating: N012 ( 3, 4) [000000] Uc-----N---- t0 = LCL_VAR_ADDR byref V00 arg0 NA REG NA
/--* t0 byref
+--* t6 long
Generating: N014 (???,???) [000012] -A--G------- * STOREIND long REG NA
IN0001: 000009 add qword ptr [rsp+08H], 123

Questions that I had:

  1. should not it be fixed in emitHandleMemOp?
    no, because emitHandleMemOp already has an instruction descriptor and it is wrong for this situation because it expects A meaning dereference Address in a register. We could change the fmt inside like we do for:
    // fmt - the instruction format to use. This must be one of the ARD, AWR, or ARW formats. If necessary (such as for
    // GT_CLS_VAR_ADDR), this function will map it to the correct format.

    but it would require a copy-paste of emitIns_S_I into this function.
    Another argument is that we already treat LCL_VAR_ADDR/LCL_FLD_ADDR differently, to show such cases I have changed OperIs(GT_LCL_VAR_ADDR, GT_LCL_FLD_ADDR) to OperIsLocalAddr().

A better long-term solution would be to rewrite emitHandleMemOp to create id but we don't have time for it now.

  1. Do we need to call genUpdateLife for the local?
    It appears not to be necessary because the variable liveness does not change there so we can skip it.
    However, we can do this, as you see 000000 is marked VAR_USEASG so call to genUpdateLife(storeInd) will give us the correct result, UpdateLifeVar just won't do anything with it. I could still add these calls if I hear an opinion that it will be less confusing.

  2. Have I caught all places that need this fix?
    I checked all calls to emitHandleMemOp and found 1 more place that was fixed in this PR, others already have it or don't work with contained LCL_VAR_ADDR.

Fixes#41073 and #49880.

No spmi-diffs.

@sandreenkosandreenko added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Apr 3, 2021
@sandreenko

Copy link
Copy Markdown
ContributorAuthor

PTAL @BruceForstall @dotnet/jit-contrib

@sandreenkosandreenko linked an issue Apr 3, 2021 that may be closed by this pull request
@sandreenkosandreenko reopened this Apr 3, 2021
@sandreenko
sandreenko merged commit a06eccb into dotnet:mainApr 8, 2021
@JulieLeeMSFTJulieLeeMSFT added this to the 6.0.0 milestone Apr 15, 2021
@sandreenkosandreenko mentioned this pull request May 10, 2021
10 tasks
@ghostghost locked as resolved and limited conversation to collaborators May 15, 2021
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 '!memBase->isContained()' contained LCL_VAR_ADDR is generated wrong in RMW.

3 participants

@sandreenko@BruceForstall@JulieLeeMSFT