[llvm] [RISCV] Add compress pattern for Xqcilb QC_E_J/JAL to JAL (PR #141561)

Sudharsan Veeravalli via llvm-commits llvm-commits at lists.llvm.org
Tue May 27 01:41:26 PDT 2025


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

>From d13d6bfada36acf0509d4e560e8851af315c8e5c Mon Sep 17 00:00:00 2001
From: Sudharsan Veeravalli <quic_svs at quicinc.com>
Date: Tue, 27 May 2025 13:44:15 +0530
Subject: [PATCH 1/2] [RISCV] Add compress pattern for Xqcilb QC_E_J/JAL to JAL

---
 llvm/lib/Target/RISCV/RISCVInstrInfo.td     |  3 ++-
 llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td |  4 ++++
 llvm/test/MC/RISCV/xqcilb-valid.s           | 14 ++++++++++++++
 3 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.td b/llvm/lib/Target/RISCV/RISCVInstrInfo.td
index 9058934557b54..de424b3be852b 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfo.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.td
@@ -379,7 +379,8 @@ def Simm21Lsb0JALAsmOperand : BareSImmNLsb0AsmOperand<21> {
 }
 
 // A 21-bit signed immediate where the least significant bit is zero.
-def simm21_lsb0_jal : Operand<OtherVT> {
+def simm21_lsb0_jal : Operand<OtherVT>,
+                      ImmLeaf<XLenVT, [{return isShiftedInt<20, 1>(Imm);}]>  {
   let ParserMatchClass = Simm21Lsb0JALAsmOperand;
   let PrintMethod = "printBranchOperand";
   let EncoderMethod = "getImmOpValueAsrN<1>";
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td b/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td
index c4d6d2d704526..f52d21c5299d2 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td
@@ -1514,6 +1514,10 @@ def : CompressPat<(QC_E_J bare_simm12_lsb0:$offset),
                   (C_J bare_simm12_lsb0:$offset)>;
 def : CompressPat<(QC_E_JAL bare_simm12_lsb0:$offset),
                   (C_JAL bare_simm12_lsb0:$offset)>;
+def : CompressPat<(QC_E_JAL simm21_lsb0_jal:$offset),
+                  (JAL X1, simm21_lsb0_jal:$offset)>;
+def : CompressPat<(QC_E_J simm21_lsb0_jal:$offset),
+                  (JAL X0, simm21_lsb0_jal:$offset)>;
 } // isCompressOnly = true, Predicates = [HasVendorXqcilb, IsRV32]
 
 let Predicates = [HasVendorXqcili, IsRV32] in {
diff --git a/llvm/test/MC/RISCV/xqcilb-valid.s b/llvm/test/MC/RISCV/xqcilb-valid.s
index 4653bfe958772..3d5b3891ddff6 100644
--- a/llvm/test/MC/RISCV/xqcilb-valid.s
+++ b/llvm/test/MC/RISCV/xqcilb-valid.s
@@ -35,3 +35,17 @@ qc.e.jal 0xffffff8c
 # CHECK-OBJ-ALIAS: j 0x40e
 # CHECK-ENC: encoding: [0x01,0xa1]
 qc.e.j 1024
+
+# CHECK-NOALIAS: jal ra, 3000
+# CHECK-ALIAS: jal 3000
+# CHECK-OBJ-NOALIAS: jal ra, 0xbc8
+# CHECK-OBJ-ALIAS: jal 0xbc8
+# CHECK-ENC: encoding: [0xef,0x00,0x90,0x3b]
+qc.e.jal 3000
+
+# CHECK-NOALIAS: jal zero, -3000
+# CHECK-ALIAS: j -3000
+# CHECK-OBJ-NOALIAS: jal zero, 0xfffff45c
+# CHECK-OBJ-ALIAS: j 0xfffff45c
+# CHECK-ENC: encoding: [0x6f,0xf0,0x8f,0xc4]
+qc.e.j -3000

>From d2f5cbbeb2cde3614f41361e07b8154eddb9b59a Mon Sep 17 00:00:00 2001
From: Sudharsan Veeravalli <quic_svs at quicinc.com>
Date: Tue, 27 May 2025 14:09:35 +0530
Subject: [PATCH 2/2] qc.e.li pattern

---
 llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td | 8 ++++++--
 llvm/test/MC/RISCV/xqcili-valid.s           | 5 +++++
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td b/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td
index f52d21c5299d2..f292c93765744 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td
@@ -124,7 +124,8 @@ def simm16nonzero : RISCVOp<XLenVT>,
   let OperandType = "OPERAND_SIMM16_NONZERO";
 }
 
-def simm20_li : RISCVOp<XLenVT> {
+def simm20_li : RISCVOp<XLenVT>,
+                ImmLeaf<XLenVT, [{return isInt<20>(Imm);}]>{
   let ParserMatchClass = SImmAsmOperand<20, "LI">;
   let EncoderMethod = "getImmOpValue";
   let DecoderMethod = "decodeSImmOperand<20>";
@@ -1524,9 +1525,12 @@ let Predicates = [HasVendorXqcili, IsRV32] in {
 def : CompressPat<(QC_LI GPRNoX0:$rd, simm6:$imm),
                   (C_LI GPRNoX0:$rd, simm6:$imm)>;
 
-let isCompressOnly = true in
+let isCompressOnly = true in {
 def : CompressPat<(QC_E_LI GPRNoX0:$rd, simm6:$imm),
                   (C_LI GPRNoX0:$rd, simm6:$imm)>;
+def : CompressPat<(QC_E_LI GPRNoX0:$rd, simm20_li:$imm),
+                  (QC_LI GPRNoX0:$rd, simm20_li:$imm)>;
+} // isCompressOnly = true
 } // Predicates = [HasVendorXqcili, IsRV32]
 
 let isCompressOnly = true, Predicates = [HasVendorXqcilia, IsRV32] in {
diff --git a/llvm/test/MC/RISCV/xqcili-valid.s b/llvm/test/MC/RISCV/xqcili-valid.s
index aa2898da3173a..8e9c164de662c 100644
--- a/llvm/test/MC/RISCV/xqcili-valid.s
+++ b/llvm/test/MC/RISCV/xqcili-valid.s
@@ -53,3 +53,8 @@ qc.e.li x10, 4294967295
 # CHECK-NOALIAS: c.li a0, 31
 # CHECK-ENC: encoding: [0x7d,0x45]
 qc.li x10, 31
+
+# CHECK-ALIAS: li a0, 4294
+# CHECK-NOALIAS: qc.li a0, 4294
+# CHECK-ENC: encoding: [0x1b,0x05,0xc6,0x10]
+qc.e.li x10, 4294



More information about the llvm-commits mailing list