From e7816f263b14578e2d926d2ee2d32db21e6ae95b Mon Sep 17 00:00:00 2001 From: Nick Desaulniers Date: Wed, 17 Jun 2020 11:51:51 -0700 Subject: [PATCH] [InlineSpiller] add assert about spills post terminators Summary: This invariant is being violated in the test case https://reviews.llvm.org/D77849, related to the use of the relatively new ability for callbr to have return values, and MachineBasicBlocks with INLINEASM_BR terminators to emit live out register defs. As noted in the comment, this triggers invariant violations in MachineVerifier via `llc -verify-machineinstrs` or `llc -verify-regalloc`, since only MachineInstrs that are terminators are allowed to follow the first terminator. https://reviews.llvm.org/D75098 may rework this very assertion if we're spilling via a (proposed) TCOPY MachineInstr. Reviewers: void, efriedma, arsenm Reviewed By: efriedma Subscribers: qcolombet, wdng, hiraditya, llvm-commits, srhines Tags: #llvm Differential Revision: https://reviews.llvm.org/D78166 --- llvm/lib/CodeGen/InlineSpiller.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/llvm/lib/CodeGen/InlineSpiller.cpp b/llvm/lib/CodeGen/InlineSpiller.cpp index 17c8af9..90dfaf6 100644 --- a/llvm/lib/CodeGen/InlineSpiller.cpp +++ b/llvm/lib/CodeGen/InlineSpiller.cpp @@ -945,6 +945,9 @@ static bool isRealSpill(const MachineInstr &Def) { /// insertSpill - Insert a spill of NewVReg after MI. void InlineSpiller::insertSpill(unsigned NewVReg, bool isKill, MachineBasicBlock::iterator MI) { + // Spill are not terminators, so inserting spills after terminators will + // violate invariants in MachineVerifier. + assert(!MI->isTerminator() && "Inserting a spill after a terminator"); MachineBasicBlock &MBB = *MI->getParent(); MachineInstrSpan MIS(MI, &MBB); -- 2.7.4