Skip to content

Commit 82e94c1

Browse files
committed
[RISCV] Don't commute with shift if XAndesPerf is enabled.
Generate the code for nds.lea.{h,w,d} similiar to sh{1,2,3}add
1 parent 8ff565d commit 82e94c1

File tree

3 files changed

+15
-27
lines changed

3 files changed

+15
-27
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20413,8 +20413,8 @@ bool RISCVTargetLowering::isDesirableToCommuteWithShift(
2041320413
auto *C2 = dyn_cast<ConstantSDNode>(N->getOperand(1));
2041420414

2041520415
// Bail if we might break a sh{1,2,3}add pattern.
20416-
if (Subtarget.hasStdExtZba() && C2 && C2->getZExtValue() >= 1 &&
20417-
C2->getZExtValue() <= 3 && N->hasOneUse() &&
20416+
if ((Subtarget.hasStdExtZba() || Subtarget.hasVendorXAndesPerf()) && C2 &&
20417+
C2->getZExtValue() >= 1 && C2->getZExtValue() <= 3 && N->hasOneUse() &&
2041820418
N->user_begin()->getOpcode() == ISD::ADD &&
2041920419
!isUsedByLdSt(*N->user_begin(), nullptr) &&
2042020420
!isa<ConstantSDNode>(N->user_begin()->getOperand(1)))

llvm/test/CodeGen/RISCV/add_sext_shl_constant.ll

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -356,10 +356,8 @@ define i64 @add_shl_moreOneUse_sh1add(i64 %x) {
356356
;
357357
; XANDESPERF-LABEL: add_shl_moreOneUse_sh1add:
358358
; XANDESPERF: # %bb.0:
359-
; XANDESPERF-NEXT: ori a1, a0, 1
360-
; XANDESPERF-NEXT: slli a0, a0, 1
361-
; XANDESPERF-NEXT: ori a0, a0, 2
362-
; XANDESPERF-NEXT: add a0, a0, a1
359+
; XANDESPERF-NEXT: ori a0, a0, 1
360+
; XANDESPERF-NEXT: nds.lea.h a0, a0, a0
363361
; XANDESPERF-NEXT: ret
364362
%or = or i64 %x, 1
365363
%mul = shl i64 %or, 1
@@ -384,10 +382,8 @@ define i64 @add_shl_moreOneUse_sh2add(i64 %x) {
384382
;
385383
; XANDESPERF-LABEL: add_shl_moreOneUse_sh2add:
386384
; XANDESPERF: # %bb.0:
387-
; XANDESPERF-NEXT: ori a1, a0, 1
388-
; XANDESPERF-NEXT: slli a0, a0, 2
389-
; XANDESPERF-NEXT: ori a0, a0, 4
390-
; XANDESPERF-NEXT: add a0, a0, a1
385+
; XANDESPERF-NEXT: ori a0, a0, 1
386+
; XANDESPERF-NEXT: nds.lea.w a0, a0, a0
391387
; XANDESPERF-NEXT: ret
392388
%or = or i64 %x, 1
393389
%mul = shl i64 %or, 2
@@ -412,10 +408,8 @@ define i64 @add_shl_moreOneUse_sh3add(i64 %x) {
412408
;
413409
; XANDESPERF-LABEL: add_shl_moreOneUse_sh3add:
414410
; XANDESPERF: # %bb.0:
415-
; XANDESPERF-NEXT: ori a1, a0, 1
416-
; XANDESPERF-NEXT: slli a0, a0, 3
417-
; XANDESPERF-NEXT: ori a0, a0, 8
418-
; XANDESPERF-NEXT: add a0, a0, a1
411+
; XANDESPERF-NEXT: ori a0, a0, 1
412+
; XANDESPERF-NEXT: nds.lea.d a0, a0, a0
419413
; XANDESPERF-NEXT: ret
420414
%or = or i64 %x, 1
421415
%mul = shl i64 %or, 3

llvm/test/CodeGen/RISCV/add_shl_constant.ll

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ define i32 @add_shl_oneUse(i32 %x, i32 %y) nounwind {
1919
;
2020
; XANDESPERF-LABEL: add_shl_oneUse:
2121
; XANDESPERF: # %bb.0:
22+
; XANDESPERF-NEXT: addi a0, a0, 123
2223
; XANDESPERF-NEXT: nds.lea.d a0, a1, a0
23-
; XANDESPERF-NEXT: addi a0, a0, 984
2424
; XANDESPERF-NEXT: ret
2525
%add.0 = add i32 %x, 123
2626
%shl = shl i32 %add.0, 3
@@ -257,10 +257,8 @@ define i32 @add_shl_moreOneUse_sh1add(i32 %x) {
257257
;
258258
; XANDESPERF-LABEL: add_shl_moreOneUse_sh1add:
259259
; XANDESPERF: # %bb.0:
260-
; XANDESPERF-NEXT: ori a1, a0, 1
261-
; XANDESPERF-NEXT: slli a0, a0, 1
262-
; XANDESPERF-NEXT: ori a0, a0, 2
263-
; XANDESPERF-NEXT: add a0, a0, a1
260+
; XANDESPERF-NEXT: ori a0, a0, 1
261+
; XANDESPERF-NEXT: nds.lea.h a0, a0, a0
264262
; XANDESPERF-NEXT: ret
265263
%or = or i32 %x, 1
266264
%mul = shl i32 %or, 1
@@ -285,10 +283,8 @@ define i32 @add_shl_moreOneUse_sh2add(i32 %x) {
285283
;
286284
; XANDESPERF-LABEL: add_shl_moreOneUse_sh2add:
287285
; XANDESPERF: # %bb.0:
288-
; XANDESPERF-NEXT: ori a1, a0, 1
289-
; XANDESPERF-NEXT: slli a0, a0, 2
290-
; XANDESPERF-NEXT: ori a0, a0, 4
291-
; XANDESPERF-NEXT: add a0, a0, a1
286+
; XANDESPERF-NEXT: ori a0, a0, 1
287+
; XANDESPERF-NEXT: nds.lea.w a0, a0, a0
292288
; XANDESPERF-NEXT: ret
293289
%or = or i32 %x, 1
294290
%mul = shl i32 %or, 2
@@ -313,10 +309,8 @@ define i32 @add_shl_moreOneUse_sh3add(i32 %x) {
313309
;
314310
; XANDESPERF-LABEL: add_shl_moreOneUse_sh3add:
315311
; XANDESPERF: # %bb.0:
316-
; XANDESPERF-NEXT: ori a1, a0, 1
317-
; XANDESPERF-NEXT: slli a0, a0, 3
318-
; XANDESPERF-NEXT: ori a0, a0, 8
319-
; XANDESPERF-NEXT: add a0, a0, a1
312+
; XANDESPERF-NEXT: ori a0, a0, 1
313+
; XANDESPERF-NEXT: nds.lea.d a0, a0, a0
320314
; XANDESPERF-NEXT: ret
321315
%or = or i32 %x, 1
322316
%mul = shl i32 %or, 3

0 commit comments

Comments
 (0)