[llvm] [llvm] Replace unordered_{map, set} with Dense{Map, Set} (PR #202222)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Jun 7 11:41:47 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-binary-utilities
@llvm/pr-subscribers-debuginfo
Author: Fangrui Song (MaskRay)
<details>
<summary>Changes</summary>
std::unordered_map is slow. The remaining uses are pointer stability,
key spanning the full value range, or huge pair<key,value>. After
PR #<!-- -->201281 DenseMap no longer reserves sentinel keys, so more of these maps
can switch.
---
Patch is 37.90 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/202222.diff
24 Files Affected:
- (modified) llvm/include/llvm/DebugInfo/LogicalView/Readers/LVDWARFReader.h (+4-3)
- (modified) llvm/include/llvm/IR/ModuleSummaryIndex.h (+1-2)
- (modified) llvm/include/llvm/Support/ELFAttrParserCompact.h (+4-4)
- (modified) llvm/include/llvm/XRay/InstrumentationMap.h (+3-3)
- (modified) llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp (+1-2)
- (modified) llvm/lib/CodeGen/RDFLiveness.cpp (+1-2)
- (modified) llvm/lib/ObjCopy/ELF/ELFObject.cpp (+2-2)
- (modified) llvm/lib/Passes/StandardInstrumentations.cpp (+7-7)
- (modified) llvm/lib/Target/BPF/BTFDebug.cpp (+5-7)
- (modified) llvm/lib/Target/BPF/BTFDebug.h (+7-8)
- (modified) llvm/lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp (+1-2)
- (modified) llvm/lib/Target/PowerPC/PPCInstrInfo.cpp (+1-1)
- (modified) llvm/lib/Target/SPIRV/Analysis/SPIRVConvergenceRegionAnalysis.cpp (+3-3)
- (modified) llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp (+33-33)
- (modified) llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.h (+1-1)
- (modified) llvm/lib/Target/SPIRV/SPIRVMergeRegionExitTargets.cpp (+2-1)
- (modified) llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp (+1-1)
- (modified) llvm/lib/Target/SPIRV/SPIRVStructurizer.cpp (+6-6)
- (modified) llvm/lib/Target/SPIRV/SPIRVUtils.cpp (+4-4)
- (modified) llvm/lib/Target/SPIRV/SPIRVUtils.h (+5-4)
- (modified) llvm/lib/Transforms/IPO/MemProfContextDisambiguation.cpp (+2-3)
- (modified) llvm/lib/Transforms/Instrumentation/IndirectCallPromotion.cpp (+1-2)
- (modified) llvm/lib/Transforms/Utils/SampleProfileInference.cpp (+2-2)
- (modified) llvm/tools/llvm-xray/func-id-helper.h (+1-2)
``````````diff
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVDWARFReader.h b/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVDWARFReader.h
index 1cf29147fe2a1..b6d514edab6e4 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVDWARFReader.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVDWARFReader.h
@@ -14,10 +14,11 @@
#ifndef LLVM_DEBUGINFO_LOGICALVIEW_READERS_LVDWARFREADER_H
#define LLVM_DEBUGINFO_LOGICALVIEW_READERS_LVDWARFREADER_H
+#include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/DenseSet.h"
#include "llvm/DebugInfo/DWARF/DWARFAbbreviationDeclaration.h"
#include "llvm/DebugInfo/DWARF/DWARFContext.h"
#include "llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h"
-#include <unordered_set>
namespace llvm {
namespace logicalview {
@@ -62,14 +63,14 @@ class LVDWARFReader final : public LVBinaryReader {
std::optional<LVAddress> TombstoneAddress;
// Cross references (Elements).
- using LVElementSet = std::unordered_set<LVElement *>;
+ using LVElementSet = DenseSet<LVElement *>;
struct LVElementEntry {
LVElement *Element;
LVElementSet References;
LVElementSet Types;
LVElementEntry(LVElement *Element = nullptr) : Element(Element) {}
};
- using LVElementReference = std::unordered_map<LVOffset, LVElementEntry>;
+ using LVElementReference = DenseMap<LVOffset, LVElementEntry>;
LVElementReference ElementTable;
Error loadTargetInfo(const object::ObjectFile &Obj);
diff --git a/llvm/include/llvm/IR/ModuleSummaryIndex.h b/llvm/include/llvm/IR/ModuleSummaryIndex.h
index 359026cfc85a0..de487d0429e7e 100644
--- a/llvm/include/llvm/IR/ModuleSummaryIndex.h
+++ b/llvm/include/llvm/IR/ModuleSummaryIndex.h
@@ -45,7 +45,6 @@
#include <optional>
#include <set>
#include <string>
-#include <unordered_set>
#include <utility>
#include <vector>
@@ -1401,7 +1400,7 @@ using ModuleToSummariesForIndexTy =
std::map<std::string, GVSummaryMapTy, std::less<>>;
/// A set of global value summary pointers.
-using GVSummaryPtrSet = std::unordered_set<GlobalValueSummary *>;
+using GVSummaryPtrSet = DenseSet<GlobalValueSummary *>;
/// Map of a type GUID to type id string and summary (multimap used
/// in case of GUID conflicts).
diff --git a/llvm/include/llvm/Support/ELFAttrParserCompact.h b/llvm/include/llvm/Support/ELFAttrParserCompact.h
index d7e415331d1c3..f55c21d42de3d 100644
--- a/llvm/include/llvm/Support/ELFAttrParserCompact.h
+++ b/llvm/include/llvm/Support/ELFAttrParserCompact.h
@@ -10,6 +10,7 @@
#define LLVM_SUPPORT_ELFCOMPACTATTRPARSER_H
#include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/DenseMap.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/DataExtractor.h"
#include "llvm/Support/ELFAttributeParser.h"
@@ -17,7 +18,6 @@
#include "llvm/Support/Error.h"
#include <optional>
-#include <unordered_map>
namespace llvm {
class StringRef;
@@ -25,8 +25,8 @@ class ScopedPrinter;
class LLVM_ABI ELFCompactAttrParser : public ELFAttributeParser {
StringRef vendor;
- std::unordered_map<unsigned, unsigned> attributes;
- std::unordered_map<unsigned, StringRef> attributesStr;
+ DenseMap<unsigned, unsigned> attributes;
+ DenseMap<unsigned, StringRef> attributesStr;
virtual Error handler(uint64_t tag, bool &handled) = 0;
@@ -45,7 +45,7 @@ class LLVM_ABI ELFCompactAttrParser : public ELFAttributeParser {
Error parseSubsection(uint32_t length);
void setAttributeString(unsigned tag, StringRef value) {
- attributesStr.emplace(tag, value);
+ attributesStr.try_emplace(tag, value);
}
public:
diff --git a/llvm/include/llvm/XRay/InstrumentationMap.h b/llvm/include/llvm/XRay/InstrumentationMap.h
index c5e7ebff0e2c1..9305b2e3ad36c 100644
--- a/llvm/include/llvm/XRay/InstrumentationMap.h
+++ b/llvm/include/llvm/XRay/InstrumentationMap.h
@@ -14,13 +14,13 @@
#ifndef LLVM_XRAY_INSTRUMENTATIONMAP_H
#define LLVM_XRAY_INSTRUMENTATIONMAP_H
+#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/YAMLTraits.h"
#include <cstdint>
#include <optional>
-#include <unordered_map>
#include <vector>
namespace llvm::xray {
@@ -74,8 +74,8 @@ struct YAMLXRaySledEntry {
///
class InstrumentationMap {
public:
- using FunctionAddressMap = std::unordered_map<int32_t, uint64_t>;
- using FunctionAddressReverseMap = std::unordered_map<uint64_t, int32_t>;
+ using FunctionAddressMap = DenseMap<int32_t, uint64_t>;
+ using FunctionAddressReverseMap = DenseMap<uint64_t, int32_t>;
using SledContainer = std::vector<SledEntry>;
private:
diff --git a/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp b/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp
index 2f2ee6f535f40..23dc6fbd6e500 100644
--- a/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp
+++ b/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp
@@ -42,7 +42,6 @@
#include <array>
#include <bitset>
#include <memory>
-#include <unordered_map>
using namespace llvm;
@@ -329,7 +328,7 @@ class MLEvictAdvisor : public RegAllocEvictionAdvisor {
using RegID = unsigned;
mutable DenseMap<RegID, LIFeatureComponents> CachedFeatures;
- mutable std::unordered_map<unsigned, unsigned> VirtRegEvictionCounts;
+ mutable DenseMap<unsigned, unsigned> VirtRegEvictionCounts;
void onEviction(Register RegBeingEvicted) const {
// If we cannot find the virtual register in the map, we just assume it has
diff --git a/llvm/lib/CodeGen/RDFLiveness.cpp b/llvm/lib/CodeGen/RDFLiveness.cpp
index 195446e61076e..10ab9b88a05e1 100644
--- a/llvm/lib/CodeGen/RDFLiveness.cpp
+++ b/llvm/lib/CodeGen/RDFLiveness.cpp
@@ -471,8 +471,7 @@ void Liveness::computePhiInfo() {
// phi use -> (map: reaching phi -> set of registers defined in between)
std::map<NodeId, std::map<NodeId, RegisterAggr>> PhiUp;
std::vector<NodeId> PhiUQ; // Work list of phis for upward propagation.
- std::unordered_map<NodeId, RegisterAggr>
- PhiDRs; // Phi -> registers defined by it.
+ DenseMap<NodeId, RegisterAggr> PhiDRs; // Phi -> registers defined by it.
// Go over all phis.
for (NodeAddr<PhiNode *> PhiA : Phis) {
diff --git a/llvm/lib/ObjCopy/ELF/ELFObject.cpp b/llvm/lib/ObjCopy/ELF/ELFObject.cpp
index 3c6f9a966694a..0982e3c02de08 100644
--- a/llvm/lib/ObjCopy/ELF/ELFObject.cpp
+++ b/llvm/lib/ObjCopy/ELF/ELFObject.cpp
@@ -8,6 +8,7 @@
#include "ELFObject.h"
#include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/Twine.h"
@@ -23,7 +24,6 @@
#include <cstddef>
#include <cstdint>
#include <iterator>
-#include <unordered_set>
#include <utility>
#include <vector>
@@ -2235,7 +2235,7 @@ Error Object::removeSections(
// Now make sure there are no remaining references to the sections that will
// be removed. Sometimes it is impossible to remove a reference so we emit
// an error here instead.
- std::unordered_set<const SectionBase *> RemoveSections;
+ DenseSet<const SectionBase *> RemoveSections;
RemoveSections.reserve(std::distance(Iter, std::end(Sections)));
for (auto &RemoveSec : make_range(Iter, std::end(Sections))) {
for (auto &Segment : Segments)
diff --git a/llvm/lib/Passes/StandardInstrumentations.cpp b/llvm/lib/Passes/StandardInstrumentations.cpp
index 19e72a8612c4a..3f00a15dbc617 100644
--- a/llvm/lib/Passes/StandardInstrumentations.cpp
+++ b/llvm/lib/Passes/StandardInstrumentations.cpp
@@ -14,6 +14,8 @@
#include "llvm/Passes/StandardInstrumentations.h"
#include "llvm/ADT/Any.h"
+#include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Analysis/LazyCallGraph.h"
#include "llvm/Analysis/LoopInfo.h"
@@ -40,8 +42,6 @@
#include "llvm/Support/Signals.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/xxhash.h"
-#include <unordered_map>
-#include <unordered_set>
#include <utility>
#include <vector>
@@ -1635,9 +1635,9 @@ class DisplayNode : public DisplayElement {
: DisplayElement(Colour), Content(Content) {}
// Iterator to the child nodes. Required by GraphWriter.
- using ChildIterator = std::unordered_set<DisplayNode *>::const_iterator;
- ChildIterator children_begin() const { return Children.cbegin(); }
- ChildIterator children_end() const { return Children.cend(); }
+ using ChildIterator = DenseSet<DisplayNode *>::const_iterator;
+ ChildIterator children_begin() const { return Children.begin(); }
+ ChildIterator children_end() const { return Children.end(); }
// Iterator for the edges. Required by GraphWriter.
using EdgeIterator = std::vector<DisplayEdge *>::const_iterator;
@@ -1673,8 +1673,8 @@ class DisplayNode : public DisplayElement {
std::vector<DisplayEdge> Edges;
std::vector<DisplayEdge *> EdgePtrs;
- std::unordered_set<DisplayNode *> Children;
- std::unordered_map<const DisplayNode *, const DisplayEdge *> EdgeMap;
+ DenseSet<DisplayNode *> Children;
+ DenseMap<const DisplayNode *, const DisplayEdge *> EdgeMap;
// Safeguard adding of edges.
bool AllEdgesCreated = false;
diff --git a/llvm/lib/Target/BPF/BTFDebug.cpp b/llvm/lib/Target/BPF/BTFDebug.cpp
index c847c1cb4b65c..227a9db86b62d 100644
--- a/llvm/lib/Target/BPF/BTFDebug.cpp
+++ b/llvm/lib/Target/BPF/BTFDebug.cpp
@@ -398,7 +398,7 @@ std::string BTFTypeStruct::getName() { return std::string(STy->getName()); }
/// for subprogram.
BTFTypeFuncProto::BTFTypeFuncProto(
const DISubroutineType *STy, uint32_t VLen,
- const std::unordered_map<uint32_t, StringRef> &FuncArgNames)
+ const DenseMap<uint32_t, StringRef> &FuncArgNames)
: STy(STy), FuncArgNames(FuncArgNames) {
Kind = BTF::BTF_KIND_FUNC_PROTO;
BTFType.Info = (Kind << 24) | VLen;
@@ -626,8 +626,7 @@ void BTFDebug::visitBasicType(const DIBasicType *BTy, uint32_t &TypeId) {
/// Handle subprogram or subroutine types.
void BTFDebug::visitSubroutineType(
const DISubroutineType *STy, bool ForSubprog,
- const std::unordered_map<uint32_t, StringRef> &FuncArgNames,
- uint32_t &TypeId) {
+ const DenseMap<uint32_t, StringRef> &FuncArgNames, uint32_t &TypeId) {
DITypeArray Elements = STy->getTypeArray();
uint32_t VLen = Elements.size() - 1;
if (VLen > BTF::MAX_VLEN)
@@ -1036,8 +1035,7 @@ void BTFDebug::visitTypeEntry(const DIType *Ty, uint32_t &TypeId,
if (const auto *BTy = dyn_cast<DIBasicType>(Ty))
visitBasicType(BTy, TypeId);
else if (const auto *STy = dyn_cast<DISubroutineType>(Ty))
- visitSubroutineType(STy, false, std::unordered_map<uint32_t, StringRef>(),
- TypeId);
+ visitSubroutineType(STy, false, DenseMap<uint32_t, StringRef>(), TypeId);
else if (const auto *CTy = dyn_cast<DICompositeType>(Ty))
visitCompositeType(CTy, TypeId);
else if (const auto *DTy = dyn_cast<DIDerivedType>(Ty))
@@ -1331,7 +1329,7 @@ void BTFDebug::beginFunctionImpl(const MachineFunction *MF) {
// Collect all types locally referenced in this function.
// Use RetainedNodes so we can collect all argument names
// even if the argument is not used.
- std::unordered_map<uint32_t, StringRef> FuncArgNames;
+ DenseMap<uint32_t, StringRef> FuncArgNames;
for (const DINode *DN : SP->getRetainedNodes()) {
if (const auto *DV = dyn_cast<DILocalVariable>(DN)) {
// Collect function arguments for subprogram func type.
@@ -1713,7 +1711,7 @@ void BTFDebug::processFuncPrototypes(const Function *F) {
return;
uint32_t ProtoTypeId;
- const std::unordered_map<uint32_t, StringRef> FuncArgNames;
+ const DenseMap<uint32_t, StringRef> FuncArgNames;
visitSubroutineType(SP->getType(), false, FuncArgNames, ProtoTypeId);
uint32_t FuncId = processDISubprogram(SP, ProtoTypeId, BTF::FUNC_EXTERN);
diff --git a/llvm/lib/Target/BPF/BTFDebug.h b/llvm/lib/Target/BPF/BTFDebug.h
index 75858fcc8bfde..7d2b7032f1faf 100644
--- a/llvm/lib/Target/BPF/BTFDebug.h
+++ b/llvm/lib/Target/BPF/BTFDebug.h
@@ -14,13 +14,13 @@
#ifndef LLVM_LIB_TARGET_BPF_BTFDEBUG_H
#define LLVM_LIB_TARGET_BPF_BTFDEBUG_H
+#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/StringMap.h"
#include "llvm/CodeGen/DebugHandlerBase.h"
#include "llvm/DebugInfo/BTF/BTF.h"
#include <cstdint>
#include <map>
#include <set>
-#include <unordered_map>
namespace llvm {
@@ -142,12 +142,12 @@ class BTFTypeStruct : public BTFTypeBase {
/// Handle function pointer.
class BTFTypeFuncProto : public BTFTypeBase {
const DISubroutineType *STy;
- std::unordered_map<uint32_t, StringRef> FuncArgNames;
+ DenseMap<uint32_t, StringRef> FuncArgNames;
std::vector<struct BTF::BTFParam> Parameters;
public:
BTFTypeFuncProto(const DISubroutineType *STy, uint32_t NumParams,
- const std::unordered_map<uint32_t, StringRef> &FuncArgNames);
+ const DenseMap<uint32_t, StringRef> &FuncArgNames);
uint32_t getSize() override {
return BTFTypeBase::getSize() + Parameters.size() * BTF::BTFParamSize;
}
@@ -295,7 +295,7 @@ class BTFDebug : public DebugHandlerBase {
bool MapDefNotCollected;
BTFStringTable StringTable;
std::vector<std::unique_ptr<BTFTypeBase>> TypeEntries;
- std::unordered_map<const DIType *, uint32_t> DIToIdMap;
+ DenseMap<const DIType *, uint32_t> DIToIdMap;
std::map<uint32_t, std::vector<BTFFuncInfo>> FuncInfoTable;
std::map<uint32_t, std::vector<BTFLineInfo>> LineInfoTable;
std::map<uint32_t, std::vector<BTFFieldReloc>> FieldRelocTable;
@@ -323,10 +323,9 @@ class BTFDebug : public DebugHandlerBase {
void visitTypeEntry(const DIType *Ty, uint32_t &TypeId, bool CheckPointer,
bool SeenPointer);
void visitBasicType(const DIBasicType *BTy, uint32_t &TypeId);
- void visitSubroutineType(
- const DISubroutineType *STy, bool ForSubprog,
- const std::unordered_map<uint32_t, StringRef> &FuncArgNames,
- uint32_t &TypeId);
+ void visitSubroutineType(const DISubroutineType *STy, bool ForSubprog,
+ const DenseMap<uint32_t, StringRef> &FuncArgNames,
+ uint32_t &TypeId);
void visitFwdDeclType(const DICompositeType *CTy, bool IsUnion,
uint32_t &TypeId);
void visitCompositeType(const DICompositeType *CTy, uint32_t &TypeId);
diff --git a/llvm/lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp b/llvm/lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp
index ae369fe7ce901..a59ec1820a092 100644
--- a/llvm/lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp
+++ b/llvm/lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp
@@ -23,7 +23,6 @@
#include <map>
#include <optional>
#include <set>
-#include <unordered_map>
#include <utility>
#include <vector>
@@ -2747,7 +2746,7 @@ void HexagonDAGToDAGISel::ppHvxShuffleOfShuffle(std::vector<SDNode *> &&Nodes) {
unsigned HalfIdx;
};
- using MapType = std::unordered_map<SDValue, unsigned>;
+ using MapType = DenseMap<SDValue, unsigned>;
auto getMaskElt = [&](unsigned Idx, ShuffleVectorSDNode *Shuff0,
ShuffleVectorSDNode *Shuff1,
diff --git a/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp b/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp
index 59d18de06b2e0..925c679450ded 100644
--- a/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp
+++ b/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp
@@ -5448,7 +5448,7 @@ void PPCInstrInfo::promoteInstr32To64ForElimEXTSW(const Register &Reg,
// Map the 32bit to 64bit opcodes for instructions that are not signed or zero
// extended themselves, but may have operands who's destination registers of
// signed or zero extended instructions.
- std::unordered_map<unsigned, unsigned> OpcodeMap = {
+ DenseMap<unsigned, unsigned> OpcodeMap = {
{PPC::OR, PPC::OR8}, {PPC::ISEL, PPC::ISEL8},
{PPC::ORI, PPC::ORI8}, {PPC::XORI, PPC::XORI8},
{PPC::ORIS, PPC::ORIS8}, {PPC::XORIS, PPC::XORIS8},
diff --git a/llvm/lib/Target/SPIRV/Analysis/SPIRVConvergenceRegionAnalysis.cpp b/llvm/lib/Target/SPIRV/Analysis/SPIRVConvergenceRegionAnalysis.cpp
index 0798483462e18..1cb32cce32cbd 100644
--- a/llvm/lib/Target/SPIRV/Analysis/SPIRVConvergenceRegionAnalysis.cpp
+++ b/llvm/lib/Target/SPIRV/Analysis/SPIRVConvergenceRegionAnalysis.cpp
@@ -14,6 +14,7 @@
#include "SPIRVConvergenceRegionAnalysis.h"
#include "SPIRV.h"
+#include "llvm/ADT/DenseSet.h"
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/IntrinsicInst.h"
@@ -21,7 +22,6 @@
#include "llvm/Transforms/Utils/LoopSimplify.h"
#include <optional>
#include <queue>
-#include <unordered_set>
#define DEBUG_TYPE "spirv-convergence-region-analysis"
@@ -210,10 +210,10 @@ class ConvergenceRegionAnalyzer {
return false;
}
- std::unordered_set<BasicBlock *>
+ DenseSet<BasicBlock *>
findPathsToMatch(LoopInfo &LI, BasicBlock *From,
std::function<bool(const BasicBlock *)> isMatch) const {
- std::unordered_set<BasicBlock *> Output;
+ DenseSet<BasicBlock *> Output;
if (isMatch(From))
Output.insert(From);
diff --git a/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp b/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp
index 97fa49d8836fb..1e1b0080be5ac 100644
--- a/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp
@@ -17,6 +17,7 @@
#include "SPIRVSubtarget.h"
#include "SPIRVTargetMachine.h"
#include "SPIRVUtils.h"
+#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/StringSet.h"
#include "llvm/Analysis/LoopInfo.h"
@@ -35,7 +36,6 @@
#include <cassert>
#include <optional>
#include <queue>
-#include <unordered_set>
// This pass performs the following transformation on LLVM IR level required
// for the following translation to SPIR-V:
@@ -192,7 +192,7 @@ class SPIRVEmitIntrinsics
DenseSet<Instruction *> AggrStores;
SmallPtrSet<Instruction *, 8> DeletedInstrs;
GlobalVariableUsers GVUsers;
- std::unordered_set<Value *> Named;
+ DenseSet<Value *> Named;
// map of function declarations to <pointer arg index => element type>
DenseMap<Function *, SmallVector<std::pair<unsigned, Type *>>> FDeclPtrTys;
@@ -224,7 +224,7 @@ class SPIRVEmitIntrinsics
}
// a register of Instructions that were visited by deduceOperandElementType()
// to validate operand types with an instruction
- std::unordered_set<Instruction *> TypeValidated;
+ DenseSet<Instruction *> TypeValidated;
// well known result types of builtins
enum WellKnownTypes { Event };
@@ -232,24 +232,22 @@ class SPIRVEmitIntrinsics
// deduce element type of untyped pointers
Type *deduceElementType(Value *I, bool UnknownElemTypeI8);
Type *deduceElementTypeHelper(Value *I, bool UnknownElemTypeI8);
- Type *deduceElementTypeHelper(Value *I, std::unordered_set<Value *> &Visited,
+ Type *deduceElementTypeHelper(Value *I, DenseSet<Value *> &Visited,
bool UnknownElemTypeI8,
bool IgnoreKnownType = false);
Type *deduceElementTypeByValueDeep(Type *ValueTy, Value *Operand,
bool UnknownElemTypeI8);
Type *deduceElementTypeByValueDeep(Type *ValueTy, Value *Operand,
- std::unordered_set<Value *> &Visited,
+ DenseSet<Value *> &Visited,
bool UnknownElemTypeI8);
- Type *deduceElementTypeByUsersDeep(Value *Op,
- std::unordered_set<Value *> &Visited,
+ Type *deduceElementTypeByUsersDeep(Value *Op, DenseSet<Value *> &Visited,
bool UnknownElemTypeI8);
void maybeAssignPtrType(Type *&Ty, Value *I, Type *RefTy,
bool UnknownElemTypeI8);
// deduce nested types of composites
Type *deduceNestedTypeHelper(User *U, bool UnknownElemTypeI8);
- Type *deduceNestedTypeHelper(User *U, Type *Ty,
- std::unordered_set<Value *> &Visited,
+ Type *deduceNestedTypeHelper(User *U, Type *Ty, DenseSet<Value *> &Visited,
bool UnknownElemTypeI8);
// deduce Types of operands of the Instruction if possible
@@ -287,7 +285,7 @@ class SPIRVEmitIntrinsics
void processParamTypesByFunHeader(Function *F, IRBuilder<> &B);
Type *deduceFunParamElementType(Function *F, unsigned OpIdx);
Type *deduceFunParamElementType(Function *F, unsigned OpIdx,
- std::unordered_set<Function ...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/202222
More information about the llvm-commits
mailing list