Index: include/lld/Core/Parallel.h =================================================================== --- include/lld/Core/Parallel.h +++ include/lld/Core/Parallel.h @@ -293,11 +293,35 @@ concurrency::parallel_for_each(begin, end, func); } #else +namespace detail { +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::minParallelSize || 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 + 1, 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