https://github.com/llvmbot created https://github.com/llvm/llvm-project/pull/178231
Backport 3ed4830 Requested by: @svs-quic >From 9082fc3f19f0160f74864276fdd9c6116e554346 Mon Sep 17 00:00:00 2001 From: Sudharsan Veeravalli <[email protected]> Date: Mon, 26 Jan 2026 15:43:00 +0530 Subject: [PATCH] [RISCV] Run combineOrToBitfieldInsert after DAG legalize (#177830) Not combing `OR` into `QC.INSB(I)` before DAG legalization helps known bits analysis to simplify the code if possible. (cherry picked from commit 3ed48305ab19bf0090d2ca714a37dd7b0667b6c2) --- llvm/lib/Target/RISCV/RISCVISelLowering.cpp | 7 ++++--- llvm/test/CodeGen/RISCV/xqcibm-insert.ll | 22 +++++++++++++++++++++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp index 2e9e5bbc65983..846e181b7e5af 100644 --- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp @@ -17006,8 +17006,6 @@ static SDValue performORCombine(SDNode *N, TargetLowering::DAGCombinerInfo &DCI, const RISCVSubtarget &Subtarget) { SelectionDAG &DAG = DCI.DAG; - if (SDValue V = combineOrToBitfieldInsert(N, DAG, Subtarget)) - return V; if (SDValue V = combineOrAndToBitfieldInsert(N, DAG, Subtarget)) return V; if (SDValue V = combineBinOpToReduce(N, DAG, Subtarget)) @@ -17015,9 +17013,12 @@ static SDValue performORCombine(SDNode *N, TargetLowering::DAGCombinerInfo &DCI, if (SDValue V = combineBinOpOfExtractToReduceTree(N, DAG, Subtarget)) return V; - if (DCI.isAfterLegalizeDAG()) + if (DCI.isAfterLegalizeDAG()) { + if (SDValue V = combineOrToBitfieldInsert(N, DAG, Subtarget)) + return V; if (SDValue V = combineDeMorganOfBoolean(N, DAG)) return V; + } // Look for Or of CZERO_EQZ/NEZ with same condition which is the select idiom. // We may be able to pull a common operation out of the true and false value. diff --git a/llvm/test/CodeGen/RISCV/xqcibm-insert.ll b/llvm/test/CodeGen/RISCV/xqcibm-insert.ll index 234bd233ec9af..043a184d34ccd 100644 --- a/llvm/test/CodeGen/RISCV/xqcibm-insert.ll +++ b/llvm/test/CodeGen/RISCV/xqcibm-insert.ll @@ -401,3 +401,25 @@ define i32 @bseti_i32_10(i32 %a) nounwind { %or = or i32 %a, 1024 ret i32 %or } + +define i1 @no_insbi_known_bits(i32 %arg) { +; RV32I-LABEL: no_insbi_known_bits: +; RV32I: # %bb.0: +; RV32I-NEXT: li a0, 1 +; RV32I-NEXT: ret +; +; RV32IXQCIBM-LABEL: no_insbi_known_bits: +; RV32IXQCIBM: # %bb.0: +; RV32IXQCIBM-NEXT: li a0, 1 +; RV32IXQCIBM-NEXT: ret +; +; RV32IXQCIBMZBS-LABEL: no_insbi_known_bits: +; RV32IXQCIBMZBS: # %bb.0: +; RV32IXQCIBMZBS-NEXT: li a0, 1 +; RV32IXQCIBMZBS-NEXT: ret + %a = or i32 %arg, 2147483647 + %b = call i32 @llvm.bswap.i32(i32 %a) + %and = and i32 %b, 127 + %res = icmp eq i32 %and, 127 + ret i1 %res +} _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
