[llvm] bb6fddb - Optimize mul in the zba extension with SH*ADD
Ben Shi via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 29 17:36:54 PDT 2021
Author: Ben Shi
Date: 2021-07-30T08:36:28+08:00
New Revision: bb6fddb63ca73acb84c39c4d548024bf6398d86e
URL: https://github.com/llvm/llvm-project/commit/bb6fddb63ca73acb84c39c4d548024bf6398d86e
DIFF: https://github.com/llvm/llvm-project/commit/bb6fddb63ca73acb84c39c4d548024bf6398d86e.diff
LOG: Optimize mul in the zba extension with SH*ADD
This patch does the following optimization of mul with a constant.
(mul x, 11) -> (SH1ADD (SH2ADD x, x), x)
(mul x, 19) -> (SH1ADD (SH3ADD x, x), x)
(mul x, 13) -> (SH2ADD (SH1ADD x, x), x)
(mul x, 21) -> (SH2ADD (SH2ADD x, x), x)
(mul x, 37) -> (SH2ADD (SH3ADD x, x), x)
(mul x, 25) -> (SH3ADD (SH1ADD x, x), x)
(mul x, 41) -> (SH3ADD (SH2ADD x, x), x)
(mul x, 73) -> (SH3ADD (SH3ADD x, x), x)
(mul x, 27) -> (SH1ADD (SH3ADD x, x), (SH3ADD x, x))
(mul x, 45) -> (SH2ADD (SH3ADD x, x), (SH3ADD x, x))
(mul x, 81) -> (SH3ADD (SH3ADD x, x), (SH3ADD x, x))
Reviewed By: craig.topper
Differential Revision: https://reviews.llvm.org/D107065
Added:
Modified:
llvm/lib/Target/RISCV/RISCVInstrInfo.td
llvm/lib/Target/RISCV/RISCVInstrInfoB.td
llvm/test/CodeGen/RISCV/rv32zba.ll
llvm/test/CodeGen/RISCV/rv64zba.ll
llvm/test/CodeGen/RISCV/xaluo.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.td b/llvm/lib/Target/RISCV/RISCVInstrInfo.td
index 949fff25e9e0..48381d4911b9 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfo.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.td
@@ -893,6 +893,14 @@ def mul_oneuse : PatFrag<(ops node:$A, node:$B), (mul node:$A, node:$B), [{
return N->hasOneUse();
}]>;
+def mul_const_oneuse : PatFrag<(ops node:$A, node:$B),
+ (mul node:$A, node:$B), [{
+ if (auto *N1C = dyn_cast<ConstantSDNode>(N->getOperand(1)))
+ if (N1C->hasOneUse())
+ return true;
+ return false;
+}]>;
+
/// Simple arithmetic operations
def : PatGprGpr<add, ADD>;
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoB.td b/llvm/lib/Target/RISCV/RISCVInstrInfoB.td
index 7359e567a58d..71b0f1585aed 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfoB.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfoB.td
@@ -1020,6 +1020,29 @@ def : Pat<(mul GPR:$r, C5LeftShift:$i),
def : Pat<(mul GPR:$r, C9LeftShift:$i),
(SLLI (SH3ADD GPR:$r, GPR:$r),
(TrailingZerosXForm C9LeftShift:$i))>;
+
+def : Pat<(mul_const_oneuse GPR:$r, (XLenVT 11)),
+ (SH1ADD (SH2ADD GPR:$r, GPR:$r), GPR:$r)>;
+def : Pat<(mul_const_oneuse GPR:$r, (XLenVT 19)),
+ (SH1ADD (SH3ADD GPR:$r, GPR:$r), GPR:$r)>;
+def : Pat<(mul_const_oneuse GPR:$r, (XLenVT 13)),
+ (SH2ADD (SH1ADD GPR:$r, GPR:$r), GPR:$r)>;
+def : Pat<(mul_const_oneuse GPR:$r, (XLenVT 21)),
+ (SH2ADD (SH2ADD GPR:$r, GPR:$r), GPR:$r)>;
+def : Pat<(mul_const_oneuse GPR:$r, (XLenVT 37)),
+ (SH2ADD (SH3ADD GPR:$r, GPR:$r), GPR:$r)>;
+def : Pat<(mul_const_oneuse GPR:$r, (XLenVT 25)),
+ (SH3ADD (SH1ADD GPR:$r, GPR:$r), GPR:$r)>;
+def : Pat<(mul_const_oneuse GPR:$r, (XLenVT 41)),
+ (SH3ADD (SH2ADD GPR:$r, GPR:$r), GPR:$r)>;
+def : Pat<(mul_const_oneuse GPR:$r, (XLenVT 73)),
+ (SH3ADD (SH3ADD GPR:$r, GPR:$r), GPR:$r)>;
+def : Pat<(mul_const_oneuse GPR:$r, (XLenVT 27)),
+ (SH1ADD (SH3ADD GPR:$r, GPR:$r), (SH3ADD GPR:$r, GPR:$r))>;
+def : Pat<(mul_const_oneuse GPR:$r, (XLenVT 45)),
+ (SH2ADD (SH3ADD GPR:$r, GPR:$r), (SH3ADD GPR:$r, GPR:$r))>;
+def : Pat<(mul_const_oneuse GPR:$r, (XLenVT 81)),
+ (SH3ADD (SH3ADD GPR:$r, GPR:$r), (SH3ADD GPR:$r, GPR:$r))>;
} // Predicates = [HasStdExtZba]
let Predicates = [HasStdExtZba, IsRV64] in {
diff --git a/llvm/test/CodeGen/RISCV/rv32zba.ll b/llvm/test/CodeGen/RISCV/rv32zba.ll
index 22d6f7444970..6509d6a63374 100644
--- a/llvm/test/CodeGen/RISCV/rv32zba.ll
+++ b/llvm/test/CodeGen/RISCV/rv32zba.ll
@@ -438,14 +438,14 @@ define i32 @mul11(i32 %a) {
;
; RV32IB-LABEL: mul11:
; RV32IB: # %bb.0:
-; RV32IB-NEXT: addi a1, zero, 11
-; RV32IB-NEXT: mul a0, a0, a1
+; RV32IB-NEXT: sh2add a1, a0, a0
+; RV32IB-NEXT: sh1add a0, a1, a0
; RV32IB-NEXT: ret
;
; RV32IBA-LABEL: mul11:
; RV32IBA: # %bb.0:
-; RV32IBA-NEXT: addi a1, zero, 11
-; RV32IBA-NEXT: mul a0, a0, a1
+; RV32IBA-NEXT: sh2add a1, a0, a0
+; RV32IBA-NEXT: sh1add a0, a1, a0
; RV32IBA-NEXT: ret
%c = mul i32 %a, 11
ret i32 %c
@@ -460,14 +460,14 @@ define i32 @mul19(i32 %a) {
;
; RV32IB-LABEL: mul19:
; RV32IB: # %bb.0:
-; RV32IB-NEXT: addi a1, zero, 19
-; RV32IB-NEXT: mul a0, a0, a1
+; RV32IB-NEXT: sh3add a1, a0, a0
+; RV32IB-NEXT: sh1add a0, a1, a0
; RV32IB-NEXT: ret
;
; RV32IBA-LABEL: mul19:
; RV32IBA: # %bb.0:
-; RV32IBA-NEXT: addi a1, zero, 19
-; RV32IBA-NEXT: mul a0, a0, a1
+; RV32IBA-NEXT: sh3add a1, a0, a0
+; RV32IBA-NEXT: sh1add a0, a1, a0
; RV32IBA-NEXT: ret
%c = mul i32 %a, 19
ret i32 %c
@@ -482,14 +482,14 @@ define i32 @mul13(i32 %a) {
;
; RV32IB-LABEL: mul13:
; RV32IB: # %bb.0:
-; RV32IB-NEXT: addi a1, zero, 13
-; RV32IB-NEXT: mul a0, a0, a1
+; RV32IB-NEXT: sh1add a1, a0, a0
+; RV32IB-NEXT: sh2add a0, a1, a0
; RV32IB-NEXT: ret
;
; RV32IBA-LABEL: mul13:
; RV32IBA: # %bb.0:
-; RV32IBA-NEXT: addi a1, zero, 13
-; RV32IBA-NEXT: mul a0, a0, a1
+; RV32IBA-NEXT: sh1add a1, a0, a0
+; RV32IBA-NEXT: sh2add a0, a1, a0
; RV32IBA-NEXT: ret
%c = mul i32 %a, 13
ret i32 %c
@@ -504,14 +504,14 @@ define i32 @mul21(i32 %a) {
;
; RV32IB-LABEL: mul21:
; RV32IB: # %bb.0:
-; RV32IB-NEXT: addi a1, zero, 21
-; RV32IB-NEXT: mul a0, a0, a1
+; RV32IB-NEXT: sh2add a1, a0, a0
+; RV32IB-NEXT: sh2add a0, a1, a0
; RV32IB-NEXT: ret
;
; RV32IBA-LABEL: mul21:
; RV32IBA: # %bb.0:
-; RV32IBA-NEXT: addi a1, zero, 21
-; RV32IBA-NEXT: mul a0, a0, a1
+; RV32IBA-NEXT: sh2add a1, a0, a0
+; RV32IBA-NEXT: sh2add a0, a1, a0
; RV32IBA-NEXT: ret
%c = mul i32 %a, 21
ret i32 %c
@@ -526,14 +526,14 @@ define i32 @mul37(i32 %a) {
;
; RV32IB-LABEL: mul37:
; RV32IB: # %bb.0:
-; RV32IB-NEXT: addi a1, zero, 37
-; RV32IB-NEXT: mul a0, a0, a1
+; RV32IB-NEXT: sh3add a1, a0, a0
+; RV32IB-NEXT: sh2add a0, a1, a0
; RV32IB-NEXT: ret
;
; RV32IBA-LABEL: mul37:
; RV32IBA: # %bb.0:
-; RV32IBA-NEXT: addi a1, zero, 37
-; RV32IBA-NEXT: mul a0, a0, a1
+; RV32IBA-NEXT: sh3add a1, a0, a0
+; RV32IBA-NEXT: sh2add a0, a1, a0
; RV32IBA-NEXT: ret
%c = mul i32 %a, 37
ret i32 %c
@@ -548,14 +548,14 @@ define i32 @mul25(i32 %a) {
;
; RV32IB-LABEL: mul25:
; RV32IB: # %bb.0:
-; RV32IB-NEXT: addi a1, zero, 25
-; RV32IB-NEXT: mul a0, a0, a1
+; RV32IB-NEXT: sh1add a1, a0, a0
+; RV32IB-NEXT: sh3add a0, a1, a0
; RV32IB-NEXT: ret
;
; RV32IBA-LABEL: mul25:
; RV32IBA: # %bb.0:
-; RV32IBA-NEXT: addi a1, zero, 25
-; RV32IBA-NEXT: mul a0, a0, a1
+; RV32IBA-NEXT: sh1add a1, a0, a0
+; RV32IBA-NEXT: sh3add a0, a1, a0
; RV32IBA-NEXT: ret
%c = mul i32 %a, 25
ret i32 %c
@@ -570,14 +570,14 @@ define i32 @mul41(i32 %a) {
;
; RV32IB-LABEL: mul41:
; RV32IB: # %bb.0:
-; RV32IB-NEXT: addi a1, zero, 41
-; RV32IB-NEXT: mul a0, a0, a1
+; RV32IB-NEXT: sh2add a1, a0, a0
+; RV32IB-NEXT: sh3add a0, a1, a0
; RV32IB-NEXT: ret
;
; RV32IBA-LABEL: mul41:
; RV32IBA: # %bb.0:
-; RV32IBA-NEXT: addi a1, zero, 41
-; RV32IBA-NEXT: mul a0, a0, a1
+; RV32IBA-NEXT: sh2add a1, a0, a0
+; RV32IBA-NEXT: sh3add a0, a1, a0
; RV32IBA-NEXT: ret
%c = mul i32 %a, 41
ret i32 %c
@@ -592,14 +592,14 @@ define i32 @mul73(i32 %a) {
;
; RV32IB-LABEL: mul73:
; RV32IB: # %bb.0:
-; RV32IB-NEXT: addi a1, zero, 73
-; RV32IB-NEXT: mul a0, a0, a1
+; RV32IB-NEXT: sh3add a1, a0, a0
+; RV32IB-NEXT: sh3add a0, a1, a0
; RV32IB-NEXT: ret
;
; RV32IBA-LABEL: mul73:
; RV32IBA: # %bb.0:
-; RV32IBA-NEXT: addi a1, zero, 73
-; RV32IBA-NEXT: mul a0, a0, a1
+; RV32IBA-NEXT: sh3add a1, a0, a0
+; RV32IBA-NEXT: sh3add a0, a1, a0
; RV32IBA-NEXT: ret
%c = mul i32 %a, 73
ret i32 %c
@@ -614,14 +614,14 @@ define i32 @mul27(i32 %a) {
;
; RV32IB-LABEL: mul27:
; RV32IB: # %bb.0:
-; RV32IB-NEXT: addi a1, zero, 27
-; RV32IB-NEXT: mul a0, a0, a1
+; RV32IB-NEXT: sh3add a0, a0, a0
+; RV32IB-NEXT: sh1add a0, a0, a0
; RV32IB-NEXT: ret
;
; RV32IBA-LABEL: mul27:
; RV32IBA: # %bb.0:
-; RV32IBA-NEXT: addi a1, zero, 27
-; RV32IBA-NEXT: mul a0, a0, a1
+; RV32IBA-NEXT: sh3add a0, a0, a0
+; RV32IBA-NEXT: sh1add a0, a0, a0
; RV32IBA-NEXT: ret
%c = mul i32 %a, 27
ret i32 %c
@@ -636,14 +636,14 @@ define i32 @mul45(i32 %a) {
;
; RV32IB-LABEL: mul45:
; RV32IB: # %bb.0:
-; RV32IB-NEXT: addi a1, zero, 45
-; RV32IB-NEXT: mul a0, a0, a1
+; RV32IB-NEXT: sh3add a0, a0, a0
+; RV32IB-NEXT: sh2add a0, a0, a0
; RV32IB-NEXT: ret
;
; RV32IBA-LABEL: mul45:
; RV32IBA: # %bb.0:
-; RV32IBA-NEXT: addi a1, zero, 45
-; RV32IBA-NEXT: mul a0, a0, a1
+; RV32IBA-NEXT: sh3add a0, a0, a0
+; RV32IBA-NEXT: sh2add a0, a0, a0
; RV32IBA-NEXT: ret
%c = mul i32 %a, 45
ret i32 %c
@@ -658,14 +658,14 @@ define i32 @mul81(i32 %a) {
;
; RV32IB-LABEL: mul81:
; RV32IB: # %bb.0:
-; RV32IB-NEXT: addi a1, zero, 81
-; RV32IB-NEXT: mul a0, a0, a1
+; RV32IB-NEXT: sh3add a0, a0, a0
+; RV32IB-NEXT: sh3add a0, a0, a0
; RV32IB-NEXT: ret
;
; RV32IBA-LABEL: mul81:
; RV32IBA: # %bb.0:
-; RV32IBA-NEXT: addi a1, zero, 81
-; RV32IBA-NEXT: mul a0, a0, a1
+; RV32IBA-NEXT: sh3add a0, a0, a0
+; RV32IBA-NEXT: sh3add a0, a0, a0
; RV32IBA-NEXT: ret
%c = mul i32 %a, 81
ret i32 %c
diff --git a/llvm/test/CodeGen/RISCV/rv64zba.ll b/llvm/test/CodeGen/RISCV/rv64zba.ll
index f4707a8dfed1..c33a8ee4a7fe 100644
--- a/llvm/test/CodeGen/RISCV/rv64zba.ll
+++ b/llvm/test/CodeGen/RISCV/rv64zba.ll
@@ -943,14 +943,14 @@ define i64 @mul11(i64 %a) {
;
; RV64IB-LABEL: mul11:
; RV64IB: # %bb.0:
-; RV64IB-NEXT: addi a1, zero, 11
-; RV64IB-NEXT: mul a0, a0, a1
+; RV64IB-NEXT: sh2add a1, a0, a0
+; RV64IB-NEXT: sh1add a0, a1, a0
; RV64IB-NEXT: ret
;
; RV64IBA-LABEL: mul11:
; RV64IBA: # %bb.0:
-; RV64IBA-NEXT: addi a1, zero, 11
-; RV64IBA-NEXT: mul a0, a0, a1
+; RV64IBA-NEXT: sh2add a1, a0, a0
+; RV64IBA-NEXT: sh1add a0, a1, a0
; RV64IBA-NEXT: ret
%c = mul i64 %a, 11
ret i64 %c
@@ -965,14 +965,14 @@ define i64 @mul19(i64 %a) {
;
; RV64IB-LABEL: mul19:
; RV64IB: # %bb.0:
-; RV64IB-NEXT: addi a1, zero, 19
-; RV64IB-NEXT: mul a0, a0, a1
+; RV64IB-NEXT: sh3add a1, a0, a0
+; RV64IB-NEXT: sh1add a0, a1, a0
; RV64IB-NEXT: ret
;
; RV64IBA-LABEL: mul19:
; RV64IBA: # %bb.0:
-; RV64IBA-NEXT: addi a1, zero, 19
-; RV64IBA-NEXT: mul a0, a0, a1
+; RV64IBA-NEXT: sh3add a1, a0, a0
+; RV64IBA-NEXT: sh1add a0, a1, a0
; RV64IBA-NEXT: ret
%c = mul i64 %a, 19
ret i64 %c
@@ -987,14 +987,14 @@ define i64 @mul13(i64 %a) {
;
; RV64IB-LABEL: mul13:
; RV64IB: # %bb.0:
-; RV64IB-NEXT: addi a1, zero, 13
-; RV64IB-NEXT: mul a0, a0, a1
+; RV64IB-NEXT: sh1add a1, a0, a0
+; RV64IB-NEXT: sh2add a0, a1, a0
; RV64IB-NEXT: ret
;
; RV64IBA-LABEL: mul13:
; RV64IBA: # %bb.0:
-; RV64IBA-NEXT: addi a1, zero, 13
-; RV64IBA-NEXT: mul a0, a0, a1
+; RV64IBA-NEXT: sh1add a1, a0, a0
+; RV64IBA-NEXT: sh2add a0, a1, a0
; RV64IBA-NEXT: ret
%c = mul i64 %a, 13
ret i64 %c
@@ -1009,14 +1009,14 @@ define i64 @mul21(i64 %a) {
;
; RV64IB-LABEL: mul21:
; RV64IB: # %bb.0:
-; RV64IB-NEXT: addi a1, zero, 21
-; RV64IB-NEXT: mul a0, a0, a1
+; RV64IB-NEXT: sh2add a1, a0, a0
+; RV64IB-NEXT: sh2add a0, a1, a0
; RV64IB-NEXT: ret
;
; RV64IBA-LABEL: mul21:
; RV64IBA: # %bb.0:
-; RV64IBA-NEXT: addi a1, zero, 21
-; RV64IBA-NEXT: mul a0, a0, a1
+; RV64IBA-NEXT: sh2add a1, a0, a0
+; RV64IBA-NEXT: sh2add a0, a1, a0
; RV64IBA-NEXT: ret
%c = mul i64 %a, 21
ret i64 %c
@@ -1031,14 +1031,14 @@ define i64 @mul37(i64 %a) {
;
; RV64IB-LABEL: mul37:
; RV64IB: # %bb.0:
-; RV64IB-NEXT: addi a1, zero, 37
-; RV64IB-NEXT: mul a0, a0, a1
+; RV64IB-NEXT: sh3add a1, a0, a0
+; RV64IB-NEXT: sh2add a0, a1, a0
; RV64IB-NEXT: ret
;
; RV64IBA-LABEL: mul37:
; RV64IBA: # %bb.0:
-; RV64IBA-NEXT: addi a1, zero, 37
-; RV64IBA-NEXT: mul a0, a0, a1
+; RV64IBA-NEXT: sh3add a1, a0, a0
+; RV64IBA-NEXT: sh2add a0, a1, a0
; RV64IBA-NEXT: ret
%c = mul i64 %a, 37
ret i64 %c
@@ -1053,14 +1053,14 @@ define i64 @mul25(i64 %a) {
;
; RV64IB-LABEL: mul25:
; RV64IB: # %bb.0:
-; RV64IB-NEXT: addi a1, zero, 25
-; RV64IB-NEXT: mul a0, a0, a1
+; RV64IB-NEXT: sh1add a1, a0, a0
+; RV64IB-NEXT: sh3add a0, a1, a0
; RV64IB-NEXT: ret
;
; RV64IBA-LABEL: mul25:
; RV64IBA: # %bb.0:
-; RV64IBA-NEXT: addi a1, zero, 25
-; RV64IBA-NEXT: mul a0, a0, a1
+; RV64IBA-NEXT: sh1add a1, a0, a0
+; RV64IBA-NEXT: sh3add a0, a1, a0
; RV64IBA-NEXT: ret
%c = mul i64 %a, 25
ret i64 %c
@@ -1075,14 +1075,14 @@ define i64 @mul41(i64 %a) {
;
; RV64IB-LABEL: mul41:
; RV64IB: # %bb.0:
-; RV64IB-NEXT: addi a1, zero, 41
-; RV64IB-NEXT: mul a0, a0, a1
+; RV64IB-NEXT: sh2add a1, a0, a0
+; RV64IB-NEXT: sh3add a0, a1, a0
; RV64IB-NEXT: ret
;
; RV64IBA-LABEL: mul41:
; RV64IBA: # %bb.0:
-; RV64IBA-NEXT: addi a1, zero, 41
-; RV64IBA-NEXT: mul a0, a0, a1
+; RV64IBA-NEXT: sh2add a1, a0, a0
+; RV64IBA-NEXT: sh3add a0, a1, a0
; RV64IBA-NEXT: ret
%c = mul i64 %a, 41
ret i64 %c
@@ -1097,14 +1097,14 @@ define i64 @mul73(i64 %a) {
;
; RV64IB-LABEL: mul73:
; RV64IB: # %bb.0:
-; RV64IB-NEXT: addi a1, zero, 73
-; RV64IB-NEXT: mul a0, a0, a1
+; RV64IB-NEXT: sh3add a1, a0, a0
+; RV64IB-NEXT: sh3add a0, a1, a0
; RV64IB-NEXT: ret
;
; RV64IBA-LABEL: mul73:
; RV64IBA: # %bb.0:
-; RV64IBA-NEXT: addi a1, zero, 73
-; RV64IBA-NEXT: mul a0, a0, a1
+; RV64IBA-NEXT: sh3add a1, a0, a0
+; RV64IBA-NEXT: sh3add a0, a1, a0
; RV64IBA-NEXT: ret
%c = mul i64 %a, 73
ret i64 %c
@@ -1119,14 +1119,14 @@ define i64 @mul27(i64 %a) {
;
; RV64IB-LABEL: mul27:
; RV64IB: # %bb.0:
-; RV64IB-NEXT: addi a1, zero, 27
-; RV64IB-NEXT: mul a0, a0, a1
+; RV64IB-NEXT: sh3add a0, a0, a0
+; RV64IB-NEXT: sh1add a0, a0, a0
; RV64IB-NEXT: ret
;
; RV64IBA-LABEL: mul27:
; RV64IBA: # %bb.0:
-; RV64IBA-NEXT: addi a1, zero, 27
-; RV64IBA-NEXT: mul a0, a0, a1
+; RV64IBA-NEXT: sh3add a0, a0, a0
+; RV64IBA-NEXT: sh1add a0, a0, a0
; RV64IBA-NEXT: ret
%c = mul i64 %a, 27
ret i64 %c
@@ -1141,14 +1141,14 @@ define i64 @mul45(i64 %a) {
;
; RV64IB-LABEL: mul45:
; RV64IB: # %bb.0:
-; RV64IB-NEXT: addi a1, zero, 45
-; RV64IB-NEXT: mul a0, a0, a1
+; RV64IB-NEXT: sh3add a0, a0, a0
+; RV64IB-NEXT: sh2add a0, a0, a0
; RV64IB-NEXT: ret
;
; RV64IBA-LABEL: mul45:
; RV64IBA: # %bb.0:
-; RV64IBA-NEXT: addi a1, zero, 45
-; RV64IBA-NEXT: mul a0, a0, a1
+; RV64IBA-NEXT: sh3add a0, a0, a0
+; RV64IBA-NEXT: sh2add a0, a0, a0
; RV64IBA-NEXT: ret
%c = mul i64 %a, 45
ret i64 %c
@@ -1163,14 +1163,14 @@ define i64 @mul81(i64 %a) {
;
; RV64IB-LABEL: mul81:
; RV64IB: # %bb.0:
-; RV64IB-NEXT: addi a1, zero, 81
-; RV64IB-NEXT: mul a0, a0, a1
+; RV64IB-NEXT: sh3add a0, a0, a0
+; RV64IB-NEXT: sh3add a0, a0, a0
; RV64IB-NEXT: ret
;
; RV64IBA-LABEL: mul81:
; RV64IBA: # %bb.0:
-; RV64IBA-NEXT: addi a1, zero, 81
-; RV64IBA-NEXT: mul a0, a0, a1
+; RV64IBA-NEXT: sh3add a0, a0, a0
+; RV64IBA-NEXT: sh3add a0, a0, a0
; RV64IBA-NEXT: ret
%c = mul i64 %a, 81
ret i64 %c
diff --git a/llvm/test/CodeGen/RISCV/xaluo.ll b/llvm/test/CodeGen/RISCV/xaluo.ll
index dd41a94d3562..93789c0085de 100644
--- a/llvm/test/CodeGen/RISCV/xaluo.ll
+++ b/llvm/test/CodeGen/RISCV/xaluo.ll
@@ -1149,8 +1149,8 @@ define zeroext i1 @umulo2.i32(i32 %v1, i32* %res) {
; RV64ZBA-LABEL: umulo2.i32:
; RV64ZBA: # %bb.0: # %entry
; RV64ZBA-NEXT: zext.w a0, a0
-; RV64ZBA-NEXT: addi a2, zero, 13
-; RV64ZBA-NEXT: mul a2, a0, a2
+; RV64ZBA-NEXT: sh1add a2, a0, a0
+; RV64ZBA-NEXT: sh2add a2, a2, a0
; RV64ZBA-NEXT: srli a0, a2, 32
; RV64ZBA-NEXT: snez a0, a0
; RV64ZBA-NEXT: sw a2, 0(a1)
More information about the llvm-commits
mailing list