[llvm] 1d3f9f8 - [SelectionDAG] Stop storing EVTs in a function scoped static std::set. (#118715)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 5 12:56:39 PST 2024
Author: Craig Topper
Date: 2024-12-05T12:56:36-08:00
New Revision: 1d3f9f886288d9be08772ed348c382a479cf857f
URL: https://github.com/llvm/llvm-project/commit/1d3f9f886288d9be08772ed348c382a479cf857f
DIFF: https://github.com/llvm/llvm-project/commit/1d3f9f886288d9be08772ed348c382a479cf857f.diff
LOG: [SelectionDAG] Stop storing EVTs in a function scoped static std::set. (#118715)
EVTs potentially contain a Type * that points into memory owned by an
LLVMContext. Storing them in a function scoped static means they may
outlive the LLVMContext they point to.
This std::set is used to unique single element VT lists containing a
single extended EVT. Single element VT list with a simple EVT are
uniqued by a separate cache indexed by the MVT::SimpleValueType enum. VT
lists with more than one element are uniqued by a FoldingSet owned by
the SelectionDAG object.
This patch moves the single element cache into SelectionDAG so that it
will be destroyed when SelectionDAG is destroyed.
Fixes #88233
Added:
Modified:
llvm/include/llvm/CodeGen/SelectionDAG.h
llvm/include/llvm/CodeGen/SelectionDAGNodes.h
llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/CodeGen/SelectionDAG.h b/llvm/include/llvm/CodeGen/SelectionDAG.h
index 2e3507386df309..e97e01839f73b4 100644
--- a/llvm/include/llvm/CodeGen/SelectionDAG.h
+++ b/llvm/include/llvm/CodeGen/SelectionDAG.h
@@ -44,6 +44,7 @@
#include <cstdint>
#include <functional>
#include <map>
+#include <set>
#include <string>
#include <tuple>
#include <utility>
@@ -247,6 +248,9 @@ class SelectionDAG {
BlockFrequencyInfo *BFI = nullptr;
MachineModuleInfo *MMI = nullptr;
+ /// Extended EVTs used for single value VTLists.
+ std::set<EVT, EVT::compareRawBits> EVTs;
+
/// List of non-single value types.
FoldingSet<SDVTListNode> VTListMap;
diff --git a/llvm/include/llvm/CodeGen/SelectionDAGNodes.h b/llvm/include/llvm/CodeGen/SelectionDAGNodes.h
index 677b59e0c8fbeb..61f3c6329efce8 100644
--- a/llvm/include/llvm/CodeGen/SelectionDAGNodes.h
+++ b/llvm/include/llvm/CodeGen/SelectionDAGNodes.h
@@ -664,7 +664,7 @@ END_TWO_BYTE_PACK()
DebugLoc debugLoc;
/// Return a pointer to the specified value type.
- static const EVT *getValueTypeList(EVT VT);
+ static const EVT *getValueTypeList(MVT VT);
/// Index in worklist of DAGCombiner, or negative if the node is not in the
/// worklist. -1 = not in worklist; -2 = not in worklist, but has already been
@@ -1124,7 +1124,7 @@ END_TWO_BYTE_PACK()
void addUse(SDUse &U) { U.addToList(&UseList); }
protected:
- static SDVTList getSDVTList(EVT VT) {
+ static SDVTList getSDVTList(MVT VT) {
SDVTList Ret = { getValueTypeList(VT), 1 };
return Ret;
}
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 182529123ec6d8..1b39b75d2687f5 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -10623,7 +10623,10 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
}
SDVTList SelectionDAG::getVTList(EVT VT) {
- return makeVTList(SDNode::getValueTypeList(VT), 1);
+ if (!VT.isExtended())
+ return makeVTList(SDNode::getValueTypeList(VT.getSimpleVT()), 1);
+
+ return makeVTList(&(*EVTs.insert(VT).first), 1);
}
SDVTList SelectionDAG::getVTList(EVT VT1, EVT VT2) {
@@ -12383,17 +12386,11 @@ namespace {
/// getValueTypeList - Return a pointer to the specified value type.
///
-const EVT *SDNode::getValueTypeList(EVT VT) {
- static std::set<EVT, EVT::compareRawBits> EVTs;
+const EVT *SDNode::getValueTypeList(MVT VT) {
static EVTArray SimpleVTArray;
- static sys::SmartMutex<true> VTMutex;
- if (VT.isExtended()) {
- sys::SmartScopedLock<true> Lock(VTMutex);
- return &(*EVTs.insert(VT).first);
- }
- assert(VT.getSimpleVT() < MVT::VALUETYPE_SIZE && "Value type out of range!");
- return &SimpleVTArray.VTs[VT.getSimpleVT().SimpleTy];
+ assert(VT < MVT::VALUETYPE_SIZE && "Value type out of range!");
+ return &SimpleVTArray.VTs[VT.SimpleTy];
}
/// hasNUsesOfValue - Return true if there are exactly NUSES uses of the
More information about the llvm-commits
mailing list