72 llvm::SmallVector<std::pair<int64_t, int64_t>> pinned;
73 llvm::SmallVector<BufferAllocation *> pending;
74 int64_t highWater = start;
75 for (
auto &buffer : buffers) {
77 pinned.emplace_back(*buffer.address, buffer.size);
78 highWater = std::max(highWater, *buffer.address + buffer.size);
80 pending.push_back(&buffer);
83 llvm::stable_sort(pinned, [](
auto a,
auto b) {
return a.first < b.first; });
84 llvm::stable_sort(pending,
85 [](
auto *a,
auto *b) {
return a->size > b->size; });
86 auto *current = pinned.begin();
87 int64_t address = start;
88 for (
auto *buffer : pending) {
89 address = llvm::alignTo(address, buffer->alignment);
90 while (current != pinned.end() && address + buffer->size > current->first) {
92 llvm::alignTo(current->first + current->second, buffer->alignment);
95 buffer->address = address;
96 address += buffer->size;
98 return std::max(highWater, address);