Skip to content

Commit e9a9dbc

Browse files
committed
Address review comments
1 parent 605f1a4 commit e9a9dbc

File tree

2 files changed

+25
-29
lines changed

2 files changed

+25
-29
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15511,25 +15511,21 @@ static SDValue expandMulToNAFSequence(SDNode *N, SelectionDAG &DAG,
1551115511
EVT VT = N->getValueType(0);
1551215512
const uint64_t BitWidth = VT.getFixedSizeInBits();
1551315513

15514+
SDValue Result = DAG.getConstant(0, DL, N->getValueType(0));
15515+
SDValue N0 = N->getOperand(0);
15516+
1551415517
// Find the Non-adjacent form of the multiplier.
15515-
llvm::SmallVector<std::pair<bool, uint64_t>> Sequence; // {isAdd, shamt}
1551615518
for (uint64_t E = MulAmt, I = 0; E && I < BitWidth; ++I, E >>= 1) {
1551715519
if (E & 1) {
1551815520
bool IsAdd = (E & 3) == 1;
15519-
Sequence.push_back({IsAdd, I});
1552015521
E -= IsAdd ? 1 : -1;
15522+
SDValue ShiftVal = DAG.getNode(ISD::SHL, DL, VT, N0,
15523+
DAG.getShiftAmountConstant(I, VT, DL));
15524+
ISD::NodeType AddSubOp = IsAdd ? ISD::ADD : ISD::SUB;
15525+
Result = DAG.getNode(AddSubOp, DL, VT, Result, ShiftVal);
1552115526
}
1552215527
}
1552315528

15524-
SDValue Result = DAG.getConstant(0, DL, N->getValueType(0));
15525-
SDValue N0 = N->getOperand(0);
15526-
15527-
for (const auto &Op : Sequence) {
15528-
SDValue ShiftVal = DAG.getNode(
15529-
ISD::SHL, DL, VT, N0, DAG.getShiftAmountConstant(Op.second, VT, DL));
15530-
ISD::NodeType AddSubOp = Op.first ? ISD::ADD : ISD::SUB;
15531-
Result = DAG.getNode(AddSubOp, DL, VT, Result, ShiftVal);
15532-
}
1553315529
return Result;
1553415530
}
1553515531

llvm/test/CodeGen/RISCV/mul.ll

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -955,7 +955,7 @@ define i64 @muli64_p72(i64 %a) nounwind {
955955
; RV32I: # %bb.0:
956956
; RV32I-NEXT: addi sp, sp, -16
957957
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
958-
; RV32I-NEXT: li a2, 60
958+
; RV32I-NEXT: li a2, 72
959959
; RV32I-NEXT: li a3, 0
960960
; RV32I-NEXT: call __muldi3
961961
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
@@ -964,31 +964,31 @@ define i64 @muli64_p72(i64 %a) nounwind {
964964
;
965965
; RV32IM-LABEL: muli64_p72:
966966
; RV32IM: # %bb.0:
967-
; RV32IM-NEXT: li a2, 60
968-
; RV32IM-NEXT: slli a3, a1, 2
967+
; RV32IM-NEXT: li a2, 72
968+
; RV32IM-NEXT: slli a3, a1, 3
969969
; RV32IM-NEXT: slli a1, a1, 6
970-
; RV32IM-NEXT: sub a1, a1, a3
971-
; RV32IM-NEXT: slli a3, a0, 2
970+
; RV32IM-NEXT: add a1, a1, a3
971+
; RV32IM-NEXT: slli a3, a0, 3
972972
; RV32IM-NEXT: mulhu a2, a0, a2
973973
; RV32IM-NEXT: slli a0, a0, 6
974974
; RV32IM-NEXT: add a1, a2, a1
975-
; RV32IM-NEXT: sub a0, a0, a3
975+
; RV32IM-NEXT: add a0, a0, a3
976976
; RV32IM-NEXT: ret
977977
;
978978
; RV64I-LABEL: muli64_p72:
979979
; RV64I: # %bb.0:
980-
; RV64I-NEXT: slli a1, a0, 2
980+
; RV64I-NEXT: slli a1, a0, 3
981981
; RV64I-NEXT: slli a0, a0, 6
982-
; RV64I-NEXT: sub a0, a0, a1
982+
; RV64I-NEXT: add a0, a0, a1
983983
; RV64I-NEXT: ret
984984
;
985985
; RV64IM-LABEL: muli64_p72:
986986
; RV64IM: # %bb.0:
987-
; RV64IM-NEXT: slli a1, a0, 2
987+
; RV64IM-NEXT: slli a1, a0, 3
988988
; RV64IM-NEXT: slli a0, a0, 6
989-
; RV64IM-NEXT: sub a0, a0, a1
989+
; RV64IM-NEXT: add a0, a0, a1
990990
; RV64IM-NEXT: ret
991-
%1 = mul i64 %a, 60
991+
%1 = mul i64 %a, 72
992992
ret i64 %1
993993
}
994994

@@ -997,7 +997,7 @@ define i64 @muli64_p68(i64 %a) nounwind {
997997
; RV32I: # %bb.0:
998998
; RV32I-NEXT: addi sp, sp, -16
999999
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
1000-
; RV32I-NEXT: li a2, 72
1000+
; RV32I-NEXT: li a2, 68
10011001
; RV32I-NEXT: li a3, 0
10021002
; RV32I-NEXT: call __muldi3
10031003
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
@@ -1006,11 +1006,11 @@ define i64 @muli64_p68(i64 %a) nounwind {
10061006
;
10071007
; RV32IM-LABEL: muli64_p68:
10081008
; RV32IM: # %bb.0:
1009-
; RV32IM-NEXT: li a2, 72
1010-
; RV32IM-NEXT: slli a3, a1, 3
1009+
; RV32IM-NEXT: li a2, 68
1010+
; RV32IM-NEXT: slli a3, a1, 2
10111011
; RV32IM-NEXT: slli a1, a1, 6
10121012
; RV32IM-NEXT: add a1, a1, a3
1013-
; RV32IM-NEXT: slli a3, a0, 3
1013+
; RV32IM-NEXT: slli a3, a0, 2
10141014
; RV32IM-NEXT: mulhu a2, a0, a2
10151015
; RV32IM-NEXT: slli a0, a0, 6
10161016
; RV32IM-NEXT: add a1, a2, a1
@@ -1019,18 +1019,18 @@ define i64 @muli64_p68(i64 %a) nounwind {
10191019
;
10201020
; RV64I-LABEL: muli64_p68:
10211021
; RV64I: # %bb.0:
1022-
; RV64I-NEXT: slli a1, a0, 3
1022+
; RV64I-NEXT: slli a1, a0, 2
10231023
; RV64I-NEXT: slli a0, a0, 6
10241024
; RV64I-NEXT: add a0, a0, a1
10251025
; RV64I-NEXT: ret
10261026
;
10271027
; RV64IM-LABEL: muli64_p68:
10281028
; RV64IM: # %bb.0:
1029-
; RV64IM-NEXT: slli a1, a0, 3
1029+
; RV64IM-NEXT: slli a1, a0, 2
10301030
; RV64IM-NEXT: slli a0, a0, 6
10311031
; RV64IM-NEXT: add a0, a0, a1
10321032
; RV64IM-NEXT: ret
1033-
%1 = mul i64 %a, 72
1033+
%1 = mul i64 %a, 68
10341034
ret i64 %1
10351035
}
10361036

0 commit comments

Comments
 (0)