Skip to content

Commit 621a5a9

Browse files
authored
[X86] combineAdd - use SDPatternMatch to simplify "(add (zext (vXi1 X)), Y) -> (sub Y, (sext (vXi1 X)))" matching. (#140731)
1 parent 1a9377b commit 621a5a9

File tree

1 file changed

+9
-14
lines changed

1 file changed

+9
-14
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -57886,6 +57886,7 @@ static SDValue pushAddIntoCmovOfConsts(SDNode *N, const SDLoc &DL,
5788657886
static SDValue combineAdd(SDNode *N, SelectionDAG &DAG,
5788757887
TargetLowering::DAGCombinerInfo &DCI,
5788857888
const X86Subtarget &Subtarget) {
57889+
using namespace SDPatternMatch;
5788957890
EVT VT = N->getValueType(0);
5789057891
SDValue Op0 = N->getOperand(0);
5789157892
SDValue Op1 = N->getOperand(1);
@@ -57925,26 +57926,20 @@ static SDValue combineAdd(SDNode *N, SelectionDAG &DAG,
5792557926
// generic DAG combine without a legal type check, but adding this there
5792657927
// caused regressions.
5792757928
if (VT.isVector()) {
57928-
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
57929-
if (Op0.getOpcode() == ISD::ZERO_EXTEND &&
57930-
Op0.getOperand(0).getValueType().getVectorElementType() == MVT::i1 &&
57931-
TLI.isTypeLegal(Op0.getOperand(0).getValueType())) {
57932-
SDValue SExt = DAG.getNode(ISD::SIGN_EXTEND, DL, VT, Op0.getOperand(0));
57933-
return DAG.getNode(ISD::SUB, DL, VT, Op1, SExt);
57934-
}
57935-
57936-
if (Op1.getOpcode() == ISD::ZERO_EXTEND &&
57937-
Op1.getOperand(0).getValueType().getVectorElementType() == MVT::i1 &&
57938-
TLI.isTypeLegal(Op1.getOperand(0).getValueType())) {
57939-
SDValue SExt = DAG.getNode(ISD::SIGN_EXTEND, DL, VT, Op1.getOperand(0));
57940-
return DAG.getNode(ISD::SUB, DL, VT, Op0, SExt);
57929+
SDValue X, Y;
57930+
EVT BoolVT = EVT::getVectorVT(*DAG.getContext(), MVT::i1,
57931+
VT.getVectorElementCount());
57932+
if (DAG.getTargetLoweringInfo().isTypeLegal(BoolVT) &&
57933+
sd_match(N, m_Add(m_ZExt(m_AllOf(m_SpecificVT(BoolVT), m_Value(X))),
57934+
m_Value(Y)))) {
57935+
SDValue SExt = DAG.getNode(ISD::SIGN_EXTEND, DL, VT, X);
57936+
return DAG.getNode(ISD::SUB, DL, VT, Y, SExt);
5794157937
}
5794257938
}
5794357939

5794457940
// Peephole for 512-bit VPDPBSSD on non-VLX targets.
5794557941
// TODO: Should this be part of matchPMADDWD/matchPMADDWD_2?
5794657942
if (Subtarget.hasVNNI() && Subtarget.useAVX512Regs() && VT == MVT::v16i32) {
57947-
using namespace SDPatternMatch;
5794857943
SDValue Accum, Lo0, Lo1, Hi0, Hi1;
5794957944
if (sd_match(N, m_Add(m_Value(Accum),
5795057945
m_Node(ISD::CONCAT_VECTORS,

0 commit comments

Comments
 (0)