[VE][NFC] Factor out helper functions

Factor out some helper functions to cleanup VEISelLowering.

Reviewed By: kaz7

Differential Revision: https://reviews.llvm.org/D117683
This commit is contained in:
Simon Moll 2022-01-21 09:15:50 +01:00
parent 6a19cb837c
commit 7950010e49
3 changed files with 41 additions and 32 deletions

View File

@ -19,9 +19,39 @@
namespace llvm {
/// \returns the VVP_* SDNode opcode corresponsing to \p OC.
Optional<unsigned> getVVPOpcode(unsigned Opcode) {
switch (Opcode) {
#define HANDLE_VP_TO_VVP(VPOPC, VVPNAME) \
case ISD::VPOPC: \
return VEISD::VVPNAME;
#define ADD_VVP_OP(VVPNAME, SDNAME) \
case VEISD::VVPNAME: \
case ISD::SDNAME: \
return VEISD::VVPNAME;
#include "VVPNodes.def"
}
return None;
}
bool isVVPBinaryOp(unsigned VVPOpcode) {
switch (VVPOpcode) {
#define ADD_BINARY_VVP_OP(VVPNAME, ...) \
case VEISD::VVPNAME: \
return true;
#include "VVPNodes.def"
}
return false;
}
SDValue VECustomDAG::getConstant(uint64_t Val, EVT VT, bool IsTarget,
bool IsOpaque) const {
return DAG.getConstant(Val, DL, VT, IsTarget, IsOpaque);
}
SDValue VECustomDAG::getBroadcast(EVT ResultVT, SDValue Scalar,
SDValue AVL) const {
return getNode(VEISD::VEC_BROADCAST, ResultVT, {Scalar, AVL});
}
} // namespace llvm

View File

@ -21,6 +21,10 @@
namespace llvm {
Optional<unsigned> getVVPOpcode(unsigned Opcode);
bool isVVPBinaryOp(unsigned Opcode);
class VECustomDAG {
SelectionDAG &DAG;
SDLoc DL;
@ -64,6 +68,8 @@ public:
SDValue getConstant(uint64_t Val, EVT VT, bool IsTarget = false,
bool IsOpaque = false) const;
SDValue getBroadcast(EVT ResultVT, SDValue Scalar, SDValue AVL) const;
};
} // namespace llvm

View File

@ -1661,8 +1661,7 @@ SDValue VETargetLowering::lowerBUILD_VECTOR(SDValue Op,
MVT LegalResVT = MVT::getVectorVT(ElemVT, 256);
auto AVL = CDAG.getConstant(NumEls, MVT::i32);
return CDAG.getNode(VEISD::VEC_BROADCAST, LegalResVT,
{Op.getOperand(0), AVL});
return CDAG.getBroadcast(LegalResVT, Op.getOperand(0), AVL);
}
// Expand
@ -2667,21 +2666,6 @@ bool VETargetLowering::hasAndNot(SDValue Y) const {
return true;
}
/// \returns the VVP_* SDNode opcode corresponsing to \p OC.
static Optional<unsigned> getVVPOpcode(unsigned Opcode) {
switch (Opcode) {
#define HANDLE_VP_TO_VVP(VPOPC, VVPNAME) \
case ISD::VPOPC: \
return VEISD::VVPNAME;
#define ADD_VVP_OP(VVPNAME, SDNAME) \
case VEISD::VVPNAME: \
case ISD::SDNAME: \
return VEISD::VVPNAME;
#include "VVPNodes.def"
}
return None;
}
SDValue VETargetLowering::lowerToVVP(SDValue Op, SelectionDAG &DAG) const {
// Can we represent this as a VVP node.
const unsigned Opcode = Op->getOpcode();
@ -2711,26 +2695,15 @@ SDValue VETargetLowering::lowerToVVP(SDValue Op, SelectionDAG &DAG) const {
// Materialize the VL parameter.
AVL = CDAG.getConstant(OpVecVT.getVectorNumElements(), MVT::i32);
SDValue ConstTrue = CDAG.getConstant(1, MVT::i32);
Mask = CDAG.getNode(VEISD::VEC_BROADCAST, MaskVT,
ConstTrue); // emit a VEISD::VEC_BROADCAST here.
Mask = CDAG.getBroadcast(MaskVT, ConstTrue, AVL);
}
// Categories we are interested in.
bool IsBinaryOp = false;
switch (VVPOpcode) {
#define ADD_BINARY_VVP_OP(VVPNAME, ...) \
case VEISD::VVPNAME: \
IsBinaryOp = true; \
break;
#include "VVPNodes.def"
}
if (IsBinaryOp) {
if (isVVPBinaryOp(VVPOpcode)) {
assert(LegalVecVT.isSimple());
return CDAG.getNode(VVPOpcode, LegalVecVT,
{Op->getOperand(0), Op->getOperand(1), Mask, AVL});
} else if (VVPOpcode == VEISD::VVP_SELECT) {
}
if (VVPOpcode == VEISD::VVP_SELECT) {
auto Mask = Op->getOperand(0);
auto OnTrue = Op->getOperand(1);
auto OnFalse = Op->getOperand(2);