[PATCH] D148521: [VP] Change getVPForBaseOpcode to return std::optional
Luke Lau via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 17 06:07:52 PDT 2023
luke created this revision.
luke added reviewers: fakepaper56, craig.topper, frasercrmck, reames.
Herald added subscribers: asb, pmatos, ecnelises, hiraditya.
Herald added a project: All.
luke requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
In an upcoming patch we would like to check if a regular base opcode has
a corresponding VP opcode, so this changes the signature to return
std::nullopt instead of LLVM_UNREACHABLE.
Where we previously relied on it to be unreachable, we unwrap with
`value()` to throw a std::bad_optional_access instead.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D148521
Files:
llvm/include/llvm/CodeGen/ISDOpcodes.h
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
===================================================================
--- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -531,10 +531,10 @@
return std::nullopt;
}
-unsigned ISD::getVPForBaseOpcode(unsigned Opcode) {
+std::optional<unsigned> ISD::getVPForBaseOpcode(unsigned Opcode) {
switch (Opcode) {
default:
- llvm_unreachable("can not translate this Opcode to VP.");
+ return std::nullopt;
#define BEGIN_REGISTER_VP_SDNODE(VPOPC, ...) break;
#define VP_PROPERTY_FUNCTIONAL_SDOPC(SDOPC) case ISD::SDOPC:
#define END_REGISTER_VP_SDNODE(VPOPC) return ISD::VPOPC;
Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
===================================================================
--- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -934,7 +934,7 @@
// 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);
+ unsigned VPOpcode = ISD::getVPForBaseOpcode(Opcode).value();
assert(ISD::getVPMaskIdx(VPOpcode) == 1 &&
ISD::getVPExplicitVectorLengthIdx(VPOpcode) == 2);
return DAG.getNode(VPOpcode, DL, VT,
@@ -943,7 +943,7 @@
SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, SDValue N1,
SDValue N2) {
- unsigned VPOpcode = ISD::getVPForBaseOpcode(Opcode);
+ unsigned VPOpcode = ISD::getVPForBaseOpcode(Opcode).value();
assert(ISD::getVPMaskIdx(VPOpcode) == 2 &&
ISD::getVPExplicitVectorLengthIdx(VPOpcode) == 3);
return DAG.getNode(VPOpcode, DL, VT,
@@ -952,7 +952,7 @@
SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, SDValue N1,
SDValue N2, SDValue N3) {
- unsigned VPOpcode = ISD::getVPForBaseOpcode(Opcode);
+ unsigned VPOpcode = ISD::getVPForBaseOpcode(Opcode).value();
assert(ISD::getVPMaskIdx(VPOpcode) == 3 &&
ISD::getVPExplicitVectorLengthIdx(VPOpcode) == 4);
return DAG.getNode(VPOpcode, DL, VT,
@@ -961,7 +961,7 @@
SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, SDValue Operand,
SDNodeFlags Flags) {
- unsigned VPOpcode = ISD::getVPForBaseOpcode(Opcode);
+ unsigned VPOpcode = ISD::getVPForBaseOpcode(Opcode).value();
assert(ISD::getVPMaskIdx(VPOpcode) == 1 &&
ISD::getVPExplicitVectorLengthIdx(VPOpcode) == 2);
return DAG.getNode(VPOpcode, DL, VT, {Operand, RootMaskOp, RootVectorLenOp},
@@ -970,7 +970,7 @@
SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, SDValue N1,
SDValue N2, SDNodeFlags Flags) {
- unsigned VPOpcode = ISD::getVPForBaseOpcode(Opcode);
+ unsigned VPOpcode = ISD::getVPForBaseOpcode(Opcode).value();
assert(ISD::getVPMaskIdx(VPOpcode) == 2 &&
ISD::getVPExplicitVectorLengthIdx(VPOpcode) == 3);
return DAG.getNode(VPOpcode, DL, VT, {N1, N2, RootMaskOp, RootVectorLenOp},
@@ -979,7 +979,7 @@
SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, SDValue N1,
SDValue N2, SDValue N3, SDNodeFlags Flags) {
- unsigned VPOpcode = ISD::getVPForBaseOpcode(Opcode);
+ unsigned VPOpcode = ISD::getVPForBaseOpcode(Opcode).value();
assert(ISD::getVPMaskIdx(VPOpcode) == 3 &&
ISD::getVPExplicitVectorLengthIdx(VPOpcode) == 4);
return DAG.getNode(VPOpcode, DL, VT,
@@ -988,7 +988,7 @@
bool isOperationLegalOrCustom(unsigned Op, EVT VT,
bool LegalOnly = false) const {
- unsigned VPOp = ISD::getVPForBaseOpcode(Op);
+ unsigned VPOp = ISD::getVPForBaseOpcode(Op).value();
return TLI.isOperationLegalOrCustom(VPOp, VT, LegalOnly);
}
};
Index: llvm/include/llvm/CodeGen/ISDOpcodes.h
===================================================================
--- llvm/include/llvm/CodeGen/ISDOpcodes.h
+++ llvm/include/llvm/CodeGen/ISDOpcodes.h
@@ -1363,7 +1363,7 @@
std::optional<unsigned> getBaseOpcodeForVP(unsigned Opcode, bool hasFPExcept);
/// Translate this non-VP Opcode to its corresponding VP Opcode.
-unsigned getVPForBaseOpcode(unsigned Opcode);
+std::optional<unsigned> getVPForBaseOpcode(unsigned Opcode);
//===--------------------------------------------------------------------===//
/// MemIndexedMode enum - This enum defines the load / store indexed
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D148521.514190.patch
Type: text/x-patch
Size: 4529 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230417/2a4c9ec2/attachment.bin>
More information about the llvm-commits
mailing list