The llvm::parallelFor() uses threads created by ThreadPoolExecutor as well as main thread.
The index for the main thread matches with the index for the first thread created by ThreadPoolExecutor.
It results in that getThreadIndex returns the same value for different threads.
To avoid thread index clashing - do not use main thread for llvm::parallelFor():
parallel::TaskGroup TG; for (; Begin + TaskSize < End; Begin += TaskSize) { TG.spawn([=, &Fn] { for (size_t I = Begin, E = Begin + TaskSize; I != E; ++I) Fn(I); }); } for (; Begin != End; ++Begin) <<<< executed by main thread. Fn(Begin); <<<< return; <<<<
Perhaps a "simpler" fix would be not to use the main thread here, i.e. should use TG.spawn? However, that assumes that getThreadIndex() is only for use in the "parallelFor" style functions otherwise the other parallel functions would also need to avoid using the main thread too.
I'm surprised that this hasn't been causing more issues.