[llvm-branch-commits] [llvm] [AMDGPU] Machine verifier size check for 16bit register (PR #219734)

Matt Arsenault via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Sat Sep 5 13:20:10 PDT 2026


================
@@ -5290,9 +5290,78 @@ bool SIInstrInfo::verifyCopy(const MachineInstr &MI,
     ErrInfo = "illegal copy from vector register to SGPR";
     return false;
   }
+  // check for sreg32/vgpr3/vgpr16 mismatch
+  unsigned DstSubReg = MI.getOperand(0).getSubReg();
+  unsigned SrcSubReg = MI.getOperand(1).getSubReg();
+  auto *TRI = MRI.getTargetRegisterInfo();
+
+  if (RI.isAGPR(MRI, DstReg) || RI.isAGPR(MRI, SrcReg))
+    return true;
+
+  if (!DstReg.isVirtual() || !SrcReg.isVirtual())
+    return true;
+
+  auto *DstRC = getOpRegClass(MI, 0);
+  if (DstSubReg != AMDGPU::NoSubRegister)
+    DstRC = TRI->getSubRegisterClass(DstRC, DstSubReg);
+
+  auto *SrcRC = getOpRegClass(MI, 1);
+  if (SrcSubReg != AMDGPU::NoSubRegister)
+    SrcRC = TRI->getSubRegisterClass(SrcRC, SrcSubReg);
+
+  DstRC = RI.getEquivalentVGPRClass(DstRC);
+  SrcRC = RI.getEquivalentVGPRClass(SrcRC);
+  if (RI.getMatchingSuperRegClass(SrcRC, DstRC, AMDGPU::lo16) ||
+      RI.getMatchingSuperRegClass(DstRC, SrcRC, AMDGPU::lo16)) {
+    ErrInfo = "illegal copy with different size src/dst reg";
+    return false;
+  }
+
+  return true;
+}
+
+bool SIInstrInfo::verifyRegsequence(const MachineInstr &MI,
+                                    const MachineRegisterInfo &MRI,
+                                    StringRef &ErrInfo) const {
+  auto *TRI = MRI.getTargetRegisterInfo();
+  auto *SuperClass = getOpRegClass(MI, 0);
+  if (RI.isAGPR(MRI, MI.getOperand(0).getReg()))
+    return true;
+  for (int I = 1, E = MI.getNumOperands(); I != E; I += 2) {
+    auto *OpClass = getOpRegClass(MI, I);
+    unsigned SubReg = MI.getOperand(I).getSubReg();
+    if (MI.getOperand(I).isUndef() || RI.isAGPR(MRI, MI.getOperand(I).getReg()))
+      continue;
+    const TargetRegisterClass *SubClass;
+    if (SubReg != AMDGPU::NoSubRegister)
+      SubClass = TRI->getSubRegisterClass(OpClass, SubReg);
+    else
+      SubClass = OpClass;
+
+    SuperClass = RI.getEquivalentVGPRClass(SuperClass);
+    SubClass = RI.getEquivalentVGPRClass(SubClass);
+    if (!TRI->getMatchingSuperRegClass(SuperClass, SubClass,
+                                       MI.getOperand(I + 1).getImm())) {
+      ErrInfo = "illegal sub register in reg_sequence";
----------------
arsenm wrote:

This stuff is already caught by the generic verifier?

https://github.com/llvm/llvm-project/pull/219734


More information about the llvm-branch-commits mailing list