[llvm] 12fee61 - [RISCV] Fold special case (xor (setcc constant, y, setlt), 1) -> (setcc y, constant + 1, setlt)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 16 19:10:28 PDT 2023
Author: LiaoChunyu
Date: 2023-06-17T10:10:20+08:00
New Revision: 12fee611ca533231f12c0b6518bfc525c893f238
URL: https://github.com/llvm/llvm-project/commit/12fee611ca533231f12c0b6518bfc525c893f238
DIFF: https://github.com/llvm/llvm-project/commit/12fee611ca533231f12c0b6518bfc525c893f238.diff
LOG: [RISCV] Fold special case (xor (setcc constant, y, setlt), 1) -> (setcc y, constant + 1, setlt)
Improve D151719.
(xor (setcc constant, y, setlt), 1) -> (setcc y, constant + 1, setlt)
https://alive2.llvm.org/ce/z/BZNEia
Reviewed By: craig.topper
Differential Revision: https://reviews.llvm.org/D152128
Added:
Modified:
llvm/lib/Target/RISCV/RISCVISelLowering.cpp
llvm/test/CodeGen/RISCV/double-select-icmp.ll
llvm/test/CodeGen/RISCV/float-select-icmp.ll
llvm/test/CodeGen/RISCV/half-select-icmp.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
index d7b841ccb2dfd..46e94e2c34b27 100644
--- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
+++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
@@ -10474,6 +10474,20 @@ static SDValue performXORCombine(SDNode *N, SelectionDAG &DAG,
DAG.getConstant(~1, DL, MVT::i64), N0.getOperand(1));
}
+ // Fold (xor (setcc constant, y, setlt), 1) -> (setcc y, constant + 1, setlt)
+ if (N0.hasOneUse() && N0.getOpcode() == ISD::SETCC && isOneConstant(N1)) {
+ auto *ConstN00 = dyn_cast<ConstantSDNode>(N0.getOperand(0));
+ ISD::CondCode CC = cast<CondCodeSDNode>(N0.getOperand(2))->get();
+ if (ConstN00 && CC == ISD::SETLT) {
+ EVT VT = N0.getValueType();
+ SDLoc DL(N0);
+ const APInt &Imm = ConstN00->getAPIntValue();
+ if ((Imm + 1).isSignedIntN(12))
+ return DAG.getSetCC(DL, VT, N0.getOperand(1),
+ DAG.getConstant(Imm + 1, DL, VT), CC);
+ }
+ }
+
if (SDValue V = combineBinOpToReduce(N, DAG, Subtarget))
return V;
// fold (xor (select cond, 0, y), x) ->
diff --git a/llvm/test/CodeGen/RISCV/double-select-icmp.ll b/llvm/test/CodeGen/RISCV/double-select-icmp.ll
index 9fdab5f7b8a59..cd28b589ff76c 100644
--- a/llvm/test/CodeGen/RISCV/double-select-icmp.ll
+++ b/llvm/test/CodeGen/RISCV/double-select-icmp.ll
@@ -482,8 +482,7 @@ define double @select_icmp_slt_one(i32 signext %a) {
define double @select_icmp_sgt_zero(i32 signext %a) {
; CHECK-LABEL: select_icmp_sgt_zero:
; CHECK: # %bb.0:
-; CHECK-NEXT: sgtz a0, a0
-; CHECK-NEXT: xori a0, a0, 1
+; CHECK-NEXT: slti a0, a0, 1
; CHECK-NEXT: fcvt.d.w fa0, a0
; CHECK-NEXT: ret
;
@@ -491,8 +490,7 @@ define double @select_icmp_sgt_zero(i32 signext %a) {
; RV32ZDINX: # %bb.0:
; RV32ZDINX-NEXT: addi sp, sp, -16
; RV32ZDINX-NEXT: .cfi_def_cfa_offset 16
-; RV32ZDINX-NEXT: sgtz a0, a0
-; RV32ZDINX-NEXT: xori a0, a0, 1
+; RV32ZDINX-NEXT: slti a0, a0, 1
; RV32ZDINX-NEXT: fcvt.d.w a0, a0
; RV32ZDINX-NEXT: sw a0, 8(sp)
; RV32ZDINX-NEXT: sw a1, 12(sp)
@@ -503,8 +501,7 @@ define double @select_icmp_sgt_zero(i32 signext %a) {
;
; RV64ZDINX-LABEL: select_icmp_sgt_zero:
; RV64ZDINX: # %bb.0:
-; RV64ZDINX-NEXT: sgtz a0, a0
-; RV64ZDINX-NEXT: xori a0, a0, 1
+; RV64ZDINX-NEXT: slti a0, a0, 1
; RV64ZDINX-NEXT: fcvt.d.w a0, a0
; RV64ZDINX-NEXT: ret
%1 = icmp sgt i32 %a, 0
diff --git a/llvm/test/CodeGen/RISCV/float-select-icmp.ll b/llvm/test/CodeGen/RISCV/float-select-icmp.ll
index 1d2aeaaf917d4..e8f420f1b0725 100644
--- a/llvm/test/CodeGen/RISCV/float-select-icmp.ll
+++ b/llvm/test/CodeGen/RISCV/float-select-icmp.ll
@@ -248,15 +248,13 @@ define float @select_icmp_slt_one(i32 signext %a) {
define float @select_icmp_sgt_zero(i32 signext %a) {
; CHECK-LABEL: select_icmp_sgt_zero:
; CHECK: # %bb.0:
-; CHECK-NEXT: sgtz a0, a0
-; CHECK-NEXT: xori a0, a0, 1
+; CHECK-NEXT: slti a0, a0, 1
; CHECK-NEXT: fcvt.s.w fa0, a0
; CHECK-NEXT: ret
;
; CHECKZFINX-LABEL: select_icmp_sgt_zero:
; CHECKZFINX: # %bb.0:
-; CHECKZFINX-NEXT: sgtz a0, a0
-; CHECKZFINX-NEXT: xori a0, a0, 1
+; CHECKZFINX-NEXT: slti a0, a0, 1
; CHECKZFINX-NEXT: fcvt.s.w a0, a0
; CHECKZFINX-NEXT: ret
%1 = icmp sgt i32 %a, 0
diff --git a/llvm/test/CodeGen/RISCV/half-select-icmp.ll b/llvm/test/CodeGen/RISCV/half-select-icmp.ll
index 465579abe4a80..a2da15e1fe165 100644
--- a/llvm/test/CodeGen/RISCV/half-select-icmp.ll
+++ b/llvm/test/CodeGen/RISCV/half-select-icmp.ll
@@ -510,30 +510,26 @@ define half @select_icmp_slt_one(i32 signext %a) {
define half @select_icmp_sgt_zero(i32 signext %a) {
; CHECK-LABEL: select_icmp_sgt_zero:
; CHECK: # %bb.0:
-; CHECK-NEXT: sgtz a0, a0
-; CHECK-NEXT: xori a0, a0, 1
+; CHECK-NEXT: slti a0, a0, 1
; CHECK-NEXT: fcvt.h.w fa0, a0
; CHECK-NEXT: ret
;
; CHECKIZHINX-LABEL: select_icmp_sgt_zero:
; CHECKIZHINX: # %bb.0:
-; CHECKIZHINX-NEXT: sgtz a0, a0
-; CHECKIZHINX-NEXT: xori a0, a0, 1
+; CHECKIZHINX-NEXT: slti a0, a0, 1
; CHECKIZHINX-NEXT: fcvt.h.w a0, a0
; CHECKIZHINX-NEXT: ret
;
; CHECKIZFHMIN-LABEL: select_icmp_sgt_zero:
; CHECKIZFHMIN: # %bb.0:
-; CHECKIZFHMIN-NEXT: sgtz a0, a0
-; CHECKIZFHMIN-NEXT: xori a0, a0, 1
+; CHECKIZFHMIN-NEXT: slti a0, a0, 1
; CHECKIZFHMIN-NEXT: fcvt.s.w fa5, a0
; CHECKIZFHMIN-NEXT: fcvt.h.s fa0, fa5
; CHECKIZFHMIN-NEXT: ret
;
; CHECKIZHINXMIN-LABEL: select_icmp_sgt_zero:
; CHECKIZHINXMIN: # %bb.0:
-; CHECKIZHINXMIN-NEXT: sgtz a0, a0
-; CHECKIZHINXMIN-NEXT: xori a0, a0, 1
+; CHECKIZHINXMIN-NEXT: slti a0, a0, 1
; CHECKIZHINXMIN-NEXT: fcvt.s.w a0, a0
; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a0
; CHECKIZHINXMIN-NEXT: ret
More information about the llvm-commits
mailing list