[llvm] [RISCV][TableGen] Return instruction size from isCompressibleInst (PR #225660)

Sudharsan Veeravalli via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 23 02:52:02 PDT 2026


https://github.com/svs-quic updated https://github.com/llvm/llvm-project/pull/225660

>From f1cb65fd72100d4fcd7525e3a28b13b5e4f07392 Mon Sep 17 00:00:00 2001
From: Sudharsan Veeravalli <svs at qti.qualcomm.com>
Date: Wed, 23 Sep 2026 14:34:16 +0530
Subject: [PATCH 1/2] [RISCV][TableGen] Return compressed instruction size from
 isCompressibleInst

---
 llvm/lib/Target/RISCV/RISCVInstrInfo.cpp              |  6 ++++--
 llvm/test/TableGen/CompressInstEmitter/suboperands.td |  3 +++
 llvm/test/TableGen/RegClassByHwModeCompressPat.td     | 10 +++++++++-
 llvm/unittests/Target/RISCV/RISCVInstrInfoTest.cpp    |  5 +----
 llvm/utils/TableGen/CompressInstEmitter.cpp           |  8 +++++++-
 5 files changed, 24 insertions(+), 8 deletions(-)

diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp
index b057c6066516f7..496a5ef31703ad 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp
@@ -2014,8 +2014,10 @@ unsigned RISCVInstrInfo::getInstSizeInBytes(const MachineInstr &MI) const {
     return getInstBundleSize(MI);
 
   if (MI.getParent() && MI.getParent()->getParent()) {
-    if (isCompressibleInst(MI, STI))
-      return 2;
+    unsigned Size = 0;
+    if (isCompressibleInst(MI, STI, &Size)) {
+      return Size;
+    }
   }
 
   switch (Opcode) {
diff --git a/llvm/test/TableGen/CompressInstEmitter/suboperands.td b/llvm/test/TableGen/CompressInstEmitter/suboperands.td
index af0c8617201624..b64d9e5f501e73 100644
--- a/llvm/test/TableGen/CompressInstEmitter/suboperands.td
+++ b/llvm/test/TableGen/CompressInstEmitter/suboperands.td
@@ -233,6 +233,7 @@ def : CompressPat<(BigInst3 RegsC:$dst, RegsC:$src, simm6:$imm),
 // CHECK-NEXT:    // small $dst, $addr
 // CHECK-NEXT:    // Operand: dst
 // CHECK-NEXT:    // Operand: addr
+// CHECK-NEXT:    if (Size) *Size = 2;
 // CHECK-NEXT:    return true;
 // CHECK-NEXT: } // if
 // CHECK:  case Arch::BigInst2: {
@@ -246,6 +247,7 @@ def : CompressPat<(BigInst3 RegsC:$dst, RegsC:$src, simm6:$imm),
 // CHECK-NEXT:    // Operand: dst
 // CHECK-NEXT:    // Operand: src
 // CHECK-NEXT:    // Operand: imm
+// CHECK-NEXT:    if (Size) *Size = 2;
 // CHECK-NEXT:    return true;
 // CHECK-NEXT: } // if
 // CHECK:  case Arch::BigInst3: {
@@ -258,5 +260,6 @@ def : CompressPat<(BigInst3 RegsC:$dst, RegsC:$src, simm6:$imm),
 // CHECK-NEXT:    // small $dst, $addr
 // CHECK-NEXT:    // Operand: dst
 // CHECK-NEXT:    // Operand: addr
+// CHECK-NEXT:    if (Size) *Size = 2;
 // CHECK-NEXT:    return true;
 // CHECK-NEXT: } // if
diff --git a/llvm/test/TableGen/RegClassByHwModeCompressPat.td b/llvm/test/TableGen/RegClassByHwModeCompressPat.td
index 1e22ca8a4a2b85..e64b08918dbe4d 100644
--- a/llvm/test/TableGen/RegClassByHwModeCompressPat.td
+++ b/llvm/test/TableGen/RegClassByHwModeCompressPat.td
@@ -274,7 +274,9 @@ def : CompressPat<(PTR_MOV PtrRC:$dst, PtrRC:$src),
 // CHECK-NEXT: }
 
 // CHECK:      static bool isCompressibleInst(const MachineInstr &MI,
-// CHECK-NEXT:                                const MyTargetSubtarget &STI) {
+// CHECK-NEXT:                                const MyTargetSubtarget &STI,
+// CHECK-NEXT:                                unsigned *Size = nullptr) {
+// CHECK-NEXT:   if (Size) *Size = 0;
 // CHECK-NEXT:   {{\[\[}}maybe_unused]] unsigned HwModeId = STI.getHwMode(MCSubtargetInfo::HwMode_RegInfo);
 // CHECK-NEXT:   switch (MI.getOpcode()) {
 // CHECK-NEXT:   default: return false;
@@ -286,6 +288,7 @@ def : CompressPat<(PTR_MOV PtrRC:$dst, PtrRC:$src),
 // CHECK-NEXT:       // ptr_mov.small $dst, $src
 // CHECK-NEXT:       // Operand: dst
 // CHECK-NEXT:       // Operand: src
+// CHECK-NEXT:       if (Size) *Size = 1;
 // CHECK-NEXT:       return true;
 // CHECK-NEXT:     } // if
 // CHECK-NEXT:     if (MI.getOperand(1).isReg() && MI.getOperand(0).isReg() &&
@@ -295,6 +298,7 @@ def : CompressPat<(PTR_MOV PtrRC:$dst, PtrRC:$src),
 // CHECK-NEXT:       // ptr_mov.tied $dst, $src
 // CHECK-NEXT:       // Operand: dst
 // CHECK-NEXT:       // Operand: src
+// CHECK-NEXT:       if (Size) *Size = 1;
 // CHECK-NEXT:       return true;
 // CHECK-NEXT:     } // if
 // CHECK-NEXT:     if (MI.getOperand(1).isReg() &&
@@ -303,6 +307,7 @@ def : CompressPat<(PTR_MOV PtrRC:$dst, PtrRC:$src),
 // CHECK-NEXT:         getMyTargetMCRegisterClass(MyTargetRegClassByHwModeTables[HwModeId][MyTarget::PtrRC]).contains(MI.getOperand(0).getReg())) {
 // CHECK-NEXT:       // ptr_mov.zero $dst
 // CHECK-NEXT:       // Operand: dst
+// CHECK-NEXT:       if (Size) *Size = 1;
 // CHECK-NEXT:       return true;
 // CHECK-NEXT:     } // if
 // CHECK-NEXT:     break;
@@ -315,6 +320,7 @@ def : CompressPat<(PTR_MOV PtrRC:$dst, PtrRC:$src),
 // CHECK-NEXT:       // x_mov.small $dst, $src
 // CHECK-NEXT:       // Operand: dst
 // CHECK-NEXT:       // Operand: src
+// CHECK-NEXT:       if (Size) *Size = 1;
 // CHECK-NEXT:       return true;
 // CHECK-NEXT:     } // if
 // CHECK-NEXT:     if (MI.getOperand(1).isReg() && MI.getOperand(0).isReg() &&
@@ -324,6 +330,7 @@ def : CompressPat<(PTR_MOV PtrRC:$dst, PtrRC:$src),
 // CHECK-NEXT:       // x_mov.tied $dst, $src
 // CHECK-NEXT:       // Operand: dst
 // CHECK-NEXT:       // Operand: src
+// CHECK-NEXT:       if (Size) *Size = 1;
 // CHECK-NEXT:       return true;
 // CHECK-NEXT:     } // if
 // CHECK-NEXT:     if (MI.getOperand(1).isReg() &&
@@ -332,6 +339,7 @@ def : CompressPat<(PTR_MOV PtrRC:$dst, PtrRC:$src),
 // CHECK-NEXT:         getMyTargetMCRegisterClass(MyTarget::XRegsRegClassID).contains(MI.getOperand(0).getReg())) {
 // CHECK-NEXT:       // x_mov.zero $dst
 // CHECK-NEXT:       // Operand: dst
+// CHECK-NEXT:       if (Size) *Size = 1;
 // CHECK-NEXT:       return true;
 // CHECK-NEXT:     } // if
 // CHECK-NEXT:     break;
diff --git a/llvm/unittests/Target/RISCV/RISCVInstrInfoTest.cpp b/llvm/unittests/Target/RISCV/RISCVInstrInfoTest.cpp
index cb18413c7ddc29..f96b1047b63509 100644
--- a/llvm/unittests/Target/RISCV/RISCVInstrInfoTest.cpp
+++ b/llvm/unittests/Target/RISCV/RISCVInstrInfoTest.cpp
@@ -436,11 +436,8 @@ TEST_P(RISCVXQCIInstrInfoTest, XQCIEInstSize) {
     return BuildMI(MBB, DebugLoc(), TII->get(Opcode)).addImm(4096).getInstr();
   };
 
-  // FIXME: The instructions being checked in this test all compress to 4 byte
-  // instructions but getInstSizeInBytes() currently returns 2 for all
-  // instructions that are compressible.
   auto CheckSize = [&](MachineInstr *MI) {
-    EXPECT_EQ(2u, TII->getInstSizeInBytes(*MI));
+    EXPECT_EQ(4u, TII->getInstSizeInBytes(*MI));
   };
 
   CheckSize(MakeLoad(RISCV::QC_E_LW));
diff --git a/llvm/utils/TableGen/CompressInstEmitter.cpp b/llvm/utils/TableGen/CompressInstEmitter.cpp
index 8f8245ea9ed27d..d0df24b15ec9f6 100644
--- a/llvm/utils/TableGen/CompressInstEmitter.cpp
+++ b/llvm/utils/TableGen/CompressInstEmitter.cpp
@@ -633,7 +633,9 @@ void CompressInstEmitter::emitCompressInstEmitter(raw_ostream &OS,
     FuncH.indent(27) << "const MCSubtargetInfo &STI) {\n";
   } else if (EType == EmitterType::CheckCompress) {
     FuncH << "static bool isCompressibleInst(const MachineInstr &MI,\n";
-    FuncH.indent(31) << "const " << TargetName << "Subtarget &STI) {\n";
+    FuncH.indent(31) << "const " << TargetName << "Subtarget &STI,\n";
+    FuncH.indent(31) << "unsigned *Size = nullptr) {\n";
+    FuncH.indent(2) << "if (Size) *Size = 0;\n";
   }
   // HwModeId is used if we have any RegClassByHwMode patterns
   if (!Target.getAllRegClassByHwMode().empty())
@@ -901,6 +903,10 @@ void CompressInstEmitter::emitCompressInstEmitter(raw_ostream &OS,
         ++OpNo;
       }
     }
+    if (EType == EmitterType::CheckCompress) {
+      CodeStream.indent(6) << "if (Size) *Size = " << Dest.TheDef->getValueAsInt("Size")
+                           << ";\n";
+    }
     if (CompressOrUncompress)
       CodeStream.indent(6) << "OutInst.setLoc(MI.getLoc());\n";
     mergeCondAndCode(CaseStream, CondString, CodeString);

>From 0d021a19b069700645c178de46e961b63d3871bb Mon Sep 17 00:00:00 2001
From: Sudharsan Veeravalli <svs at qti.qualcomm.com>
Date: Wed, 23 Sep 2026 15:21:36 +0530
Subject: [PATCH 2/2] Clang-format

---
 llvm/utils/TableGen/CompressInstEmitter.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/llvm/utils/TableGen/CompressInstEmitter.cpp b/llvm/utils/TableGen/CompressInstEmitter.cpp
index d0df24b15ec9f6..c2873c3ab6da89 100644
--- a/llvm/utils/TableGen/CompressInstEmitter.cpp
+++ b/llvm/utils/TableGen/CompressInstEmitter.cpp
@@ -904,8 +904,8 @@ void CompressInstEmitter::emitCompressInstEmitter(raw_ostream &OS,
       }
     }
     if (EType == EmitterType::CheckCompress) {
-      CodeStream.indent(6) << "if (Size) *Size = " << Dest.TheDef->getValueAsInt("Size")
-                           << ";\n";
+      CodeStream.indent(6) << "if (Size) *Size = "
+                           << Dest.TheDef->getValueAsInt("Size") << ";\n";
     }
     if (CompressOrUncompress)
       CodeStream.indent(6) << "OutInst.setLoc(MI.getLoc());\n";



More information about the llvm-commits mailing list