diff --git a/src/coreclr/jit/fgopt.cpp b/src/coreclr/jit/fgopt.cpp index ffa3d88cba33eb..5be7aea1445a53 100644 --- a/src/coreclr/jit/fgopt.cpp +++ b/src/coreclr/jit/fgopt.cpp @@ -5492,13 +5492,21 @@ PhaseStatus Compiler::fgHeadTailMerge(bool early) } } - predInfo.Reset(); - for (BasicBlock* const block : retOrThrowBlocks.BottomUpOrder()) + JITDUMP("Trying tail merge of return and throw blocks\n"); + do { - predInfo.Push(PredInfo(block, block->lastStmt())); - } - - tailMergePreds(nullptr); + predInfo.Reset(); + for (BasicBlock* const block : retOrThrowBlocks.BottomUpOrder()) + { + // If this block was already merged, skip it + // + if (!block->KindIs(BBJ_RETURN, BBJ_THROW)) + { + continue; + } + predInfo.Push(PredInfo(block, block->lastStmt())); + } + } while (tailMergePreds(nullptr)); // Work through any retries // diff --git a/src/coreclr/jit/jitstd/vector.h b/src/coreclr/jit/jitstd/vector.h index 2d0a91210ecc95..17862714046504 100644 --- a/src/coreclr/jit/jitstd/vector.h +++ b/src/coreclr/jit/jitstd/vector.h @@ -613,6 +613,7 @@ vector& vector::operator=(vector&& vec template typename vector::reference vector::operator[](size_type n) { + assert(n >= 0 && n < m_nSize); return m_pArray[n]; } @@ -620,6 +621,7 @@ template typename vector::const_reference vector::operator[](size_type n) const { + assert(n >= 0 && n < m_nSize); return m_pArray[n]; }