Skip to content

Commit 5b6c9a5

Browse files
committed
[RISCV] Optimize add in the zba extension with SH*ADD
Optimize (add x, c) to (SH*ADD (c>>b), x) if c is not simm12 while (c>>b) is simm12 and c has b trailing zeros. Reviewed By: luismarques Differential Revision: https://reviews.llvm.org/D108193
1 parent e8118e6 commit 5b6c9a5

File tree

3 files changed

+49
-24
lines changed

3 files changed

+49
-24
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfoB.td

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,32 @@ def C9LeftShift : PatLeaf<(imm), [{
186186
return C > 9 && ((C % 9) == 0) && isPowerOf2_64(C / 9);
187187
}]>;
188188

189+
def CSImm12MulBy4 : PatLeaf<(imm), [{
190+
if (!N->hasOneUse())
191+
return false;
192+
int64_t C = N->getSExtValue();
193+
// Skip if C is simm12 or can be optimized by the PatLeaf AddiPair.
194+
return !isInt<13>(C) && isInt<14>(C) && (C & 3) == 0;
195+
}]>;
196+
197+
def CSImm12MulBy8 : PatLeaf<(imm), [{
198+
if (!N->hasOneUse())
199+
return false;
200+
int64_t C = N->getSExtValue();
201+
// Skip if C is simm12 or can be optimized by the PatLeaf AddiPair.
202+
return !isInt<13>(C) && isInt<15>(C) && (C & 7) == 0;
203+
}]>;
204+
205+
def SimmShiftRightBy2XForm : SDNodeXForm<imm, [{
206+
return CurDAG->getTargetConstant(N->getSExtValue() >> 2, SDLoc(N),
207+
N->getValueType(0));
208+
}]>;
209+
210+
def SimmShiftRightBy3XForm : SDNodeXForm<imm, [{
211+
return CurDAG->getTargetConstant(N->getSExtValue() >> 3, SDLoc(N),
212+
N->getValueType(0));
213+
}]>;
214+
189215
//===----------------------------------------------------------------------===//
190216
// Instruction class templates
191217
//===----------------------------------------------------------------------===//
@@ -1011,6 +1037,13 @@ def : Pat<(add (mul_oneuse GPR:$rs1, (XLenVT 40)), GPR:$rs2),
10111037
def : Pat<(add (mul_oneuse GPR:$rs1, (XLenVT 72)), GPR:$rs2),
10121038
(SH3ADD (SH3ADD GPR:$rs1, GPR:$rs1), GPR:$rs2)>;
10131039

1040+
def : Pat<(add GPR:$r, CSImm12MulBy4:$i),
1041+
(SH2ADD (ADDI X0, (SimmShiftRightBy2XForm CSImm12MulBy4:$i)),
1042+
GPR:$r)>;
1043+
def : Pat<(add GPR:$r, CSImm12MulBy8:$i),
1044+
(SH3ADD (ADDI X0, (SimmShiftRightBy3XForm CSImm12MulBy8:$i)),
1045+
GPR:$r)>;
1046+
10141047
def : Pat<(mul GPR:$r, C3LeftShift:$i),
10151048
(SLLI (SH1ADD GPR:$r, GPR:$r),
10161049
(TrailingZerosXForm C3LeftShift:$i))>;

llvm/test/CodeGen/RISCV/rv32zba.ll

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -750,16 +750,14 @@ define i32 @add4104(i32 %a) {
750750
;
751751
; RV32B-LABEL: add4104:
752752
; RV32B: # %bb.0:
753-
; RV32B-NEXT: lui a1, 1
754-
; RV32B-NEXT: addi a1, a1, 8
755-
; RV32B-NEXT: add a0, a0, a1
753+
; RV32B-NEXT: addi a1, zero, 1026
754+
; RV32B-NEXT: sh2add a0, a1, a0
756755
; RV32B-NEXT: ret
757756
;
758757
; RV32ZBA-LABEL: add4104:
759758
; RV32ZBA: # %bb.0:
760-
; RV32ZBA-NEXT: lui a1, 1
761-
; RV32ZBA-NEXT: addi a1, a1, 8
762-
; RV32ZBA-NEXT: add a0, a0, a1
759+
; RV32ZBA-NEXT: addi a1, zero, 1026
760+
; RV32ZBA-NEXT: sh2add a0, a1, a0
763761
; RV32ZBA-NEXT: ret
764762
%c = add i32 %a, 4104
765763
ret i32 %c
@@ -775,16 +773,14 @@ define i32 @add8208(i32 %a) {
775773
;
776774
; RV32B-LABEL: add8208:
777775
; RV32B: # %bb.0:
778-
; RV32B-NEXT: lui a1, 2
779-
; RV32B-NEXT: addi a1, a1, 16
780-
; RV32B-NEXT: add a0, a0, a1
776+
; RV32B-NEXT: addi a1, zero, 1026
777+
; RV32B-NEXT: sh3add a0, a1, a0
781778
; RV32B-NEXT: ret
782779
;
783780
; RV32ZBA-LABEL: add8208:
784781
; RV32ZBA: # %bb.0:
785-
; RV32ZBA-NEXT: lui a1, 2
786-
; RV32ZBA-NEXT: addi a1, a1, 16
787-
; RV32ZBA-NEXT: add a0, a0, a1
782+
; RV32ZBA-NEXT: addi a1, zero, 1026
783+
; RV32ZBA-NEXT: sh3add a0, a1, a0
788784
; RV32ZBA-NEXT: ret
789785
%c = add i32 %a, 8208
790786
ret i32 %c

llvm/test/CodeGen/RISCV/rv64zba.ll

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1321,16 +1321,14 @@ define i64 @add4104(i64 %a) {
13211321
;
13221322
; RV64B-LABEL: add4104:
13231323
; RV64B: # %bb.0:
1324-
; RV64B-NEXT: lui a1, 1
1325-
; RV64B-NEXT: addiw a1, a1, 8
1326-
; RV64B-NEXT: add a0, a0, a1
1324+
; RV64B-NEXT: addi a1, zero, 1026
1325+
; RV64B-NEXT: sh2add a0, a1, a0
13271326
; RV64B-NEXT: ret
13281327
;
13291328
; RV64ZBA-LABEL: add4104:
13301329
; RV64ZBA: # %bb.0:
1331-
; RV64ZBA-NEXT: lui a1, 1
1332-
; RV64ZBA-NEXT: addiw a1, a1, 8
1333-
; RV64ZBA-NEXT: add a0, a0, a1
1330+
; RV64ZBA-NEXT: addi a1, zero, 1026
1331+
; RV64ZBA-NEXT: sh2add a0, a1, a0
13341332
; RV64ZBA-NEXT: ret
13351333
%c = add i64 %a, 4104
13361334
ret i64 %c
@@ -1346,16 +1344,14 @@ define i64 @add8208(i64 %a) {
13461344
;
13471345
; RV64B-LABEL: add8208:
13481346
; RV64B: # %bb.0:
1349-
; RV64B-NEXT: lui a1, 2
1350-
; RV64B-NEXT: addiw a1, a1, 16
1351-
; RV64B-NEXT: add a0, a0, a1
1347+
; RV64B-NEXT: addi a1, zero, 1026
1348+
; RV64B-NEXT: sh3add a0, a1, a0
13521349
; RV64B-NEXT: ret
13531350
;
13541351
; RV64ZBA-LABEL: add8208:
13551352
; RV64ZBA: # %bb.0:
1356-
; RV64ZBA-NEXT: lui a1, 2
1357-
; RV64ZBA-NEXT: addiw a1, a1, 16
1358-
; RV64ZBA-NEXT: add a0, a0, a1
1353+
; RV64ZBA-NEXT: addi a1, zero, 1026
1354+
; RV64ZBA-NEXT: sh3add a0, a1, a0
13591355
; RV64ZBA-NEXT: ret
13601356
%c = add i64 %a, 8208
13611357
ret i64 %c

0 commit comments

Comments
 (0)