[llvm] fc97303 - [RISCV]Optimize (riscvisd::select_cc x, 0, ne, x, 1)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Mar 15 19:56:32 PDT 2023
Author: LiaoChunyu
Date: 2023-03-16T10:56:26+08:00
New Revision: fc9730376c213bd3bf3f5ff8251f1ba1f4cbfb31
URL: https://github.com/llvm/llvm-project/commit/fc9730376c213bd3bf3f5ff8251f1ba1f4cbfb31
DIFF: https://github.com/llvm/llvm-project/commit/fc9730376c213bd3bf3f5ff8251f1ba1f4cbfb31.diff
LOG: [RISCV]Optimize (riscvisd::select_cc x, 0, ne, x, 1)
This patch reduces the number of unpredictable branches.
Reviewed By: craig.topper
Differential Revision: https://reviews.llvm.org/D146117
Added:
Modified:
llvm/lib/Target/RISCV/RISCVISelLowering.cpp
llvm/test/CodeGen/RISCV/double-convert-strict.ll
llvm/test/CodeGen/RISCV/double-convert.ll
llvm/test/CodeGen/RISCV/float-convert-strict.ll
llvm/test/CodeGen/RISCV/float-convert.ll
llvm/test/CodeGen/RISCV/forced-atomics.ll
llvm/test/CodeGen/RISCV/half-convert-strict.ll
llvm/test/CodeGen/RISCV/half-convert.ll
llvm/test/CodeGen/RISCV/min-max.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
index 24896de16d275..e56a2b3b08b54 100644
--- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
+++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
@@ -10911,6 +10911,18 @@ SDValue RISCVTargetLowering::PerformDAGCombine(SDNode *N,
SDValue Neg = DAG.getNegative(C, DL, VT);
return DAG.getNode(ISD::AND, DL, VT, Neg, TrueV);
}
+ // (riscvisd::select_cc x, 0, ne, x, 1) -> (add x, (setcc x, 0, eq))
+ // (riscvisd::select_cc x, 0, eq, 1, x) -> (add x, (setcc x, 0, eq))
+ if (((isOneConstant(FalseV) && LHS == TrueV &&
+ CCVal == ISD::CondCode::SETNE) ||
+ (isOneConstant(TrueV) && LHS == FalseV &&
+ CCVal == ISD::CondCode::SETEQ)) &&
+ isNullConstant(RHS)) {
+ // freeze it to be safe.
+ LHS = DAG.getFreeze(LHS);
+ SDValue C = DAG.getSetCC(DL, VT, LHS, RHS, ISD::CondCode::SETEQ);
+ return DAG.getNode(ISD::ADD, DL, VT, LHS, C);
+ }
}
return SDValue();
diff --git a/llvm/test/CodeGen/RISCV/double-convert-strict.ll b/llvm/test/CodeGen/RISCV/double-convert-strict.ll
index 557cc1c7f1704..b353d425098c5 100644
--- a/llvm/test/CodeGen/RISCV/double-convert-strict.ll
+++ b/llvm/test/CodeGen/RISCV/double-convert-strict.ll
@@ -134,10 +134,8 @@ define i32 @fcvt_wu_d_multiple_use(double %x, ptr %y) nounwind {
; CHECKIFD-LABEL: fcvt_wu_d_multiple_use:
; CHECKIFD: # %bb.0:
; CHECKIFD-NEXT: fcvt.wu.d a0, fa0, rtz
-; CHECKIFD-NEXT: bnez a0, .LBB4_2
-; CHECKIFD-NEXT: # %bb.1:
-; CHECKIFD-NEXT: li a0, 1
-; CHECKIFD-NEXT: .LBB4_2:
+; CHECKIFD-NEXT: seqz a1, a0
+; CHECKIFD-NEXT: add a0, a0, a1
; CHECKIFD-NEXT: ret
;
; RV32I-LABEL: fcvt_wu_d_multiple_use:
@@ -145,10 +143,8 @@ define i32 @fcvt_wu_d_multiple_use(double %x, ptr %y) nounwind {
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: call __fixunsdfsi at plt
-; RV32I-NEXT: bnez a0, .LBB4_2
-; RV32I-NEXT: # %bb.1:
-; RV32I-NEXT: li a0, 1
-; RV32I-NEXT: .LBB4_2:
+; RV32I-NEXT: seqz a1, a0
+; RV32I-NEXT: add a0, a0, a1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
@@ -158,10 +154,8 @@ define i32 @fcvt_wu_d_multiple_use(double %x, ptr %y) nounwind {
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: call __fixunsdfsi at plt
-; RV64I-NEXT: bnez a0, .LBB4_2
-; RV64I-NEXT: # %bb.1:
-; RV64I-NEXT: li a0, 1
-; RV64I-NEXT: .LBB4_2:
+; RV64I-NEXT: seqz a1, a0
+; RV64I-NEXT: add a0, a0, a1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
diff --git a/llvm/test/CodeGen/RISCV/double-convert.ll b/llvm/test/CodeGen/RISCV/double-convert.ll
index f65f55e59fb3c..e84be956b567a 100644
--- a/llvm/test/CodeGen/RISCV/double-convert.ll
+++ b/llvm/test/CodeGen/RISCV/double-convert.ll
@@ -236,10 +236,8 @@ define i32 @fcvt_wu_d_multiple_use(double %x, ptr %y) nounwind {
; CHECKIFD-LABEL: fcvt_wu_d_multiple_use:
; CHECKIFD: # %bb.0:
; CHECKIFD-NEXT: fcvt.wu.d a0, fa0, rtz
-; CHECKIFD-NEXT: bnez a0, .LBB5_2
-; CHECKIFD-NEXT: # %bb.1:
-; CHECKIFD-NEXT: li a0, 1
-; CHECKIFD-NEXT: .LBB5_2:
+; CHECKIFD-NEXT: seqz a1, a0
+; CHECKIFD-NEXT: add a0, a0, a1
; CHECKIFD-NEXT: ret
;
; RV32I-LABEL: fcvt_wu_d_multiple_use:
@@ -247,10 +245,8 @@ define i32 @fcvt_wu_d_multiple_use(double %x, ptr %y) nounwind {
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: call __fixunsdfsi at plt
-; RV32I-NEXT: bnez a0, .LBB5_2
-; RV32I-NEXT: # %bb.1:
-; RV32I-NEXT: li a0, 1
-; RV32I-NEXT: .LBB5_2:
+; RV32I-NEXT: seqz a1, a0
+; RV32I-NEXT: add a0, a0, a1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
@@ -260,10 +256,8 @@ define i32 @fcvt_wu_d_multiple_use(double %x, ptr %y) nounwind {
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: call __fixunsdfsi at plt
-; RV64I-NEXT: bnez a0, .LBB5_2
-; RV64I-NEXT: # %bb.1:
-; RV64I-NEXT: li a0, 1
-; RV64I-NEXT: .LBB5_2:
+; RV64I-NEXT: seqz a1, a0
+; RV64I-NEXT: add a0, a0, a1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
diff --git a/llvm/test/CodeGen/RISCV/float-convert-strict.ll b/llvm/test/CodeGen/RISCV/float-convert-strict.ll
index b38f03c60f584..9bf675f3a6814 100644
--- a/llvm/test/CodeGen/RISCV/float-convert-strict.ll
+++ b/llvm/test/CodeGen/RISCV/float-convert-strict.ll
@@ -76,10 +76,8 @@ define i32 @fcvt_wu_s_multiple_use(float %x, ptr %y) nounwind {
; CHECKIF-LABEL: fcvt_wu_s_multiple_use:
; CHECKIF: # %bb.0:
; CHECKIF-NEXT: fcvt.wu.s a0, fa0, rtz
-; CHECKIF-NEXT: bnez a0, .LBB2_2
-; CHECKIF-NEXT: # %bb.1:
-; CHECKIF-NEXT: li a0, 1
-; CHECKIF-NEXT: .LBB2_2:
+; CHECKIF-NEXT: seqz a1, a0
+; CHECKIF-NEXT: add a0, a0, a1
; CHECKIF-NEXT: ret
;
; RV32I-LABEL: fcvt_wu_s_multiple_use:
@@ -87,10 +85,8 @@ define i32 @fcvt_wu_s_multiple_use(float %x, ptr %y) nounwind {
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: call __fixunssfsi at plt
-; RV32I-NEXT: bnez a0, .LBB2_2
-; RV32I-NEXT: # %bb.1:
-; RV32I-NEXT: li a0, 1
-; RV32I-NEXT: .LBB2_2:
+; RV32I-NEXT: seqz a1, a0
+; RV32I-NEXT: add a0, a0, a1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
@@ -100,10 +96,8 @@ define i32 @fcvt_wu_s_multiple_use(float %x, ptr %y) nounwind {
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: call __fixunssfsi at plt
-; RV64I-NEXT: bnez a0, .LBB2_2
-; RV64I-NEXT: # %bb.1:
-; RV64I-NEXT: li a0, 1
-; RV64I-NEXT: .LBB2_2:
+; RV64I-NEXT: seqz a1, a0
+; RV64I-NEXT: add a0, a0, a1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
diff --git a/llvm/test/CodeGen/RISCV/float-convert.ll b/llvm/test/CodeGen/RISCV/float-convert.ll
index 22d59fccc9e77..e0ce301dad3a7 100644
--- a/llvm/test/CodeGen/RISCV/float-convert.ll
+++ b/llvm/test/CodeGen/RISCV/float-convert.ll
@@ -167,10 +167,8 @@ define i32 @fcvt_wu_s_multiple_use(float %x, ptr %y) nounwind {
; CHECKIF-LABEL: fcvt_wu_s_multiple_use:
; CHECKIF: # %bb.0:
; CHECKIF-NEXT: fcvt.wu.s a0, fa0, rtz
-; CHECKIF-NEXT: bnez a0, .LBB3_2
-; CHECKIF-NEXT: # %bb.1:
-; CHECKIF-NEXT: li a0, 1
-; CHECKIF-NEXT: .LBB3_2:
+; CHECKIF-NEXT: seqz a1, a0
+; CHECKIF-NEXT: add a0, a0, a1
; CHECKIF-NEXT: ret
;
; RV32I-LABEL: fcvt_wu_s_multiple_use:
@@ -178,10 +176,8 @@ define i32 @fcvt_wu_s_multiple_use(float %x, ptr %y) nounwind {
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: call __fixunssfsi at plt
-; RV32I-NEXT: bnez a0, .LBB3_2
-; RV32I-NEXT: # %bb.1:
-; RV32I-NEXT: li a0, 1
-; RV32I-NEXT: .LBB3_2:
+; RV32I-NEXT: seqz a1, a0
+; RV32I-NEXT: add a0, a0, a1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
@@ -191,10 +187,8 @@ define i32 @fcvt_wu_s_multiple_use(float %x, ptr %y) nounwind {
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: call __fixunssfsi at plt
-; RV64I-NEXT: bnez a0, .LBB3_2
-; RV64I-NEXT: # %bb.1:
-; RV64I-NEXT: li a0, 1
-; RV64I-NEXT: .LBB3_2:
+; RV64I-NEXT: seqz a1, a0
+; RV64I-NEXT: add a0, a0, a1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
diff --git a/llvm/test/CodeGen/RISCV/forced-atomics.ll b/llvm/test/CodeGen/RISCV/forced-atomics.ll
index 1bc88567d9ecc..7c92a74dc9517 100644
--- a/llvm/test/CodeGen/RISCV/forced-atomics.ll
+++ b/llvm/test/CodeGen/RISCV/forced-atomics.ll
@@ -1169,9 +1169,10 @@ define i32 @rmw32_umax_seq_cst(ptr %p) nounwind {
; RV32-NO-ATOMIC-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
; RV32-NO-ATOMIC-NEXT: mv s0, a0
; RV32-NO-ATOMIC-NEXT: lw a1, 0(a0)
-; RV32-NO-ATOMIC-NEXT: j .LBB25_2
; RV32-NO-ATOMIC-NEXT: .LBB25_1: # %atomicrmw.start
-; RV32-NO-ATOMIC-NEXT: # in Loop: Header=BB25_2 Depth=1
+; RV32-NO-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
+; RV32-NO-ATOMIC-NEXT: seqz a2, a1
+; RV32-NO-ATOMIC-NEXT: add a2, a1, a2
; RV32-NO-ATOMIC-NEXT: sw a1, 4(sp)
; RV32-NO-ATOMIC-NEXT: addi a1, sp, 4
; RV32-NO-ATOMIC-NEXT: li a3, 5
@@ -1179,16 +1180,8 @@ define i32 @rmw32_umax_seq_cst(ptr %p) nounwind {
; RV32-NO-ATOMIC-NEXT: mv a0, s0
; RV32-NO-ATOMIC-NEXT: call __atomic_compare_exchange_4 at plt
; RV32-NO-ATOMIC-NEXT: lw a1, 4(sp)
-; RV32-NO-ATOMIC-NEXT: bnez a0, .LBB25_4
-; RV32-NO-ATOMIC-NEXT: .LBB25_2: # %atomicrmw.start
-; RV32-NO-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
-; RV32-NO-ATOMIC-NEXT: mv a2, a1
-; RV32-NO-ATOMIC-NEXT: bnez a1, .LBB25_1
-; RV32-NO-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
-; RV32-NO-ATOMIC-NEXT: # in Loop: Header=BB25_2 Depth=1
-; RV32-NO-ATOMIC-NEXT: li a2, 1
-; RV32-NO-ATOMIC-NEXT: j .LBB25_1
-; RV32-NO-ATOMIC-NEXT: .LBB25_4: # %atomicrmw.end
+; RV32-NO-ATOMIC-NEXT: beqz a0, .LBB25_1
+; RV32-NO-ATOMIC-NEXT: # %bb.2: # %atomicrmw.end
; RV32-NO-ATOMIC-NEXT: mv a0, a1
; RV32-NO-ATOMIC-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32-NO-ATOMIC-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
@@ -2740,9 +2733,10 @@ define i64 @rmw64_umax_seq_cst(ptr %p) nounwind {
; RV64-NO-ATOMIC-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
; RV64-NO-ATOMIC-NEXT: mv s0, a0
; RV64-NO-ATOMIC-NEXT: ld a1, 0(a0)
-; RV64-NO-ATOMIC-NEXT: j .LBB51_2
; RV64-NO-ATOMIC-NEXT: .LBB51_1: # %atomicrmw.start
-; RV64-NO-ATOMIC-NEXT: # in Loop: Header=BB51_2 Depth=1
+; RV64-NO-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
+; RV64-NO-ATOMIC-NEXT: seqz a2, a1
+; RV64-NO-ATOMIC-NEXT: add a2, a1, a2
; RV64-NO-ATOMIC-NEXT: sd a1, 8(sp)
; RV64-NO-ATOMIC-NEXT: addi a1, sp, 8
; RV64-NO-ATOMIC-NEXT: li a3, 5
@@ -2750,16 +2744,8 @@ define i64 @rmw64_umax_seq_cst(ptr %p) nounwind {
; RV64-NO-ATOMIC-NEXT: mv a0, s0
; RV64-NO-ATOMIC-NEXT: call __atomic_compare_exchange_8 at plt
; RV64-NO-ATOMIC-NEXT: ld a1, 8(sp)
-; RV64-NO-ATOMIC-NEXT: bnez a0, .LBB51_4
-; RV64-NO-ATOMIC-NEXT: .LBB51_2: # %atomicrmw.start
-; RV64-NO-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
-; RV64-NO-ATOMIC-NEXT: mv a2, a1
-; RV64-NO-ATOMIC-NEXT: bnez a1, .LBB51_1
-; RV64-NO-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
-; RV64-NO-ATOMIC-NEXT: # in Loop: Header=BB51_2 Depth=1
-; RV64-NO-ATOMIC-NEXT: li a2, 1
-; RV64-NO-ATOMIC-NEXT: j .LBB51_1
-; RV64-NO-ATOMIC-NEXT: .LBB51_4: # %atomicrmw.end
+; RV64-NO-ATOMIC-NEXT: beqz a0, .LBB51_1
+; RV64-NO-ATOMIC-NEXT: # %bb.2: # %atomicrmw.end
; RV64-NO-ATOMIC-NEXT: mv a0, a1
; RV64-NO-ATOMIC-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
; RV64-NO-ATOMIC-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
diff --git a/llvm/test/CodeGen/RISCV/half-convert-strict.ll b/llvm/test/CodeGen/RISCV/half-convert-strict.ll
index 2fe03a0110218..296db8d1beef5 100644
--- a/llvm/test/CodeGen/RISCV/half-convert-strict.ll
+++ b/llvm/test/CodeGen/RISCV/half-convert-strict.ll
@@ -173,48 +173,38 @@ define i32 @fcvt_wu_h_multiple_use(half %x, ptr %y) {
; CHECKIZFH-LABEL: fcvt_wu_h_multiple_use:
; CHECKIZFH: # %bb.0:
; CHECKIZFH-NEXT: fcvt.wu.h a0, fa0, rtz
-; CHECKIZFH-NEXT: bnez a0, .LBB4_2
-; CHECKIZFH-NEXT: # %bb.1:
-; CHECKIZFH-NEXT: li a0, 1
-; CHECKIZFH-NEXT: .LBB4_2:
+; CHECKIZFH-NEXT: seqz a1, a0
+; CHECKIZFH-NEXT: add a0, a0, a1
; CHECKIZFH-NEXT: ret
;
; RV32IDZFH-LABEL: fcvt_wu_h_multiple_use:
; RV32IDZFH: # %bb.0:
; RV32IDZFH-NEXT: fcvt.wu.h a0, fa0, rtz
-; RV32IDZFH-NEXT: bnez a0, .LBB4_2
-; RV32IDZFH-NEXT: # %bb.1:
-; RV32IDZFH-NEXT: li a0, 1
-; RV32IDZFH-NEXT: .LBB4_2:
+; RV32IDZFH-NEXT: seqz a1, a0
+; RV32IDZFH-NEXT: add a0, a0, a1
; RV32IDZFH-NEXT: ret
;
; RV64IDZFH-LABEL: fcvt_wu_h_multiple_use:
; RV64IDZFH: # %bb.0:
; RV64IDZFH-NEXT: fcvt.wu.h a0, fa0, rtz
-; RV64IDZFH-NEXT: bnez a0, .LBB4_2
-; RV64IDZFH-NEXT: # %bb.1:
-; RV64IDZFH-NEXT: li a0, 1
-; RV64IDZFH-NEXT: .LBB4_2:
+; RV64IDZFH-NEXT: seqz a1, a0
+; RV64IDZFH-NEXT: add a0, a0, a1
; RV64IDZFH-NEXT: ret
;
; CHECK32-IZFHMIN-LABEL: fcvt_wu_h_multiple_use:
; CHECK32-IZFHMIN: # %bb.0:
; CHECK32-IZFHMIN-NEXT: fcvt.s.h ft0, fa0
; CHECK32-IZFHMIN-NEXT: fcvt.wu.s a0, ft0, rtz
-; CHECK32-IZFHMIN-NEXT: bnez a0, .LBB4_2
-; CHECK32-IZFHMIN-NEXT: # %bb.1:
-; CHECK32-IZFHMIN-NEXT: li a0, 1
-; CHECK32-IZFHMIN-NEXT: .LBB4_2:
+; CHECK32-IZFHMIN-NEXT: seqz a1, a0
+; CHECK32-IZFHMIN-NEXT: add a0, a0, a1
; CHECK32-IZFHMIN-NEXT: ret
;
; CHECK64-IZFHMIN-LABEL: fcvt_wu_h_multiple_use:
; CHECK64-IZFHMIN: # %bb.0:
; CHECK64-IZFHMIN-NEXT: fcvt.s.h ft0, fa0
; CHECK64-IZFHMIN-NEXT: fcvt.wu.s a0, ft0, rtz
-; CHECK64-IZFHMIN-NEXT: bnez a0, .LBB4_2
-; CHECK64-IZFHMIN-NEXT: # %bb.1:
-; CHECK64-IZFHMIN-NEXT: li a0, 1
-; CHECK64-IZFHMIN-NEXT: .LBB4_2:
+; CHECK64-IZFHMIN-NEXT: seqz a1, a0
+; CHECK64-IZFHMIN-NEXT: add a0, a0, a1
; CHECK64-IZFHMIN-NEXT: ret
%a = call i32 @llvm.experimental.constrained.fptoui.i32.f16(half %x, metadata !"fpexcept.strict") strictfp
%b = icmp eq i32 %a, 0
diff --git a/llvm/test/CodeGen/RISCV/half-convert.ll b/llvm/test/CodeGen/RISCV/half-convert.ll
index fcba34a732e55..e28f0cc454839 100644
--- a/llvm/test/CodeGen/RISCV/half-convert.ll
+++ b/llvm/test/CodeGen/RISCV/half-convert.ll
@@ -735,28 +735,22 @@ define i32 @fcvt_wu_h_multiple_use(half %x, ptr %y) nounwind {
; CHECKIZFH-LABEL: fcvt_wu_h_multiple_use:
; CHECKIZFH: # %bb.0:
; CHECKIZFH-NEXT: fcvt.wu.h a0, fa0, rtz
-; CHECKIZFH-NEXT: bnez a0, .LBB7_2
-; CHECKIZFH-NEXT: # %bb.1:
-; CHECKIZFH-NEXT: li a0, 1
-; CHECKIZFH-NEXT: .LBB7_2:
+; CHECKIZFH-NEXT: seqz a1, a0
+; CHECKIZFH-NEXT: add a0, a0, a1
; CHECKIZFH-NEXT: ret
;
; RV32IDZFH-LABEL: fcvt_wu_h_multiple_use:
; RV32IDZFH: # %bb.0:
; RV32IDZFH-NEXT: fcvt.wu.h a0, fa0, rtz
-; RV32IDZFH-NEXT: bnez a0, .LBB7_2
-; RV32IDZFH-NEXT: # %bb.1:
-; RV32IDZFH-NEXT: li a0, 1
-; RV32IDZFH-NEXT: .LBB7_2:
+; RV32IDZFH-NEXT: seqz a1, a0
+; RV32IDZFH-NEXT: add a0, a0, a1
; RV32IDZFH-NEXT: ret
;
; RV64IDZFH-LABEL: fcvt_wu_h_multiple_use:
; RV64IDZFH: # %bb.0:
; RV64IDZFH-NEXT: fcvt.wu.h a0, fa0, rtz
-; RV64IDZFH-NEXT: bnez a0, .LBB7_2
-; RV64IDZFH-NEXT: # %bb.1:
-; RV64IDZFH-NEXT: li a0, 1
-; RV64IDZFH-NEXT: .LBB7_2:
+; RV64IDZFH-NEXT: seqz a1, a0
+; RV64IDZFH-NEXT: add a0, a0, a1
; RV64IDZFH-NEXT: ret
;
; RV32I-LABEL: fcvt_wu_h_multiple_use:
@@ -767,10 +761,8 @@ define i32 @fcvt_wu_h_multiple_use(half %x, ptr %y) nounwind {
; RV32I-NEXT: srli a0, a0, 16
; RV32I-NEXT: call __extendhfsf2 at plt
; RV32I-NEXT: call __fixunssfsi at plt
-; RV32I-NEXT: bnez a0, .LBB7_2
-; RV32I-NEXT: # %bb.1:
-; RV32I-NEXT: li a0, 1
-; RV32I-NEXT: .LBB7_2:
+; RV32I-NEXT: seqz a1, a0
+; RV32I-NEXT: add a0, a0, a1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
@@ -783,10 +775,8 @@ define i32 @fcvt_wu_h_multiple_use(half %x, ptr %y) nounwind {
; RV64I-NEXT: srli a0, a0, 48
; RV64I-NEXT: call __extendhfsf2 at plt
; RV64I-NEXT: call __fixunssfdi at plt
-; RV64I-NEXT: bnez a0, .LBB7_2
-; RV64I-NEXT: # %bb.1:
-; RV64I-NEXT: li a0, 1
-; RV64I-NEXT: .LBB7_2:
+; RV64I-NEXT: seqz a1, a0
+; RV64I-NEXT: add a0, a0, a1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
@@ -795,20 +785,16 @@ define i32 @fcvt_wu_h_multiple_use(half %x, ptr %y) nounwind {
; CHECK32-IZFHMIN: # %bb.0:
; CHECK32-IZFHMIN-NEXT: fcvt.s.h ft0, fa0
; CHECK32-IZFHMIN-NEXT: fcvt.wu.s a0, ft0, rtz
-; CHECK32-IZFHMIN-NEXT: bnez a0, .LBB7_2
-; CHECK32-IZFHMIN-NEXT: # %bb.1:
-; CHECK32-IZFHMIN-NEXT: li a0, 1
-; CHECK32-IZFHMIN-NEXT: .LBB7_2:
+; CHECK32-IZFHMIN-NEXT: seqz a1, a0
+; CHECK32-IZFHMIN-NEXT: add a0, a0, a1
; CHECK32-IZFHMIN-NEXT: ret
;
; CHECK64-IZFHMIN-LABEL: fcvt_wu_h_multiple_use:
; CHECK64-IZFHMIN: # %bb.0:
; CHECK64-IZFHMIN-NEXT: fcvt.s.h ft0, fa0
; CHECK64-IZFHMIN-NEXT: fcvt.wu.s a0, ft0, rtz
-; CHECK64-IZFHMIN-NEXT: bnez a0, .LBB7_2
-; CHECK64-IZFHMIN-NEXT: # %bb.1:
-; CHECK64-IZFHMIN-NEXT: li a0, 1
-; CHECK64-IZFHMIN-NEXT: .LBB7_2:
+; CHECK64-IZFHMIN-NEXT: seqz a1, a0
+; CHECK64-IZFHMIN-NEXT: add a0, a0, a1
; CHECK64-IZFHMIN-NEXT: ret
%a = fptoui half %x to i32
%b = icmp eq i32 %a, 0
diff --git a/llvm/test/CodeGen/RISCV/min-max.ll b/llvm/test/CodeGen/RISCV/min-max.ll
index a7ac4a7e2a0cb..4a1039ab8543c 100644
--- a/llvm/test/CodeGen/RISCV/min-max.ll
+++ b/llvm/test/CodeGen/RISCV/min-max.ll
@@ -719,3 +719,51 @@ define i64 @smin_i64_negone(i64 %a) {
%c = call i64 @llvm.smin.i64(i64 %a, i64 -1)
ret i64 %c
}
+
+define i64 @umax_i64_one(i64 %a, i64 %b) {
+; RV32I-LABEL: umax_i64_one:
+; RV32I: # %bb.0:
+; RV32I-NEXT: mv a2, a0
+; RV32I-NEXT: beqz a1, .LBB28_3
+; RV32I-NEXT: # %bb.1:
+; RV32I-NEXT: beqz a1, .LBB28_4
+; RV32I-NEXT: .LBB28_2:
+; RV32I-NEXT: ret
+; RV32I-NEXT: .LBB28_3:
+; RV32I-NEXT: li a0, 1
+; RV32I-NEXT: bnez a1, .LBB28_2
+; RV32I-NEXT: .LBB28_4:
+; RV32I-NEXT: seqz a0, a2
+; RV32I-NEXT: add a0, a2, a0
+; RV32I-NEXT: ret
+;
+; RV64I-LABEL: umax_i64_one:
+; RV64I: # %bb.0:
+; RV64I-NEXT: seqz a1, a0
+; RV64I-NEXT: add a0, a0, a1
+; RV64I-NEXT: ret
+;
+; RV32ZBB-LABEL: umax_i64_one:
+; RV32ZBB: # %bb.0:
+; RV32ZBB-NEXT: mv a2, a0
+; RV32ZBB-NEXT: li a3, 1
+; RV32ZBB-NEXT: beqz a1, .LBB28_3
+; RV32ZBB-NEXT: # %bb.1:
+; RV32ZBB-NEXT: beqz a1, .LBB28_4
+; RV32ZBB-NEXT: .LBB28_2:
+; RV32ZBB-NEXT: ret
+; RV32ZBB-NEXT: .LBB28_3:
+; RV32ZBB-NEXT: li a0, 1
+; RV32ZBB-NEXT: bnez a1, .LBB28_2
+; RV32ZBB-NEXT: .LBB28_4:
+; RV32ZBB-NEXT: maxu a0, a2, a3
+; RV32ZBB-NEXT: ret
+;
+; RV64ZBB-LABEL: umax_i64_one:
+; RV64ZBB: # %bb.0:
+; RV64ZBB-NEXT: li a1, 1
+; RV64ZBB-NEXT: maxu a0, a0, a1
+; RV64ZBB-NEXT: ret
+ %c = call i64 @llvm.umax.i64(i64 %a, i64 1)
+ ret i64 %c
+}
More information about the llvm-commits
mailing list