[llvm] r281914 - LiveRangeCalc: Fix reporting of invalid vreg usage in liveness calculation

Matthias Braun via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 19 09:49:46 PDT 2016


Author: matze
Date: Mon Sep 19 11:49:45 2016
New Revision: 281914

URL: http://llvm.org/viewvc/llvm-project?rev=281914&view=rev
Log:
LiveRangeCalc: Fix reporting of invalid vreg usage in liveness calculation

Machine programs need a definition of each vreg before reaching a use
(the definition may come from an IMPLICIT_DEF instruction). This class
of errors is not detected by the MachineVerifier because of efficiency
concerns. LiveRangeCalc used to report these problems, make it do that
again (followup to r279625).

Also use report_fatal_error() instead of llvm_unreachable() as the error
reporting is only present in asserts build anyway.

Added:
    llvm/trunk/test/CodeGen/X86/invalid-liveness.mir
Modified:
    llvm/trunk/lib/CodeGen/LiveRangeCalc.cpp

Modified: llvm/trunk/lib/CodeGen/LiveRangeCalc.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LiveRangeCalc.cpp?rev=281914&r1=281913&r2=281914&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/LiveRangeCalc.cpp (original)
+++ llvm/trunk/lib/CodeGen/LiveRangeCalc.cpp Mon Sep 19 11:49:45 2016
@@ -361,14 +361,14 @@ bool LiveRangeCalc::findReachingDefs(Liv
     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(Liv
       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();

Added: llvm/trunk/test/CodeGen/X86/invalid-liveness.mir
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/invalid-liveness.mir?rev=281914&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/X86/invalid-liveness.mir (added)
+++ llvm/trunk/test/CodeGen/X86/invalid-liveness.mir Mon Sep 19 11:49:45 2016
@@ -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
+...




More information about the llvm-commits mailing list