File indexing completed on 2026-05-10 08:43:24
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef LLVM_CODEGEN_GLOBALISEL_GISELWORKLIST_H
0010 #define LLVM_CODEGEN_GLOBALISEL_GISELWORKLIST_H
0011
0012 #include "llvm/ADT/DenseMap.h"
0013 #include "llvm/ADT/SmallVector.h"
0014
0015 namespace llvm {
0016
0017 class MachineInstr;
0018
0019
0020
0021
0022
0023
0024
0025
0026 template<unsigned N>
0027 class GISelWorkList {
0028 SmallVector<MachineInstr *, N> Worklist;
0029 DenseMap<MachineInstr *, unsigned> WorklistMap;
0030
0031 #if LLVM_ENABLE_ABI_BREAKING_CHECKS
0032 bool Finalized = true;
0033 #endif
0034
0035 public:
0036 GISelWorkList() : WorklistMap(N) {}
0037
0038 bool empty() const { return WorklistMap.empty(); }
0039
0040 unsigned size() const { return WorklistMap.size(); }
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050 void deferred_insert(MachineInstr *I) {
0051 Worklist.push_back(I);
0052 #if LLVM_ENABLE_ABI_BREAKING_CHECKS
0053 Finalized = false;
0054 #endif
0055 }
0056
0057
0058
0059
0060
0061 void finalize() {
0062 assert(WorklistMap.empty() && "Expecting empty worklistmap");
0063 if (Worklist.size() > N)
0064 WorklistMap.reserve(Worklist.size());
0065 for (unsigned i = 0; i < Worklist.size(); ++i)
0066 if (!WorklistMap.try_emplace(Worklist[i], i).second)
0067 llvm_unreachable("Duplicate elements in the list");
0068 #if LLVM_ENABLE_ABI_BREAKING_CHECKS
0069 Finalized = true;
0070 #endif
0071 }
0072
0073
0074 void insert(MachineInstr *I) {
0075 #if LLVM_ENABLE_ABI_BREAKING_CHECKS
0076 assert(Finalized && "GISelWorkList used without finalizing");
0077 #endif
0078 if (WorklistMap.try_emplace(I, Worklist.size()).second)
0079 Worklist.push_back(I);
0080 }
0081
0082
0083 void remove(const MachineInstr *I) {
0084 #if LLVM_ENABLE_ABI_BREAKING_CHECKS
0085 assert(Finalized && "GISelWorkList used without finalizing");
0086 #endif
0087 auto It = WorklistMap.find(I);
0088 if (It == WorklistMap.end())
0089 return;
0090
0091
0092 Worklist[It->second] = nullptr;
0093
0094 WorklistMap.erase(It);
0095 }
0096
0097 void clear() {
0098 Worklist.clear();
0099 WorklistMap.clear();
0100 }
0101
0102 MachineInstr *pop_back_val() {
0103 #if LLVM_ENABLE_ABI_BREAKING_CHECKS
0104 assert(Finalized && "GISelWorkList used without finalizing");
0105 #endif
0106 MachineInstr *I;
0107 do {
0108 I = Worklist.pop_back_val();
0109 } while(!I);
0110 assert(I && "Pop back on empty worklist");
0111 WorklistMap.erase(I);
0112 return I;
0113 }
0114 };
0115
0116 }
0117
0118 #endif