[llvm] [SelectionDAG] Move VSelect sign pattern check from AArch64 general SelectionDAG (PR #151840)
via llvm-commits
llvm-commits at lists.llvm.org
Sat Aug 2 17:29:20 PDT 2025
https://github.com/AZero13 updated https://github.com/llvm/llvm-project/pull/151840
>From ac5a8d6ace22dd9903d1371b8bac0293e037f434 Mon Sep 17 00:00:00 2001
From: Rose <gfunni234 at gmail.com>
Date: Sat, 2 Aug 2025 20:18:09 -0400
Subject: [PATCH 1/2] [SelectionDAG] Move VSelect sign pattern check from
AArch64 general SelectionDAG
For some reason the check is already there, but it bails out. Probably to allow aarch64 to transform it, but why not have the logic in selectiondag then?
---
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 8 ++++-
.../Target/AArch64/AArch64ISelLowering.cpp | 32 -------------------
2 files changed, 7 insertions(+), 33 deletions(-)
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index 11e869aebe7da..5a5dc8649eb8c 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -13143,7 +13143,13 @@ static SDValue combineVSelectWithAllOnesOrZeros(SDValue Cond, SDValue TVal,
TValAPInt.isOne() &&
ISD::isConstantSplatVectorAllOnes(Cond.getOperand(1).getNode()) &&
ISD::isConstantSplatVectorAllOnes(FVal.getNode())) {
- return SDValue();
+ SDValue LHS = Cond.getOperand(0);
+ unsigned BitWidth = LHS.getScalarValueSizeInBits();
+ SDValue ShiftC = DAG.getConstant(BitWidth - 1, DL, VT.getScalarType());
+ SDValue ShiftAmount = DAG.getSplatBuildVector(VT, DL, ShiftC);
+
+ auto Shift = DAG.getNode(ISD::SRA, DL, VT, LHS, ShiftAmount);
+ return DAG.getNode(ISD::OR, DL, VT, Shift, TVal);
}
// To use the condition operand as a bitwise mask, it must have elements that
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index 2b6ea86ee1af5..ec74995c046c0 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -25887,38 +25887,6 @@ static SDValue performVSelectCombine(SDNode *N, SelectionDAG &DAG) {
}
}
- // Check for sign pattern (VSELECT setgt, iN lhs, -1, 1, -1) and transform
- // into (OR (ASR lhs, N-1), 1), which requires less instructions for the
- // supported types.
- SDValue SetCC = N->getOperand(0);
- if (SetCC.getOpcode() == ISD::SETCC &&
- SetCC.getOperand(2) == DAG.getCondCode(ISD::SETGT)) {
- SDValue CmpLHS = SetCC.getOperand(0);
- EVT VT = CmpLHS.getValueType();
- SDNode *CmpRHS = SetCC.getOperand(1).getNode();
- SDNode *SplatLHS = N->getOperand(1).getNode();
- SDNode *SplatRHS = N->getOperand(2).getNode();
- APInt SplatLHSVal;
- if (CmpLHS.getValueType() == N->getOperand(1).getValueType() &&
- VT.isSimple() &&
- is_contained(ArrayRef({MVT::v8i8, MVT::v16i8, MVT::v4i16, MVT::v8i16,
- MVT::v2i32, MVT::v4i32, MVT::v2i64}),
- VT.getSimpleVT().SimpleTy) &&
- ISD::isConstantSplatVector(SplatLHS, SplatLHSVal) &&
- SplatLHSVal.isOne() && ISD::isConstantSplatVectorAllOnes(CmpRHS) &&
- ISD::isConstantSplatVectorAllOnes(SplatRHS)) {
- unsigned NumElts = VT.getVectorNumElements();
- SmallVector<SDValue, 8> Ops(
- NumElts, DAG.getConstant(VT.getScalarSizeInBits() - 1, SDLoc(N),
- VT.getScalarType()));
- SDValue Val = DAG.getBuildVector(VT, SDLoc(N), Ops);
-
- auto Shift = DAG.getNode(ISD::SRA, SDLoc(N), VT, CmpLHS, Val);
- auto Or = DAG.getNode(ISD::OR, SDLoc(N), VT, Shift, N->getOperand(1));
- return Or;
- }
- }
-
EVT CmpVT = N0.getOperand(0).getValueType();
if (N0.getOpcode() != ISD::SETCC ||
CCVT.getVectorElementCount() != ElementCount::getFixed(1) ||
>From 591f9f95768a312fd23dac0bbbc2903bb81b82d5 Mon Sep 17 00:00:00 2001
From: Rose <gfunni234 at gmail.com>
Date: Sat, 2 Aug 2025 20:29:10 -0400
Subject: [PATCH 2/2] Update AArch64ISelLowering.cpp
---
llvm/lib/Target/AArch64/AArch64ISelLowering.cpp | 1 +
1 file changed, 1 insertion(+)
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index ec74995c046c0..cb0964dcbf546 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -25887,6 +25887,7 @@ static SDValue performVSelectCombine(SDNode *N, SelectionDAG &DAG) {
}
}
+ SDValue SetCC = N->getOperand(0);
EVT CmpVT = N0.getOperand(0).getValueType();
if (N0.getOpcode() != ISD::SETCC ||
CCVT.getVectorElementCount() != ElementCount::getFixed(1) ||
More information about the llvm-commits
mailing list