Skip to content

Commit 58a08e1

Browse files
committed
[RISCV] Add coverage for strength reduction of mul by small negative immediates
1 parent c02ed29 commit 58a08e1

File tree

2 files changed

+186
-0
lines changed

2 files changed

+186
-0
lines changed

llvm/test/CodeGen/RISCV/rv32zba.ll

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -645,3 +645,96 @@ define i32 @addshl_5_8(i32 %a, i32 %b) {
645645
%e = add i32 %c, %d
646646
ret i32 %e
647647
}
648+
649+
define i32 @mul_neg1(i32 %a) {
650+
; CHECK-LABEL: mul_neg1:
651+
; CHECK: # %bb.0:
652+
; CHECK-NEXT: neg a0, a0
653+
; CHECK-NEXT: ret
654+
%c = mul i32 %a, -1
655+
ret i32 %c
656+
}
657+
658+
define i32 @mul_neg2(i32 %a) {
659+
; CHECK-LABEL: mul_neg2:
660+
; CHECK: # %bb.0:
661+
; CHECK-NEXT: slli a0, a0, 1
662+
; CHECK-NEXT: neg a0, a0
663+
; CHECK-NEXT: ret
664+
%c = mul i32 %a, -2
665+
ret i32 %c
666+
}
667+
668+
define i32 @mul_neg3(i32 %a) {
669+
; RV32I-LABEL: mul_neg3:
670+
; RV32I: # %bb.0:
671+
; RV32I-NEXT: slli a1, a0, 1
672+
; RV32I-NEXT: neg a0, a0
673+
; RV32I-NEXT: sub a0, a0, a1
674+
; RV32I-NEXT: ret
675+
;
676+
; RV32ZBA-LABEL: mul_neg3:
677+
; RV32ZBA: # %bb.0:
678+
; RV32ZBA-NEXT: sh1add a0, a0, a0
679+
; RV32ZBA-NEXT: neg a0, a0
680+
; RV32ZBA-NEXT: ret
681+
%c = mul i32 %a, -3
682+
ret i32 %c
683+
}
684+
685+
define i32 @mul_neg4(i32 %a) {
686+
; CHECK-LABEL: mul_neg4:
687+
; CHECK: # %bb.0:
688+
; CHECK-NEXT: slli a0, a0, 2
689+
; CHECK-NEXT: neg a0, a0
690+
; CHECK-NEXT: ret
691+
%c = mul i32 %a, -4
692+
ret i32 %c
693+
}
694+
695+
define i32 @mul_neg5(i32 %a) {
696+
; RV32I-LABEL: mul_neg5:
697+
; RV32I: # %bb.0:
698+
; RV32I-NEXT: slli a1, a0, 2
699+
; RV32I-NEXT: neg a0, a0
700+
; RV32I-NEXT: sub a0, a0, a1
701+
; RV32I-NEXT: ret
702+
;
703+
; RV32ZBA-LABEL: mul_neg5:
704+
; RV32ZBA: # %bb.0:
705+
; RV32ZBA-NEXT: sh2add a0, a0, a0
706+
; RV32ZBA-NEXT: neg a0, a0
707+
; RV32ZBA-NEXT: ret
708+
%c = mul i32 %a, -5
709+
ret i32 %c
710+
}
711+
712+
define i32 @mul_neg6(i32 %a) {
713+
; CHECK-LABEL: mul_neg6:
714+
; CHECK: # %bb.0:
715+
; CHECK-NEXT: li a1, -6
716+
; CHECK-NEXT: mul a0, a0, a1
717+
; CHECK-NEXT: ret
718+
%c = mul i32 %a, -6
719+
ret i32 %c
720+
}
721+
722+
define i32 @mul_neg7(i32 %a) {
723+
; CHECK-LABEL: mul_neg7:
724+
; CHECK: # %bb.0:
725+
; CHECK-NEXT: slli a1, a0, 3
726+
; CHECK-NEXT: sub a0, a0, a1
727+
; CHECK-NEXT: ret
728+
%c = mul i32 %a, -7
729+
ret i32 %c
730+
}
731+
732+
define i32 @mul_neg8(i32 %a) {
733+
; CHECK-LABEL: mul_neg8:
734+
; CHECK: # %bb.0:
735+
; CHECK-NEXT: slli a0, a0, 3
736+
; CHECK-NEXT: neg a0, a0
737+
; CHECK-NEXT: ret
738+
%c = mul i32 %a, -8
739+
ret i32 %c
740+
}

llvm/test/CodeGen/RISCV/rv64zba.ll

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2533,3 +2533,96 @@ define i64 @regression(i32 signext %x, i32 signext %y) {
25332533
%res = mul nuw nsw i64 %ext, 24
25342534
ret i64 %res
25352535
}
2536+
2537+
define i64 @mul_neg1(i64 %a) {
2538+
; CHECK-LABEL: mul_neg1:
2539+
; CHECK: # %bb.0:
2540+
; CHECK-NEXT: neg a0, a0
2541+
; CHECK-NEXT: ret
2542+
%c = mul i64 %a, -1
2543+
ret i64 %c
2544+
}
2545+
2546+
define i64 @mul_neg2(i64 %a) {
2547+
; CHECK-LABEL: mul_neg2:
2548+
; CHECK: # %bb.0:
2549+
; CHECK-NEXT: slli a0, a0, 1
2550+
; CHECK-NEXT: neg a0, a0
2551+
; CHECK-NEXT: ret
2552+
%c = mul i64 %a, -2
2553+
ret i64 %c
2554+
}
2555+
2556+
define i64 @mul_neg3(i64 %a) {
2557+
; RV64I-LABEL: mul_neg3:
2558+
; RV64I: # %bb.0:
2559+
; RV64I-NEXT: slli a1, a0, 1
2560+
; RV64I-NEXT: neg a0, a0
2561+
; RV64I-NEXT: sub a0, a0, a1
2562+
; RV64I-NEXT: ret
2563+
;
2564+
; RV64ZBA-LABEL: mul_neg3:
2565+
; RV64ZBA: # %bb.0:
2566+
; RV64ZBA-NEXT: sh1add a0, a0, a0
2567+
; RV64ZBA-NEXT: neg a0, a0
2568+
; RV64ZBA-NEXT: ret
2569+
%c = mul i64 %a, -3
2570+
ret i64 %c
2571+
}
2572+
2573+
define i64 @mul_neg4(i64 %a) {
2574+
; CHECK-LABEL: mul_neg4:
2575+
; CHECK: # %bb.0:
2576+
; CHECK-NEXT: slli a0, a0, 2
2577+
; CHECK-NEXT: neg a0, a0
2578+
; CHECK-NEXT: ret
2579+
%c = mul i64 %a, -4
2580+
ret i64 %c
2581+
}
2582+
2583+
define i64 @mul_neg5(i64 %a) {
2584+
; RV64I-LABEL: mul_neg5:
2585+
; RV64I: # %bb.0:
2586+
; RV64I-NEXT: slli a1, a0, 2
2587+
; RV64I-NEXT: neg a0, a0
2588+
; RV64I-NEXT: sub a0, a0, a1
2589+
; RV64I-NEXT: ret
2590+
;
2591+
; RV64ZBA-LABEL: mul_neg5:
2592+
; RV64ZBA: # %bb.0:
2593+
; RV64ZBA-NEXT: sh2add a0, a0, a0
2594+
; RV64ZBA-NEXT: neg a0, a0
2595+
; RV64ZBA-NEXT: ret
2596+
%c = mul i64 %a, -5
2597+
ret i64 %c
2598+
}
2599+
2600+
define i64 @mul_neg6(i64 %a) {
2601+
; CHECK-LABEL: mul_neg6:
2602+
; CHECK: # %bb.0:
2603+
; CHECK-NEXT: li a1, -6
2604+
; CHECK-NEXT: mul a0, a0, a1
2605+
; CHECK-NEXT: ret
2606+
%c = mul i64 %a, -6
2607+
ret i64 %c
2608+
}
2609+
2610+
define i64 @mul_neg7(i64 %a) {
2611+
; CHECK-LABEL: mul_neg7:
2612+
; CHECK: # %bb.0:
2613+
; CHECK-NEXT: slli a1, a0, 3
2614+
; CHECK-NEXT: sub a0, a0, a1
2615+
; CHECK-NEXT: ret
2616+
%c = mul i64 %a, -7
2617+
ret i64 %c
2618+
}
2619+
2620+
define i64 @mul_neg8(i64 %a) {
2621+
; CHECK-LABEL: mul_neg8:
2622+
; CHECK: # %bb.0:
2623+
; CHECK-NEXT: slli a0, a0, 3
2624+
; CHECK-NEXT: neg a0, a0
2625+
; CHECK-NEXT: ret
2626+
%c = mul i64 %a, -8
2627+
ret i64 %c
2628+
}

0 commit comments

Comments
 (0)