diff --git a/lib/CodeGen/LiveRangeCalc.cpp b/lib/CodeGen/LiveRangeCalc.cpp index 281cf1fb5a8..9f6262bd9a9 100644 --- a/lib/CodeGen/LiveRangeCalc.cpp +++ b/lib/CodeGen/LiveRangeCalc.cpp @@ -361,14 +361,14 @@ bool LiveRangeCalc::findReachingDefs(LiveRange &LR, MachineBasicBlock &UseMBB, MachineBasicBlock *MBB = MF->getBlockNumbered(WorkList[i]); #ifndef NDEBUG - if (Undefs.size() > 0 && MBB->pred_empty()) { + if (MBB->pred_empty()) { MBB->getParent()->verify(); errs() << "Use of " << PrintReg(PhysReg) << " does not have a corresponding definition on every path:\n"; const MachineInstr *MI = Indexes->getInstructionFromIndex(Use); if (MI != nullptr) errs() << Use << " " << *MI; - llvm_unreachable("Use not jointly dominated by defs."); + report_fatal_error("Use not jointly dominated by defs."); } if (TargetRegisterInfo::isPhysicalRegister(PhysReg) && @@ -378,7 +378,7 @@ bool LiveRangeCalc::findReachingDefs(LiveRange &LR, MachineBasicBlock &UseMBB, errs() << "The register " << PrintReg(PhysReg, TRI) << " needs to be live in to BB#" << MBB->getNumber() << ", but is missing from the live-in list.\n"; - llvm_unreachable("Invalid global physical register"); + report_fatal_error("Invalid global physical register"); } #endif FoundUndef |= MBB->pred_empty(); diff --git a/test/CodeGen/X86/invalid-liveness.mir b/test/CodeGen/X86/invalid-liveness.mir new file mode 100644 index 00000000000..ca862472ba8 --- /dev/null +++ b/test/CodeGen/X86/invalid-liveness.mir @@ -0,0 +1,31 @@ +# RUN: not llc -march=x86 -run-pass liveintervals -o - %s 2>&1 | FileCheck %s +# REQUIRES: asserts + +--- | + define void @func() { ret void } +... +--- +# Liveness calculation should detect that we do not have a definition for vreg0 +# on all paths; In this example a def for vreg0 is missing when jumping from +# bb.0 to bb.3. +# +# CHECK: Use of %vreg0 does not have a corresponding definition on every path +# CHECK: ERROR: Use not jointly dominated by defs. +name: func +registers: + - { id: 0, class: gr32 } +body: | + bb.0: + successors: %bb.2, %bb.3 + JG_1 %bb.2, implicit %eflags + JMP_1 %bb.3 + + bb.2: + successors: %bb.3 + %0 = IMPLICIT_DEF + JMP_1 %bb.3 + + bb.3: + %eax = COPY %0 + RETQ %eax +...