Index: include/lld/Core/Parallel.h =================================================================== --- include/lld/Core/Parallel.h +++ include/lld/Core/Parallel.h @@ -293,11 +293,36 @@ concurrency::parallel_for_each(begin, end, func); } #else +namespace detail { +const ptrdiff_t minParallelForEachSize = 512; +template +void parallel_for_each(Iterator begin, Iterator end, Func &func, TaskGroup &tg, + size_t depth) { + + size_t len = std::distance(begin, end); + + if (len < detail::minParallelForEachSize || depth == 0) { + std::for_each(begin, end, func); + return; + } + + auto pivot = begin + len / 2; + + // Recurse. + tg.spawn([=, &func, &tg] { + parallel_for_each(begin, pivot, func, tg, depth - 1); + }); + parallel_for_each(pivot, end, func, tg, depth - 1); +} +} + template void parallel_for_each(Iterator begin, Iterator end, Func func) { - // TODO: Make this parallel. - std::for_each(begin, end, func); + TaskGroup tg; + detail::parallel_for_each(begin, end, func, tg, + llvm::Log2_64(std::distance(begin, end)) + 1); } + #endif } // end namespace lld