From 1174ea84d421c8368c37598fcd57f9aa576127d3 Mon Sep 17 00:00:00 2001 From: Andy Ayers Date: Thu, 26 Jun 2025 18:37:25 +0000 Subject: [PATCH] JIT: Fix assert in object allocation phase The previous DFS and remove phase may leave unreachable pred blocks around. Bail out of conditional escape analysis when this happens. Fixes #117039. --- src/coreclr/jit/objectalloc.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/coreclr/jit/objectalloc.cpp b/src/coreclr/jit/objectalloc.cpp index 116d8c788e7b60..11aa4cf5a8336d 100644 --- a/src/coreclr/jit/objectalloc.cpp +++ b/src/coreclr/jit/objectalloc.cpp @@ -4043,8 +4043,16 @@ bool ObjectAllocator::CheckCanClone(CloneInfo* info) { BasicBlock* const predBlock = predEdge->getSourceBlock(); + // We may see unreachable pred blocks here. If so we will + // conservatively fail. + // + if (!comp->m_dfsTree->Contains(predBlock)) + { + JITDUMP("Unreachable pred block " FMT_BB " for " FMT_BB "\n", predBlock->bbNum, block->bbNum); + return false; + } + // We should not be able to reach an un-dominated block. - // (consider eh paths?) // assert(comp->m_domTree->Dominates(defBlock, predBlock)); if (BitVecOps::TryAddElemD(&traits, visitedBlocks, predBlock->bbID))