diff --git a/llvm/lib/Transforms/IPO/Inliner.cpp b/llvm/lib/Transforms/IPO/Inliner.cpp --- a/llvm/lib/Transforms/IPO/Inliner.cpp +++ b/llvm/lib/Transforms/IPO/Inliner.cpp @@ -670,6 +670,42 @@ return *IAA->getAdvisor(); } +class InlineOrder { +public: + using T = std::pair; + using iterator = T *; + using const_iterator = const T *; + using reference = T &; + + virtual ~InlineOrder() {} + + virtual size_t size() = 0; + virtual reference operator[](size_t idx) = 0; + virtual void push_back(const T &Elt) = 0; + virtual T pop() = 0; + virtual iterator erase(const_iterator B, const_iterator E) = 0; + virtual iterator begin() = 0; + virtual iterator end() = 0; + + bool empty() { return !size(); } +}; + +class DefaultInlineOrder : public InlineOrder { +public: + size_t size() override { return Calls.size(); } + reference operator[](size_t idx) override { return Calls[idx]; } + void push_back(const T &Elt) override { Calls.push_back(Elt); } + T pop() override { return Calls.pop_back_val(); } + iterator erase(const_iterator CB, const_iterator CE) override { + return Calls.erase(CB, CE); + } + iterator begin() override { return Calls.begin(); } + iterator end() override { return Calls.end(); } + +private: + SmallVector Calls; +}; + PreservedAnalyses InlinerPass::run(LazyCallGraph::SCC &InitialC, CGSCCAnalysisManager &AM, LazyCallGraph &CG, CGSCCUpdateResult &UR) { @@ -714,7 +750,7 @@ // this model, but it is uniformly spread across all the functions in the SCC // and eventually they all become too large to inline, rather than // incrementally maknig a single function grow in a super linear fashion. - SmallVector, 16> Calls; + DefaultInlineOrder Calls; // Populate the initial list of calls in this SCC. for (auto &N : InitialC) {