diff --git a/src/compiler/cgir/pass/cg_split_kit.cpp b/src/compiler/cgir/pass/cg_split_kit.cpp index 045b683e..2a173813 100644 --- a/src/compiler/cgir/pass/cg_split_kit.cpp +++ b/src/compiler/cgir/pass/cg_split_kit.cpp @@ -693,7 +693,32 @@ CgSlotIndex CgSplitEditor::enterIntvAfter(CgSlotIndex Idx) { } LLVM_DEBUG(dbgs() << ": valno " << ParentVNI->id << '\n'); CgInstruction *MI = LIS.getInstructionFromIndex(Idx); - assert(MI && "enterIntvAfter called with invalid index"); + if (!MI) { + LLVM_DEBUG(dbgs() << " no MI at " << Idx << ", resolving via MBB\n"); + CgBasicBlock *MBB = LIS.getMBBFromIndex(Idx); + if (!MBB) { + LLVM_DEBUG(dbgs() << " no MBB for index, keeping " << Idx << '\n'); + return Idx; + } + + CgSlotIndex End = LIS.getMBBEndIdx(MBB); + if (Idx >= End.getPrevSlot()) { + LLVM_DEBUG(dbgs() << " at end of " << printCgBBReference(*MBB) + << ", using end\n"); + return enterIntvAtEnd(*MBB); + } + + CgSlotIndex NextIdx = LIS.getSlotIndexes()->getNextNonNullIndex(Idx); + CgInstruction *NextMI = LIS.getInstructionFromIndex(NextIdx); + if (!NextMI || NextMI->getParent() != MBB) { + LLVM_DEBUG(dbgs() << " next MI not in block, using end\n"); + return enterIntvAtEnd(*MBB); + } + + CgVNInfo *VNI = + defFromParent(OpenIdx, ParentVNI, Idx, *MBB, NextMI->getIterator()); + return VNI->def; + } CgVNInfo *VNI = defFromParent(OpenIdx, ParentVNI, Idx, *MI->getParent(), std::next(CgBasicBlock::iterator(MI)));