9 #ifndef LLVM_ANALYSIS_INLINEORDER_H
10 #define LLVM_ANALYSIS_INLINEORDER_H
30 virtual size_t size() = 0;
32 virtual void push(
const T &Elt) = 0;
43 template <
typename T,
typename Container = SmallVector<T, 16>>
49 size_t size()
override {
return Calls.size() - FirstIndex; }
51 void push(
const T &Elt)
override { Calls.push_back(Elt); }
55 return Calls[FirstIndex++];
60 return Calls[FirstIndex];
64 Calls.erase(
std::remove_if(Calls.begin() + FirstIndex, Calls.end(), Pred),
70 size_t FirstIndex = 0;
82 using PriorityT = unsigned;
85 static PriorityT evaluate(
const CallBase *CB) {
87 return Callee->getInstructionCount();
90 static bool isMoreDesirable(
const PriorityT &P1,
const PriorityT &
P2) {
95 const auto I1 = Priorities.
find(L);
96 const auto I2 = Priorities.
find(R);
98 return isMoreDesirable(I2->second,
I1->second);
106 auto It = Priorities.
find(CB);
107 const auto OldPriority = It->second;
108 It->second = evaluate(CB);
109 const auto NewPriority = It->second;
110 return isMoreDesirable(OldPriority, NewPriority);
115 using T = std::pair<CallBase *, int>;
116 using reference =
T &;
117 using const_reference =
const T &;
127 while (PriorityPtr->updateAndCheckDecreased(Heap.front())) {
128 std::pop_heap(Heap.begin(), Heap.end(), isLess);
129 std::push_heap(Heap.begin(), Heap.end(), isLess);
135 : PriorityPtr(
std::
move(PriorityPtr)) {
137 return this->PriorityPtr->hasLowerPriority(L, R);
141 size_t size()
override {
return Heap.size(); }
145 const int InlineHistoryID = Elt.second;
148 PriorityPtr->update(CB);
149 std::push_heap(Heap.begin(), Heap.end(), isLess);
150 InlineHistoryMap[CB] = InlineHistoryID;
158 T Result = std::make_pair(CB, InlineHistoryMap[CB]);
159 InlineHistoryMap.erase(CB);
160 std::pop_heap(Heap.begin(), Heap.end(), isLess);
170 return *InlineHistoryMap.find(CB);
174 auto PredWrapper = [=](
CallBase *CB) ->
bool {
175 return Pred(std::make_pair(CB, 0));
178 std::make_heap(Heap.begin(), Heap.end(), isLess);
185 std::unique_ptr<InlinePriority> PriorityPtr;
188 #endif // LLVM_ANALYSIS_INLINEORDER_H