summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2009-08-22 00:29:12 +0000
committerOwen Anderson <resistor@mac.com>2009-08-22 00:29:12 +0000
commit8e2456c2542fc030c0a09707b28902dfcb545a81 (patch)
tree5680fb02cb3570a1efb50bb31c0f62116f6aa3a3
parent48e4a6c739dcbfeb90862940f01e1e3b2ced9cd3 (diff)
downloadbcm5719-llvm-8e2456c2542fc030c0a09707b28902dfcb545a81.tar.gz
bcm5719-llvm-8e2456c2542fc030c0a09707b28902dfcb545a81.zip
Ease contention on this lock by noticing that all writes to the VTs array will
be of (dynamically) constant values, so races on it are immaterial. We just need to ensure that at least one write has completed before return the pointer into it. With this change, parllc exhibits essentially no overhead on 403.gcc. llvm-svn: 79708
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp7
1 files changed, 5 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index f5de81b9425..91f79146ece 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -5022,12 +5022,15 @@ static ManagedStatic<sys::SmartMutex<true> > VTMutex;
/// getValueTypeList - Return a pointer to the specified value type.
///
const EVT *SDNode::getValueTypeList(EVT VT) {
- sys::SmartScopedLock<true> Lock(*VTMutex);
if (VT.isExtended()) {
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;
- return &VTs[VT.getSimpleVT().SimpleTy];
+ sys::MemoryFence();
+ return VTs + VT.getSimpleVT().SimpleTy;
}
}
OpenPOWER on IntegriCloud