Skip to content

Commit 0f71424

Browse files
authored
[RISCV] Teach SelectAddrRegRegScale that ADD is commutable. (#149231)
1 parent 66da9f3 commit 0f71424

File tree

3 files changed

+42
-35
lines changed

3 files changed

+42
-35
lines changed

llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3058,17 +3058,28 @@ bool RISCVDAGToDAGISel::SelectAddrRegRegScale(SDValue Addr,
30583058
};
30593059

30603060
if (auto *C1 = dyn_cast<ConstantSDNode>(RHS)) {
3061+
// (add (add (shl A C2) B) C1) -> (add (add B C1) (shl A C2))
30613062
if (LHS.getOpcode() == ISD::ADD &&
3062-
SelectShl(LHS.getOperand(0), Index, Scale) &&
30633063
!isa<ConstantSDNode>(LHS.getOperand(1)) &&
30643064
isInt<12>(C1->getSExtValue())) {
3065-
// (add (add (shl A C2) B) C1) -> (add (add B C1) (shl A C2))
3066-
SDValue C1Val = CurDAG->getTargetConstant(*C1->getConstantIntValue(),
3067-
SDLoc(Addr), VT);
3068-
Base = SDValue(CurDAG->getMachineNode(RISCV::ADDI, SDLoc(Addr), VT,
3069-
LHS.getOperand(1), C1Val),
3070-
0);
3071-
return true;
3065+
if (SelectShl(LHS.getOperand(1), Index, Scale)) {
3066+
SDValue C1Val = CurDAG->getTargetConstant(*C1->getConstantIntValue(),
3067+
SDLoc(Addr), VT);
3068+
Base = SDValue(CurDAG->getMachineNode(RISCV::ADDI, SDLoc(Addr), VT,
3069+
LHS.getOperand(0), C1Val),
3070+
0);
3071+
return true;
3072+
}
3073+
3074+
// Add is commutative so we need to check both operands.
3075+
if (SelectShl(LHS.getOperand(0), Index, Scale)) {
3076+
SDValue C1Val = CurDAG->getTargetConstant(*C1->getConstantIntValue(),
3077+
SDLoc(Addr), VT);
3078+
Base = SDValue(CurDAG->getMachineNode(RISCV::ADDI, SDLoc(Addr), VT,
3079+
LHS.getOperand(1), C1Val),
3080+
0);
3081+
return true;
3082+
}
30723083
}
30733084

30743085
// Don't match add with constants.

llvm/test/CodeGen/RISCV/xqcisls.ll

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -309,8 +309,8 @@ define i64 @lrd(ptr %a, i32 %b) {
309309
; RV32IZBAXQCISLS-LABEL: lrd:
310310
; RV32IZBAXQCISLS: # %bb.0:
311311
; RV32IZBAXQCISLS-NEXT: qc.lrw a2, a0, a1, 3
312-
; RV32IZBAXQCISLS-NEXT: sh3add a0, a1, a0
313-
; RV32IZBAXQCISLS-NEXT: lw a1, 4(a0)
312+
; RV32IZBAXQCISLS-NEXT: addi a0, a0, 4
313+
; RV32IZBAXQCISLS-NEXT: qc.lrw a1, a0, a1, 3
314314
; RV32IZBAXQCISLS-NEXT: add a0, a2, a2
315315
; RV32IZBAXQCISLS-NEXT: sltu a2, a0, a2
316316
; RV32IZBAXQCISLS-NEXT: add a1, a1, a1
@@ -473,10 +473,10 @@ define void @srd(ptr %a, i32 %b, i64 %c) {
473473
; RV32IZBAXQCISLS-NEXT: add a4, a2, a2
474474
; RV32IZBAXQCISLS-NEXT: add a3, a3, a3
475475
; RV32IZBAXQCISLS-NEXT: sltu a2, a4, a2
476-
; RV32IZBAXQCISLS-NEXT: add a2, a3, a2
477-
; RV32IZBAXQCISLS-NEXT: sh3add a3, a1, a0
478476
; RV32IZBAXQCISLS-NEXT: qc.srw a4, a0, a1, 3
479-
; RV32IZBAXQCISLS-NEXT: sw a2, 4(a3)
477+
; RV32IZBAXQCISLS-NEXT: add a2, a3, a2
478+
; RV32IZBAXQCISLS-NEXT: addi a0, a0, 4
479+
; RV32IZBAXQCISLS-NEXT: qc.srw a2, a0, a1, 3
480480
; RV32IZBAXQCISLS-NEXT: ret
481481
%1 = add i64 %c, %c
482482
%2 = getelementptr i64, ptr %a, i32 %b

llvm/test/CodeGen/RISCV/xtheadmemidx.ll

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -858,14 +858,13 @@ define i64 @lurwu(ptr %a, i32 %b) {
858858
define i64 @lrd(ptr %a, i64 %b) {
859859
; RV32XTHEADMEMIDX-LABEL: lrd:
860860
; RV32XTHEADMEMIDX: # %bb.0:
861-
; RV32XTHEADMEMIDX-NEXT: slli a2, a1, 3
861+
; RV32XTHEADMEMIDX-NEXT: th.lrw a2, a0, a1, 3
862+
; RV32XTHEADMEMIDX-NEXT: addi a0, a0, 4
862863
; RV32XTHEADMEMIDX-NEXT: th.lrw a1, a0, a1, 3
863-
; RV32XTHEADMEMIDX-NEXT: add a0, a0, a2
864-
; RV32XTHEADMEMIDX-NEXT: lw a2, 4(a0)
865-
; RV32XTHEADMEMIDX-NEXT: add a0, a1, a1
866-
; RV32XTHEADMEMIDX-NEXT: sltu a1, a0, a1
867-
; RV32XTHEADMEMIDX-NEXT: add a2, a2, a2
868-
; RV32XTHEADMEMIDX-NEXT: add a1, a2, a1
864+
; RV32XTHEADMEMIDX-NEXT: add a0, a2, a2
865+
; RV32XTHEADMEMIDX-NEXT: sltu a2, a0, a2
866+
; RV32XTHEADMEMIDX-NEXT: add a1, a1, a1
867+
; RV32XTHEADMEMIDX-NEXT: add a1, a1, a2
869868
; RV32XTHEADMEMIDX-NEXT: ret
870869
;
871870
; RV64XTHEADMEMIDX-LABEL: lrd:
@@ -908,14 +907,13 @@ define i64 @lrd_2(ptr %a, i64 %b) {
908907
define i64 @lurd(ptr %a, i32 %b) {
909908
; RV32XTHEADMEMIDX-LABEL: lurd:
910909
; RV32XTHEADMEMIDX: # %bb.0:
911-
; RV32XTHEADMEMIDX-NEXT: slli a2, a1, 3
910+
; RV32XTHEADMEMIDX-NEXT: th.lrw a2, a0, a1, 3
911+
; RV32XTHEADMEMIDX-NEXT: addi a0, a0, 4
912912
; RV32XTHEADMEMIDX-NEXT: th.lrw a1, a0, a1, 3
913-
; RV32XTHEADMEMIDX-NEXT: add a0, a0, a2
914-
; RV32XTHEADMEMIDX-NEXT: lw a2, 4(a0)
915-
; RV32XTHEADMEMIDX-NEXT: add a0, a1, a1
916-
; RV32XTHEADMEMIDX-NEXT: sltu a1, a0, a1
917-
; RV32XTHEADMEMIDX-NEXT: add a2, a2, a2
918-
; RV32XTHEADMEMIDX-NEXT: add a1, a2, a1
913+
; RV32XTHEADMEMIDX-NEXT: add a0, a2, a2
914+
; RV32XTHEADMEMIDX-NEXT: sltu a2, a0, a2
915+
; RV32XTHEADMEMIDX-NEXT: add a1, a1, a1
916+
; RV32XTHEADMEMIDX-NEXT: add a1, a1, a2
919917
; RV32XTHEADMEMIDX-NEXT: ret
920918
;
921919
; RV64XTHEADMEMIDX-LABEL: lurd:
@@ -1047,11 +1045,10 @@ define void @srd(ptr %a, i64 %b, i64 %c) {
10471045
; RV32XTHEADMEMIDX-NEXT: add a2, a3, a3
10481046
; RV32XTHEADMEMIDX-NEXT: add a4, a4, a4
10491047
; RV32XTHEADMEMIDX-NEXT: sltu a3, a2, a3
1050-
; RV32XTHEADMEMIDX-NEXT: add a3, a4, a3
1051-
; RV32XTHEADMEMIDX-NEXT: slli a4, a1, 3
1052-
; RV32XTHEADMEMIDX-NEXT: add a4, a0, a4
10531048
; RV32XTHEADMEMIDX-NEXT: th.srw a2, a0, a1, 3
1054-
; RV32XTHEADMEMIDX-NEXT: sw a3, 4(a4)
1049+
; RV32XTHEADMEMIDX-NEXT: add a3, a4, a3
1050+
; RV32XTHEADMEMIDX-NEXT: addi a0, a0, 4
1051+
; RV32XTHEADMEMIDX-NEXT: th.srw a3, a0, a1, 3
10551052
; RV32XTHEADMEMIDX-NEXT: ret
10561053
;
10571054
; RV64XTHEADMEMIDX-LABEL: srd:
@@ -1071,11 +1068,10 @@ define void @surd(ptr %a, i32 %b, i64 %c) {
10711068
; RV32XTHEADMEMIDX-NEXT: add a4, a2, a2
10721069
; RV32XTHEADMEMIDX-NEXT: add a3, a3, a3
10731070
; RV32XTHEADMEMIDX-NEXT: sltu a2, a4, a2
1074-
; RV32XTHEADMEMIDX-NEXT: add a2, a3, a2
1075-
; RV32XTHEADMEMIDX-NEXT: slli a3, a1, 3
1076-
; RV32XTHEADMEMIDX-NEXT: add a3, a0, a3
10771071
; RV32XTHEADMEMIDX-NEXT: th.srw a4, a0, a1, 3
1078-
; RV32XTHEADMEMIDX-NEXT: sw a2, 4(a3)
1072+
; RV32XTHEADMEMIDX-NEXT: add a2, a3, a2
1073+
; RV32XTHEADMEMIDX-NEXT: addi a0, a0, 4
1074+
; RV32XTHEADMEMIDX-NEXT: th.srw a2, a0, a1, 3
10791075
; RV32XTHEADMEMIDX-NEXT: ret
10801076
;
10811077
; RV64XTHEADMEMIDX-LABEL: surd:

0 commit comments

Comments
 (0)