[MachineVerifier] Check that even generic vregs comply to regclass constraints.
authorQuentin Colombet <qcolombet@apple.com>
Thu, 22 Dec 2016 21:56:39 +0000 (21:56 +0000)
committerQuentin Colombet <qcolombet@apple.com>
Thu, 22 Dec 2016 21:56:39 +0000 (21:56 +0000)
We used to not check generic vregs, but that is actually a mistake given
nothing in the GlobalISel pipeline is going to fix the constraints on
target specific instructions. Therefore, the target has to have them
right from the start.

llvm-svn: 290380

llvm/lib/CodeGen/MachineVerifier.cpp

index c790fc3..7eb42ec 100644 (file)
@@ -1056,6 +1056,21 @@ MachineVerifier::visitMachineOperand(const MachineOperand *MO, unsigned MONum) {
                    MONum);
             return;
           }
+
+          // If this is a target specific instruction and this operand
+          // has register class constraint, the virtual register must
+          // comply to it.
+          if (!isPreISelGenericOpcode(MCID.getOpcode()) &&
+              TII->getRegClass(MCID, MONum, TRI, *MF)) {
+            report("Virtual register does not match instruction constraint", MO,
+                   MONum);
+            errs() << "Expect register class "
+                   << TRI->getRegClassName(
+                          TII->getRegClass(MCID, MONum, TRI, *MF))
+                   << " but got nothing\n";
+            return;
+          }
+
           break;
         }
         if (SubIdx) {