[llvm] 56ea2e2 - [RISCV] Add a special case to lowerSELECT for select of 2 constants with a SETLT condition.
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 7 13:47:30 PDT 2021
Author: Craig Topper
Date: 2021-04-07T13:47:17-07:00
New Revision: 56ea2e2fdd691136d5e6631fa0e447173694b82c
URL: https://github.com/llvm/llvm-project/commit/56ea2e2fdd691136d5e6631fa0e447173694b82c
DIFF: https://github.com/llvm/llvm-project/commit/56ea2e2fdd691136d5e6631fa0e447173694b82c.diff
LOG: [RISCV] Add a special case to lowerSELECT for select of 2 constants with a SETLT condition.
If the constants have a difference of 1 we can convert one to
the other by adding or subtracting the condition.
We have a DAG combine for this, but it only runs before type
legalization. If the select is introduced later during type
legalization or op legalization we will miss it.
We don't need a specific condition, but some conditions are
harder to materialize than others on RISCV. I know that SETLT
will be a single instruction and it is what is used by the
motivating pattern from signed saturating add/sub.
Differential Revision: https://reviews.llvm.org/D99021
Added:
Modified:
llvm/lib/Target/RISCV/RISCVISelLowering.cpp
llvm/test/CodeGen/RISCV/sadd_sat.ll
llvm/test/CodeGen/RISCV/sadd_sat_plus.ll
llvm/test/CodeGen/RISCV/ssub_sat.ll
llvm/test/CodeGen/RISCV/ssub_sat_plus.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
index 3b15844d86e1..e9c1a4893834 100644
--- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
+++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
@@ -2242,6 +2242,23 @@ SDValue RISCVTargetLowering::lowerSELECT(SDValue Op, SelectionDAG &DAG) const {
auto CC = cast<CondCodeSDNode>(CondV.getOperand(2));
ISD::CondCode CCVal = CC->get();
+ // Special case for a select of 2 constants that have a
diff ence of 1.
+ // Normally this is done by DAGCombine, but if the select is introduced by
+ // type legalization or op legalization, we miss it. Restricting to SETLT
+ // case for now because that is what signed saturating add/sub need.
+ // FIXME: We don't need the condition to be SETLT or even a SETCC,
+ // but we would probably want to swap the true/false values if the condition
+ // is SETGE/SETLE to avoid an XORI.
+ if (isa<ConstantSDNode>(TrueV) && isa<ConstantSDNode>(FalseV) &&
+ CCVal == ISD::SETLT) {
+ const APInt &TrueVal = cast<ConstantSDNode>(TrueV)->getAPIntValue();
+ const APInt &FalseVal = cast<ConstantSDNode>(FalseV)->getAPIntValue();
+ if (TrueVal - 1 == FalseVal)
+ return DAG.getNode(ISD::ADD, DL, Op.getValueType(), CondV, FalseV);
+ if (TrueVal + 1 == FalseVal)
+ return DAG.getNode(ISD::SUB, DL, Op.getValueType(), FalseV, CondV);
+ }
+
translateSetCCForBranch(DL, LHS, RHS, CCVal, DAG);
SDValue TargetCC = DAG.getConstant(CCVal, DL, XLenVT);
diff --git a/llvm/test/CodeGen/RISCV/sadd_sat.ll b/llvm/test/CodeGen/RISCV/sadd_sat.ll
index abd5d7435f85..be326d215577 100644
--- a/llvm/test/CodeGen/RISCV/sadd_sat.ll
+++ b/llvm/test/CodeGen/RISCV/sadd_sat.ll
@@ -16,18 +16,15 @@ define signext i32 @func(i32 signext %x, i32 signext %y) nounwind {
; RV32I-LABEL: func:
; RV32I: # %bb.0:
; RV32I-NEXT: mv a2, a0
-; RV32I-NEXT: add a3, a0, a1
-; RV32I-NEXT: lui a0, 524288
-; RV32I-NEXT: bgez a3, .LBB0_2
+; RV32I-NEXT: add a0, a0, a1
+; RV32I-NEXT: slt a2, a0, a2
+; RV32I-NEXT: slti a1, a1, 0
+; RV32I-NEXT: beq a1, a2, .LBB0_2
; RV32I-NEXT: # %bb.1:
-; RV32I-NEXT: addi a0, a0, -1
+; RV32I-NEXT: slti a0, a0, 0
+; RV32I-NEXT: lui a1, 524288
+; RV32I-NEXT: sub a0, a1, a0
; RV32I-NEXT: .LBB0_2:
-; RV32I-NEXT: slt a2, a3, a2
-; RV32I-NEXT: slti a1, a1, 0
-; RV32I-NEXT: bne a1, a2, .LBB0_4
-; RV32I-NEXT: # %bb.3:
-; RV32I-NEXT: mv a0, a3
-; RV32I-NEXT: .LBB0_4:
; RV32I-NEXT: ret
;
; RV64I-LABEL: func:
@@ -50,18 +47,15 @@ define signext i32 @func(i32 signext %x, i32 signext %y) nounwind {
; RV32IZbbNOZbt-LABEL: func:
; RV32IZbbNOZbt: # %bb.0:
; RV32IZbbNOZbt-NEXT: mv a2, a0
-; RV32IZbbNOZbt-NEXT: add a3, a0, a1
-; RV32IZbbNOZbt-NEXT: lui a0, 524288
-; RV32IZbbNOZbt-NEXT: bgez a3, .LBB0_2
+; RV32IZbbNOZbt-NEXT: add a0, a0, a1
+; RV32IZbbNOZbt-NEXT: slt a2, a0, a2
+; RV32IZbbNOZbt-NEXT: slti a1, a1, 0
+; RV32IZbbNOZbt-NEXT: beq a1, a2, .LBB0_2
; RV32IZbbNOZbt-NEXT: # %bb.1:
-; RV32IZbbNOZbt-NEXT: addi a0, a0, -1
+; RV32IZbbNOZbt-NEXT: slti a0, a0, 0
+; RV32IZbbNOZbt-NEXT: lui a1, 524288
+; RV32IZbbNOZbt-NEXT: sub a0, a1, a0
; RV32IZbbNOZbt-NEXT: .LBB0_2:
-; RV32IZbbNOZbt-NEXT: slt a2, a3, a2
-; RV32IZbbNOZbt-NEXT: slti a1, a1, 0
-; RV32IZbbNOZbt-NEXT: bne a1, a2, .LBB0_4
-; RV32IZbbNOZbt-NEXT: # %bb.3:
-; RV32IZbbNOZbt-NEXT: mv a0, a3
-; RV32IZbbNOZbt-NEXT: .LBB0_4:
; RV32IZbbNOZbt-NEXT: ret
;
; RV64IZbb-LABEL: func:
@@ -97,42 +91,34 @@ define i64 @func2(i64 %x, i64 %y) nounwind {
; RV32I-NEXT: add a5, a4, a3
; RV32I-NEXT: add a0, a0, a2
; RV32I-NEXT: sltu a1, a0, a1
-; RV32I-NEXT: add a2, a5, a1
-; RV32I-NEXT: lui a1, 524288
-; RV32I-NEXT: bgez a2, .LBB1_2
-; RV32I-NEXT: # %bb.1:
-; RV32I-NEXT: addi a1, a1, -1
-; RV32I-NEXT: .LBB1_2:
-; RV32I-NEXT: xor a5, a4, a2
+; RV32I-NEXT: add a1, a5, a1
+; RV32I-NEXT: xor a2, a4, a1
; RV32I-NEXT: xor a3, a4, a3
; RV32I-NEXT: not a3, a3
-; RV32I-NEXT: and a3, a3, a5
-; RV32I-NEXT: bltz a3, .LBB1_4
-; RV32I-NEXT: # %bb.3:
+; RV32I-NEXT: and a2, a3, a2
+; RV32I-NEXT: bgez a2, .LBB1_2
+; RV32I-NEXT: # %bb.1:
+; RV32I-NEXT: slti a0, a1, 0
+; RV32I-NEXT: lui a2, 524288
+; RV32I-NEXT: sub a2, a2, a0
+; RV32I-NEXT: srai a0, a1, 31
; RV32I-NEXT: mv a1, a2
-; RV32I-NEXT: ret
-; RV32I-NEXT: .LBB1_4:
-; RV32I-NEXT: srai a0, a2, 31
+; RV32I-NEXT: .LBB1_2:
; RV32I-NEXT: ret
;
; RV64I-LABEL: func2:
; RV64I: # %bb.0:
-; RV64I-NEXT: add a3, a0, a1
-; RV64I-NEXT: addi a2, zero, -1
-; RV64I-NEXT: bltz a3, .LBB1_2
+; RV64I-NEXT: mv a2, a0
+; RV64I-NEXT: add a0, a0, a1
+; RV64I-NEXT: slt a2, a0, a2
+; RV64I-NEXT: slti a1, a1, 0
+; RV64I-NEXT: beq a1, a2, .LBB1_2
; RV64I-NEXT: # %bb.1:
-; RV64I-NEXT: slli a2, a2, 63
-; RV64I-NEXT: j .LBB1_3
+; RV64I-NEXT: slti a0, a0, 0
+; RV64I-NEXT: addi a1, zero, -1
+; RV64I-NEXT: slli a1, a1, 63
+; RV64I-NEXT: sub a0, a1, a0
; RV64I-NEXT: .LBB1_2:
-; RV64I-NEXT: srli a2, a2, 1
-; RV64I-NEXT: .LBB1_3:
-; RV64I-NEXT: slt a0, a3, a0
-; RV64I-NEXT: slti a1, a1, 0
-; RV64I-NEXT: bne a1, a0, .LBB1_5
-; RV64I-NEXT: # %bb.4:
-; RV64I-NEXT: mv a2, a3
-; RV64I-NEXT: .LBB1_5:
-; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: ret
;
; RV32IZbbNOZbt-LABEL: func2:
@@ -142,41 +128,33 @@ define i64 @func2(i64 %x, i64 %y) nounwind {
; RV32IZbbNOZbt-NEXT: add a5, a4, a3
; RV32IZbbNOZbt-NEXT: add a0, a0, a2
; RV32IZbbNOZbt-NEXT: sltu a1, a0, a1
-; RV32IZbbNOZbt-NEXT: add a2, a5, a1
-; RV32IZbbNOZbt-NEXT: lui a1, 524288
+; RV32IZbbNOZbt-NEXT: add a1, a5, a1
+; RV32IZbbNOZbt-NEXT: xor a2, a4, a1
+; RV32IZbbNOZbt-NEXT: xor a3, a4, a3
+; RV32IZbbNOZbt-NEXT: andn a2, a2, a3
; RV32IZbbNOZbt-NEXT: bgez a2, .LBB1_2
; RV32IZbbNOZbt-NEXT: # %bb.1:
-; RV32IZbbNOZbt-NEXT: addi a1, a1, -1
-; RV32IZbbNOZbt-NEXT: .LBB1_2:
-; RV32IZbbNOZbt-NEXT: xor a5, a4, a2
-; RV32IZbbNOZbt-NEXT: xor a3, a4, a3
-; RV32IZbbNOZbt-NEXT: andn a3, a5, a3
-; RV32IZbbNOZbt-NEXT: bltz a3, .LBB1_4
-; RV32IZbbNOZbt-NEXT: # %bb.3:
+; RV32IZbbNOZbt-NEXT: slti a0, a1, 0
+; RV32IZbbNOZbt-NEXT: lui a2, 524288
+; RV32IZbbNOZbt-NEXT: sub a2, a2, a0
+; RV32IZbbNOZbt-NEXT: srai a0, a1, 31
; RV32IZbbNOZbt-NEXT: mv a1, a2
-; RV32IZbbNOZbt-NEXT: ret
-; RV32IZbbNOZbt-NEXT: .LBB1_4:
-; RV32IZbbNOZbt-NEXT: srai a0, a2, 31
+; RV32IZbbNOZbt-NEXT: .LBB1_2:
; RV32IZbbNOZbt-NEXT: ret
;
; RV64IZbbNOZbt-LABEL: func2:
; RV64IZbbNOZbt: # %bb.0:
-; RV64IZbbNOZbt-NEXT: add a3, a0, a1
-; RV64IZbbNOZbt-NEXT: addi a2, zero, -1
-; RV64IZbbNOZbt-NEXT: bltz a3, .LBB1_2
+; RV64IZbbNOZbt-NEXT: mv a2, a0
+; RV64IZbbNOZbt-NEXT: add a0, a0, a1
+; RV64IZbbNOZbt-NEXT: slt a2, a0, a2
+; RV64IZbbNOZbt-NEXT: slti a1, a1, 0
+; RV64IZbbNOZbt-NEXT: beq a1, a2, .LBB1_2
; RV64IZbbNOZbt-NEXT: # %bb.1:
-; RV64IZbbNOZbt-NEXT: slli a2, a2, 63
-; RV64IZbbNOZbt-NEXT: j .LBB1_3
+; RV64IZbbNOZbt-NEXT: slti a0, a0, 0
+; RV64IZbbNOZbt-NEXT: addi a1, zero, -1
+; RV64IZbbNOZbt-NEXT: slli a1, a1, 63
+; RV64IZbbNOZbt-NEXT: sub a0, a1, a0
; RV64IZbbNOZbt-NEXT: .LBB1_2:
-; RV64IZbbNOZbt-NEXT: srli a2, a2, 1
-; RV64IZbbNOZbt-NEXT: .LBB1_3:
-; RV64IZbbNOZbt-NEXT: slt a0, a3, a0
-; RV64IZbbNOZbt-NEXT: slti a1, a1, 0
-; RV64IZbbNOZbt-NEXT: bne a1, a0, .LBB1_5
-; RV64IZbbNOZbt-NEXT: # %bb.4:
-; RV64IZbbNOZbt-NEXT: mv a2, a3
-; RV64IZbbNOZbt-NEXT: .LBB1_5:
-; RV64IZbbNOZbt-NEXT: mv a0, a2
; RV64IZbbNOZbt-NEXT: ret
;
; RV32IZbbZbt-LABEL: func2:
diff --git a/llvm/test/CodeGen/RISCV/sadd_sat_plus.ll b/llvm/test/CodeGen/RISCV/sadd_sat_plus.ll
index f51331147163..e0d7e0deb8a2 100644
--- a/llvm/test/CodeGen/RISCV/sadd_sat_plus.ll
+++ b/llvm/test/CodeGen/RISCV/sadd_sat_plus.ll
@@ -16,19 +16,16 @@ define i32 @func32(i32 %x, i32 %y, i32 %z) nounwind {
; RV32I-LABEL: func32:
; RV32I: # %bb.0:
; RV32I-NEXT: mv a3, a0
-; RV32I-NEXT: mul a2, a1, a2
-; RV32I-NEXT: add a1, a0, a2
-; RV32I-NEXT: lui a0, 524288
-; RV32I-NEXT: bgez a1, .LBB0_2
+; RV32I-NEXT: mul a1, a1, a2
+; RV32I-NEXT: add a0, a0, a1
+; RV32I-NEXT: slt a2, a0, a3
+; RV32I-NEXT: slti a1, a1, 0
+; RV32I-NEXT: beq a1, a2, .LBB0_2
; RV32I-NEXT: # %bb.1:
-; RV32I-NEXT: addi a0, a0, -1
+; RV32I-NEXT: slti a0, a0, 0
+; RV32I-NEXT: lui a1, 524288
+; RV32I-NEXT: sub a0, a1, a0
; RV32I-NEXT: .LBB0_2:
-; RV32I-NEXT: slt a3, a1, a3
-; RV32I-NEXT: slti a2, a2, 0
-; RV32I-NEXT: bne a2, a3, .LBB0_4
-; RV32I-NEXT: # %bb.3:
-; RV32I-NEXT: mv a0, a1
-; RV32I-NEXT: .LBB0_4:
; RV32I-NEXT: ret
;
; RV64I-LABEL: func32:
@@ -53,19 +50,16 @@ define i32 @func32(i32 %x, i32 %y, i32 %z) nounwind {
; RV32IZbbNOZbt-LABEL: func32:
; RV32IZbbNOZbt: # %bb.0:
; RV32IZbbNOZbt-NEXT: mv a3, a0
-; RV32IZbbNOZbt-NEXT: mul a2, a1, a2
-; RV32IZbbNOZbt-NEXT: add a1, a0, a2
-; RV32IZbbNOZbt-NEXT: lui a0, 524288
-; RV32IZbbNOZbt-NEXT: bgez a1, .LBB0_2
+; RV32IZbbNOZbt-NEXT: mul a1, a1, a2
+; RV32IZbbNOZbt-NEXT: add a0, a0, a1
+; RV32IZbbNOZbt-NEXT: slt a2, a0, a3
+; RV32IZbbNOZbt-NEXT: slti a1, a1, 0
+; RV32IZbbNOZbt-NEXT: beq a1, a2, .LBB0_2
; RV32IZbbNOZbt-NEXT: # %bb.1:
-; RV32IZbbNOZbt-NEXT: addi a0, a0, -1
+; RV32IZbbNOZbt-NEXT: slti a0, a0, 0
+; RV32IZbbNOZbt-NEXT: lui a1, 524288
+; RV32IZbbNOZbt-NEXT: sub a0, a1, a0
; RV32IZbbNOZbt-NEXT: .LBB0_2:
-; RV32IZbbNOZbt-NEXT: slt a3, a1, a3
-; RV32IZbbNOZbt-NEXT: slti a2, a2, 0
-; RV32IZbbNOZbt-NEXT: bne a2, a3, .LBB0_4
-; RV32IZbbNOZbt-NEXT: # %bb.3:
-; RV32IZbbNOZbt-NEXT: mv a0, a1
-; RV32IZbbNOZbt-NEXT: .LBB0_4:
; RV32IZbbNOZbt-NEXT: ret
;
; RV64IZbb-LABEL: func32:
@@ -105,42 +99,34 @@ define i64 @func64(i64 %x, i64 %y, i64 %z) nounwind {
; RV32I-NEXT: add a3, a2, a5
; RV32I-NEXT: add a0, a0, a4
; RV32I-NEXT: sltu a1, a0, a1
-; RV32I-NEXT: add a3, a3, a1
-; RV32I-NEXT: lui a1, 524288
-; RV32I-NEXT: bgez a3, .LBB1_2
-; RV32I-NEXT: # %bb.1:
-; RV32I-NEXT: addi a1, a1, -1
-; RV32I-NEXT: .LBB1_2:
-; RV32I-NEXT: xor a4, a2, a3
+; RV32I-NEXT: add a1, a3, a1
+; RV32I-NEXT: xor a3, a2, a1
; RV32I-NEXT: xor a2, a2, a5
; RV32I-NEXT: not a2, a2
-; RV32I-NEXT: and a2, a2, a4
-; RV32I-NEXT: bltz a2, .LBB1_4
-; RV32I-NEXT: # %bb.3:
-; RV32I-NEXT: mv a1, a3
-; RV32I-NEXT: ret
-; RV32I-NEXT: .LBB1_4:
-; RV32I-NEXT: srai a0, a3, 31
+; RV32I-NEXT: and a2, a2, a3
+; RV32I-NEXT: bgez a2, .LBB1_2
+; RV32I-NEXT: # %bb.1:
+; RV32I-NEXT: slti a0, a1, 0
+; RV32I-NEXT: lui a2, 524288
+; RV32I-NEXT: sub a2, a2, a0
+; RV32I-NEXT: srai a0, a1, 31
+; RV32I-NEXT: mv a1, a2
+; RV32I-NEXT: .LBB1_2:
; RV32I-NEXT: ret
;
; RV64I-LABEL: func64:
; RV64I: # %bb.0:
-; RV64I-NEXT: add a3, a0, a2
-; RV64I-NEXT: addi a1, zero, -1
-; RV64I-NEXT: bltz a3, .LBB1_2
+; RV64I-NEXT: mv a1, a0
+; RV64I-NEXT: add a0, a0, a2
+; RV64I-NEXT: slt a1, a0, a1
+; RV64I-NEXT: slti a2, a2, 0
+; RV64I-NEXT: beq a2, a1, .LBB1_2
; RV64I-NEXT: # %bb.1:
+; RV64I-NEXT: slti a0, a0, 0
+; RV64I-NEXT: addi a1, zero, -1
; RV64I-NEXT: slli a1, a1, 63
-; RV64I-NEXT: j .LBB1_3
+; RV64I-NEXT: sub a0, a1, a0
; RV64I-NEXT: .LBB1_2:
-; RV64I-NEXT: srli a1, a1, 1
-; RV64I-NEXT: .LBB1_3:
-; RV64I-NEXT: slt a0, a3, a0
-; RV64I-NEXT: slti a2, a2, 0
-; RV64I-NEXT: bne a2, a0, .LBB1_5
-; RV64I-NEXT: # %bb.4:
-; RV64I-NEXT: mv a1, a3
-; RV64I-NEXT: .LBB1_5:
-; RV64I-NEXT: mv a0, a1
; RV64I-NEXT: ret
;
; RV32IZbbNOZbt-LABEL: func64:
@@ -150,41 +136,33 @@ define i64 @func64(i64 %x, i64 %y, i64 %z) nounwind {
; RV32IZbbNOZbt-NEXT: add a3, a2, a5
; RV32IZbbNOZbt-NEXT: add a0, a0, a4
; RV32IZbbNOZbt-NEXT: sltu a1, a0, a1
-; RV32IZbbNOZbt-NEXT: add a3, a3, a1
-; RV32IZbbNOZbt-NEXT: lui a1, 524288
-; RV32IZbbNOZbt-NEXT: bgez a3, .LBB1_2
+; RV32IZbbNOZbt-NEXT: add a1, a3, a1
+; RV32IZbbNOZbt-NEXT: xor a3, a2, a1
+; RV32IZbbNOZbt-NEXT: xor a2, a2, a5
+; RV32IZbbNOZbt-NEXT: andn a2, a3, a2
+; RV32IZbbNOZbt-NEXT: bgez a2, .LBB1_2
; RV32IZbbNOZbt-NEXT: # %bb.1:
-; RV32IZbbNOZbt-NEXT: addi a1, a1, -1
+; RV32IZbbNOZbt-NEXT: slti a0, a1, 0
+; RV32IZbbNOZbt-NEXT: lui a2, 524288
+; RV32IZbbNOZbt-NEXT: sub a2, a2, a0
+; RV32IZbbNOZbt-NEXT: srai a0, a1, 31
+; RV32IZbbNOZbt-NEXT: mv a1, a2
; RV32IZbbNOZbt-NEXT: .LBB1_2:
-; RV32IZbbNOZbt-NEXT: xor a4, a2, a3
-; RV32IZbbNOZbt-NEXT: xor a2, a2, a5
-; RV32IZbbNOZbt-NEXT: andn a2, a4, a2
-; RV32IZbbNOZbt-NEXT: bltz a2, .LBB1_4
-; RV32IZbbNOZbt-NEXT: # %bb.3:
-; RV32IZbbNOZbt-NEXT: mv a1, a3
-; RV32IZbbNOZbt-NEXT: ret
-; RV32IZbbNOZbt-NEXT: .LBB1_4:
-; RV32IZbbNOZbt-NEXT: srai a0, a3, 31
; RV32IZbbNOZbt-NEXT: ret
;
; RV64IZbbNOZbt-LABEL: func64:
; RV64IZbbNOZbt: # %bb.0:
-; RV64IZbbNOZbt-NEXT: add a3, a0, a2
-; RV64IZbbNOZbt-NEXT: addi a1, zero, -1
-; RV64IZbbNOZbt-NEXT: bltz a3, .LBB1_2
+; RV64IZbbNOZbt-NEXT: mv a1, a0
+; RV64IZbbNOZbt-NEXT: add a0, a0, a2
+; RV64IZbbNOZbt-NEXT: slt a1, a0, a1
+; RV64IZbbNOZbt-NEXT: slti a2, a2, 0
+; RV64IZbbNOZbt-NEXT: beq a2, a1, .LBB1_2
; RV64IZbbNOZbt-NEXT: # %bb.1:
+; RV64IZbbNOZbt-NEXT: slti a0, a0, 0
+; RV64IZbbNOZbt-NEXT: addi a1, zero, -1
; RV64IZbbNOZbt-NEXT: slli a1, a1, 63
-; RV64IZbbNOZbt-NEXT: j .LBB1_3
+; RV64IZbbNOZbt-NEXT: sub a0, a1, a0
; RV64IZbbNOZbt-NEXT: .LBB1_2:
-; RV64IZbbNOZbt-NEXT: srli a1, a1, 1
-; RV64IZbbNOZbt-NEXT: .LBB1_3:
-; RV64IZbbNOZbt-NEXT: slt a0, a3, a0
-; RV64IZbbNOZbt-NEXT: slti a2, a2, 0
-; RV64IZbbNOZbt-NEXT: bne a2, a0, .LBB1_5
-; RV64IZbbNOZbt-NEXT: # %bb.4:
-; RV64IZbbNOZbt-NEXT: mv a1, a3
-; RV64IZbbNOZbt-NEXT: .LBB1_5:
-; RV64IZbbNOZbt-NEXT: mv a0, a1
; RV64IZbbNOZbt-NEXT: ret
;
; RV32IZbbZbt-LABEL: func64:
diff --git a/llvm/test/CodeGen/RISCV/ssub_sat.ll b/llvm/test/CodeGen/RISCV/ssub_sat.ll
index 5c264d7eb232..d845f87fd592 100644
--- a/llvm/test/CodeGen/RISCV/ssub_sat.ll
+++ b/llvm/test/CodeGen/RISCV/ssub_sat.ll
@@ -16,18 +16,15 @@ define signext i32 @func(i32 signext %x, i32 signext %y) nounwind {
; RV32I-LABEL: func:
; RV32I: # %bb.0:
; RV32I-NEXT: mv a2, a0
-; RV32I-NEXT: sub a3, a0, a1
-; RV32I-NEXT: lui a0, 524288
-; RV32I-NEXT: bgez a3, .LBB0_2
+; RV32I-NEXT: sgtz a3, a1
+; RV32I-NEXT: sub a0, a0, a1
+; RV32I-NEXT: slt a1, a0, a2
+; RV32I-NEXT: beq a3, a1, .LBB0_2
; RV32I-NEXT: # %bb.1:
-; RV32I-NEXT: addi a0, a0, -1
+; RV32I-NEXT: slti a0, a0, 0
+; RV32I-NEXT: lui a1, 524288
+; RV32I-NEXT: sub a0, a1, a0
; RV32I-NEXT: .LBB0_2:
-; RV32I-NEXT: sgtz a1, a1
-; RV32I-NEXT: slt a2, a3, a2
-; RV32I-NEXT: bne a1, a2, .LBB0_4
-; RV32I-NEXT: # %bb.3:
-; RV32I-NEXT: mv a0, a3
-; RV32I-NEXT: .LBB0_4:
; RV32I-NEXT: ret
;
; RV64I-LABEL: func:
@@ -50,18 +47,15 @@ define signext i32 @func(i32 signext %x, i32 signext %y) nounwind {
; RV32IZbbNOZbt-LABEL: func:
; RV32IZbbNOZbt: # %bb.0:
; RV32IZbbNOZbt-NEXT: mv a2, a0
-; RV32IZbbNOZbt-NEXT: sub a3, a0, a1
-; RV32IZbbNOZbt-NEXT: lui a0, 524288
-; RV32IZbbNOZbt-NEXT: bgez a3, .LBB0_2
+; RV32IZbbNOZbt-NEXT: sgtz a3, a1
+; RV32IZbbNOZbt-NEXT: sub a0, a0, a1
+; RV32IZbbNOZbt-NEXT: slt a1, a0, a2
+; RV32IZbbNOZbt-NEXT: beq a3, a1, .LBB0_2
; RV32IZbbNOZbt-NEXT: # %bb.1:
-; RV32IZbbNOZbt-NEXT: addi a0, a0, -1
+; RV32IZbbNOZbt-NEXT: slti a0, a0, 0
+; RV32IZbbNOZbt-NEXT: lui a1, 524288
+; RV32IZbbNOZbt-NEXT: sub a0, a1, a0
; RV32IZbbNOZbt-NEXT: .LBB0_2:
-; RV32IZbbNOZbt-NEXT: sgtz a1, a1
-; RV32IZbbNOZbt-NEXT: slt a2, a3, a2
-; RV32IZbbNOZbt-NEXT: bne a1, a2, .LBB0_4
-; RV32IZbbNOZbt-NEXT: # %bb.3:
-; RV32IZbbNOZbt-NEXT: mv a0, a3
-; RV32IZbbNOZbt-NEXT: .LBB0_4:
; RV32IZbbNOZbt-NEXT: ret
;
; RV64IZbb-LABEL: func:
@@ -95,42 +89,35 @@ define i64 @func2(i64 %x, i64 %y) nounwind {
; RV32I-NEXT: mv a4, a1
; RV32I-NEXT: sltu a1, a0, a2
; RV32I-NEXT: sub a5, a4, a3
-; RV32I-NEXT: sub a5, a5, a1
-; RV32I-NEXT: lui a1, 524288
-; RV32I-NEXT: bgez a5, .LBB1_2
-; RV32I-NEXT: # %bb.1:
-; RV32I-NEXT: addi a1, a1, -1
-; RV32I-NEXT: .LBB1_2:
-; RV32I-NEXT: xor a6, a4, a5
+; RV32I-NEXT: sub a1, a5, a1
+; RV32I-NEXT: xor a5, a4, a1
; RV32I-NEXT: xor a3, a4, a3
-; RV32I-NEXT: and a3, a3, a6
-; RV32I-NEXT: bltz a3, .LBB1_4
-; RV32I-NEXT: # %bb.3:
+; RV32I-NEXT: and a3, a3, a5
+; RV32I-NEXT: bltz a3, .LBB1_2
+; RV32I-NEXT: # %bb.1:
; RV32I-NEXT: sub a0, a0, a2
-; RV32I-NEXT: mv a1, a5
; RV32I-NEXT: ret
-; RV32I-NEXT: .LBB1_4:
-; RV32I-NEXT: srai a0, a5, 31
+; RV32I-NEXT: .LBB1_2:
+; RV32I-NEXT: slti a0, a1, 0
+; RV32I-NEXT: lui a2, 524288
+; RV32I-NEXT: sub a2, a2, a0
+; RV32I-NEXT: srai a0, a1, 31
+; RV32I-NEXT: mv a1, a2
; RV32I-NEXT: ret
;
; RV64I-LABEL: func2:
; RV64I: # %bb.0:
-; RV64I-NEXT: sub a3, a0, a1
-; RV64I-NEXT: addi a2, zero, -1
-; RV64I-NEXT: bltz a3, .LBB1_2
+; RV64I-NEXT: mv a2, a0
+; RV64I-NEXT: sgtz a3, a1
+; RV64I-NEXT: sub a0, a0, a1
+; RV64I-NEXT: slt a1, a0, a2
+; RV64I-NEXT: beq a3, a1, .LBB1_2
; RV64I-NEXT: # %bb.1:
-; RV64I-NEXT: slli a2, a2, 63
-; RV64I-NEXT: j .LBB1_3
+; RV64I-NEXT: slti a0, a0, 0
+; RV64I-NEXT: addi a1, zero, -1
+; RV64I-NEXT: slli a1, a1, 63
+; RV64I-NEXT: sub a0, a1, a0
; RV64I-NEXT: .LBB1_2:
-; RV64I-NEXT: srli a2, a2, 1
-; RV64I-NEXT: .LBB1_3:
-; RV64I-NEXT: sgtz a1, a1
-; RV64I-NEXT: slt a0, a3, a0
-; RV64I-NEXT: bne a1, a0, .LBB1_5
-; RV64I-NEXT: # %bb.4:
-; RV64I-NEXT: mv a2, a3
-; RV64I-NEXT: .LBB1_5:
-; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: ret
;
; RV32IZbbNOZbt-LABEL: func2:
@@ -138,42 +125,35 @@ define i64 @func2(i64 %x, i64 %y) nounwind {
; RV32IZbbNOZbt-NEXT: mv a4, a1
; RV32IZbbNOZbt-NEXT: sltu a1, a0, a2
; RV32IZbbNOZbt-NEXT: sub a5, a4, a3
-; RV32IZbbNOZbt-NEXT: sub a5, a5, a1
-; RV32IZbbNOZbt-NEXT: lui a1, 524288
-; RV32IZbbNOZbt-NEXT: bgez a5, .LBB1_2
-; RV32IZbbNOZbt-NEXT: # %bb.1:
-; RV32IZbbNOZbt-NEXT: addi a1, a1, -1
-; RV32IZbbNOZbt-NEXT: .LBB1_2:
-; RV32IZbbNOZbt-NEXT: xor a6, a4, a5
+; RV32IZbbNOZbt-NEXT: sub a1, a5, a1
+; RV32IZbbNOZbt-NEXT: xor a5, a4, a1
; RV32IZbbNOZbt-NEXT: xor a3, a4, a3
-; RV32IZbbNOZbt-NEXT: and a3, a3, a6
-; RV32IZbbNOZbt-NEXT: bltz a3, .LBB1_4
-; RV32IZbbNOZbt-NEXT: # %bb.3:
+; RV32IZbbNOZbt-NEXT: and a3, a3, a5
+; RV32IZbbNOZbt-NEXT: bltz a3, .LBB1_2
+; RV32IZbbNOZbt-NEXT: # %bb.1:
; RV32IZbbNOZbt-NEXT: sub a0, a0, a2
-; RV32IZbbNOZbt-NEXT: mv a1, a5
; RV32IZbbNOZbt-NEXT: ret
-; RV32IZbbNOZbt-NEXT: .LBB1_4:
-; RV32IZbbNOZbt-NEXT: srai a0, a5, 31
+; RV32IZbbNOZbt-NEXT: .LBB1_2:
+; RV32IZbbNOZbt-NEXT: slti a0, a1, 0
+; RV32IZbbNOZbt-NEXT: lui a2, 524288
+; RV32IZbbNOZbt-NEXT: sub a2, a2, a0
+; RV32IZbbNOZbt-NEXT: srai a0, a1, 31
+; RV32IZbbNOZbt-NEXT: mv a1, a2
; RV32IZbbNOZbt-NEXT: ret
;
; RV64IZbbNOZbt-LABEL: func2:
; RV64IZbbNOZbt: # %bb.0:
-; RV64IZbbNOZbt-NEXT: sub a3, a0, a1
-; RV64IZbbNOZbt-NEXT: addi a2, zero, -1
-; RV64IZbbNOZbt-NEXT: bltz a3, .LBB1_2
+; RV64IZbbNOZbt-NEXT: mv a2, a0
+; RV64IZbbNOZbt-NEXT: sgtz a3, a1
+; RV64IZbbNOZbt-NEXT: sub a0, a0, a1
+; RV64IZbbNOZbt-NEXT: slt a1, a0, a2
+; RV64IZbbNOZbt-NEXT: beq a3, a1, .LBB1_2
; RV64IZbbNOZbt-NEXT: # %bb.1:
-; RV64IZbbNOZbt-NEXT: slli a2, a2, 63
-; RV64IZbbNOZbt-NEXT: j .LBB1_3
+; RV64IZbbNOZbt-NEXT: slti a0, a0, 0
+; RV64IZbbNOZbt-NEXT: addi a1, zero, -1
+; RV64IZbbNOZbt-NEXT: slli a1, a1, 63
+; RV64IZbbNOZbt-NEXT: sub a0, a1, a0
; RV64IZbbNOZbt-NEXT: .LBB1_2:
-; RV64IZbbNOZbt-NEXT: srli a2, a2, 1
-; RV64IZbbNOZbt-NEXT: .LBB1_3:
-; RV64IZbbNOZbt-NEXT: sgtz a1, a1
-; RV64IZbbNOZbt-NEXT: slt a0, a3, a0
-; RV64IZbbNOZbt-NEXT: bne a1, a0, .LBB1_5
-; RV64IZbbNOZbt-NEXT: # %bb.4:
-; RV64IZbbNOZbt-NEXT: mv a2, a3
-; RV64IZbbNOZbt-NEXT: .LBB1_5:
-; RV64IZbbNOZbt-NEXT: mv a0, a2
; RV64IZbbNOZbt-NEXT: ret
;
; RV32IZbbZbt-LABEL: func2:
diff --git a/llvm/test/CodeGen/RISCV/ssub_sat_plus.ll b/llvm/test/CodeGen/RISCV/ssub_sat_plus.ll
index c3e7d7e61bee..923cf75996a6 100644
--- a/llvm/test/CodeGen/RISCV/ssub_sat_plus.ll
+++ b/llvm/test/CodeGen/RISCV/ssub_sat_plus.ll
@@ -16,19 +16,16 @@ define i32 @func32(i32 %x, i32 %y, i32 %z) nounwind {
; RV32I-LABEL: func32:
; RV32I: # %bb.0:
; RV32I-NEXT: mv a3, a0
-; RV32I-NEXT: mul a2, a1, a2
-; RV32I-NEXT: sub a1, a0, a2
-; RV32I-NEXT: lui a0, 524288
-; RV32I-NEXT: bgez a1, .LBB0_2
+; RV32I-NEXT: mul a0, a1, a2
+; RV32I-NEXT: sgtz a1, a0
+; RV32I-NEXT: sub a0, a3, a0
+; RV32I-NEXT: slt a2, a0, a3
+; RV32I-NEXT: beq a1, a2, .LBB0_2
; RV32I-NEXT: # %bb.1:
-; RV32I-NEXT: addi a0, a0, -1
+; RV32I-NEXT: slti a0, a0, 0
+; RV32I-NEXT: lui a1, 524288
+; RV32I-NEXT: sub a0, a1, a0
; RV32I-NEXT: .LBB0_2:
-; RV32I-NEXT: sgtz a2, a2
-; RV32I-NEXT: slt a3, a1, a3
-; RV32I-NEXT: bne a2, a3, .LBB0_4
-; RV32I-NEXT: # %bb.3:
-; RV32I-NEXT: mv a0, a1
-; RV32I-NEXT: .LBB0_4:
; RV32I-NEXT: ret
;
; RV64I-LABEL: func32:
@@ -53,19 +50,16 @@ define i32 @func32(i32 %x, i32 %y, i32 %z) nounwind {
; RV32IZbbNOZbt-LABEL: func32:
; RV32IZbbNOZbt: # %bb.0:
; RV32IZbbNOZbt-NEXT: mv a3, a0
-; RV32IZbbNOZbt-NEXT: mul a2, a1, a2
-; RV32IZbbNOZbt-NEXT: sub a1, a0, a2
-; RV32IZbbNOZbt-NEXT: lui a0, 524288
-; RV32IZbbNOZbt-NEXT: bgez a1, .LBB0_2
+; RV32IZbbNOZbt-NEXT: mul a0, a1, a2
+; RV32IZbbNOZbt-NEXT: sgtz a1, a0
+; RV32IZbbNOZbt-NEXT: sub a0, a3, a0
+; RV32IZbbNOZbt-NEXT: slt a2, a0, a3
+; RV32IZbbNOZbt-NEXT: beq a1, a2, .LBB0_2
; RV32IZbbNOZbt-NEXT: # %bb.1:
-; RV32IZbbNOZbt-NEXT: addi a0, a0, -1
+; RV32IZbbNOZbt-NEXT: slti a0, a0, 0
+; RV32IZbbNOZbt-NEXT: lui a1, 524288
+; RV32IZbbNOZbt-NEXT: sub a0, a1, a0
; RV32IZbbNOZbt-NEXT: .LBB0_2:
-; RV32IZbbNOZbt-NEXT: sgtz a2, a2
-; RV32IZbbNOZbt-NEXT: slt a3, a1, a3
-; RV32IZbbNOZbt-NEXT: bne a2, a3, .LBB0_4
-; RV32IZbbNOZbt-NEXT: # %bb.3:
-; RV32IZbbNOZbt-NEXT: mv a0, a1
-; RV32IZbbNOZbt-NEXT: .LBB0_4:
; RV32IZbbNOZbt-NEXT: ret
;
; RV64IZbb-LABEL: func32:
@@ -103,42 +97,35 @@ define i64 @func64(i64 %x, i64 %y, i64 %z) nounwind {
; RV32I-NEXT: mv a2, a1
; RV32I-NEXT: sltu a1, a0, a4
; RV32I-NEXT: sub a3, a2, a5
-; RV32I-NEXT: sub a3, a3, a1
-; RV32I-NEXT: lui a1, 524288
-; RV32I-NEXT: bgez a3, .LBB1_2
-; RV32I-NEXT: # %bb.1:
-; RV32I-NEXT: addi a1, a1, -1
-; RV32I-NEXT: .LBB1_2:
-; RV32I-NEXT: xor a6, a2, a3
+; RV32I-NEXT: sub a1, a3, a1
+; RV32I-NEXT: xor a3, a2, a1
; RV32I-NEXT: xor a2, a2, a5
-; RV32I-NEXT: and a2, a2, a6
-; RV32I-NEXT: bltz a2, .LBB1_4
-; RV32I-NEXT: # %bb.3:
+; RV32I-NEXT: and a2, a2, a3
+; RV32I-NEXT: bltz a2, .LBB1_2
+; RV32I-NEXT: # %bb.1:
; RV32I-NEXT: sub a0, a0, a4
-; RV32I-NEXT: mv a1, a3
; RV32I-NEXT: ret
-; RV32I-NEXT: .LBB1_4:
-; RV32I-NEXT: srai a0, a3, 31
+; RV32I-NEXT: .LBB1_2:
+; RV32I-NEXT: slti a0, a1, 0
+; RV32I-NEXT: lui a2, 524288
+; RV32I-NEXT: sub a2, a2, a0
+; RV32I-NEXT: srai a0, a1, 31
+; RV32I-NEXT: mv a1, a2
; RV32I-NEXT: ret
;
; RV64I-LABEL: func64:
; RV64I: # %bb.0:
-; RV64I-NEXT: sub a3, a0, a2
-; RV64I-NEXT: addi a1, zero, -1
-; RV64I-NEXT: bltz a3, .LBB1_2
+; RV64I-NEXT: mv a1, a0
+; RV64I-NEXT: sgtz a3, a2
+; RV64I-NEXT: sub a0, a0, a2
+; RV64I-NEXT: slt a1, a0, a1
+; RV64I-NEXT: beq a3, a1, .LBB1_2
; RV64I-NEXT: # %bb.1:
+; RV64I-NEXT: slti a0, a0, 0
+; RV64I-NEXT: addi a1, zero, -1
; RV64I-NEXT: slli a1, a1, 63
-; RV64I-NEXT: j .LBB1_3
+; RV64I-NEXT: sub a0, a1, a0
; RV64I-NEXT: .LBB1_2:
-; RV64I-NEXT: srli a1, a1, 1
-; RV64I-NEXT: .LBB1_3:
-; RV64I-NEXT: sgtz a2, a2
-; RV64I-NEXT: slt a0, a3, a0
-; RV64I-NEXT: bne a2, a0, .LBB1_5
-; RV64I-NEXT: # %bb.4:
-; RV64I-NEXT: mv a1, a3
-; RV64I-NEXT: .LBB1_5:
-; RV64I-NEXT: mv a0, a1
; RV64I-NEXT: ret
;
; RV32IZbbNOZbt-LABEL: func64:
@@ -146,42 +133,35 @@ define i64 @func64(i64 %x, i64 %y, i64 %z) nounwind {
; RV32IZbbNOZbt-NEXT: mv a2, a1
; RV32IZbbNOZbt-NEXT: sltu a1, a0, a4
; RV32IZbbNOZbt-NEXT: sub a3, a2, a5
-; RV32IZbbNOZbt-NEXT: sub a3, a3, a1
-; RV32IZbbNOZbt-NEXT: lui a1, 524288
-; RV32IZbbNOZbt-NEXT: bgez a3, .LBB1_2
-; RV32IZbbNOZbt-NEXT: # %bb.1:
-; RV32IZbbNOZbt-NEXT: addi a1, a1, -1
-; RV32IZbbNOZbt-NEXT: .LBB1_2:
-; RV32IZbbNOZbt-NEXT: xor a6, a2, a3
+; RV32IZbbNOZbt-NEXT: sub a1, a3, a1
+; RV32IZbbNOZbt-NEXT: xor a3, a2, a1
; RV32IZbbNOZbt-NEXT: xor a2, a2, a5
-; RV32IZbbNOZbt-NEXT: and a2, a2, a6
-; RV32IZbbNOZbt-NEXT: bltz a2, .LBB1_4
-; RV32IZbbNOZbt-NEXT: # %bb.3:
+; RV32IZbbNOZbt-NEXT: and a2, a2, a3
+; RV32IZbbNOZbt-NEXT: bltz a2, .LBB1_2
+; RV32IZbbNOZbt-NEXT: # %bb.1:
; RV32IZbbNOZbt-NEXT: sub a0, a0, a4
-; RV32IZbbNOZbt-NEXT: mv a1, a3
; RV32IZbbNOZbt-NEXT: ret
-; RV32IZbbNOZbt-NEXT: .LBB1_4:
-; RV32IZbbNOZbt-NEXT: srai a0, a3, 31
+; RV32IZbbNOZbt-NEXT: .LBB1_2:
+; RV32IZbbNOZbt-NEXT: slti a0, a1, 0
+; RV32IZbbNOZbt-NEXT: lui a2, 524288
+; RV32IZbbNOZbt-NEXT: sub a2, a2, a0
+; RV32IZbbNOZbt-NEXT: srai a0, a1, 31
+; RV32IZbbNOZbt-NEXT: mv a1, a2
; RV32IZbbNOZbt-NEXT: ret
;
; RV64IZbbNOZbt-LABEL: func64:
; RV64IZbbNOZbt: # %bb.0:
-; RV64IZbbNOZbt-NEXT: sub a3, a0, a2
-; RV64IZbbNOZbt-NEXT: addi a1, zero, -1
-; RV64IZbbNOZbt-NEXT: bltz a3, .LBB1_2
+; RV64IZbbNOZbt-NEXT: mv a1, a0
+; RV64IZbbNOZbt-NEXT: sgtz a3, a2
+; RV64IZbbNOZbt-NEXT: sub a0, a0, a2
+; RV64IZbbNOZbt-NEXT: slt a1, a0, a1
+; RV64IZbbNOZbt-NEXT: beq a3, a1, .LBB1_2
; RV64IZbbNOZbt-NEXT: # %bb.1:
+; RV64IZbbNOZbt-NEXT: slti a0, a0, 0
+; RV64IZbbNOZbt-NEXT: addi a1, zero, -1
; RV64IZbbNOZbt-NEXT: slli a1, a1, 63
-; RV64IZbbNOZbt-NEXT: j .LBB1_3
+; RV64IZbbNOZbt-NEXT: sub a0, a1, a0
; RV64IZbbNOZbt-NEXT: .LBB1_2:
-; RV64IZbbNOZbt-NEXT: srli a1, a1, 1
-; RV64IZbbNOZbt-NEXT: .LBB1_3:
-; RV64IZbbNOZbt-NEXT: sgtz a2, a2
-; RV64IZbbNOZbt-NEXT: slt a0, a3, a0
-; RV64IZbbNOZbt-NEXT: bne a2, a0, .LBB1_5
-; RV64IZbbNOZbt-NEXT: # %bb.4:
-; RV64IZbbNOZbt-NEXT: mv a1, a3
-; RV64IZbbNOZbt-NEXT: .LBB1_5:
-; RV64IZbbNOZbt-NEXT: mv a0, a1
; RV64IZbbNOZbt-NEXT: ret
;
; RV32IZbbZbt-LABEL: func64:
More information about the llvm-commits
mailing list