Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JIT: more fixes for VN loop dependence tracking #56184

Merged
merged 1 commit into from
Jul 27, 2021

Conversation

AndyAyersMS
Copy link
Member

Specify Overwrite when setting loop dependence map entries, as we may
refine the initial result.

Fixes #56174.

Extract loop dependence of VNF_PhiMemoryDef.

Fixes new case noted in #55936, and 13/16 or so other cases Jakob sent
me privately. Also update a comment and fix tests to work better with
jitstress per other notes on that PR.

Specify `Overwrite` when setting loop dependence map entries, as we may
refine the initial result.

Fixes dotnet#56174.

Extract loop dependence of `VNF_PhiMemoryDef`.

Fixes new case noted in dotnet#55936, and 13/16 or so other cases Jakob sent
me privately. Also update a comment and fix tests to work better with
jitstress per other notes on that PR.
@dotnet-issue-labeler dotnet-issue-labeler bot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Jul 22, 2021
@AndyAyersMS
Copy link
Member Author

cc @jakobbotsch @dotnet/jit-contrib

No spmi diffs.

Copy link
Contributor

@briansull briansull left a comment

Choose a reason for hiding this comment

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

Looks Good

@AndyAyersMS
Copy link
Member Author

AndyAyersMS commented Jul 23, 2021

@jakobbotsch by my accounting this fixes all the test cases you sent me except for these 3:

11656046881568048475.cs
2692166044414030864.cs 
11738605779775786426.cs (hits jit assert)

The first two look like cases that should be handled by my fixes, so I will need to dig into them to see what is going wrong. In both cases the write/read sequence happens after a nested loop.

@AndyAyersMS AndyAyersMS merged commit b18ff29 into dotnet:main Jul 27, 2021
@AndyAyersMS AndyAyersMS deleted the LoopMemoryDependenceVNFixes branch July 27, 2021 17:53
AndyAyersMS added a commit to AndyAyersMS/runtime that referenced this pull request Jul 27, 2021
If a loop is removed (because of unrolling) then the loop dependence
tracking introduced in dotnet#55936 and dotnet#56184 may not properly update.

So when a loop is removed, walk up the chain of parent loops looking
for one that is not removed, and record the dependence on that parent.

Addresses last part of dotnet#54118.
AndyAyersMS added a commit that referenced this pull request Jul 28, 2021
…56436)

If a loop is removed (because of unrolling) then the loop dependence
tracking introduced in #55936 and #56184 may not properly update.

So when a loop is removed, walk up the chain of parent loops looking
for one that is not removed, and record the dependence on that parent.

Addresses last part of #54118.
@AndyAyersMS
Copy link
Member Author

The assert in that other test:

corerun.exe 11738605779775786426.exe

Assert failure(PID 20200 [0x00004ee8], Thread: 24136 [0x5e48]): Assertion failed 'i < BitSetTraits::GetSize(env)' 
   in 'Program:Main()' during 'Compute blocks reachability' (IL size 41)

@AndyAyersMS
Copy link
Member Author

Looks like a flow opts bug, we end up not updating the pred list for BB08 properly and this ultimately leaves a dangling reference from BB07 to BB08 which causes the assert above.

*************** In fgUpdateFlowGraph()
Before updating the flow graph:

-----------------------------------------------------------------------------------------------------------------------------------------
BBnum BBid ref try hnd preds           weight    lp [IL range]     [jump]      [EH region]         [flags]
-----------------------------------------------------------------------------------------------------------------------------------------
BB01 [0000]  1                             1       [000..007)-> BB10 (always)                     i 
BB02 [0001]  1       BB10                  1       [007..00E)-> BB07 ( cond )                     i bwd bwd-target 
BB03 [0002]  1       BB02                  1       [00E..010)-> BB04 (always)                     keep i bwd 
BB04 [0009]  1       BB03                  1       [???..???)-> BB06 (always)                     i internal 
BB05 [0010]  0                             1       [???..???)-> BB09 (always)                     i internal 
BB06 [0003]  1       BB04                  1       [010..013)-> BB09 (always)                     keep i bwd 
BB07 [0004]  1       BB02                  1       [013..01A)-> BB09 ( cond )                     i bwd 
BB08 [0005]  1       BB07                  1       [01A..020)                                     i bwd 
BB09 [0006]  4       BB05,BB06,BB07,BB08   1       [020..024)                                     i bwd 
BB10 [0007]  2       BB01,BB09             1       [024..028)-> BB02 ( cond )                     i bwd 
BB11 [0008]  1       BB10                  1       [028..029)        (return)                     i 
-----------------------------------------------------------------------------------------------------------------------------------------


Removing unconditional jump to next block (BB03 -> BB04) (converted BB03 to fall-through)

Compacting blocks BB03 and BB04:
*************** In fgDebugCheckBBlist

Optimizing a jump to an unconditional jump (BB03 -> BB06 -> BB09)
Setting edge weights for BB03 -> BB09 to [0 .. 3.402823e+38]
fgRemoveBlock BB05

Removing unreachable BB05

Compacting blocks BB08 and BB09:
Second block has multiple incoming edges
Setting edge weights for BB03 -> BB08 to [0 .. 3.402823e+38]
Setting edge weights for BB06 -> BB08 to [0 .. 3.402823e+38]
*************** In fgDebugCheckBBlist

Moving BB07 after BB03 to enable reversal
New Basic Block BB12 [0011] created.
Setting edge weights for BB07 -> BB12 to [0 .. 3.402823e+38]

Reversing a conditional jump around an unconditional jump (BB02 -> BB07, BB03 -> BB08)
Setting edge weights for BB02 -> BB08 to [0 .. 3.402823e+38]

After reversing the jump:

-----------------------------------------------------------------------------------------------------------------------------------------
BBnum BBid ref try hnd preds           weight    lp [IL range]     [jump]      [EH region]         [flags]
-----------------------------------------------------------------------------------------------------------------------------------------
BB01 [0000]  1                             1       [000..007)-> BB10 (always)                     i 
BB02 [0001]  1       BB10                  1       [007..00E)-> BB08 ( cond )                     i bwd bwd-target 
BB07 [0004]  1       BB02                  1       [013..01A)-> BB08 ( cond )                     i bwd 
BB12 [0011]  1       BB07                  1       [???..???)-> BB08 (always)                     internal 
BB06 [0003]  0                             1       [010..013)-> BB08 (always)                     keep i bwd 
BB08 [0005]  4       BB02,BB06,BB12(2)     1       [01A..024)                                     i bwd 
BB10 [0007]  2       BB01,BB08             1       [024..028)-> BB02 ( cond )                     i bwd 
BB11 [0008]  1       BB10                  1       [028..029)        (return)                     i 
-----------------------------------------------------------------------------------------------------------------------------------------

@AndyAyersMS
Copy link
Member Author

The bug is here:

// Add fall through fixup block, if needed.
//
if ((bDest->bbJumpKind == BBJ_NONE) || (bDest->bbJumpKind == BBJ_COND))
{
BasicBlock* const bFixup = fgNewBBafter(BBJ_ALWAYS, bDest, true);
bFixup->inheritWeight(bDestNext);
bFixup->bbJumpDest = bDestNext;
fgReplacePred(bDestNext, bDest, bFixup);
fgAddRefPred(bFixup, bDest);
}

fgReplacePred will replace all pred uses, when we only wanted to replace one of them

Compacting blocks BB08 and BB09:
Second block has multiple incoming edges
Setting edge weights for BB03 -> BB08 to [0 .. 3.402823e+38]
Setting edge weights for BB06 -> BB08 to [0 .. 3.402823e+38]
*************** In fgDebugCheckBBlist

-----------------------------------------------------------------------------------------------------------------------------------------
BBnum BBid ref try hnd preds           weight    lp [IL range]     [jump]      [EH region]         [flags]
-----------------------------------------------------------------------------------------------------------------------------------------
BB01 [0000]  1                             1       [000..007)-> BB10 (always)                     i 
BB02 [0001]  1       BB10                  1       [007..00E)-> BB07 ( cond )                     i bwd bwd-target 
BB03 [0002]  1       BB02                  1       [00E..010)-> BB08 (always)                     keep i bwd 
BB06 [0003]  0                             1       [010..013)-> BB08 (always)                     keep i bwd 
BB07 [0004]  1       BB02                  1       [013..01A)-> BB08 ( cond )                     i bwd 
BB08 [0005]  4       BB03,BB06,BB07(2)     1       [01A..024)                                     i bwd 
BB10 [0007]  2       BB01,BB08             1       [024..028)-> BB02 ( cond )                     i bwd 
BB11 [0008]  1       BB10                  1       [028..029)        (return)                     i 
-----------------------------------------------------------------------------------------------------------------------------------------

Moving BB07 after BB03 to enable reversal
New Basic Block BB12 [0011] created.
Setting edge weights for BB07 -> BB12 to [0 .. 3.402823e+38]

-----------------------------------------------------------------------------------------------------------------------------------------
BBnum BBid ref try hnd preds           weight    lp [IL range]     [jump]      [EH region]         [flags]
-----------------------------------------------------------------------------------------------------------------------------------------
BB01 [0000]  1                             1       [000..007)-> BB10 (always)                     i 
BB02 [0001]  1       BB10                  1       [007..00E)-> BB07 ( cond )                     i bwd bwd-target 
BB03 [0002]  1       BB02                  1       [00E..010)-> BB08 (always)                     keep i bwd 
BB07 [0004]  1       BB02                  1       [013..01A)-> BB08 ( cond )                     i bwd 
BB12 [0011]  1       BB07                  1       [???..???)-> BB08 (always)                     internal 
BB06 [0003]  0                             1       [010..013)-> BB08 (always)                     keep i bwd 
BB08 [0005]  4       BB03,BB06,BB12(2)     1       [01A..024)                                     i bwd 
BB10 [0007]  2       BB01,BB08             1       [024..028)-> BB02 ( cond )                     i bwd 
BB11 [0008]  1       BB10                  1       [028..029)        (return)                     i 
-----------------------------------------------------------------------------------------------------------------------------------------

Reversing a conditional jump around an unconditional jump (BB02 -> BB07, BB03 -> BB08)
Setting edge weights for BB02 -> BB08 to [0 .. 3.402823e+38]

After reversing the jump:

-----------------------------------------------------------------------------------------------------------------------------------------
BBnum BBid ref try hnd preds           weight    lp [IL range]     [jump]      [EH region]         [flags]
-----------------------------------------------------------------------------------------------------------------------------------------
BB01 [0000]  1                             1       [000..007)-> BB10 (always)                     i 
BB02 [0001]  1       BB10                  1       [007..00E)-> BB08 ( cond )                     i bwd bwd-target 
BB07 [0004]  1       BB02                  1       [013..01A)-> BB08 ( cond )                     i bwd 
BB12 [0011]  1       BB07                  1       [???..???)-> BB08 (always)                     internal 
BB06 [0003]  0                             1       [010..013)-> BB08 (always)                     keep i bwd 
BB08 [0005]  4       BB02,BB06,BB12(2)     1       [01A..024)                                     i bwd 
BB10 [0007]  2       BB01,BB08             1       [024..028)-> BB02 ( cond )                     i bwd 
BB11 [0008]  1       BB10                  1       [028..029)        (return)                     i 
-----------------------------------------------------------------------------------------------------------------------------------------

This is new code that I added, I'll open a fresh issue for this...

@ghost ghost locked as resolved and limited conversation to collaborators Aug 27, 2021
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
area-CodeGen-coreclr CLR 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.

kind == Overwrite assert in jitstress
4 participants