Skip to content

Commit

Permalink
[VE][NFC] Factor out helper functions
Browse files Browse the repository at this point in the history
Factor out some helper functions to cleanup VEISelLowering.

Reviewed By: kaz7

Differential Revision: https://reviews.llvm.org/D117683
  • Loading branch information
simoll committed Jan 21, 2022
1 parent 6a19cb8 commit 7950010
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 32 deletions.
30 changes: 30 additions & 0 deletions llvm/lib/Target/VE/VECustomDAG.cpp
Expand Up @@ -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
6 changes: 6 additions & 0 deletions llvm/lib/Target/VE/VECustomDAG.h
Expand Up @@ -21,6 +21,10 @@

namespace llvm {

Optional<unsigned> getVVPOpcode(unsigned Opcode);

bool isVVPBinaryOp(unsigned Opcode);

class VECustomDAG {
SelectionDAG &DAG;
SDLoc DL;
Expand Down Expand Up @@ -64,6 +68,8 @@ class VECustomDAG {

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
Expand Down
37 changes: 5 additions & 32 deletions llvm/lib/Target/VE/VEISelLowering.cpp
Expand Up @@ -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
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 7950010

Please sign in to comment.