[llvm] [RISCV] Add compress patterns for Xqcisync instructions (PR #138629)

Sudharsan Veeravalli via llvm-commits llvm-commits at lists.llvm.org
Mon May 5 23:33:36 PDT 2025


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

>From 81e9d236714c0653d93ce2527cf85fca29337349 Mon Sep 17 00:00:00 2001
From: Sudharsan Veeravalli <quic_svs at quicinc.com>
Date: Tue, 6 May 2025 10:00:43 +0530
Subject: [PATCH] [RISCV] Add compress patterns for Xqcisync instructions

---
 llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td | 16 ++++++
 llvm/test/MC/RISCV/xqcisync-valid.s         | 56 +++++++++++++++------
 2 files changed, 57 insertions(+), 15 deletions(-)

diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td b/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td
index 89b0595bc21fc..34b65e1ad98e3 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td
@@ -63,6 +63,15 @@ def uimm5slist : RISCVOp<XLenVT>, ImmLeaf<XLenVT,
   let EncoderMethod = "getImmOpValueSlist";
   let DecoderMethod = "decodeUImmSlistOperand";
   let OperandType = "OPERAND_UIMM5_SLIST";
+  let MCOperandPredicate = [{
+    int64_t Imm;
+    if (!MCOp.evaluateAsConstantImm(Imm))
+      return false;
+    return ((Imm == 0)  || (Imm == 1)  ||
+            (Imm == 2)  || (Imm == 4)  ||
+            (Imm == 8)  || (Imm == 16) ||
+            (Imm == 15) || (Imm == 31));
+  }];
 }
 
 def uimm10 : RISCVUImmLeafOp<10>;
@@ -1329,6 +1338,13 @@ def : Pat<(riscv_mileaveret_glue), (QC_C_MILEAVERET)>;
 // Compress Instruction tablegen backend.
 //===----------------------------------------------------------------------===//
 
+let Predicates = [HasVendorXqcisync, IsRV32] in {
+def : CompressPat<(QC_SYNC uimm5slist:$imm5), (QC_C_SYNC uimm5slist:$imm5)>;
+def : CompressPat<(QC_SYNCR uimm5slist:$imm5), (QC_C_SYNCR uimm5slist:$imm5)>;
+def : CompressPat<(QC_SYNCWL uimm5slist:$imm5), (QC_C_SYNCWL uimm5slist:$imm5)>;
+def : CompressPat<(QC_SYNCWF uimm5slist:$imm5), (QC_C_SYNCWF uimm5slist:$imm5)>;
+} // Predicates = [HasVendorXqcisync, IsRV32]
+
 let isCompressOnly = true, Predicates = [HasVendorXqcilo, HasStdExtZcb, IsRV32] in {
 def : CompressPat<(QC_E_LBU GPRC:$rd, GPRCMem:$rs1, uimm2:$imm),
                   (C_LBU GPRC:$rd, GPRCMem:$rs1, uimm2:$imm)>;
diff --git a/llvm/test/MC/RISCV/xqcisync-valid.s b/llvm/test/MC/RISCV/xqcisync-valid.s
index 4f0063a6a488c..84ea74b74564f 100644
--- a/llvm/test/MC/RISCV/xqcisync-valid.s
+++ b/llvm/test/MC/RISCV/xqcisync-valid.s
@@ -1,11 +1,11 @@
 # Xqcisync - Qualcomm uC Sync Delay Extension
 # RUN: llvm-mc %s -triple=riscv32 -mattr=+experimental-xqcisync -M no-aliases -show-encoding \
-# RUN:     | FileCheck -check-prefixes=CHECK-ENC,CHECK-INST %s
+# RUN:     | FileCheck -check-prefixes=CHECK-ENC,CHECK-INST,CHECK-NOALIAS %s
 # RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+experimental-xqcisync < %s \
 # RUN:     | llvm-objdump --mattr=+experimental-xqcisync -M no-aliases --no-print-imm-hex -d - \
 # RUN:     | FileCheck -check-prefix=CHECK-INST %s
 # RUN: llvm-mc %s -triple=riscv32 -mattr=+experimental-xqcisync -show-encoding \
-# RUN:     | FileCheck -check-prefixes=CHECK-ENC,CHECK-INST %s
+# RUN:     | FileCheck -check-prefixes=CHECK-ENC,CHECK-INST,CHECK-ALIAS %s
 # RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+experimental-xqcisync < %s \
 # RUN:     | llvm-objdump --mattr=+experimental-xqcisync --no-print-imm-hex -d - \
 # RUN:     | FileCheck -check-prefix=CHECK-INST %s
@@ -14,34 +14,60 @@
 # CHECK-ENC: encoding: [0x2a,0x00]
 qc.c.delay 10
 
-# CHECK-INST: qc.sync      8
-# CHECK-ENC: encoding: [0x13,0x30,0x80,0x10]
-qc.sync 8
+# CHECK-INST: qc.sync      9
+# CHECK-ENC: encoding: [0x13,0x30,0x90,0x10]
+qc.sync 9
 
 # CHECK-INST: qc.syncr     23
 # CHECK-ENC: encoding: [0x13,0x30,0x70,0x21]
 qc.syncr 23
 
-# CHECK-INST: qc.syncwf    31
-# CHECK-ENC: encoding: [0x13,0x30,0xf0,0x41]
-qc.syncwf 31
+# CHECK-INST: qc.syncwf    30
+# CHECK-ENC: encoding: [0x13,0x30,0xe0,0x41]
+qc.syncwf 30
 
-# CHECK-INST: qc.syncwl    1
-# CHECK-ENC: encoding: [0x13,0x30,0x10,0x80]
-qc.syncwl 1
+# CHECK-INST: qc.syncwl    6
+# CHECK-ENC: encoding: [0x13,0x30,0x60,0x80]
+qc.syncwl 6
 
-# CHECK-INST: qc.c.sync      0
+# CHECK-NOALIAS: qc.c.sync      0
+# CHECK-ALIAS: qc.sync 0
 # CHECK-ENC: encoding: [0x01,0x80]
 qc.c.sync 0
 
-# CHECK-INST: qc.c.syncr     15
+# CHECK-NOALIAS: qc.c.syncr     15
+# CHECK-ALIAS: qc.syncr 15
 # CHECK-ENC: encoding: [0x01,0x87]
 qc.c.syncr 15
 
-# CHECK-INST: qc.c.syncwf    31
+# CHECK-NOALIAS: qc.c.syncwf    31
+# CHECK-ALIAS: qc.syncwf 31
 # CHECK-ENC: encoding: [0x81,0x93]
 qc.c.syncwf 31
 
-# CHECK-INST: qc.c.syncwl    4
+# CHECK-NOALIAS: qc.c.syncwl    4
+# CHECK-ALIAS: qc.syncwl 4
 # CHECK-ENC: encoding: [0x81,0x95]
 qc.c.syncwl 4
+
+# Check that compressed patterns work
+
+# CHECK-NOALIAS: qc.c.sync      8
+# CHECK-ALIAS: qc.sync 8
+# CHECK-ENC: encoding: [0x01,0x82]
+qc.sync 8
+
+# CHECK-NOALIAS: qc.c.syncr     31
+# CHECK-ALIAS: qc.syncr 31
+# CHECK-ENC: encoding: [0x81,0x87]
+qc.syncr 31
+
+# CHECK-NOALIAS: qc.c.syncwf    0
+# CHECK-ALIAS: qc.syncwf 0
+# CHECK-ENC: encoding: [0x01,0x90]
+qc.syncwf 0
+
+# CHECK-NOALIAS: qc.c.syncwl    16
+# CHECK-ALIAS: qc.syncwl 16
+# CHECK-ENC: encoding: [0x81,0x96]
+qc.syncwl 16



More information about the llvm-commits mailing list