[PATCH] D139646: AMDGPU: Check if operand with vgpr RC contains reg when printing

Dmitry Preobrazhensky via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 9 05:30:25 PST 2022


dp added a comment.

Overall looks good.



================
Comment at: llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUInstPrinter.cpp:678
+        StringRef RCName(MRI.getRegClassName(RC));
+        if (RCName.contains("VReg_")) {
+          O << "/*Invalid register, operand has \'" << RCName
----------------
Petar.Avramovic wrote:
> I don't know what is going on here but if we check for other classes there is a lot of errors. Related to registers with special name not being member of register class, common error is that M0 is not in SReg_32.
The reason for these failures is that we have two kinds of registers - preudo and real. The latter are necessary to reflect the fact that some registers have different encodings on different GPUs. So you have to use `mc2PseudoReg`.

But this correction is insufficient. We also have some registers which are used in MC only. They are defined as 32-bit registers in td, but MC can use them where wider operands are expected.

So your code may be corrected as follows:

    const MCRegisterClass *RC = &MRI.getRegClass(Desc.OpInfo[OpNo].RegClass);
    auto Reg = mc2PseudoReg(Op.getReg());
    if (!RC->contains(Reg) && !isInlineValue(Reg)) {
        StringRef RCName(MRI.getRegClassName(RC));
        O << "/*Invalid register, operand has \'" << RCName
          << "\' register class*/";
      }
    }



CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D139646/new/

https://reviews.llvm.org/D139646



More information about the llvm-commits mailing list