From 0d21a25e2899e01fd3ab1741144850707e61e453 Mon Sep 17 00:00:00 2001 From: "Aman Khalid (from Dev Box)" Date: Fri, 2 Feb 2024 15:17:00 -0500 Subject: [PATCH 1/6] Fix JitStress --- src/coreclr/jit/fgprofile.cpp | 2 +- src/coreclr/jit/patchpoint.cpp | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/coreclr/jit/fgprofile.cpp b/src/coreclr/jit/fgprofile.cpp index 3e636b4d77c191..509a1ca4799988 100644 --- a/src/coreclr/jit/fgprofile.cpp +++ b/src/coreclr/jit/fgprofile.cpp @@ -3517,7 +3517,7 @@ void EfficientEdgeCountReconstructor::Solve() // if (m_comp->fgPgoSource == ICorJitInfo::PgoSource::Dynamic) { - assert(!m_mismatch); + // assert(!m_mismatch); } // If issues arose earlier, then don't try solving. diff --git a/src/coreclr/jit/patchpoint.cpp b/src/coreclr/jit/patchpoint.cpp index d63af93092b454..1463575dbc20e1 100644 --- a/src/coreclr/jit/patchpoint.cpp +++ b/src/coreclr/jit/patchpoint.cpp @@ -151,8 +151,21 @@ class PatchpointTransformer helperBlock->SetFlags(BBF_BACKWARD_JUMP | BBF_NONE_QUIRK); - compiler->fgAddRefPred(helperBlock, block); - compiler->fgAddRefPred(remainderBlock, helperBlock); + FlowEdge* const falseEdge = compiler->fgAddRefPred(helperBlock, block); + FlowEdge* const trueEdge = compiler->fgGetPredForBlock(remainderBlock, block); + + if (trueEdge->hasLikelihood()) + { + falseEdge->setLikelihood(1.0 - trueEdge->getLikelihood()); + } + else + { + trueEdge->setLikelihood(0.5); + falseEdge->setLikelihood(0.5); + } + + FlowEdge* const newEdge = compiler->fgAddRefPred(remainderBlock, helperBlock); + newEdge->setLikelihood(1.0); // Update weights remainderBlock->inheritWeight(block); From 8c32b3774328e059da17562231032bf466ca4fcb Mon Sep 17 00:00:00 2001 From: "Aman Khalid (from Dev Box)" Date: Fri, 2 Feb 2024 15:19:58 -0500 Subject: [PATCH 2/6] Uncomment assert --- src/coreclr/jit/fgprofile.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreclr/jit/fgprofile.cpp b/src/coreclr/jit/fgprofile.cpp index 509a1ca4799988..3e636b4d77c191 100644 --- a/src/coreclr/jit/fgprofile.cpp +++ b/src/coreclr/jit/fgprofile.cpp @@ -3517,7 +3517,7 @@ void EfficientEdgeCountReconstructor::Solve() // if (m_comp->fgPgoSource == ICorJitInfo::PgoSource::Dynamic) { - // assert(!m_mismatch); + assert(!m_mismatch); } // If issues arose earlier, then don't try solving. From cd3e30dccc183eb696586c1f0a511f6ce1f5e678 Mon Sep 17 00:00:00 2001 From: "Aman Khalid (from Dev Box)" Date: Fri, 2 Feb 2024 15:47:11 -0500 Subject: [PATCH 3/6] Fix likelihoods --- src/coreclr/jit/patchpoint.cpp | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/coreclr/jit/patchpoint.cpp b/src/coreclr/jit/patchpoint.cpp index 1463575dbc20e1..65f5f0123b8fbc 100644 --- a/src/coreclr/jit/patchpoint.cpp +++ b/src/coreclr/jit/patchpoint.cpp @@ -154,15 +154,12 @@ class PatchpointTransformer FlowEdge* const falseEdge = compiler->fgAddRefPred(helperBlock, block); FlowEdge* const trueEdge = compiler->fgGetPredForBlock(remainderBlock, block); - if (trueEdge->hasLikelihood()) - { - falseEdge->setLikelihood(1.0 - trueEdge->getLikelihood()); - } - else - { - trueEdge->setLikelihood(0.5); - falseEdge->setLikelihood(0.5); - } + // Likelihood should have been set in fgSplitBlockAtBeginning + assert(trueEdge->hasLikelihood()); + + // Check should rarely pass + trueEdge->setLikelihood(0.1); + falseEdge->setLikelihood(0.9); FlowEdge* const newEdge = compiler->fgAddRefPred(remainderBlock, helperBlock); newEdge->setLikelihood(1.0); From fc6255f078b3376d62a8389c18f95078e26fe1e2 Mon Sep 17 00:00:00 2001 From: "Aman Khalid (from Dev Box)" Date: Fri, 2 Feb 2024 15:59:08 -0500 Subject: [PATCH 4/6] Update likelihoods --- src/coreclr/jit/patchpoint.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/coreclr/jit/patchpoint.cpp b/src/coreclr/jit/patchpoint.cpp index 65f5f0123b8fbc..9f2979861fe954 100644 --- a/src/coreclr/jit/patchpoint.cpp +++ b/src/coreclr/jit/patchpoint.cpp @@ -156,10 +156,8 @@ class PatchpointTransformer // Likelihood should have been set in fgSplitBlockAtBeginning assert(trueEdge->hasLikelihood()); - - // Check should rarely pass - trueEdge->setLikelihood(0.1); - falseEdge->setLikelihood(0.9); + trueEdge->setLikelihood(HIGH_PROBABILITY / 100); + falseEdge->setLikelihood((100 - HIGH_PROBABILITY) / 100); FlowEdge* const newEdge = compiler->fgAddRefPred(remainderBlock, helperBlock); newEdge->setLikelihood(1.0); From c042cbb57adb0019fa5ccdb3595f5faab330ccd5 Mon Sep 17 00:00:00 2001 From: "Aman Khalid (from Dev Box)" Date: Fri, 2 Feb 2024 15:59:55 -0500 Subject: [PATCH 5/6] Remove unnecessary assert --- src/coreclr/jit/patchpoint.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/coreclr/jit/patchpoint.cpp b/src/coreclr/jit/patchpoint.cpp index 9f2979861fe954..4116039f35f892 100644 --- a/src/coreclr/jit/patchpoint.cpp +++ b/src/coreclr/jit/patchpoint.cpp @@ -153,9 +153,6 @@ class PatchpointTransformer FlowEdge* const falseEdge = compiler->fgAddRefPred(helperBlock, block); FlowEdge* const trueEdge = compiler->fgGetPredForBlock(remainderBlock, block); - - // Likelihood should have been set in fgSplitBlockAtBeginning - assert(trueEdge->hasLikelihood()); trueEdge->setLikelihood(HIGH_PROBABILITY / 100); falseEdge->setLikelihood((100 - HIGH_PROBABILITY) / 100); From 56696dcc82cd8cfbbd17d37d513542798ae2b23d Mon Sep 17 00:00:00 2001 From: Aman Khalid Date: Fri, 2 Feb 2024 16:29:55 -0500 Subject: [PATCH 6/6] Update src/coreclr/jit/patchpoint.cpp Co-authored-by: Jakob Botsch Nielsen --- src/coreclr/jit/patchpoint.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/coreclr/jit/patchpoint.cpp b/src/coreclr/jit/patchpoint.cpp index 4116039f35f892..27b94470962ef0 100644 --- a/src/coreclr/jit/patchpoint.cpp +++ b/src/coreclr/jit/patchpoint.cpp @@ -153,8 +153,8 @@ class PatchpointTransformer FlowEdge* const falseEdge = compiler->fgAddRefPred(helperBlock, block); FlowEdge* const trueEdge = compiler->fgGetPredForBlock(remainderBlock, block); - trueEdge->setLikelihood(HIGH_PROBABILITY / 100); - falseEdge->setLikelihood((100 - HIGH_PROBABILITY) / 100); + trueEdge->setLikelihood(HIGH_PROBABILITY / 100.0); + falseEdge->setLikelihood((100 - HIGH_PROBABILITY) / 100.0); FlowEdge* const newEdge = compiler->fgAddRefPred(remainderBlock, helperBlock); newEdge->setLikelihood(1.0);