[llvm-commits] [llvm] r80040 - /llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
Owen Anderson
resistor at mac.com
Tue Aug 25 15:27:22 PDT 2009
Author: resistor
Date: Tue Aug 25 17:27:22 2009
New Revision: 80040
URL: http://llvm.org/viewvc/llvm-project?rev=80040&view=rev
Log:
Get rid of this horrible "benign race" by exploiting ManagedStatic to initialize
the array on its first access.
Modified:
llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp?rev=80040&r1=80039&r2=80040&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Tue Aug 25 17:27:22 2009
@@ -5014,8 +5014,20 @@
AddNodeIDNode(ID, this);
}
+namespace {
+ struct EVTArray {
+ std::vector<EVT> VTs;
+
+ EVTArray() {
+ VTs.reserve(MVT::LAST_VALUETYPE);
+ for (unsigned i = 0; i < MVT::LAST_VALUETYPE; ++i)
+ VTs.push_back(MVT((MVT::SimpleValueType)i));
+ }
+ };
+}
+
static ManagedStatic<std::set<EVT, EVT::compareRawBits> > EVTs;
-static EVT VTs[MVT::LAST_VALUETYPE];
+static ManagedStatic<EVTArray> SimpleVTArray;
static ManagedStatic<sys::SmartMutex<true> > VTMutex;
/// getValueTypeList - Return a pointer to the specified value type.
@@ -5025,12 +5037,7 @@
sys::SmartScopedLock<true> Lock(*VTMutex);
return &(*EVTs->insert(VT).first);
} else {
- // All writes to this location will have the same value, so it's ok
- // to race on it. We only need to ensure that at least one write has
- // succeeded before we return the pointer into the array.
- VTs[VT.getSimpleVT().SimpleTy] = VT;
- sys::MemoryFence();
- return VTs + VT.getSimpleVT().SimpleTy;
+ return &SimpleVTArray->VTs[VT.getSimpleVT().SimpleTy];
}
}
More information about the llvm-commits
mailing list