[llvm] [RISCV] Add assembler support to lower `la/lla` to `qc.e.li` (PR #205782)

via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 25 19:05:43 PDT 2026


https://github.com/hchandel updated https://github.com/llvm/llvm-project/pull/205782

>From f163b03b20819f9c80d8485f11257928a41f951d Mon Sep 17 00:00:00 2001
From: Harsh Chandel <hchandel at qti.qualcomm.com>
Date: Thu, 25 Jun 2026 15:25:52 +0530
Subject: [PATCH 1/2] [RISCV] Add assembler support to lower la/lla to qc.e.li

Change-Id: I62738d4157bb7566e8283c6a22d5c168eeed15f2
---
 .../Target/RISCV/AsmParser/RISCVAsmParser.cpp |  9 +++-
 llvm/test/MC/RISCV/xqcili-load-address.s      | 41 +++++++++++++++++++
 2 files changed, 48 insertions(+), 2 deletions(-)
 create mode 100644 llvm/test/MC/RISCV/xqcili-load-address.s

diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
index 9362a600b12b3..345e649171de0 100644
--- a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
+++ b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
@@ -3646,8 +3646,13 @@ void RISCVAsmParser::emitLoadLocalAddress(MCInst &Inst, SMLoc IDLoc,
   //             ADDI rdest, rdest, %pcrel_lo(TmpLabel)
   MCRegister DestReg = Inst.getOperand(0).getReg();
   const MCExpr *Symbol = Inst.getOperand(1).getExpr();
-  emitAuipcInstPair(DestReg, DestReg, Symbol, RISCV::S_PCREL_HI, RISCV::ADDI,
-                    IDLoc, Out);
+  if (STI->hasFeature(RISCV::Feature32Bit) &&
+      STI->hasFeature(RISCV::FeatureVendorXqcili)) {
+    emitToStreamer(
+        Out, MCInstBuilder(RISCV::QC_E_LI).addReg(DestReg).addExpr(Symbol));
+  } else
+    emitAuipcInstPair(DestReg, DestReg, Symbol, RISCV::S_PCREL_HI, RISCV::ADDI,
+                      IDLoc, Out);
 }
 
 void RISCVAsmParser::emitLoadGlobalAddress(MCInst &Inst, SMLoc IDLoc,
diff --git a/llvm/test/MC/RISCV/xqcili-load-address.s b/llvm/test/MC/RISCV/xqcili-load-address.s
new file mode 100644
index 0000000000000..33aa3c1a796cc
--- /dev/null
+++ b/llvm/test/MC/RISCV/xqcili-load-address.s
@@ -0,0 +1,41 @@
+# RUN: llvm-mc -triple=riscv32 -mattr=+xqcili %s \
+# RUN:     | FileCheck -check-prefix=ASM %s
+# RUN: llvm-mc -triple=riscv32 -mattr=+xqcili %s \
+# RUN:     -filetype=obj -o - \
+# RUN:     | llvm-objdump --no-addresses -dr --mattr=+xqcili - \
+# RUN:     | FileCheck -check-prefix=OBJ %s
+
+## This test checks that we are lowering la/lla to qc.e.li correctly
+
+lla x6, abs_sym
+// ASM: qc.e.li	t1, abs_sym
+// OBJ: 031f 0000 0000        	qc.e.li	t1, 0x0
+// OBJ-NEXT: R_RISCV_VENDOR	QUALCOMM
+// OBJ-NEXT: R_RISCV_QC_E_32	abs_sym
+
+lla x6, same_section
+// ASM: qc.e.li	t1, same_section
+// OBJ: 031f 0000 0000        	qc.e.li	t1, 0x0
+// OBJ-NEXT: R_RISCV_VENDOR	QUALCOMM
+// OBJ-NEXT: R_RISCV_QC_E_32	same_section
+
+.option nopic
+// ASM: .option	nopic
+
+la x6, same_section
+// ASM: qc.e.li	t1, same_section
+// OBJ: 031f 0000 0000        	qc.e.li	t1, 0x0
+// OBJ-NEXT: R_RISCV_VENDOR	QUALCOMM
+// OBJ-NEXT: R_RISCV_QC_E_32	same_section
+
+la x6, abs_sym
+// ASM: qc.e.li	t1, abs_sym
+// OBJ: 031f 0000 0000        	qc.e.li	t1, 0x0
+// OBJ-NEXT: R_RISCV_VENDOR	QUALCOMM
+// OBJ-NEXT: R_RISCV_QC_E_32	abs_sym
+
+same_section:
+// ASM: same_section:
+nop
+// ASM: nop
+// OBJ: 0001                  	nop

>From b6b3fabe21f5ec0dd07c205a7ee778132c3cf43b Mon Sep 17 00:00:00 2001
From: Harsh Chandel <hchandel at qti.qualcomm.com>
Date: Fri, 26 Jun 2026 07:33:42 +0530
Subject: [PATCH 2/2] fixup! drop if braces

Change-Id: I6316ca53c71e0fbb6583bc4d7b73316fa488cf60
---
 llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
index 345e649171de0..7298a4db866d5 100644
--- a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
+++ b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
@@ -3647,10 +3647,10 @@ void RISCVAsmParser::emitLoadLocalAddress(MCInst &Inst, SMLoc IDLoc,
   MCRegister DestReg = Inst.getOperand(0).getReg();
   const MCExpr *Symbol = Inst.getOperand(1).getExpr();
   if (STI->hasFeature(RISCV::Feature32Bit) &&
-      STI->hasFeature(RISCV::FeatureVendorXqcili)) {
+      STI->hasFeature(RISCV::FeatureVendorXqcili))
     emitToStreamer(
         Out, MCInstBuilder(RISCV::QC_E_LI).addReg(DestReg).addExpr(Symbol));
-  } else
+  else
     emitAuipcInstPair(DestReg, DestReg, Symbol, RISCV::S_PCREL_HI, RISCV::ADDI,
                       IDLoc, Out);
 }



More information about the llvm-commits mailing list