[llvm] [RISCV] Implement computeKnownBitsForTargetNode for SHL_ADD (PR #159105)

Piotr Fusik via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 16 07:27:56 PDT 2025


https://github.com/pfusik created https://github.com/llvm/llvm-project/pull/159105

None

>From 78dd3052db44daac95108d5c3719b47a93ff1f6f Mon Sep 17 00:00:00 2001
From: Piotr Fusik <p.fusik at samsung.com>
Date: Tue, 16 Sep 2025 15:00:59 +0200
Subject: [PATCH 1/2] [RISCV][test] Add tests for SHL_ADD KnownBits

---
 llvm/test/CodeGen/RISCV/rv32zba.ll | 36 ++++++++++++++++++++++++++++++
 llvm/test/CodeGen/RISCV/rv64zba.ll | 36 ++++++++++++++++++++++++++++++
 2 files changed, 72 insertions(+)

diff --git a/llvm/test/CodeGen/RISCV/rv32zba.ll b/llvm/test/CodeGen/RISCV/rv32zba.ll
index ab099103b4216..c572fb20634b0 100644
--- a/llvm/test/CodeGen/RISCV/rv32zba.ll
+++ b/llvm/test/CodeGen/RISCV/rv32zba.ll
@@ -1136,3 +1136,39 @@ define i32 @mul_neg8(i32 %a) {
   %c = mul i32 %a, -8
   ret i32 %c
 }
+
+define ptr @shl_add_knownbits(ptr %p, i32 %i) {
+; RV32I-LABEL: shl_add_knownbits:
+; RV32I:       # %bb.0:
+; RV32I-NEXT:    slli a1, a1, 18
+; RV32I-NEXT:    srli a1, a1, 18
+; RV32I-NEXT:    slli a2, a1, 1
+; RV32I-NEXT:    slli a1, a1, 3
+; RV32I-NEXT:    sub a1, a1, a2
+; RV32I-NEXT:    srli a1, a1, 3
+; RV32I-NEXT:    add a0, a0, a1
+; RV32I-NEXT:    ret
+;
+; RV32ZBA-LABEL: shl_add_knownbits:
+; RV32ZBA:       # %bb.0:
+; RV32ZBA-NEXT:    slli a1, a1, 18
+; RV32ZBA-NEXT:    srli a1, a1, 18
+; RV32ZBA-NEXT:    sh1add a1, a1, a1
+; RV32ZBA-NEXT:    slli a1, a1, 1
+; RV32ZBA-NEXT:    srli a1, a1, 3
+; RV32ZBA-NEXT:    add a0, a0, a1
+; RV32ZBA-NEXT:    ret
+;
+; RV32XANDESPERF-LABEL: shl_add_knownbits:
+; RV32XANDESPERF:       # %bb.0:
+; RV32XANDESPERF-NEXT:    nds.bfoz a1, a1, 13, 0
+; RV32XANDESPERF-NEXT:    nds.lea.h a1, a1, a1
+; RV32XANDESPERF-NEXT:    nds.bfoz a1, a1, 30, 2
+; RV32XANDESPERF-NEXT:    add a0, a0, a1
+; RV32XANDESPERF-NEXT:    ret
+  %and = and i32 %i, 16383
+  %mul = mul i32 %and, 6
+  %shr = lshr i32 %mul, 3
+  %r = getelementptr i8, ptr %p, i32 %shr
+  ret ptr %r
+}
diff --git a/llvm/test/CodeGen/RISCV/rv64zba.ll b/llvm/test/CodeGen/RISCV/rv64zba.ll
index b46f7cc440b7a..baa6c33694e23 100644
--- a/llvm/test/CodeGen/RISCV/rv64zba.ll
+++ b/llvm/test/CodeGen/RISCV/rv64zba.ll
@@ -4576,3 +4576,39 @@ define i64 @append_32ones(i64 %x) {
   %o = or i64 %s, 4294967295
   ret i64 %o
 }
+
+define ptr @shl_add_knownbits(ptr %p, i64 %i) {
+; RV64I-LABEL: shl_add_knownbits:
+; RV64I:       # %bb.0:
+; RV64I-NEXT:    slli a1, a1, 50
+; RV64I-NEXT:    srli a1, a1, 50
+; RV64I-NEXT:    slli a2, a1, 1
+; RV64I-NEXT:    slli a1, a1, 3
+; RV64I-NEXT:    sub a1, a1, a2
+; RV64I-NEXT:    srli a1, a1, 3
+; RV64I-NEXT:    add a0, a0, a1
+; RV64I-NEXT:    ret
+;
+; RV64ZBA-LABEL: shl_add_knownbits:
+; RV64ZBA:       # %bb.0:
+; RV64ZBA-NEXT:    slli a1, a1, 50
+; RV64ZBA-NEXT:    srli a1, a1, 50
+; RV64ZBA-NEXT:    sh1add a1, a1, a1
+; RV64ZBA-NEXT:    slli a1, a1, 1
+; RV64ZBA-NEXT:    srli a1, a1, 3
+; RV64ZBA-NEXT:    add a0, a0, a1
+; RV64ZBA-NEXT:    ret
+;
+; RV64XANDESPERF-LABEL: shl_add_knownbits:
+; RV64XANDESPERF:       # %bb.0:
+; RV64XANDESPERF-NEXT:    nds.bfoz a1, a1, 13, 0
+; RV64XANDESPERF-NEXT:    nds.lea.h a1, a1, a1
+; RV64XANDESPERF-NEXT:    nds.bfoz a1, a1, 62, 2
+; RV64XANDESPERF-NEXT:    add a0, a0, a1
+; RV64XANDESPERF-NEXT:    ret
+  %and = and i64 %i, 16383
+  %mul = mul i64 %and, 6
+  %shr = lshr i64 %mul, 3
+  %r = getelementptr i8, ptr %p, i64 %shr
+  ret ptr %r
+}

>From 68f7f51139a43bf667fe6ec6d0da62645c70d250 Mon Sep 17 00:00:00 2001
From: Piotr Fusik <p.fusik at samsung.com>
Date: Tue, 16 Sep 2025 15:01:05 +0200
Subject: [PATCH 2/2] [RISCV] Implement computeKnownBitsForTargetNode for
 SHL_ADD

---
 llvm/lib/Target/RISCV/RISCVISelLowering.cpp | 9 +++++++++
 llvm/test/CodeGen/RISCV/rv32zba.ll          | 5 ++---
 llvm/test/CodeGen/RISCV/rv64zba.ll          | 5 ++---
 3 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
index 9d90eb0a65218..66aa967f79929 100644
--- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
+++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
@@ -21561,6 +21561,15 @@ void RISCVTargetLowering::computeKnownBitsForTargetNode(const SDValue Op,
     Known = Known.sext(BitWidth);
     break;
   }
+  case RISCVISD::SHL_ADD: {
+    KnownBits Known2;
+    Known = DAG.computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
+    Known2 = DAG.computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
+    Known = KnownBits::shl(Known, Known2);
+    Known2 = DAG.computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
+    Known = KnownBits::add(Known, Known2);
+    break;
+  }
   case RISCVISD::CTZW: {
     KnownBits Known2 = DAG.computeKnownBits(Op.getOperand(0), Depth + 1);
     unsigned PossibleTZ = Known2.trunc(32).countMaxTrailingZeros();
diff --git a/llvm/test/CodeGen/RISCV/rv32zba.ll b/llvm/test/CodeGen/RISCV/rv32zba.ll
index c572fb20634b0..3d11cd9dfca68 100644
--- a/llvm/test/CodeGen/RISCV/rv32zba.ll
+++ b/llvm/test/CodeGen/RISCV/rv32zba.ll
@@ -1154,8 +1154,7 @@ define ptr @shl_add_knownbits(ptr %p, i32 %i) {
 ; RV32ZBA-NEXT:    slli a1, a1, 18
 ; RV32ZBA-NEXT:    srli a1, a1, 18
 ; RV32ZBA-NEXT:    sh1add a1, a1, a1
-; RV32ZBA-NEXT:    slli a1, a1, 1
-; RV32ZBA-NEXT:    srli a1, a1, 3
+; RV32ZBA-NEXT:    srli a1, a1, 2
 ; RV32ZBA-NEXT:    add a0, a0, a1
 ; RV32ZBA-NEXT:    ret
 ;
@@ -1163,7 +1162,7 @@ define ptr @shl_add_knownbits(ptr %p, i32 %i) {
 ; RV32XANDESPERF:       # %bb.0:
 ; RV32XANDESPERF-NEXT:    nds.bfoz a1, a1, 13, 0
 ; RV32XANDESPERF-NEXT:    nds.lea.h a1, a1, a1
-; RV32XANDESPERF-NEXT:    nds.bfoz a1, a1, 30, 2
+; RV32XANDESPERF-NEXT:    srli a1, a1, 2
 ; RV32XANDESPERF-NEXT:    add a0, a0, a1
 ; RV32XANDESPERF-NEXT:    ret
   %and = and i32 %i, 16383
diff --git a/llvm/test/CodeGen/RISCV/rv64zba.ll b/llvm/test/CodeGen/RISCV/rv64zba.ll
index baa6c33694e23..5df479d2680e0 100644
--- a/llvm/test/CodeGen/RISCV/rv64zba.ll
+++ b/llvm/test/CodeGen/RISCV/rv64zba.ll
@@ -4594,8 +4594,7 @@ define ptr @shl_add_knownbits(ptr %p, i64 %i) {
 ; RV64ZBA-NEXT:    slli a1, a1, 50
 ; RV64ZBA-NEXT:    srli a1, a1, 50
 ; RV64ZBA-NEXT:    sh1add a1, a1, a1
-; RV64ZBA-NEXT:    slli a1, a1, 1
-; RV64ZBA-NEXT:    srli a1, a1, 3
+; RV64ZBA-NEXT:    srli a1, a1, 2
 ; RV64ZBA-NEXT:    add a0, a0, a1
 ; RV64ZBA-NEXT:    ret
 ;
@@ -4603,7 +4602,7 @@ define ptr @shl_add_knownbits(ptr %p, i64 %i) {
 ; RV64XANDESPERF:       # %bb.0:
 ; RV64XANDESPERF-NEXT:    nds.bfoz a1, a1, 13, 0
 ; RV64XANDESPERF-NEXT:    nds.lea.h a1, a1, a1
-; RV64XANDESPERF-NEXT:    nds.bfoz a1, a1, 62, 2
+; RV64XANDESPERF-NEXT:    srli a1, a1, 2
 ; RV64XANDESPERF-NEXT:    add a0, a0, a1
 ; RV64XANDESPERF-NEXT:    ret
   %and = and i64 %i, 16383



More information about the llvm-commits mailing list