Add edge likelihood dumping; fix one edge likelihood update case - #99740

Merged
BruceForstall merged 1 commit into
dotnet:mainfrom
BruceForstall:FixSwitchLikelihoods
Mar 14, 2024
Merged

Add edge likelihood dumping; fix one edge likelihood update case#99740
BruceForstall merged 1 commit into
dotnet:mainfrom
BruceForstall:FixSwitchLikelihoods

Conversation

@BruceForstall

Copy link
Copy Markdown
Contributor
  1. Add dumping of edge likelihood numbers to the block table and other block dumping. Examples: BB17(0.143), BB18(1).

Edge likelihood dumping is parameterized in the code, but is currently always enabled.

  1. Update setLikelihood and updateLikelihood to print the previous value of the likelihood that is being updated (if there is a previous value).

  2. Fix a case of likelihood updating in fgReplaceJumpTarget(): in a switch block, when the new target block is already a target of the switch, then there already exists an edge from the switch to the new target. In that case, we were updating the edge dup count, but fgAddRefPred wasn't updating the edge likelihood to add the removed edge likelihood to the existing edge likelihood.

This was found as part of work to fix JitOptRepeat: #94250.

  1. Add natvis debugger support for FlowEdge.

  2. In 'fgDebugCheckOutgoingProfileData()`, if outgoing likelihoods are invalid, print out all the likelihoods of the outgoing edges.

1. Add dumping of edge likelihood numbers to the block table and other
block dumping. Examples: `BB17(0.143)`, `BB18(1)`.
Edge likelihood dumping is parameterized in the code, but is currently
always enabled.
2. Update `setLikelihood` and `updateLikelihood` to print the previous
value of the likelihood that is being updated (if there is a previous value).
3. Fix a case of likelihood updating in `fgReplaceJumpTarget()`: in a switch
block, when the new target block is already a target of the switch, then there
already exists an edge from the switch to the new target. In that case, we were
updating the edge dup count, but `fgAddRefPred` wasn't updating the edge likelihood
to add the removed edge likelihood to the existing edge likelihood.
This was found as part of work to fix JitOptRepeat: dotnet#94250.
4. Add natvis debugger support for FlowEdge.
5. In 'fgDebugCheckOutgoingProfileData()`, if outgoing likelihoods are invalid,
print out all the likelihoods of the outgoing edges.
@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Mar 14, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@amanasifkhalid@AndyAyersMS PTAL
cc @dotnet/jit-contrib

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

Here's a bigger example:

---------------------------------------------------------------------------------------------------------------------------------------------------------------------
BBnum BBid ref try hnd preds weight IBC [IL range] [jump] [EH region] [flags]
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
BB01 [0000] 1 1 250 [000..00E)-> BB06(0),*(1) ( cond ) i LIR IBC
BB02 [0001] 1 BB01 1 250 [00E..01B)-> BB05(0),*(1) ( cond ) i LIR IBC
BB03 [0002] 1 BB02 1 250 [01B..022)-> BB04(0),*(1) ( cond ) i LIR IBC hascall gcsafe
BB06 [0006] 2 BB01,BB03 0 0 [02F..030)-> *(1) (always) i LIR IBC rare q
BB07 [0007] 3 BB04,BB05,BB06 0 0 [030..034)-> BB09(0),*(1) ( cond ) i LIR IBC rare
BB08 [0008] 1 BB07 0 0 [034..04C) (return) i LIR IBC rare
BB09 [0009] 1 BB07 0 0 [04C..04C)-> BB17(0.143),*(1) ( cond ) i LIR IBC rare q
BB19 [0044] 1 BB09 0 0 [04C..06A)-> *(0.286),*(0.286),BB13(0.143),BB14(0.143),BB15(0.143),BB16(0.143) (switch) i LIR IBC rare
BB11 [0043] 2 BB19(2) 0 0 [07D..080)-> BB18(1) (always) i LIR IBC rare
BB13 [0013] 1 BB19 0 0 [094..0A8)-> BB18(1) (always) i LIR IBC rare
BB14 [0014] 1 BB19 0 0 [0A8..0BD)-> BB18(1) (always) i LIR IBC rare
BB15 [0015] 1 BB19 0 0 [0BD..0D1)-> BB18(1) (always) i LIR IBC rare
BB16 [0016] 1 BB19 0 0 [0D1..0E6)-> BB18(1) (always) i LIR IBC rare
BB17 [0017] 1 BB09 0 0 [0E6..0FE)-> *(1) (always) i LIR IBC rare q
BB18 [0018] 6 BB11,BB13,BB14,BB15,BB16,BB17 0 0 [0FE..100) (return) i LIR IBC rare
BB04 [0003] 1 BB03 0 0 [022..029)-> BB07(1) (always) i LIR IBC rare hascall gcsafe
BB05 [0005] 1 BB02 0 0 [02C..02F)-> BB07(1) (always) i LIR IBC rare
---------------------------------------------------------------------------------------------------------------------------------------------------------------------

in the full IR dump, you'll see things like:

------------ BB09 [0009] [04C..04C) -> BB17(0.1428571),BB19(1) (cond), preds={BB07} succs={BB19,BB17}
------------ BB19 [0044] [04C..06A) -> BB11(0.2857143),BB11(0.2857143),BB13(0.1428571),BB14(0.1428571),BB15(0.1428571),BB16(0.1428571) (switch), preds={BB09} succs={BB11,BB13,BB14,BB15,BB16}

BruceForstall added a commit to BruceForstall/runtime that referenced this pull request Mar 14, 2024
This includes various fixes that are being separately PR'ed:
1. dotnet#99744:
Introduce HandleKindDataIsInvariant helper
2. dotnet#99743:
Add basic support for TYP_MASK constants
3. dotnet#99742:
Fix problem with scaling general loop blocks; add dumpers
4. dotnet#99740:
Add edge likelihood dumping; fix one edge likelihood update case
Also:
1. Add support for running JitOptRepeat under JitStress. This is still
over-written by JitOptRepeat being forced on at 4 iterations.
@AndyAyersMS

Copy link
Copy Markdown
Member
  1. Fix a case of likelihood updating in fgReplaceJumpTarget(): in a switch block, when the new target block is already a target of the switch, then there already exists an edge from the switch to the new target. In that case, we were updating the edge dup count, but fgAddRefPred wasn't updating the edge likelihood to add the removed edge likelihood to the existing edge likelihood.

Thanks for fixing this—it sounds exactly like the bug I hit in libraries jitstress in #99628.

Comment on lines +3170 to +3171
JITDUMP("Created new exit " FMT_BB " to replace " FMT_BB " exit for " FMT_LP "\n", newExit->bbNum, exit->bbNum,
loop->GetIndex());

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

optSetWeightForPreheaderOrExit references the block created, so moving its dumping here makes the jitdump look a bit strange I think.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I added the "Canonicalize exit" line above so it's obvious what process is starting when new blocks start getting created -- before I was confused at why new blocks were getting created. So moving this line to the end "brackets" the process by telling you what happened when it's done. E.g.,

Canonicalize exit BB15 for L00 to have only loop predecessors
New Basic Block BB18 [0116] created.
Setting edge weights for BB18 -> BB15 to [0 .. 3.402823e+38]
setting likelihood of BB18 -> BB15 to 1
Estimated likelihood BB04 -> BB18 to be 0.6585233 (contribution: 35.62623)
Setting edge weights for BB04 -> BB18 to [35.62623 .. 35.62623]
Estimated likelihood BB05 -> BB18 to be 0.3993941 (contribution: 10.80365)
Setting edge weights for BB05 -> BB18 to [10.80365 .. 10.80365]
Setting edge weights for BB18 -> BB15 to [46.42988 .. 46.42988]
Created new exit BB18 to replace BB15 exit for L00

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Ok, seems fine -- I think you should change it in optCreatePreheader as well then.

@amanasifkhalidamanasifkhalid 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, thanks!

assert(newEdge->getSourceBlock() == block);
assert(newEdge->getDestinationBlock() == newTarget);

if (newEdge->hasLikelihood() && oldEdge->hasLikelihood())

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.

I wonder if we can start skipping these checks and asserting that the edges have likelihoods already. Once Andy's last PR for propagating likelihoods is merged in, I'll take a look at removing these.

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

No diffs

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

Failures are known or infra.

@BruceForstall
BruceForstall merged commit b4bc0aa into dotnet:mainMar 14, 2024
@BruceForstall
BruceForstall deleted the FixSwitchLikelihoods branch March 14, 2024 16:55
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 14, 2024
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.

4 participants

@BruceForstall@AndyAyersMS@jakobbotsch@amanasifkhalid
, '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 edge likelihood dumping; fix one edge likelihood update case - #99740

Merged
BruceForstall merged 1 commit into
dotnet:mainfrom
BruceForstall:FixSwitchLikelihoods
Mar 14, 2024
Merged

Add edge likelihood dumping; fix one edge likelihood update case#99740
BruceForstall merged 1 commit into
dotnet:mainfrom
BruceForstall:FixSwitchLikelihoods

Conversation

@BruceForstall

Copy link
Copy Markdown
Contributor
  1. Add dumping of edge likelihood numbers to the block table and other block dumping. Examples: BB17(0.143), BB18(1).

Edge likelihood dumping is parameterized in the code, but is currently always enabled.

  1. Update setLikelihood and updateLikelihood to print the previous value of the likelihood that is being updated (if there is a previous value).

  2. Fix a case of likelihood updating in fgReplaceJumpTarget(): in a switch block, when the new target block is already a target of the switch, then there already exists an edge from the switch to the new target. In that case, we were updating the edge dup count, but fgAddRefPred wasn't updating the edge likelihood to add the removed edge likelihood to the existing edge likelihood.

This was found as part of work to fix JitOptRepeat: #94250.

  1. Add natvis debugger support for FlowEdge.

  2. In 'fgDebugCheckOutgoingProfileData()`, if outgoing likelihoods are invalid, print out all the likelihoods of the outgoing edges.

1. Add dumping of edge likelihood numbers to the block table and other
block dumping. Examples: `BB17(0.143)`, `BB18(1)`.
Edge likelihood dumping is parameterized in the code, but is currently
always enabled.
2. Update `setLikelihood` and `updateLikelihood` to print the previous
value of the likelihood that is being updated (if there is a previous value).
3. Fix a case of likelihood updating in `fgReplaceJumpTarget()`: in a switch
block, when the new target block is already a target of the switch, then there
already exists an edge from the switch to the new target. In that case, we were
updating the edge dup count, but `fgAddRefPred` wasn't updating the edge likelihood
to add the removed edge likelihood to the existing edge likelihood.
This was found as part of work to fix JitOptRepeat: dotnet#94250.
4. Add natvis debugger support for FlowEdge.
5. In 'fgDebugCheckOutgoingProfileData()`, if outgoing likelihoods are invalid,
print out all the likelihoods of the outgoing edges.
@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Mar 14, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@amanasifkhalid@AndyAyersMS PTAL
cc @dotnet/jit-contrib

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

Here's a bigger example:

---------------------------------------------------------------------------------------------------------------------------------------------------------------------
BBnum BBid ref try hnd preds weight IBC [IL range] [jump] [EH region] [flags]
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
BB01 [0000] 1 1 250 [000..00E)-> BB06(0),*(1) ( cond ) i LIR IBC
BB02 [0001] 1 BB01 1 250 [00E..01B)-> BB05(0),*(1) ( cond ) i LIR IBC
BB03 [0002] 1 BB02 1 250 [01B..022)-> BB04(0),*(1) ( cond ) i LIR IBC hascall gcsafe
BB06 [0006] 2 BB01,BB03 0 0 [02F..030)-> *(1) (always) i LIR IBC rare q
BB07 [0007] 3 BB04,BB05,BB06 0 0 [030..034)-> BB09(0),*(1) ( cond ) i LIR IBC rare
BB08 [0008] 1 BB07 0 0 [034..04C) (return) i LIR IBC rare
BB09 [0009] 1 BB07 0 0 [04C..04C)-> BB17(0.143),*(1) ( cond ) i LIR IBC rare q
BB19 [0044] 1 BB09 0 0 [04C..06A)-> *(0.286),*(0.286),BB13(0.143),BB14(0.143),BB15(0.143),BB16(0.143) (switch) i LIR IBC rare
BB11 [0043] 2 BB19(2) 0 0 [07D..080)-> BB18(1) (always) i LIR IBC rare
BB13 [0013] 1 BB19 0 0 [094..0A8)-> BB18(1) (always) i LIR IBC rare
BB14 [0014] 1 BB19 0 0 [0A8..0BD)-> BB18(1) (always) i LIR IBC rare
BB15 [0015] 1 BB19 0 0 [0BD..0D1)-> BB18(1) (always) i LIR IBC rare
BB16 [0016] 1 BB19 0 0 [0D1..0E6)-> BB18(1) (always) i LIR IBC rare
BB17 [0017] 1 BB09 0 0 [0E6..0FE)-> *(1) (always) i LIR IBC rare q
BB18 [0018] 6 BB11,BB13,BB14,BB15,BB16,BB17 0 0 [0FE..100) (return) i LIR IBC rare
BB04 [0003] 1 BB03 0 0 [022..029)-> BB07(1) (always) i LIR IBC rare hascall gcsafe
BB05 [0005] 1 BB02 0 0 [02C..02F)-> BB07(1) (always) i LIR IBC rare
---------------------------------------------------------------------------------------------------------------------------------------------------------------------

in the full IR dump, you'll see things like:

------------ BB09 [0009] [04C..04C) -> BB17(0.1428571),BB19(1) (cond), preds={BB07} succs={BB19,BB17}
------------ BB19 [0044] [04C..06A) -> BB11(0.2857143),BB11(0.2857143),BB13(0.1428571),BB14(0.1428571),BB15(0.1428571),BB16(0.1428571) (switch), preds={BB09} succs={BB11,BB13,BB14,BB15,BB16}

BruceForstall added a commit to BruceForstall/runtime that referenced this pull request Mar 14, 2024
This includes various fixes that are being separately PR'ed:
1. dotnet#99744:
Introduce HandleKindDataIsInvariant helper
2. dotnet#99743:
Add basic support for TYP_MASK constants
3. dotnet#99742:
Fix problem with scaling general loop blocks; add dumpers
4. dotnet#99740:
Add edge likelihood dumping; fix one edge likelihood update case
Also:
1. Add support for running JitOptRepeat under JitStress. This is still
over-written by JitOptRepeat being forced on at 4 iterations.
@AndyAyersMS

Copy link
Copy Markdown
Member
  1. Fix a case of likelihood updating in fgReplaceJumpTarget(): in a switch block, when the new target block is already a target of the switch, then there already exists an edge from the switch to the new target. In that case, we were updating the edge dup count, but fgAddRefPred wasn't updating the edge likelihood to add the removed edge likelihood to the existing edge likelihood.

Thanks for fixing this—it sounds exactly like the bug I hit in libraries jitstress in #99628.

Comment on lines +3170 to +3171
JITDUMP("Created new exit " FMT_BB " to replace " FMT_BB " exit for " FMT_LP "\n", newExit->bbNum, exit->bbNum,
loop->GetIndex());

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

optSetWeightForPreheaderOrExit references the block created, so moving its dumping here makes the jitdump look a bit strange I think.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I added the "Canonicalize exit" line above so it's obvious what process is starting when new blocks start getting created -- before I was confused at why new blocks were getting created. So moving this line to the end "brackets" the process by telling you what happened when it's done. E.g.,

Canonicalize exit BB15 for L00 to have only loop predecessors
New Basic Block BB18 [0116] created.
Setting edge weights for BB18 -> BB15 to [0 .. 3.402823e+38]
setting likelihood of BB18 -> BB15 to 1
Estimated likelihood BB04 -> BB18 to be 0.6585233 (contribution: 35.62623)
Setting edge weights for BB04 -> BB18 to [35.62623 .. 35.62623]
Estimated likelihood BB05 -> BB18 to be 0.3993941 (contribution: 10.80365)
Setting edge weights for BB05 -> BB18 to [10.80365 .. 10.80365]
Setting edge weights for BB18 -> BB15 to [46.42988 .. 46.42988]
Created new exit BB18 to replace BB15 exit for L00

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Ok, seems fine -- I think you should change it in optCreatePreheader as well then.

@amanasifkhalidamanasifkhalid 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, thanks!

assert(newEdge->getSourceBlock() == block);
assert(newEdge->getDestinationBlock() == newTarget);

if (newEdge->hasLikelihood() && oldEdge->hasLikelihood())

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.

I wonder if we can start skipping these checks and asserting that the edges have likelihoods already. Once Andy's last PR for propagating likelihoods is merged in, I'll take a look at removing these.

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

No diffs

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

Failures are known or infra.

@BruceForstall
BruceForstall merged commit b4bc0aa into dotnet:mainMar 14, 2024
@BruceForstall
BruceForstall deleted the FixSwitchLikelihoods branch March 14, 2024 16:55
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 14, 2024
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.

4 participants

@BruceForstall@AndyAyersMS@jakobbotsch@amanasifkhalid
, '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 edge likelihood dumping; fix one edge likelihood update case - #99740

Merged
BruceForstall merged 1 commit into
dotnet:mainfrom
BruceForstall:FixSwitchLikelihoods
Mar 14, 2024
Merged

Add edge likelihood dumping; fix one edge likelihood update case#99740
BruceForstall merged 1 commit into
dotnet:mainfrom
BruceForstall:FixSwitchLikelihoods

Conversation

@BruceForstall

Copy link
Copy Markdown
Contributor
  1. Add dumping of edge likelihood numbers to the block table and other block dumping. Examples: BB17(0.143), BB18(1).

Edge likelihood dumping is parameterized in the code, but is currently always enabled.

  1. Update setLikelihood and updateLikelihood to print the previous value of the likelihood that is being updated (if there is a previous value).

  2. Fix a case of likelihood updating in fgReplaceJumpTarget(): in a switch block, when the new target block is already a target of the switch, then there already exists an edge from the switch to the new target. In that case, we were updating the edge dup count, but fgAddRefPred wasn't updating the edge likelihood to add the removed edge likelihood to the existing edge likelihood.

This was found as part of work to fix JitOptRepeat: #94250.

  1. Add natvis debugger support for FlowEdge.

  2. In 'fgDebugCheckOutgoingProfileData()`, if outgoing likelihoods are invalid, print out all the likelihoods of the outgoing edges.

1. Add dumping of edge likelihood numbers to the block table and other
block dumping. Examples: `BB17(0.143)`, `BB18(1)`.
Edge likelihood dumping is parameterized in the code, but is currently
always enabled.
2. Update `setLikelihood` and `updateLikelihood` to print the previous
value of the likelihood that is being updated (if there is a previous value).
3. Fix a case of likelihood updating in `fgReplaceJumpTarget()`: in a switch
block, when the new target block is already a target of the switch, then there
already exists an edge from the switch to the new target. In that case, we were
updating the edge dup count, but `fgAddRefPred` wasn't updating the edge likelihood
to add the removed edge likelihood to the existing edge likelihood.
This was found as part of work to fix JitOptRepeat: dotnet#94250.
4. Add natvis debugger support for FlowEdge.
5. In 'fgDebugCheckOutgoingProfileData()`, if outgoing likelihoods are invalid,
print out all the likelihoods of the outgoing edges.
@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Mar 14, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@amanasifkhalid@AndyAyersMS PTAL
cc @dotnet/jit-contrib

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

Here's a bigger example:

---------------------------------------------------------------------------------------------------------------------------------------------------------------------
BBnum BBid ref try hnd preds weight IBC [IL range] [jump] [EH region] [flags]
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
BB01 [0000] 1 1 250 [000..00E)-> BB06(0),*(1) ( cond ) i LIR IBC
BB02 [0001] 1 BB01 1 250 [00E..01B)-> BB05(0),*(1) ( cond ) i LIR IBC
BB03 [0002] 1 BB02 1 250 [01B..022)-> BB04(0),*(1) ( cond ) i LIR IBC hascall gcsafe
BB06 [0006] 2 BB01,BB03 0 0 [02F..030)-> *(1) (always) i LIR IBC rare q
BB07 [0007] 3 BB04,BB05,BB06 0 0 [030..034)-> BB09(0),*(1) ( cond ) i LIR IBC rare
BB08 [0008] 1 BB07 0 0 [034..04C) (return) i LIR IBC rare
BB09 [0009] 1 BB07 0 0 [04C..04C)-> BB17(0.143),*(1) ( cond ) i LIR IBC rare q
BB19 [0044] 1 BB09 0 0 [04C..06A)-> *(0.286),*(0.286),BB13(0.143),BB14(0.143),BB15(0.143),BB16(0.143) (switch) i LIR IBC rare
BB11 [0043] 2 BB19(2) 0 0 [07D..080)-> BB18(1) (always) i LIR IBC rare
BB13 [0013] 1 BB19 0 0 [094..0A8)-> BB18(1) (always) i LIR IBC rare
BB14 [0014] 1 BB19 0 0 [0A8..0BD)-> BB18(1) (always) i LIR IBC rare
BB15 [0015] 1 BB19 0 0 [0BD..0D1)-> BB18(1) (always) i LIR IBC rare
BB16 [0016] 1 BB19 0 0 [0D1..0E6)-> BB18(1) (always) i LIR IBC rare
BB17 [0017] 1 BB09 0 0 [0E6..0FE)-> *(1) (always) i LIR IBC rare q
BB18 [0018] 6 BB11,BB13,BB14,BB15,BB16,BB17 0 0 [0FE..100) (return) i LIR IBC rare
BB04 [0003] 1 BB03 0 0 [022..029)-> BB07(1) (always) i LIR IBC rare hascall gcsafe
BB05 [0005] 1 BB02 0 0 [02C..02F)-> BB07(1) (always) i LIR IBC rare
---------------------------------------------------------------------------------------------------------------------------------------------------------------------

in the full IR dump, you'll see things like:

------------ BB09 [0009] [04C..04C) -> BB17(0.1428571),BB19(1) (cond), preds={BB07} succs={BB19,BB17}
------------ BB19 [0044] [04C..06A) -> BB11(0.2857143),BB11(0.2857143),BB13(0.1428571),BB14(0.1428571),BB15(0.1428571),BB16(0.1428571) (switch), preds={BB09} succs={BB11,BB13,BB14,BB15,BB16}

BruceForstall added a commit to BruceForstall/runtime that referenced this pull request Mar 14, 2024
This includes various fixes that are being separately PR'ed:
1. dotnet#99744:
Introduce HandleKindDataIsInvariant helper
2. dotnet#99743:
Add basic support for TYP_MASK constants
3. dotnet#99742:
Fix problem with scaling general loop blocks; add dumpers
4. dotnet#99740:
Add edge likelihood dumping; fix one edge likelihood update case
Also:
1. Add support for running JitOptRepeat under JitStress. This is still
over-written by JitOptRepeat being forced on at 4 iterations.
@AndyAyersMS

Copy link
Copy Markdown
Member
  1. Fix a case of likelihood updating in fgReplaceJumpTarget(): in a switch block, when the new target block is already a target of the switch, then there already exists an edge from the switch to the new target. In that case, we were updating the edge dup count, but fgAddRefPred wasn't updating the edge likelihood to add the removed edge likelihood to the existing edge likelihood.

Thanks for fixing this—it sounds exactly like the bug I hit in libraries jitstress in #99628.

Comment on lines +3170 to +3171
JITDUMP("Created new exit " FMT_BB " to replace " FMT_BB " exit for " FMT_LP "\n", newExit->bbNum, exit->bbNum,
loop->GetIndex());

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

optSetWeightForPreheaderOrExit references the block created, so moving its dumping here makes the jitdump look a bit strange I think.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I added the "Canonicalize exit" line above so it's obvious what process is starting when new blocks start getting created -- before I was confused at why new blocks were getting created. So moving this line to the end "brackets" the process by telling you what happened when it's done. E.g.,

Canonicalize exit BB15 for L00 to have only loop predecessors
New Basic Block BB18 [0116] created.
Setting edge weights for BB18 -> BB15 to [0 .. 3.402823e+38]
setting likelihood of BB18 -> BB15 to 1
Estimated likelihood BB04 -> BB18 to be 0.6585233 (contribution: 35.62623)
Setting edge weights for BB04 -> BB18 to [35.62623 .. 35.62623]
Estimated likelihood BB05 -> BB18 to be 0.3993941 (contribution: 10.80365)
Setting edge weights for BB05 -> BB18 to [10.80365 .. 10.80365]
Setting edge weights for BB18 -> BB15 to [46.42988 .. 46.42988]
Created new exit BB18 to replace BB15 exit for L00

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Ok, seems fine -- I think you should change it in optCreatePreheader as well then.

@amanasifkhalidamanasifkhalid 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, thanks!

assert(newEdge->getSourceBlock() == block);
assert(newEdge->getDestinationBlock() == newTarget);

if (newEdge->hasLikelihood() && oldEdge->hasLikelihood())

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.

I wonder if we can start skipping these checks and asserting that the edges have likelihoods already. Once Andy's last PR for propagating likelihoods is merged in, I'll take a look at removing these.

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

No diffs

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

Failures are known or infra.

@BruceForstall
BruceForstall merged commit b4bc0aa into dotnet:mainMar 14, 2024
@BruceForstall
BruceForstall deleted the FixSwitchLikelihoods branch March 14, 2024 16:55
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 14, 2024
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.

4 participants

@BruceForstall@AndyAyersMS@jakobbotsch@amanasifkhalid
, '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 edge likelihood dumping; fix one edge likelihood update case - #99740

Merged
BruceForstall merged 1 commit into
dotnet:mainfrom
BruceForstall:FixSwitchLikelihoods
Mar 14, 2024
Merged

Add edge likelihood dumping; fix one edge likelihood update case#99740
BruceForstall merged 1 commit into
dotnet:mainfrom
BruceForstall:FixSwitchLikelihoods

Conversation

@BruceForstall

Copy link
Copy Markdown
Contributor
  1. Add dumping of edge likelihood numbers to the block table and other block dumping. Examples: BB17(0.143), BB18(1).

Edge likelihood dumping is parameterized in the code, but is currently always enabled.

  1. Update setLikelihood and updateLikelihood to print the previous value of the likelihood that is being updated (if there is a previous value).

  2. Fix a case of likelihood updating in fgReplaceJumpTarget(): in a switch block, when the new target block is already a target of the switch, then there already exists an edge from the switch to the new target. In that case, we were updating the edge dup count, but fgAddRefPred wasn't updating the edge likelihood to add the removed edge likelihood to the existing edge likelihood.

This was found as part of work to fix JitOptRepeat: #94250.

  1. Add natvis debugger support for FlowEdge.

  2. In 'fgDebugCheckOutgoingProfileData()`, if outgoing likelihoods are invalid, print out all the likelihoods of the outgoing edges.

1. Add dumping of edge likelihood numbers to the block table and other
block dumping. Examples: `BB17(0.143)`, `BB18(1)`.
Edge likelihood dumping is parameterized in the code, but is currently
always enabled.
2. Update `setLikelihood` and `updateLikelihood` to print the previous
value of the likelihood that is being updated (if there is a previous value).
3. Fix a case of likelihood updating in `fgReplaceJumpTarget()`: in a switch
block, when the new target block is already a target of the switch, then there
already exists an edge from the switch to the new target. In that case, we were
updating the edge dup count, but `fgAddRefPred` wasn't updating the edge likelihood
to add the removed edge likelihood to the existing edge likelihood.
This was found as part of work to fix JitOptRepeat: dotnet#94250.
4. Add natvis debugger support for FlowEdge.
5. In 'fgDebugCheckOutgoingProfileData()`, if outgoing likelihoods are invalid,
print out all the likelihoods of the outgoing edges.
@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Mar 14, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@amanasifkhalid@AndyAyersMS PTAL
cc @dotnet/jit-contrib

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

Here's a bigger example:

---------------------------------------------------------------------------------------------------------------------------------------------------------------------
BBnum BBid ref try hnd preds weight IBC [IL range] [jump] [EH region] [flags]
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
BB01 [0000] 1 1 250 [000..00E)-> BB06(0),*(1) ( cond ) i LIR IBC
BB02 [0001] 1 BB01 1 250 [00E..01B)-> BB05(0),*(1) ( cond ) i LIR IBC
BB03 [0002] 1 BB02 1 250 [01B..022)-> BB04(0),*(1) ( cond ) i LIR IBC hascall gcsafe
BB06 [0006] 2 BB01,BB03 0 0 [02F..030)-> *(1) (always) i LIR IBC rare q
BB07 [0007] 3 BB04,BB05,BB06 0 0 [030..034)-> BB09(0),*(1) ( cond ) i LIR IBC rare
BB08 [0008] 1 BB07 0 0 [034..04C) (return) i LIR IBC rare
BB09 [0009] 1 BB07 0 0 [04C..04C)-> BB17(0.143),*(1) ( cond ) i LIR IBC rare q
BB19 [0044] 1 BB09 0 0 [04C..06A)-> *(0.286),*(0.286),BB13(0.143),BB14(0.143),BB15(0.143),BB16(0.143) (switch) i LIR IBC rare
BB11 [0043] 2 BB19(2) 0 0 [07D..080)-> BB18(1) (always) i LIR IBC rare
BB13 [0013] 1 BB19 0 0 [094..0A8)-> BB18(1) (always) i LIR IBC rare
BB14 [0014] 1 BB19 0 0 [0A8..0BD)-> BB18(1) (always) i LIR IBC rare
BB15 [0015] 1 BB19 0 0 [0BD..0D1)-> BB18(1) (always) i LIR IBC rare
BB16 [0016] 1 BB19 0 0 [0D1..0E6)-> BB18(1) (always) i LIR IBC rare
BB17 [0017] 1 BB09 0 0 [0E6..0FE)-> *(1) (always) i LIR IBC rare q
BB18 [0018] 6 BB11,BB13,BB14,BB15,BB16,BB17 0 0 [0FE..100) (return) i LIR IBC rare
BB04 [0003] 1 BB03 0 0 [022..029)-> BB07(1) (always) i LIR IBC rare hascall gcsafe
BB05 [0005] 1 BB02 0 0 [02C..02F)-> BB07(1) (always) i LIR IBC rare
---------------------------------------------------------------------------------------------------------------------------------------------------------------------

in the full IR dump, you'll see things like:

------------ BB09 [0009] [04C..04C) -> BB17(0.1428571),BB19(1) (cond), preds={BB07} succs={BB19,BB17}
------------ BB19 [0044] [04C..06A) -> BB11(0.2857143),BB11(0.2857143),BB13(0.1428571),BB14(0.1428571),BB15(0.1428571),BB16(0.1428571) (switch), preds={BB09} succs={BB11,BB13,BB14,BB15,BB16}

BruceForstall added a commit to BruceForstall/runtime that referenced this pull request Mar 14, 2024
This includes various fixes that are being separately PR'ed:
1. dotnet#99744:
Introduce HandleKindDataIsInvariant helper
2. dotnet#99743:
Add basic support for TYP_MASK constants
3. dotnet#99742:
Fix problem with scaling general loop blocks; add dumpers
4. dotnet#99740:
Add edge likelihood dumping; fix one edge likelihood update case
Also:
1. Add support for running JitOptRepeat under JitStress. This is still
over-written by JitOptRepeat being forced on at 4 iterations.
@AndyAyersMS

Copy link
Copy Markdown
Member
  1. Fix a case of likelihood updating in fgReplaceJumpTarget(): in a switch block, when the new target block is already a target of the switch, then there already exists an edge from the switch to the new target. In that case, we were updating the edge dup count, but fgAddRefPred wasn't updating the edge likelihood to add the removed edge likelihood to the existing edge likelihood.

Thanks for fixing this—it sounds exactly like the bug I hit in libraries jitstress in #99628.

Comment on lines +3170 to +3171
JITDUMP("Created new exit " FMT_BB " to replace " FMT_BB " exit for " FMT_LP "\n", newExit->bbNum, exit->bbNum,
loop->GetIndex());

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

optSetWeightForPreheaderOrExit references the block created, so moving its dumping here makes the jitdump look a bit strange I think.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I added the "Canonicalize exit" line above so it's obvious what process is starting when new blocks start getting created -- before I was confused at why new blocks were getting created. So moving this line to the end "brackets" the process by telling you what happened when it's done. E.g.,

Canonicalize exit BB15 for L00 to have only loop predecessors
New Basic Block BB18 [0116] created.
Setting edge weights for BB18 -> BB15 to [0 .. 3.402823e+38]
setting likelihood of BB18 -> BB15 to 1
Estimated likelihood BB04 -> BB18 to be 0.6585233 (contribution: 35.62623)
Setting edge weights for BB04 -> BB18 to [35.62623 .. 35.62623]
Estimated likelihood BB05 -> BB18 to be 0.3993941 (contribution: 10.80365)
Setting edge weights for BB05 -> BB18 to [10.80365 .. 10.80365]
Setting edge weights for BB18 -> BB15 to [46.42988 .. 46.42988]
Created new exit BB18 to replace BB15 exit for L00

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Ok, seems fine -- I think you should change it in optCreatePreheader as well then.

@amanasifkhalidamanasifkhalid 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, thanks!

assert(newEdge->getSourceBlock() == block);
assert(newEdge->getDestinationBlock() == newTarget);

if (newEdge->hasLikelihood() && oldEdge->hasLikelihood())

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.

I wonder if we can start skipping these checks and asserting that the edges have likelihoods already. Once Andy's last PR for propagating likelihoods is merged in, I'll take a look at removing these.

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

No diffs

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

Failures are known or infra.

@BruceForstall
BruceForstall merged commit b4bc0aa into dotnet:mainMar 14, 2024
@BruceForstall
BruceForstall deleted the FixSwitchLikelihoods branch March 14, 2024 16:55
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 14, 2024
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.

4 participants

@BruceForstall@AndyAyersMS@jakobbotsch@amanasifkhalid
, '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 edge likelihood dumping; fix one edge likelihood update case - #99740

Merged
BruceForstall merged 1 commit into
dotnet:mainfrom
BruceForstall:FixSwitchLikelihoods
Mar 14, 2024
Merged

Add edge likelihood dumping; fix one edge likelihood update case#99740
BruceForstall merged 1 commit into
dotnet:mainfrom
BruceForstall:FixSwitchLikelihoods

Conversation

@BruceForstall

Copy link
Copy Markdown
Contributor
  1. Add dumping of edge likelihood numbers to the block table and other block dumping. Examples: BB17(0.143), BB18(1).

Edge likelihood dumping is parameterized in the code, but is currently always enabled.

  1. Update setLikelihood and updateLikelihood to print the previous value of the likelihood that is being updated (if there is a previous value).

  2. Fix a case of likelihood updating in fgReplaceJumpTarget(): in a switch block, when the new target block is already a target of the switch, then there already exists an edge from the switch to the new target. In that case, we were updating the edge dup count, but fgAddRefPred wasn't updating the edge likelihood to add the removed edge likelihood to the existing edge likelihood.

This was found as part of work to fix JitOptRepeat: #94250.

  1. Add natvis debugger support for FlowEdge.

  2. In 'fgDebugCheckOutgoingProfileData()`, if outgoing likelihoods are invalid, print out all the likelihoods of the outgoing edges.

1. Add dumping of edge likelihood numbers to the block table and other
block dumping. Examples: `BB17(0.143)`, `BB18(1)`.
Edge likelihood dumping is parameterized in the code, but is currently
always enabled.
2. Update `setLikelihood` and `updateLikelihood` to print the previous
value of the likelihood that is being updated (if there is a previous value).
3. Fix a case of likelihood updating in `fgReplaceJumpTarget()`: in a switch
block, when the new target block is already a target of the switch, then there
already exists an edge from the switch to the new target. In that case, we were
updating the edge dup count, but `fgAddRefPred` wasn't updating the edge likelihood
to add the removed edge likelihood to the existing edge likelihood.
This was found as part of work to fix JitOptRepeat: dotnet#94250.
4. Add natvis debugger support for FlowEdge.
5. In 'fgDebugCheckOutgoingProfileData()`, if outgoing likelihoods are invalid,
print out all the likelihoods of the outgoing edges.
@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Mar 14, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@amanasifkhalid@AndyAyersMS PTAL
cc @dotnet/jit-contrib

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

Here's a bigger example:

---------------------------------------------------------------------------------------------------------------------------------------------------------------------
BBnum BBid ref try hnd preds weight IBC [IL range] [jump] [EH region] [flags]
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
BB01 [0000] 1 1 250 [000..00E)-> BB06(0),*(1) ( cond ) i LIR IBC
BB02 [0001] 1 BB01 1 250 [00E..01B)-> BB05(0),*(1) ( cond ) i LIR IBC
BB03 [0002] 1 BB02 1 250 [01B..022)-> BB04(0),*(1) ( cond ) i LIR IBC hascall gcsafe
BB06 [0006] 2 BB01,BB03 0 0 [02F..030)-> *(1) (always) i LIR IBC rare q
BB07 [0007] 3 BB04,BB05,BB06 0 0 [030..034)-> BB09(0),*(1) ( cond ) i LIR IBC rare
BB08 [0008] 1 BB07 0 0 [034..04C) (return) i LIR IBC rare
BB09 [0009] 1 BB07 0 0 [04C..04C)-> BB17(0.143),*(1) ( cond ) i LIR IBC rare q
BB19 [0044] 1 BB09 0 0 [04C..06A)-> *(0.286),*(0.286),BB13(0.143),BB14(0.143),BB15(0.143),BB16(0.143) (switch) i LIR IBC rare
BB11 [0043] 2 BB19(2) 0 0 [07D..080)-> BB18(1) (always) i LIR IBC rare
BB13 [0013] 1 BB19 0 0 [094..0A8)-> BB18(1) (always) i LIR IBC rare
BB14 [0014] 1 BB19 0 0 [0A8..0BD)-> BB18(1) (always) i LIR IBC rare
BB15 [0015] 1 BB19 0 0 [0BD..0D1)-> BB18(1) (always) i LIR IBC rare
BB16 [0016] 1 BB19 0 0 [0D1..0E6)-> BB18(1) (always) i LIR IBC rare
BB17 [0017] 1 BB09 0 0 [0E6..0FE)-> *(1) (always) i LIR IBC rare q
BB18 [0018] 6 BB11,BB13,BB14,BB15,BB16,BB17 0 0 [0FE..100) (return) i LIR IBC rare
BB04 [0003] 1 BB03 0 0 [022..029)-> BB07(1) (always) i LIR IBC rare hascall gcsafe
BB05 [0005] 1 BB02 0 0 [02C..02F)-> BB07(1) (always) i LIR IBC rare
---------------------------------------------------------------------------------------------------------------------------------------------------------------------

in the full IR dump, you'll see things like:

------------ BB09 [0009] [04C..04C) -> BB17(0.1428571),BB19(1) (cond), preds={BB07} succs={BB19,BB17}
------------ BB19 [0044] [04C..06A) -> BB11(0.2857143),BB11(0.2857143),BB13(0.1428571),BB14(0.1428571),BB15(0.1428571),BB16(0.1428571) (switch), preds={BB09} succs={BB11,BB13,BB14,BB15,BB16}

BruceForstall added a commit to BruceForstall/runtime that referenced this pull request Mar 14, 2024
This includes various fixes that are being separately PR'ed:
1. dotnet#99744:
Introduce HandleKindDataIsInvariant helper
2. dotnet#99743:
Add basic support for TYP_MASK constants
3. dotnet#99742:
Fix problem with scaling general loop blocks; add dumpers
4. dotnet#99740:
Add edge likelihood dumping; fix one edge likelihood update case
Also:
1. Add support for running JitOptRepeat under JitStress. This is still
over-written by JitOptRepeat being forced on at 4 iterations.
@AndyAyersMS

Copy link
Copy Markdown
Member
  1. Fix a case of likelihood updating in fgReplaceJumpTarget(): in a switch block, when the new target block is already a target of the switch, then there already exists an edge from the switch to the new target. In that case, we were updating the edge dup count, but fgAddRefPred wasn't updating the edge likelihood to add the removed edge likelihood to the existing edge likelihood.

Thanks for fixing this—it sounds exactly like the bug I hit in libraries jitstress in #99628.

Comment on lines +3170 to +3171
JITDUMP("Created new exit " FMT_BB " to replace " FMT_BB " exit for " FMT_LP "\n", newExit->bbNum, exit->bbNum,
loop->GetIndex());

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

optSetWeightForPreheaderOrExit references the block created, so moving its dumping here makes the jitdump look a bit strange I think.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I added the "Canonicalize exit" line above so it's obvious what process is starting when new blocks start getting created -- before I was confused at why new blocks were getting created. So moving this line to the end "brackets" the process by telling you what happened when it's done. E.g.,

Canonicalize exit BB15 for L00 to have only loop predecessors
New Basic Block BB18 [0116] created.
Setting edge weights for BB18 -> BB15 to [0 .. 3.402823e+38]
setting likelihood of BB18 -> BB15 to 1
Estimated likelihood BB04 -> BB18 to be 0.6585233 (contribution: 35.62623)
Setting edge weights for BB04 -> BB18 to [35.62623 .. 35.62623]
Estimated likelihood BB05 -> BB18 to be 0.3993941 (contribution: 10.80365)
Setting edge weights for BB05 -> BB18 to [10.80365 .. 10.80365]
Setting edge weights for BB18 -> BB15 to [46.42988 .. 46.42988]
Created new exit BB18 to replace BB15 exit for L00

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Ok, seems fine -- I think you should change it in optCreatePreheader as well then.

@amanasifkhalidamanasifkhalid 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, thanks!

assert(newEdge->getSourceBlock() == block);
assert(newEdge->getDestinationBlock() == newTarget);

if (newEdge->hasLikelihood() && oldEdge->hasLikelihood())

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.

I wonder if we can start skipping these checks and asserting that the edges have likelihoods already. Once Andy's last PR for propagating likelihoods is merged in, I'll take a look at removing these.

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

No diffs

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

Failures are known or infra.

@BruceForstall
BruceForstall merged commit b4bc0aa into dotnet:mainMar 14, 2024
@BruceForstall
BruceForstall deleted the FixSwitchLikelihoods branch March 14, 2024 16:55
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 14, 2024
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.

4 participants

@BruceForstall@AndyAyersMS@jakobbotsch@amanasifkhalid
, '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 edge likelihood dumping; fix one edge likelihood update case - #99740

Merged
BruceForstall merged 1 commit into
dotnet:mainfrom
BruceForstall:FixSwitchLikelihoods
Mar 14, 2024
Merged

Add edge likelihood dumping; fix one edge likelihood update case#99740
BruceForstall merged 1 commit into
dotnet:mainfrom
BruceForstall:FixSwitchLikelihoods

Conversation

@BruceForstall

Copy link
Copy Markdown
Contributor
  1. Add dumping of edge likelihood numbers to the block table and other block dumping. Examples: BB17(0.143), BB18(1).

Edge likelihood dumping is parameterized in the code, but is currently always enabled.

  1. Update setLikelihood and updateLikelihood to print the previous value of the likelihood that is being updated (if there is a previous value).

  2. Fix a case of likelihood updating in fgReplaceJumpTarget(): in a switch block, when the new target block is already a target of the switch, then there already exists an edge from the switch to the new target. In that case, we were updating the edge dup count, but fgAddRefPred wasn't updating the edge likelihood to add the removed edge likelihood to the existing edge likelihood.

This was found as part of work to fix JitOptRepeat: #94250.

  1. Add natvis debugger support for FlowEdge.

  2. In 'fgDebugCheckOutgoingProfileData()`, if outgoing likelihoods are invalid, print out all the likelihoods of the outgoing edges.

1. Add dumping of edge likelihood numbers to the block table and other
block dumping. Examples: `BB17(0.143)`, `BB18(1)`.
Edge likelihood dumping is parameterized in the code, but is currently
always enabled.
2. Update `setLikelihood` and `updateLikelihood` to print the previous
value of the likelihood that is being updated (if there is a previous value).
3. Fix a case of likelihood updating in `fgReplaceJumpTarget()`: in a switch
block, when the new target block is already a target of the switch, then there
already exists an edge from the switch to the new target. In that case, we were
updating the edge dup count, but `fgAddRefPred` wasn't updating the edge likelihood
to add the removed edge likelihood to the existing edge likelihood.
This was found as part of work to fix JitOptRepeat: dotnet#94250.
4. Add natvis debugger support for FlowEdge.
5. In 'fgDebugCheckOutgoingProfileData()`, if outgoing likelihoods are invalid,
print out all the likelihoods of the outgoing edges.
@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Mar 14, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@amanasifkhalid@AndyAyersMS PTAL
cc @dotnet/jit-contrib

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

Here's a bigger example:

---------------------------------------------------------------------------------------------------------------------------------------------------------------------
BBnum BBid ref try hnd preds weight IBC [IL range] [jump] [EH region] [flags]
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
BB01 [0000] 1 1 250 [000..00E)-> BB06(0),*(1) ( cond ) i LIR IBC
BB02 [0001] 1 BB01 1 250 [00E..01B)-> BB05(0),*(1) ( cond ) i LIR IBC
BB03 [0002] 1 BB02 1 250 [01B..022)-> BB04(0),*(1) ( cond ) i LIR IBC hascall gcsafe
BB06 [0006] 2 BB01,BB03 0 0 [02F..030)-> *(1) (always) i LIR IBC rare q
BB07 [0007] 3 BB04,BB05,BB06 0 0 [030..034)-> BB09(0),*(1) ( cond ) i LIR IBC rare
BB08 [0008] 1 BB07 0 0 [034..04C) (return) i LIR IBC rare
BB09 [0009] 1 BB07 0 0 [04C..04C)-> BB17(0.143),*(1) ( cond ) i LIR IBC rare q
BB19 [0044] 1 BB09 0 0 [04C..06A)-> *(0.286),*(0.286),BB13(0.143),BB14(0.143),BB15(0.143),BB16(0.143) (switch) i LIR IBC rare
BB11 [0043] 2 BB19(2) 0 0 [07D..080)-> BB18(1) (always) i LIR IBC rare
BB13 [0013] 1 BB19 0 0 [094..0A8)-> BB18(1) (always) i LIR IBC rare
BB14 [0014] 1 BB19 0 0 [0A8..0BD)-> BB18(1) (always) i LIR IBC rare
BB15 [0015] 1 BB19 0 0 [0BD..0D1)-> BB18(1) (always) i LIR IBC rare
BB16 [0016] 1 BB19 0 0 [0D1..0E6)-> BB18(1) (always) i LIR IBC rare
BB17 [0017] 1 BB09 0 0 [0E6..0FE)-> *(1) (always) i LIR IBC rare q
BB18 [0018] 6 BB11,BB13,BB14,BB15,BB16,BB17 0 0 [0FE..100) (return) i LIR IBC rare
BB04 [0003] 1 BB03 0 0 [022..029)-> BB07(1) (always) i LIR IBC rare hascall gcsafe
BB05 [0005] 1 BB02 0 0 [02C..02F)-> BB07(1) (always) i LIR IBC rare
---------------------------------------------------------------------------------------------------------------------------------------------------------------------

in the full IR dump, you'll see things like:

------------ BB09 [0009] [04C..04C) -> BB17(0.1428571),BB19(1) (cond), preds={BB07} succs={BB19,BB17}
------------ BB19 [0044] [04C..06A) -> BB11(0.2857143),BB11(0.2857143),BB13(0.1428571),BB14(0.1428571),BB15(0.1428571),BB16(0.1428571) (switch), preds={BB09} succs={BB11,BB13,BB14,BB15,BB16}

BruceForstall added a commit to BruceForstall/runtime that referenced this pull request Mar 14, 2024
This includes various fixes that are being separately PR'ed:
1. dotnet#99744:
Introduce HandleKindDataIsInvariant helper
2. dotnet#99743:
Add basic support for TYP_MASK constants
3. dotnet#99742:
Fix problem with scaling general loop blocks; add dumpers
4. dotnet#99740:
Add edge likelihood dumping; fix one edge likelihood update case
Also:
1. Add support for running JitOptRepeat under JitStress. This is still
over-written by JitOptRepeat being forced on at 4 iterations.
@AndyAyersMS

Copy link
Copy Markdown
Member
  1. Fix a case of likelihood updating in fgReplaceJumpTarget(): in a switch block, when the new target block is already a target of the switch, then there already exists an edge from the switch to the new target. In that case, we were updating the edge dup count, but fgAddRefPred wasn't updating the edge likelihood to add the removed edge likelihood to the existing edge likelihood.

Thanks for fixing this—it sounds exactly like the bug I hit in libraries jitstress in #99628.

Comment on lines +3170 to +3171
JITDUMP("Created new exit " FMT_BB " to replace " FMT_BB " exit for " FMT_LP "\n", newExit->bbNum, exit->bbNum,
loop->GetIndex());

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

optSetWeightForPreheaderOrExit references the block created, so moving its dumping here makes the jitdump look a bit strange I think.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I added the "Canonicalize exit" line above so it's obvious what process is starting when new blocks start getting created -- before I was confused at why new blocks were getting created. So moving this line to the end "brackets" the process by telling you what happened when it's done. E.g.,

Canonicalize exit BB15 for L00 to have only loop predecessors
New Basic Block BB18 [0116] created.
Setting edge weights for BB18 -> BB15 to [0 .. 3.402823e+38]
setting likelihood of BB18 -> BB15 to 1
Estimated likelihood BB04 -> BB18 to be 0.6585233 (contribution: 35.62623)
Setting edge weights for BB04 -> BB18 to [35.62623 .. 35.62623]
Estimated likelihood BB05 -> BB18 to be 0.3993941 (contribution: 10.80365)
Setting edge weights for BB05 -> BB18 to [10.80365 .. 10.80365]
Setting edge weights for BB18 -> BB15 to [46.42988 .. 46.42988]
Created new exit BB18 to replace BB15 exit for L00

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Ok, seems fine -- I think you should change it in optCreatePreheader as well then.

@amanasifkhalidamanasifkhalid 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, thanks!

assert(newEdge->getSourceBlock() == block);
assert(newEdge->getDestinationBlock() == newTarget);

if (newEdge->hasLikelihood() && oldEdge->hasLikelihood())

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.

I wonder if we can start skipping these checks and asserting that the edges have likelihoods already. Once Andy's last PR for propagating likelihoods is merged in, I'll take a look at removing these.

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

No diffs

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

Failures are known or infra.

@BruceForstall
BruceForstall merged commit b4bc0aa into dotnet:mainMar 14, 2024
@BruceForstall
BruceForstall deleted the FixSwitchLikelihoods branch March 14, 2024 16:55
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 14, 2024
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.

4 participants

@BruceForstall@AndyAyersMS@jakobbotsch@amanasifkhalid
, '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 edge likelihood dumping; fix one edge likelihood update case - #99740

Merged
BruceForstall merged 1 commit into
dotnet:mainfrom
BruceForstall:FixSwitchLikelihoods
Mar 14, 2024
Merged

Add edge likelihood dumping; fix one edge likelihood update case#99740
BruceForstall merged 1 commit into
dotnet:mainfrom
BruceForstall:FixSwitchLikelihoods

Conversation

@BruceForstall

Copy link
Copy Markdown
Contributor
  1. Add dumping of edge likelihood numbers to the block table and other block dumping. Examples: BB17(0.143), BB18(1).

Edge likelihood dumping is parameterized in the code, but is currently always enabled.

  1. Update setLikelihood and updateLikelihood to print the previous value of the likelihood that is being updated (if there is a previous value).

  2. Fix a case of likelihood updating in fgReplaceJumpTarget(): in a switch block, when the new target block is already a target of the switch, then there already exists an edge from the switch to the new target. In that case, we were updating the edge dup count, but fgAddRefPred wasn't updating the edge likelihood to add the removed edge likelihood to the existing edge likelihood.

This was found as part of work to fix JitOptRepeat: #94250.

  1. Add natvis debugger support for FlowEdge.

  2. In 'fgDebugCheckOutgoingProfileData()`, if outgoing likelihoods are invalid, print out all the likelihoods of the outgoing edges.

1. Add dumping of edge likelihood numbers to the block table and other
block dumping. Examples: `BB17(0.143)`, `BB18(1)`.
Edge likelihood dumping is parameterized in the code, but is currently
always enabled.
2. Update `setLikelihood` and `updateLikelihood` to print the previous
value of the likelihood that is being updated (if there is a previous value).
3. Fix a case of likelihood updating in `fgReplaceJumpTarget()`: in a switch
block, when the new target block is already a target of the switch, then there
already exists an edge from the switch to the new target. In that case, we were
updating the edge dup count, but `fgAddRefPred` wasn't updating the edge likelihood
to add the removed edge likelihood to the existing edge likelihood.
This was found as part of work to fix JitOptRepeat: dotnet#94250.
4. Add natvis debugger support for FlowEdge.
5. In 'fgDebugCheckOutgoingProfileData()`, if outgoing likelihoods are invalid,
print out all the likelihoods of the outgoing edges.
@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Mar 14, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@amanasifkhalid@AndyAyersMS PTAL
cc @dotnet/jit-contrib

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

Here's a bigger example:

---------------------------------------------------------------------------------------------------------------------------------------------------------------------
BBnum BBid ref try hnd preds weight IBC [IL range] [jump] [EH region] [flags]
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
BB01 [0000] 1 1 250 [000..00E)-> BB06(0),*(1) ( cond ) i LIR IBC
BB02 [0001] 1 BB01 1 250 [00E..01B)-> BB05(0),*(1) ( cond ) i LIR IBC
BB03 [0002] 1 BB02 1 250 [01B..022)-> BB04(0),*(1) ( cond ) i LIR IBC hascall gcsafe
BB06 [0006] 2 BB01,BB03 0 0 [02F..030)-> *(1) (always) i LIR IBC rare q
BB07 [0007] 3 BB04,BB05,BB06 0 0 [030..034)-> BB09(0),*(1) ( cond ) i LIR IBC rare
BB08 [0008] 1 BB07 0 0 [034..04C) (return) i LIR IBC rare
BB09 [0009] 1 BB07 0 0 [04C..04C)-> BB17(0.143),*(1) ( cond ) i LIR IBC rare q
BB19 [0044] 1 BB09 0 0 [04C..06A)-> *(0.286),*(0.286),BB13(0.143),BB14(0.143),BB15(0.143),BB16(0.143) (switch) i LIR IBC rare
BB11 [0043] 2 BB19(2) 0 0 [07D..080)-> BB18(1) (always) i LIR IBC rare
BB13 [0013] 1 BB19 0 0 [094..0A8)-> BB18(1) (always) i LIR IBC rare
BB14 [0014] 1 BB19 0 0 [0A8..0BD)-> BB18(1) (always) i LIR IBC rare
BB15 [0015] 1 BB19 0 0 [0BD..0D1)-> BB18(1) (always) i LIR IBC rare
BB16 [0016] 1 BB19 0 0 [0D1..0E6)-> BB18(1) (always) i LIR IBC rare
BB17 [0017] 1 BB09 0 0 [0E6..0FE)-> *(1) (always) i LIR IBC rare q
BB18 [0018] 6 BB11,BB13,BB14,BB15,BB16,BB17 0 0 [0FE..100) (return) i LIR IBC rare
BB04 [0003] 1 BB03 0 0 [022..029)-> BB07(1) (always) i LIR IBC rare hascall gcsafe
BB05 [0005] 1 BB02 0 0 [02C..02F)-> BB07(1) (always) i LIR IBC rare
---------------------------------------------------------------------------------------------------------------------------------------------------------------------

in the full IR dump, you'll see things like:

------------ BB09 [0009] [04C..04C) -> BB17(0.1428571),BB19(1) (cond), preds={BB07} succs={BB19,BB17}
------------ BB19 [0044] [04C..06A) -> BB11(0.2857143),BB11(0.2857143),BB13(0.1428571),BB14(0.1428571),BB15(0.1428571),BB16(0.1428571) (switch), preds={BB09} succs={BB11,BB13,BB14,BB15,BB16}

BruceForstall added a commit to BruceForstall/runtime that referenced this pull request Mar 14, 2024
This includes various fixes that are being separately PR'ed:
1. dotnet#99744:
Introduce HandleKindDataIsInvariant helper
2. dotnet#99743:
Add basic support for TYP_MASK constants
3. dotnet#99742:
Fix problem with scaling general loop blocks; add dumpers
4. dotnet#99740:
Add edge likelihood dumping; fix one edge likelihood update case
Also:
1. Add support for running JitOptRepeat under JitStress. This is still
over-written by JitOptRepeat being forced on at 4 iterations.
@AndyAyersMS

Copy link
Copy Markdown
Member
  1. Fix a case of likelihood updating in fgReplaceJumpTarget(): in a switch block, when the new target block is already a target of the switch, then there already exists an edge from the switch to the new target. In that case, we were updating the edge dup count, but fgAddRefPred wasn't updating the edge likelihood to add the removed edge likelihood to the existing edge likelihood.

Thanks for fixing this—it sounds exactly like the bug I hit in libraries jitstress in #99628.

Comment on lines +3170 to +3171
JITDUMP("Created new exit " FMT_BB " to replace " FMT_BB " exit for " FMT_LP "\n", newExit->bbNum, exit->bbNum,
loop->GetIndex());

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

optSetWeightForPreheaderOrExit references the block created, so moving its dumping here makes the jitdump look a bit strange I think.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I added the "Canonicalize exit" line above so it's obvious what process is starting when new blocks start getting created -- before I was confused at why new blocks were getting created. So moving this line to the end "brackets" the process by telling you what happened when it's done. E.g.,

Canonicalize exit BB15 for L00 to have only loop predecessors
New Basic Block BB18 [0116] created.
Setting edge weights for BB18 -> BB15 to [0 .. 3.402823e+38]
setting likelihood of BB18 -> BB15 to 1
Estimated likelihood BB04 -> BB18 to be 0.6585233 (contribution: 35.62623)
Setting edge weights for BB04 -> BB18 to [35.62623 .. 35.62623]
Estimated likelihood BB05 -> BB18 to be 0.3993941 (contribution: 10.80365)
Setting edge weights for BB05 -> BB18 to [10.80365 .. 10.80365]
Setting edge weights for BB18 -> BB15 to [46.42988 .. 46.42988]
Created new exit BB18 to replace BB15 exit for L00

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Ok, seems fine -- I think you should change it in optCreatePreheader as well then.

@amanasifkhalidamanasifkhalid 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, thanks!

assert(newEdge->getSourceBlock() == block);
assert(newEdge->getDestinationBlock() == newTarget);

if (newEdge->hasLikelihood() && oldEdge->hasLikelihood())

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.

I wonder if we can start skipping these checks and asserting that the edges have likelihoods already. Once Andy's last PR for propagating likelihoods is merged in, I'll take a look at removing these.

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

No diffs

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

Failures are known or infra.

@BruceForstall
BruceForstall merged commit b4bc0aa into dotnet:mainMar 14, 2024
@BruceForstall
BruceForstall deleted the FixSwitchLikelihoods branch March 14, 2024 16:55
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 14, 2024
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.

4 participants

@BruceForstall@AndyAyersMS@jakobbotsch@amanasifkhalid
, '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 edge likelihood dumping; fix one edge likelihood update case - #99740

Merged
BruceForstall merged 1 commit into
dotnet:mainfrom
BruceForstall:FixSwitchLikelihoods
Mar 14, 2024
Merged

Add edge likelihood dumping; fix one edge likelihood update case#99740
BruceForstall merged 1 commit into
dotnet:mainfrom
BruceForstall:FixSwitchLikelihoods

Conversation

@BruceForstall

Copy link
Copy Markdown
Contributor
  1. Add dumping of edge likelihood numbers to the block table and other block dumping. Examples: BB17(0.143), BB18(1).

Edge likelihood dumping is parameterized in the code, but is currently always enabled.

  1. Update setLikelihood and updateLikelihood to print the previous value of the likelihood that is being updated (if there is a previous value).

  2. Fix a case of likelihood updating in fgReplaceJumpTarget(): in a switch block, when the new target block is already a target of the switch, then there already exists an edge from the switch to the new target. In that case, we were updating the edge dup count, but fgAddRefPred wasn't updating the edge likelihood to add the removed edge likelihood to the existing edge likelihood.

This was found as part of work to fix JitOptRepeat: #94250.

  1. Add natvis debugger support for FlowEdge.

  2. In 'fgDebugCheckOutgoingProfileData()`, if outgoing likelihoods are invalid, print out all the likelihoods of the outgoing edges.

1. Add dumping of edge likelihood numbers to the block table and other
block dumping. Examples: `BB17(0.143)`, `BB18(1)`.
Edge likelihood dumping is parameterized in the code, but is currently
always enabled.
2. Update `setLikelihood` and `updateLikelihood` to print the previous
value of the likelihood that is being updated (if there is a previous value).
3. Fix a case of likelihood updating in `fgReplaceJumpTarget()`: in a switch
block, when the new target block is already a target of the switch, then there
already exists an edge from the switch to the new target. In that case, we were
updating the edge dup count, but `fgAddRefPred` wasn't updating the edge likelihood
to add the removed edge likelihood to the existing edge likelihood.
This was found as part of work to fix JitOptRepeat: dotnet#94250.
4. Add natvis debugger support for FlowEdge.
5. In 'fgDebugCheckOutgoingProfileData()`, if outgoing likelihoods are invalid,
print out all the likelihoods of the outgoing edges.
@ghostghost added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Mar 14, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

@amanasifkhalid@AndyAyersMS PTAL
cc @dotnet/jit-contrib

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

Here's a bigger example:

---------------------------------------------------------------------------------------------------------------------------------------------------------------------
BBnum BBid ref try hnd preds weight IBC [IL range] [jump] [EH region] [flags]
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
BB01 [0000] 1 1 250 [000..00E)-> BB06(0),*(1) ( cond ) i LIR IBC
BB02 [0001] 1 BB01 1 250 [00E..01B)-> BB05(0),*(1) ( cond ) i LIR IBC
BB03 [0002] 1 BB02 1 250 [01B..022)-> BB04(0),*(1) ( cond ) i LIR IBC hascall gcsafe
BB06 [0006] 2 BB01,BB03 0 0 [02F..030)-> *(1) (always) i LIR IBC rare q
BB07 [0007] 3 BB04,BB05,BB06 0 0 [030..034)-> BB09(0),*(1) ( cond ) i LIR IBC rare
BB08 [0008] 1 BB07 0 0 [034..04C) (return) i LIR IBC rare
BB09 [0009] 1 BB07 0 0 [04C..04C)-> BB17(0.143),*(1) ( cond ) i LIR IBC rare q
BB19 [0044] 1 BB09 0 0 [04C..06A)-> *(0.286),*(0.286),BB13(0.143),BB14(0.143),BB15(0.143),BB16(0.143) (switch) i LIR IBC rare
BB11 [0043] 2 BB19(2) 0 0 [07D..080)-> BB18(1) (always) i LIR IBC rare
BB13 [0013] 1 BB19 0 0 [094..0A8)-> BB18(1) (always) i LIR IBC rare
BB14 [0014] 1 BB19 0 0 [0A8..0BD)-> BB18(1) (always) i LIR IBC rare
BB15 [0015] 1 BB19 0 0 [0BD..0D1)-> BB18(1) (always) i LIR IBC rare
BB16 [0016] 1 BB19 0 0 [0D1..0E6)-> BB18(1) (always) i LIR IBC rare
BB17 [0017] 1 BB09 0 0 [0E6..0FE)-> *(1) (always) i LIR IBC rare q
BB18 [0018] 6 BB11,BB13,BB14,BB15,BB16,BB17 0 0 [0FE..100) (return) i LIR IBC rare
BB04 [0003] 1 BB03 0 0 [022..029)-> BB07(1) (always) i LIR IBC rare hascall gcsafe
BB05 [0005] 1 BB02 0 0 [02C..02F)-> BB07(1) (always) i LIR IBC rare
---------------------------------------------------------------------------------------------------------------------------------------------------------------------

in the full IR dump, you'll see things like:

------------ BB09 [0009] [04C..04C) -> BB17(0.1428571),BB19(1) (cond), preds={BB07} succs={BB19,BB17}
------------ BB19 [0044] [04C..06A) -> BB11(0.2857143),BB11(0.2857143),BB13(0.1428571),BB14(0.1428571),BB15(0.1428571),BB16(0.1428571) (switch), preds={BB09} succs={BB11,BB13,BB14,BB15,BB16}

BruceForstall added a commit to BruceForstall/runtime that referenced this pull request Mar 14, 2024
This includes various fixes that are being separately PR'ed:
1. dotnet#99744:
Introduce HandleKindDataIsInvariant helper
2. dotnet#99743:
Add basic support for TYP_MASK constants
3. dotnet#99742:
Fix problem with scaling general loop blocks; add dumpers
4. dotnet#99740:
Add edge likelihood dumping; fix one edge likelihood update case
Also:
1. Add support for running JitOptRepeat under JitStress. This is still
over-written by JitOptRepeat being forced on at 4 iterations.
@AndyAyersMS

Copy link
Copy Markdown
Member
  1. Fix a case of likelihood updating in fgReplaceJumpTarget(): in a switch block, when the new target block is already a target of the switch, then there already exists an edge from the switch to the new target. In that case, we were updating the edge dup count, but fgAddRefPred wasn't updating the edge likelihood to add the removed edge likelihood to the existing edge likelihood.

Thanks for fixing this—it sounds exactly like the bug I hit in libraries jitstress in #99628.

Comment on lines +3170 to +3171
JITDUMP("Created new exit " FMT_BB " to replace " FMT_BB " exit for " FMT_LP "\n", newExit->bbNum, exit->bbNum,
loop->GetIndex());

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

optSetWeightForPreheaderOrExit references the block created, so moving its dumping here makes the jitdump look a bit strange I think.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I added the "Canonicalize exit" line above so it's obvious what process is starting when new blocks start getting created -- before I was confused at why new blocks were getting created. So moving this line to the end "brackets" the process by telling you what happened when it's done. E.g.,

Canonicalize exit BB15 for L00 to have only loop predecessors
New Basic Block BB18 [0116] created.
Setting edge weights for BB18 -> BB15 to [0 .. 3.402823e+38]
setting likelihood of BB18 -> BB15 to 1
Estimated likelihood BB04 -> BB18 to be 0.6585233 (contribution: 35.62623)
Setting edge weights for BB04 -> BB18 to [35.62623 .. 35.62623]
Estimated likelihood BB05 -> BB18 to be 0.3993941 (contribution: 10.80365)
Setting edge weights for BB05 -> BB18 to [10.80365 .. 10.80365]
Setting edge weights for BB18 -> BB15 to [46.42988 .. 46.42988]
Created new exit BB18 to replace BB15 exit for L00

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Ok, seems fine -- I think you should change it in optCreatePreheader as well then.

@amanasifkhalidamanasifkhalid 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, thanks!

assert(newEdge->getSourceBlock() == block);
assert(newEdge->getDestinationBlock() == newTarget);

if (newEdge->hasLikelihood() && oldEdge->hasLikelihood())

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.

I wonder if we can start skipping these checks and asserting that the edges have likelihoods already. Once Andy's last PR for propagating likelihoods is merged in, I'll take a look at removing these.

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

No diffs

@BruceForstall

Copy link
Copy Markdown
ContributorAuthor

Failures are known or infra.

@BruceForstall
BruceForstall merged commit b4bc0aa into dotnet:mainMar 14, 2024
@BruceForstall
BruceForstall deleted the FixSwitchLikelihoods branch March 14, 2024 16:55
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 14, 2024
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.

4 participants

@BruceForstall@AndyAyersMS@jakobbotsch@amanasifkhalid