[llvm] r211900 - Re-apply r211287: Remove support for LLVM runtime multi-threading.

Bob Wilson bob.wilson at apple.com
Tue Nov 18 16:55:52 PST 2014


We just observed that this caused widespread regressions in compile time. If you can tell us which commits fix those egregious cases (assuming there are not too many of them), we can take a closer look to see to what extent the regressions are fixed. We just missed the fact that you’d already made improvements here.

> On Nov 18, 2014, at 2:17 PM, Chandler Carruth <chandlerc at gmail.com> wrote:
> 
> I tried to solve it and failed. =[ It is deeply, fundamentally intertwined with the existing pass manager.
> 
> We solved some of the most egregious cases. The current problems I'm aware of only impact the cost of creating and tearing down a pass manager, or running passes with asserts enabled. I only see this show up as a real problem when running the regression test suite...
> 
> Do you have some specific use case that is continuing to cause you problems.
> 
> On Tue, Nov 18, 2014 at 1:12 PM, Bruno Cardoso Lopes <bruno.cardoso at gmail.com <mailto:bruno.cardoso at gmail.com>> wrote:
> Ping :-)
> 
> On Tue, Sep 30, 2014 at 8:13 PM, Bruno Cardoso Lopes <bruno.cardoso at gmail.com <mailto:bruno.cardoso at gmail.com>> wrote:
> Hi Chandler,
> 
> IIRC, you're working on a fix for the compile time regression caused
> by this commit. Gently ping :-)
> Any news on a that or any ideas you may share on how to solve it?
> 
> Thanks again,
> 
> Reference: http://llvm.org/bugs/show_bug.cgi?id=20641 <http://llvm.org/bugs/show_bug.cgi?id=20641>
> 
> On Fri, Jun 27, 2014 at 12:13 PM, Chandler Carruth <chandlerc at gmail.com <mailto:chandlerc at gmail.com>> wrote:
> > Author: chandlerc
> > Date: Fri Jun 27 10:13:01 2014
> > New Revision: 211900
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=211900&view=rev <http://llvm.org/viewvc/llvm-project?rev=211900&view=rev>
> > Log:
> > Re-apply r211287: Remove support for LLVM runtime multi-threading.
> >
> > I'll fix the problems in libclang and other projects in ways that don't
> > require <mutex> until we sort out the cygwin situation.
> >
> > Modified:
> >     llvm/trunk/docs/ProgrammersManual.rst
> >     llvm/trunk/include/llvm-c/Core.h
> >     llvm/trunk/include/llvm/Support/ManagedStatic.h
> >     llvm/trunk/include/llvm/Support/Threading.h
> >     llvm/trunk/lib/IR/Core.cpp
> >     llvm/trunk/lib/Support/Threading.cpp
> >     llvm/trunk/unittests/Support/ManagedStatic.cpp
> >
> > Modified: llvm/trunk/docs/ProgrammersManual.rst
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/ProgrammersManual.rst?rev=211900&r1=211899&r2=211900&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/ProgrammersManual.rst?rev=211900&r1=211899&r2=211900&view=diff>
> > ==============================================================================
> > --- llvm/trunk/docs/ProgrammersManual.rst (original)
> > +++ llvm/trunk/docs/ProgrammersManual.rst Fri Jun 27 10:13:01 2014
> > @@ -2170,46 +2170,13 @@ compiler, consider compiling LLVM and LL
> >  using the resultant compiler to build a copy of LLVM with multithreading
> >  support.
> >
> > -.. _startmultithreaded:
> > -
> > -Entering and Exiting Multithreaded Mode
> > ----------------------------------------
> > -
> > -In order to properly protect its internal data structures while avoiding
> > -excessive locking overhead in the single-threaded case, the LLVM must intialize
> > -certain data structures necessary to provide guards around its internals.  To do
> > -so, the client program must invoke ``llvm_start_multithreaded()`` before making
> > -any concurrent LLVM API calls.  To subsequently tear down these structures, use
> > -the ``llvm_stop_multithreaded()`` call.  You can also use the
> > -``llvm_is_multithreaded()`` call to check the status of multithreaded mode.
> > -
> > -Note that both of these calls must be made *in isolation*.  That is to say that
> > -no other LLVM API calls may be executing at any time during the execution of
> > -``llvm_start_multithreaded()`` or ``llvm_stop_multithreaded``.  It is the
> > -client's responsibility to enforce this isolation.
> > -
> > -The return value of ``llvm_start_multithreaded()`` indicates the success or
> > -failure of the initialization.  Failure typically indicates that your copy of
> > -LLVM was built without multithreading support, typically because GCC atomic
> > -intrinsics were not found in your system compiler.  In this case, the LLVM API
> > -will not be safe for concurrent calls.  However, it *will* be safe for hosting
> > -threaded applications in the JIT, though :ref:`care must be taken
> > -<jitthreading>` to ensure that side exits and the like do not accidentally
> > -result in concurrent LLVM API calls.
> > -
> >  .. _shutdown:
> >
> >  Ending Execution with ``llvm_shutdown()``
> >  -----------------------------------------
> >
> >  When you are done using the LLVM APIs, you should call ``llvm_shutdown()`` to
> > -deallocate memory used for internal structures.  This will also invoke
> > -``llvm_stop_multithreaded()`` if LLVM is operating in multithreaded mode.  As
> > -such, ``llvm_shutdown()`` requires the same isolation guarantees as
> > -``llvm_stop_multithreaded()``.
> > -
> > -Note that, if you use scope-based shutdown, you can use the
> > -``llvm_shutdown_obj`` class, which calls ``llvm_shutdown()`` in its destructor.
> > +deallocate memory used for internal structures.
> >
> >  .. _managedstatic:
> >
> > @@ -2217,15 +2184,11 @@ Lazy Initialization with ``ManagedStatic
> >  ------------------------------------------
> >
> >  ``ManagedStatic`` is a utility class in LLVM used to implement static
> > -initialization of static resources, such as the global type tables.  Before the
> > -invocation of ``llvm_shutdown()``, it implements a simple lazy initialization
> > -scheme.  Once ``llvm_start_multithreaded()`` returns, however, it uses
> > +initialization of static resources, such as the global type tables.  In a
> > +single-threaded environment, it implements a simple lazy initialization scheme.
> > +When LLVM is compiled with support for multi-threading, however, it uses
> >  double-checked locking to implement thread-safe lazy initialization.
> >
> > -Note that, because no other threads are allowed to issue LLVM API calls before
> > -``llvm_start_multithreaded()`` returns, it is possible to have
> > -``ManagedStatic``\ s of ``llvm::sys::Mutex``\ s.
> > -
> >  .. _llvmcontext:
> >
> >  Achieving Isolation with ``LLVMContext``
> >
> > Modified: llvm/trunk/include/llvm-c/Core.h
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/Core.h?rev=211900&r1=211899&r2=211900&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/Core.h?rev=211900&r1=211899&r2=211900&view=diff>
> > ==============================================================================
> > --- llvm/trunk/include/llvm-c/Core.h (original)
> > +++ llvm/trunk/include/llvm-c/Core.h Fri Jun 27 10:13:01 2014
> > @@ -2848,16 +2848,13 @@ void LLVMDisposePassManager(LLVMPassMana
> >   * @{
> >   */
> >
> > -/** Allocate and initialize structures needed to make LLVM safe for
> > -    multithreading. The return value indicates whether multithreaded
> > -    initialization succeeded. Must be executed in isolation from all
> > -    other LLVM api calls.
> > -    @see llvm::llvm_start_multithreaded */
> > +/** Deprecated: Multi-threading can only be enabled/disabled with the compile
> > +    time define LLVM_ENABLE_THREADS.  This function always returns
> > +    LLVMIsMultithreaded(). */
> >  LLVMBool LLVMStartMultithreaded(void);
> >
> > -/** Deallocate structures necessary to make LLVM safe for multithreading.
> > -    Must be executed in isolation from all other LLVM api calls.
> > -    @see llvm::llvm_stop_multithreaded */
> > +/** Deprecated: Multi-threading can only be enabled/disabled with the compile
> > +    time define LLVM_ENABLE_THREADS. */
> >  void LLVMStopMultithreaded(void);
> >
> >  /** Check whether LLVM is executing in thread-safe mode or not.
> >
> > Modified: llvm/trunk/include/llvm/Support/ManagedStatic.h
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/ManagedStatic.h?rev=211900&r1=211899&r2=211900&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/ManagedStatic.h?rev=211900&r1=211899&r2=211900&view=diff>
> > ==============================================================================
> > --- llvm/trunk/include/llvm/Support/ManagedStatic.h (original)
> > +++ llvm/trunk/include/llvm/Support/ManagedStatic.h Fri Jun 27 10:13:01 2014
> > @@ -103,9 +103,6 @@ void llvm_shutdown();
> >  /// llvm_shutdown() when it is destroyed.
> >  struct llvm_shutdown_obj {
> >    llvm_shutdown_obj() { }
> > -  explicit llvm_shutdown_obj(bool multithreaded) {
> > -    if (multithreaded) llvm_start_multithreaded();
> > -  }
> >    ~llvm_shutdown_obj() { llvm_shutdown(); }
> >  };
> >
> >
> > Modified: llvm/trunk/include/llvm/Support/Threading.h
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Threading.h?rev=211900&r1=211899&r2=211900&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Threading.h?rev=211900&r1=211899&r2=211900&view=diff>
> > ==============================================================================
> > --- llvm/trunk/include/llvm/Support/Threading.h (original)
> > +++ llvm/trunk/include/llvm/Support/Threading.h Fri Jun 27 10:13:01 2014
> > @@ -7,7 +7,8 @@
> >  //
> >  //===----------------------------------------------------------------------===//
> >  //
> > -// TThis file defines llvm_start_multithreaded() and friends.
> > +// This file declares helper functions for running LLVM in a multi-threaded
> > +// environment.
> >  //
> >  //===----------------------------------------------------------------------===//
> >
> > @@ -15,22 +16,8 @@
> >  #define LLVM_SUPPORT_THREADING_H
> >
> >  namespace llvm {
> > -  /// llvm_start_multithreaded - Allocate and initialize structures needed to
> > -  /// make LLVM safe for multithreading.  The return value indicates whether
> > -  /// multithreaded initialization succeeded.  LLVM will still be operational
> > -  /// on "failed" return, and will still be safe for hosting threading
> > -  /// applications in the JIT, but will not be safe for concurrent calls to the
> > -  /// LLVM APIs.
> > -  /// THIS MUST EXECUTE IN ISOLATION FROM ALL OTHER LLVM API CALLS.
> > -  bool llvm_start_multithreaded();
> > -
> > -  /// llvm_stop_multithreaded - Deallocate structures necessary to make LLVM
> > -  /// safe for multithreading.
> > -  /// THIS MUST EXECUTE IN ISOLATION FROM ALL OTHER LLVM API CALLS.
> > -  void llvm_stop_multithreaded();
> > -
> > -  /// llvm_is_multithreaded - Check whether LLVM is executing in thread-safe
> > -  /// mode or not.
> > +  /// Returns true if LLVM is compiled with support for multi-threading, and
> > +  /// false otherwise.
> >    bool llvm_is_multithreaded();
> >
> >    /// llvm_execute_on_thread - Execute the given \p UserFn on a separate
> >
> > Modified: llvm/trunk/lib/IR/Core.cpp
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Core.cpp?rev=211900&r1=211899&r2=211900&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Core.cpp?rev=211900&r1=211899&r2=211900&view=diff>
> > ==============================================================================
> > --- llvm/trunk/lib/IR/Core.cpp (original)
> > +++ llvm/trunk/lib/IR/Core.cpp Fri Jun 27 10:13:01 2014
> > @@ -2708,11 +2708,10 @@ void LLVMDisposePassManager(LLVMPassMana
> >  /*===-- Threading ------------------------------------------------------===*/
> >
> >  LLVMBool LLVMStartMultithreaded() {
> > -  return llvm_start_multithreaded();
> > +  return LLVMIsMultithreaded();
> >  }
> >
> >  void LLVMStopMultithreaded() {
> > -  llvm_stop_multithreaded();
> >  }
> >
> >  LLVMBool LLVMIsMultithreaded() {
> >
> > Modified: llvm/trunk/lib/Support/Threading.cpp
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Threading.cpp?rev=211900&r1=211899&r2=211900&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Threading.cpp?rev=211900&r1=211899&r2=211900&view=diff>
> > ==============================================================================
> > --- llvm/trunk/lib/Support/Threading.cpp (original)
> > +++ llvm/trunk/lib/Support/Threading.cpp Fri Jun 27 10:13:01 2014
> > @@ -7,7 +7,8 @@
> >  //
> >  //===----------------------------------------------------------------------===//
> >  //
> > -// This file implements llvm_start_multithreaded() and friends.
> > +// This file defines helper functions for running LLVM in a multi-threaded
> > +// environment.
> >  //
> >  //===----------------------------------------------------------------------===//
> >
> > @@ -19,38 +20,14 @@
> >
> >  using namespace llvm;
> >
> > -static bool multithreaded_mode = false;
> > -
> > -bool llvm::llvm_start_multithreaded() {
> > +bool llvm::llvm_is_multithreaded() {
> >  #if LLVM_ENABLE_THREADS != 0
> > -  assert(!multithreaded_mode && "Already multithreaded!");
> > -  multithreaded_mode = true;
> > -
> > -  // We fence here to ensure that all initialization is complete BEFORE we
> > -  // return from llvm_start_multithreaded().
> > -  sys::MemoryFence();
> >    return true;
> >  #else
> >    return false;
> >  #endif
> >  }
> >
> > -void llvm::llvm_stop_multithreaded() {
> > -#if LLVM_ENABLE_THREADS != 0
> > -  assert(multithreaded_mode && "Not currently multithreaded!");
> > -
> > -  // We fence here to insure that all threaded operations are complete BEFORE we
> > -  // return from llvm_stop_multithreaded().
> > -  sys::MemoryFence();
> > -
> > -  multithreaded_mode = false;
> > -#endif
> > -}
> > -
> > -bool llvm::llvm_is_multithreaded() {
> > -  return multithreaded_mode;
> > -}
> > -
> >  #if LLVM_ENABLE_THREADS != 0 && defined(HAVE_PTHREAD_H)
> >  #include <pthread.h>
> >
> >
> > Modified: llvm/trunk/unittests/Support/ManagedStatic.cpp
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/ManagedStatic.cpp?rev=211900&r1=211899&r2=211900&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/ManagedStatic.cpp?rev=211900&r1=211899&r2=211900&view=diff>
> > ==============================================================================
> > --- llvm/trunk/unittests/Support/ManagedStatic.cpp (original)
> > +++ llvm/trunk/unittests/Support/ManagedStatic.cpp Fri Jun 27 10:13:01 2014
> > @@ -47,7 +47,6 @@ TEST(Initialize, MultipleThreads) {
> >    void *p1 = test1::allocate_stack(a1);
> >    void *p2 = test1::allocate_stack(a2);
> >
> > -  llvm_start_multithreaded();
> >    pthread_t t1, t2;
> >    pthread_create(&t1, &a1, test1::helper, nullptr);
> >    pthread_create(&t2, &a2, test1::helper, nullptr);
> > @@ -55,7 +54,6 @@ TEST(Initialize, MultipleThreads) {
> >    pthread_join(t2, nullptr);
> >    free(p1);
> >    free(p2);
> > -  llvm_stop_multithreaded();
> >  }
> >  #endif
> >
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at cs.uiuc.edu <mailto:llvm-commits at cs.uiuc.edu>
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits <http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits>
> 
> 
> 
> --
> Bruno Cardoso Lopes
> http://www.brunocardoso.cc <http://www.brunocardoso.cc/>
> 
> 
> 
> -- 
> Bruno Cardoso Lopes 
> http://www.brunocardoso.cc <http://www.brunocardoso.cc/>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu <mailto:llvm-commits at cs.uiuc.edu>
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits <http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits>
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20141118/26bf3d66/attachment.html>


More information about the llvm-commits mailing list