[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:19:12 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-aarch64
Author: AZero13 (AZero13)
<details>
<summary>Changes</summary>
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?
---
Full diff: https://github.com/llvm/llvm-project/pull/151840.diff
2 Files Affected:
- (modified) llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (+7-1)
- (modified) llvm/lib/Target/AArch64/AArch64ISelLowering.cpp (-32)
``````````diff
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) ||
``````````
</details>
https://github.com/llvm/llvm-project/pull/151840
More information about the llvm-commits
mailing list