diff --git a/src/coreclr/jit/optimizer.cpp b/src/coreclr/jit/optimizer.cpp index 5557d299a964d0..703cf0e849d107 100644 --- a/src/coreclr/jit/optimizer.cpp +++ b/src/coreclr/jit/optimizer.cpp @@ -2342,16 +2342,13 @@ class LoopSearch // void CheckForExit(BasicBlock* block) { - BasicBlock* exitPoint; + assert(!block->HasTarget() || block->HasInitializedTarget()); switch (block->GetKind()) { - case BBJ_COND: - case BBJ_CALLFINALLY: case BBJ_ALWAYS: - case BBJ_EHCATCHRET: - assert(block->HasInitializedTarget()); - exitPoint = block->KindIs(BBJ_COND) ? block->GetTrueTarget() : block->GetTarget(); + { + BasicBlock* exitPoint = block->GetTarget(); if (!loopBlocks.IsMember(exitPoint->bbNum)) { @@ -2362,12 +2359,9 @@ class LoopSearch // On non-funclet platforms (x86), the catch exit is a BBJ_ALWAYS, but we don't want that to // be considered a loop exit block, as catch handlers don't have predecessor lists and don't // show up as might be expected in the dominator tree. - if (block->KindIs(BBJ_ALWAYS)) + if (!BasicBlock::sameHndRegion(block, exitPoint)) { - if (!BasicBlock::sameHndRegion(block, exitPoint)) - { - break; - } + break; } #endif // !defined(FEATURE_EH_FUNCLETS) @@ -2375,6 +2369,37 @@ class LoopSearch exitCount++; } break; + } + case BBJ_COND: + if (!loopBlocks.IsMember(block->GetTrueTarget()->bbNum)) + { + lastExit = block; + exitCount++; + } + + if (!loopBlocks.IsMember(block->GetFalseTarget()->bbNum)) + { + lastExit = block; + exitCount++; + } + break; + case BBJ_CALLFINALLY: + // Check fallthrough successor + if (!loopBlocks.IsMember(block->Next()->bbNum)) + { + lastExit = block; + exitCount++; + } + + FALLTHROUGH; + case BBJ_CALLFINALLYRET: + case BBJ_EHCATCHRET: + if (!loopBlocks.IsMember(block->GetTarget()->bbNum)) + { + lastExit = block; + exitCount++; + } + break; case BBJ_EHFINALLYRET: case BBJ_EHFAULTRET: @@ -2405,13 +2430,6 @@ class LoopSearch noway_assert(!"Unexpected bbKind"); break; } - - if (block->bbFallsThrough() && !loopBlocks.IsMember(block->Next()->bbNum)) - { - // Found a fall-through exit. - lastExit = block; - exitCount++; - } } }; } // end (anonymous) namespace