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 { +template +void parallel_for_each(Iterator begin, Iterator end, Func &func, TaskGroup &tg, + unsigned concurrency, size_t taskSize) { + + size_t len = std::distance(begin, end); + + if (len <= taskSize || len <= concurrency) { + std::for_each(begin, end, func); + return; + } + + auto pivot = begin + len / 2; + + // Recurse. + tg.spawn([=, &func, &tg] { + parallel_for_each(begin, pivot, func, tg, concurrency, taskSize); + }); + parallel_for_each(pivot, end, func, tg, concurrency, taskSize); +} +} + template void parallel_for_each(Iterator begin, Iterator end, Func func) { - // TODO: Make this parallel. - std::for_each(begin, end, func); + TaskGroup tg; + unsigned concurrency = std::thread::hardware_concurrency(); + detail::parallel_for_each(begin, end, func, tg, concurrency, + std::distance(begin, end) / concurrency); } + #endif } // end namespace lld