From 1b8177232813a048407bbb43eef18d7f72794b35 Mon Sep 17 00:00:00 2001 From: Florian Hahn Date: Fri, 18 Jan 2019 10:00:38 +0000 Subject: [PATCH] [SelectionDAG] Add static getMaxNumOperands function to SDNode. Summary: Use this helper to make sure we use the same value at various places. This will likely be needed at more places were we currently crash because we use more operands than possible. Also makes it easier to change in the future. Reviewers: RKSimon, craig.topper, efriedma, aemerson Reviewed By: RKSimon Subscribers: hiraditya, arsenm, llvm-commits Differential Revision: https://reviews.llvm.org/D56859 llvm-svn: 351537 --- llvm/include/llvm/CodeGen/SelectionDAGNodes.h | 5 +++++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 3 +-- llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/llvm/include/llvm/CodeGen/SelectionDAGNodes.h b/llvm/include/llvm/CodeGen/SelectionDAGNodes.h index 10f284179084..f7554ad66488 100644 --- a/llvm/include/llvm/CodeGen/SelectionDAGNodes.h +++ b/llvm/include/llvm/CodeGen/SelectionDAGNodes.h @@ -898,6 +898,11 @@ public: /// Return the number of values used by this operation. unsigned getNumOperands() const { return NumOperands; } + /// Return the maximum number of operands that a SDNode can hold. + static constexpr size_t getMaxNumOperands() { + return std::numeric_limits::max(); + } + /// Helper method returns the integer value of a ConstantSDNode operand. inline uint64_t getConstantOperandVal(unsigned Num) const; diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 647496c1afcb..af81216e3449 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -9266,8 +9266,7 @@ SDNode *SelectionDAG::isConstantFPBuildVectorOrConstantFP(SDValue N) { void SelectionDAG::createOperands(SDNode *Node, ArrayRef Vals) { assert(!Node->OperandList && "Node already has operands"); - assert(std::numeric_limits::max() >= - Vals.size() && + assert(SDNode::getMaxNumOperands() >= Vals.size() && "too many operands to fit into SDNode"); SDUse *Ops = OperandRecycler.allocate( ArrayRecycler::Capacity::get(Vals.size()), OperandAllocator); diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index 3390703c7bae..9f09f25f2ffd 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -1035,7 +1035,7 @@ SDValue SelectionDAGBuilder::getRoot() { // If we have >= 2^16 loads then split across multiple token factors as // there's a 64k limit on the number of SDNode operands. SDValue Root; - size_t Limit = (1 << 16) - 1; + size_t Limit = SDNode::getMaxNumOperands(); while (PendingLoads.size() > Limit) { unsigned SliceIdx = PendingLoads.size() - Limit; auto ExtractedTFs = ArrayRef(PendingLoads).slice(SliceIdx, Limit);