[llvm] [SelectionDAG] Move VSelect sign pattern check from AArch64 to general SelectionDAG (PR #151840)
via llvm-commits
llvm-commits at lists.llvm.org
Sat Aug 2 18:36:31 PDT 2025
https://github.com/AZero13 updated https://github.com/llvm/llvm-project/pull/151840
>From 02a31eb9aa775694b196dee645013c5ca3cb13d0 Mon Sep 17 00:00:00 2001
From: Rose <gfunni234 at gmail.com>
Date: Sat, 2 Aug 2025 20:18:09 -0400
Subject: [PATCH] [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 | 31 -------------------
2 files changed, 7 insertions(+), 32 deletions(-)
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index 11e869aebe7da..d52669185ea39 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);
+ SDValue ShiftC = DAG.getShiftAmountConstant(VT.getScalarSizeInBits() - 1,
+ DL, VT.getScalarType());
+ SDValue ShiftAmount = DAG.getSplatBuildVector(VT, DL, ShiftC);
+
+ SDValue 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..cb0964dcbf546 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -25887,38 +25887,7 @@ 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) ||
More information about the llvm-commits
mailing list