[llvm-commits] [llvm] r74618 - /llvm/trunk/lib/VMCore/Type.cpp

Owen Anderson resistor at mac.com
Wed Jul 1 10:24:48 PDT 2009


This fixes PR4486.

--Owen

On Jul 1, 2009, at 10:22 AM, Owen Anderson wrote:

> Author: resistor
> Date: Wed Jul  1 12:22:27 2009
> New Revision: 74618
>
> URL: http://llvm.org/viewvc/llvm-project?rev=74618&view=rev
> Log:
> I give up on trying to use reader/writer locks for recursive type  
> refinement.  Use a recursive mutex instead, which will (in theory)  
> generate more contention, but is really
> a much more natural fit for what's going on during recursive type  
> refinement.
>
> Modified:
>    llvm/trunk/lib/VMCore/Type.cpp
>
> Modified: llvm/trunk/lib/VMCore/Type.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Type.cpp?rev=74618&r1=74617&r2=74618&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/VMCore/Type.cpp (original)
> +++ llvm/trunk/lib/VMCore/Type.cpp Wed Jul  1 12:22:27 2009
> @@ -43,8 +43,8 @@
> //                         Type Class Implementation
> // 
> = 
> = 
> = 
> ----------------------------------------------------------------------= 
> ==//
>
> -// Reader/writer lock used for guarding access to the type maps.
> -static ManagedStatic<sys::SmartRWMutex<true> > TypeMapLock;
> +// Lock used for guarding access to the type maps.
> +static ManagedStatic<sys::SmartMutex<true> > TypeMapLock;
>
> // Recursive lock used for guarding access to AbstractTypeUsers.
> // NOTE: The true template parameter means this will no-op when  
> we're not in
> @@ -1006,23 +1006,13 @@
>
>   // First, see if the type is already in the table, for which
>   // a reader lock suffices.
> -  TypeMapLock->reader_acquire();
> +  sys::SmartScopedLock<true> L(&*TypeMapLock);
>   ITy = IntegerTypes->get(IVT);
> -  TypeMapLock->reader_release();
>
>   if (!ITy) {
> -    // OK, not in the table, get a writer lock.
> -    sys::SmartScopedWriter<true> Writer(&*TypeMapLock);
> -    ITy = IntegerTypes->get(IVT);
> -
> -    // We need to _recheck_ the table in case someone
> -    // put it in between when we released the reader lock
> -    // and when we gained the writer lock!
> -    if (!ITy) {
> -      // Value not found.  Derive a new type!
> -      ITy = new IntegerType(NumBits);
> -      IntegerTypes->add(IVT, ITy);
> -    }
> +    // Value not found.  Derive a new type!
> +    ITy = new IntegerType(NumBits);
> +    IntegerTypes->add(IVT, ITy);
>   }
> #ifdef DEBUG_MERGE_TYPES
>   DOUT << "Derived new type: " << *ITy << "\n";
> @@ -1089,23 +1079,14 @@
>   FunctionValType VT(ReturnType, Params, isVarArg);
>   FunctionType *FT = 0;
>
> -  TypeMapLock->reader_acquire();
> +  sys::SmartScopedLock<true> L(&*TypeMapLock);
>   FT = FunctionTypes->get(VT);
> -  TypeMapLock->reader_release();
>
>   if (!FT) {
> -    sys::SmartScopedWriter<true> Writer(&*TypeMapLock);
> -
> -    // Have to check again here, because it might have
> -    // been inserted between when we release the reader
> -    // lock and when we acquired the writer lock.
> -    FT = FunctionTypes->get(VT);
> -    if (!FT) {
> -      FT = (FunctionType*) operator new(sizeof(FunctionType) +
> -                                      sizeof(PATypeHandle)* 
> (Params.size()+1));
> -      new (FT) FunctionType(ReturnType, Params, isVarArg);
> -      FunctionTypes->add(VT, FT);
> -    }
> +    FT = (FunctionType*) operator new(sizeof(FunctionType) +
> +                                    sizeof(PATypeHandle)* 
> (Params.size()+1));
> +    new (FT) FunctionType(ReturnType, Params, isVarArg);
> +    FunctionTypes->add(VT, FT);
>   }
>
> #ifdef DEBUG_MERGE_TYPES
> @@ -1148,19 +1129,12 @@
>   ArrayValType AVT(ElementType, NumElements);
>   ArrayType *AT = 0;
>
> -  TypeMapLock->reader_acquire();
> +  sys::SmartScopedLock<true> L(&*TypeMapLock);
>   AT = ArrayTypes->get(AVT);
> -  TypeMapLock->reader_release();
> -
> +
>   if (!AT) {
> -    sys::SmartScopedWriter<true> Writer(&*TypeMapLock);
> -
> -    // Recheck.  Might have changed between release and acquire.
> -    AT = ArrayTypes->get(AVT);
> -    if (!AT) {
> -      // Value not found.  Derive a new type!
> -      ArrayTypes->add(AVT, AT = new ArrayType(ElementType,  
> NumElements));
> -    }
> +    // Value not found.  Derive a new type!
> +    ArrayTypes->add(AVT, AT = new ArrayType(ElementType,  
> NumElements));
>   }
> #ifdef DEBUG_MERGE_TYPES
>   DOUT << "Derived new type: " << *AT << "\n";
> @@ -1214,17 +1188,11 @@
>   VectorValType PVT(ElementType, NumElements);
>   VectorType *PT = 0;
>
> -  TypeMapLock->reader_acquire();
> +  sys::SmartScopedLock<true> L(&*TypeMapLock);
>   PT = VectorTypes->get(PVT);
> -  TypeMapLock->reader_release();
>
>   if (!PT) {
> -    sys::SmartScopedWriter<true> Writer(&*TypeMapLock);
> -    PT = VectorTypes->get(PVT);
> -    // Recheck.  Might have changed between release and acquire.
> -    if (!PT) {
> -      VectorTypes->add(PVT, PT = new VectorType(ElementType,  
> NumElements));
> -    }
> +    VectorTypes->add(PVT, PT = new VectorType(ElementType,  
> NumElements));
>   }
> #ifdef DEBUG_MERGE_TYPES
>   DOUT << "Derived new type: " << *PT << "\n";
> @@ -1282,21 +1250,15 @@
>   StructValType STV(ETypes, isPacked);
>   StructType *ST = 0;
>
> -  TypeMapLock->reader_acquire();
> +  sys::SmartScopedLock<true> L(&*TypeMapLock);
>   ST = StructTypes->get(STV);
> -  TypeMapLock->reader_release();
>
>   if (!ST) {
> -    sys::SmartScopedWriter<true> Writer(&*TypeMapLock);
> -    ST = StructTypes->get(STV);
> -    // Recheck.  Might have changed between release and acquire.
> -    if (!ST) {
> -      // Value not found.  Derive a new type!
> -      ST = (StructType*) operator new(sizeof(StructType) +
> -                                      sizeof(PATypeHandle) *  
> ETypes.size());
> -      new (ST) StructType(ETypes, isPacked);
> -      StructTypes->add(STV, ST);
> -    }
> +    // Value not found.  Derive a new type!
> +    ST = (StructType*) operator new(sizeof(StructType) +
> +                                    sizeof(PATypeHandle) *  
> ETypes.size());
> +    new (ST) StructType(ETypes, isPacked);
> +    StructTypes->add(STV, ST);
>   }
> #ifdef DEBUG_MERGE_TYPES
>   DOUT << "Derived new type: " << *ST << "\n";
> @@ -1367,18 +1329,12 @@
>
>   PointerType *PT = 0;
>
> -  TypeMapLock->reader_acquire();
> +  sys::SmartScopedLock<true> L(&*TypeMapLock);
>   PT = PointerTypes->get(PVT);
> -  TypeMapLock->reader_release();
>
>   if (!PT) {
> -    sys::SmartScopedWriter<true> Writer(&*TypeMapLock);
> -    PT = PointerTypes->get(PVT);
> -    // Recheck.  Might have changed between release and acquire.
> -    if (!PT) {
> -      // Value not found.  Derive a new type!
> -      PointerTypes->add(PVT, PT = new PointerType(ValueType,  
> AddressSpace));
> -    }
> +    // Value not found.  Derive a new type!
> +    PointerTypes->add(PVT, PT = new PointerType(ValueType,  
> AddressSpace));
>   }
> #ifdef DEBUG_MERGE_TYPES
>   DOUT << "Derived new type: " << *PT << "\n";
> @@ -1532,7 +1488,7 @@
> void DerivedType::refineAbstractTypeTo(const Type *NewType) {
>   // All recursive calls will go through unlockedRefineAbstractTypeTo,
>   // to avoid deadlock problems.
> -  sys::SmartScopedWriter<true> Writer(&*TypeMapLock);
> +  sys::SmartScopedLock<true> L(&*TypeMapLock);
>   unlockedRefineAbstractTypeTo(NewType);
> }
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list