[llvm-branch-commits] [llvm] [DAG] Remove trivial VP SDNodes. NFC (PR #217866)
Luke Lau via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Fri Aug 21 09:03:08 PDT 2026
https://github.com/lukel97 updated https://github.com/llvm/llvm-project/pull/217866
>From a5ec50af77acab45e2804cd5e8e56470a9b3938c Mon Sep 17 00:00:00 2001
From: Luke Lau <luke at igalia.com>
Date: Fri, 21 Aug 2026 17:30:01 +0800
Subject: [PATCH] [DAG] Remove trivial VP SDNodes. NFC
This removes the codegen parts of the trivial VP intrinsics. It's quite far reaching, but the general categories of code removed are:
- Removing definitions from VPIntrinsics.def
- Legalization and expansion code
- MatchContext used to match over both VP and non-VP nodes
- Some dead DAGCombines and folds in SelectionDAGBuilder
There are still more things to be cleaned up after this, e.g. removing more of the VPIntrinsic class hierarchy, removing ExpandVectorPredication/moving expansion into other places, removing MatchContext from SDPatternMatch
---
llvm/include/llvm/CodeGen/SDPatternMatch.h | 2 +
llvm/include/llvm/CodeGen/SelectionDAG.h | 37 --
llvm/include/llvm/CodeGen/TargetLowering.h | 50 +--
llvm/include/llvm/IR/VPIntrinsics.def | 343 +----------------
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 71 +---
llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 44 +--
.../SelectionDAG/LegalizeIntegerTypes.cpp | 331 +++-------------
llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h | 5 -
.../SelectionDAG/LegalizeTypesGeneric.cpp | 2 +-
.../SelectionDAG/LegalizeVectorOps.cpp | 224 +----------
.../SelectionDAG/LegalizeVectorTypes.cpp | 363 ++++--------------
llvm/lib/CodeGen/SelectionDAG/MatchContext.h | 182 ---------
.../lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 57 ---
.../SelectionDAG/SelectionDAGBuilder.cpp | 58 ---
.../CodeGen/SelectionDAG/TargetLowering.cpp | 342 +----------------
llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp | 4 -
.../CodeGen/SelectionDAGPatternMatchTest.cpp | 89 -----
17 files changed, 189 insertions(+), 2015 deletions(-)
delete mode 100644 llvm/lib/CodeGen/SelectionDAG/MatchContext.h
diff --git a/llvm/include/llvm/CodeGen/SDPatternMatch.h b/llvm/include/llvm/CodeGen/SDPatternMatch.h
index 1affc9a1f6b49..18fa8ef12e730 100644
--- a/llvm/include/llvm/CodeGen/SDPatternMatch.h
+++ b/llvm/include/llvm/CodeGen/SDPatternMatch.h
@@ -32,6 +32,8 @@ namespace SDPatternMatch {
/// a certain context. For instance, `m_SpecificOpc(ISD::ADD)` matches plain ADD
/// nodes in normal circumstances, but matches VP_ADD nodes under a custom
/// VPMatchContext. This design is meant to facilitate code / pattern reusing.
+/// TODO: Remove now that we don't need to match over VP nodes.
+
class BasicMatchContext {
const SelectionDAG *DAG;
const TargetLowering *TLI;
diff --git a/llvm/include/llvm/CodeGen/SelectionDAG.h b/llvm/include/llvm/CodeGen/SelectionDAG.h
index e2ad79c4ca931..e1d3548816883 100644
--- a/llvm/include/llvm/CodeGen/SelectionDAG.h
+++ b/llvm/include/llvm/CodeGen/SelectionDAG.h
@@ -1092,11 +1092,6 @@ class SelectionDAG {
/// value assuming it was the smaller SrcTy value.
LLVM_ABI SDValue getZeroExtendInReg(SDValue Op, const SDLoc &DL, EVT VT);
- /// Return the expression required to zero extend the Op
- /// value assuming it was the smaller SrcTy value.
- LLVM_ABI SDValue getVPZeroExtendInReg(SDValue Op, SDValue Mask, SDValue EVL,
- const SDLoc &DL, EVT VT);
-
/// Convert Op, which must be of integer type, to the integer type VT, by
/// either truncating it or performing either zero or sign extension as
/// appropriate extension for the pointer's semantics.
@@ -1122,26 +1117,6 @@ class SelectionDAG {
/// Create a logical NOT operation as (XOR Val, BooleanOne).
LLVM_ABI SDValue getLogicalNOT(const SDLoc &DL, SDValue Val, EVT VT);
- /// Create a vector-predicated logical NOT operation as (VP_XOR Val,
- /// BooleanOne, Mask, EVL).
- LLVM_ABI SDValue getVPLogicalNOT(const SDLoc &DL, SDValue Val, SDValue Mask,
- SDValue EVL, EVT VT);
-
- /// Convert a vector-predicated Op, which must be an integer vector, to the
- /// vector-type VT, by performing either vector-predicated zext or truncating
- /// it. The Op will be returned as-is if Op and VT are vectors containing
- /// integer with same width.
- LLVM_ABI SDValue getVPZExtOrTrunc(const SDLoc &DL, EVT VT, SDValue Op,
- SDValue Mask, SDValue EVL);
-
- /// Convert a vector-predicated Op, which must be of integer type, to the
- /// vector-type integer type VT, by either truncating it or performing either
- /// vector-predicated zero or sign extension as appropriate extension for the
- /// pointer's semantics. This function just redirects to getVPZExtOrTrunc
- /// right now.
- LLVM_ABI SDValue getVPPtrExtOrTrunc(const SDLoc &DL, EVT VT, SDValue Op,
- SDValue Mask, SDValue EVL);
-
/// Returns sum of the base pointer and offset.
/// Unlike getObjectPtrOffset this does not set NoUnsignedWrap and InBounds by
/// default.
@@ -1395,18 +1370,6 @@ class SelectionDAG {
return getNode(ISD::SETCC, DL, VT, LHS, RHS, getCondCode(Cond), Flags);
}
- /// Helper function to make it easier to build VP_SETCCs if you just have an
- /// ISD::CondCode instead of an SDValue.
- SDValue getSetCCVP(const SDLoc &DL, EVT VT, SDValue LHS, SDValue RHS,
- ISD::CondCode Cond, SDValue Mask, SDValue EVL) {
- assert(LHS.getValueType().isVector() && RHS.getValueType().isVector() &&
- "Cannot compare scalars");
- assert(Cond != ISD::SETCC_INVALID &&
- "Cannot create a setCC of an invalid node.");
- return getNode(ISD::VP_SETCC, DL, VT, LHS, RHS, getCondCode(Cond), Mask,
- EVL);
- }
-
/// Helper function to make it easier to build Select's if you just have
/// operands and don't want to check for vector.
SDValue getSelect(const SDLoc &DL, EVT VT, SDValue Cond, SDValue LHS,
diff --git a/llvm/include/llvm/CodeGen/TargetLowering.h b/llvm/include/llvm/CodeGen/TargetLowering.h
index a91b575dc82d2..4df2e674f2ef4 100644
--- a/llvm/include/llvm/CodeGen/TargetLowering.h
+++ b/llvm/include/llvm/CodeGen/TargetLowering.h
@@ -476,7 +476,7 @@ class LLVM_ABI TargetLoweringBase {
}
/// Returns the type to be used for the EVL/AVL operand of VP nodes:
- /// ISD::VP_ADD, ISD::VP_SUB, etc. It must be a legal scalar integer type,
+ /// ISD::VP_UDIV, ISD::VP_SDIV, etc. It must be a legal scalar integer type,
/// and must be at least as large as i32. The EVL is implicitly zero-extended
/// to any larger type.
virtual MVT getVPExplicitVectorLengthTy() const { return MVT::i32; }
@@ -3673,10 +3673,6 @@ class LLVM_ABI TargetLoweringBase {
if (isOperationLegalOrCustom(ISD::STRICT_FP_TO_SINT, ToVT))
return ISD::STRICT_FP_TO_SINT;
break;
- case ISD::VP_FP_TO_UINT:
- if (isOperationLegalOrCustom(ISD::VP_FP_TO_SINT, ToVT))
- return ISD::VP_FP_TO_SINT;
- break;
default:
break;
}
@@ -5770,21 +5766,12 @@ class LLVM_ABI TargetLowering : public TargetLoweringBase {
/// \returns The expansion result or SDValue() if it fails.
SDValue expandCTPOP(SDNode *N, SelectionDAG &DAG) const;
- /// Expand VP_CTPOP nodes.
- /// \returns The expansion result or SDValue() if it fails.
- SDValue expandVPCTPOP(SDNode *N, SelectionDAG &DAG) const;
-
/// Expand CTLZ/CTLZ_ZERO_POISON nodes. Expands vector/scalar CTLZ nodes,
/// vector nodes can only succeed if all operations are legal/custom.
/// \param N Node to expand
/// \returns The expansion result or SDValue() if it fails.
SDValue expandCTLZ(SDNode *N, SelectionDAG &DAG) const;
- /// Expand VP_CTLZ/VP_CTLZ_ZERO_POISON nodes.
- /// \param N Node to expand
- /// \returns The expansion result or SDValue() if it fails.
- SDValue expandVPCTLZ(SDNode *N, SelectionDAG &DAG) const;
-
/// Expand CTLS (count leading sign bits) nodes.
/// CTLS(x) = CTLZ(OR(SHL(XOR(x, SRA(x, BW-1)), 1), 1))
/// \param N Node to expand
@@ -5803,11 +5790,6 @@ class LLVM_ABI TargetLowering : public TargetLoweringBase {
/// \returns The expansion result or SDValue() if it fails.
SDValue expandCTTZ(SDNode *N, SelectionDAG &DAG) const;
- /// Expand VP_CTTZ/VP_CTTZ_ZERO_POISON nodes.
- /// \param N Node to expand
- /// \returns The expansion result or SDValue() if it fails.
- SDValue expandVPCTTZ(SDNode *N, SelectionDAG &DAG) const;
-
/// Expand VP_CTTZ_ELTS/VP_CTTZ_ELTS_ZERO_POISON nodes.
/// \param N Node to expand
/// \returns The expansion result or SDValue() if it fails.
@@ -5853,22 +5835,12 @@ class LLVM_ABI TargetLowering : public TargetLoweringBase {
/// \returns The expansion result or SDValue() if it fails.
SDValue expandBSWAP(SDNode *N, SelectionDAG &DAG) const;
- /// Expand VP_BSWAP nodes. Expands VP_BSWAP nodes with
- /// i16/i32/i64 scalar types. Returns SDValue() if expand fails. \param N Node
- /// to expand \returns The expansion result or SDValue() if it fails.
- SDValue expandVPBSWAP(SDNode *N, SelectionDAG &DAG) const;
-
/// Expand BITREVERSE nodes. Expands scalar/vector BITREVERSE nodes.
/// Returns SDValue() if expand fails.
/// \param N Node to expand
/// \returns The expansion result or SDValue() if it fails.
SDValue expandBITREVERSE(SDNode *N, SelectionDAG &DAG) const;
- /// Expand VP_BITREVERSE nodes. Expands VP_BITREVERSE nodes with
- /// i8/i16/i32/i64 scalar types. \param N Node to expand \returns The
- /// expansion result or SDValue() if it fails.
- SDValue expandVPBITREVERSE(SDNode *N, SelectionDAG &DAG) const;
-
/// Turn load of vector type into a load of the individual elements.
/// \param LD load to expand
/// \returns BUILD_VECTOR and TokenFactor nodes.
@@ -6030,32 +6002,30 @@ class LLVM_ABI TargetLowering : public TargetLoweringBase {
SmallVectorImpl<SDValue> &Results,
std::optional<unsigned> CallRetResNo = {}) const;
- /// Legalize a SETCC or VP_SETCC with given LHS and RHS and condition code CC
- /// on the current target. A VP_SETCC will additionally be given a Mask
- /// and/or EVL not equal to SDValue().
+ /// Legalize a SETCC with given LHS and RHS and condition code CC
+ /// on the current target.
///
/// If the SETCC has been legalized using AND / OR, then the legalized node
/// will be stored in LHS. RHS and CC will be set to SDValue(). NeedInvert
- /// will be set to false. This will also hold if the VP_SETCC has been
- /// legalized using VP_AND / VP_OR.
+ /// will be set to false.
///
- /// If the SETCC / VP_SETCC has been legalized by using
+ /// If the SETCC has been legalized by using
/// getSetCCSwappedOperands(), then the values of LHS and RHS will be
/// swapped, CC will be set to the new condition, and NeedInvert will be set
/// to false.
///
- /// If the SETCC / VP_SETCC has been legalized using the inverse condcode,
+ /// If the SETCC has been legalized using the inverse condcode,
/// then LHS and RHS will be unchanged, CC will set to the inverted condcode,
/// and NeedInvert will be set to true. The caller must invert the result of
/// the SETCC with SelectionDAG::getLogicalNOT() or take equivalent action to
/// swap the effect of a true/false result.
///
- /// \returns true if the SETCC / VP_SETCC has been legalized, false if it
+ /// \returns true if the SETCC has been legalized, false if it
/// hasn't.
bool LegalizeSetCCCondCode(SelectionDAG &DAG, EVT VT, SDValue &LHS,
- SDValue &RHS, SDValue &CC, SDValue Mask,
- SDValue EVL, bool &NeedInvert, const SDLoc &dl,
- SDValue &Chain, bool IsSignaling = false) const;
+ SDValue &RHS, SDValue &CC, bool &NeedInvert,
+ const SDLoc &dl, SDValue &Chain,
+ bool IsSignaling = false) const;
//===--------------------------------------------------------------------===//
// Instruction Emitting Hooks
diff --git a/llvm/include/llvm/IR/VPIntrinsics.def b/llvm/include/llvm/IR/VPIntrinsics.def
index 669343f5c2e5c..056e8a758d9cc 100644
--- a/llvm/include/llvm/IR/VPIntrinsics.def
+++ b/llvm/include/llvm/IR/VPIntrinsics.def
@@ -138,24 +138,6 @@
VP_PROPERTY_BINARYOP \
END_REGISTER_VP_SDNODE(VPSD)
-// llvm.vp.add(x,y,mask,vlen)
-HELPER_REGISTER_BINARY_INT_VP(vp_add, VP_ADD, Add, ADD)
-
-// llvm.vp.and(x,y,mask,vlen)
-HELPER_REGISTER_BINARY_INT_VP(vp_and, VP_AND, And, AND)
-
-// llvm.vp.ashr(x,y,mask,vlen)
-HELPER_REGISTER_BINARY_INT_VP(vp_ashr, VP_SRA, AShr, SRA)
-
-// llvm.vp.lshr(x,y,mask,vlen)
-HELPER_REGISTER_BINARY_INT_VP(vp_lshr, VP_SRL, LShr, SRL)
-
-// llvm.vp.mul(x,y,mask,vlen)
-HELPER_REGISTER_BINARY_INT_VP(vp_mul, VP_MUL, Mul, MUL)
-
-// llvm.vp.or(x,y,mask,vlen)
-HELPER_REGISTER_BINARY_INT_VP(vp_or, VP_OR, Or, OR)
-
// llvm.vp.sdiv(x,y,mask,vlen)
BEGIN_REGISTER_VP_INTRINSIC(vp_sdiv, 2, 3)
HELPER_MAP_VPID_TO_VPSD(vp_sdiv, VP_SDIV)
@@ -163,9 +145,6 @@ VP_PROPERTY_FUNCTIONAL_OPC(SDiv)
HELPER_REGISTER_BINARY_INT_VP(vp_sdiv, VP_SDIV, SDiv, SDIV)
END_REGISTER_VP_INTRINSIC(vp_sdiv)
-// llvm.vp.shl(x,y,mask,vlen)
-HELPER_REGISTER_BINARY_INT_VP(vp_shl, VP_SHL, Shl, SHL)
-
// llvm.vp.srem(x,y,mask,vlen)
BEGIN_REGISTER_VP_INTRINSIC(vp_srem, 2, 3)
HELPER_MAP_VPID_TO_VPSD(vp_srem, VP_SREM)
@@ -173,9 +152,6 @@ VP_PROPERTY_FUNCTIONAL_OPC(SRem)
HELPER_REGISTER_BINARY_INT_VP(vp_srem, VP_SREM, SRem, SREM)
END_REGISTER_VP_INTRINSIC(vp_srem)
-// llvm.vp.sub(x,y,mask,vlen)
-HELPER_REGISTER_BINARY_INT_VP(vp_sub, VP_SUB, Sub, SUB)
-
// llvm.vp.udiv(x,y,mask,vlen)
BEGIN_REGISTER_VP_INTRINSIC(vp_udiv, 2, 3)
HELPER_MAP_VPID_TO_VPSD(vp_udiv, VP_UDIV)
@@ -190,70 +166,8 @@ VP_PROPERTY_FUNCTIONAL_OPC(URem)
HELPER_REGISTER_BINARY_INT_VP(vp_urem, VP_UREM, URem, UREM)
END_REGISTER_VP_INTRINSIC(vp_urem)
-// llvm.vp.xor(x,y,mask,vlen)
-HELPER_REGISTER_BINARY_INT_VP(vp_xor, VP_XOR, Xor, XOR)
-
#undef HELPER_REGISTER_BINARY_INT_VP
-// llvm.vp.smin(x,y,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_SMIN, -1, vp_smin, 2, 3)
-VP_PROPERTY_BINARYOP
-VP_PROPERTY_FUNCTIONAL_SDOPC(SMIN)
-END_REGISTER_VP_SDNODE(VP_SMIN)
-
-// llvm.vp.smax(x,y,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_SMAX, -1, vp_smax, 2, 3)
-VP_PROPERTY_BINARYOP
-VP_PROPERTY_FUNCTIONAL_SDOPC(SMAX)
-END_REGISTER_VP_SDNODE(VP_SMAX)
-
-// llvm.vp.umin(x,y,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_UMIN, -1, vp_umin, 2, 3)
-VP_PROPERTY_BINARYOP
-VP_PROPERTY_FUNCTIONAL_SDOPC(UMIN)
-END_REGISTER_VP_SDNODE(VP_UMIN)
-
-// llvm.vp.umax(x,y,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_UMAX, -1, vp_umax, 2, 3)
-VP_PROPERTY_BINARYOP
-VP_PROPERTY_FUNCTIONAL_SDOPC(UMAX)
-END_REGISTER_VP_SDNODE(VP_UMAX)
-
-// llvm.vp.abs(x,is_int_min_poison,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_ABS, -1, vp_abs, 1, 2)
-VP_PROPERTY_FUNCTIONAL_SDOPC(ABS)
-END_REGISTER_VP_SDNODE(VP_ABS)
-
-// llvm.vp.bswap(x,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_BSWAP, -1, vp_bswap, 1, 2)
-VP_PROPERTY_FUNCTIONAL_SDOPC(BSWAP)
-END_REGISTER_VP_SDNODE(VP_BSWAP)
-
-// llvm.vp.bitreverse(x,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_BITREVERSE, -1, vp_bitreverse, 1, 2)
-VP_PROPERTY_FUNCTIONAL_SDOPC(BITREVERSE)
-END_REGISTER_VP_SDNODE(VP_BITREVERSE)
-
-// llvm.vp.ctpop(x,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_CTPOP, -1, vp_ctpop, 1, 2)
-VP_PROPERTY_FUNCTIONAL_SDOPC(CTPOP)
-END_REGISTER_VP_SDNODE(VP_CTPOP)
-
-// llvm.vp.ctlz(x,is_zero_poison,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_CTLZ, -1, vp_ctlz, 1, 2)
-VP_PROPERTY_FUNCTIONAL_SDOPC(CTLZ)
-END_REGISTER_VP_SDNODE(VP_CTLZ)
-BEGIN_REGISTER_VP_SDNODE(VP_CTLZ_ZERO_POISON, -1, vp_ctlz_zero_poison, 1, 2)
-VP_PROPERTY_FUNCTIONAL_SDOPC(CTLZ_ZERO_POISON)
-END_REGISTER_VP_SDNODE(VP_CTLZ_ZERO_POISON)
-
-// llvm.vp.cttz(x,is_zero_poison,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_CTTZ, -1, vp_cttz, 1, 2)
-VP_PROPERTY_FUNCTIONAL_SDOPC(CTTZ)
-END_REGISTER_VP_SDNODE(VP_CTTZ)
-BEGIN_REGISTER_VP_SDNODE(VP_CTTZ_ZERO_POISON, -1, vp_cttz_zero_poison, 1, 2)
-END_REGISTER_VP_SDNODE(VP_CTTZ_ZERO_POISON)
-
// llvm.vp.cttz.elts(x,is_zero_poison,mask,vl)
BEGIN_REGISTER_VP_INTRINSIC(vp_cttz_elts, 2, 3)
VP_PROPERTY_NO_FUNCTIONAL
@@ -263,254 +177,8 @@ BEGIN_REGISTER_VP_SDNODE(VP_CTTZ_ELTS_ZERO_POISON, 0, vp_cttz_elts_zero_poison,
END_REGISTER_VP_SDNODE(VP_CTTZ_ELTS_ZERO_POISON)
END_REGISTER_VP_INTRINSIC(vp_cttz_elts)
-// llvm.vp.fshl(x,y,z,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_FSHL, -1, vp_fshl, 3, 4)
-VP_PROPERTY_FUNCTIONAL_SDOPC(FSHL)
-END_REGISTER_VP_SDNODE(VP_FSHL)
-
-// llvm.vp.fshr(x,y,z,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_FSHR, -1, vp_fshr, 3, 4)
-VP_PROPERTY_FUNCTIONAL_SDOPC(FSHR)
-END_REGISTER_VP_SDNODE(VP_FSHR)
-
-// llvm.vp.sadd.sat(x,y,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_SADDSAT, -1, vp_sadd_sat, 2, 3)
-VP_PROPERTY_BINARYOP
-VP_PROPERTY_FUNCTIONAL_SDOPC(SADDSAT)
-END_REGISTER_VP_SDNODE(VP_SADDSAT)
-
-// llvm.vp.uadd.sat(x,y,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_UADDSAT, -1, vp_uadd_sat, 2, 3)
-VP_PROPERTY_BINARYOP
-VP_PROPERTY_FUNCTIONAL_SDOPC(UADDSAT)
-END_REGISTER_VP_SDNODE(VP_UADDSAT)
-
-// llvm.vp.ssub.sat(x,y,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_SSUBSAT, -1, vp_ssub_sat, 2, 3)
-VP_PROPERTY_BINARYOP
-VP_PROPERTY_FUNCTIONAL_SDOPC(SSUBSAT)
-END_REGISTER_VP_SDNODE(VP_SSUBSAT)
-
-// llvm.vp.usub.sat(x,y,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_USUBSAT, -1, vp_usub_sat, 2, 3)
-VP_PROPERTY_BINARYOP
-VP_PROPERTY_FUNCTIONAL_SDOPC(USUBSAT)
-END_REGISTER_VP_SDNODE(VP_USUBSAT)
///// } Integer Arithmetic
-///// Floating-Point Arithmetic {
-
-// Specialized helper macro for floating-point binary operators
-// <operation>(%x, %y, %mask, %evl).
-#ifdef HELPER_REGISTER_BINARY_FP_VP
-#error \
- "The internal helper macro HELPER_REGISTER_BINARY_FP_VP is already defined!"
-#endif
-#define HELPER_REGISTER_BINARY_FP_VP(OPSUFFIX, VPSD, IROPC, SDOPC) \
- BEGIN_REGISTER_VP_SDNODE(VPSD, -1, vp_##OPSUFFIX, 2, 3) \
- VP_PROPERTY_CONSTRAINEDFP(experimental_constrained_##OPSUFFIX) \
- VP_PROPERTY_FUNCTIONAL_SDOPC(SDOPC) \
- VP_PROPERTY_BINARYOP \
- END_REGISTER_VP_SDNODE(VPSD)
-
-// llvm.vp.fadd(x,y,mask,vlen)
-HELPER_REGISTER_BINARY_FP_VP(fadd, VP_FADD, FAdd, FADD)
-
-// llvm.vp.fsub(x,y,mask,vlen)
-HELPER_REGISTER_BINARY_FP_VP(fsub, VP_FSUB, FSub, FSUB)
-
-// llvm.vp.fmul(x,y,mask,vlen)
-HELPER_REGISTER_BINARY_FP_VP(fmul, VP_FMUL, FMul, FMUL)
-
-// llvm.vp.fdiv(x,y,mask,vlen)
-HELPER_REGISTER_BINARY_FP_VP(fdiv, VP_FDIV, FDiv, FDIV)
-
-// llvm.vp.frem(x,y,mask,vlen)
-HELPER_REGISTER_BINARY_FP_VP(frem, VP_FREM, FRem, FREM)
-
-#undef HELPER_REGISTER_BINARY_FP_VP
-
-// llvm.vp.fneg(x,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_FNEG, -1, vp_fneg, 1, 2)
-VP_PROPERTY_FUNCTIONAL_SDOPC(FNEG)
-END_REGISTER_VP_SDNODE(VP_FNEG)
-
-// llvm.vp.fabs(x,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_FABS, -1, vp_fabs, 1, 2)
-VP_PROPERTY_FUNCTIONAL_SDOPC(FABS)
-END_REGISTER_VP_SDNODE(VP_FABS)
-
-// llvm.vp.sqrt(x,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_SQRT, -1, vp_sqrt, 1, 2)
-VP_PROPERTY_FUNCTIONAL_SDOPC(FSQRT)
-END_REGISTER_VP_SDNODE(VP_SQRT)
-
-// llvm.vp.fma(x,y,z,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_FMA, -1, vp_fma, 3, 4)
-VP_PROPERTY_CONSTRAINEDFP(experimental_constrained_fma)
-VP_PROPERTY_FUNCTIONAL_SDOPC(FMA)
-END_REGISTER_VP_SDNODE(VP_FMA)
-
-// llvm.vp.fmuladd(x,y,z,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_FMULADD, -1, vp_fmuladd, 3, 4)
-VP_PROPERTY_CONSTRAINEDFP(experimental_constrained_fmuladd)
-VP_PROPERTY_FUNCTIONAL_SDOPC(FMAD)
-END_REGISTER_VP_SDNODE(VP_FMULADD)
-
-// llvm.vp.copysign(x,y,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_FCOPYSIGN, -1, vp_copysign, 2, 3)
-VP_PROPERTY_BINARYOP
-VP_PROPERTY_FUNCTIONAL_SDOPC(FCOPYSIGN)
-END_REGISTER_VP_SDNODE(VP_FCOPYSIGN)
-
-// llvm.vp.minnum(x,y,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_FMINNUM, -1, vp_minnum, 2, 3)
-VP_PROPERTY_BINARYOP
-VP_PROPERTY_FUNCTIONAL_SDOPC(FMINNUM)
-END_REGISTER_VP_SDNODE(VP_FMINNUM)
-
-// llvm.vp.maxnum(x,y,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_FMAXNUM, -1, vp_maxnum, 2, 3)
-VP_PROPERTY_BINARYOP
-VP_PROPERTY_FUNCTIONAL_SDOPC(FMAXNUM)
-END_REGISTER_VP_SDNODE(VP_FMAXNUM)
-
-// llvm.vp.minimum(x,y,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_FMINIMUM, -1, vp_minimum, 2, 3)
-VP_PROPERTY_BINARYOP
-VP_PROPERTY_FUNCTIONAL_SDOPC(FMINIMUM)
-END_REGISTER_VP_SDNODE(VP_FMINIMUM)
-
-// llvm.vp.maximum(x,y,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_FMAXIMUM, -1, vp_maximum, 2, 3)
-VP_PROPERTY_BINARYOP
-VP_PROPERTY_FUNCTIONAL_SDOPC(FMAXIMUM)
-END_REGISTER_VP_SDNODE(VP_FMAXIMUM)
-
-// llvm.vp.ceil(x,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_FCEIL, -1, vp_ceil, 1, 2)
-VP_PROPERTY_FUNCTIONAL_SDOPC(FCEIL)
-END_REGISTER_VP_SDNODE(VP_FCEIL)
-
-// llvm.vp.floor(x,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_FFLOOR, -1, vp_floor, 1, 2)
-VP_PROPERTY_FUNCTIONAL_SDOPC(FFLOOR)
-END_REGISTER_VP_SDNODE(VP_FFLOOR)
-
-// llvm.vp.round(x,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_FROUND, -1, vp_round, 1, 2)
-VP_PROPERTY_FUNCTIONAL_SDOPC(FROUND)
-END_REGISTER_VP_SDNODE(VP_FROUND)
-
-// llvm.vp.roundeven(x,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_FROUNDEVEN, -1, vp_roundeven, 1, 2)
-VP_PROPERTY_FUNCTIONAL_SDOPC(FROUNDEVEN)
-END_REGISTER_VP_SDNODE(VP_FROUNDEVEN)
-
-// llvm.vp.roundtozero(x,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_FROUNDTOZERO, -1, vp_roundtozero, 1, 2)
-VP_PROPERTY_FUNCTIONAL_SDOPC(FTRUNC)
-END_REGISTER_VP_SDNODE(VP_FROUNDTOZERO)
-
-// llvm.vp.rint(x,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_FRINT, -1, vp_rint, 1, 2)
-VP_PROPERTY_FUNCTIONAL_SDOPC(FRINT)
-END_REGISTER_VP_SDNODE(VP_FRINT)
-
-// llvm.vp.nearbyint(x,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_FNEARBYINT, -1, vp_nearbyint, 1, 2)
-VP_PROPERTY_FUNCTIONAL_SDOPC(FNEARBYINT)
-END_REGISTER_VP_SDNODE(VP_FNEARBYINT)
-
-// llvm.vp.lrint(x,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_LRINT, 0, vp_lrint, 1, 2)
-VP_PROPERTY_FUNCTIONAL_SDOPC(LRINT)
-END_REGISTER_VP_SDNODE(VP_LRINT)
-
-// llvm.vp.llrint(x,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_LLRINT, 0, vp_llrint, 1, 2)
-VP_PROPERTY_FUNCTIONAL_SDOPC(LLRINT)
-END_REGISTER_VP_SDNODE(VP_LLRINT)
-
-///// } Floating-Point Arithmetic
-
-///// Type Casts {
-// Specialized helper macro for type conversions.
-// <operation>(%x, %mask, %evl).
-#ifdef HELPER_REGISTER_FP_CAST_VP
-#error \
- "The internal helper macro HELPER_REGISTER_FP_CAST_VP is already defined!"
-#endif
-#define HELPER_REGISTER_FP_CAST_VP(OPSUFFIX, VPSD, IROPC, SDOPC) \
- BEGIN_REGISTER_VP_SDNODE(VPSD, -1, vp_##OPSUFFIX, 1, 2) \
- VP_PROPERTY_FUNCTIONAL_SDOPC(SDOPC) \
- VP_PROPERTY_CONSTRAINEDFP(experimental_constrained_##OPSUFFIX) \
- END_REGISTER_VP_SDNODE(VPSD)
-
-// llvm.vp.fptoui(x,mask,vlen)
-HELPER_REGISTER_FP_CAST_VP(fptoui, VP_FP_TO_UINT, FPToUI, FP_TO_UINT)
-
-// llvm.vp.fptosi(x,mask,vlen)
-HELPER_REGISTER_FP_CAST_VP(fptosi, VP_FP_TO_SINT, FPToSI, FP_TO_SINT)
-
-// llvm.vp.uitofp(x,mask,vlen)
-HELPER_REGISTER_FP_CAST_VP(uitofp, VP_UINT_TO_FP, UIToFP, UINT_TO_FP)
-
-// llvm.vp.sitofp(x,mask,vlen)
-HELPER_REGISTER_FP_CAST_VP(sitofp, VP_SINT_TO_FP, SIToFP, SINT_TO_FP)
-
-// llvm.vp.fptrunc(x,mask,vlen)
-HELPER_REGISTER_FP_CAST_VP(fptrunc, VP_FP_ROUND, FPTrunc, FP_ROUND)
-
-// llvm.vp.fpext(x,mask,vlen)
-HELPER_REGISTER_FP_CAST_VP(fpext, VP_FP_EXTEND, FPExt, FP_EXTEND)
-
-#undef HELPER_REGISTER_FP_CAST_VP
-
-// Specialized helper macro for integer type conversions.
-// <operation>(%x, %mask, %evl).
-#ifdef HELPER_REGISTER_INT_CAST_VP
-#error \
- "The internal helper macro HELPER_REGISTER_INT_CAST_VP is already defined!"
-#endif
-#define HELPER_REGISTER_INT_CAST_VP(OPSUFFIX, VPSD, IROPC, SDOPC) \
- BEGIN_REGISTER_VP_SDNODE(VPSD, -1, vp_##OPSUFFIX, 1, 2) \
- VP_PROPERTY_FUNCTIONAL_SDOPC(SDOPC) \
- END_REGISTER_VP_SDNODE(VPSD)
-
-// llvm.vp.trunc(x,mask,vlen)
-HELPER_REGISTER_INT_CAST_VP(trunc, VP_TRUNCATE, Trunc, TRUNCATE)
-
-// llvm.vp.zext(x,mask,vlen)
-HELPER_REGISTER_INT_CAST_VP(zext, VP_ZERO_EXTEND, ZExt, ZERO_EXTEND)
-
-// llvm.vp.sext(x,mask,vlen)
-HELPER_REGISTER_INT_CAST_VP(sext, VP_SIGN_EXTEND, SExt, SIGN_EXTEND)
-
-// llvm.vp.ptrtoint(x,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_PTRTOINT, -1, vp_ptrtoint, 1, 2)
-END_REGISTER_VP_SDNODE(VP_PTRTOINT)
-
-// llvm.vp.inttoptr(x,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_INTTOPTR, -1, vp_inttoptr, 1, 2)
-END_REGISTER_VP_SDNODE(VP_INTTOPTR)
-
-#undef HELPER_REGISTER_INT_CAST_VP
-
-///// } Type Casts
-
-///// Comparisons {
-
-// VP_SETCC (ISel only)
-BEGIN_REGISTER_VP_SDNODE(VP_SETCC, 0, vp_setcc, 3, 4)
-END_REGISTER_VP_SDNODE(VP_SETCC)
-
-///// } Comparisons
-
-// llvm.vp.is.fpclass(on_true,on_false,mask,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_IS_FPCLASS, 0, vp_is_fpclass, 2, 3)
-END_REGISTER_VP_SDNODE(VP_IS_FPCLASS)
-
///// Memory Operations {
// llvm.vp.store(val,ptr,mask,vlen)
BEGIN_REGISTER_VP_INTRINSIC(vp_store, 2, 3)
@@ -675,15 +343,10 @@ HELPER_REGISTER_REDUCTION_SEQ_VP(vp_reduce_fmul, VP_REDUCE_FMUL,
///// Shuffles {
-// The mask 'cond' operand of llvm.vp.select and llvm.vp.merge are not reported
-// as masks with the BEGIN_REGISTER_VP_* macros. This is because, unlike other
-// VP intrinsics, these two have a defined result on lanes where the mask is
+// The mask 'cond' operand of llvm.vp.merge is not reported
+// as masks with the BEGIN_REGISTER_VP_* macros. This is because, unlike other
+// VP intrinsics, vp.merge has a defined result on lanes where the mask is
// false.
-//
-// llvm.vp.select(cond,on_true,on_false,vlen)
-BEGIN_REGISTER_VP_SDNODE(VP_SELECT, -1, vp_select, std::nullopt, 3)
-VP_PROPERTY_FUNCTIONAL_SDOPC(VSELECT)
-END_REGISTER_VP_SDNODE(VP_SELECT)
// llvm.vp.merge(cond,on_true,on_false,pivot)
BEGIN_REGISTER_VP(vp_merge, std::nullopt, 3, VP_MERGE, -1)
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index 09e26fe2aa58c..c0c7c49f12f4a 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -79,7 +79,6 @@
#include <utility>
#include <variant>
-#include "MatchContext.h"
#include "SDNodeDbgValue.h"
using namespace llvm;
@@ -484,7 +483,6 @@ namespace {
SDValue visitCTPOP(SDNode *N);
SDValue visitSELECT(SDNode *N);
SDValue visitVSELECT(SDNode *N);
- SDValue visitVP_SELECT(SDNode *N);
SDValue visitSELECT_CC(SDNode *N);
SDValue visitSETCC(SDNode *N);
SDValue visitSETCCCARRY(SDNode *N);
@@ -4158,15 +4156,12 @@ SDValue DAGCombiner::foldSubToUSubSat(EVT DstVT, SDNode *N, const SDLoc &DL) {
// -->
//
// (ctlz_zero_poison (not (shl Src BitWidthDiff)))
-template <class MatchContextClass>
static SDValue foldSubCtlzNot(SDNode *N, SelectionDAG &DAG) {
const SDLoc DL(N);
SDValue N0 = N->getOperand(0);
EVT VT = N0.getValueType();
unsigned BitWidth = VT.getScalarSizeInBits();
- MatchContextClass Matcher(DAG, DAG.getTargetLoweringInfo(), N);
-
APInt AndMask;
APInt XorMask;
uint64_t BitWidthDiff;
@@ -4174,19 +4169,17 @@ static SDValue foldSubCtlzNot(SDNode *N, SelectionDAG &DAG) {
SDValue CtlzOp;
SDValue Src;
- if (!sd_context_match(
- N, Matcher, m_Sub(m_Ctlz(m_Value(CtlzOp)), m_ConstInt(BitWidthDiff))))
+ if (!sd_match(N, m_Sub(m_Ctlz(m_Value(CtlzOp)), m_ConstInt(BitWidthDiff))))
return SDValue();
- if (sd_context_match(CtlzOp, Matcher, m_ZExt(m_Not(m_Value(Src))))) {
+ if (sd_match(CtlzOp, m_ZExt(m_Not(m_Value(Src))))) {
// DAG Legalisation Pattern:
// (sub (ctlz (zero_extend (not Op)) BitWidthDiff))
if ((BitWidth - Src.getValueType().getScalarSizeInBits()) != BitWidthDiff)
return SDValue();
Src = DAG.getNode(ISD::ANY_EXTEND, DL, VT, Src);
- } else if (sd_context_match(CtlzOp, Matcher,
- m_And(m_Xor(m_Value(Src), m_ConstInt(XorMask)),
+ } else if (sd_match(CtlzOp, m_And(m_Xor(m_Value(Src), m_ConstInt(XorMask)),
m_ConstInt(AndMask)))) {
// Type Legalisation Pattern:
// (sub (ctlz (and (xor Op XorMask) AndMask)) BitWidthDiff)
@@ -4199,11 +4192,11 @@ static SDValue foldSubCtlzNot(SDNode *N, SelectionDAG &DAG) {
return SDValue();
SDValue ShiftConst = DAG.getShiftAmountConstant(BitWidthDiff, VT, DL);
- SDValue LShift = Matcher.getNode(ISD::SHL, DL, VT, Src, ShiftConst);
+ SDValue LShift = DAG.getNode(ISD::SHL, DL, VT, Src, ShiftConst);
SDValue Not =
- Matcher.getNode(ISD::XOR, DL, VT, LShift, DAG.getAllOnesConstant(DL, VT));
+ DAG.getNode(ISD::XOR, DL, VT, LShift, DAG.getAllOnesConstant(DL, VT));
- return Matcher.getNode(ISD::CTLZ_ZERO_POISON, DL, VT, Not);
+ return DAG.getNode(ISD::CTLZ_ZERO_POISON, DL, VT, Not);
}
// Fold sub(x, mul(divrem(x,y)[0], y)) to divrem(x, y)[1]
@@ -4276,7 +4269,7 @@ SDValue DAGCombiner::visitSUB(SDNode *N) {
unsigned BitWidth = VT.getScalarSizeInBits();
SDLoc DL(N);
- if (SDValue V = foldSubCtlzNot<EmptyMatchContext>(N, DAG))
+ if (SDValue V = foldSubCtlzNot(N, DAG))
return V;
// fold (sub x, x) -> 0
@@ -13094,17 +13087,13 @@ SDValue DAGCombiner::foldSelectOfConstants(SDNode *N) {
return SDValue();
}
-template <class MatchContextClass>
static SDValue foldBoolSelectToLogic(SDNode *N, const SDLoc &DL,
SelectionDAG &DAG) {
- assert((N->getOpcode() == ISD::SELECT || N->getOpcode() == ISD::VSELECT ||
- N->getOpcode() == ISD::VP_SELECT) &&
- "Expected a (v)(vp.)select");
+ assert((N->getOpcode() == ISD::SELECT || N->getOpcode() == ISD::VSELECT) &&
+ "Expected a (v)select");
SDValue Cond = N->getOperand(0);
SDValue T = N->getOperand(1), F = N->getOperand(2);
EVT VT = N->getValueType(0);
- const TargetLowering &TLI = DAG.getTargetLoweringInfo();
- MatchContextClass matcher(DAG, TLI, N);
if (VT != Cond.getValueType() || VT.getScalarSizeInBits() != 1)
return SDValue();
@@ -13112,25 +13101,25 @@ static SDValue foldBoolSelectToLogic(SDNode *N, const SDLoc &DL,
// select Cond, Cond, F --> or Cond, freeze(F)
// select Cond, 1, F --> or Cond, freeze(F)
if (Cond == T || isOneOrOneSplat(T, /* AllowUndefs */ true))
- return matcher.getNode(ISD::OR, DL, VT, Cond, DAG.getFreeze(F));
+ return DAG.getNode(ISD::OR, DL, VT, Cond, DAG.getFreeze(F));
// select Cond, T, Cond --> and Cond, freeze(T)
// select Cond, T, 0 --> and Cond, freeze(T)
if (Cond == F || isNullOrNullSplat(F, /* AllowUndefs */ true))
- return matcher.getNode(ISD::AND, DL, VT, Cond, DAG.getFreeze(T));
+ return DAG.getNode(ISD::AND, DL, VT, Cond, DAG.getFreeze(T));
// select Cond, T, 1 --> or (not Cond), freeze(T)
if (isOneOrOneSplat(F, /* AllowUndefs */ true)) {
SDValue NotCond =
- matcher.getNode(ISD::XOR, DL, VT, Cond, DAG.getAllOnesConstant(DL, VT));
- return matcher.getNode(ISD::OR, DL, VT, NotCond, DAG.getFreeze(T));
+ DAG.getNode(ISD::XOR, DL, VT, Cond, DAG.getAllOnesConstant(DL, VT));
+ return DAG.getNode(ISD::OR, DL, VT, NotCond, DAG.getFreeze(T));
}
// select Cond, 0, F --> and (not Cond), freeze(F)
if (isNullOrNullSplat(T, /* AllowUndefs */ true)) {
SDValue NotCond =
- matcher.getNode(ISD::XOR, DL, VT, Cond, DAG.getAllOnesConstant(DL, VT));
- return matcher.getNode(ISD::AND, DL, VT, NotCond, DAG.getFreeze(F));
+ DAG.getNode(ISD::XOR, DL, VT, Cond, DAG.getAllOnesConstant(DL, VT));
+ return DAG.getNode(ISD::AND, DL, VT, NotCond, DAG.getFreeze(F));
}
return SDValue();
@@ -13482,7 +13471,7 @@ SDValue DAGCombiner::visitSELECT(SDNode *N) {
if (SDValue V = DAG.simplifySelect(N0, N1, N2))
return V;
- if (SDValue V = foldBoolSelectToLogic<EmptyMatchContext>(N, DL, DAG))
+ if (SDValue V = foldBoolSelectToLogic(N, DL, DAG))
return V;
// select (not Cond), N1, N2 -> select Cond, N2, N1
@@ -14495,21 +14484,6 @@ SDValue DAGCombiner::foldVSelectOfConstants(SDNode *N) {
return SDValue();
}
-SDValue DAGCombiner::visitVP_SELECT(SDNode *N) {
- SDValue N0 = N->getOperand(0);
- SDValue N1 = N->getOperand(1);
- SDValue N2 = N->getOperand(2);
- SDLoc DL(N);
-
- if (SDValue V = DAG.simplifySelect(N0, N1, N2))
- return V;
-
- if (SDValue V = foldBoolSelectToLogic<VPMatchContext>(N, DL, DAG))
- return V;
-
- return SDValue();
-}
-
static SDValue combineVSelectWithAllOnesOrZeros(SDValue Cond, SDValue TVal,
SDValue FVal,
const TargetLowering &TLI,
@@ -14626,7 +14600,7 @@ SDValue DAGCombiner::visitVSELECT(SDNode *N) {
if (SDValue V = DAG.simplifySelect(N0, N1, N2))
return V;
- if (SDValue V = foldBoolSelectToLogic<EmptyMatchContext>(N, DL, DAG))
+ if (SDValue V = foldBoolSelectToLogic(N, DL, DAG))
return V;
// vselect (not Cond), N1, N2 -> vselect Cond, N2, N1
@@ -30397,17 +30371,8 @@ SDValue DAGCombiner::visitVPOp(SDNode *N) {
ISD::isConstantSplatVectorAllZeros(N->getOperand(*MaskIdx).getNode());
// This is the only generic VP combine we support for now.
- if (!AreAllEltsDisabled) {
- switch (N->getOpcode()) {
- case ISD::VP_SELECT:
- return visitVP_SELECT(N);
- case ISD::VP_SUB:
- return foldSubCtlzNot<VPMatchContext>(N, DAG);
- default:
- break;
- }
+ if (!AreAllEltsDisabled)
return SDValue();
- }
// Binary operations can be replaced by UNDEF.
if (ISD::isVPBinaryOp(N->getOpcode()))
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
index 70e094bc0d255..cc27c430b297d 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
@@ -1067,15 +1067,14 @@ void SelectionDAGLegalize::LegalizeOp(SDNode *Node) {
case ISD::STRICT_FSETCCS:
case ISD::SETCC:
case ISD::SETCCCARRY:
- case ISD::VP_SETCC:
case ISD::BR_CC: {
unsigned Opc = Node->getOpcode();
- unsigned CCOperand = Opc == ISD::SELECT_CC ? 4
- : Opc == ISD::STRICT_FSETCC ? 3
- : Opc == ISD::STRICT_FSETCCS ? 3
- : Opc == ISD::SETCCCARRY ? 3
- : (Opc == ISD::SETCC || Opc == ISD::VP_SETCC) ? 2
- : 1;
+ unsigned CCOperand = Opc == ISD::SELECT_CC ? 4
+ : Opc == ISD::STRICT_FSETCC ? 3
+ : Opc == ISD::STRICT_FSETCCS ? 3
+ : Opc == ISD::SETCCCARRY ? 3
+ : Opc == ISD::SETCC ? 2
+ : 1;
unsigned CompareOperand = Opc == ISD::BR_CC ? 2
: Opc == ISD::STRICT_FSETCC ? 1
: Opc == ISD::STRICT_FSETCCS ? 1
@@ -4420,10 +4419,8 @@ bool SelectionDAGLegalize::ExpandNode(SDNode *Node) {
Results.push_back(Tmp1);
break;
case ISD::SETCC:
- case ISD::VP_SETCC:
case ISD::STRICT_FSETCC:
case ISD::STRICT_FSETCCS: {
- bool IsVP = Node->getOpcode() == ISD::VP_SETCC;
bool IsStrict = Node->getOpcode() == ISD::STRICT_FSETCC ||
Node->getOpcode() == ISD::STRICT_FSETCCS;
bool IsSignaling = Node->getOpcode() == ISD::STRICT_FSETCCS;
@@ -4432,14 +4429,9 @@ bool SelectionDAGLegalize::ExpandNode(SDNode *Node) {
Tmp1 = Node->getOperand(0 + Offset);
Tmp2 = Node->getOperand(1 + Offset);
Tmp3 = Node->getOperand(2 + Offset);
- SDValue Mask, EVL;
- if (IsVP) {
- Mask = Node->getOperand(3 + Offset);
- EVL = Node->getOperand(4 + Offset);
- }
- bool Legalized = TLI.LegalizeSetCCCondCode(
- DAG, Node->getValueType(0), Tmp1, Tmp2, Tmp3, Mask, EVL, NeedInvert, dl,
- Chain, IsSignaling);
+ bool Legalized =
+ TLI.LegalizeSetCCCondCode(DAG, Node->getValueType(0), Tmp1, Tmp2, Tmp3,
+ NeedInvert, dl, Chain, IsSignaling);
if (Legalized) {
// If we expanded the SETCC by swapping LHS and RHS, or by inverting the
@@ -4449,9 +4441,6 @@ bool SelectionDAGLegalize::ExpandNode(SDNode *Node) {
Tmp1 = DAG.getNode(Node->getOpcode(), dl, Node->getVTList(),
{Chain, Tmp1, Tmp2, Tmp3}, Node->getFlags());
Chain = Tmp1.getValue(1);
- } else if (IsVP) {
- Tmp1 = DAG.getNode(Node->getOpcode(), dl, Node->getValueType(0),
- {Tmp1, Tmp2, Tmp3, Mask, EVL}, Node->getFlags());
} else {
Tmp1 = DAG.getNode(Node->getOpcode(), dl, Node->getValueType(0), Tmp1,
Tmp2, Tmp3, Node->getFlags());
@@ -4461,11 +4450,7 @@ bool SelectionDAGLegalize::ExpandNode(SDNode *Node) {
// If we expanded the SETCC by inverting the condition code, then wrap
// the existing SETCC in a NOT to restore the intended condition.
if (NeedInvert) {
- if (!IsVP)
- Tmp1 = DAG.getLogicalNOT(dl, Tmp1, Tmp1->getValueType(0));
- else
- Tmp1 =
- DAG.getVPLogicalNOT(dl, Tmp1, Mask, EVL, Tmp1->getValueType(0));
+ Tmp1 = DAG.getLogicalNOT(dl, Tmp1, Tmp1->getValueType(0));
}
Results.push_back(Tmp1);
@@ -4481,7 +4466,6 @@ bool SelectionDAGLegalize::ExpandNode(SDNode *Node) {
// Otherwise, SETCC for the given comparison type must be completely
// illegal; expand it into a SELECT_CC.
- // FIXME: This drops the mask/evl for VP_SETCC.
EVT VT = Node->getValueType(0);
EVT Tmp1VT = Tmp1.getValueType();
Tmp1 = DAG.getNode(ISD::SELECT_CC, dl, VT, Tmp1, Tmp2,
@@ -4543,7 +4527,7 @@ bool SelectionDAGLegalize::ExpandNode(SDNode *Node) {
if (!Legalized) {
Legalized = TLI.LegalizeSetCCCondCode(
DAG, getSetCCResultType(Tmp1.getValueType()), Tmp1, Tmp2, CC,
- /*Mask*/ SDValue(), /*EVL*/ SDValue(), NeedInvert, dl, Chain);
+ NeedInvert, dl, Chain);
assert(Legalized && "Can't legalize SELECT_CC with legal condition!");
@@ -4575,9 +4559,9 @@ bool SelectionDAGLegalize::ExpandNode(SDNode *Node) {
Tmp3 = Node->getOperand(3); // RHS
Tmp4 = Node->getOperand(1); // CC
- bool Legalized = TLI.LegalizeSetCCCondCode(
- DAG, getSetCCResultType(Tmp2.getValueType()), Tmp2, Tmp3, Tmp4,
- /*Mask*/ SDValue(), /*EVL*/ SDValue(), NeedInvert, dl, Chain);
+ bool Legalized =
+ TLI.LegalizeSetCCCondCode(DAG, getSetCCResultType(Tmp2.getValueType()),
+ Tmp2, Tmp3, Tmp4, NeedInvert, dl, Chain);
(void)Legalized;
assert(Legalized && "Can't legalize BR_CC with legal condition!");
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
index 2f409a704d186..43e41ed39ca1d 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
@@ -60,22 +60,15 @@ void DAGTypeLegalizer::PromoteIntegerResult(SDNode *N, unsigned ResNo) {
case ISD::AssertSext: Res = PromoteIntRes_AssertSext(N); break;
case ISD::AssertZext: Res = PromoteIntRes_AssertZext(N); break;
case ISD::BITCAST: Res = PromoteIntRes_BITCAST(N); break;
- case ISD::VP_BITREVERSE:
case ISD::BITREVERSE: Res = PromoteIntRes_BITREVERSE(N); break;
- case ISD::VP_BSWAP:
case ISD::BSWAP: Res = PromoteIntRes_BSWAP(N); break;
case ISD::BUILD_PAIR: Res = PromoteIntRes_BUILD_PAIR(N); break;
case ISD::Constant: Res = PromoteIntRes_Constant(N); break;
- case ISD::VP_CTLZ_ZERO_POISON:
- case ISD::VP_CTLZ:
case ISD::CTLZ_ZERO_POISON:
case ISD::CTLZ: Res = PromoteIntRes_CTLZ(N); break;
case ISD::CTLS: Res = PromoteIntRes_CTLS(N); break;
case ISD::PARITY:
- case ISD::VP_CTPOP:
case ISD::CTPOP: Res = PromoteIntRes_CTPOP_PARITY(N); break;
- case ISD::VP_CTTZ_ZERO_POISON:
- case ISD::VP_CTTZ:
case ISD::CTTZ_ZERO_POISON:
case ISD::CTTZ: Res = PromoteIntRes_CTTZ(N); break;
case ISD::CTTZ_ELTS_ZERO_POISON:
@@ -99,7 +92,6 @@ void DAGTypeLegalizer::PromoteIntegerResult(SDNode *N, unsigned ResNo) {
break;
case ISD::SELECT:
case ISD::VSELECT:
- case ISD::VP_SELECT:
case ISD::VP_MERGE:
Res = PromoteIntRes_Select(N);
break;
@@ -112,15 +104,11 @@ void DAGTypeLegalizer::PromoteIntegerResult(SDNode *N, unsigned ResNo) {
case ISD::UMIN:
case ISD::UMAX: Res = PromoteIntRes_UMINUMAX(N); break;
- case ISD::SHL:
- case ISD::VP_SHL: Res = PromoteIntRes_SHL(N); break;
+ case ISD::SHL: Res = PromoteIntRes_SHL(N); break;
case ISD::SIGN_EXTEND_INREG:
Res = PromoteIntRes_SIGN_EXTEND_INREG(N); break;
- case ISD::SRA:
- case ISD::VP_SRA: Res = PromoteIntRes_SRA(N); break;
- case ISD::SRL:
- case ISD::VP_SRL: Res = PromoteIntRes_SRL(N); break;
- case ISD::VP_TRUNCATE:
+ case ISD::SRA: Res = PromoteIntRes_SRA(N); break;
+ case ISD::SRL: Res = PromoteIntRes_SRL(N); break;
case ISD::TRUNCATE: Res = PromoteIntRes_TRUNCATE(N); break;
case ISD::POISON:
case ISD::UNDEF: Res = PromoteIntRes_UNDEF(N); break;
@@ -179,13 +167,9 @@ void DAGTypeLegalizer::PromoteIntegerResult(SDNode *N, unsigned ResNo) {
break;
case ISD::SIGN_EXTEND:
- case ISD::VP_SIGN_EXTEND:
case ISD::ZERO_EXTEND:
- case ISD::VP_ZERO_EXTEND:
case ISD::ANY_EXTEND: Res = PromoteIntRes_INT_EXTEND(N); break;
- case ISD::VP_FP_TO_SINT:
- case ISD::VP_FP_TO_UINT:
case ISD::STRICT_FP_TO_SINT:
case ISD::STRICT_FP_TO_UINT:
case ISD::FP_TO_SINT:
@@ -213,29 +197,19 @@ void DAGTypeLegalizer::PromoteIntegerResult(SDNode *N, unsigned ResNo) {
case ISD::XOR:
case ISD::ADD:
case ISD::SUB:
- case ISD::MUL:
- case ISD::VP_AND:
- case ISD::VP_OR:
- case ISD::VP_XOR:
- case ISD::VP_ADD:
- case ISD::VP_SUB:
- case ISD::VP_MUL: Res = PromoteIntRes_SimpleIntBinOp(N); break;
+ case ISD::MUL: Res = PromoteIntRes_SimpleIntBinOp(N); break;
case ISD::ABDS:
case ISD::AVGCEILS:
case ISD::AVGFLOORS:
- case ISD::VP_SMIN:
- case ISD::VP_SMAX:
case ISD::SDIV:
case ISD::SREM:
case ISD::VP_SDIV:
- case ISD::VP_SREM: Res = PromoteIntRes_SExtIntBinOp(N); break;
+ case ISD::VP_SREM: Res = PromoteIntRes_SExtIntBinOp(N); break;
case ISD::ABDU:
case ISD::AVGCEILU:
case ISD::AVGFLOORU:
- case ISD::VP_UMIN:
- case ISD::VP_UMAX:
case ISD::UDIV:
case ISD::UREM:
case ISD::VP_UDIV:
@@ -271,13 +245,7 @@ void DAGTypeLegalizer::PromoteIntegerResult(SDNode *N, unsigned ResNo) {
case ISD::USUBSAT:
case ISD::SSHLSAT:
case ISD::USHLSAT:
- Res = PromoteIntRes_ADDSUBSHLSAT<EmptyMatchContext>(N);
- break;
- case ISD::VP_SADDSAT:
- case ISD::VP_UADDSAT:
- case ISD::VP_SSUBSAT:
- case ISD::VP_USUBSAT:
- Res = PromoteIntRes_ADDSUBSHLSAT<VPMatchContext>(N);
+ Res = PromoteIntRes_ADDSUBSHLSAT(N);
break;
case ISD::SCMP:
@@ -365,11 +333,6 @@ void DAGTypeLegalizer::PromoteIntegerResult(SDNode *N, unsigned ResNo) {
Res = PromoteIntRes_FunnelShift(N);
break;
- case ISD::VP_FSHL:
- case ISD::VP_FSHR:
- Res = PromoteIntRes_VPFunnelShift(N);
- break;
-
case ISD::CLMUL:
case ISD::CLMULH:
case ISD::CLMULR:
@@ -683,14 +646,8 @@ SDValue DAGTypeLegalizer::PromoteIntRes_BSWAP(SDNode *N) {
unsigned DiffBits = NVT.getScalarSizeInBits() - OVT.getScalarSizeInBits();
SDValue ShAmt = DAG.getShiftAmountConstant(DiffBits, NVT, dl);
- if (N->getOpcode() == ISD::BSWAP)
- return DAG.getNode(ISD::SRL, dl, NVT, DAG.getNode(ISD::BSWAP, dl, NVT, Op),
- ShAmt);
- SDValue Mask = N->getOperand(1);
- SDValue EVL = N->getOperand(2);
- return DAG.getNode(ISD::VP_SRL, dl, NVT,
- DAG.getNode(ISD::VP_BSWAP, dl, NVT, Op, Mask, EVL), ShAmt,
- Mask, EVL);
+ return DAG.getNode(ISD::SRL, dl, NVT, DAG.getNode(ISD::BSWAP, dl, NVT, Op),
+ ShAmt);
}
SDValue DAGTypeLegalizer::PromoteIntRes_BITREVERSE(SDNode *N) {
@@ -711,14 +668,8 @@ SDValue DAGTypeLegalizer::PromoteIntRes_BITREVERSE(SDNode *N) {
unsigned DiffBits = NVT.getScalarSizeInBits() - OVT.getScalarSizeInBits();
SDValue ShAmt = DAG.getShiftAmountConstant(DiffBits, NVT, dl);
- if (N->getOpcode() == ISD::BITREVERSE)
- return DAG.getNode(ISD::SRL, dl, NVT,
- DAG.getNode(ISD::BITREVERSE, dl, NVT, Op), ShAmt);
- SDValue Mask = N->getOperand(1);
- SDValue EVL = N->getOperand(2);
- return DAG.getNode(ISD::VP_SRL, dl, NVT,
- DAG.getNode(ISD::VP_BITREVERSE, dl, NVT, Op, Mask, EVL),
- ShAmt, Mask, EVL);
+ return DAG.getNode(ISD::SRL, dl, NVT,
+ DAG.getNode(ISD::BITREVERSE, dl, NVT, Op), ShAmt);
}
SDValue DAGTypeLegalizer::PromoteIntRes_BUILD_PAIR(SDNode *N) {
@@ -762,7 +713,7 @@ SDValue DAGTypeLegalizer::PromoteIntRes_CTLZ(SDNode *N) {
}
unsigned CtlzOpcode = N->getOpcode();
- if (CtlzOpcode == ISD::CTLZ || CtlzOpcode == ISD::VP_CTLZ) {
+ if (CtlzOpcode == ISD::CTLZ) {
// Subtract off the extra leading bits in the bigger type.
SDValue ExtractLeadingBits = DAG.getConstant(
NVT.getScalarSizeInBits() - OVT.getScalarSizeInBits(), dl, NVT);
@@ -771,34 +722,19 @@ SDValue DAGTypeLegalizer::PromoteIntRes_CTLZ(SDNode *N) {
// At this stage SUB is guaranteed to be positive no-wrap,
// that to be used in further KnownBits optimizations.
- if (!N->isVPOpcode())
- return DAG.getNode(ISD::SUB, dl, NVT,
- DAG.getNode(N->getOpcode(), dl, NVT, Op),
- ExtractLeadingBits, SDNodeFlags::NoUnsignedWrap);
- SDValue Mask = N->getOperand(1);
- SDValue EVL = N->getOperand(2);
- return DAG.getNode(ISD::VP_SUB, dl, NVT,
- DAG.getNode(N->getOpcode(), dl, NVT, Op, Mask, EVL),
- ExtractLeadingBits, Mask, EVL,
- SDNodeFlags::NoUnsignedWrap);
- }
- if (CtlzOpcode == ISD::CTLZ_ZERO_POISON ||
- CtlzOpcode == ISD::VP_CTLZ_ZERO_POISON) {
+ return DAG.getNode(ISD::SUB, dl, NVT,
+ DAG.getNode(N->getOpcode(), dl, NVT, Op),
+ ExtractLeadingBits, SDNodeFlags::NoUnsignedWrap);
+ }
+ if (CtlzOpcode == ISD::CTLZ_ZERO_POISON) {
// Any Extend the argument
SDValue Op = GetPromotedInteger(N->getOperand(0));
// Op = Op << (sizeinbits(NVT) - sizeinbits(Old VT))
unsigned SHLAmount = NVT.getScalarSizeInBits() - OVT.getScalarSizeInBits();
auto ShiftConst =
DAG.getShiftAmountConstant(SHLAmount, Op.getValueType(), dl);
- if (!N->isVPOpcode()) {
- Op = DAG.getNode(ISD::SHL, dl, NVT, Op, ShiftConst);
- return DAG.getNode(CtlzOpcode, dl, NVT, Op);
- }
-
- SDValue Mask = N->getOperand(1);
- SDValue EVL = N->getOperand(2);
- Op = DAG.getNode(ISD::VP_SHL, dl, NVT, Op, ShiftConst, Mask, EVL);
- return DAG.getNode(CtlzOpcode, dl, NVT, Op, Mask, EVL);
+ Op = DAG.getNode(ISD::SHL, dl, NVT, Op, ShiftConst);
+ return DAG.getNode(CtlzOpcode, dl, NVT, Op);
}
llvm_unreachable("Invalid CTLZ Opcode");
}
@@ -835,13 +771,7 @@ SDValue DAGTypeLegalizer::PromoteIntRes_CTPOP_PARITY(SDNode *N) {
// Zero extend to the promoted type and do the count or parity there.
SDValue Op = ZExtPromotedInteger(N->getOperand(0));
- if (!N->isVPOpcode())
- return DAG.getNode(N->getOpcode(), SDLoc(N), Op.getValueType(), Op);
-
- SDValue Mask = N->getOperand(1);
- SDValue EVL = N->getOperand(2);
- return DAG.getNode(N->getOpcode(), SDLoc(N), Op.getValueType(), Op, Mask,
- EVL);
+ return DAG.getNode(N->getOpcode(), SDLoc(N), Op.getValueType(), Op);
}
SDValue DAGTypeLegalizer::PromoteIntRes_CTTZ(SDNode *N) {
@@ -866,25 +796,16 @@ SDValue DAGTypeLegalizer::PromoteIntRes_CTTZ(SDNode *N) {
}
unsigned NewOpc = N->getOpcode();
- if (NewOpc == ISD::CTTZ || NewOpc == ISD::VP_CTTZ) {
+ if (NewOpc == ISD::CTTZ) {
// The count is the same in the promoted type except if the original
// value was zero. This can be handled by setting the bit just off
// the top of the original type.
auto TopBit = APInt::getOneBitSet(NVT.getScalarSizeInBits(),
OVT.getScalarSizeInBits());
- if (NewOpc == ISD::CTTZ) {
- Op = DAG.getNode(ISD::OR, dl, NVT, Op, DAG.getConstant(TopBit, dl, NVT));
- NewOpc = ISD::CTTZ_ZERO_POISON;
- } else {
- Op =
- DAG.getNode(ISD::VP_OR, dl, NVT, Op, DAG.getConstant(TopBit, dl, NVT),
- N->getOperand(1), N->getOperand(2));
- NewOpc = ISD::VP_CTTZ_ZERO_POISON;
- }
+ Op = DAG.getNode(ISD::OR, dl, NVT, Op, DAG.getConstant(TopBit, dl, NVT));
+ NewOpc = ISD::CTTZ_ZERO_POISON;
}
- if (!N->isVPOpcode())
- return DAG.getNode(NewOpc, dl, NVT, Op);
- return DAG.getNode(NewOpc, dl, NVT, Op, N->getOperand(1), N->getOperand(2));
+ return DAG.getNode(NewOpc, dl, NVT, Op);
}
SDValue DAGTypeLegalizer::PromoteIntRes_VP_CttzElements(SDNode *N) {
@@ -931,9 +852,6 @@ SDValue DAGTypeLegalizer::PromoteIntRes_FP_TO_XINT(SDNode *N) {
// Legalize the chain result - switch anything that used the old chain to
// use the new one.
ReplaceValueWith(SDValue(N, 1), Res.getValue(1));
- } else if (NewOpc == ISD::VP_FP_TO_SINT || NewOpc == ISD::VP_FP_TO_UINT) {
- Res = DAG.getNode(NewOpc, dl, NVT, {N->getOperand(0), N->getOperand(1),
- N->getOperand(2)});
} else {
Res = DAG.getNode(NewOpc, dl, NVT, N->getOperand(0));
}
@@ -946,8 +864,7 @@ SDValue DAGTypeLegalizer::PromoteIntRes_FP_TO_XINT(SDNode *N) {
// before legalization: fp-to-uint16, 65534. -> 0xfffe
// after legalization: fp-to-sint32, 65534. -> 0x0000fffe
return DAG.getNode((N->getOpcode() == ISD::FP_TO_UINT ||
- N->getOpcode() == ISD::STRICT_FP_TO_UINT ||
- N->getOpcode() == ISD::VP_FP_TO_UINT)
+ N->getOpcode() == ISD::STRICT_FP_TO_UINT)
? ISD::AssertZext
: ISD::AssertSext,
dl, NVT, Res,
@@ -1032,12 +949,6 @@ SDValue DAGTypeLegalizer::PromoteIntRes_INT_EXTEND(SDNode *N) {
}
// Otherwise, just extend the original operand all the way to the larger type.
- if (N->getNumOperands() != 1) {
- assert(N->getNumOperands() == 3 && "Unexpected number of operands!");
- assert(N->isVPOpcode() && "Expected VP opcode");
- return DAG.getNode(N->getOpcode(), dl, NVT, N->getOperand(0),
- N->getOperand(1), N->getOperand(2));
- }
return DAG.getNode(N->getOpcode(), dl, NVT, N->getOperand(0));
}
@@ -1148,7 +1059,6 @@ SDValue DAGTypeLegalizer::PromoteIntRes_Overflow(SDNode *N) {
return DAG.getBoolExtOrTrunc(Res.getValue(1), dl, NVT, VT);
}
-template <class MatchContextClass>
SDValue DAGTypeLegalizer::PromoteIntRes_ADDSUBSHLSAT(SDNode *N) {
// If the promoted type is legal, we can convert this to:
// 1. ANY_EXTEND iN to iM
@@ -1160,16 +1070,15 @@ SDValue DAGTypeLegalizer::PromoteIntRes_ADDSUBSHLSAT(SDNode *N) {
SDLoc dl(N);
SDValue Op1 = N->getOperand(0);
SDValue Op2 = N->getOperand(1);
- MatchContextClass matcher(DAG, TLI, N);
- unsigned Opcode = matcher.getRootBaseOpcode();
+ unsigned Opcode = N->getOpcode();
unsigned OldBits = Op1.getScalarValueSizeInBits();
// USUBSAT can always be promoted as long as we have zero/sign-extended the
// args.
if (Opcode == ISD::USUBSAT) {
SExtOrZExtPromotedOperands(Op1, Op2);
- return matcher.getNode(ISD::USUBSAT, dl, Op1.getValueType(), Op1, Op2);
+ return DAG.getNode(ISD::USUBSAT, dl, Op1.getValueType(), Op1, Op2);
}
if (Opcode == ISD::UADDSAT) {
@@ -1179,7 +1088,7 @@ SDValue DAGTypeLegalizer::PromoteIntRes_ADDSUBSHLSAT(SDNode *N) {
if (TLI.isSExtCheaperThanZExt(OVT, NVT)) {
Op1 = SExtPromotedInteger(Op1);
Op2 = SExtPromotedInteger(Op2);
- return matcher.getNode(ISD::UADDSAT, dl, NVT, Op1, Op2);
+ return DAG.getNode(ISD::UADDSAT, dl, NVT, Op1, Op2);
}
Op1 = ZExtPromotedInteger(Op1);
@@ -1187,8 +1096,8 @@ SDValue DAGTypeLegalizer::PromoteIntRes_ADDSUBSHLSAT(SDNode *N) {
unsigned NewBits = NVT.getScalarSizeInBits();
APInt MaxVal = APInt::getLowBitsSet(NewBits, OldBits);
SDValue SatMax = DAG.getConstant(MaxVal, dl, NVT);
- SDValue Add = matcher.getNode(ISD::ADD, dl, NVT, Op1, Op2);
- return matcher.getNode(ISD::UMIN, dl, NVT, Add, SatMax);
+ SDValue Add = DAG.getNode(ISD::ADD, dl, NVT, Op1, Op2);
+ return DAG.getNode(ISD::UMIN, dl, NVT, Add, SatMax);
}
bool IsShift = Opcode == ISD::USHLSAT || Opcode == ISD::SSHLSAT;
@@ -1207,7 +1116,7 @@ SDValue DAGTypeLegalizer::PromoteIntRes_ADDSUBSHLSAT(SDNode *N) {
// Shift cannot use a min/max expansion, we can't detect overflow if all of
// the bits have been shifted out.
- if (IsShift || matcher.isOperationLegal(Opcode, PromotedType)) {
+ if (IsShift || TLI.isOperationLegal(Opcode, PromotedType)) {
unsigned ShiftOp;
switch (Opcode) {
case ISD::SADDSAT:
@@ -1228,10 +1137,10 @@ SDValue DAGTypeLegalizer::PromoteIntRes_ADDSUBSHLSAT(SDNode *N) {
DAG.getShiftAmountConstant(SHLAmount, PromotedType, dl);
Op1 = DAG.getNode(ISD::SHL, dl, PromotedType, Op1, ShiftAmount);
if (!IsShift)
- Op2 = matcher.getNode(ISD::SHL, dl, PromotedType, Op2, ShiftAmount);
+ Op2 = DAG.getNode(ISD::SHL, dl, PromotedType, Op2, ShiftAmount);
- SDValue Result = matcher.getNode(Opcode, dl, PromotedType, Op1, Op2);
- return matcher.getNode(ShiftOp, dl, PromotedType, Result, ShiftAmount);
+ SDValue Result = DAG.getNode(Opcode, dl, PromotedType, Op1, Op2);
+ return DAG.getNode(ShiftOp, dl, PromotedType, Result, ShiftAmount);
}
unsigned AddOp = Opcode == ISD::SADDSAT ? ISD::ADD : ISD::SUB;
@@ -1239,9 +1148,9 @@ SDValue DAGTypeLegalizer::PromoteIntRes_ADDSUBSHLSAT(SDNode *N) {
APInt MaxVal = APInt::getSignedMaxValue(OldBits).sext(NewBits);
SDValue SatMin = DAG.getConstant(MinVal, dl, PromotedType);
SDValue SatMax = DAG.getConstant(MaxVal, dl, PromotedType);
- SDValue Result = matcher.getNode(AddOp, dl, PromotedType, Op1, Op2);
- Result = matcher.getNode(ISD::SMIN, dl, PromotedType, Result, SatMax);
- Result = matcher.getNode(ISD::SMAX, dl, PromotedType, Result, SatMin);
+ SDValue Result = DAG.getNode(AddOp, dl, PromotedType, Op1, Op2);
+ Result = DAG.getNode(ISD::SMIN, dl, PromotedType, Result, SatMax);
+ Result = DAG.getNode(ISD::SMAX, dl, PromotedType, Result, SatMin);
return Result;
}
@@ -1440,7 +1349,7 @@ SDValue DAGTypeLegalizer::PromoteIntRes_Select(SDNode *N) {
SDValue RHS = GetPromotedInteger(N->getOperand(2));
unsigned Opcode = N->getOpcode();
- if (Opcode == ISD::VP_SELECT || Opcode == ISD::VP_MERGE)
+ if (Opcode == ISD::VP_MERGE)
return DAG.getNode(Opcode, SDLoc(N), LHS.getValueType(), Mask, LHS, RHS,
N->getOperand(3));
return DAG.getNode(Opcode, SDLoc(N), LHS.getValueType(), Mask, LHS, RHS);
@@ -1521,13 +1430,7 @@ SDValue DAGTypeLegalizer::PromoteIntRes_SHL(SDNode *N) {
SDValue RHS = N->getOperand(1);
if (getTypeAction(RHS.getValueType()) == TargetLowering::TypePromoteInteger)
RHS = ZExtPromotedInteger(RHS);
- if (N->getOpcode() != ISD::VP_SHL)
- return DAG.getNode(N->getOpcode(), SDLoc(N), LHS.getValueType(), LHS, RHS);
-
- SDValue Mask = N->getOperand(2);
- SDValue EVL = N->getOperand(3);
- return DAG.getNode(N->getOpcode(), SDLoc(N), LHS.getValueType(), LHS, RHS,
- Mask, EVL);
+ return DAG.getNode(N->getOpcode(), SDLoc(N), LHS.getValueType(), LHS, RHS);
}
SDValue DAGTypeLegalizer::PromoteIntRes_SIGN_EXTEND_INREG(SDNode *N) {
@@ -1542,12 +1445,7 @@ SDValue DAGTypeLegalizer::PromoteIntRes_SimpleIntBinOp(SDNode *N) {
// that too is okay if they are integer operations.
SDValue LHS = GetPromotedInteger(N->getOperand(0));
SDValue RHS = GetPromotedInteger(N->getOperand(1));
- if (N->getNumOperands() == 2)
- return DAG.getNode(N->getOpcode(), SDLoc(N), LHS.getValueType(), LHS, RHS);
- assert(N->getNumOperands() == 4 && "Unexpected number of operands!");
- assert(N->isVPOpcode() && "Expected VP opcode");
- return DAG.getNode(N->getOpcode(), SDLoc(N), LHS.getValueType(), LHS, RHS,
- N->getOperand(2), N->getOperand(3));
+ return DAG.getNode(N->getOpcode(), SDLoc(N), LHS.getValueType(), LHS, RHS);
}
SDValue DAGTypeLegalizer::PromoteIntRes_SExtIntBinOp(SDNode *N) {
@@ -1557,7 +1455,8 @@ SDValue DAGTypeLegalizer::PromoteIntRes_SExtIntBinOp(SDNode *N) {
if (N->getNumOperands() == 2)
return DAG.getNode(N->getOpcode(), SDLoc(N), LHS.getValueType(), LHS, RHS);
assert(N->getNumOperands() == 4 && "Unexpected number of operands!");
- assert(N->isVPOpcode() && "Expected VP opcode");
+ assert((N->getOpcode() == ISD::VP_SDIV || N->getOpcode() == ISD::VP_SREM) &&
+ "Expected VP opcode");
SDValue Mask = N->getOperand(2);
SDValue EVL = N->getOperand(3);
return DAG.getNode(N->getOpcode(), SDLoc(N), LHS.getValueType(), LHS, RHS,
@@ -1571,7 +1470,8 @@ SDValue DAGTypeLegalizer::PromoteIntRes_ZExtIntBinOp(SDNode *N) {
if (N->getNumOperands() == 2)
return DAG.getNode(N->getOpcode(), SDLoc(N), LHS.getValueType(), LHS, RHS);
assert(N->getNumOperands() == 4 && "Unexpected number of operands!");
- assert(N->isVPOpcode() && "Expected VP opcode");
+ assert((N->getOpcode() == ISD::VP_UDIV || N->getOpcode() == ISD::VP_UREM) &&
+ "Expected VP opcode");
// Zero extend the input.
SDValue Mask = N->getOperand(2);
SDValue EVL = N->getOperand(3);
@@ -1613,13 +1513,7 @@ SDValue DAGTypeLegalizer::PromoteIntRes_SRA(SDNode *N) {
SDValue RHS = N->getOperand(1);
if (getTypeAction(RHS.getValueType()) == TargetLowering::TypePromoteInteger)
RHS = ZExtPromotedInteger(RHS);
- if (N->getOpcode() != ISD::VP_SRA)
- return DAG.getNode(N->getOpcode(), SDLoc(N), LHS.getValueType(), LHS, RHS);
-
- SDValue Mask = N->getOperand(2);
- SDValue EVL = N->getOperand(3);
- return DAG.getNode(N->getOpcode(), SDLoc(N), LHS.getValueType(), LHS, RHS,
- Mask, EVL);
+ return DAG.getNode(N->getOpcode(), SDLoc(N), LHS.getValueType(), LHS, RHS);
}
SDValue DAGTypeLegalizer::PromoteIntRes_SRL(SDNode *N) {
@@ -1628,13 +1522,7 @@ SDValue DAGTypeLegalizer::PromoteIntRes_SRL(SDNode *N) {
SDValue LHS = ZExtPromotedInteger(N->getOperand(0));
if (getTypeAction(RHS.getValueType()) == TargetLowering::TypePromoteInteger)
RHS = ZExtPromotedInteger(RHS);
- if (N->getOpcode() != ISD::VP_SRL)
- return DAG.getNode(N->getOpcode(), SDLoc(N), LHS.getValueType(), LHS, RHS);
-
- SDValue Mask = N->getOperand(2);
- SDValue EVL = N->getOperand(3);
- return DAG.getNode(N->getOpcode(), SDLoc(N), LHS.getValueType(), LHS, RHS,
- Mask, EVL);
+ return DAG.getNode(N->getOpcode(), SDLoc(N), LHS.getValueType(), LHS, RHS);
}
SDValue DAGTypeLegalizer::PromoteIntRes_Rotate(SDNode *N) {
@@ -1733,59 +1621,6 @@ SDValue DAGTypeLegalizer::PromoteIntRes_FunnelShift(SDNode *N) {
return DAG.getNode(Opcode, DL, VT, Hi, Lo, Amt);
}
-// A vp version of PromoteIntRes_FunnelShift.
-SDValue DAGTypeLegalizer::PromoteIntRes_VPFunnelShift(SDNode *N) {
- SDValue Hi = GetPromotedInteger(N->getOperand(0));
- SDValue Lo = GetPromotedInteger(N->getOperand(1));
- SDValue Amt = N->getOperand(2);
- SDValue Mask = N->getOperand(3);
- SDValue EVL = N->getOperand(4);
- if (getTypeAction(Amt.getValueType()) == TargetLowering::TypePromoteInteger)
- Amt = ZExtPromotedInteger(Amt);
- EVT AmtVT = Amt.getValueType();
-
- SDLoc DL(N);
- EVT OldVT = N->getOperand(0).getValueType();
- EVT VT = Lo.getValueType();
- unsigned Opcode = N->getOpcode();
- bool IsFSHR = Opcode == ISD::VP_FSHR;
- unsigned OldBits = OldVT.getScalarSizeInBits();
- unsigned NewBits = VT.getScalarSizeInBits();
-
- // Amount has to be interpreted modulo the old bit width.
- Amt = DAG.getNode(ISD::VP_UREM, DL, AmtVT, Amt,
- DAG.getConstant(OldBits, DL, AmtVT), Mask, EVL);
-
- // If the promoted type is twice the size (or more), then we use the
- // traditional funnel 'double' shift codegen. This isn't necessary if the
- // shift amount is constant.
- // fshl(x,y,z) -> (((aext(x) << bw) | zext(y)) << (z % bw)) >> bw.
- // fshr(x,y,z) -> (((aext(x) << bw) | zext(y)) >> (z % bw)).
- if (NewBits >= (2 * OldBits) && !isa<ConstantSDNode>(Amt) &&
- !TLI.isOperationLegalOrCustom(Opcode, VT)) {
- SDValue HiShift = DAG.getConstant(OldBits, DL, VT);
- Hi = DAG.getNode(ISD::VP_SHL, DL, VT, Hi, HiShift, Mask, EVL);
- Lo = DAG.getVPZeroExtendInReg(Lo, Mask, EVL, DL, OldVT);
- SDValue Res = DAG.getNode(ISD::VP_OR, DL, VT, Hi, Lo, Mask, EVL);
- Res = DAG.getNode(IsFSHR ? ISD::VP_SRL : ISD::VP_SHL, DL, VT, Res, Amt,
- Mask, EVL);
- if (!IsFSHR)
- Res = DAG.getNode(ISD::VP_SRL, DL, VT, Res, HiShift, Mask, EVL);
- return Res;
- }
-
- // Shift Lo up to occupy the upper bits of the promoted type.
- SDValue ShiftOffset = DAG.getConstant(NewBits - OldBits, DL, AmtVT);
- Lo = DAG.getNode(ISD::VP_SHL, DL, VT, Lo, ShiftOffset, Mask, EVL);
-
- // Increase Amount to shift the result into the lower bits of the promoted
- // type.
- if (IsFSHR)
- Amt = DAG.getNode(ISD::VP_ADD, DL, AmtVT, Amt, ShiftOffset, Mask, EVL);
-
- return DAG.getNode(Opcode, DL, VT, Hi, Lo, Amt, Mask, EVL);
-}
-
SDValue DAGTypeLegalizer::PromoteIntRes_CLMUL(SDNode *N) {
unsigned Opcode = N->getOpcode();
@@ -1888,23 +1723,10 @@ SDValue DAGTypeLegalizer::PromoteIntRes_TRUNCATE(SDNode *N) {
EVT HalfNVT = EVT::getVectorVT(*DAG.getContext(), NVT.getScalarType(),
NumElts.divideCoefficientBy(2));
- if (N->getOpcode() == ISD::TRUNCATE) {
- EOp1 = DAG.getNode(ISD::TRUNCATE, dl, HalfNVT, EOp1);
- EOp2 = DAG.getNode(ISD::TRUNCATE, dl, HalfNVT, EOp2);
- } else {
- assert(N->getOpcode() == ISD::VP_TRUNCATE &&
- "Expected VP_TRUNCATE opcode");
- SDValue MaskLo, MaskHi, EVLLo, EVLHi;
- std::tie(MaskLo, MaskHi) = SplitMask(N->getOperand(1));
- std::tie(EVLLo, EVLHi) =
- DAG.SplitEVL(N->getOperand(2), N->getValueType(0), dl);
- EOp1 = DAG.getNode(ISD::VP_TRUNCATE, dl, HalfNVT, EOp1, MaskLo, EVLLo);
- EOp2 = DAG.getNode(ISD::VP_TRUNCATE, dl, HalfNVT, EOp2, MaskHi, EVLHi);
- }
+ EOp1 = DAG.getNode(ISD::TRUNCATE, dl, HalfNVT, EOp1);
+ EOp2 = DAG.getNode(ISD::TRUNCATE, dl, HalfNVT, EOp2);
return DAG.getNode(ISD::CONCAT_VECTORS, dl, NVT, EOp1, EOp2);
}
- // TODO: VP_TRUNCATE need to handle when TypeWidenVector access to some
- // targets.
case TargetLowering::TypeWidenVector: {
SDValue WideInOp = GetWidenedVector(InOp);
@@ -1926,9 +1748,6 @@ SDValue DAGTypeLegalizer::PromoteIntRes_TRUNCATE(SDNode *N) {
}
// Truncate to NVT instead of VT
- if (N->getOpcode() == ISD::VP_TRUNCATE)
- return DAG.getNode(ISD::VP_TRUNCATE, dl, NVT, Res, N->getOperand(1),
- N->getOperand(2));
return DAG.getNode(ISD::TRUNCATE, dl, NVT, Res);
}
@@ -2177,11 +1996,8 @@ bool DAGTypeLegalizer::PromoteIntegerOperand(SDNode *N, unsigned OpNo) {
case ISD::VSELECT:
case ISD::SELECT: Res = PromoteIntOp_SELECT(N, OpNo); break;
case ISD::SELECT_CC: Res = PromoteIntOp_SELECT_CC(N, OpNo); break;
- case ISD::VP_SETCC:
case ISD::SETCC: Res = PromoteIntOp_SETCC(N, OpNo); break;
case ISD::SIGN_EXTEND: Res = PromoteIntOp_SIGN_EXTEND(N); break;
- case ISD::VP_SIGN_EXTEND: Res = PromoteIntOp_VP_SIGN_EXTEND(N); break;
- case ISD::VP_SINT_TO_FP:
case ISD::SINT_TO_FP: Res = PromoteIntOp_SINT_TO_FP(N); break;
case ISD::STRICT_SINT_TO_FP: Res = PromoteIntOp_STRICT_SINT_TO_FP(N); break;
case ISD::STORE: Res = PromoteIntOp_STORE(cast<StoreSDNode>(N),
@@ -2200,11 +2016,9 @@ bool DAGTypeLegalizer::PromoteIntegerOperand(SDNode *N, unsigned OpNo) {
case ISD::VECTOR_COMPRESS:
Res = PromoteIntOp_VECTOR_COMPRESS(N, OpNo);
break;
- case ISD::VP_TRUNCATE:
case ISD::TRUNCATE: Res = PromoteIntOp_TRUNCATE(N); break;
case ISD::BF16_TO_FP:
case ISD::FP16_TO_FP:
- case ISD::VP_UINT_TO_FP:
case ISD::UINT_TO_FP: Res = PromoteIntOp_UINT_TO_FP(N); break;
case ISD::CONVERT_FROM_ARBITRARY_FP:
Res = PromoteIntOp_CONVERT_FROM_ARBITRARY_FP(N);
@@ -2212,7 +2026,6 @@ bool DAGTypeLegalizer::PromoteIntegerOperand(SDNode *N, unsigned OpNo) {
case ISD::STRICT_FP16_TO_FP:
case ISD::STRICT_UINT_TO_FP: Res = PromoteIntOp_STRICT_UINT_TO_FP(N); break;
case ISD::ZERO_EXTEND: Res = PromoteIntOp_ZERO_EXTEND(N); break;
- case ISD::VP_ZERO_EXTEND: Res = PromoteIntOp_VP_ZERO_EXTEND(N); break;
case ISD::EXTRACT_SUBVECTOR: Res = PromoteIntOp_EXTRACT_SUBVECTOR(N); break;
case ISD::INSERT_SUBVECTOR: Res = PromoteIntOp_INSERT_SUBVECTOR(N); break;
@@ -2612,14 +2425,7 @@ SDValue DAGTypeLegalizer::PromoteIntOp_SETCC(SDNode *N, unsigned OpNo) {
PromoteSetCCOperands(LHS, RHS, cast<CondCodeSDNode>(N->getOperand(2))->get());
// The CC (#2) is always legal.
- if (N->getOpcode() == ISD::SETCC)
- return SDValue(DAG.UpdateNodeOperands(N, LHS, RHS, N->getOperand(2)), 0);
-
- assert(N->getOpcode() == ISD::VP_SETCC && "Expected VP_SETCC opcode");
-
- return SDValue(DAG.UpdateNodeOperands(N, LHS, RHS, N->getOperand(2),
- N->getOperand(3), N->getOperand(4)),
- 0);
+ return SDValue(DAG.UpdateNodeOperands(N, LHS, RHS, N->getOperand(2)), 0);
}
SDValue DAGTypeLegalizer::PromoteIntOp_Shift(SDNode *N) {
@@ -2654,29 +2460,7 @@ SDValue DAGTypeLegalizer::PromoteIntOp_SIGN_EXTEND(SDNode *N) {
Op, DAG.getValueType(N->getOperand(0).getValueType()));
}
-SDValue DAGTypeLegalizer::PromoteIntOp_VP_SIGN_EXTEND(SDNode *N) {
- SDLoc dl(N);
- EVT VT = N->getValueType(0);
- SDValue Op = GetPromotedInteger(N->getOperand(0));
- // FIXME: There is no VP_ANY_EXTEND yet.
- Op = DAG.getNode(ISD::VP_ZERO_EXTEND, dl, VT, Op, N->getOperand(1),
- N->getOperand(2));
- unsigned Diff =
- VT.getScalarSizeInBits() - N->getOperand(0).getScalarValueSizeInBits();
- SDValue ShAmt = DAG.getShiftAmountConstant(Diff, VT, dl);
- // FIXME: There is no VP_SIGN_EXTEND_INREG so use a pair of shifts.
- SDValue Shl = DAG.getNode(ISD::VP_SHL, dl, VT, Op, ShAmt, N->getOperand(1),
- N->getOperand(2));
- return DAG.getNode(ISD::VP_SRA, dl, VT, Shl, ShAmt, N->getOperand(1),
- N->getOperand(2));
-}
-
SDValue DAGTypeLegalizer::PromoteIntOp_SINT_TO_FP(SDNode *N) {
- if (N->getOpcode() == ISD::VP_SINT_TO_FP)
- return SDValue(DAG.UpdateNodeOperands(N,
- SExtPromotedInteger(N->getOperand(0)),
- N->getOperand(1), N->getOperand(2)),
- 0);
return SDValue(DAG.UpdateNodeOperands(N,
SExtPromotedInteger(N->getOperand(0))), 0);
}
@@ -2817,18 +2601,10 @@ SDValue DAGTypeLegalizer::PromoteIntOp_VECTOR_COMPRESS(SDNode *N,
SDValue DAGTypeLegalizer::PromoteIntOp_TRUNCATE(SDNode *N) {
SDValue Op = GetPromotedInteger(N->getOperand(0));
- if (N->getOpcode() == ISD::VP_TRUNCATE)
- return DAG.getNode(ISD::VP_TRUNCATE, SDLoc(N), N->getValueType(0), Op,
- N->getOperand(1), N->getOperand(2));
return DAG.getNode(ISD::TRUNCATE, SDLoc(N), N->getValueType(0), Op);
}
SDValue DAGTypeLegalizer::PromoteIntOp_UINT_TO_FP(SDNode *N) {
- if (N->getOpcode() == ISD::VP_UINT_TO_FP)
- return SDValue(DAG.UpdateNodeOperands(N,
- ZExtPromotedInteger(N->getOperand(0)),
- N->getOperand(1), N->getOperand(2)),
- 0);
return SDValue(DAG.UpdateNodeOperands(N,
ZExtPromotedInteger(N->getOperand(0))), 0);
}
@@ -2864,17 +2640,6 @@ SDValue DAGTypeLegalizer::PromoteIntOp_ZERO_EXTEND(SDNode *N) {
return DAG.getZeroExtendInReg(Op, dl, Src.getValueType());
}
-SDValue DAGTypeLegalizer::PromoteIntOp_VP_ZERO_EXTEND(SDNode *N) {
- SDLoc dl(N);
- EVT VT = N->getValueType(0);
- SDValue Op = GetPromotedInteger(N->getOperand(0));
- // FIXME: There is no VP_ANY_EXTEND yet.
- Op = DAG.getNode(ISD::VP_ZERO_EXTEND, dl, VT, Op, N->getOperand(1),
- N->getOperand(2));
- return DAG.getVPZeroExtendInReg(Op, N->getOperand(1), N->getOperand(2), dl,
- N->getOperand(0).getValueType());
-}
-
SDValue DAGTypeLegalizer::PromoteIntOp_FIX(SDNode *N) {
SDValue Op2 = ZExtPromotedInteger(N->getOperand(2));
return SDValue(
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
index ab252f5db2dcf..bc52b8357582c 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
@@ -15,7 +15,6 @@
#ifndef LLVM_LIB_CODEGEN_SELECTIONDAG_LEGALIZETYPES_H
#define LLVM_LIB_CODEGEN_SELECTIONDAG_LEGALIZETYPES_H
-#include "MatchContext.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/CodeGen/SelectionDAG.h"
#include "llvm/CodeGen/TargetLowering.h"
@@ -348,7 +347,6 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
SDValue PromoteIntRes_VAARG(SDNode *N);
SDValue PromoteIntRes_VSCALE(SDNode *N);
SDValue PromoteIntRes_XMULO(SDNode *N, unsigned ResNo);
- template <class MatchContextClass>
SDValue PromoteIntRes_ADDSUBSHLSAT(SDNode *N);
SDValue PromoteIntRes_MULFIX(SDNode *N);
SDValue PromoteIntRes_DIVFIX(SDNode *N);
@@ -358,7 +356,6 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
SDValue PromoteIntRes_ABS(SDNode *N);
SDValue PromoteIntRes_Rotate(SDNode *N);
SDValue PromoteIntRes_FunnelShift(SDNode *N);
- SDValue PromoteIntRes_VPFunnelShift(SDNode *N);
SDValue PromoteIntRes_CLMUL(SDNode *N);
SDValue PromoteIntRes_PEXT(SDNode *N);
SDValue PromoteIntRes_PDEP(SDNode *N);
@@ -396,7 +393,6 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
SDValue PromoteIntOp_CMP(SDNode *N);
SDValue PromoteIntOp_FunnelShift(SDNode *N);
SDValue PromoteIntOp_SIGN_EXTEND(SDNode *N);
- SDValue PromoteIntOp_VP_SIGN_EXTEND(SDNode *N);
SDValue PromoteIntOp_SINT_TO_FP(SDNode *N);
SDValue PromoteIntOp_STRICT_SINT_TO_FP(SDNode *N);
SDValue PromoteIntOp_STORE(StoreSDNode *N, unsigned OpNo);
@@ -405,7 +401,6 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
SDValue PromoteIntOp_STRICT_UINT_TO_FP(SDNode *N);
SDValue PromoteIntOp_CONVERT_FROM_ARBITRARY_FP(SDNode *N);
SDValue PromoteIntOp_ZERO_EXTEND(SDNode *N);
- SDValue PromoteIntOp_VP_ZERO_EXTEND(SDNode *N);
SDValue PromoteIntOp_MSTORE(MaskedStoreSDNode *N, unsigned OpNo);
SDValue PromoteIntOp_MLOAD(MaskedLoadSDNode *N, unsigned OpNo);
SDValue PromoteIntOp_MSCATTER(MaskedScatterSDNode *N, unsigned OpNo);
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp
index 0cff883f83186..8c252c3491540 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp
@@ -555,7 +555,7 @@ void DAGTypeLegalizer::SplitRes_Select(SDNode *N, SDValue &Lo, SDValue &Hi) {
std::tie(CL, CH) = DAG.SplitVector(Cond, dl);
}
- if (Opcode != ISD::VP_SELECT && Opcode != ISD::VP_MERGE) {
+ if (Opcode != ISD::VP_MERGE) {
Lo = DAG.getNode(Opcode, dl, LL.getValueType(), CL, LL, RL);
Hi = DAG.getNode(Opcode, dl, LH.getValueType(), CH, LH, RH);
return;
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp
index f85e6e58b88c8..787f2683080e2 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp
@@ -132,12 +132,8 @@ class VectorLegalizer {
/// Implement vselect in terms of XOR, AND, OR when blend is not
/// supported by the target.
SDValue ExpandVSELECT(SDNode *Node);
- SDValue ExpandVP_SELECT(SDNode *Node);
SDValue ExpandVP_MERGE(SDNode *Node);
SDValue ExpandVP_REM(SDNode *Node);
- SDValue ExpandVP_FNEG(SDNode *Node);
- SDValue ExpandVP_FABS(SDNode *Node);
- SDValue ExpandVP_FCOPYSIGN(SDNode *Node);
SDValue ExpandLOOP_DEPENDENCE_MASK(SDNode *N);
SDValue ExpandMaskedBinOp(SDNode *N);
SDValue ExpandSELECT(SDNode *Node);
@@ -558,12 +554,6 @@ SDValue VectorLegalizer::LegalizeOp(SDValue Op) {
case ISD::VPID: { \
EVT LegalizeVT = LEGALPOS < 0 ? Node->getValueType(-(1 + LEGALPOS)) \
: Node->getOperand(LEGALPOS).getValueType(); \
- if (ISD::VPID == ISD::VP_SETCC) { \
- ISD::CondCode CCCode = cast<CondCodeSDNode>(Node->getOperand(2))->get(); \
- Action = TLI.getCondCodeAction(CCCode, LegalizeVT.getSimpleVT()); \
- if (Action != TargetLowering::Legal) \
- break; \
- } \
/* Defer non-vector results to LegalizeDAG. */ \
if (!Node->getValueType(0).isVector() && \
Node->getValueType(0) != MVT::Other) { \
@@ -654,11 +644,6 @@ void VectorLegalizer::PromoteSETCC(SDNode *Node,
Operands[1] = DAG.getNode(ExtOp, DL, NewVecVT, Node->getOperand(1));
Operands[2] = Node->getOperand(2);
- if (Node->getOpcode() == ISD::VP_SETCC) {
- Operands[3] = Node->getOperand(3); // mask
- Operands[4] = Node->getOperand(4); // evl
- }
-
EVT ResVT =
TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), NewVecVT);
SDValue Res =
@@ -772,7 +757,6 @@ void VectorLegalizer::Promote(SDNode *Node, SmallVectorImpl<SDValue> &Results) {
// Promote the operation by extending the operand.
PromoteFP_TO_INT(Node, Results);
return;
- case ISD::VP_SETCC:
case ISD::SETCC:
// Promote the operation by extending the operand.
PromoteSETCC(Node, Results);
@@ -804,11 +788,6 @@ void VectorLegalizer::Promote(SDNode *Node, SmallVectorImpl<SDValue> &Results) {
// These operations are used to do promotion so they can't be promoted
// themselves.
llvm_unreachable("Don't know how to promote this operation!");
- case ISD::VP_FABS:
- case ISD::VP_FCOPYSIGN:
- case ISD::VP_FNEG:
- // Promoting fabs, fneg, and fcopysign changes their semantics.
- llvm_unreachable("These operations should not be promoted");
}
// There are currently two cases of vector promotion:
@@ -833,17 +812,7 @@ void VectorLegalizer::Promote(SDNode *Node, SmallVectorImpl<SDValue> &Results) {
.getVectorElementType()
.isFloatingPoint() &&
NVT.isVector() && NVT.getVectorElementType().isFloatingPoint())
- if (ISD::isVPOpcode(Node->getOpcode())) {
- unsigned EVLIdx =
- *ISD::getVPExplicitVectorLengthIdx(Node->getOpcode());
- unsigned MaskIdx = *ISD::getVPMaskIdx(Node->getOpcode());
- Operands[j] =
- DAG.getNode(ISD::VP_FP_EXTEND, dl, NVT, Node->getOperand(j),
- Node->getOperand(MaskIdx), Node->getOperand(EVLIdx));
- } else {
- Operands[j] =
- DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(j));
- }
+ Operands[j] = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(j));
else
Operands[j] = DAG.getNode(ISD::BITCAST, dl, NVT, Node->getOperand(j));
else
@@ -856,15 +825,8 @@ void VectorLegalizer::Promote(SDNode *Node, SmallVectorImpl<SDValue> &Results) {
if ((VT.isFloatingPoint() && NVT.isFloatingPoint()) ||
(VT.isVector() && VT.getVectorElementType().isFloatingPoint() &&
NVT.isVector() && NVT.getVectorElementType().isFloatingPoint()))
- if (ISD::isVPOpcode(Node->getOpcode())) {
- unsigned EVLIdx = *ISD::getVPExplicitVectorLengthIdx(Node->getOpcode());
- unsigned MaskIdx = *ISD::getVPMaskIdx(Node->getOpcode());
- Res = DAG.getNode(ISD::VP_FP_ROUND, dl, VT, Res,
- Node->getOperand(MaskIdx), Node->getOperand(EVLIdx));
- } else {
- Res = DAG.getNode(ISD::FP_ROUND, dl, VT, Res,
- DAG.getIntPtrConstant(0, dl, /*isTarget=*/true));
- }
+ Res = DAG.getNode(ISD::FP_ROUND, dl, VT, Res,
+ DAG.getIntPtrConstant(0, dl, /*isTarget=*/true));
else
Res = DAG.getNode(ISD::BITCAST, dl, VT, Res);
@@ -1004,21 +966,12 @@ void VectorLegalizer::Expand(SDNode *Node, SmallVectorImpl<SDValue> &Results) {
return;
}
break;
- case ISD::VP_BSWAP:
- Results.push_back(TLI.expandVPBSWAP(Node, DAG));
- return;
case ISD::VSELECT:
if (SDValue Expanded = ExpandVSELECT(Node)) {
Results.push_back(Expanded);
return;
}
break;
- case ISD::VP_SELECT:
- if (SDValue Expanded = ExpandVP_SELECT(Node)) {
- Results.push_back(Expanded);
- return;
- }
- break;
case ISD::VP_SREM:
case ISD::VP_UREM:
if (SDValue Expanded = ExpandVP_REM(Node)) {
@@ -1026,24 +979,6 @@ void VectorLegalizer::Expand(SDNode *Node, SmallVectorImpl<SDValue> &Results) {
return;
}
break;
- case ISD::VP_FNEG:
- if (SDValue Expanded = ExpandVP_FNEG(Node)) {
- Results.push_back(Expanded);
- return;
- }
- break;
- case ISD::VP_FABS:
- if (SDValue Expanded = ExpandVP_FABS(Node)) {
- Results.push_back(Expanded);
- return;
- }
- break;
- case ISD::VP_FCOPYSIGN:
- if (SDValue Expanded = ExpandVP_FCOPYSIGN(Node)) {
- Results.push_back(Expanded);
- return;
- }
- break;
case ISD::SELECT:
if (SDValue Expanded = ExpandSELECT(Node)) {
Results.push_back(Expanded);
@@ -1107,7 +1042,6 @@ void VectorLegalizer::Expand(SDNode *Node, SmallVectorImpl<SDValue> &Results) {
ExpandFSUB(Node, Results);
return;
case ISD::SETCC:
- case ISD::VP_SETCC:
ExpandSETCC(Node, Results);
return;
case ISD::ABS:
@@ -1139,24 +1073,12 @@ void VectorLegalizer::Expand(SDNode *Node, SmallVectorImpl<SDValue> &Results) {
return;
}
break;
- case ISD::VP_BITREVERSE:
- if (SDValue Expanded = TLI.expandVPBITREVERSE(Node, DAG)) {
- Results.push_back(Expanded);
- return;
- }
- break;
case ISD::CTPOP:
if (SDValue Expanded = TLI.expandCTPOP(Node, DAG)) {
Results.push_back(Expanded);
return;
}
break;
- case ISD::VP_CTPOP:
- if (SDValue Expanded = TLI.expandVPCTPOP(Node, DAG)) {
- Results.push_back(Expanded);
- return;
- }
- break;
case ISD::CTLZ:
case ISD::CTLZ_ZERO_POISON:
if (SDValue Expanded = TLI.expandCTLZ(Node, DAG)) {
@@ -1164,13 +1086,6 @@ void VectorLegalizer::Expand(SDNode *Node, SmallVectorImpl<SDValue> &Results) {
return;
}
break;
- case ISD::VP_CTLZ:
- case ISD::VP_CTLZ_ZERO_POISON:
- if (SDValue Expanded = TLI.expandVPCTLZ(Node, DAG)) {
- Results.push_back(Expanded);
- return;
- }
- break;
case ISD::CTTZ:
case ISD::CTTZ_ZERO_POISON:
if (SDValue Expanded = TLI.expandCTTZ(Node, DAG)) {
@@ -1178,17 +1093,8 @@ void VectorLegalizer::Expand(SDNode *Node, SmallVectorImpl<SDValue> &Results) {
return;
}
break;
- case ISD::VP_CTTZ:
- case ISD::VP_CTTZ_ZERO_POISON:
- if (SDValue Expanded = TLI.expandVPCTTZ(Node, DAG)) {
- Results.push_back(Expanded);
- return;
- }
- break;
case ISD::FSHL:
- case ISD::VP_FSHL:
case ISD::FSHR:
- case ISD::VP_FSHR:
if (SDValue Expanded = TLI.expandFunnelShift(Node, DAG)) {
Results.push_back(Expanded);
return;
@@ -1758,37 +1664,6 @@ SDValue VectorLegalizer::ExpandVSELECT(SDNode *Node) {
return DAG.getNode(ISD::BITCAST, DL, Node->getValueType(0), Val);
}
-SDValue VectorLegalizer::ExpandVP_SELECT(SDNode *Node) {
- // Implement VP_SELECT in terms of VP_XOR, VP_AND and VP_OR on platforms which
- // do not support it natively.
- SDLoc DL(Node);
-
- SDValue Mask = Node->getOperand(0);
- SDValue Op1 = Node->getOperand(1);
- SDValue Op2 = Node->getOperand(2);
- SDValue EVL = Node->getOperand(3);
-
- EVT VT = Mask.getValueType();
-
- // If we can't even use the basic vector operations of
- // VP_AND,VP_OR,VP_XOR, we will have to scalarize the op.
- if (TLI.getOperationAction(ISD::VP_AND, VT) == TargetLowering::Expand ||
- TLI.getOperationAction(ISD::VP_XOR, VT) == TargetLowering::Expand ||
- TLI.getOperationAction(ISD::VP_OR, VT) == TargetLowering::Expand)
- return SDValue();
-
- // This operation also isn't safe when the operands aren't also booleans.
- if (Op1.getValueType().getVectorElementType() != MVT::i1)
- return SDValue();
-
- SDValue Ones = DAG.getAllOnesConstant(DL, VT);
- SDValue NotMask = DAG.getNode(ISD::VP_XOR, DL, VT, Mask, Ones, Ones, EVL);
-
- Op1 = DAG.getNode(ISD::VP_AND, DL, VT, Op1, Mask, Ones, EVL);
- Op2 = DAG.getNode(ISD::VP_AND, DL, VT, Op2, NotMask, Ones, EVL);
- return DAG.getNode(ISD::VP_OR, DL, VT, Op1, Op2, Ones, EVL);
-}
-
SDValue VectorLegalizer::ExpandVP_MERGE(SDNode *Node) {
// Implement VP_MERGE in terms of VSELECT. Construct a mask where vector
// indices less than the EVL/pivot are true. Combine that with the original
@@ -1854,77 +1729,6 @@ SDValue VectorLegalizer::ExpandVP_REM(SDNode *Node) {
return DAG.getNode(ISD::SUB, DL, VT, Dividend, Mul);
}
-SDValue VectorLegalizer::ExpandVP_FNEG(SDNode *Node) {
- EVT VT = Node->getValueType(0);
- EVT IntVT = VT.changeVectorElementTypeToInteger();
-
- if (!TLI.isOperationLegalOrCustom(ISD::VP_XOR, IntVT))
- return SDValue();
-
- SDValue Mask = Node->getOperand(1);
- SDValue EVL = Node->getOperand(2);
-
- SDLoc DL(Node);
- SDValue Cast = DAG.getNode(ISD::BITCAST, DL, IntVT, Node->getOperand(0));
- SDValue SignMask = DAG.getConstant(
- APInt::getSignMask(IntVT.getScalarSizeInBits()), DL, IntVT);
- SDValue Xor = DAG.getNode(ISD::VP_XOR, DL, IntVT, Cast, SignMask, Mask, EVL);
- return DAG.getNode(ISD::BITCAST, DL, VT, Xor);
-}
-
-SDValue VectorLegalizer::ExpandVP_FABS(SDNode *Node) {
- EVT VT = Node->getValueType(0);
- EVT IntVT = VT.changeVectorElementTypeToInteger();
-
- if (!TLI.isOperationLegalOrCustom(ISD::VP_AND, IntVT))
- return SDValue();
-
- SDValue Mask = Node->getOperand(1);
- SDValue EVL = Node->getOperand(2);
-
- SDLoc DL(Node);
- SDValue Cast = DAG.getNode(ISD::BITCAST, DL, IntVT, Node->getOperand(0));
- SDValue ClearSignMask = DAG.getConstant(
- APInt::getSignedMaxValue(IntVT.getScalarSizeInBits()), DL, IntVT);
- SDValue ClearSign =
- DAG.getNode(ISD::VP_AND, DL, IntVT, Cast, ClearSignMask, Mask, EVL);
- return DAG.getNode(ISD::BITCAST, DL, VT, ClearSign);
-}
-
-SDValue VectorLegalizer::ExpandVP_FCOPYSIGN(SDNode *Node) {
- EVT VT = Node->getValueType(0);
-
- if (VT != Node->getOperand(1).getValueType())
- return SDValue();
-
- EVT IntVT = VT.changeVectorElementTypeToInteger();
- if (!TLI.isOperationLegalOrCustom(ISD::VP_AND, IntVT) ||
- !TLI.isOperationLegalOrCustom(ISD::VP_XOR, IntVT))
- return SDValue();
-
- SDValue Mask = Node->getOperand(2);
- SDValue EVL = Node->getOperand(3);
-
- SDLoc DL(Node);
- SDValue Mag = DAG.getNode(ISD::BITCAST, DL, IntVT, Node->getOperand(0));
- SDValue Sign = DAG.getNode(ISD::BITCAST, DL, IntVT, Node->getOperand(1));
-
- SDValue SignMask = DAG.getConstant(
- APInt::getSignMask(IntVT.getScalarSizeInBits()), DL, IntVT);
- SDValue SignBit =
- DAG.getNode(ISD::VP_AND, DL, IntVT, Sign, SignMask, Mask, EVL);
-
- SDValue ClearSignMask = DAG.getConstant(
- APInt::getSignedMaxValue(IntVT.getScalarSizeInBits()), DL, IntVT);
- SDValue ClearedSign =
- DAG.getNode(ISD::VP_AND, DL, IntVT, Mag, ClearSignMask, Mask, EVL);
-
- SDValue CopiedSign = DAG.getNode(ISD::VP_OR, DL, IntVT, ClearedSign, SignBit,
- Mask, EVL, SDNodeFlags::Disjoint);
-
- return DAG.getNode(ISD::BITCAST, DL, VT, CopiedSign);
-}
-
SDValue VectorLegalizer::ExpandLOOP_DEPENDENCE_MASK(SDNode *N) {
return TLI.expandLoopDependenceMask(N, DAG);
}
@@ -2215,7 +2019,6 @@ void VectorLegalizer::ExpandFSUB(SDNode *Node,
void VectorLegalizer::ExpandSETCC(SDNode *Node,
SmallVectorImpl<SDValue> &Results) {
bool NeedInvert = false;
- bool IsVP = Node->getOpcode() == ISD::VP_SETCC;
bool IsStrict = Node->getOpcode() == ISD::STRICT_FSETCC ||
Node->getOpcode() == ISD::STRICT_FSETCCS;
bool IsSignaling = Node->getOpcode() == ISD::STRICT_FSETCCS;
@@ -2238,16 +2041,10 @@ void VectorLegalizer::ExpandSETCC(SDNode *Node,
return;
}
- SDValue Mask, EVL;
- if (IsVP) {
- Mask = Node->getOperand(3 + Offset);
- EVL = Node->getOperand(4 + Offset);
- }
-
SDLoc dl(Node);
bool Legalized =
- TLI.LegalizeSetCCCondCode(DAG, Node->getValueType(0), LHS, RHS, CC, Mask,
- EVL, NeedInvert, dl, Chain, IsSignaling);
+ TLI.LegalizeSetCCCondCode(DAG, Node->getValueType(0), LHS, RHS, CC,
+ NeedInvert, dl, Chain, IsSignaling);
if (Legalized) {
// If we expanded the SETCC by swapping LHS and RHS, or by inverting the
@@ -2257,9 +2054,6 @@ void VectorLegalizer::ExpandSETCC(SDNode *Node,
LHS = DAG.getNode(Node->getOpcode(), dl, Node->getVTList(),
{Chain, LHS, RHS, CC}, Node->getFlags());
Chain = LHS.getValue(1);
- } else if (IsVP) {
- LHS = DAG.getNode(ISD::VP_SETCC, dl, Node->getValueType(0),
- {LHS, RHS, CC, Mask, EVL}, Node->getFlags());
} else {
LHS = DAG.getNode(ISD::SETCC, dl, Node->getValueType(0), LHS, RHS, CC,
Node->getFlags());
@@ -2268,12 +2062,8 @@ void VectorLegalizer::ExpandSETCC(SDNode *Node,
// If we expanded the SETCC by inverting the condition code, then wrap
// the existing SETCC in a NOT to restore the intended condition.
- if (NeedInvert) {
- if (!IsVP)
- LHS = DAG.getLogicalNOT(dl, LHS, LHS->getValueType(0));
- else
- LHS = DAG.getVPLogicalNOT(dl, LHS, Mask, EVL, LHS->getValueType(0));
- }
+ if (NeedInvert)
+ LHS = DAG.getLogicalNOT(dl, LHS, LHS->getValueType(0));
} else {
assert(!IsStrict && "Don't know how to expand for strict nodes.");
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
index 3417c9734af3b..35ab9c930213d 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
@@ -1396,8 +1396,7 @@ void DAGTypeLegalizer::SplitVectorResult(SDNode *N, unsigned ResNo) {
case ISD::AssertSext: SplitVecRes_AssertSext(N, Lo, Hi); break;
case ISD::VSELECT:
case ISD::SELECT:
- case ISD::VP_MERGE:
- case ISD::VP_SELECT: SplitRes_Select(N, Lo, Hi); break;
+ case ISD::VP_MERGE: SplitRes_Select(N, Lo, Hi); break;
case ISD::SELECT_CC: SplitRes_SELECT_CC(N, Lo, Hi); break;
case ISD::POISON:
case ISD::UNDEF: SplitRes_UNDEF(N, Lo, Hi); break;
@@ -1445,7 +1444,6 @@ void DAGTypeLegalizer::SplitVectorResult(SDNode *N, unsigned ResNo) {
SplitVecRes_VECTOR_COMPRESS(N, Lo, Hi);
break;
case ISD::SETCC:
- case ISD::VP_SETCC:
SplitVecRes_SETCC(N, Lo, Hi);
break;
case ISD::VECTOR_REVERSE:
@@ -1476,75 +1474,51 @@ void DAGTypeLegalizer::SplitVectorResult(SDNode *N, unsigned ResNo) {
case ISD::ABS:
case ISD::ABS_MIN_POISON:
- case ISD::VP_ABS:
case ISD::BITREVERSE:
- case ISD::VP_BITREVERSE:
case ISD::BSWAP:
- case ISD::VP_BSWAP:
case ISD::CTLZ:
- case ISD::VP_CTLZ:
case ISD::CTTZ:
- case ISD::VP_CTTZ:
case ISD::CTLZ_ZERO_POISON:
- case ISD::VP_CTLZ_ZERO_POISON:
case ISD::CTTZ_ZERO_POISON:
- case ISD::VP_CTTZ_ZERO_POISON:
case ISD::CTPOP:
- case ISD::VP_CTPOP:
- case ISD::FABS: case ISD::VP_FABS:
+ case ISD::FABS:
case ISD::FACOS:
case ISD::FASIN:
case ISD::FATAN:
case ISD::FCEIL:
- case ISD::VP_FCEIL:
case ISD::FCOS:
case ISD::FCOSH:
case ISD::FEXP:
case ISD::FEXP2:
case ISD::FEXP10:
case ISD::FFLOOR:
- case ISD::VP_FFLOOR:
case ISD::FLOG:
case ISD::FLOG10:
case ISD::FLOG2:
case ISD::FNEARBYINT:
- case ISD::VP_FNEARBYINT:
- case ISD::FNEG: case ISD::VP_FNEG:
+ case ISD::FNEG:
case ISD::FREEZE:
case ISD::ARITH_FENCE:
case ISD::FP_EXTEND:
- case ISD::VP_FP_EXTEND:
case ISD::FP_ROUND:
- case ISD::VP_FP_ROUND:
case ISD::FP_TO_SINT:
- case ISD::VP_FP_TO_SINT:
case ISD::FP_TO_UINT:
- case ISD::VP_FP_TO_UINT:
case ISD::FRINT:
- case ISD::VP_FRINT:
case ISD::LRINT:
- case ISD::VP_LRINT:
case ISD::LLRINT:
- case ISD::VP_LLRINT:
case ISD::FROUND:
- case ISD::VP_FROUND:
case ISD::FROUNDEVEN:
- case ISD::VP_FROUNDEVEN:
case ISD::LROUND:
case ISD::LLROUND:
case ISD::FSIN:
case ISD::FSINH:
- case ISD::FSQRT: case ISD::VP_SQRT:
+ case ISD::FSQRT:
case ISD::FTAN:
case ISD::FTANH:
case ISD::FTRUNC:
- case ISD::VP_FROUNDTOZERO:
case ISD::SINT_TO_FP:
- case ISD::VP_SINT_TO_FP:
case ISD::TRUNCATE:
- case ISD::VP_TRUNCATE:
case ISD::UINT_TO_FP:
- case ISD::VP_UINT_TO_FP:
case ISD::FCANONICALIZE:
case ISD::AssertNoFPClass:
case ISD::CONVERT_FROM_ARBITRARY_FP:
@@ -1564,14 +1538,12 @@ void DAGTypeLegalizer::SplitVectorResult(SDNode *N, unsigned ResNo) {
case ISD::ANY_EXTEND:
case ISD::SIGN_EXTEND:
case ISD::ZERO_EXTEND:
- case ISD::VP_SIGN_EXTEND:
- case ISD::VP_ZERO_EXTEND:
SplitVecRes_ExtendOp(N, Lo, Hi);
break;
- case ISD::ADD: case ISD::VP_ADD:
- case ISD::SUB: case ISD::VP_SUB:
- case ISD::MUL: case ISD::VP_MUL:
+ case ISD::ADD:
+ case ISD::SUB:
+ case ISD::MUL:
case ISD::CLMUL:
case ISD::CLMULR:
case ISD::CLMULH:
@@ -1585,48 +1557,43 @@ void DAGTypeLegalizer::SplitVectorResult(SDNode *N, unsigned ResNo) {
case ISD::AVGCEILU:
case ISD::AVGFLOORS:
case ISD::AVGFLOORU:
- case ISD::FADD: case ISD::VP_FADD:
- case ISD::FSUB: case ISD::VP_FSUB:
- case ISD::FMUL: case ISD::VP_FMUL:
+ case ISD::FADD:
+ case ISD::FSUB:
+ case ISD::FMUL:
case ISD::FMINNUM:
case ISD::FMINNUM_IEEE:
- case ISD::VP_FMINNUM:
case ISD::FMAXNUM:
case ISD::FMAXNUM_IEEE:
- case ISD::VP_FMAXNUM:
case ISD::FMINIMUM:
- case ISD::VP_FMINIMUM:
case ISD::FMAXIMUM:
- case ISD::VP_FMAXIMUM:
case ISD::FMINIMUMNUM:
case ISD::FMAXIMUMNUM:
case ISD::SDIV: case ISD::VP_SDIV:
case ISD::UDIV: case ISD::VP_UDIV:
- case ISD::FDIV: case ISD::VP_FDIV:
+ case ISD::FDIV:
case ISD::FPOW:
case ISD::FATAN2:
- case ISD::AND: case ISD::VP_AND:
- case ISD::OR: case ISD::VP_OR:
- case ISD::XOR: case ISD::VP_XOR:
- case ISD::SHL: case ISD::VP_SHL:
- case ISD::SRA: case ISD::VP_SRA:
- case ISD::SRL: case ISD::VP_SRL:
+ case ISD::AND:
+ case ISD::OR:
+ case ISD::XOR:
+ case ISD::SHL:
+ case ISD::SRA:
+ case ISD::SRL:
case ISD::UREM: case ISD::VP_UREM:
case ISD::SREM: case ISD::VP_SREM:
- case ISD::FREM: case ISD::VP_FREM:
- case ISD::SMIN: case ISD::VP_SMIN:
- case ISD::SMAX: case ISD::VP_SMAX:
- case ISD::UMIN: case ISD::VP_UMIN:
- case ISD::UMAX: case ISD::VP_UMAX:
- case ISD::SADDSAT: case ISD::VP_SADDSAT:
- case ISD::UADDSAT: case ISD::VP_UADDSAT:
- case ISD::SSUBSAT: case ISD::VP_SSUBSAT:
- case ISD::USUBSAT: case ISD::VP_USUBSAT:
+ case ISD::FREM:
+ case ISD::SMIN:
+ case ISD::SMAX:
+ case ISD::UMIN:
+ case ISD::UMAX:
+ case ISD::SADDSAT:
+ case ISD::UADDSAT:
+ case ISD::SSUBSAT:
+ case ISD::USUBSAT:
case ISD::SSHLSAT:
case ISD::USHLSAT:
case ISD::ROTL:
case ISD::ROTR:
- case ISD::VP_FCOPYSIGN:
SplitVecRes_BinOp(N, Lo, Hi);
break;
case ISD::MASKED_UDIV:
@@ -1635,11 +1602,9 @@ void DAGTypeLegalizer::SplitVectorResult(SDNode *N, unsigned ResNo) {
case ISD::MASKED_SREM:
SplitVecRes_MaskedBinOp(N, Lo, Hi);
break;
- case ISD::FMA: case ISD::VP_FMA:
+ case ISD::FMA:
case ISD::FSHL:
- case ISD::VP_FSHL:
case ISD::FSHR:
- case ISD::VP_FSHR:
SplitVecRes_TernaryOp(N, Lo, Hi);
break;
@@ -1754,7 +1719,9 @@ void DAGTypeLegalizer::SplitVecRes_BinOp(SDNode *N, SDValue &Lo, SDValue &Hi) {
}
assert(N->getNumOperands() == 4 && "Unexpected number of operands!");
- assert(N->isVPOpcode() && "Expected VP opcode");
+ assert((N->getOpcode() == ISD::VP_UDIV || N->getOpcode() == ISD::VP_SDIV ||
+ N->getOpcode() == ISD::VP_UREM || N->getOpcode() == ISD::VP_SREM) &&
+ "Expected VP opcode");
SDValue MaskLo, MaskHi;
std::tie(MaskLo, MaskHi) = SplitMask(N->getOperand(2));
@@ -1804,26 +1771,10 @@ void DAGTypeLegalizer::SplitVecRes_TernaryOp(SDNode *N, SDValue &Lo,
const SDNodeFlags Flags = N->getFlags();
unsigned Opcode = N->getOpcode();
- if (N->getNumOperands() == 3) {
- Lo = DAG.getNode(Opcode, dl, Op0Lo.getValueType(), Op0Lo, Op1Lo, Op2Lo, Flags);
- Hi = DAG.getNode(Opcode, dl, Op0Hi.getValueType(), Op0Hi, Op1Hi, Op2Hi, Flags);
- return;
- }
-
- assert(N->getNumOperands() == 5 && "Unexpected number of operands!");
- assert(N->isVPOpcode() && "Expected VP opcode");
-
- SDValue MaskLo, MaskHi;
- std::tie(MaskLo, MaskHi) = SplitMask(N->getOperand(3));
-
- SDValue EVLLo, EVLHi;
- std::tie(EVLLo, EVLHi) =
- DAG.SplitEVL(N->getOperand(4), N->getValueType(0), dl);
-
- Lo = DAG.getNode(Opcode, dl, Op0Lo.getValueType(),
- {Op0Lo, Op1Lo, Op2Lo, MaskLo, EVLLo}, Flags);
- Hi = DAG.getNode(Opcode, dl, Op0Hi.getValueType(),
- {Op0Hi, Op1Hi, Op2Hi, MaskHi, EVLHi}, Flags);
+ Lo =
+ DAG.getNode(Opcode, dl, Op0Lo.getValueType(), Op0Lo, Op1Lo, Op2Lo, Flags);
+ Hi =
+ DAG.getNode(Opcode, dl, Op0Hi.getValueType(), Op0Hi, Op1Hi, Op2Hi, Flags);
}
void DAGTypeLegalizer::SplitVecRes_CMP(SDNode *N, SDValue &Lo, SDValue &Hi) {
@@ -2981,20 +2932,8 @@ void DAGTypeLegalizer::SplitVecRes_SETCC(SDNode *N, SDValue &Lo, SDValue &Hi) {
else
std::tie(RL, RH) = DAG.SplitVectorOperand(N, 1);
- if (N->getOpcode() == ISD::SETCC) {
- Lo = DAG.getNode(N->getOpcode(), DL, LoVT, LL, RL, N->getOperand(2));
- Hi = DAG.getNode(N->getOpcode(), DL, HiVT, LH, RH, N->getOperand(2));
- } else {
- assert(N->getOpcode() == ISD::VP_SETCC && "Expected VP_SETCC opcode");
- SDValue MaskLo, MaskHi, EVLLo, EVLHi;
- std::tie(MaskLo, MaskHi) = SplitMask(N->getOperand(3));
- std::tie(EVLLo, EVLHi) =
- DAG.SplitEVL(N->getOperand(4), N->getValueType(0), DL);
- Lo = DAG.getNode(N->getOpcode(), DL, LoVT, LL, RL, N->getOperand(2), MaskLo,
- EVLLo);
- Hi = DAG.getNode(N->getOpcode(), DL, HiVT, LH, RH, N->getOperand(2), MaskHi,
- EVLHi);
- }
+ Lo = DAG.getNode(N->getOpcode(), DL, LoVT, LL, RL, N->getOperand(2));
+ Hi = DAG.getNode(N->getOpcode(), DL, HiVT, LH, RH, N->getOperand(2));
}
void DAGTypeLegalizer::SplitVecRes_UnaryOp(SDNode *N, SDValue &Lo,
@@ -3021,30 +2960,15 @@ void DAGTypeLegalizer::SplitVecRes_UnaryOp(SDNode *N, SDValue &Lo,
N->getOperand(3), Flags);
return;
}
- if (N->getNumOperands() <= 2) {
- if (Opcode == ISD::FP_ROUND || Opcode == ISD::AssertNoFPClass ||
- Opcode == ISD::CONVERT_FROM_ARBITRARY_FP) {
- Lo = DAG.getNode(Opcode, dl, LoVT, Lo, N->getOperand(1), Flags);
- Hi = DAG.getNode(Opcode, dl, HiVT, Hi, N->getOperand(1), Flags);
- } else {
- Lo = DAG.getNode(Opcode, dl, LoVT, Lo, Flags);
- Hi = DAG.getNode(Opcode, dl, HiVT, Hi, Flags);
- }
- return;
- }
- assert(N->getNumOperands() == 3 && "Unexpected number of operands!");
- assert(N->isVPOpcode() && "Expected VP opcode");
-
- SDValue MaskLo, MaskHi;
- std::tie(MaskLo, MaskHi) = SplitMask(N->getOperand(1));
-
- SDValue EVLLo, EVLHi;
- std::tie(EVLLo, EVLHi) =
- DAG.SplitEVL(N->getOperand(2), N->getValueType(0), dl);
-
- Lo = DAG.getNode(Opcode, dl, LoVT, {Lo, MaskLo, EVLLo}, Flags);
- Hi = DAG.getNode(Opcode, dl, HiVT, {Hi, MaskHi, EVLHi}, Flags);
+ if (Opcode == ISD::FP_ROUND || Opcode == ISD::AssertNoFPClass ||
+ Opcode == ISD::CONVERT_FROM_ARBITRARY_FP) {
+ Lo = DAG.getNode(Opcode, dl, LoVT, Lo, N->getOperand(1), Flags);
+ Hi = DAG.getNode(Opcode, dl, HiVT, Hi, N->getOperand(1), Flags);
+ } else {
+ Lo = DAG.getNode(Opcode, dl, LoVT, Lo, Flags);
+ Hi = DAG.getNode(Opcode, dl, HiVT, Hi, Flags);
+ }
}
void DAGTypeLegalizer::SplitVecRes_ADDRSPACECAST(SDNode *N, SDValue &Lo,
@@ -3135,35 +3059,15 @@ void DAGTypeLegalizer::SplitVecRes_ExtendOp(SDNode *N, SDValue &Lo,
if (TLI.isTypeLegal(SrcVT) && !TLI.isTypeLegal(SplitSrcVT) &&
TLI.isTypeLegal(NewSrcVT) && TLI.isTypeLegal(SplitLoVT)) {
LLVM_DEBUG(dbgs() << "Split vector extend via incremental extend:";
- N->dump(&DAG); dbgs() << "\n");
- if (!N->isVPOpcode()) {
- // Extend the source vector by one step.
- SDValue NewSrc =
- DAG.getNode(N->getOpcode(), dl, NewSrcVT, N->getOperand(0));
- // Get the low and high halves of the new, extended one step, vector.
- std::tie(Lo, Hi) = DAG.SplitVector(NewSrc, dl);
- // Extend those vector halves the rest of the way.
- Lo = DAG.getNode(N->getOpcode(), dl, LoVT, Lo);
- Hi = DAG.getNode(N->getOpcode(), dl, HiVT, Hi);
- return;
- }
-
+ N->dump(&DAG); dbgs() << "\n");
// Extend the source vector by one step.
SDValue NewSrc =
- DAG.getNode(N->getOpcode(), dl, NewSrcVT, N->getOperand(0),
- N->getOperand(1), N->getOperand(2));
+ DAG.getNode(N->getOpcode(), dl, NewSrcVT, N->getOperand(0));
// Get the low and high halves of the new, extended one step, vector.
std::tie(Lo, Hi) = DAG.SplitVector(NewSrc, dl);
-
- SDValue MaskLo, MaskHi;
- std::tie(MaskLo, MaskHi) = SplitMask(N->getOperand(1));
-
- SDValue EVLLo, EVLHi;
- std::tie(EVLLo, EVLHi) =
- DAG.SplitEVL(N->getOperand(2), N->getValueType(0), dl);
// Extend those vector halves the rest of the way.
- Lo = DAG.getNode(N->getOpcode(), dl, LoVT, {Lo, MaskLo, EVLLo});
- Hi = DAG.getNode(N->getOpcode(), dl, HiVT, {Hi, MaskHi, EVLHi});
+ Lo = DAG.getNode(N->getOpcode(), dl, LoVT, Lo);
+ Hi = DAG.getNode(N->getOpcode(), dl, HiVT, Hi);
return;
}
}
@@ -3870,7 +3774,6 @@ bool DAGTypeLegalizer::SplitVectorOperand(SDNode *N, unsigned OpNo) {
report_fatal_error("Do not know how to split this operator's "
"operand!\n");
- case ISD::VP_SETCC:
case ISD::STRICT_FSETCC:
case ISD::STRICT_FSETCCS:
case ISD::SETCC: Res = SplitVecOp_VSETCC(N); break;
@@ -3882,12 +3785,10 @@ bool DAGTypeLegalizer::SplitVectorOperand(SDNode *N, unsigned OpNo) {
case ISD::VECTOR_FIND_LAST_ACTIVE:
Res = SplitVecOp_VECTOR_FIND_LAST_ACTIVE(N);
break;
- case ISD::VP_TRUNCATE:
case ISD::TRUNCATE:
Res = SplitVecOp_TruncateHelper(N);
break;
case ISD::STRICT_FP_ROUND:
- case ISD::VP_FP_ROUND:
case ISD::FP_ROUND:
case ISD::CONVERT_FROM_ARBITRARY_FP:
case ISD::CONVERT_TO_ARBITRARY_FP:
@@ -3933,8 +3834,6 @@ bool DAGTypeLegalizer::SplitVectorOperand(SDNode *N, unsigned OpNo) {
case ISD::STRICT_UINT_TO_FP:
case ISD::SINT_TO_FP:
case ISD::UINT_TO_FP:
- case ISD::VP_SINT_TO_FP:
- case ISD::VP_UINT_TO_FP:
if (N->getValueType(0).bitsLT(
N->getOperand(N->isStrictFPOpcode() ? 1 : 0).getValueType()))
Res = SplitVecOp_TruncateHelper(N);
@@ -3947,8 +3846,6 @@ bool DAGTypeLegalizer::SplitVectorOperand(SDNode *N, unsigned OpNo) {
break;
case ISD::FP_TO_SINT:
case ISD::FP_TO_UINT:
- case ISD::VP_FP_TO_SINT:
- case ISD::VP_FP_TO_UINT:
case ISD::STRICT_FP_TO_SINT:
case ISD::STRICT_FP_TO_UINT:
case ISD::STRICT_FP_EXTEND:
@@ -4247,14 +4144,6 @@ SDValue DAGTypeLegalizer::SplitVecOp_UnaryOp(SDNode *N) {
// Legalize the chain result - switch anything that used the old chain to
// use the new one.
ReplaceValueWith(SDValue(N, 1), Ch);
- } else if (N->getNumOperands() == 3) {
- assert(N->isVPOpcode() && "Expected VP opcode");
- SDValue MaskLo, MaskHi, EVLLo, EVLHi;
- std::tie(MaskLo, MaskHi) = SplitMask(N->getOperand(1));
- std::tie(EVLLo, EVLHi) =
- DAG.SplitEVL(N->getOperand(2), N->getValueType(0), dl);
- Lo = DAG.getNode(N->getOpcode(), dl, OutVT, Lo, MaskLo, EVLLo);
- Hi = DAG.getNode(N->getOpcode(), dl, OutVT, Hi, MaskHi, EVLHi);
} else {
Lo = DAG.getNode(N->getOpcode(), dl, OutVT, Lo);
Hi = DAG.getNode(N->getOpcode(), dl, OutVT, Hi);
@@ -5050,7 +4939,8 @@ SDValue DAGTypeLegalizer::SplitVecOp_VSETCC(SDNode *N) {
if (Opc == ISD::SETCC) {
LoRes = DAG.getNode(ISD::SETCC, DL, PartResVT, Lo0, Lo1, N->getOperand(2));
HiRes = DAG.getNode(ISD::SETCC, DL, PartResVT, Hi0, Hi1, N->getOperand(2));
- } else if (isStrict) {
+ } else {
+ assert(isStrict && "unexpected node");
LoRes = DAG.getNode(Opc, DL, DAG.getVTList(PartResVT, N->getValueType(1)),
N->getOperand(0), Lo0, Lo1, N->getOperand(3));
HiRes = DAG.getNode(Opc, DL, DAG.getVTList(PartResVT, N->getValueType(1)),
@@ -5058,16 +4948,6 @@ SDValue DAGTypeLegalizer::SplitVecOp_VSETCC(SDNode *N) {
SDValue NewChain = DAG.getNode(ISD::TokenFactor, DL, MVT::Other,
LoRes.getValue(1), HiRes.getValue(1));
ReplaceValueWith(SDValue(N, 1), NewChain);
- } else {
- assert(Opc == ISD::VP_SETCC && "Expected VP_SETCC opcode");
- SDValue MaskLo, MaskHi, EVLLo, EVLHi;
- std::tie(MaskLo, MaskHi) = SplitMask(N->getOperand(3));
- std::tie(EVLLo, EVLHi) =
- DAG.SplitEVL(N->getOperand(4), N->getValueType(0), DL);
- LoRes = DAG.getNode(ISD::VP_SETCC, DL, PartResVT, Lo0, Lo1,
- N->getOperand(2), MaskLo, EVLLo);
- HiRes = DAG.getNode(ISD::VP_SETCC, DL, PartResVT, Hi0, Hi1,
- N->getOperand(2), MaskHi, EVLHi);
}
EVT ConcatVT = PartResVT.getDoubleNumVectorElementsVT(*DAG.getContext());
@@ -5103,13 +4983,6 @@ SDValue DAGTypeLegalizer::SplitVecOp_FP_ROUND(SDNode *N) {
SDValue NewChain = DAG.getNode(ISD::TokenFactor, DL, MVT::Other,
Lo.getValue(1), Hi.getValue(1));
ReplaceValueWith(SDValue(N, 1), NewChain);
- } else if (N->getOpcode() == ISD::VP_FP_ROUND) {
- SDValue MaskLo, MaskHi, EVLLo, EVLHi;
- std::tie(MaskLo, MaskHi) = SplitMask(N->getOperand(1));
- std::tie(EVLLo, EVLHi) =
- DAG.SplitEVL(N->getOperand(2), N->getValueType(0), DL);
- Lo = DAG.getNode(ISD::VP_FP_ROUND, DL, OutVT, Lo, MaskLo, EVLLo);
- Hi = DAG.getNode(ISD::VP_FP_ROUND, DL, OutVT, Hi, MaskHi, EVLHi);
} else if (N->getOpcode() == ISD::CONVERT_TO_ARBITRARY_FP) {
Lo = DAG.getNode(N->getOpcode(), DL, OutVT, Lo, N->getOperand(1),
N->getOperand(2), N->getOperand(3));
@@ -5388,12 +5261,10 @@ void DAGTypeLegalizer::WidenVectorResult(SDNode *N, unsigned ResNo) {
case ISD::SIGN_EXTEND_INREG: Res = WidenVecRes_InregOp(N); break;
case ISD::VSELECT:
case ISD::SELECT:
- case ISD::VP_SELECT:
case ISD::VP_MERGE:
Res = WidenVecRes_Select(N);
break;
case ISD::SELECT_CC: Res = WidenVecRes_SELECT_CC(N); break;
- case ISD::VP_SETCC:
case ISD::SETCC: Res = WidenVecRes_SETCC(N); break;
case ISD::POISON:
case ISD::UNDEF: Res = WidenVecRes_UNDEF(N); break;
@@ -5437,19 +5308,19 @@ void DAGTypeLegalizer::WidenVectorResult(SDNode *N, unsigned ResNo) {
WidenVecRes_VECTOR_DEINTERLEAVE(N);
break;
- case ISD::ADD: case ISD::VP_ADD:
- case ISD::AND: case ISD::VP_AND:
- case ISD::MUL: case ISD::VP_MUL:
+ case ISD::ADD:
+ case ISD::AND:
+ case ISD::MUL:
case ISD::MULHS:
case ISD::MULHU:
case ISD::ABDS:
case ISD::ABDU:
- case ISD::OR: case ISD::VP_OR:
- case ISD::SUB: case ISD::VP_SUB:
- case ISD::XOR: case ISD::VP_XOR:
- case ISD::SHL: case ISD::VP_SHL:
- case ISD::SRA: case ISD::VP_SRA:
- case ISD::SRL: case ISD::VP_SRL:
+ case ISD::OR:
+ case ISD::SUB:
+ case ISD::XOR:
+ case ISD::SHL:
+ case ISD::SRA:
+ case ISD::SRL:
case ISD::CLMUL:
case ISD::CLMULR:
case ISD::CLMULH:
@@ -5457,24 +5328,20 @@ void DAGTypeLegalizer::WidenVectorResult(SDNode *N, unsigned ResNo) {
case ISD::PDEP:
case ISD::FMINNUM:
case ISD::FMINNUM_IEEE:
- case ISD::VP_FMINNUM:
case ISD::FMAXNUM:
case ISD::FMAXNUM_IEEE:
- case ISD::VP_FMAXNUM:
case ISD::FMINIMUM:
- case ISD::VP_FMINIMUM:
case ISD::FMAXIMUM:
- case ISD::VP_FMAXIMUM:
case ISD::FMINIMUMNUM:
case ISD::FMAXIMUMNUM:
- case ISD::SMIN: case ISD::VP_SMIN:
- case ISD::SMAX: case ISD::VP_SMAX:
- case ISD::UMIN: case ISD::VP_UMIN:
- case ISD::UMAX: case ISD::VP_UMAX:
- case ISD::UADDSAT: case ISD::VP_UADDSAT:
- case ISD::SADDSAT: case ISD::VP_SADDSAT:
- case ISD::USUBSAT: case ISD::VP_USUBSAT:
- case ISD::SSUBSAT: case ISD::VP_SSUBSAT:
+ case ISD::SMIN:
+ case ISD::SMAX:
+ case ISD::UMIN:
+ case ISD::UMAX:
+ case ISD::UADDSAT:
+ case ISD::SADDSAT:
+ case ISD::USUBSAT:
+ case ISD::SSUBSAT:
case ISD::SSHLSAT:
case ISD::USHLSAT:
case ISD::ROTL:
@@ -5492,12 +5359,6 @@ void DAGTypeLegalizer::WidenVectorResult(SDNode *N, unsigned ResNo) {
case ISD::VP_UDIV:
case ISD::VP_SREM:
case ISD::VP_UREM:
- case ISD::VP_FADD:
- case ISD::VP_FSUB:
- case ISD::VP_FMUL:
- case ISD::VP_FDIV:
- case ISD::VP_FREM:
- case ISD::VP_FCOPYSIGN:
Res = WidenVecRes_Binary(N);
break;
@@ -5581,23 +5442,14 @@ void DAGTypeLegalizer::WidenVectorResult(SDNode *N, unsigned ResNo) {
case ISD::ANY_EXTEND:
case ISD::FP_EXTEND:
- case ISD::VP_FP_EXTEND:
case ISD::FP_ROUND:
- case ISD::VP_FP_ROUND:
case ISD::FP_TO_SINT:
- case ISD::VP_FP_TO_SINT:
case ISD::FP_TO_UINT:
- case ISD::VP_FP_TO_UINT:
case ISD::SIGN_EXTEND:
- case ISD::VP_SIGN_EXTEND:
case ISD::SINT_TO_FP:
- case ISD::VP_SINT_TO_FP:
- case ISD::VP_TRUNCATE:
case ISD::TRUNCATE:
case ISD::UINT_TO_FP:
- case ISD::VP_UINT_TO_FP:
case ISD::ZERO_EXTEND:
- case ISD::VP_ZERO_EXTEND:
case ISD::CONVERT_FROM_ARBITRARY_FP:
case ISD::CONVERT_TO_ARBITRARY_FP:
Res = WidenVecRes_Convert(N);
@@ -5610,8 +5462,6 @@ void DAGTypeLegalizer::WidenVectorResult(SDNode *N, unsigned ResNo) {
case ISD::LRINT:
case ISD::LLRINT:
- case ISD::VP_LRINT:
- case ISD::VP_LLRINT:
case ISD::LROUND:
case ISD::LLROUND:
Res = WidenVecRes_XROUND(N);
@@ -5649,42 +5499,24 @@ void DAGTypeLegalizer::WidenVectorResult(SDNode *N, unsigned ResNo) {
case ISD::ABS:
case ISD::ABS_MIN_POISON:
- case ISD::VP_ABS:
case ISD::BITREVERSE:
- case ISD::VP_BITREVERSE:
case ISD::BSWAP:
- case ISD::VP_BSWAP:
case ISD::CTLZ:
- case ISD::VP_CTLZ:
case ISD::CTLZ_ZERO_POISON:
- case ISD::VP_CTLZ_ZERO_POISON:
case ISD::CTPOP:
- case ISD::VP_CTPOP:
case ISD::CTTZ:
- case ISD::VP_CTTZ:
case ISD::CTTZ_ZERO_POISON:
- case ISD::VP_CTTZ_ZERO_POISON:
- case ISD::FNEG: case ISD::VP_FNEG:
- case ISD::FABS: case ISD::VP_FABS:
- case ISD::VP_SQRT:
- case ISD::VP_FCEIL:
- case ISD::VP_FFLOOR:
- case ISD::VP_FRINT:
- case ISD::VP_FNEARBYINT:
- case ISD::VP_FROUND:
- case ISD::VP_FROUNDEVEN:
- case ISD::VP_FROUNDTOZERO:
+ case ISD::FNEG:
+ case ISD::FABS:
case ISD::FREEZE:
case ISD::ARITH_FENCE:
case ISD::FCANONICALIZE:
case ISD::AssertNoFPClass:
Res = WidenVecRes_Unary(N);
break;
- case ISD::FMA: case ISD::VP_FMA:
+ case ISD::FMA:
case ISD::FSHL:
- case ISD::VP_FSHL:
case ISD::FSHR:
- case ISD::VP_FSHR:
Res = WidenVecRes_Ternary(N);
break;
case ISD::FMODF:
@@ -5709,16 +5541,7 @@ SDValue DAGTypeLegalizer::WidenVecRes_Ternary(SDNode *N) {
SDValue InOp1 = GetWidenedVector(N->getOperand(0));
SDValue InOp2 = GetWidenedVector(N->getOperand(1));
SDValue InOp3 = GetWidenedVector(N->getOperand(2));
- if (N->getNumOperands() == 3)
- return DAG.getNode(N->getOpcode(), dl, WidenVT, InOp1, InOp2, InOp3);
-
- assert(N->getNumOperands() == 5 && "Unexpected number of operands!");
- assert(N->isVPOpcode() && "Expected VP opcode");
-
- SDValue Mask =
- GetWidenedMask(N->getOperand(3), WidenVT.getVectorElementCount());
- return DAG.getNode(N->getOpcode(), dl, WidenVT,
- {InOp1, InOp2, InOp3, Mask, N->getOperand(4)});
+ return DAG.getNode(N->getOpcode(), dl, WidenVT, InOp1, InOp2, InOp3);
}
SDValue DAGTypeLegalizer::WidenVecRes_Binary(SDNode *N) {
@@ -5732,7 +5555,9 @@ SDValue DAGTypeLegalizer::WidenVecRes_Binary(SDNode *N) {
N->getFlags());
assert(N->getNumOperands() == 4 && "Unexpected number of operands!");
- assert(N->isVPOpcode() && "Expected VP opcode");
+ assert((N->getOpcode() == ISD::VP_UDIV || N->getOpcode() == ISD::VP_SDIV ||
+ N->getOpcode() == ISD::VP_UREM || N->getOpcode() == ISD::VP_SREM) &&
+ "Expected VP opcode");
SDValue Mask =
GetWidenedMask(N->getOperand(2), WidenVT.getVectorElementCount());
@@ -6184,14 +6009,8 @@ SDValue DAGTypeLegalizer::WidenVecRes_Convert(SDNode *N) {
InOp = GetWidenedVector(N->getOperand(0));
InVT = InOp.getValueType();
InVTEC = InVT.getVectorElementCount();
- if (InVTEC == WidenEC) {
- if (N->getNumOperands() == 3 && N->isVPOpcode()) {
- SDValue Mask =
- GetWidenedMask(N->getOperand(1), WidenVT.getVectorElementCount());
- return DAG.getNode(Opcode, DL, WidenVT, InOp, Mask, N->getOperand(2));
- }
+ if (InVTEC == WidenEC)
return MakeConvertNode(WidenVT, InOp);
- }
if (WidenVT.getSizeInBits() == InVT.getSizeInBits()) {
// If both input and result vector types are of same width, extend
// operations should be done with SIGN/ZERO_EXTEND_VECTOR_INREG, which
@@ -6296,15 +6115,7 @@ SDValue DAGTypeLegalizer::WidenVecRes_XROUND(SDNode *N) {
if (WidenNumElts != SrcVT.getVectorElementCount())
return DAG.UnrollVectorOp(N, WidenNumElts.getKnownMinValue());
- if (N->getNumOperands() == 1)
- return DAG.getNode(N->getOpcode(), dl, WidenVT, Src);
-
- assert(N->getNumOperands() == 3 && "Unexpected number of operands!");
- assert(N->isVPOpcode() && "Expected VP opcode");
-
- SDValue Mask =
- GetWidenedMask(N->getOperand(1), WidenVT.getVectorElementCount());
- return DAG.getNode(N->getOpcode(), dl, WidenVT, Src, Mask, N->getOperand(2));
+ return DAG.getNode(N->getOpcode(), dl, WidenVT, Src);
}
SDValue DAGTypeLegalizer::WidenVecRes_Convert_StrictFP(SDNode *N) {
@@ -6438,17 +6249,9 @@ SDValue DAGTypeLegalizer::WidenVecRes_Unary(SDNode *N) {
SDValue InOp = GetWidenedVector(N->getOperand(0));
if (N->getNumOperands() == 1)
return DAG.getNode(N->getOpcode(), SDLoc(N), WidenVT, InOp, N->getFlags());
- if (N->getOpcode() == ISD::AssertNoFPClass)
- return DAG.getNode(N->getOpcode(), SDLoc(N), WidenVT, InOp,
- N->getOperand(1), N->getFlags());
-
- assert(N->getNumOperands() == 3 && "Unexpected number of operands!");
- assert(N->isVPOpcode() && "Expected VP opcode");
-
- SDValue Mask =
- GetWidenedMask(N->getOperand(1), WidenVT.getVectorElementCount());
- return DAG.getNode(N->getOpcode(), SDLoc(N), WidenVT,
- {InOp, Mask, N->getOperand(2)});
+ assert(N->getOpcode() == ISD::AssertNoFPClass && "unexpected opcode");
+ return DAG.getNode(N->getOpcode(), SDLoc(N), WidenVT, InOp, N->getOperand(1),
+ N->getFlags());
}
SDValue DAGTypeLegalizer::WidenVecRes_InregOp(SDNode *N) {
@@ -7500,7 +7303,7 @@ SDValue DAGTypeLegalizer::WidenVecRes_Select(SDNode *N) {
SDValue InOp1 = GetWidenedVector(N->getOperand(1));
SDValue InOp2 = GetWidenedVector(N->getOperand(2));
assert(InOp1.getValueType() == WidenVT && InOp2.getValueType() == WidenVT);
- if (Opcode == ISD::VP_SELECT || Opcode == ISD::VP_MERGE)
+ if (Opcode == ISD::VP_MERGE)
return DAG.getNode(Opcode, SDLoc(N), WidenVT, Cond1, InOp1, InOp2,
N->getOperand(3));
return DAG.getNode(Opcode, SDLoc(N), WidenVT, Cond1, InOp1, InOp2);
@@ -7728,12 +7531,6 @@ SDValue DAGTypeLegalizer::WidenVecRes_SETCC(SDNode *N) {
InOp2.getValueType() == WidenInVT &&
"Input not widened to expected type!");
(void)WidenInVT;
- if (N->getOpcode() == ISD::VP_SETCC) {
- SDValue Mask =
- GetWidenedMask(N->getOperand(3), WidenVT.getVectorElementCount());
- return DAG.getNode(ISD::VP_SETCC, SDLoc(N), WidenVT, InOp1, InOp2,
- N->getOperand(2), Mask, N->getOperand(4));
- }
return DAG.getNode(ISD::SETCC, SDLoc(N), WidenVT, InOp1, InOp2,
N->getOperand(2));
}
diff --git a/llvm/lib/CodeGen/SelectionDAG/MatchContext.h b/llvm/lib/CodeGen/SelectionDAG/MatchContext.h
deleted file mode 100644
index ff564c0be40c4..0000000000000
--- a/llvm/lib/CodeGen/SelectionDAG/MatchContext.h
+++ /dev/null
@@ -1,182 +0,0 @@
-//===---------------- llvm/CodeGen/MatchContext.h --------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file declares the EmptyMatchContext class and VPMatchContext class.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_LIB_CODEGEN_SELECTIONDAG_MATCHCONTEXT_H
-#define LLVM_LIB_CODEGEN_SELECTIONDAG_MATCHCONTEXT_H
-
-#include "llvm/CodeGen/SelectionDAG.h"
-#include "llvm/CodeGen/TargetLowering.h"
-
-namespace llvm {
-
-class EmptyMatchContext {
- SelectionDAG &DAG;
- const TargetLowering &TLI;
- SDNode *Root;
-
-public:
- EmptyMatchContext(SelectionDAG &DAG, const TargetLowering &TLI, SDNode *Root)
- : DAG(DAG), TLI(TLI), Root(Root) {}
-
- unsigned getRootBaseOpcode() { return Root->getOpcode(); }
- bool match(SDValue OpN, unsigned Opcode) const {
- return Opcode == OpN->getOpcode();
- }
-
- // Same as SelectionDAG::getNode().
- template <typename... ArgT> SDValue getNode(ArgT &&...Args) {
- return DAG.getNode(std::forward<ArgT>(Args)...);
- }
-
- bool isOperationLegal(unsigned Op, EVT VT) const {
- return TLI.isOperationLegal(Op, VT);
- }
-
- bool isOperationLegalOrCustom(unsigned Op, EVT VT,
- bool LegalOnly = false) const {
- return TLI.isOperationLegalOrCustom(Op, VT, LegalOnly);
- }
-
- unsigned getNumOperands(SDValue N) const { return N->getNumOperands(); }
-};
-
-class VPMatchContext {
- SelectionDAG &DAG;
- const TargetLowering &TLI;
- SDValue RootMaskOp;
- SDValue RootVectorLenOp;
- SDNode *Root;
-
-public:
- VPMatchContext(SelectionDAG &DAG, const TargetLowering &TLI, SDNode *_Root)
- : DAG(DAG), TLI(TLI), RootMaskOp(), RootVectorLenOp() {
- Root = _Root;
- assert(Root->isVPOpcode());
- if (auto RootMaskPos = ISD::getVPMaskIdx(Root->getOpcode()))
- RootMaskOp = Root->getOperand(*RootMaskPos);
- else if (Root->getOpcode() == ISD::VP_SELECT)
- RootMaskOp = DAG.getAllOnesConstant(SDLoc(Root),
- Root->getOperand(0).getValueType());
-
- if (auto RootVLenPos = ISD::getVPExplicitVectorLengthIdx(Root->getOpcode()))
- RootVectorLenOp = Root->getOperand(*RootVLenPos);
- }
-
- unsigned getRootBaseOpcode() {
- std::optional<unsigned> Opcode = ISD::getBaseOpcodeForVP(
- Root->getOpcode(), !Root->getFlags().hasNoFPExcept());
- assert(Opcode.has_value());
- return *Opcode;
- }
-
- /// whether \p OpVal is a node that is functionally compatible with the
- /// NodeType \p Opc
- bool match(SDValue OpVal, unsigned Opc) const {
- if (!OpVal->isVPOpcode())
- return OpVal->getOpcode() == Opc;
-
- auto BaseOpc = ISD::getBaseOpcodeForVP(OpVal->getOpcode(),
- !OpVal->getFlags().hasNoFPExcept());
- if (BaseOpc != Opc)
- return false;
-
- // Make sure the mask of OpVal is true mask or is same as Root's.
- unsigned VPOpcode = OpVal->getOpcode();
- if (auto MaskPos = ISD::getVPMaskIdx(VPOpcode)) {
- SDValue MaskOp = OpVal.getOperand(*MaskPos);
- if (RootMaskOp != MaskOp &&
- !ISD::isConstantSplatVectorAllOnes(MaskOp.getNode()))
- return false;
- }
-
- // Make sure the EVL of OpVal is same as Root's.
- if (auto VLenPos = ISD::getVPExplicitVectorLengthIdx(VPOpcode))
- if (RootVectorLenOp != OpVal.getOperand(*VLenPos))
- return false;
- return true;
- }
-
- // Specialize based on number of operands.
- // TODO emit VP intrinsics where MaskOp/VectorLenOp != null
- // SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT) { return
- // DAG.getNode(Opcode, DL, VT); }
- SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, SDValue Operand) {
- unsigned VPOpcode = *ISD::getVPForBaseOpcode(Opcode);
- assert(ISD::getVPMaskIdx(VPOpcode) == 1 &&
- ISD::getVPExplicitVectorLengthIdx(VPOpcode) == 2);
- return DAG.getNode(VPOpcode, DL, VT,
- {Operand, RootMaskOp, RootVectorLenOp});
- }
-
- SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, SDValue N1,
- SDValue N2) {
- unsigned VPOpcode = *ISD::getVPForBaseOpcode(Opcode);
- assert(ISD::getVPMaskIdx(VPOpcode) == 2 &&
- ISD::getVPExplicitVectorLengthIdx(VPOpcode) == 3);
- return DAG.getNode(VPOpcode, DL, VT, {N1, N2, RootMaskOp, RootVectorLenOp});
- }
-
- SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, SDValue N1,
- SDValue N2, SDValue N3) {
- unsigned VPOpcode = *ISD::getVPForBaseOpcode(Opcode);
- assert(ISD::getVPMaskIdx(VPOpcode) == 3 &&
- ISD::getVPExplicitVectorLengthIdx(VPOpcode) == 4);
- return DAG.getNode(VPOpcode, DL, VT,
- {N1, N2, N3, RootMaskOp, RootVectorLenOp});
- }
-
- SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, SDValue Operand,
- SDNodeFlags Flags) {
- unsigned VPOpcode = *ISD::getVPForBaseOpcode(Opcode);
- assert(ISD::getVPMaskIdx(VPOpcode) == 1 &&
- ISD::getVPExplicitVectorLengthIdx(VPOpcode) == 2);
- return DAG.getNode(VPOpcode, DL, VT, {Operand, RootMaskOp, RootVectorLenOp},
- Flags);
- }
-
- SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, SDValue N1,
- SDValue N2, SDNodeFlags Flags) {
- unsigned VPOpcode = *ISD::getVPForBaseOpcode(Opcode);
- assert(ISD::getVPMaskIdx(VPOpcode) == 2 &&
- ISD::getVPExplicitVectorLengthIdx(VPOpcode) == 3);
- return DAG.getNode(VPOpcode, DL, VT, {N1, N2, RootMaskOp, RootVectorLenOp},
- Flags);
- }
-
- SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, SDValue N1,
- SDValue N2, SDValue N3, SDNodeFlags Flags) {
- unsigned VPOpcode = *ISD::getVPForBaseOpcode(Opcode);
- assert(ISD::getVPMaskIdx(VPOpcode) == 3 &&
- ISD::getVPExplicitVectorLengthIdx(VPOpcode) == 4);
- return DAG.getNode(VPOpcode, DL, VT,
- {N1, N2, N3, RootMaskOp, RootVectorLenOp}, Flags);
- }
-
- bool isOperationLegal(unsigned Op, EVT VT) const {
- unsigned VPOp = *ISD::getVPForBaseOpcode(Op);
- return TLI.isOperationLegal(VPOp, VT);
- }
-
- bool isOperationLegalOrCustom(unsigned Op, EVT VT,
- bool LegalOnly = false) const {
- unsigned VPOp = *ISD::getVPForBaseOpcode(Op);
- return TLI.isOperationLegalOrCustom(VPOp, VT, LegalOnly);
- }
-
- unsigned getNumOperands(SDValue N) const {
- return N->isVPOpcode() ? N->getNumOperands() - 2 : N->getNumOperands();
- }
-};
-
-} // namespace llvm
-
-#endif // LLVM_LIB_CODEGEN_SELECTIONDAG_MATCHCONTEXT_H
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 00cef99069347..87458fe010e77 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -1661,25 +1661,6 @@ SDValue SelectionDAG::getZeroExtendInReg(SDValue Op, const SDLoc &DL, EVT VT) {
return getNode(ISD::AND, DL, OpVT, Op, getConstant(Imm, DL, OpVT));
}
-SDValue SelectionDAG::getVPZeroExtendInReg(SDValue Op, SDValue Mask,
- SDValue EVL, const SDLoc &DL,
- EVT VT) {
- EVT OpVT = Op.getValueType();
- assert(VT.isInteger() && OpVT.isInteger() &&
- "Cannot getVPZeroExtendInReg FP types");
- assert(VT.isVector() && OpVT.isVector() &&
- "getVPZeroExtendInReg type and operand type should be vector!");
- assert(VT.getVectorElementCount() == OpVT.getVectorElementCount() &&
- "Vector element counts must match in getZeroExtendInReg");
- assert(VT.getScalarType().bitsLE(OpVT.getScalarType()) && "Not extending!");
- if (OpVT == VT)
- return Op;
- APInt Imm = APInt::getLowBitsSet(OpVT.getScalarSizeInBits(),
- VT.getScalarSizeInBits());
- return getNode(ISD::VP_AND, DL, OpVT, Op, getConstant(Imm, DL, OpVT), Mask,
- EVL);
-}
-
SDValue SelectionDAG::getPtrExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT) {
// Only unsigned pointer semantics are supported right now. In the future this
// might delegate to TLI to check pointer signedness.
@@ -1706,26 +1687,6 @@ SDValue SelectionDAG::getLogicalNOT(const SDLoc &DL, SDValue Val, EVT VT) {
return getNode(ISD::XOR, DL, VT, Val, TrueValue);
}
-SDValue SelectionDAG::getVPLogicalNOT(const SDLoc &DL, SDValue Val,
- SDValue Mask, SDValue EVL, EVT VT) {
- SDValue TrueValue = getBoolConstant(true, DL, VT, VT);
- return getNode(ISD::VP_XOR, DL, VT, Val, TrueValue, Mask, EVL);
-}
-
-SDValue SelectionDAG::getVPPtrExtOrTrunc(const SDLoc &DL, EVT VT, SDValue Op,
- SDValue Mask, SDValue EVL) {
- return getVPZExtOrTrunc(DL, VT, Op, Mask, EVL);
-}
-
-SDValue SelectionDAG::getVPZExtOrTrunc(const SDLoc &DL, EVT VT, SDValue Op,
- SDValue Mask, SDValue EVL) {
- if (VT.bitsGT(Op.getValueType()))
- return getNode(ISD::VP_ZERO_EXTEND, DL, VT, Op, Mask, EVL);
- if (VT.bitsLT(Op.getValueType()))
- return getNode(ISD::VP_TRUNCATE, DL, VT, Op, Mask, EVL);
- return Op;
-}
-
SDValue SelectionDAG::getBoolConstant(bool V, const SDLoc &DL, EVT VT,
EVT OpVT) {
if (!V)
@@ -9194,13 +9155,6 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
if (N1.getValueType() == VT)
return N1;
break;
- case ISD::VP_TRUNCATE:
- case ISD::VP_SIGN_EXTEND:
- case ISD::VP_ZERO_EXTEND:
- // Don't create noop casts.
- if (N1.getValueType() == VT)
- return N1;
- break;
case ISD::VECTOR_COMPRESS: {
[[maybe_unused]] EVT VecVT = N1.getValueType();
[[maybe_unused]] EVT MaskVT = N2.getValueType();
@@ -12013,17 +11967,6 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
assert(Ops[2].getValueType() == Ops[3].getValueType() &&
"LHS/RHS of comparison should match types!");
break;
- case ISD::VP_ADD:
- case ISD::VP_SUB:
- // If it is VP_ADD/VP_SUB mask operation then turn it to VP_XOR
- if (VT.getScalarType() == MVT::i1)
- Opcode = ISD::VP_XOR;
- break;
- case ISD::VP_MUL:
- // If it is VP_MUL mask operation then turn it to VP_AND
- if (VT.getScalarType() == MVT::i1)
- Opcode = ISD::VP_AND;
- break;
case ISD::VP_REDUCE_MUL:
// If it is VP_REDUCE_MUL mask operation then turn it to VP_REDUCE_AND
if (VT == MVT::i1)
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
index 81062dd6d3a11..4f990e1ff5b9e 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
@@ -9064,64 +9064,6 @@ void SelectionDAGBuilder::visitVectorPredicationIntrinsic(
case ISD::EXPERIMENTAL_VP_STRIDED_STORE:
visitVPStridedStore(VPIntrin, OpValues);
break;
- case ISD::VP_FMULADD: {
- assert(OpValues.size() == 5 && "Unexpected number of operands");
- SDNodeFlags SDFlags;
- if (auto *FPMO = dyn_cast<FPMathOperator>(&VPIntrin))
- SDFlags.copyFMF(*FPMO);
- if (TM.Options.AllowFPOpFusion != FPOpFusion::Strict &&
- TLI.isFMAFasterThanFMulAndFAdd(DAG.getMachineFunction(), ValueVTs[0])) {
- setValue(&VPIntrin, DAG.getNode(ISD::VP_FMA, DL, VTs, OpValues, SDFlags));
- } else {
- SDValue Mul = DAG.getNode(
- ISD::VP_FMUL, DL, VTs,
- {OpValues[0], OpValues[1], OpValues[3], OpValues[4]}, SDFlags);
- SDValue Add =
- DAG.getNode(ISD::VP_FADD, DL, VTs,
- {Mul, OpValues[2], OpValues[3], OpValues[4]}, SDFlags);
- setValue(&VPIntrin, Add);
- }
- break;
- }
- case ISD::VP_IS_FPCLASS: {
- const DataLayout DLayout = DAG.getDataLayout();
- EVT DestVT = TLI.getValueType(DLayout, VPIntrin.getType());
- auto Constant = OpValues[1]->getAsZExtVal();
- SDValue Check = DAG.getTargetConstant(Constant, DL, MVT::i32);
- SDValue V = DAG.getNode(ISD::VP_IS_FPCLASS, DL, DestVT,
- {OpValues[0], Check, OpValues[2], OpValues[3]});
- setValue(&VPIntrin, V);
- return;
- }
- case ISD::VP_INTTOPTR: {
- SDValue N = OpValues[0];
- EVT DestVT = TLI.getValueType(DAG.getDataLayout(), VPIntrin.getType());
- EVT PtrMemVT = TLI.getMemValueType(DAG.getDataLayout(), VPIntrin.getType());
- N = DAG.getVPPtrExtOrTrunc(getCurSDLoc(), DestVT, N, OpValues[1],
- OpValues[2]);
- N = DAG.getVPZExtOrTrunc(getCurSDLoc(), PtrMemVT, N, OpValues[1],
- OpValues[2]);
- setValue(&VPIntrin, N);
- break;
- }
- case ISD::VP_PTRTOINT: {
- SDValue N = OpValues[0];
- EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
- VPIntrin.getType());
- EVT PtrMemVT = TLI.getMemValueType(DAG.getDataLayout(),
- VPIntrin.getOperand(0)->getType());
- N = DAG.getVPPtrExtOrTrunc(getCurSDLoc(), PtrMemVT, N, OpValues[1],
- OpValues[2]);
- N = DAG.getVPZExtOrTrunc(getCurSDLoc(), DestVT, N, OpValues[1],
- OpValues[2]);
- setValue(&VPIntrin, N);
- break;
- }
- case ISD::VP_ABS:
- case ISD::VP_CTLZ:
- case ISD::VP_CTLZ_ZERO_POISON:
- case ISD::VP_CTTZ:
- case ISD::VP_CTTZ_ZERO_POISON:
case ISD::VP_CTTZ_ELTS_ZERO_POISON:
case ISD::VP_CTTZ_ELTS: {
SDValue Result =
diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
index 54faa7f252602..d4ddee142d4eb 100644
--- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
@@ -8685,68 +8685,8 @@ static bool isNonZeroModBitWidthOrUndef(SDValue Z, unsigned BW) {
/*AllowUndefs=*/true, /*AllowTruncation=*/true);
}
-static SDValue expandVPFunnelShift(SDNode *Node, SelectionDAG &DAG) {
- EVT VT = Node->getValueType(0);
- SDValue ShX, ShY;
- SDValue ShAmt, InvShAmt;
- SDValue X = Node->getOperand(0);
- SDValue Y = Node->getOperand(1);
- SDValue Z = Node->getOperand(2);
- SDValue Mask = Node->getOperand(3);
- SDValue VL = Node->getOperand(4);
-
- unsigned BW = VT.getScalarSizeInBits();
- bool IsFSHL = Node->getOpcode() == ISD::VP_FSHL;
- SDLoc DL(SDValue(Node, 0));
-
- EVT ShVT = Z.getValueType();
- if (isNonZeroModBitWidthOrUndef(Z, BW)) {
- // fshl: X << C | Y >> (BW - C)
- // fshr: X << (BW - C) | Y >> C
- // where C = Z % BW is not zero
- SDValue BitWidthC = DAG.getConstant(BW, DL, ShVT);
- ShAmt = DAG.getNode(ISD::VP_UREM, DL, ShVT, Z, BitWidthC, Mask, VL);
- InvShAmt = DAG.getNode(ISD::VP_SUB, DL, ShVT, BitWidthC, ShAmt, Mask, VL);
- ShX = DAG.getNode(ISD::VP_SHL, DL, VT, X, IsFSHL ? ShAmt : InvShAmt, Mask,
- VL);
- ShY = DAG.getNode(ISD::VP_SRL, DL, VT, Y, IsFSHL ? InvShAmt : ShAmt, Mask,
- VL);
- } else {
- // fshl: X << (Z % BW) | Y >> 1 >> (BW - 1 - (Z % BW))
- // fshr: X << 1 << (BW - 1 - (Z % BW)) | Y >> (Z % BW)
- SDValue BitMask = DAG.getConstant(BW - 1, DL, ShVT);
- if (isPowerOf2_32(BW)) {
- // Z % BW -> Z & (BW - 1)
- ShAmt = DAG.getNode(ISD::VP_AND, DL, ShVT, Z, BitMask, Mask, VL);
- // (BW - 1) - (Z % BW) -> ~Z & (BW - 1)
- SDValue NotZ = DAG.getNode(ISD::VP_XOR, DL, ShVT, Z,
- DAG.getAllOnesConstant(DL, ShVT), Mask, VL);
- InvShAmt = DAG.getNode(ISD::VP_AND, DL, ShVT, NotZ, BitMask, Mask, VL);
- } else {
- SDValue BitWidthC = DAG.getConstant(BW, DL, ShVT);
- ShAmt = DAG.getNode(ISD::VP_UREM, DL, ShVT, Z, BitWidthC, Mask, VL);
- InvShAmt = DAG.getNode(ISD::VP_SUB, DL, ShVT, BitMask, ShAmt, Mask, VL);
- }
-
- SDValue One = DAG.getConstant(1, DL, ShVT);
- if (IsFSHL) {
- ShX = DAG.getNode(ISD::VP_SHL, DL, VT, X, ShAmt, Mask, VL);
- SDValue ShY1 = DAG.getNode(ISD::VP_SRL, DL, VT, Y, One, Mask, VL);
- ShY = DAG.getNode(ISD::VP_SRL, DL, VT, ShY1, InvShAmt, Mask, VL);
- } else {
- SDValue ShX1 = DAG.getNode(ISD::VP_SHL, DL, VT, X, One, Mask, VL);
- ShX = DAG.getNode(ISD::VP_SHL, DL, VT, ShX1, InvShAmt, Mask, VL);
- ShY = DAG.getNode(ISD::VP_SRL, DL, VT, Y, ShAmt, Mask, VL);
- }
- }
- return DAG.getNode(ISD::VP_OR, DL, VT, ShX, ShY, Mask, VL);
-}
-
SDValue TargetLowering::expandFunnelShift(SDNode *Node,
SelectionDAG &DAG) const {
- if (Node->isVPOpcode())
- return expandVPFunnelShift(Node, DAG);
-
EVT VT = Node->getValueType(0);
if (VT.isVector() && (!isOperationLegalOrCustom(ISD::SHL, VT) ||
@@ -10896,75 +10836,6 @@ SDValue TargetLowering::expandCTPOP(SDNode *Node, SelectionDAG &DAG) const {
return DAG.getNode(ISD::SRL, dl, VT, V, DAG.getConstant(Len - 8, dl, ShVT));
}
-SDValue TargetLowering::expandVPCTPOP(SDNode *Node, SelectionDAG &DAG) const {
- SDLoc dl(Node);
- EVT VT = Node->getValueType(0);
- EVT ShVT = getShiftAmountTy(VT, DAG.getDataLayout());
- SDValue Op = Node->getOperand(0);
- SDValue Mask = Node->getOperand(1);
- SDValue VL = Node->getOperand(2);
- unsigned Len = VT.getScalarSizeInBits();
- assert(VT.isInteger() && "VP_CTPOP not implemented for this type.");
-
- // TODO: Add support for irregular type lengths.
- if (!(Len <= 128 && Len % 8 == 0))
- return SDValue();
-
- // This is same algorithm of expandCTPOP from
- // http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel
- SDValue Mask55 =
- DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x55)), dl, VT);
- SDValue Mask33 =
- DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x33)), dl, VT);
- SDValue Mask0F =
- DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x0F)), dl, VT);
-
- SDValue Tmp1, Tmp2, Tmp3, Tmp4, Tmp5;
-
- // v = v - ((v >> 1) & 0x55555555...)
- Tmp1 = DAG.getNode(ISD::VP_AND, dl, VT,
- DAG.getNode(ISD::VP_SRL, dl, VT, Op,
- DAG.getConstant(1, dl, ShVT), Mask, VL),
- Mask55, Mask, VL);
- Op = DAG.getNode(ISD::VP_SUB, dl, VT, Op, Tmp1, Mask, VL);
-
- // v = (v & 0x33333333...) + ((v >> 2) & 0x33333333...)
- Tmp2 = DAG.getNode(ISD::VP_AND, dl, VT, Op, Mask33, Mask, VL);
- Tmp3 = DAG.getNode(ISD::VP_AND, dl, VT,
- DAG.getNode(ISD::VP_SRL, dl, VT, Op,
- DAG.getConstant(2, dl, ShVT), Mask, VL),
- Mask33, Mask, VL);
- Op = DAG.getNode(ISD::VP_ADD, dl, VT, Tmp2, Tmp3, Mask, VL);
-
- // v = (v + (v >> 4)) & 0x0F0F0F0F...
- Tmp4 = DAG.getNode(ISD::VP_SRL, dl, VT, Op, DAG.getConstant(4, dl, ShVT),
- Mask, VL),
- Tmp5 = DAG.getNode(ISD::VP_ADD, dl, VT, Op, Tmp4, Mask, VL);
- Op = DAG.getNode(ISD::VP_AND, dl, VT, Tmp5, Mask0F, Mask, VL);
-
- if (Len <= 8)
- return Op;
-
- // v = (v * 0x01010101...) >> (Len - 8)
- SDValue V;
- if (isOperationLegalOrCustomOrPromote(
- ISD::VP_MUL, getTypeToTransformTo(*DAG.getContext(), VT))) {
- SDValue Mask01 =
- DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x01)), dl, VT);
- V = DAG.getNode(ISD::VP_MUL, dl, VT, Op, Mask01, Mask, VL);
- } else {
- V = Op;
- for (unsigned Shift = 8; Shift < Len; Shift *= 2) {
- SDValue ShiftC = DAG.getShiftAmountConstant(Shift, VT, dl);
- V = DAG.getNode(ISD::VP_ADD, dl, VT, V,
- DAG.getNode(ISD::VP_SHL, dl, VT, V, ShiftC, Mask, VL),
- Mask, VL);
- }
- }
- return DAG.getNode(ISD::VP_SRL, dl, VT, V, DAG.getConstant(Len - 8, dl, ShVT),
- Mask, VL);
-}
-
SDValue TargetLowering::expandCTLZ(SDNode *Node, SelectionDAG &DAG) const {
SDLoc dl(Node);
EVT VT = Node->getValueType(0);
@@ -11015,33 +10886,6 @@ SDValue TargetLowering::expandCTLZ(SDNode *Node, SelectionDAG &DAG) const {
return DAG.getNode(ISD::CTPOP, dl, VT, Op);
}
-SDValue TargetLowering::expandVPCTLZ(SDNode *Node, SelectionDAG &DAG) const {
- SDLoc dl(Node);
- EVT VT = Node->getValueType(0);
- EVT ShVT = getShiftAmountTy(VT, DAG.getDataLayout());
- SDValue Op = Node->getOperand(0);
- SDValue Mask = Node->getOperand(1);
- SDValue VL = Node->getOperand(2);
- unsigned NumBitsPerElt = VT.getScalarSizeInBits();
-
- // do this:
- // x = x | (x >> 1);
- // x = x | (x >> 2);
- // ...
- // x = x | (x >>16);
- // x = x | (x >>32); // for 64-bit input
- // return popcount(~x);
- for (unsigned i = 0; (1U << i) < NumBitsPerElt; ++i) {
- SDValue Tmp = DAG.getConstant(1ULL << i, dl, ShVT);
- Op = DAG.getNode(ISD::VP_OR, dl, VT, Op,
- DAG.getNode(ISD::VP_SRL, dl, VT, Op, Tmp, Mask, VL), Mask,
- VL);
- }
- Op = DAG.getNode(ISD::VP_XOR, dl, VT, Op, DAG.getAllOnesConstant(dl, VT),
- Mask, VL);
- return DAG.getNode(ISD::VP_CTPOP, dl, VT, Op, Mask, VL);
-}
-
SDValue TargetLowering::expandCTLS(SDNode *Node, SelectionDAG &DAG) const {
SDLoc dl(Node);
EVT VT = Node->getValueType(0);
@@ -11164,22 +11008,6 @@ SDValue TargetLowering::expandCTTZ(SDNode *Node, SelectionDAG &DAG) const {
return DAG.getNode(ISD::CTPOP, dl, VT, Tmp);
}
-SDValue TargetLowering::expandVPCTTZ(SDNode *Node, SelectionDAG &DAG) const {
- SDValue Op = Node->getOperand(0);
- SDValue Mask = Node->getOperand(1);
- SDValue VL = Node->getOperand(2);
- SDLoc dl(Node);
- EVT VT = Node->getValueType(0);
-
- // Same as the vector part of expandCTTZ, use: popcount(~x & (x - 1))
- SDValue Not = DAG.getNode(ISD::VP_XOR, dl, VT, Op,
- DAG.getAllOnesConstant(dl, VT), Mask, VL);
- SDValue MinusOne = DAG.getNode(ISD::VP_SUB, dl, VT, Op,
- DAG.getConstant(1, dl, VT), Mask, VL);
- SDValue Tmp = DAG.getNode(ISD::VP_AND, dl, VT, Not, MinusOne, Mask, VL);
- return DAG.getNode(ISD::VP_CTPOP, dl, VT, Tmp, Mask, VL);
-}
-
SDValue TargetLowering::expandVPCTTZElements(SDNode *N,
SelectionDAG &DAG) const {
// %cond = to_bool_vec %source
@@ -11675,82 +11503,6 @@ SDValue TargetLowering::expandBSWAP(SDNode *N, SelectionDAG &DAG) const {
}
}
-SDValue TargetLowering::expandVPBSWAP(SDNode *N, SelectionDAG &DAG) const {
- SDLoc dl(N);
- EVT VT = N->getValueType(0);
- SDValue Op = N->getOperand(0);
- SDValue Mask = N->getOperand(1);
- SDValue EVL = N->getOperand(2);
-
- if (!VT.isSimple())
- return SDValue();
-
- EVT SHVT = getShiftAmountTy(VT, DAG.getDataLayout());
- SDValue Tmp1, Tmp2, Tmp3, Tmp4, Tmp5, Tmp6, Tmp7, Tmp8;
- switch (VT.getSimpleVT().getScalarType().SimpleTy) {
- default:
- return SDValue();
- case MVT::i16:
- Tmp1 = DAG.getNode(ISD::VP_SHL, dl, VT, Op, DAG.getConstant(8, dl, SHVT),
- Mask, EVL);
- Tmp2 = DAG.getNode(ISD::VP_SRL, dl, VT, Op, DAG.getConstant(8, dl, SHVT),
- Mask, EVL);
- return DAG.getNode(ISD::VP_OR, dl, VT, Tmp1, Tmp2, Mask, EVL);
- case MVT::i32:
- Tmp4 = DAG.getNode(ISD::VP_SHL, dl, VT, Op, DAG.getConstant(24, dl, SHVT),
- Mask, EVL);
- Tmp3 = DAG.getNode(ISD::VP_AND, dl, VT, Op, DAG.getConstant(0xFF00, dl, VT),
- Mask, EVL);
- Tmp3 = DAG.getNode(ISD::VP_SHL, dl, VT, Tmp3, DAG.getConstant(8, dl, SHVT),
- Mask, EVL);
- Tmp2 = DAG.getNode(ISD::VP_SRL, dl, VT, Op, DAG.getConstant(8, dl, SHVT),
- Mask, EVL);
- Tmp2 = DAG.getNode(ISD::VP_AND, dl, VT, Tmp2,
- DAG.getConstant(0xFF00, dl, VT), Mask, EVL);
- Tmp1 = DAG.getNode(ISD::VP_SRL, dl, VT, Op, DAG.getConstant(24, dl, SHVT),
- Mask, EVL);
- Tmp4 = DAG.getNode(ISD::VP_OR, dl, VT, Tmp4, Tmp3, Mask, EVL);
- Tmp2 = DAG.getNode(ISD::VP_OR, dl, VT, Tmp2, Tmp1, Mask, EVL);
- return DAG.getNode(ISD::VP_OR, dl, VT, Tmp4, Tmp2, Mask, EVL);
- case MVT::i64:
- Tmp8 = DAG.getNode(ISD::VP_SHL, dl, VT, Op, DAG.getConstant(56, dl, SHVT),
- Mask, EVL);
- Tmp7 = DAG.getNode(ISD::VP_AND, dl, VT, Op,
- DAG.getConstant(255ULL << 8, dl, VT), Mask, EVL);
- Tmp7 = DAG.getNode(ISD::VP_SHL, dl, VT, Tmp7, DAG.getConstant(40, dl, SHVT),
- Mask, EVL);
- Tmp6 = DAG.getNode(ISD::VP_AND, dl, VT, Op,
- DAG.getConstant(255ULL << 16, dl, VT), Mask, EVL);
- Tmp6 = DAG.getNode(ISD::VP_SHL, dl, VT, Tmp6, DAG.getConstant(24, dl, SHVT),
- Mask, EVL);
- Tmp5 = DAG.getNode(ISD::VP_AND, dl, VT, Op,
- DAG.getConstant(255ULL << 24, dl, VT), Mask, EVL);
- Tmp5 = DAG.getNode(ISD::VP_SHL, dl, VT, Tmp5, DAG.getConstant(8, dl, SHVT),
- Mask, EVL);
- Tmp4 = DAG.getNode(ISD::VP_SRL, dl, VT, Op, DAG.getConstant(8, dl, SHVT),
- Mask, EVL);
- Tmp4 = DAG.getNode(ISD::VP_AND, dl, VT, Tmp4,
- DAG.getConstant(255ULL << 24, dl, VT), Mask, EVL);
- Tmp3 = DAG.getNode(ISD::VP_SRL, dl, VT, Op, DAG.getConstant(24, dl, SHVT),
- Mask, EVL);
- Tmp3 = DAG.getNode(ISD::VP_AND, dl, VT, Tmp3,
- DAG.getConstant(255ULL << 16, dl, VT), Mask, EVL);
- Tmp2 = DAG.getNode(ISD::VP_SRL, dl, VT, Op, DAG.getConstant(40, dl, SHVT),
- Mask, EVL);
- Tmp2 = DAG.getNode(ISD::VP_AND, dl, VT, Tmp2,
- DAG.getConstant(255ULL << 8, dl, VT), Mask, EVL);
- Tmp1 = DAG.getNode(ISD::VP_SRL, dl, VT, Op, DAG.getConstant(56, dl, SHVT),
- Mask, EVL);
- Tmp8 = DAG.getNode(ISD::VP_OR, dl, VT, Tmp8, Tmp7, Mask, EVL);
- Tmp6 = DAG.getNode(ISD::VP_OR, dl, VT, Tmp6, Tmp5, Mask, EVL);
- Tmp4 = DAG.getNode(ISD::VP_OR, dl, VT, Tmp4, Tmp3, Mask, EVL);
- Tmp2 = DAG.getNode(ISD::VP_OR, dl, VT, Tmp2, Tmp1, Mask, EVL);
- Tmp8 = DAG.getNode(ISD::VP_OR, dl, VT, Tmp8, Tmp6, Mask, EVL);
- Tmp4 = DAG.getNode(ISD::VP_OR, dl, VT, Tmp4, Tmp2, Mask, EVL);
- return DAG.getNode(ISD::VP_OR, dl, VT, Tmp8, Tmp4, Mask, EVL);
- }
-}
-
SDValue TargetLowering::expandBITREVERSE(SDNode *N, SelectionDAG &DAG) const {
SDLoc dl(N);
EVT VT = N->getValueType(0);
@@ -11812,68 +11564,6 @@ SDValue TargetLowering::expandBITREVERSE(SDNode *N, SelectionDAG &DAG) const {
return Tmp;
}
-SDValue TargetLowering::expandVPBITREVERSE(SDNode *N, SelectionDAG &DAG) const {
- assert(N->getOpcode() == ISD::VP_BITREVERSE);
-
- SDLoc dl(N);
- EVT VT = N->getValueType(0);
- SDValue Op = N->getOperand(0);
- SDValue Mask = N->getOperand(1);
- SDValue EVL = N->getOperand(2);
- EVT SHVT = getShiftAmountTy(VT, DAG.getDataLayout());
- unsigned Sz = VT.getScalarSizeInBits();
-
- SDValue Tmp, Tmp2, Tmp3;
-
- // If we can, perform BSWAP first and then the mask+swap the i4, then i2
- // and finally the i1 pairs.
- // TODO: We can easily support i4/i2 legal types if any target ever does.
- if (Sz >= 8 && isPowerOf2_32(Sz)) {
- // Create the masks - repeating the pattern every byte.
- APInt Mask4 = APInt::getSplat(Sz, APInt(8, 0x0F));
- APInt Mask2 = APInt::getSplat(Sz, APInt(8, 0x33));
- APInt Mask1 = APInt::getSplat(Sz, APInt(8, 0x55));
-
- // BSWAP if the type is wider than a single byte.
- Tmp = (Sz > 8 ? DAG.getNode(ISD::VP_BSWAP, dl, VT, Op, Mask, EVL) : Op);
-
- // swap i4: ((V >> 4) & 0x0F) | ((V & 0x0F) << 4)
- Tmp2 = DAG.getNode(ISD::VP_SRL, dl, VT, Tmp, DAG.getConstant(4, dl, SHVT),
- Mask, EVL);
- Tmp2 = DAG.getNode(ISD::VP_AND, dl, VT, Tmp2,
- DAG.getConstant(Mask4, dl, VT), Mask, EVL);
- Tmp3 = DAG.getNode(ISD::VP_AND, dl, VT, Tmp, DAG.getConstant(Mask4, dl, VT),
- Mask, EVL);
- Tmp3 = DAG.getNode(ISD::VP_SHL, dl, VT, Tmp3, DAG.getConstant(4, dl, SHVT),
- Mask, EVL);
- Tmp = DAG.getNode(ISD::VP_OR, dl, VT, Tmp2, Tmp3, Mask, EVL);
-
- // swap i2: ((V >> 2) & 0x33) | ((V & 0x33) << 2)
- Tmp2 = DAG.getNode(ISD::VP_SRL, dl, VT, Tmp, DAG.getConstant(2, dl, SHVT),
- Mask, EVL);
- Tmp2 = DAG.getNode(ISD::VP_AND, dl, VT, Tmp2,
- DAG.getConstant(Mask2, dl, VT), Mask, EVL);
- Tmp3 = DAG.getNode(ISD::VP_AND, dl, VT, Tmp, DAG.getConstant(Mask2, dl, VT),
- Mask, EVL);
- Tmp3 = DAG.getNode(ISD::VP_SHL, dl, VT, Tmp3, DAG.getConstant(2, dl, SHVT),
- Mask, EVL);
- Tmp = DAG.getNode(ISD::VP_OR, dl, VT, Tmp2, Tmp3, Mask, EVL);
-
- // swap i1: ((V >> 1) & 0x55) | ((V & 0x55) << 1)
- Tmp2 = DAG.getNode(ISD::VP_SRL, dl, VT, Tmp, DAG.getConstant(1, dl, SHVT),
- Mask, EVL);
- Tmp2 = DAG.getNode(ISD::VP_AND, dl, VT, Tmp2,
- DAG.getConstant(Mask1, dl, VT), Mask, EVL);
- Tmp3 = DAG.getNode(ISD::VP_AND, dl, VT, Tmp, DAG.getConstant(Mask1, dl, VT),
- Mask, EVL);
- Tmp3 = DAG.getNode(ISD::VP_SHL, dl, VT, Tmp3, DAG.getConstant(1, dl, SHVT),
- Mask, EVL);
- Tmp = DAG.getNode(ISD::VP_OR, dl, VT, Tmp2, Tmp3, Mask, EVL);
- return Tmp;
- }
- return SDValue();
-}
-
std::pair<SDValue, SDValue>
TargetLowering::scalarizeVectorLoad(LoadSDNode *LD,
SelectionDAG &DAG) const {
@@ -14182,15 +13872,12 @@ bool TargetLowering::expandMultipleResultFPLibCall(
bool TargetLowering::LegalizeSetCCCondCode(SelectionDAG &DAG, EVT VT,
SDValue &LHS, SDValue &RHS,
- SDValue &CC, SDValue Mask,
- SDValue EVL, bool &NeedInvert,
+ SDValue &CC, bool &NeedInvert,
const SDLoc &dl, SDValue &Chain,
bool IsSignaling) const {
MVT OpVT = LHS.getSimpleValueType();
ISD::CondCode CCCode = cast<CondCodeSDNode>(CC)->get();
NeedInvert = false;
- assert(!EVL == !Mask && "VP Mask and EVL must either both be set or unset");
- bool IsNonVP = !EVL;
switch (getCondCodeAction(CCCode, OpVT)) {
default:
llvm_unreachable("Unknown condition code action!");
@@ -14337,34 +14024,17 @@ bool TargetLowering::LegalizeSetCCCondCode(SelectionDAG &DAG, EVT VT,
if (CCCode != ISD::SETO && CCCode != ISD::SETUO) {
// If we aren't the ordered or unorder operation,
// then the pattern is (LHS CC1 RHS) Opc (LHS CC2 RHS).
- if (IsNonVP) {
- SetCC1 = DAG.getSetCC(dl, VT, LHS, RHS, CC1, Chain, IsSignaling);
- SetCC2 = DAG.getSetCC(dl, VT, LHS, RHS, CC2, Chain, IsSignaling);
- } else {
- SetCC1 = DAG.getSetCCVP(dl, VT, LHS, RHS, CC1, Mask, EVL);
- SetCC2 = DAG.getSetCCVP(dl, VT, LHS, RHS, CC2, Mask, EVL);
- }
+ SetCC1 = DAG.getSetCC(dl, VT, LHS, RHS, CC1, Chain, IsSignaling);
+ SetCC2 = DAG.getSetCC(dl, VT, LHS, RHS, CC2, Chain, IsSignaling);
} else {
// Otherwise, the pattern is (LHS CC1 LHS) Opc (RHS CC2 RHS)
- if (IsNonVP) {
- SetCC1 = DAG.getSetCC(dl, VT, LHS, LHS, CC1, Chain, IsSignaling);
- SetCC2 = DAG.getSetCC(dl, VT, RHS, RHS, CC2, Chain, IsSignaling);
- } else {
- SetCC1 = DAG.getSetCCVP(dl, VT, LHS, LHS, CC1, Mask, EVL);
- SetCC2 = DAG.getSetCCVP(dl, VT, RHS, RHS, CC2, Mask, EVL);
- }
+ SetCC1 = DAG.getSetCC(dl, VT, LHS, LHS, CC1, Chain, IsSignaling);
+ SetCC2 = DAG.getSetCC(dl, VT, RHS, RHS, CC2, Chain, IsSignaling);
}
if (Chain)
Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, SetCC1.getValue(1),
SetCC2.getValue(1));
- if (IsNonVP)
- LHS = DAG.getNode(Opc, dl, VT, SetCC1, SetCC2);
- else {
- // Transform the binary opcode to the VP equivalent.
- assert((Opc == ISD::OR || Opc == ISD::AND) && "Unexpected opcode");
- Opc = Opc == ISD::OR ? ISD::VP_OR : ISD::VP_AND;
- LHS = DAG.getNode(Opc, dl, VT, SetCC1, SetCC2, Mask, EVL);
- }
+ LHS = DAG.getNode(Opc, dl, VT, SetCC1, SetCC2);
RHS = SDValue();
CC = SDValue();
return true;
diff --git a/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp b/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp
index 6798875f5fec5..3f431d22d273f 100644
--- a/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp
+++ b/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp
@@ -7730,10 +7730,6 @@ unsigned NVPTXTargetLowering::getPreferredFPToIntOpcode(unsigned Op, EVT FromVT,
if (isOperationLegal(ISD::STRICT_FP_TO_SINT, ToVT))
return ISD::STRICT_FP_TO_SINT;
break;
- case ISD::VP_FP_TO_UINT:
- if (isOperationLegal(ISD::VP_FP_TO_SINT, ToVT))
- return ISD::VP_FP_TO_SINT;
- break;
default:
break;
}
diff --git a/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp b/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp
index 543b769b1a666..5b7c1e9ebc24f 100644
--- a/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp
+++ b/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp
@@ -1151,95 +1151,6 @@ TEST_F(SelectionDAGPatternMatchTest, matchIntrinsicWOChain) {
Add, m_IntrinsicWOChain<Intrinsic::x86_aadd32>(m_Value(), m_Value())));
}
-namespace {
-struct VPMatchContext : public SDPatternMatch::BasicMatchContext {
- using SDPatternMatch::BasicMatchContext::BasicMatchContext;
-
- bool match(SDValue OpVal, unsigned Opc) const {
- if (!OpVal->isVPOpcode())
- return OpVal->getOpcode() == Opc;
-
- auto BaseOpc = ISD::getBaseOpcodeForVP(OpVal->getOpcode(), false);
- return BaseOpc == Opc;
- }
-
- unsigned getNumOperands(SDValue N) const {
- return N->isVPOpcode() ? N->getNumOperands() - 2 : N->getNumOperands();
- }
-};
-} // anonymous namespace
-TEST_F(SelectionDAGPatternMatchTest, matchContext) {
- SDLoc DL;
- auto BoolVT = EVT::getIntegerVT(Context, 1);
- auto Int32VT = EVT::getIntegerVT(Context, 32);
- auto VInt32VT = EVT::getVectorVT(Context, Int32VT, 4);
- auto MaskVT = EVT::getVectorVT(Context, BoolVT, 4);
-
- SDValue Scalar0 = DAG->getCopyFromReg(DAG->getEntryNode(), DL,
- Register::index2VirtReg(1), Int32VT);
- SDValue Vector0 = DAG->getCopyFromReg(DAG->getEntryNode(), DL,
- Register::index2VirtReg(2), VInt32VT);
- SDValue Mask0 = DAG->getCopyFromReg(DAG->getEntryNode(), DL,
- Register::index2VirtReg(3), MaskVT);
-
- SDValue VPAdd = DAG->getNode(ISD::VP_ADD, DL, VInt32VT,
- {Vector0, Vector0, Mask0, Scalar0});
- SDValue VPReduceAdd = DAG->getNode(ISD::VP_REDUCE_ADD, DL, Int32VT,
- {Scalar0, VPAdd, Mask0, Scalar0});
- SDValue Add = DAG->getNode(ISD::ADD, DL, VInt32VT, {Vector0, Vector0});
-
- using namespace SDPatternMatch;
- VPMatchContext VPCtx(DAG.get());
- EXPECT_TRUE(sd_context_match(VPAdd, VPCtx, m_SpecificOpc(ISD::ADD)));
- EXPECT_TRUE(
- sd_context_match(VPAdd, VPCtx, m_Node(ISD::ADD, m_Value(), m_Value())));
- // VPMatchContext can't match pattern using explicit VP Opcode
- EXPECT_FALSE(sd_context_match(VPAdd, VPCtx,
- m_Node(ISD::VP_ADD, m_Value(), m_Value())));
- EXPECT_FALSE(sd_context_match(
- VPAdd, VPCtx,
- m_Node(ISD::VP_ADD, m_Value(), m_Value(), m_Value(), m_Value())));
- // Check Binary Op Pattern
- EXPECT_TRUE(sd_context_match(VPAdd, VPCtx, m_Add(m_Value(), m_Value())));
- // VP_REDUCE_ADD doesn't have a based opcode, so we use a normal
- // sd_match before switching to VPMatchContext when checking VPAdd.
- EXPECT_TRUE(
- sd_match(VPReduceAdd, m_Node(ISD::VP_REDUCE_ADD, m_Value(),
- m_Context(VPCtx, m_SpecificOpc(ISD::ADD)),
- m_Value(), m_Value())));
- // non-vector predicated should match too
- EXPECT_TRUE(sd_context_match(Add, VPCtx, m_SpecificOpc(ISD::ADD)));
- EXPECT_TRUE(
- sd_context_match(Add, VPCtx, m_Node(ISD::ADD, m_Value(), m_Value())));
- EXPECT_FALSE(sd_context_match(
- Add, VPCtx,
- m_Node(ISD::ADD, m_Value(), m_Value(), m_Value(), m_Value())));
- EXPECT_TRUE(sd_context_match(Add, VPCtx, m_Add(m_Value(), m_Value())));
-}
-
-TEST_F(SelectionDAGPatternMatchTest, matchVPWithBasicContext) {
- SDLoc DL;
- auto BoolVT = EVT::getIntegerVT(Context, 1);
- auto Int32VT = EVT::getIntegerVT(Context, 32);
- auto VInt32VT = EVT::getVectorVT(Context, Int32VT, 4);
- auto MaskVT = EVT::getVectorVT(Context, BoolVT, 4);
-
- SDValue Vector0 = DAG->getCopyFromReg(DAG->getEntryNode(), DL,
- Register::index2VirtReg(1), VInt32VT);
- SDValue Mask = DAG->getCopyFromReg(DAG->getEntryNode(), DL,
- Register::index2VirtReg(2), MaskVT);
- SDValue EL = DAG->getCopyFromReg(DAG->getEntryNode(), DL,
- Register::index2VirtReg(3), Int32VT);
-
- SDValue VPAdd =
- DAG->getNode(ISD::VP_ADD, DL, VInt32VT, Vector0, Vector0, Mask, EL);
-
- using namespace SDPatternMatch;
- EXPECT_FALSE(sd_match(VPAdd, m_Node(ISD::VP_ADD, m_Value(), m_Value())));
- EXPECT_TRUE(sd_match(
- VPAdd, m_Node(ISD::VP_ADD, m_Value(), m_Value(), m_Value(), m_Value())));
-}
-
TEST_F(SelectionDAGPatternMatchTest, matchAdvancedProperties) {
SDLoc DL;
auto Int16VT = EVT::getIntegerVT(Context, 16);
More information about the llvm-branch-commits
mailing list