[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