[llvm] [RISCV] Convert ORI with SingleBitSetMaskImm12 to BSETI when Xqcibm is enabled (PR #174054)

via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 30 21:53:29 PST 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-risc-v

Author: Sudharsan Veeravalli (svs-quic)

<details>
<summary>Changes</summary>

`BSETI` can be compressed to `QC_C_BSETI` when `Xqcibm` is enabled.

---
Full diff: https://github.com/llvm/llvm-project/pull/174054.diff


2 Files Affected:

- (modified) llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td (+9) 
- (modified) llvm/test/CodeGen/RISCV/xqcibm-insert.ll (+57) 


``````````diff
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td b/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td
index d12e49c49879d..283ff0e12670a 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td
@@ -221,6 +221,10 @@ def AddLike: PatFrags<(ops node:$A, node:$B),
     return CurDAG->isBaseWithConstantOffset(SDValue(N, 0));
 }]>;
 
+def SingleBitSetMaskImm12 : RISCVOp<XLenVT>, ImmLeaf<XLenVT, [{
+  return isPowerOf2_32(Imm) && isInt<12>(Imm) && Imm != 1;
+}], SingleBitSetMaskToIndex>;
+
 //===----------------------------------------------------------------------===//
 // Instruction Formats
 //===----------------------------------------------------------------------===//
@@ -1739,6 +1743,11 @@ def: Pat<(i32 (qc_e_li tjumptable:$A)), (QC_E_LI bare_simm32:$A)>;
 def: Pat<(i32 (qc_e_li tconstpool:$A)), (QC_E_LI bare_simm32:$A)>;
 } // Predicates = [HasVendorXqcili, IsRV32]
 
+let Predicates = [HasVendorXqcibm, HasStdExtZbs, IsRV32], AddedComplexity = 1 in {
+def : Pat<(XLenVT (or GPR:$rs1, SingleBitSetMaskImm12:$mask)),
+          (BSETI GPR:$rs1, SingleBitSetMaskImm12:$mask)>;
+} // Predicates = [HasVendorXqcibm, HasStdExtZbs, IsRV32]
+
 //===----------------------------------------------------------------------===/i
 // Compress Instruction tablegen backend.
 //===----------------------------------------------------------------------===//
diff --git a/llvm/test/CodeGen/RISCV/xqcibm-insert.ll b/llvm/test/CodeGen/RISCV/xqcibm-insert.ll
index 2405879437404..234bd233ec9af 100644
--- a/llvm/test/CodeGen/RISCV/xqcibm-insert.ll
+++ b/llvm/test/CodeGen/RISCV/xqcibm-insert.ll
@@ -344,3 +344,60 @@ define i64 @test8(i64 %a) {
   %2 = or i64 %1, 157601565442048     ; 0x00008f5679530000
   ret i64 %2
 }
+
+define i32 @no_bseti_1(i32 %a, i32 %b, i32 %c) nounwind {
+; RV32I-LABEL: no_bseti_1:
+; RV32I:       # %bb.0:
+; RV32I-NEXT:    ori a0, a1, 1
+; RV32I-NEXT:    ret
+;
+; RV32IXQCIBM-LABEL: no_bseti_1:
+; RV32IXQCIBM:       # %bb.0:
+; RV32IXQCIBM-NEXT:    ori a0, a1, 1
+; RV32IXQCIBM-NEXT:    ret
+;
+; RV32IXQCIBMZBS-LABEL: no_bseti_1:
+; RV32IXQCIBMZBS:       # %bb.0:
+; RV32IXQCIBMZBS-NEXT:    ori a0, a1, 1
+; RV32IXQCIBMZBS-NEXT:    ret
+  %or = or i32 %b, 1
+  ret i32 %or
+}
+
+define i32 @bseti_2(i32 %a, i32 %b, i32 %c) nounwind {
+; RV32I-LABEL: bseti_2:
+; RV32I:       # %bb.0:
+; RV32I-NEXT:    ori a0, a1, 2
+; RV32I-NEXT:    ret
+;
+; RV32IXQCIBM-LABEL: bseti_2:
+; RV32IXQCIBM:       # %bb.0:
+; RV32IXQCIBM-NEXT:    ori a0, a1, 2
+; RV32IXQCIBM-NEXT:    ret
+;
+; RV32IXQCIBMZBS-LABEL: bseti_2:
+; RV32IXQCIBMZBS:       # %bb.0:
+; RV32IXQCIBMZBS-NEXT:    bseti a0, a1, 1
+; RV32IXQCIBMZBS-NEXT:    ret
+  %or = or i32 %b, 2
+  ret i32 %or
+}
+
+define i32 @bseti_i32_10(i32 %a) nounwind {
+; RV32I-LABEL: bseti_i32_10:
+; RV32I:       # %bb.0:
+; RV32I-NEXT:    ori a0, a0, 1024
+; RV32I-NEXT:    ret
+;
+; RV32IXQCIBM-LABEL: bseti_i32_10:
+; RV32IXQCIBM:       # %bb.0:
+; RV32IXQCIBM-NEXT:    ori a0, a0, 1024
+; RV32IXQCIBM-NEXT:    ret
+;
+; RV32IXQCIBMZBS-LABEL: bseti_i32_10:
+; RV32IXQCIBMZBS:       # %bb.0:
+; RV32IXQCIBMZBS-NEXT:    bseti a0, a0, 10
+; RV32IXQCIBMZBS-NEXT:    ret
+  %or = or i32 %a, 1024
+  ret i32 %or
+}

``````````

</details>


https://github.com/llvm/llvm-project/pull/174054


More information about the llvm-commits mailing list