Add hot/cold splitting test job to jit-runtime-experimental - #69922

Merged
amanasifkhalid merged 1 commit into
dotnet:mainfrom
amanasifkhalid:jit-pipeline-tests
Jun 7, 2022
Merged

Add hot/cold splitting test job to jit-runtime-experimental#69922
amanasifkhalid merged 1 commit into
dotnet:mainfrom
amanasifkhalid:jit-pipeline-tests

Conversation

@amanasifkhalid

Copy link
Copy Markdown
Contributor

Adding a new rolling test job to JIT-runtime-experimental can help ensure the new fake- and stress-splitting modes in the JIT do not regress. The proposed test, titled jitosr_stress_splitting, runs a Checked build of the JIT on OS- and platform-specific test suites with the following environment:

  • COMPlus_GCgen0size=1000000
  • COMPlus_JitFakeProcedureSplitting=1
  • COMPlus_JitStressprocedureSplitting=1

This environment forces the JIT to fake-split every method after its first basic block, assuming the method consists of more than one block. COMPlus_GCgen0size=1000000 sets a large memory allocation threshold before the GC runs; recall that COMPlus_JitFakeProcedureSplitting currently doesn't generate unwind information for cold code, thus breaking the GC's stack walks. COMPlus_GCgen0size provides a patchwork fix for this limitation in cases where memory usage is not excessive (i.e. >= 0x1000000 B).

In my local testing, all of the x64 tests in src/tests/ pass with this environment.

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

Copy link
Copy Markdown

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

Issue Details

Adding a new rolling test job to JIT-runtime-experimental can help ensure the new fake- and stress-splitting modes in the JIT do not regress. The proposed test, titled jitosr_stress_splitting, runs a Checked build of the JIT on OS- and platform-specific test suites with the following environment:

  • COMPlus_GCgen0size=1000000
  • COMPlus_JitFakeProcedureSplitting=1
  • COMPlus_JitStressprocedureSplitting=1

This environment forces the JIT to fake-split every method after its first basic block, assuming the method consists of more than one block. COMPlus_GCgen0size=1000000 sets a large memory allocation threshold before the GC runs; recall that COMPlus_JitFakeProcedureSplitting currently doesn't generate unwind information for cold code, thus breaking the GC's stack walks. COMPlus_GCgen0size provides a patchwork fix for this limitation in cases where memory usage is not excessive (i.e. >= 0x1000000 B).

In my local testing, all of the x64 tests in src/tests/ pass with this environment.

Author:amanasifkhalid
Assignees:amanasifkhalid
Labels:

area-CodeGen-coreclr

Milestone:-

@BruceForstall

Copy link
Copy Markdown
Contributor

Looks good. However, this isn't related to OSR, so remove "osr" from the name. Use jit_stress_splitting or jit_stress_procedure_splitting.

@amanasifkhalid
amanasifkhalid marked this pull request as ready for review May 27, 2022 21:45

@BruceForstallBruceForstall left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM.

You should trigger jit-runtime-experimental on this PR to verify.

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@JulieLeeMSFTJulieLeeMSFT added this to the 7.0.0 milestone May 27, 2022
@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

I ran and re-ran runtime-jit-experimental and, like all the other failing checks, it fails to send tests to Helix due to a bad System.AccessToken value. Is the fact that runtime-jit-experimental makes it all the way to the "Send to Helix" step sufficient verification to merge the PR?

@BruceForstall

Copy link
Copy Markdown
Contributor

I ran and re-ran runtime-jit-experimental and, like all the other failing checks, it fails to send tests to Helix due to a bad System.AccessToken value.

You hit #69854, which I believe is now fixed. Try triggering the job again.

Is the fact that runtime-jit-experimental makes it all the way to the "Send to Helix" step sufficient verification to merge the PR?

No -- It's the "Send to Helix" step that actually runs tests, and since it failed, no tests were run.

@BruceForstall

Copy link
Copy Markdown
Contributor

You also hit the "remainingSize == 4" assert which was fixed with #69905

Also, some wasm failures which I don't see issues for, but which are obviously unrelated. You can always try "Re-run" on those.

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

I pulled from main and re-ran runtime-jit-experimental, but it's still failing with 401 responses from Azure DevOps, per #69854 .

@BruceForstall

Copy link
Copy Markdown
Contributor

I pulled from main and re-ran runtime-jit-experimental, but it's still failing with 401 responses from Azure DevOps, per #69854 .

The scheduled run on Sunday did not have those issues (it had other issues, but not those: https://dev.azure.com/dnceng/public/_build/results?buildId=1795838&view=ms.vss-test-web.build-test-results-tab).

My suggestion:

  1. rebase on top of main (don't merge main)
  2. push the updated PR

It shouldn't be necessary, but if that doesn't work, try closing and re-opening the PR, or create an entirely new PR.

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
Contributor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
Contributor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

Fake-splitting currently breaks stack walks by not generating unwind
info for cold code. This commit implements unwind info on x86/64 when
fake-splitting by generating unwind info for the combined hot/cold
section just once, rather than generating unwind info for the separate
sections.
For reasons to be investigated, this implementation does not work when
the code sections are separated by an arbitrary buffer (such as the 4KB
buffer previously used). Thus, the buffer has been removed from the
fake-splitting implementation: Now, the hot and cold sections are
placed contiguously in memory, but the JIT continues to behave as if
they are arbitrarily far away (for example, by using long branches
between sections).
Following this fix, fake-splitting no longer requires the GC to be
suppressed by setting `COMPlus_GCgen0size=1000000`. A test job
has been added to `runtime-jit-experimental` to ensure
fake/stress-splitting does not regress.
@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

I have pushed a commit with a fix for unwind info generation when fake-splitting: When calling eeAllocUnwindInfo, we manually set the start offset to point at the beginning of the hot section, and the end offset to point at the end of the cold section, effectively treating them as a single "hot" section. However, for reasons under investigation, this implementation breaks the GC when there is a buffer between the sections; thus, I've adjusted the fake-splitting implementation to leave the hot/cold sections adjacent in memory, while still behaving as if they're arbitrarily far apart (for example, the JIT still generates long branches between sections).

I've tested the x64 implementation locally, and will adjust x86 implementation/add ARM implementation as needed.

@BruceForstallBruceForstall left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM. If the tests pass, you're good to merge.

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

Other than jit_osr_stress_random (see issue), runtime-jit-experimental is passing. Build windows arm64 Release NativeAOT is failing due to a Helix job timing out, but the build otherwise succeeds.

@amanasifkhalid
amanasifkhalid merged commit 08b3170 into dotnet:mainJun 7, 2022
@amanasifkhalid
amanasifkhalid deleted the jit-pipeline-tests branch June 7, 2022 17:47
@AndyAyersMSAndyAyersMS mentioned this pull request Jun 29, 2022
54 tasks
@ghostghost locked as resolved and limited conversation to collaborators Jul 7, 2022
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.

3 participants

@amanasifkhalid@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

Add hot/cold splitting test job to jit-runtime-experimental - #69922

Merged
amanasifkhalid merged 1 commit into
dotnet:mainfrom
amanasifkhalid:jit-pipeline-tests
Jun 7, 2022
Merged

Add hot/cold splitting test job to jit-runtime-experimental#69922
amanasifkhalid merged 1 commit into
dotnet:mainfrom
amanasifkhalid:jit-pipeline-tests

Conversation

@amanasifkhalid

Copy link
Copy Markdown
Contributor

Adding a new rolling test job to JIT-runtime-experimental can help ensure the new fake- and stress-splitting modes in the JIT do not regress. The proposed test, titled jitosr_stress_splitting, runs a Checked build of the JIT on OS- and platform-specific test suites with the following environment:

  • COMPlus_GCgen0size=1000000
  • COMPlus_JitFakeProcedureSplitting=1
  • COMPlus_JitStressprocedureSplitting=1

This environment forces the JIT to fake-split every method after its first basic block, assuming the method consists of more than one block. COMPlus_GCgen0size=1000000 sets a large memory allocation threshold before the GC runs; recall that COMPlus_JitFakeProcedureSplitting currently doesn't generate unwind information for cold code, thus breaking the GC's stack walks. COMPlus_GCgen0size provides a patchwork fix for this limitation in cases where memory usage is not excessive (i.e. >= 0x1000000 B).

In my local testing, all of the x64 tests in src/tests/ pass with this environment.

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

Copy link
Copy Markdown

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

Issue Details

Adding a new rolling test job to JIT-runtime-experimental can help ensure the new fake- and stress-splitting modes in the JIT do not regress. The proposed test, titled jitosr_stress_splitting, runs a Checked build of the JIT on OS- and platform-specific test suites with the following environment:

  • COMPlus_GCgen0size=1000000
  • COMPlus_JitFakeProcedureSplitting=1
  • COMPlus_JitStressprocedureSplitting=1

This environment forces the JIT to fake-split every method after its first basic block, assuming the method consists of more than one block. COMPlus_GCgen0size=1000000 sets a large memory allocation threshold before the GC runs; recall that COMPlus_JitFakeProcedureSplitting currently doesn't generate unwind information for cold code, thus breaking the GC's stack walks. COMPlus_GCgen0size provides a patchwork fix for this limitation in cases where memory usage is not excessive (i.e. >= 0x1000000 B).

In my local testing, all of the x64 tests in src/tests/ pass with this environment.

Author:amanasifkhalid
Assignees:amanasifkhalid
Labels:

area-CodeGen-coreclr

Milestone:-

@BruceForstall

Copy link
Copy Markdown
Contributor

Looks good. However, this isn't related to OSR, so remove "osr" from the name. Use jit_stress_splitting or jit_stress_procedure_splitting.

@amanasifkhalid
amanasifkhalid marked this pull request as ready for review May 27, 2022 21:45

@BruceForstallBruceForstall left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM.

You should trigger jit-runtime-experimental on this PR to verify.

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@JulieLeeMSFTJulieLeeMSFT added this to the 7.0.0 milestone May 27, 2022
@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

I ran and re-ran runtime-jit-experimental and, like all the other failing checks, it fails to send tests to Helix due to a bad System.AccessToken value. Is the fact that runtime-jit-experimental makes it all the way to the "Send to Helix" step sufficient verification to merge the PR?

@BruceForstall

Copy link
Copy Markdown
Contributor

I ran and re-ran runtime-jit-experimental and, like all the other failing checks, it fails to send tests to Helix due to a bad System.AccessToken value.

You hit #69854, which I believe is now fixed. Try triggering the job again.

Is the fact that runtime-jit-experimental makes it all the way to the "Send to Helix" step sufficient verification to merge the PR?

No -- It's the "Send to Helix" step that actually runs tests, and since it failed, no tests were run.

@BruceForstall

Copy link
Copy Markdown
Contributor

You also hit the "remainingSize == 4" assert which was fixed with #69905

Also, some wasm failures which I don't see issues for, but which are obviously unrelated. You can always try "Re-run" on those.

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

I pulled from main and re-ran runtime-jit-experimental, but it's still failing with 401 responses from Azure DevOps, per #69854 .

@BruceForstall

Copy link
Copy Markdown
Contributor

I pulled from main and re-ran runtime-jit-experimental, but it's still failing with 401 responses from Azure DevOps, per #69854 .

The scheduled run on Sunday did not have those issues (it had other issues, but not those: https://dev.azure.com/dnceng/public/_build/results?buildId=1795838&view=ms.vss-test-web.build-test-results-tab).

My suggestion:

  1. rebase on top of main (don't merge main)
  2. push the updated PR

It shouldn't be necessary, but if that doesn't work, try closing and re-opening the PR, or create an entirely new PR.

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
Contributor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
Contributor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

Fake-splitting currently breaks stack walks by not generating unwind
info for cold code. This commit implements unwind info on x86/64 when
fake-splitting by generating unwind info for the combined hot/cold
section just once, rather than generating unwind info for the separate
sections.
For reasons to be investigated, this implementation does not work when
the code sections are separated by an arbitrary buffer (such as the 4KB
buffer previously used). Thus, the buffer has been removed from the
fake-splitting implementation: Now, the hot and cold sections are
placed contiguously in memory, but the JIT continues to behave as if
they are arbitrarily far away (for example, by using long branches
between sections).
Following this fix, fake-splitting no longer requires the GC to be
suppressed by setting `COMPlus_GCgen0size=1000000`. A test job
has been added to `runtime-jit-experimental` to ensure
fake/stress-splitting does not regress.
@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

I have pushed a commit with a fix for unwind info generation when fake-splitting: When calling eeAllocUnwindInfo, we manually set the start offset to point at the beginning of the hot section, and the end offset to point at the end of the cold section, effectively treating them as a single "hot" section. However, for reasons under investigation, this implementation breaks the GC when there is a buffer between the sections; thus, I've adjusted the fake-splitting implementation to leave the hot/cold sections adjacent in memory, while still behaving as if they're arbitrarily far apart (for example, the JIT still generates long branches between sections).

I've tested the x64 implementation locally, and will adjust x86 implementation/add ARM implementation as needed.

@BruceForstallBruceForstall left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM. If the tests pass, you're good to merge.

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

Other than jit_osr_stress_random (see issue), runtime-jit-experimental is passing. Build windows arm64 Release NativeAOT is failing due to a Helix job timing out, but the build otherwise succeeds.

@amanasifkhalid
amanasifkhalid merged commit 08b3170 into dotnet:mainJun 7, 2022
@amanasifkhalid
amanasifkhalid deleted the jit-pipeline-tests branch June 7, 2022 17:47
@AndyAyersMSAndyAyersMS mentioned this pull request Jun 29, 2022
54 tasks
@ghostghost locked as resolved and limited conversation to collaborators Jul 7, 2022
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.

3 participants

@amanasifkhalid@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

Add hot/cold splitting test job to jit-runtime-experimental - #69922

Merged
amanasifkhalid merged 1 commit into
dotnet:mainfrom
amanasifkhalid:jit-pipeline-tests
Jun 7, 2022
Merged

Add hot/cold splitting test job to jit-runtime-experimental#69922
amanasifkhalid merged 1 commit into
dotnet:mainfrom
amanasifkhalid:jit-pipeline-tests

Conversation

@amanasifkhalid

Copy link
Copy Markdown
Contributor

Adding a new rolling test job to JIT-runtime-experimental can help ensure the new fake- and stress-splitting modes in the JIT do not regress. The proposed test, titled jitosr_stress_splitting, runs a Checked build of the JIT on OS- and platform-specific test suites with the following environment:

  • COMPlus_GCgen0size=1000000
  • COMPlus_JitFakeProcedureSplitting=1
  • COMPlus_JitStressprocedureSplitting=1

This environment forces the JIT to fake-split every method after its first basic block, assuming the method consists of more than one block. COMPlus_GCgen0size=1000000 sets a large memory allocation threshold before the GC runs; recall that COMPlus_JitFakeProcedureSplitting currently doesn't generate unwind information for cold code, thus breaking the GC's stack walks. COMPlus_GCgen0size provides a patchwork fix for this limitation in cases where memory usage is not excessive (i.e. >= 0x1000000 B).

In my local testing, all of the x64 tests in src/tests/ pass with this environment.

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

Copy link
Copy Markdown

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

Issue Details

Adding a new rolling test job to JIT-runtime-experimental can help ensure the new fake- and stress-splitting modes in the JIT do not regress. The proposed test, titled jitosr_stress_splitting, runs a Checked build of the JIT on OS- and platform-specific test suites with the following environment:

  • COMPlus_GCgen0size=1000000
  • COMPlus_JitFakeProcedureSplitting=1
  • COMPlus_JitStressprocedureSplitting=1

This environment forces the JIT to fake-split every method after its first basic block, assuming the method consists of more than one block. COMPlus_GCgen0size=1000000 sets a large memory allocation threshold before the GC runs; recall that COMPlus_JitFakeProcedureSplitting currently doesn't generate unwind information for cold code, thus breaking the GC's stack walks. COMPlus_GCgen0size provides a patchwork fix for this limitation in cases where memory usage is not excessive (i.e. >= 0x1000000 B).

In my local testing, all of the x64 tests in src/tests/ pass with this environment.

Author:amanasifkhalid
Assignees:amanasifkhalid
Labels:

area-CodeGen-coreclr

Milestone:-

@BruceForstall

Copy link
Copy Markdown
Contributor

Looks good. However, this isn't related to OSR, so remove "osr" from the name. Use jit_stress_splitting or jit_stress_procedure_splitting.

@amanasifkhalid
amanasifkhalid marked this pull request as ready for review May 27, 2022 21:45

@BruceForstallBruceForstall left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM.

You should trigger jit-runtime-experimental on this PR to verify.

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@JulieLeeMSFTJulieLeeMSFT added this to the 7.0.0 milestone May 27, 2022
@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

I ran and re-ran runtime-jit-experimental and, like all the other failing checks, it fails to send tests to Helix due to a bad System.AccessToken value. Is the fact that runtime-jit-experimental makes it all the way to the "Send to Helix" step sufficient verification to merge the PR?

@BruceForstall

Copy link
Copy Markdown
Contributor

I ran and re-ran runtime-jit-experimental and, like all the other failing checks, it fails to send tests to Helix due to a bad System.AccessToken value.

You hit #69854, which I believe is now fixed. Try triggering the job again.

Is the fact that runtime-jit-experimental makes it all the way to the "Send to Helix" step sufficient verification to merge the PR?

No -- It's the "Send to Helix" step that actually runs tests, and since it failed, no tests were run.

@BruceForstall

Copy link
Copy Markdown
Contributor

You also hit the "remainingSize == 4" assert which was fixed with #69905

Also, some wasm failures which I don't see issues for, but which are obviously unrelated. You can always try "Re-run" on those.

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

I pulled from main and re-ran runtime-jit-experimental, but it's still failing with 401 responses from Azure DevOps, per #69854 .

@BruceForstall

Copy link
Copy Markdown
Contributor

I pulled from main and re-ran runtime-jit-experimental, but it's still failing with 401 responses from Azure DevOps, per #69854 .

The scheduled run on Sunday did not have those issues (it had other issues, but not those: https://dev.azure.com/dnceng/public/_build/results?buildId=1795838&view=ms.vss-test-web.build-test-results-tab).

My suggestion:

  1. rebase on top of main (don't merge main)
  2. push the updated PR

It shouldn't be necessary, but if that doesn't work, try closing and re-opening the PR, or create an entirely new PR.

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
Contributor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
Contributor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

Fake-splitting currently breaks stack walks by not generating unwind
info for cold code. This commit implements unwind info on x86/64 when
fake-splitting by generating unwind info for the combined hot/cold
section just once, rather than generating unwind info for the separate
sections.
For reasons to be investigated, this implementation does not work when
the code sections are separated by an arbitrary buffer (such as the 4KB
buffer previously used). Thus, the buffer has been removed from the
fake-splitting implementation: Now, the hot and cold sections are
placed contiguously in memory, but the JIT continues to behave as if
they are arbitrarily far away (for example, by using long branches
between sections).
Following this fix, fake-splitting no longer requires the GC to be
suppressed by setting `COMPlus_GCgen0size=1000000`. A test job
has been added to `runtime-jit-experimental` to ensure
fake/stress-splitting does not regress.
@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

I have pushed a commit with a fix for unwind info generation when fake-splitting: When calling eeAllocUnwindInfo, we manually set the start offset to point at the beginning of the hot section, and the end offset to point at the end of the cold section, effectively treating them as a single "hot" section. However, for reasons under investigation, this implementation breaks the GC when there is a buffer between the sections; thus, I've adjusted the fake-splitting implementation to leave the hot/cold sections adjacent in memory, while still behaving as if they're arbitrarily far apart (for example, the JIT still generates long branches between sections).

I've tested the x64 implementation locally, and will adjust x86 implementation/add ARM implementation as needed.

@BruceForstallBruceForstall left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM. If the tests pass, you're good to merge.

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

Other than jit_osr_stress_random (see issue), runtime-jit-experimental is passing. Build windows arm64 Release NativeAOT is failing due to a Helix job timing out, but the build otherwise succeeds.

@amanasifkhalid
amanasifkhalid merged commit 08b3170 into dotnet:mainJun 7, 2022
@amanasifkhalid
amanasifkhalid deleted the jit-pipeline-tests branch June 7, 2022 17:47
@AndyAyersMSAndyAyersMS mentioned this pull request Jun 29, 2022
54 tasks
@ghostghost locked as resolved and limited conversation to collaborators Jul 7, 2022
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.

3 participants

@amanasifkhalid@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

Add hot/cold splitting test job to jit-runtime-experimental - #69922

Merged
amanasifkhalid merged 1 commit into
dotnet:mainfrom
amanasifkhalid:jit-pipeline-tests
Jun 7, 2022
Merged

Add hot/cold splitting test job to jit-runtime-experimental#69922
amanasifkhalid merged 1 commit into
dotnet:mainfrom
amanasifkhalid:jit-pipeline-tests

Conversation

@amanasifkhalid

Copy link
Copy Markdown
Contributor

Adding a new rolling test job to JIT-runtime-experimental can help ensure the new fake- and stress-splitting modes in the JIT do not regress. The proposed test, titled jitosr_stress_splitting, runs a Checked build of the JIT on OS- and platform-specific test suites with the following environment:

  • COMPlus_GCgen0size=1000000
  • COMPlus_JitFakeProcedureSplitting=1
  • COMPlus_JitStressprocedureSplitting=1

This environment forces the JIT to fake-split every method after its first basic block, assuming the method consists of more than one block. COMPlus_GCgen0size=1000000 sets a large memory allocation threshold before the GC runs; recall that COMPlus_JitFakeProcedureSplitting currently doesn't generate unwind information for cold code, thus breaking the GC's stack walks. COMPlus_GCgen0size provides a patchwork fix for this limitation in cases where memory usage is not excessive (i.e. >= 0x1000000 B).

In my local testing, all of the x64 tests in src/tests/ pass with this environment.

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

Copy link
Copy Markdown

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

Issue Details

Adding a new rolling test job to JIT-runtime-experimental can help ensure the new fake- and stress-splitting modes in the JIT do not regress. The proposed test, titled jitosr_stress_splitting, runs a Checked build of the JIT on OS- and platform-specific test suites with the following environment:

  • COMPlus_GCgen0size=1000000
  • COMPlus_JitFakeProcedureSplitting=1
  • COMPlus_JitStressprocedureSplitting=1

This environment forces the JIT to fake-split every method after its first basic block, assuming the method consists of more than one block. COMPlus_GCgen0size=1000000 sets a large memory allocation threshold before the GC runs; recall that COMPlus_JitFakeProcedureSplitting currently doesn't generate unwind information for cold code, thus breaking the GC's stack walks. COMPlus_GCgen0size provides a patchwork fix for this limitation in cases where memory usage is not excessive (i.e. >= 0x1000000 B).

In my local testing, all of the x64 tests in src/tests/ pass with this environment.

Author:amanasifkhalid
Assignees:amanasifkhalid
Labels:

area-CodeGen-coreclr

Milestone:-

@BruceForstall

Copy link
Copy Markdown
Contributor

Looks good. However, this isn't related to OSR, so remove "osr" from the name. Use jit_stress_splitting or jit_stress_procedure_splitting.

@amanasifkhalid
amanasifkhalid marked this pull request as ready for review May 27, 2022 21:45

@BruceForstallBruceForstall left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM.

You should trigger jit-runtime-experimental on this PR to verify.

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@JulieLeeMSFTJulieLeeMSFT added this to the 7.0.0 milestone May 27, 2022
@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

I ran and re-ran runtime-jit-experimental and, like all the other failing checks, it fails to send tests to Helix due to a bad System.AccessToken value. Is the fact that runtime-jit-experimental makes it all the way to the "Send to Helix" step sufficient verification to merge the PR?

@BruceForstall

Copy link
Copy Markdown
Contributor

I ran and re-ran runtime-jit-experimental and, like all the other failing checks, it fails to send tests to Helix due to a bad System.AccessToken value.

You hit #69854, which I believe is now fixed. Try triggering the job again.

Is the fact that runtime-jit-experimental makes it all the way to the "Send to Helix" step sufficient verification to merge the PR?

No -- It's the "Send to Helix" step that actually runs tests, and since it failed, no tests were run.

@BruceForstall

Copy link
Copy Markdown
Contributor

You also hit the "remainingSize == 4" assert which was fixed with #69905

Also, some wasm failures which I don't see issues for, but which are obviously unrelated. You can always try "Re-run" on those.

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

I pulled from main and re-ran runtime-jit-experimental, but it's still failing with 401 responses from Azure DevOps, per #69854 .

@BruceForstall

Copy link
Copy Markdown
Contributor

I pulled from main and re-ran runtime-jit-experimental, but it's still failing with 401 responses from Azure DevOps, per #69854 .

The scheduled run on Sunday did not have those issues (it had other issues, but not those: https://dev.azure.com/dnceng/public/_build/results?buildId=1795838&view=ms.vss-test-web.build-test-results-tab).

My suggestion:

  1. rebase on top of main (don't merge main)
  2. push the updated PR

It shouldn't be necessary, but if that doesn't work, try closing and re-opening the PR, or create an entirely new PR.

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
Contributor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
Contributor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

Fake-splitting currently breaks stack walks by not generating unwind
info for cold code. This commit implements unwind info on x86/64 when
fake-splitting by generating unwind info for the combined hot/cold
section just once, rather than generating unwind info for the separate
sections.
For reasons to be investigated, this implementation does not work when
the code sections are separated by an arbitrary buffer (such as the 4KB
buffer previously used). Thus, the buffer has been removed from the
fake-splitting implementation: Now, the hot and cold sections are
placed contiguously in memory, but the JIT continues to behave as if
they are arbitrarily far away (for example, by using long branches
between sections).
Following this fix, fake-splitting no longer requires the GC to be
suppressed by setting `COMPlus_GCgen0size=1000000`. A test job
has been added to `runtime-jit-experimental` to ensure
fake/stress-splitting does not regress.
@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

I have pushed a commit with a fix for unwind info generation when fake-splitting: When calling eeAllocUnwindInfo, we manually set the start offset to point at the beginning of the hot section, and the end offset to point at the end of the cold section, effectively treating them as a single "hot" section. However, for reasons under investigation, this implementation breaks the GC when there is a buffer between the sections; thus, I've adjusted the fake-splitting implementation to leave the hot/cold sections adjacent in memory, while still behaving as if they're arbitrarily far apart (for example, the JIT still generates long branches between sections).

I've tested the x64 implementation locally, and will adjust x86 implementation/add ARM implementation as needed.

@BruceForstallBruceForstall left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM. If the tests pass, you're good to merge.

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

Other than jit_osr_stress_random (see issue), runtime-jit-experimental is passing. Build windows arm64 Release NativeAOT is failing due to a Helix job timing out, but the build otherwise succeeds.

@amanasifkhalid
amanasifkhalid merged commit 08b3170 into dotnet:mainJun 7, 2022
@amanasifkhalid
amanasifkhalid deleted the jit-pipeline-tests branch June 7, 2022 17:47
@AndyAyersMSAndyAyersMS mentioned this pull request Jun 29, 2022
54 tasks
@ghostghost locked as resolved and limited conversation to collaborators Jul 7, 2022
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.

3 participants

@amanasifkhalid@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

Add hot/cold splitting test job to jit-runtime-experimental - #69922

Merged
amanasifkhalid merged 1 commit into
dotnet:mainfrom
amanasifkhalid:jit-pipeline-tests
Jun 7, 2022
Merged

Add hot/cold splitting test job to jit-runtime-experimental#69922
amanasifkhalid merged 1 commit into
dotnet:mainfrom
amanasifkhalid:jit-pipeline-tests

Conversation

@amanasifkhalid

Copy link
Copy Markdown
Contributor

Adding a new rolling test job to JIT-runtime-experimental can help ensure the new fake- and stress-splitting modes in the JIT do not regress. The proposed test, titled jitosr_stress_splitting, runs a Checked build of the JIT on OS- and platform-specific test suites with the following environment:

  • COMPlus_GCgen0size=1000000
  • COMPlus_JitFakeProcedureSplitting=1
  • COMPlus_JitStressprocedureSplitting=1

This environment forces the JIT to fake-split every method after its first basic block, assuming the method consists of more than one block. COMPlus_GCgen0size=1000000 sets a large memory allocation threshold before the GC runs; recall that COMPlus_JitFakeProcedureSplitting currently doesn't generate unwind information for cold code, thus breaking the GC's stack walks. COMPlus_GCgen0size provides a patchwork fix for this limitation in cases where memory usage is not excessive (i.e. >= 0x1000000 B).

In my local testing, all of the x64 tests in src/tests/ pass with this environment.

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

Copy link
Copy Markdown

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

Issue Details

Adding a new rolling test job to JIT-runtime-experimental can help ensure the new fake- and stress-splitting modes in the JIT do not regress. The proposed test, titled jitosr_stress_splitting, runs a Checked build of the JIT on OS- and platform-specific test suites with the following environment:

  • COMPlus_GCgen0size=1000000
  • COMPlus_JitFakeProcedureSplitting=1
  • COMPlus_JitStressprocedureSplitting=1

This environment forces the JIT to fake-split every method after its first basic block, assuming the method consists of more than one block. COMPlus_GCgen0size=1000000 sets a large memory allocation threshold before the GC runs; recall that COMPlus_JitFakeProcedureSplitting currently doesn't generate unwind information for cold code, thus breaking the GC's stack walks. COMPlus_GCgen0size provides a patchwork fix for this limitation in cases where memory usage is not excessive (i.e. >= 0x1000000 B).

In my local testing, all of the x64 tests in src/tests/ pass with this environment.

Author:amanasifkhalid
Assignees:amanasifkhalid
Labels:

area-CodeGen-coreclr

Milestone:-

@BruceForstall

Copy link
Copy Markdown
Contributor

Looks good. However, this isn't related to OSR, so remove "osr" from the name. Use jit_stress_splitting or jit_stress_procedure_splitting.

@amanasifkhalid
amanasifkhalid marked this pull request as ready for review May 27, 2022 21:45

@BruceForstallBruceForstall left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM.

You should trigger jit-runtime-experimental on this PR to verify.

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@JulieLeeMSFTJulieLeeMSFT added this to the 7.0.0 milestone May 27, 2022
@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

I ran and re-ran runtime-jit-experimental and, like all the other failing checks, it fails to send tests to Helix due to a bad System.AccessToken value. Is the fact that runtime-jit-experimental makes it all the way to the "Send to Helix" step sufficient verification to merge the PR?

@BruceForstall

Copy link
Copy Markdown
Contributor

I ran and re-ran runtime-jit-experimental and, like all the other failing checks, it fails to send tests to Helix due to a bad System.AccessToken value.

You hit #69854, which I believe is now fixed. Try triggering the job again.

Is the fact that runtime-jit-experimental makes it all the way to the "Send to Helix" step sufficient verification to merge the PR?

No -- It's the "Send to Helix" step that actually runs tests, and since it failed, no tests were run.

@BruceForstall

Copy link
Copy Markdown
Contributor

You also hit the "remainingSize == 4" assert which was fixed with #69905

Also, some wasm failures which I don't see issues for, but which are obviously unrelated. You can always try "Re-run" on those.

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

I pulled from main and re-ran runtime-jit-experimental, but it's still failing with 401 responses from Azure DevOps, per #69854 .

@BruceForstall

Copy link
Copy Markdown
Contributor

I pulled from main and re-ran runtime-jit-experimental, but it's still failing with 401 responses from Azure DevOps, per #69854 .

The scheduled run on Sunday did not have those issues (it had other issues, but not those: https://dev.azure.com/dnceng/public/_build/results?buildId=1795838&view=ms.vss-test-web.build-test-results-tab).

My suggestion:

  1. rebase on top of main (don't merge main)
  2. push the updated PR

It shouldn't be necessary, but if that doesn't work, try closing and re-opening the PR, or create an entirely new PR.

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
Contributor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
Contributor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

Fake-splitting currently breaks stack walks by not generating unwind
info for cold code. This commit implements unwind info on x86/64 when
fake-splitting by generating unwind info for the combined hot/cold
section just once, rather than generating unwind info for the separate
sections.
For reasons to be investigated, this implementation does not work when
the code sections are separated by an arbitrary buffer (such as the 4KB
buffer previously used). Thus, the buffer has been removed from the
fake-splitting implementation: Now, the hot and cold sections are
placed contiguously in memory, but the JIT continues to behave as if
they are arbitrarily far away (for example, by using long branches
between sections).
Following this fix, fake-splitting no longer requires the GC to be
suppressed by setting `COMPlus_GCgen0size=1000000`. A test job
has been added to `runtime-jit-experimental` to ensure
fake/stress-splitting does not regress.
@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

I have pushed a commit with a fix for unwind info generation when fake-splitting: When calling eeAllocUnwindInfo, we manually set the start offset to point at the beginning of the hot section, and the end offset to point at the end of the cold section, effectively treating them as a single "hot" section. However, for reasons under investigation, this implementation breaks the GC when there is a buffer between the sections; thus, I've adjusted the fake-splitting implementation to leave the hot/cold sections adjacent in memory, while still behaving as if they're arbitrarily far apart (for example, the JIT still generates long branches between sections).

I've tested the x64 implementation locally, and will adjust x86 implementation/add ARM implementation as needed.

@BruceForstallBruceForstall left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM. If the tests pass, you're good to merge.

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

Other than jit_osr_stress_random (see issue), runtime-jit-experimental is passing. Build windows arm64 Release NativeAOT is failing due to a Helix job timing out, but the build otherwise succeeds.

@amanasifkhalid
amanasifkhalid merged commit 08b3170 into dotnet:mainJun 7, 2022
@amanasifkhalid
amanasifkhalid deleted the jit-pipeline-tests branch June 7, 2022 17:47
@AndyAyersMSAndyAyersMS mentioned this pull request Jun 29, 2022
54 tasks
@ghostghost locked as resolved and limited conversation to collaborators Jul 7, 2022
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.

3 participants

@amanasifkhalid@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

Add hot/cold splitting test job to jit-runtime-experimental - #69922

Merged
amanasifkhalid merged 1 commit into
dotnet:mainfrom
amanasifkhalid:jit-pipeline-tests
Jun 7, 2022
Merged

Add hot/cold splitting test job to jit-runtime-experimental#69922
amanasifkhalid merged 1 commit into
dotnet:mainfrom
amanasifkhalid:jit-pipeline-tests

Conversation

@amanasifkhalid

Copy link
Copy Markdown
Contributor

Adding a new rolling test job to JIT-runtime-experimental can help ensure the new fake- and stress-splitting modes in the JIT do not regress. The proposed test, titled jitosr_stress_splitting, runs a Checked build of the JIT on OS- and platform-specific test suites with the following environment:

  • COMPlus_GCgen0size=1000000
  • COMPlus_JitFakeProcedureSplitting=1
  • COMPlus_JitStressprocedureSplitting=1

This environment forces the JIT to fake-split every method after its first basic block, assuming the method consists of more than one block. COMPlus_GCgen0size=1000000 sets a large memory allocation threshold before the GC runs; recall that COMPlus_JitFakeProcedureSplitting currently doesn't generate unwind information for cold code, thus breaking the GC's stack walks. COMPlus_GCgen0size provides a patchwork fix for this limitation in cases where memory usage is not excessive (i.e. >= 0x1000000 B).

In my local testing, all of the x64 tests in src/tests/ pass with this environment.

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

Copy link
Copy Markdown

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

Issue Details

Adding a new rolling test job to JIT-runtime-experimental can help ensure the new fake- and stress-splitting modes in the JIT do not regress. The proposed test, titled jitosr_stress_splitting, runs a Checked build of the JIT on OS- and platform-specific test suites with the following environment:

  • COMPlus_GCgen0size=1000000
  • COMPlus_JitFakeProcedureSplitting=1
  • COMPlus_JitStressprocedureSplitting=1

This environment forces the JIT to fake-split every method after its first basic block, assuming the method consists of more than one block. COMPlus_GCgen0size=1000000 sets a large memory allocation threshold before the GC runs; recall that COMPlus_JitFakeProcedureSplitting currently doesn't generate unwind information for cold code, thus breaking the GC's stack walks. COMPlus_GCgen0size provides a patchwork fix for this limitation in cases where memory usage is not excessive (i.e. >= 0x1000000 B).

In my local testing, all of the x64 tests in src/tests/ pass with this environment.

Author:amanasifkhalid
Assignees:amanasifkhalid
Labels:

area-CodeGen-coreclr

Milestone:-

@BruceForstall

Copy link
Copy Markdown
Contributor

Looks good. However, this isn't related to OSR, so remove "osr" from the name. Use jit_stress_splitting or jit_stress_procedure_splitting.

@amanasifkhalid
amanasifkhalid marked this pull request as ready for review May 27, 2022 21:45

@BruceForstallBruceForstall left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM.

You should trigger jit-runtime-experimental on this PR to verify.

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@JulieLeeMSFTJulieLeeMSFT added this to the 7.0.0 milestone May 27, 2022
@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

I ran and re-ran runtime-jit-experimental and, like all the other failing checks, it fails to send tests to Helix due to a bad System.AccessToken value. Is the fact that runtime-jit-experimental makes it all the way to the "Send to Helix" step sufficient verification to merge the PR?

@BruceForstall

Copy link
Copy Markdown
Contributor

I ran and re-ran runtime-jit-experimental and, like all the other failing checks, it fails to send tests to Helix due to a bad System.AccessToken value.

You hit #69854, which I believe is now fixed. Try triggering the job again.

Is the fact that runtime-jit-experimental makes it all the way to the "Send to Helix" step sufficient verification to merge the PR?

No -- It's the "Send to Helix" step that actually runs tests, and since it failed, no tests were run.

@BruceForstall

Copy link
Copy Markdown
Contributor

You also hit the "remainingSize == 4" assert which was fixed with #69905

Also, some wasm failures which I don't see issues for, but which are obviously unrelated. You can always try "Re-run" on those.

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

I pulled from main and re-ran runtime-jit-experimental, but it's still failing with 401 responses from Azure DevOps, per #69854 .

@BruceForstall

Copy link
Copy Markdown
Contributor

I pulled from main and re-ran runtime-jit-experimental, but it's still failing with 401 responses from Azure DevOps, per #69854 .

The scheduled run on Sunday did not have those issues (it had other issues, but not those: https://dev.azure.com/dnceng/public/_build/results?buildId=1795838&view=ms.vss-test-web.build-test-results-tab).

My suggestion:

  1. rebase on top of main (don't merge main)
  2. push the updated PR

It shouldn't be necessary, but if that doesn't work, try closing and re-opening the PR, or create an entirely new PR.

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
Contributor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
Contributor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

Fake-splitting currently breaks stack walks by not generating unwind
info for cold code. This commit implements unwind info on x86/64 when
fake-splitting by generating unwind info for the combined hot/cold
section just once, rather than generating unwind info for the separate
sections.
For reasons to be investigated, this implementation does not work when
the code sections are separated by an arbitrary buffer (such as the 4KB
buffer previously used). Thus, the buffer has been removed from the
fake-splitting implementation: Now, the hot and cold sections are
placed contiguously in memory, but the JIT continues to behave as if
they are arbitrarily far away (for example, by using long branches
between sections).
Following this fix, fake-splitting no longer requires the GC to be
suppressed by setting `COMPlus_GCgen0size=1000000`. A test job
has been added to `runtime-jit-experimental` to ensure
fake/stress-splitting does not regress.
@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

I have pushed a commit with a fix for unwind info generation when fake-splitting: When calling eeAllocUnwindInfo, we manually set the start offset to point at the beginning of the hot section, and the end offset to point at the end of the cold section, effectively treating them as a single "hot" section. However, for reasons under investigation, this implementation breaks the GC when there is a buffer between the sections; thus, I've adjusted the fake-splitting implementation to leave the hot/cold sections adjacent in memory, while still behaving as if they're arbitrarily far apart (for example, the JIT still generates long branches between sections).

I've tested the x64 implementation locally, and will adjust x86 implementation/add ARM implementation as needed.

@BruceForstallBruceForstall left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM. If the tests pass, you're good to merge.

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

Other than jit_osr_stress_random (see issue), runtime-jit-experimental is passing. Build windows arm64 Release NativeAOT is failing due to a Helix job timing out, but the build otherwise succeeds.

@amanasifkhalid
amanasifkhalid merged commit 08b3170 into dotnet:mainJun 7, 2022
@amanasifkhalid
amanasifkhalid deleted the jit-pipeline-tests branch June 7, 2022 17:47
@AndyAyersMSAndyAyersMS mentioned this pull request Jun 29, 2022
54 tasks
@ghostghost locked as resolved and limited conversation to collaborators Jul 7, 2022
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.

3 participants

@amanasifkhalid@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

Add hot/cold splitting test job to jit-runtime-experimental - #69922

Merged
amanasifkhalid merged 1 commit into
dotnet:mainfrom
amanasifkhalid:jit-pipeline-tests
Jun 7, 2022
Merged

Add hot/cold splitting test job to jit-runtime-experimental#69922
amanasifkhalid merged 1 commit into
dotnet:mainfrom
amanasifkhalid:jit-pipeline-tests

Conversation

@amanasifkhalid

Copy link
Copy Markdown
Contributor

Adding a new rolling test job to JIT-runtime-experimental can help ensure the new fake- and stress-splitting modes in the JIT do not regress. The proposed test, titled jitosr_stress_splitting, runs a Checked build of the JIT on OS- and platform-specific test suites with the following environment:

  • COMPlus_GCgen0size=1000000
  • COMPlus_JitFakeProcedureSplitting=1
  • COMPlus_JitStressprocedureSplitting=1

This environment forces the JIT to fake-split every method after its first basic block, assuming the method consists of more than one block. COMPlus_GCgen0size=1000000 sets a large memory allocation threshold before the GC runs; recall that COMPlus_JitFakeProcedureSplitting currently doesn't generate unwind information for cold code, thus breaking the GC's stack walks. COMPlus_GCgen0size provides a patchwork fix for this limitation in cases where memory usage is not excessive (i.e. >= 0x1000000 B).

In my local testing, all of the x64 tests in src/tests/ pass with this environment.

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

Copy link
Copy Markdown

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

Issue Details

Adding a new rolling test job to JIT-runtime-experimental can help ensure the new fake- and stress-splitting modes in the JIT do not regress. The proposed test, titled jitosr_stress_splitting, runs a Checked build of the JIT on OS- and platform-specific test suites with the following environment:

  • COMPlus_GCgen0size=1000000
  • COMPlus_JitFakeProcedureSplitting=1
  • COMPlus_JitStressprocedureSplitting=1

This environment forces the JIT to fake-split every method after its first basic block, assuming the method consists of more than one block. COMPlus_GCgen0size=1000000 sets a large memory allocation threshold before the GC runs; recall that COMPlus_JitFakeProcedureSplitting currently doesn't generate unwind information for cold code, thus breaking the GC's stack walks. COMPlus_GCgen0size provides a patchwork fix for this limitation in cases where memory usage is not excessive (i.e. >= 0x1000000 B).

In my local testing, all of the x64 tests in src/tests/ pass with this environment.

Author:amanasifkhalid
Assignees:amanasifkhalid
Labels:

area-CodeGen-coreclr

Milestone:-

@BruceForstall

Copy link
Copy Markdown
Contributor

Looks good. However, this isn't related to OSR, so remove "osr" from the name. Use jit_stress_splitting or jit_stress_procedure_splitting.

@amanasifkhalid
amanasifkhalid marked this pull request as ready for review May 27, 2022 21:45

@BruceForstallBruceForstall left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM.

You should trigger jit-runtime-experimental on this PR to verify.

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@JulieLeeMSFTJulieLeeMSFT added this to the 7.0.0 milestone May 27, 2022
@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

I ran and re-ran runtime-jit-experimental and, like all the other failing checks, it fails to send tests to Helix due to a bad System.AccessToken value. Is the fact that runtime-jit-experimental makes it all the way to the "Send to Helix" step sufficient verification to merge the PR?

@BruceForstall

Copy link
Copy Markdown
Contributor

I ran and re-ran runtime-jit-experimental and, like all the other failing checks, it fails to send tests to Helix due to a bad System.AccessToken value.

You hit #69854, which I believe is now fixed. Try triggering the job again.

Is the fact that runtime-jit-experimental makes it all the way to the "Send to Helix" step sufficient verification to merge the PR?

No -- It's the "Send to Helix" step that actually runs tests, and since it failed, no tests were run.

@BruceForstall

Copy link
Copy Markdown
Contributor

You also hit the "remainingSize == 4" assert which was fixed with #69905

Also, some wasm failures which I don't see issues for, but which are obviously unrelated. You can always try "Re-run" on those.

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

I pulled from main and re-ran runtime-jit-experimental, but it's still failing with 401 responses from Azure DevOps, per #69854 .

@BruceForstall

Copy link
Copy Markdown
Contributor

I pulled from main and re-ran runtime-jit-experimental, but it's still failing with 401 responses from Azure DevOps, per #69854 .

The scheduled run on Sunday did not have those issues (it had other issues, but not those: https://dev.azure.com/dnceng/public/_build/results?buildId=1795838&view=ms.vss-test-web.build-test-results-tab).

My suggestion:

  1. rebase on top of main (don't merge main)
  2. push the updated PR

It shouldn't be necessary, but if that doesn't work, try closing and re-opening the PR, or create an entirely new PR.

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
Contributor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
Contributor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

Fake-splitting currently breaks stack walks by not generating unwind
info for cold code. This commit implements unwind info on x86/64 when
fake-splitting by generating unwind info for the combined hot/cold
section just once, rather than generating unwind info for the separate
sections.
For reasons to be investigated, this implementation does not work when
the code sections are separated by an arbitrary buffer (such as the 4KB
buffer previously used). Thus, the buffer has been removed from the
fake-splitting implementation: Now, the hot and cold sections are
placed contiguously in memory, but the JIT continues to behave as if
they are arbitrarily far away (for example, by using long branches
between sections).
Following this fix, fake-splitting no longer requires the GC to be
suppressed by setting `COMPlus_GCgen0size=1000000`. A test job
has been added to `runtime-jit-experimental` to ensure
fake/stress-splitting does not regress.
@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

I have pushed a commit with a fix for unwind info generation when fake-splitting: When calling eeAllocUnwindInfo, we manually set the start offset to point at the beginning of the hot section, and the end offset to point at the end of the cold section, effectively treating them as a single "hot" section. However, for reasons under investigation, this implementation breaks the GC when there is a buffer between the sections; thus, I've adjusted the fake-splitting implementation to leave the hot/cold sections adjacent in memory, while still behaving as if they're arbitrarily far apart (for example, the JIT still generates long branches between sections).

I've tested the x64 implementation locally, and will adjust x86 implementation/add ARM implementation as needed.

@BruceForstallBruceForstall left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM. If the tests pass, you're good to merge.

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

Other than jit_osr_stress_random (see issue), runtime-jit-experimental is passing. Build windows arm64 Release NativeAOT is failing due to a Helix job timing out, but the build otherwise succeeds.

@amanasifkhalid
amanasifkhalid merged commit 08b3170 into dotnet:mainJun 7, 2022
@amanasifkhalid
amanasifkhalid deleted the jit-pipeline-tests branch June 7, 2022 17:47
@AndyAyersMSAndyAyersMS mentioned this pull request Jun 29, 2022
54 tasks
@ghostghost locked as resolved and limited conversation to collaborators Jul 7, 2022
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.

3 participants

@amanasifkhalid@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

Add hot/cold splitting test job to jit-runtime-experimental - #69922

Merged
amanasifkhalid merged 1 commit into
dotnet:mainfrom
amanasifkhalid:jit-pipeline-tests
Jun 7, 2022
Merged

Add hot/cold splitting test job to jit-runtime-experimental#69922
amanasifkhalid merged 1 commit into
dotnet:mainfrom
amanasifkhalid:jit-pipeline-tests

Conversation

@amanasifkhalid

Copy link
Copy Markdown
Contributor

Adding a new rolling test job to JIT-runtime-experimental can help ensure the new fake- and stress-splitting modes in the JIT do not regress. The proposed test, titled jitosr_stress_splitting, runs a Checked build of the JIT on OS- and platform-specific test suites with the following environment:

  • COMPlus_GCgen0size=1000000
  • COMPlus_JitFakeProcedureSplitting=1
  • COMPlus_JitStressprocedureSplitting=1

This environment forces the JIT to fake-split every method after its first basic block, assuming the method consists of more than one block. COMPlus_GCgen0size=1000000 sets a large memory allocation threshold before the GC runs; recall that COMPlus_JitFakeProcedureSplitting currently doesn't generate unwind information for cold code, thus breaking the GC's stack walks. COMPlus_GCgen0size provides a patchwork fix for this limitation in cases where memory usage is not excessive (i.e. >= 0x1000000 B).

In my local testing, all of the x64 tests in src/tests/ pass with this environment.

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

Copy link
Copy Markdown

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

Issue Details

Adding a new rolling test job to JIT-runtime-experimental can help ensure the new fake- and stress-splitting modes in the JIT do not regress. The proposed test, titled jitosr_stress_splitting, runs a Checked build of the JIT on OS- and platform-specific test suites with the following environment:

  • COMPlus_GCgen0size=1000000
  • COMPlus_JitFakeProcedureSplitting=1
  • COMPlus_JitStressprocedureSplitting=1

This environment forces the JIT to fake-split every method after its first basic block, assuming the method consists of more than one block. COMPlus_GCgen0size=1000000 sets a large memory allocation threshold before the GC runs; recall that COMPlus_JitFakeProcedureSplitting currently doesn't generate unwind information for cold code, thus breaking the GC's stack walks. COMPlus_GCgen0size provides a patchwork fix for this limitation in cases where memory usage is not excessive (i.e. >= 0x1000000 B).

In my local testing, all of the x64 tests in src/tests/ pass with this environment.

Author:amanasifkhalid
Assignees:amanasifkhalid
Labels:

area-CodeGen-coreclr

Milestone:-

@BruceForstall

Copy link
Copy Markdown
Contributor

Looks good. However, this isn't related to OSR, so remove "osr" from the name. Use jit_stress_splitting or jit_stress_procedure_splitting.

@amanasifkhalid
amanasifkhalid marked this pull request as ready for review May 27, 2022 21:45

@BruceForstallBruceForstall left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM.

You should trigger jit-runtime-experimental on this PR to verify.

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@JulieLeeMSFTJulieLeeMSFT added this to the 7.0.0 milestone May 27, 2022
@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

I ran and re-ran runtime-jit-experimental and, like all the other failing checks, it fails to send tests to Helix due to a bad System.AccessToken value. Is the fact that runtime-jit-experimental makes it all the way to the "Send to Helix" step sufficient verification to merge the PR?

@BruceForstall

Copy link
Copy Markdown
Contributor

I ran and re-ran runtime-jit-experimental and, like all the other failing checks, it fails to send tests to Helix due to a bad System.AccessToken value.

You hit #69854, which I believe is now fixed. Try triggering the job again.

Is the fact that runtime-jit-experimental makes it all the way to the "Send to Helix" step sufficient verification to merge the PR?

No -- It's the "Send to Helix" step that actually runs tests, and since it failed, no tests were run.

@BruceForstall

Copy link
Copy Markdown
Contributor

You also hit the "remainingSize == 4" assert which was fixed with #69905

Also, some wasm failures which I don't see issues for, but which are obviously unrelated. You can always try "Re-run" on those.

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

I pulled from main and re-ran runtime-jit-experimental, but it's still failing with 401 responses from Azure DevOps, per #69854 .

@BruceForstall

Copy link
Copy Markdown
Contributor

I pulled from main and re-ran runtime-jit-experimental, but it's still failing with 401 responses from Azure DevOps, per #69854 .

The scheduled run on Sunday did not have those issues (it had other issues, but not those: https://dev.azure.com/dnceng/public/_build/results?buildId=1795838&view=ms.vss-test-web.build-test-results-tab).

My suggestion:

  1. rebase on top of main (don't merge main)
  2. push the updated PR

It shouldn't be necessary, but if that doesn't work, try closing and re-opening the PR, or create an entirely new PR.

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
Contributor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@BruceForstall

Copy link
Copy Markdown
Contributor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

Fake-splitting currently breaks stack walks by not generating unwind
info for cold code. This commit implements unwind info on x86/64 when
fake-splitting by generating unwind info for the combined hot/cold
section just once, rather than generating unwind info for the separate
sections.
For reasons to be investigated, this implementation does not work when
the code sections are separated by an arbitrary buffer (such as the 4KB
buffer previously used). Thus, the buffer has been removed from the
fake-splitting implementation: Now, the hot and cold sections are
placed contiguously in memory, but the JIT continues to behave as if
they are arbitrarily far away (for example, by using long branches
between sections).
Following this fix, fake-splitting no longer requires the GC to be
suppressed by setting `COMPlus_GCgen0size=1000000`. A test job
has been added to `runtime-jit-experimental` to ensure
fake/stress-splitting does not regress.
@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

/azp run runtime-jit-experimental

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

I have pushed a commit with a fix for unwind info generation when fake-splitting: When calling eeAllocUnwindInfo, we manually set the start offset to point at the beginning of the hot section, and the end offset to point at the end of the cold section, effectively treating them as a single "hot" section. However, for reasons under investigation, this implementation breaks the GC when there is a buffer between the sections; thus, I've adjusted the fake-splitting implementation to leave the hot/cold sections adjacent in memory, while still behaving as if they're arbitrarily far apart (for example, the JIT still generates long branches between sections).

I've tested the x64 implementation locally, and will adjust x86 implementation/add ARM implementation as needed.

@BruceForstallBruceForstall left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM. If the tests pass, you're good to merge.

@amanasifkhalid

Copy link
Copy Markdown
ContributorAuthor

Other than jit_osr_stress_random (see issue), runtime-jit-experimental is passing. Build windows arm64 Release NativeAOT is failing due to a Helix job timing out, but the build otherwise succeeds.

@amanasifkhalid
amanasifkhalid merged commit 08b3170 into dotnet:mainJun 7, 2022
@amanasifkhalid
amanasifkhalid deleted the jit-pipeline-tests branch June 7, 2022 17:47
@AndyAyersMSAndyAyersMS mentioned this pull request Jun 29, 2022
54 tasks
@ghostghost locked as resolved and limited conversation to collaborators Jul 7, 2022
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.

3 participants

@amanasifkhalid@BruceForstall@JulieLeeMSFT