[llvm] [RISCV] Change the InstFormat for Zicbop prefetch instructions to InstFormatOther. (PR #148934)

Craig Topper via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 15 12:14:09 PDT 2025


https://github.com/topperc created https://github.com/llvm/llvm-project/pull/148934

The lower 5-bits of the immediate are not part of the address unlike other InstFormatS instructions.

We use InstFormatS in RISCVRegisterInfo::needsFrameBaseReg and RISCVRegisterInfo::getFrameIndexInstrOffset which is not aware of this special encoding. Force the format to InstFormatOther so those functions will ignore it.

InstFormatS is also used by relocation emission, but I don't believe we ever emit these instructions with a relocation because of the encoding.

>From cd6976fc4b525357b7c9ae2e01643b8965921d45 Mon Sep 17 00:00:00 2001
From: Craig Topper <craig.topper at sifive.com>
Date: Tue, 15 Jul 2025 12:07:51 -0700
Subject: [PATCH] [RISCV] Change the InstFormat for Zicbop prefetch
 instructions to InstFormatOther.

The lower 5-bits of the immediate are not part of the address unlike
other InstFormatS instructions.

We use InstFormatS in RISCVRegisterInfo::needsFrameBaseReg
and RISCVRegisterInfo::getFrameIndexInstrOffset which is not aware of
this special encoding. Force the format to InstFormatOther so those
functions will ignore it.

InstFormatS is also used by relocation emission, but I don't believe
we ever emit these instructions with a relocation because of the encoding.
---
 llvm/lib/Target/RISCV/RISCVInstrFormats.td   | 4 +++-
 llvm/lib/Target/RISCV/RISCVInstrInfoZicbo.td | 1 +
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/llvm/lib/Target/RISCV/RISCVInstrFormats.td b/llvm/lib/Target/RISCV/RISCVInstrFormats.td
index b6b64b57b1b3e..e23001a3a0bff 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrFormats.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrFormats.td
@@ -193,7 +193,9 @@ class RVInstCommon<dag outs, dag ins, string opcodestr, string argstr,
   let AsmString = opcodestr # !if(!empty(argstr), "", "\t" # argstr);
   let Pattern = pattern;
 
-  let TSFlags{4-0} = format.Value;
+  InstFormat Format = format;
+
+  let TSFlags{4-0} = Format.Value;
 
   // Defaults
   RISCVVConstraint RVVConstraint = NoConstraint;
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoZicbo.td b/llvm/lib/Target/RISCV/RISCVInstrInfoZicbo.td
index 878b85b141578..0723b2f568a79 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfoZicbo.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfoZicbo.td
@@ -41,6 +41,7 @@ class Prefetch_ri<bits<5> optype, string opcodestr>
               opcodestr, "${imm12}(${rs1})"> {
   let Inst{11-7} = 0b00000;
   let rs2 = optype;
+  let Format = InstFormatOther; // this does not follow the normal S format.
 }
 
 //===----------------------------------------------------------------------===//



More information about the llvm-commits mailing list