[llvm] [X86] combineAdd - use SDPatternMatch to simplify "(add (zext (vXi1 X)), Y) -> (sub Y, (sext (vXi1 X)))" matching. (PR #140731)
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Tue May 20 06:22:26 PDT 2025
https://github.com/RKSimon created https://github.com/llvm/llvm-project/pull/140731
None
>From 40a029bb713b2bec6fff0a264bd54f72b78759ab Mon Sep 17 00:00:00 2001
From: Simon Pilgrim <llvm-dev at redking.me.uk>
Date: Tue, 20 May 2025 14:21:40 +0100
Subject: [PATCH] [X86] combineAdd - use SDPatternMatch to simplify "(add (zext
(vXi1 X)), Y) -> (sub Y, (sext (vXi1 X)))" matching.
---
llvm/lib/Target/X86/X86ISelLowering.cpp | 23 +++++++++--------------
1 file changed, 9 insertions(+), 14 deletions(-)
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index b5d930ed4f7c3..1ee49a4f8a97a 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -57886,6 +57886,7 @@ static SDValue pushAddIntoCmovOfConsts(SDNode *N, const SDLoc &DL,
static SDValue combineAdd(SDNode *N, SelectionDAG &DAG,
TargetLowering::DAGCombinerInfo &DCI,
const X86Subtarget &Subtarget) {
+ using namespace SDPatternMatch;
EVT VT = N->getValueType(0);
SDValue Op0 = N->getOperand(0);
SDValue Op1 = N->getOperand(1);
@@ -57925,26 +57926,20 @@ static SDValue combineAdd(SDNode *N, SelectionDAG &DAG,
// generic DAG combine without a legal type check, but adding this there
// caused regressions.
if (VT.isVector()) {
- const TargetLowering &TLI = DAG.getTargetLoweringInfo();
- if (Op0.getOpcode() == ISD::ZERO_EXTEND &&
- Op0.getOperand(0).getValueType().getVectorElementType() == MVT::i1 &&
- TLI.isTypeLegal(Op0.getOperand(0).getValueType())) {
- SDValue SExt = DAG.getNode(ISD::SIGN_EXTEND, DL, VT, Op0.getOperand(0));
- return DAG.getNode(ISD::SUB, DL, VT, Op1, SExt);
- }
-
- if (Op1.getOpcode() == ISD::ZERO_EXTEND &&
- Op1.getOperand(0).getValueType().getVectorElementType() == MVT::i1 &&
- TLI.isTypeLegal(Op1.getOperand(0).getValueType())) {
- SDValue SExt = DAG.getNode(ISD::SIGN_EXTEND, DL, VT, Op1.getOperand(0));
- return DAG.getNode(ISD::SUB, DL, VT, Op0, SExt);
+ SDValue X, Y;
+ EVT BoolVT = EVT::getVectorVT(*DAG.getContext(), MVT::i1,
+ VT.getVectorElementCount());
+ if (DAG.getTargetLoweringInfo().isTypeLegal(BoolVT) &&
+ sd_match(N, m_Add(m_ZExt(m_AllOf(m_SpecificVT(BoolVT), m_Value(X))),
+ m_Value(Y)))) {
+ SDValue SExt = DAG.getNode(ISD::SIGN_EXTEND, DL, VT, X);
+ return DAG.getNode(ISD::SUB, DL, VT, Y, SExt);
}
}
// Peephole for 512-bit VPDPBSSD on non-VLX targets.
// TODO: Should this be part of matchPMADDWD/matchPMADDWD_2?
if (Subtarget.hasVNNI() && Subtarget.useAVX512Regs() && VT == MVT::v16i32) {
- using namespace SDPatternMatch;
SDValue Accum, Lo0, Lo1, Hi0, Hi1;
if (sd_match(N, m_Add(m_Value(Accum),
m_Node(ISD::CONCAT_VECTORS,
More information about the llvm-commits
mailing list