diff --git a/src/coreclr/jit/fgopt.cpp b/src/coreclr/jit/fgopt.cpp index 5ac4b28cb63ca8..cd7ac2fbba0167 100644 --- a/src/coreclr/jit/fgopt.cpp +++ b/src/coreclr/jit/fgopt.cpp @@ -4834,7 +4834,26 @@ bool Compiler::fgUpdateFlowGraph(bool doTailDuplication /* = false */, bool isPh { bDest = block->GetTrueTarget(); bFalseDest = block->GetFalseTarget(); - if (bDest == bFalseDest) + + if (bFalseDest->KindIs(BBJ_ALWAYS) && bFalseDest->TargetIs(bDest) && bFalseDest->isEmpty()) + { + // Optimize block -> bFalseDest -> bDest into a BBJ_ALWAYS + block->SetFalseTarget(bDest); + fgAddRefPred(bDest, block, fgRemoveRefPred(bFalseDest, block)); + + // We will convert block to BBJ_ALWAYS, so no need to keep bFalseDest up to date + } + else if (bDest->KindIs(BBJ_ALWAYS) && bDest->TargetIs(bFalseDest) && bDest->isEmpty()) + { + // Optimize block -> bDest -> bFalseDest into a BBJ_ALWAYS + block->SetTrueTarget(bFalseDest); + fgAddRefPred(bFalseDest, block, fgRemoveRefPred(bDest, block)); + + // We will continue to use bDest, so ensure it is up to date + bDest = bFalseDest; + } + + if (block->FalseTargetIs(bDest)) { fgRemoveConditionalJump(block); assert(block->KindIs(BBJ_ALWAYS));