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) &&
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();
--- /dev/null
+# 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
+...