[llvm] [RISCV][XQCI] Add a test that shows getInstSizeInBytes returning an incorrect instruction size. NFC (PR #224787)

Sudharsan Veeravalli via llvm-commits llvm-commits at lists.llvm.org
Sat Sep 19 18:30:13 PDT 2026


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

>From db350ff8cae0d5c4d0daf05016faea32b822914e Mon Sep 17 00:00:00 2001
From: Sudharsan Veeravalli <svs at qti.qualcomm.com>
Date: Sat, 19 Sep 2026 07:29:55 +0530
Subject: [PATCH] [RISCV] Add a test that shows incorrect instruction sizes

---
 .../Target/RISCV/RISCVInstrInfoTest.cpp       | 99 ++++++++++++++++++-
 1 file changed, 97 insertions(+), 2 deletions(-)

diff --git a/llvm/unittests/Target/RISCV/RISCVInstrInfoTest.cpp b/llvm/unittests/Target/RISCV/RISCVInstrInfoTest.cpp
index 2744dbc0907bf..cb18413c7ddc2 100644
--- a/llvm/unittests/Target/RISCV/RISCVInstrInfoTest.cpp
+++ b/llvm/unittests/Target/RISCV/RISCVInstrInfoTest.cpp
@@ -41,14 +41,14 @@ class RISCVInstrInfoTest : public testing::TestWithParam<const char *> {
     LLVMInitializeRISCVTargetMC();
   }
 
-  RISCVInstrInfoTest() {
+  RISCVInstrInfoTest(StringRef Features = "") {
     std::string Error;
     Triple TT(GetParam());
     const Target *TheTarget = TargetRegistry::lookupTarget(TT, Error);
     TargetOptions Options;
 
     TM.reset(static_cast<RISCVTargetMachine *>(TheTarget->createTargetMachine(
-        TT, "generic", "", Options, std::nullopt, std::nullopt,
+        TT, "generic", Features, Options, std::nullopt, std::nullopt,
         CodeGenOptLevel::Default)));
 
     Ctx = std::make_unique<LLVMContext>();
@@ -67,6 +67,11 @@ class RISCVInstrInfoTest : public testing::TestWithParam<const char *> {
   }
 };
 
+class RISCVXQCIInstrInfoTest : public RISCVInstrInfoTest {
+protected:
+  RISCVXQCIInstrInfoTest() : RISCVInstrInfoTest("+xqci") {}
+};
+
 TEST_P(RISCVInstrInfoTest, IsAddImmediate) {
   const RISCVInstrInfo *TII = ST->getInstrInfo();
   DebugLoc DL;
@@ -379,7 +384,97 @@ TEST_P(RISCVInstrInfoTest, GetDestEEW) {
   EXPECT_EQ(RISCV::getDestLog2EEW(TII->get(RISCV::TH_VMAQA_VV), 5), 5u);
 }
 
+TEST_P(RISCVXQCIInstrInfoTest, XQCIEInstSize) {
+  const RISCVInstrInfo *TII = ST->getInstrInfo();
+  MachineBasicBlock *MBB = MF->CreateMachineBasicBlock();
+  MF->push_back(MBB);
+
+  auto MakeLoad = [&](unsigned Opcode) {
+    MachineMemOperand *MMO = MF->getMachineMemOperand(
+        MachinePointerInfo(), MachineMemOperand::MOLoad, 4, Align(4));
+    return BuildMI(MBB, DebugLoc(), TII->get(Opcode), RISCV::X0)
+        .addReg(RISCV::X14)
+        .addImm(0)
+        .addMemOperand(MMO)
+        .getInstr();
+  };
+
+  auto MakeStore = [&](unsigned Opcode) {
+    MachineMemOperand *MMO = MF->getMachineMemOperand(
+        MachinePointerInfo(), MachineMemOperand::MOStore, 4, Align(4));
+    return BuildMI(MBB, DebugLoc(), TII->get(Opcode))
+        .addReg(RISCV::X0)
+        .addReg(RISCV::X14)
+        .addImm(0)
+        .addMemOperand(MMO)
+        .getInstr();
+  };
+
+  auto MakeEAI = [&](unsigned Opcode) {
+    return BuildMI(MBB, DebugLoc(), TII->get(Opcode), RISCV::X31)
+        .addReg(RISCV::X31)
+        .addImm(100)
+        .getInstr();
+  };
+
+  auto MakeEI = [&](unsigned Opcode) {
+    return BuildMI(MBB, DebugLoc(), TII->get(Opcode), RISCV::X31)
+        .addReg(RISCV::X30)
+        .addImm(1)
+        .getInstr();
+  };
+
+  auto MakeBranch = [&](unsigned Opcode) {
+    return BuildMI(MBB, DebugLoc(), TII->get(Opcode))
+        .addReg(RISCV::X14)
+        .addImm(1)
+        .addImm(2)
+        .getInstr();
+  };
+
+  auto MakeJump = [&](unsigned Opcode) {
+    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));
+  };
+
+  CheckSize(MakeLoad(RISCV::QC_E_LW));
+  CheckSize(MakeLoad(RISCV::QC_E_LB));
+  CheckSize(MakeLoad(RISCV::QC_E_LH));
+  CheckSize(MakeLoad(RISCV::QC_E_LBU));
+  CheckSize(MakeLoad(RISCV::QC_E_LHU));
+  CheckSize(MakeStore(RISCV::QC_E_SW));
+  CheckSize(MakeStore(RISCV::QC_E_SB));
+  CheckSize(MakeStore(RISCV::QC_E_SH));
+  CheckSize(MakeJump(RISCV::QC_E_JAL));
+  CheckSize(MakeJump(RISCV::QC_E_J));
+  CheckSize(BuildMI(MBB, DebugLoc(), TII->get(RISCV::QC_E_LI), RISCV::X31)
+                .addImm(123)
+                .getInstr());
+  CheckSize(MakeEI(RISCV::QC_E_ADDI));
+  CheckSize(MakeEI(RISCV::QC_E_ANDI));
+  CheckSize(MakeEI(RISCV::QC_E_ORI));
+  CheckSize(MakeEI(RISCV::QC_E_XORI));
+  CheckSize(MakeEAI(RISCV::QC_E_ADDAI));
+  CheckSize(MakeEAI(RISCV::QC_E_ANDAI));
+  CheckSize(MakeEAI(RISCV::QC_E_ORAI));
+  CheckSize(MakeEAI(RISCV::QC_E_XORAI));
+  CheckSize(MakeBranch(RISCV::QC_E_BEQI));
+  CheckSize(MakeBranch(RISCV::QC_E_BNEI));
+  CheckSize(MakeBranch(RISCV::QC_E_BLTI));
+  CheckSize(MakeBranch(RISCV::QC_E_BGEUI));
+  CheckSize(MakeBranch(RISCV::QC_E_BLTUI));
+  CheckSize(MakeBranch(RISCV::QC_E_BGEI));
+}
+
 } // namespace
 
 INSTANTIATE_TEST_SUITE_P(RV32And64, RISCVInstrInfoTest,
                          testing::Values("riscv32", "riscv64"));
+INSTANTIATE_TEST_SUITE_P(RV32, RISCVXQCIInstrInfoTest,
+                         testing::Values("riscv32"));



More information about the llvm-commits mailing list