Skip to content

Commit 7a098ae

Browse files
authored
[RISCV] Implement computeKnownBitsForTargetNode for SHL_ADD (#159105)
1 parent af39a17 commit 7a098ae

File tree

3 files changed

+80
-0
lines changed

3 files changed

+80
-0
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21568,6 +21568,16 @@ void RISCVTargetLowering::computeKnownBitsForTargetNode(const SDValue Op,
2156821568
Known = Known.sext(BitWidth);
2156921569
break;
2157021570
}
21571+
case RISCVISD::SHL_ADD: {
21572+
KnownBits Known2;
21573+
Known = DAG.computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
21574+
unsigned ShAmt = Op.getConstantOperandVal(1);
21575+
Known <<= ShAmt;
21576+
Known.Zero.setLowBits(ShAmt); // the <<= operator left these bits unknown
21577+
Known2 = DAG.computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
21578+
Known = KnownBits::add(Known, Known2);
21579+
break;
21580+
}
2157121581
case RISCVISD::CTZW: {
2157221582
KnownBits Known2 = DAG.computeKnownBits(Op.getOperand(0), Depth + 1);
2157321583
unsigned PossibleTZ = Known2.trunc(32).countMaxTrailingZeros();

llvm/test/CodeGen/RISCV/rv32zba.ll

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1265,3 +1265,38 @@ define i64 @select9i64(i1 zeroext %x) {
12651265
%select = select i1 %x, i64 9, i64 0
12661266
ret i64 %select
12671267
}
1268+
1269+
define ptr @shl_add_knownbits(ptr %p, i32 %i) {
1270+
; RV32I-LABEL: shl_add_knownbits:
1271+
; RV32I: # %bb.0:
1272+
; RV32I-NEXT: slli a1, a1, 18
1273+
; RV32I-NEXT: srli a1, a1, 18
1274+
; RV32I-NEXT: slli a2, a1, 1
1275+
; RV32I-NEXT: slli a1, a1, 3
1276+
; RV32I-NEXT: sub a1, a1, a2
1277+
; RV32I-NEXT: srli a1, a1, 3
1278+
; RV32I-NEXT: add a0, a0, a1
1279+
; RV32I-NEXT: ret
1280+
;
1281+
; RV32ZBA-LABEL: shl_add_knownbits:
1282+
; RV32ZBA: # %bb.0:
1283+
; RV32ZBA-NEXT: slli a1, a1, 18
1284+
; RV32ZBA-NEXT: srli a1, a1, 18
1285+
; RV32ZBA-NEXT: sh1add a1, a1, a1
1286+
; RV32ZBA-NEXT: srli a1, a1, 2
1287+
; RV32ZBA-NEXT: add a0, a0, a1
1288+
; RV32ZBA-NEXT: ret
1289+
;
1290+
; RV32XANDESPERF-LABEL: shl_add_knownbits:
1291+
; RV32XANDESPERF: # %bb.0:
1292+
; RV32XANDESPERF-NEXT: nds.bfoz a1, a1, 13, 0
1293+
; RV32XANDESPERF-NEXT: nds.lea.h a1, a1, a1
1294+
; RV32XANDESPERF-NEXT: srli a1, a1, 2
1295+
; RV32XANDESPERF-NEXT: add a0, a0, a1
1296+
; RV32XANDESPERF-NEXT: ret
1297+
%and = and i32 %i, 16383
1298+
%mul = mul i32 %and, 6
1299+
%shr = lshr i32 %mul, 3
1300+
%r = getelementptr i8, ptr %p, i32 %shr
1301+
ret ptr %r
1302+
}

llvm/test/CodeGen/RISCV/rv64zba.ll

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4636,3 +4636,38 @@ define i32 @select9(i1 zeroext %x) {
46364636
%select = select i1 %x, i32 9, i32 0
46374637
ret i32 %select
46384638
}
4639+
4640+
define ptr @shl_add_knownbits(ptr %p, i64 %i) {
4641+
; RV64I-LABEL: shl_add_knownbits:
4642+
; RV64I: # %bb.0:
4643+
; RV64I-NEXT: slli a1, a1, 50
4644+
; RV64I-NEXT: srli a1, a1, 50
4645+
; RV64I-NEXT: slli a2, a1, 1
4646+
; RV64I-NEXT: slli a1, a1, 3
4647+
; RV64I-NEXT: sub a1, a1, a2
4648+
; RV64I-NEXT: srli a1, a1, 3
4649+
; RV64I-NEXT: add a0, a0, a1
4650+
; RV64I-NEXT: ret
4651+
;
4652+
; RV64ZBA-LABEL: shl_add_knownbits:
4653+
; RV64ZBA: # %bb.0:
4654+
; RV64ZBA-NEXT: slli a1, a1, 50
4655+
; RV64ZBA-NEXT: srli a1, a1, 50
4656+
; RV64ZBA-NEXT: sh1add a1, a1, a1
4657+
; RV64ZBA-NEXT: srli a1, a1, 2
4658+
; RV64ZBA-NEXT: add a0, a0, a1
4659+
; RV64ZBA-NEXT: ret
4660+
;
4661+
; RV64XANDESPERF-LABEL: shl_add_knownbits:
4662+
; RV64XANDESPERF: # %bb.0:
4663+
; RV64XANDESPERF-NEXT: nds.bfoz a1, a1, 13, 0
4664+
; RV64XANDESPERF-NEXT: nds.lea.h a1, a1, a1
4665+
; RV64XANDESPERF-NEXT: srli a1, a1, 2
4666+
; RV64XANDESPERF-NEXT: add a0, a0, a1
4667+
; RV64XANDESPERF-NEXT: ret
4668+
%and = and i64 %i, 16383
4669+
%mul = mul i64 %and, 6
4670+
%shr = lshr i64 %mul, 3
4671+
%r = getelementptr i8, ptr %p, i64 %shr
4672+
ret ptr %r
4673+
}

0 commit comments

Comments
 (0)