Parallel: only allow the first TaskGroup to run tasks parallelly
authorFangrui Song <maskray@google.com>
Thu, 25 Apr 2019 11:33:30 +0000 (11:33 +0000)
committerFangrui Song <maskray@google.com>
Thu, 25 Apr 2019 11:33:30 +0000 (11:33 +0000)
commitf6a6290908dfcf4df6284c6d3eb94bb762e587fb
treed219644bd02a6fd4813bb02f415d5e0d728948df
parent9e8d0d981b0cb1e3cbd0260af4e3b1f44ddf7be2
Parallel: only allow the first TaskGroup to run tasks parallelly

Summary:
Concurrent (e.g. nested) llvm::parallel::for_each() may lead to dead
locks. See PR35788 (fixed by rLLD322041) and PR41508 (fixed by D60757).

When parallel_for_each() is about to return, in ~Latch() called by
~TaskGroup(), a thread (in the default executor) may block in
Latch::sync() waiting for Count to become zero. If all threads in the
default executor are blocked, it is a dead lock.

To fix this, force serial execution if the current TaskGroup is not the
first one. For a nested llvm::parallel::for_each(), this parallelizes
the outermost loop and serializes inner loops.

Differential Revision: https://reviews.llvm.org/D61115

llvm-svn: 359182
llvm/include/llvm/Support/Parallel.h
llvm/lib/Support/Parallel.cpp