diff --git a/llvm/include/llvm/Analysis/InlineOrder.h b/llvm/include/llvm/Analysis/InlineOrder.h new file mode 100644 --- /dev/null +++ b/llvm/include/llvm/Analysis/InlineOrder.h @@ -0,0 +1,52 @@ + +//===- InlineOrder.h - Inlining order abstraction -*- C++ ---*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +#ifndef LLVM_ANALYSIS_INLINEORDER_H +#define LLVM_ANALYSIS_INLINEORDER_H + +#include "llvm/ADT/SmallVector.h" + +namespace llvm { + +class InlineOrder { +public: + using T = std::pair; + using iterator = T *; + using const_iterator = const T *; + using reference = T &; + + 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) { return Calls[idx]; } + void push_back(const T &Elt) { Calls.push_back(Elt); } + T pop() { return Calls.pop_back_val(); } + iterator erase(const_iterator CB, const_iterator CE) { + return Calls.erase(CB, CE); + } + iterator begin() { return Calls.begin(); } + iterator end() { return Calls.end(); } + +private: + SmallVector Calls; +}; + +} // namespace llvm +#endif // LLVM_ANALYSIS_INLINEORDER_H 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 @@ -31,6 +31,7 @@ #include "llvm/Analysis/GlobalsModRef.h" #include "llvm/Analysis/InlineAdvisor.h" #include "llvm/Analysis/InlineCost.h" +#include "llvm/Analysis/InlineOrder.h" #include "llvm/Analysis/LazyCallGraph.h" #include "llvm/Analysis/OptimizationRemarkEmitter.h" #include "llvm/Analysis/ProfileSummaryInfo.h" @@ -714,7 +715,8 @@ // 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; + // SmallVector, 16> Calls; // Populate the initial list of calls in this SCC. for (auto &N : InitialC) {