xref: /aosp_15_r20/external/llvm/lib/Bitcode/Writer/ValueEnumerator.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===-- ValueEnumerator.cpp - Number values and types for bitcode writer --===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file implements the ValueEnumerator class.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker 
14*9880d681SAndroid Build Coastguard Worker #include "ValueEnumerator.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/STLExtras.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/SmallPtrSet.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Constants.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DebugInfoMetadata.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DerivedTypes.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Instructions.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Module.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/UseListOrder.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/ValueSymbolTable.h"
24*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Debug.h"
25*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h"
26*9880d681SAndroid Build Coastguard Worker #include <algorithm>
27*9880d681SAndroid Build Coastguard Worker using namespace llvm;
28*9880d681SAndroid Build Coastguard Worker 
29*9880d681SAndroid Build Coastguard Worker namespace {
30*9880d681SAndroid Build Coastguard Worker struct OrderMap {
31*9880d681SAndroid Build Coastguard Worker   DenseMap<const Value *, std::pair<unsigned, bool>> IDs;
32*9880d681SAndroid Build Coastguard Worker   unsigned LastGlobalConstantID;
33*9880d681SAndroid Build Coastguard Worker   unsigned LastGlobalValueID;
34*9880d681SAndroid Build Coastguard Worker 
OrderMap__anon9dc1b3dc0111::OrderMap35*9880d681SAndroid Build Coastguard Worker   OrderMap() : LastGlobalConstantID(0), LastGlobalValueID(0) {}
36*9880d681SAndroid Build Coastguard Worker 
isGlobalConstant__anon9dc1b3dc0111::OrderMap37*9880d681SAndroid Build Coastguard Worker   bool isGlobalConstant(unsigned ID) const {
38*9880d681SAndroid Build Coastguard Worker     return ID <= LastGlobalConstantID;
39*9880d681SAndroid Build Coastguard Worker   }
isGlobalValue__anon9dc1b3dc0111::OrderMap40*9880d681SAndroid Build Coastguard Worker   bool isGlobalValue(unsigned ID) const {
41*9880d681SAndroid Build Coastguard Worker     return ID <= LastGlobalValueID && !isGlobalConstant(ID);
42*9880d681SAndroid Build Coastguard Worker   }
43*9880d681SAndroid Build Coastguard Worker 
size__anon9dc1b3dc0111::OrderMap44*9880d681SAndroid Build Coastguard Worker   unsigned size() const { return IDs.size(); }
operator []__anon9dc1b3dc0111::OrderMap45*9880d681SAndroid Build Coastguard Worker   std::pair<unsigned, bool> &operator[](const Value *V) { return IDs[V]; }
lookup__anon9dc1b3dc0111::OrderMap46*9880d681SAndroid Build Coastguard Worker   std::pair<unsigned, bool> lookup(const Value *V) const {
47*9880d681SAndroid Build Coastguard Worker     return IDs.lookup(V);
48*9880d681SAndroid Build Coastguard Worker   }
index__anon9dc1b3dc0111::OrderMap49*9880d681SAndroid Build Coastguard Worker   void index(const Value *V) {
50*9880d681SAndroid Build Coastguard Worker     // Explicitly sequence get-size and insert-value operations to avoid UB.
51*9880d681SAndroid Build Coastguard Worker     unsigned ID = IDs.size() + 1;
52*9880d681SAndroid Build Coastguard Worker     IDs[V].first = ID;
53*9880d681SAndroid Build Coastguard Worker   }
54*9880d681SAndroid Build Coastguard Worker };
55*9880d681SAndroid Build Coastguard Worker }
56*9880d681SAndroid Build Coastguard Worker 
orderValue(const Value * V,OrderMap & OM)57*9880d681SAndroid Build Coastguard Worker static void orderValue(const Value *V, OrderMap &OM) {
58*9880d681SAndroid Build Coastguard Worker   if (OM.lookup(V).first)
59*9880d681SAndroid Build Coastguard Worker     return;
60*9880d681SAndroid Build Coastguard Worker 
61*9880d681SAndroid Build Coastguard Worker   if (const Constant *C = dyn_cast<Constant>(V))
62*9880d681SAndroid Build Coastguard Worker     if (C->getNumOperands() && !isa<GlobalValue>(C))
63*9880d681SAndroid Build Coastguard Worker       for (const Value *Op : C->operands())
64*9880d681SAndroid Build Coastguard Worker         if (!isa<BasicBlock>(Op) && !isa<GlobalValue>(Op))
65*9880d681SAndroid Build Coastguard Worker           orderValue(Op, OM);
66*9880d681SAndroid Build Coastguard Worker 
67*9880d681SAndroid Build Coastguard Worker   // Note: we cannot cache this lookup above, since inserting into the map
68*9880d681SAndroid Build Coastguard Worker   // changes the map's size, and thus affects the other IDs.
69*9880d681SAndroid Build Coastguard Worker   OM.index(V);
70*9880d681SAndroid Build Coastguard Worker }
71*9880d681SAndroid Build Coastguard Worker 
orderModule(const Module & M)72*9880d681SAndroid Build Coastguard Worker static OrderMap orderModule(const Module &M) {
73*9880d681SAndroid Build Coastguard Worker   // This needs to match the order used by ValueEnumerator::ValueEnumerator()
74*9880d681SAndroid Build Coastguard Worker   // and ValueEnumerator::incorporateFunction().
75*9880d681SAndroid Build Coastguard Worker   OrderMap OM;
76*9880d681SAndroid Build Coastguard Worker 
77*9880d681SAndroid Build Coastguard Worker   // In the reader, initializers of GlobalValues are set *after* all the
78*9880d681SAndroid Build Coastguard Worker   // globals have been read.  Rather than awkwardly modeling this behaviour
79*9880d681SAndroid Build Coastguard Worker   // directly in predictValueUseListOrderImpl(), just assign IDs to
80*9880d681SAndroid Build Coastguard Worker   // initializers of GlobalValues before GlobalValues themselves to model this
81*9880d681SAndroid Build Coastguard Worker   // implicitly.
82*9880d681SAndroid Build Coastguard Worker   for (const GlobalVariable &G : M.globals())
83*9880d681SAndroid Build Coastguard Worker     if (G.hasInitializer())
84*9880d681SAndroid Build Coastguard Worker       if (!isa<GlobalValue>(G.getInitializer()))
85*9880d681SAndroid Build Coastguard Worker         orderValue(G.getInitializer(), OM);
86*9880d681SAndroid Build Coastguard Worker   for (const GlobalAlias &A : M.aliases())
87*9880d681SAndroid Build Coastguard Worker     if (!isa<GlobalValue>(A.getAliasee()))
88*9880d681SAndroid Build Coastguard Worker       orderValue(A.getAliasee(), OM);
89*9880d681SAndroid Build Coastguard Worker   for (const GlobalIFunc &I : M.ifuncs())
90*9880d681SAndroid Build Coastguard Worker     if (!isa<GlobalValue>(I.getResolver()))
91*9880d681SAndroid Build Coastguard Worker       orderValue(I.getResolver(), OM);
92*9880d681SAndroid Build Coastguard Worker   for (const Function &F : M) {
93*9880d681SAndroid Build Coastguard Worker     for (const Use &U : F.operands())
94*9880d681SAndroid Build Coastguard Worker       if (!isa<GlobalValue>(U.get()))
95*9880d681SAndroid Build Coastguard Worker         orderValue(U.get(), OM);
96*9880d681SAndroid Build Coastguard Worker   }
97*9880d681SAndroid Build Coastguard Worker   OM.LastGlobalConstantID = OM.size();
98*9880d681SAndroid Build Coastguard Worker 
99*9880d681SAndroid Build Coastguard Worker   // Initializers of GlobalValues are processed in
100*9880d681SAndroid Build Coastguard Worker   // BitcodeReader::ResolveGlobalAndAliasInits().  Match the order there rather
101*9880d681SAndroid Build Coastguard Worker   // than ValueEnumerator, and match the code in predictValueUseListOrderImpl()
102*9880d681SAndroid Build Coastguard Worker   // by giving IDs in reverse order.
103*9880d681SAndroid Build Coastguard Worker   //
104*9880d681SAndroid Build Coastguard Worker   // Since GlobalValues never reference each other directly (just through
105*9880d681SAndroid Build Coastguard Worker   // initializers), their relative IDs only matter for determining order of
106*9880d681SAndroid Build Coastguard Worker   // uses in their initializers.
107*9880d681SAndroid Build Coastguard Worker   for (const Function &F : M)
108*9880d681SAndroid Build Coastguard Worker     orderValue(&F, OM);
109*9880d681SAndroid Build Coastguard Worker   for (const GlobalAlias &A : M.aliases())
110*9880d681SAndroid Build Coastguard Worker     orderValue(&A, OM);
111*9880d681SAndroid Build Coastguard Worker   for (const GlobalIFunc &I : M.ifuncs())
112*9880d681SAndroid Build Coastguard Worker     orderValue(&I, OM);
113*9880d681SAndroid Build Coastguard Worker   for (const GlobalVariable &G : M.globals())
114*9880d681SAndroid Build Coastguard Worker     orderValue(&G, OM);
115*9880d681SAndroid Build Coastguard Worker   OM.LastGlobalValueID = OM.size();
116*9880d681SAndroid Build Coastguard Worker 
117*9880d681SAndroid Build Coastguard Worker   for (const Function &F : M) {
118*9880d681SAndroid Build Coastguard Worker     if (F.isDeclaration())
119*9880d681SAndroid Build Coastguard Worker       continue;
120*9880d681SAndroid Build Coastguard Worker     // Here we need to match the union of ValueEnumerator::incorporateFunction()
121*9880d681SAndroid Build Coastguard Worker     // and WriteFunction().  Basic blocks are implicitly declared before
122*9880d681SAndroid Build Coastguard Worker     // anything else (by declaring their size).
123*9880d681SAndroid Build Coastguard Worker     for (const BasicBlock &BB : F)
124*9880d681SAndroid Build Coastguard Worker       orderValue(&BB, OM);
125*9880d681SAndroid Build Coastguard Worker     for (const Argument &A : F.args())
126*9880d681SAndroid Build Coastguard Worker       orderValue(&A, OM);
127*9880d681SAndroid Build Coastguard Worker     for (const BasicBlock &BB : F)
128*9880d681SAndroid Build Coastguard Worker       for (const Instruction &I : BB)
129*9880d681SAndroid Build Coastguard Worker         for (const Value *Op : I.operands())
130*9880d681SAndroid Build Coastguard Worker           if ((isa<Constant>(*Op) && !isa<GlobalValue>(*Op)) ||
131*9880d681SAndroid Build Coastguard Worker               isa<InlineAsm>(*Op))
132*9880d681SAndroid Build Coastguard Worker             orderValue(Op, OM);
133*9880d681SAndroid Build Coastguard Worker     for (const BasicBlock &BB : F)
134*9880d681SAndroid Build Coastguard Worker       for (const Instruction &I : BB)
135*9880d681SAndroid Build Coastguard Worker         orderValue(&I, OM);
136*9880d681SAndroid Build Coastguard Worker   }
137*9880d681SAndroid Build Coastguard Worker   return OM;
138*9880d681SAndroid Build Coastguard Worker }
139*9880d681SAndroid Build Coastguard Worker 
predictValueUseListOrderImpl(const Value * V,const Function * F,unsigned ID,const OrderMap & OM,UseListOrderStack & Stack)140*9880d681SAndroid Build Coastguard Worker static void predictValueUseListOrderImpl(const Value *V, const Function *F,
141*9880d681SAndroid Build Coastguard Worker                                          unsigned ID, const OrderMap &OM,
142*9880d681SAndroid Build Coastguard Worker                                          UseListOrderStack &Stack) {
143*9880d681SAndroid Build Coastguard Worker   // Predict use-list order for this one.
144*9880d681SAndroid Build Coastguard Worker   typedef std::pair<const Use *, unsigned> Entry;
145*9880d681SAndroid Build Coastguard Worker   SmallVector<Entry, 64> List;
146*9880d681SAndroid Build Coastguard Worker   for (const Use &U : V->uses())
147*9880d681SAndroid Build Coastguard Worker     // Check if this user will be serialized.
148*9880d681SAndroid Build Coastguard Worker     if (OM.lookup(U.getUser()).first)
149*9880d681SAndroid Build Coastguard Worker       List.push_back(std::make_pair(&U, List.size()));
150*9880d681SAndroid Build Coastguard Worker 
151*9880d681SAndroid Build Coastguard Worker   if (List.size() < 2)
152*9880d681SAndroid Build Coastguard Worker     // We may have lost some users.
153*9880d681SAndroid Build Coastguard Worker     return;
154*9880d681SAndroid Build Coastguard Worker 
155*9880d681SAndroid Build Coastguard Worker   bool IsGlobalValue = OM.isGlobalValue(ID);
156*9880d681SAndroid Build Coastguard Worker   std::sort(List.begin(), List.end(), [&](const Entry &L, const Entry &R) {
157*9880d681SAndroid Build Coastguard Worker     const Use *LU = L.first;
158*9880d681SAndroid Build Coastguard Worker     const Use *RU = R.first;
159*9880d681SAndroid Build Coastguard Worker     if (LU == RU)
160*9880d681SAndroid Build Coastguard Worker       return false;
161*9880d681SAndroid Build Coastguard Worker 
162*9880d681SAndroid Build Coastguard Worker     auto LID = OM.lookup(LU->getUser()).first;
163*9880d681SAndroid Build Coastguard Worker     auto RID = OM.lookup(RU->getUser()).first;
164*9880d681SAndroid Build Coastguard Worker 
165*9880d681SAndroid Build Coastguard Worker     // Global values are processed in reverse order.
166*9880d681SAndroid Build Coastguard Worker     //
167*9880d681SAndroid Build Coastguard Worker     // Moreover, initializers of GlobalValues are set *after* all the globals
168*9880d681SAndroid Build Coastguard Worker     // have been read (despite having earlier IDs).  Rather than awkwardly
169*9880d681SAndroid Build Coastguard Worker     // modeling this behaviour here, orderModule() has assigned IDs to
170*9880d681SAndroid Build Coastguard Worker     // initializers of GlobalValues before GlobalValues themselves.
171*9880d681SAndroid Build Coastguard Worker     if (OM.isGlobalValue(LID) && OM.isGlobalValue(RID))
172*9880d681SAndroid Build Coastguard Worker       return LID < RID;
173*9880d681SAndroid Build Coastguard Worker 
174*9880d681SAndroid Build Coastguard Worker     // If ID is 4, then expect: 7 6 5 1 2 3.
175*9880d681SAndroid Build Coastguard Worker     if (LID < RID) {
176*9880d681SAndroid Build Coastguard Worker       if (RID <= ID)
177*9880d681SAndroid Build Coastguard Worker         if (!IsGlobalValue) // GlobalValue uses don't get reversed.
178*9880d681SAndroid Build Coastguard Worker           return true;
179*9880d681SAndroid Build Coastguard Worker       return false;
180*9880d681SAndroid Build Coastguard Worker     }
181*9880d681SAndroid Build Coastguard Worker     if (RID < LID) {
182*9880d681SAndroid Build Coastguard Worker       if (LID <= ID)
183*9880d681SAndroid Build Coastguard Worker         if (!IsGlobalValue) // GlobalValue uses don't get reversed.
184*9880d681SAndroid Build Coastguard Worker           return false;
185*9880d681SAndroid Build Coastguard Worker       return true;
186*9880d681SAndroid Build Coastguard Worker     }
187*9880d681SAndroid Build Coastguard Worker 
188*9880d681SAndroid Build Coastguard Worker     // LID and RID are equal, so we have different operands of the same user.
189*9880d681SAndroid Build Coastguard Worker     // Assume operands are added in order for all instructions.
190*9880d681SAndroid Build Coastguard Worker     if (LID <= ID)
191*9880d681SAndroid Build Coastguard Worker       if (!IsGlobalValue) // GlobalValue uses don't get reversed.
192*9880d681SAndroid Build Coastguard Worker         return LU->getOperandNo() < RU->getOperandNo();
193*9880d681SAndroid Build Coastguard Worker     return LU->getOperandNo() > RU->getOperandNo();
194*9880d681SAndroid Build Coastguard Worker   });
195*9880d681SAndroid Build Coastguard Worker 
196*9880d681SAndroid Build Coastguard Worker   if (std::is_sorted(
197*9880d681SAndroid Build Coastguard Worker           List.begin(), List.end(),
198*9880d681SAndroid Build Coastguard Worker           [](const Entry &L, const Entry &R) { return L.second < R.second; }))
199*9880d681SAndroid Build Coastguard Worker     // Order is already correct.
200*9880d681SAndroid Build Coastguard Worker     return;
201*9880d681SAndroid Build Coastguard Worker 
202*9880d681SAndroid Build Coastguard Worker   // Store the shuffle.
203*9880d681SAndroid Build Coastguard Worker   Stack.emplace_back(V, F, List.size());
204*9880d681SAndroid Build Coastguard Worker   assert(List.size() == Stack.back().Shuffle.size() && "Wrong size");
205*9880d681SAndroid Build Coastguard Worker   for (size_t I = 0, E = List.size(); I != E; ++I)
206*9880d681SAndroid Build Coastguard Worker     Stack.back().Shuffle[I] = List[I].second;
207*9880d681SAndroid Build Coastguard Worker }
208*9880d681SAndroid Build Coastguard Worker 
predictValueUseListOrder(const Value * V,const Function * F,OrderMap & OM,UseListOrderStack & Stack)209*9880d681SAndroid Build Coastguard Worker static void predictValueUseListOrder(const Value *V, const Function *F,
210*9880d681SAndroid Build Coastguard Worker                                      OrderMap &OM, UseListOrderStack &Stack) {
211*9880d681SAndroid Build Coastguard Worker   auto &IDPair = OM[V];
212*9880d681SAndroid Build Coastguard Worker   assert(IDPair.first && "Unmapped value");
213*9880d681SAndroid Build Coastguard Worker   if (IDPair.second)
214*9880d681SAndroid Build Coastguard Worker     // Already predicted.
215*9880d681SAndroid Build Coastguard Worker     return;
216*9880d681SAndroid Build Coastguard Worker 
217*9880d681SAndroid Build Coastguard Worker   // Do the actual prediction.
218*9880d681SAndroid Build Coastguard Worker   IDPair.second = true;
219*9880d681SAndroid Build Coastguard Worker   if (!V->use_empty() && std::next(V->use_begin()) != V->use_end())
220*9880d681SAndroid Build Coastguard Worker     predictValueUseListOrderImpl(V, F, IDPair.first, OM, Stack);
221*9880d681SAndroid Build Coastguard Worker 
222*9880d681SAndroid Build Coastguard Worker   // Recursive descent into constants.
223*9880d681SAndroid Build Coastguard Worker   if (const Constant *C = dyn_cast<Constant>(V))
224*9880d681SAndroid Build Coastguard Worker     if (C->getNumOperands()) // Visit GlobalValues.
225*9880d681SAndroid Build Coastguard Worker       for (const Value *Op : C->operands())
226*9880d681SAndroid Build Coastguard Worker         if (isa<Constant>(Op)) // Visit GlobalValues.
227*9880d681SAndroid Build Coastguard Worker           predictValueUseListOrder(Op, F, OM, Stack);
228*9880d681SAndroid Build Coastguard Worker }
229*9880d681SAndroid Build Coastguard Worker 
predictUseListOrder(const Module & M)230*9880d681SAndroid Build Coastguard Worker static UseListOrderStack predictUseListOrder(const Module &M) {
231*9880d681SAndroid Build Coastguard Worker   OrderMap OM = orderModule(M);
232*9880d681SAndroid Build Coastguard Worker 
233*9880d681SAndroid Build Coastguard Worker   // Use-list orders need to be serialized after all the users have been added
234*9880d681SAndroid Build Coastguard Worker   // to a value, or else the shuffles will be incomplete.  Store them per
235*9880d681SAndroid Build Coastguard Worker   // function in a stack.
236*9880d681SAndroid Build Coastguard Worker   //
237*9880d681SAndroid Build Coastguard Worker   // Aside from function order, the order of values doesn't matter much here.
238*9880d681SAndroid Build Coastguard Worker   UseListOrderStack Stack;
239*9880d681SAndroid Build Coastguard Worker 
240*9880d681SAndroid Build Coastguard Worker   // We want to visit the functions backward now so we can list function-local
241*9880d681SAndroid Build Coastguard Worker   // constants in the last Function they're used in.  Module-level constants
242*9880d681SAndroid Build Coastguard Worker   // have already been visited above.
243*9880d681SAndroid Build Coastguard Worker   for (auto I = M.rbegin(), E = M.rend(); I != E; ++I) {
244*9880d681SAndroid Build Coastguard Worker     const Function &F = *I;
245*9880d681SAndroid Build Coastguard Worker     if (F.isDeclaration())
246*9880d681SAndroid Build Coastguard Worker       continue;
247*9880d681SAndroid Build Coastguard Worker     for (const BasicBlock &BB : F)
248*9880d681SAndroid Build Coastguard Worker       predictValueUseListOrder(&BB, &F, OM, Stack);
249*9880d681SAndroid Build Coastguard Worker     for (const Argument &A : F.args())
250*9880d681SAndroid Build Coastguard Worker       predictValueUseListOrder(&A, &F, OM, Stack);
251*9880d681SAndroid Build Coastguard Worker     for (const BasicBlock &BB : F)
252*9880d681SAndroid Build Coastguard Worker       for (const Instruction &I : BB)
253*9880d681SAndroid Build Coastguard Worker         for (const Value *Op : I.operands())
254*9880d681SAndroid Build Coastguard Worker           if (isa<Constant>(*Op) || isa<InlineAsm>(*Op)) // Visit GlobalValues.
255*9880d681SAndroid Build Coastguard Worker             predictValueUseListOrder(Op, &F, OM, Stack);
256*9880d681SAndroid Build Coastguard Worker     for (const BasicBlock &BB : F)
257*9880d681SAndroid Build Coastguard Worker       for (const Instruction &I : BB)
258*9880d681SAndroid Build Coastguard Worker         predictValueUseListOrder(&I, &F, OM, Stack);
259*9880d681SAndroid Build Coastguard Worker   }
260*9880d681SAndroid Build Coastguard Worker 
261*9880d681SAndroid Build Coastguard Worker   // Visit globals last, since the module-level use-list block will be seen
262*9880d681SAndroid Build Coastguard Worker   // before the function bodies are processed.
263*9880d681SAndroid Build Coastguard Worker   for (const GlobalVariable &G : M.globals())
264*9880d681SAndroid Build Coastguard Worker     predictValueUseListOrder(&G, nullptr, OM, Stack);
265*9880d681SAndroid Build Coastguard Worker   for (const Function &F : M)
266*9880d681SAndroid Build Coastguard Worker     predictValueUseListOrder(&F, nullptr, OM, Stack);
267*9880d681SAndroid Build Coastguard Worker   for (const GlobalAlias &A : M.aliases())
268*9880d681SAndroid Build Coastguard Worker     predictValueUseListOrder(&A, nullptr, OM, Stack);
269*9880d681SAndroid Build Coastguard Worker   for (const GlobalIFunc &I : M.ifuncs())
270*9880d681SAndroid Build Coastguard Worker     predictValueUseListOrder(&I, nullptr, OM, Stack);
271*9880d681SAndroid Build Coastguard Worker   for (const GlobalVariable &G : M.globals())
272*9880d681SAndroid Build Coastguard Worker     if (G.hasInitializer())
273*9880d681SAndroid Build Coastguard Worker       predictValueUseListOrder(G.getInitializer(), nullptr, OM, Stack);
274*9880d681SAndroid Build Coastguard Worker   for (const GlobalAlias &A : M.aliases())
275*9880d681SAndroid Build Coastguard Worker     predictValueUseListOrder(A.getAliasee(), nullptr, OM, Stack);
276*9880d681SAndroid Build Coastguard Worker   for (const GlobalIFunc &I : M.ifuncs())
277*9880d681SAndroid Build Coastguard Worker     predictValueUseListOrder(I.getResolver(), nullptr, OM, Stack);
278*9880d681SAndroid Build Coastguard Worker   for (const Function &F : M) {
279*9880d681SAndroid Build Coastguard Worker     for (const Use &U : F.operands())
280*9880d681SAndroid Build Coastguard Worker       predictValueUseListOrder(U.get(), nullptr, OM, Stack);
281*9880d681SAndroid Build Coastguard Worker   }
282*9880d681SAndroid Build Coastguard Worker 
283*9880d681SAndroid Build Coastguard Worker   return Stack;
284*9880d681SAndroid Build Coastguard Worker }
285*9880d681SAndroid Build Coastguard Worker 
isIntOrIntVectorValue(const std::pair<const Value *,unsigned> & V)286*9880d681SAndroid Build Coastguard Worker static bool isIntOrIntVectorValue(const std::pair<const Value*, unsigned> &V) {
287*9880d681SAndroid Build Coastguard Worker   return V.first->getType()->isIntOrIntVectorTy();
288*9880d681SAndroid Build Coastguard Worker }
289*9880d681SAndroid Build Coastguard Worker 
ValueEnumerator(const Module & M,bool ShouldPreserveUseListOrder)290*9880d681SAndroid Build Coastguard Worker ValueEnumerator::ValueEnumerator(const Module &M,
291*9880d681SAndroid Build Coastguard Worker                                  bool ShouldPreserveUseListOrder)
292*9880d681SAndroid Build Coastguard Worker     : ShouldPreserveUseListOrder(ShouldPreserveUseListOrder) {
293*9880d681SAndroid Build Coastguard Worker   if (ShouldPreserveUseListOrder)
294*9880d681SAndroid Build Coastguard Worker     UseListOrders = predictUseListOrder(M);
295*9880d681SAndroid Build Coastguard Worker 
296*9880d681SAndroid Build Coastguard Worker   // Enumerate the global variables.
297*9880d681SAndroid Build Coastguard Worker   for (const GlobalVariable &GV : M.globals())
298*9880d681SAndroid Build Coastguard Worker     EnumerateValue(&GV);
299*9880d681SAndroid Build Coastguard Worker 
300*9880d681SAndroid Build Coastguard Worker   // Enumerate the functions.
301*9880d681SAndroid Build Coastguard Worker   for (const Function & F : M) {
302*9880d681SAndroid Build Coastguard Worker     EnumerateValue(&F);
303*9880d681SAndroid Build Coastguard Worker     EnumerateAttributes(F.getAttributes());
304*9880d681SAndroid Build Coastguard Worker   }
305*9880d681SAndroid Build Coastguard Worker 
306*9880d681SAndroid Build Coastguard Worker   // Enumerate the aliases.
307*9880d681SAndroid Build Coastguard Worker   for (const GlobalAlias &GA : M.aliases())
308*9880d681SAndroid Build Coastguard Worker     EnumerateValue(&GA);
309*9880d681SAndroid Build Coastguard Worker 
310*9880d681SAndroid Build Coastguard Worker   // Enumerate the ifuncs.
311*9880d681SAndroid Build Coastguard Worker   for (const GlobalIFunc &GIF : M.ifuncs())
312*9880d681SAndroid Build Coastguard Worker     EnumerateValue(&GIF);
313*9880d681SAndroid Build Coastguard Worker 
314*9880d681SAndroid Build Coastguard Worker   // Remember what is the cutoff between globalvalue's and other constants.
315*9880d681SAndroid Build Coastguard Worker   unsigned FirstConstant = Values.size();
316*9880d681SAndroid Build Coastguard Worker 
317*9880d681SAndroid Build Coastguard Worker   // Enumerate the global variable initializers.
318*9880d681SAndroid Build Coastguard Worker   for (const GlobalVariable &GV : M.globals())
319*9880d681SAndroid Build Coastguard Worker     if (GV.hasInitializer())
320*9880d681SAndroid Build Coastguard Worker       EnumerateValue(GV.getInitializer());
321*9880d681SAndroid Build Coastguard Worker 
322*9880d681SAndroid Build Coastguard Worker   // Enumerate the aliasees.
323*9880d681SAndroid Build Coastguard Worker   for (const GlobalAlias &GA : M.aliases())
324*9880d681SAndroid Build Coastguard Worker     EnumerateValue(GA.getAliasee());
325*9880d681SAndroid Build Coastguard Worker 
326*9880d681SAndroid Build Coastguard Worker   // Enumerate the ifunc resolvers.
327*9880d681SAndroid Build Coastguard Worker   for (const GlobalIFunc &GIF : M.ifuncs())
328*9880d681SAndroid Build Coastguard Worker     EnumerateValue(GIF.getResolver());
329*9880d681SAndroid Build Coastguard Worker 
330*9880d681SAndroid Build Coastguard Worker   // Enumerate any optional Function data.
331*9880d681SAndroid Build Coastguard Worker   for (const Function &F : M)
332*9880d681SAndroid Build Coastguard Worker     for (const Use &U : F.operands())
333*9880d681SAndroid Build Coastguard Worker       EnumerateValue(U.get());
334*9880d681SAndroid Build Coastguard Worker 
335*9880d681SAndroid Build Coastguard Worker   // Enumerate the metadata type.
336*9880d681SAndroid Build Coastguard Worker   //
337*9880d681SAndroid Build Coastguard Worker   // TODO: Move this to ValueEnumerator::EnumerateOperandType() once bitcode
338*9880d681SAndroid Build Coastguard Worker   // only encodes the metadata type when it's used as a value.
339*9880d681SAndroid Build Coastguard Worker   EnumerateType(Type::getMetadataTy(M.getContext()));
340*9880d681SAndroid Build Coastguard Worker 
341*9880d681SAndroid Build Coastguard Worker   // Insert constants and metadata that are named at module level into the slot
342*9880d681SAndroid Build Coastguard Worker   // pool so that the module symbol table can refer to them...
343*9880d681SAndroid Build Coastguard Worker   EnumerateValueSymbolTable(M.getValueSymbolTable());
344*9880d681SAndroid Build Coastguard Worker   EnumerateNamedMetadata(M);
345*9880d681SAndroid Build Coastguard Worker 
346*9880d681SAndroid Build Coastguard Worker   SmallVector<std::pair<unsigned, MDNode *>, 8> MDs;
347*9880d681SAndroid Build Coastguard Worker   for (const GlobalVariable &GV : M.globals()) {
348*9880d681SAndroid Build Coastguard Worker     MDs.clear();
349*9880d681SAndroid Build Coastguard Worker     GV.getAllMetadata(MDs);
350*9880d681SAndroid Build Coastguard Worker     for (const auto &I : MDs)
351*9880d681SAndroid Build Coastguard Worker       // FIXME: Pass GV to EnumerateMetadata and arrange for the bitcode writer
352*9880d681SAndroid Build Coastguard Worker       // to write metadata to the global variable's own metadata block
353*9880d681SAndroid Build Coastguard Worker       // (PR28134).
354*9880d681SAndroid Build Coastguard Worker       EnumerateMetadata(nullptr, I.second);
355*9880d681SAndroid Build Coastguard Worker   }
356*9880d681SAndroid Build Coastguard Worker 
357*9880d681SAndroid Build Coastguard Worker   // Enumerate types used by function bodies and argument lists.
358*9880d681SAndroid Build Coastguard Worker   for (const Function &F : M) {
359*9880d681SAndroid Build Coastguard Worker     for (const Argument &A : F.args())
360*9880d681SAndroid Build Coastguard Worker       EnumerateType(A.getType());
361*9880d681SAndroid Build Coastguard Worker 
362*9880d681SAndroid Build Coastguard Worker     // Enumerate metadata attached to this function.
363*9880d681SAndroid Build Coastguard Worker     MDs.clear();
364*9880d681SAndroid Build Coastguard Worker     F.getAllMetadata(MDs);
365*9880d681SAndroid Build Coastguard Worker     for (const auto &I : MDs)
366*9880d681SAndroid Build Coastguard Worker       EnumerateMetadata(F.isDeclaration() ? nullptr : &F, I.second);
367*9880d681SAndroid Build Coastguard Worker 
368*9880d681SAndroid Build Coastguard Worker     for (const BasicBlock &BB : F)
369*9880d681SAndroid Build Coastguard Worker       for (const Instruction &I : BB) {
370*9880d681SAndroid Build Coastguard Worker         for (const Use &Op : I.operands()) {
371*9880d681SAndroid Build Coastguard Worker           auto *MD = dyn_cast<MetadataAsValue>(&Op);
372*9880d681SAndroid Build Coastguard Worker           if (!MD) {
373*9880d681SAndroid Build Coastguard Worker             EnumerateOperandType(Op);
374*9880d681SAndroid Build Coastguard Worker             continue;
375*9880d681SAndroid Build Coastguard Worker           }
376*9880d681SAndroid Build Coastguard Worker 
377*9880d681SAndroid Build Coastguard Worker           // Local metadata is enumerated during function-incorporation.
378*9880d681SAndroid Build Coastguard Worker           if (isa<LocalAsMetadata>(MD->getMetadata()))
379*9880d681SAndroid Build Coastguard Worker             continue;
380*9880d681SAndroid Build Coastguard Worker 
381*9880d681SAndroid Build Coastguard Worker           EnumerateMetadata(&F, MD->getMetadata());
382*9880d681SAndroid Build Coastguard Worker         }
383*9880d681SAndroid Build Coastguard Worker         EnumerateType(I.getType());
384*9880d681SAndroid Build Coastguard Worker         if (const CallInst *CI = dyn_cast<CallInst>(&I))
385*9880d681SAndroid Build Coastguard Worker           EnumerateAttributes(CI->getAttributes());
386*9880d681SAndroid Build Coastguard Worker         else if (const InvokeInst *II = dyn_cast<InvokeInst>(&I))
387*9880d681SAndroid Build Coastguard Worker           EnumerateAttributes(II->getAttributes());
388*9880d681SAndroid Build Coastguard Worker 
389*9880d681SAndroid Build Coastguard Worker         // Enumerate metadata attached with this instruction.
390*9880d681SAndroid Build Coastguard Worker         MDs.clear();
391*9880d681SAndroid Build Coastguard Worker         I.getAllMetadataOtherThanDebugLoc(MDs);
392*9880d681SAndroid Build Coastguard Worker         for (unsigned i = 0, e = MDs.size(); i != e; ++i)
393*9880d681SAndroid Build Coastguard Worker           EnumerateMetadata(&F, MDs[i].second);
394*9880d681SAndroid Build Coastguard Worker 
395*9880d681SAndroid Build Coastguard Worker         // Don't enumerate the location directly -- it has a special record
396*9880d681SAndroid Build Coastguard Worker         // type -- but enumerate its operands.
397*9880d681SAndroid Build Coastguard Worker         if (DILocation *L = I.getDebugLoc())
398*9880d681SAndroid Build Coastguard Worker           for (const Metadata *Op : L->operands())
399*9880d681SAndroid Build Coastguard Worker             EnumerateMetadata(&F, Op);
400*9880d681SAndroid Build Coastguard Worker       }
401*9880d681SAndroid Build Coastguard Worker   }
402*9880d681SAndroid Build Coastguard Worker 
403*9880d681SAndroid Build Coastguard Worker   // Optimize constant ordering.
404*9880d681SAndroid Build Coastguard Worker   OptimizeConstants(FirstConstant, Values.size());
405*9880d681SAndroid Build Coastguard Worker 
406*9880d681SAndroid Build Coastguard Worker   // Organize metadata ordering.
407*9880d681SAndroid Build Coastguard Worker   organizeMetadata();
408*9880d681SAndroid Build Coastguard Worker }
409*9880d681SAndroid Build Coastguard Worker 
getInstructionID(const Instruction * Inst) const410*9880d681SAndroid Build Coastguard Worker unsigned ValueEnumerator::getInstructionID(const Instruction *Inst) const {
411*9880d681SAndroid Build Coastguard Worker   InstructionMapType::const_iterator I = InstructionMap.find(Inst);
412*9880d681SAndroid Build Coastguard Worker   assert(I != InstructionMap.end() && "Instruction is not mapped!");
413*9880d681SAndroid Build Coastguard Worker   return I->second;
414*9880d681SAndroid Build Coastguard Worker }
415*9880d681SAndroid Build Coastguard Worker 
getComdatID(const Comdat * C) const416*9880d681SAndroid Build Coastguard Worker unsigned ValueEnumerator::getComdatID(const Comdat *C) const {
417*9880d681SAndroid Build Coastguard Worker   unsigned ComdatID = Comdats.idFor(C);
418*9880d681SAndroid Build Coastguard Worker   assert(ComdatID && "Comdat not found!");
419*9880d681SAndroid Build Coastguard Worker   return ComdatID;
420*9880d681SAndroid Build Coastguard Worker }
421*9880d681SAndroid Build Coastguard Worker 
setInstructionID(const Instruction * I)422*9880d681SAndroid Build Coastguard Worker void ValueEnumerator::setInstructionID(const Instruction *I) {
423*9880d681SAndroid Build Coastguard Worker   InstructionMap[I] = InstructionCount++;
424*9880d681SAndroid Build Coastguard Worker }
425*9880d681SAndroid Build Coastguard Worker 
getValueID(const Value * V) const426*9880d681SAndroid Build Coastguard Worker unsigned ValueEnumerator::getValueID(const Value *V) const {
427*9880d681SAndroid Build Coastguard Worker   if (auto *MD = dyn_cast<MetadataAsValue>(V))
428*9880d681SAndroid Build Coastguard Worker     return getMetadataID(MD->getMetadata());
429*9880d681SAndroid Build Coastguard Worker 
430*9880d681SAndroid Build Coastguard Worker   ValueMapType::const_iterator I = ValueMap.find(V);
431*9880d681SAndroid Build Coastguard Worker   assert(I != ValueMap.end() && "Value not in slotcalculator!");
432*9880d681SAndroid Build Coastguard Worker   return I->second-1;
433*9880d681SAndroid Build Coastguard Worker }
434*9880d681SAndroid Build Coastguard Worker 
dump() const435*9880d681SAndroid Build Coastguard Worker LLVM_DUMP_METHOD void ValueEnumerator::dump() const {
436*9880d681SAndroid Build Coastguard Worker   print(dbgs(), ValueMap, "Default");
437*9880d681SAndroid Build Coastguard Worker   dbgs() << '\n';
438*9880d681SAndroid Build Coastguard Worker   print(dbgs(), MetadataMap, "MetaData");
439*9880d681SAndroid Build Coastguard Worker   dbgs() << '\n';
440*9880d681SAndroid Build Coastguard Worker }
441*9880d681SAndroid Build Coastguard Worker 
print(raw_ostream & OS,const ValueMapType & Map,const char * Name) const442*9880d681SAndroid Build Coastguard Worker void ValueEnumerator::print(raw_ostream &OS, const ValueMapType &Map,
443*9880d681SAndroid Build Coastguard Worker                             const char *Name) const {
444*9880d681SAndroid Build Coastguard Worker 
445*9880d681SAndroid Build Coastguard Worker   OS << "Map Name: " << Name << "\n";
446*9880d681SAndroid Build Coastguard Worker   OS << "Size: " << Map.size() << "\n";
447*9880d681SAndroid Build Coastguard Worker   for (ValueMapType::const_iterator I = Map.begin(),
448*9880d681SAndroid Build Coastguard Worker          E = Map.end(); I != E; ++I) {
449*9880d681SAndroid Build Coastguard Worker 
450*9880d681SAndroid Build Coastguard Worker     const Value *V = I->first;
451*9880d681SAndroid Build Coastguard Worker     if (V->hasName())
452*9880d681SAndroid Build Coastguard Worker       OS << "Value: " << V->getName();
453*9880d681SAndroid Build Coastguard Worker     else
454*9880d681SAndroid Build Coastguard Worker       OS << "Value: [null]\n";
455*9880d681SAndroid Build Coastguard Worker     V->dump();
456*9880d681SAndroid Build Coastguard Worker 
457*9880d681SAndroid Build Coastguard Worker     OS << " Uses(" << std::distance(V->use_begin(),V->use_end()) << "):";
458*9880d681SAndroid Build Coastguard Worker     for (const Use &U : V->uses()) {
459*9880d681SAndroid Build Coastguard Worker       if (&U != &*V->use_begin())
460*9880d681SAndroid Build Coastguard Worker         OS << ",";
461*9880d681SAndroid Build Coastguard Worker       if(U->hasName())
462*9880d681SAndroid Build Coastguard Worker         OS << " " << U->getName();
463*9880d681SAndroid Build Coastguard Worker       else
464*9880d681SAndroid Build Coastguard Worker         OS << " [null]";
465*9880d681SAndroid Build Coastguard Worker 
466*9880d681SAndroid Build Coastguard Worker     }
467*9880d681SAndroid Build Coastguard Worker     OS <<  "\n\n";
468*9880d681SAndroid Build Coastguard Worker   }
469*9880d681SAndroid Build Coastguard Worker }
470*9880d681SAndroid Build Coastguard Worker 
print(raw_ostream & OS,const MetadataMapType & Map,const char * Name) const471*9880d681SAndroid Build Coastguard Worker void ValueEnumerator::print(raw_ostream &OS, const MetadataMapType &Map,
472*9880d681SAndroid Build Coastguard Worker                             const char *Name) const {
473*9880d681SAndroid Build Coastguard Worker 
474*9880d681SAndroid Build Coastguard Worker   OS << "Map Name: " << Name << "\n";
475*9880d681SAndroid Build Coastguard Worker   OS << "Size: " << Map.size() << "\n";
476*9880d681SAndroid Build Coastguard Worker   for (auto I = Map.begin(), E = Map.end(); I != E; ++I) {
477*9880d681SAndroid Build Coastguard Worker     const Metadata *MD = I->first;
478*9880d681SAndroid Build Coastguard Worker     OS << "Metadata: slot = " << I->second.ID << "\n";
479*9880d681SAndroid Build Coastguard Worker     OS << "Metadata: function = " << I->second.F << "\n";
480*9880d681SAndroid Build Coastguard Worker     MD->print(OS);
481*9880d681SAndroid Build Coastguard Worker     OS << "\n";
482*9880d681SAndroid Build Coastguard Worker   }
483*9880d681SAndroid Build Coastguard Worker }
484*9880d681SAndroid Build Coastguard Worker 
485*9880d681SAndroid Build Coastguard Worker /// OptimizeConstants - Reorder constant pool for denser encoding.
OptimizeConstants(unsigned CstStart,unsigned CstEnd)486*9880d681SAndroid Build Coastguard Worker void ValueEnumerator::OptimizeConstants(unsigned CstStart, unsigned CstEnd) {
487*9880d681SAndroid Build Coastguard Worker   if (CstStart == CstEnd || CstStart+1 == CstEnd) return;
488*9880d681SAndroid Build Coastguard Worker 
489*9880d681SAndroid Build Coastguard Worker   if (ShouldPreserveUseListOrder)
490*9880d681SAndroid Build Coastguard Worker     // Optimizing constants makes the use-list order difficult to predict.
491*9880d681SAndroid Build Coastguard Worker     // Disable it for now when trying to preserve the order.
492*9880d681SAndroid Build Coastguard Worker     return;
493*9880d681SAndroid Build Coastguard Worker 
494*9880d681SAndroid Build Coastguard Worker   std::stable_sort(Values.begin() + CstStart, Values.begin() + CstEnd,
495*9880d681SAndroid Build Coastguard Worker                    [this](const std::pair<const Value *, unsigned> &LHS,
496*9880d681SAndroid Build Coastguard Worker                           const std::pair<const Value *, unsigned> &RHS) {
497*9880d681SAndroid Build Coastguard Worker     // Sort by plane.
498*9880d681SAndroid Build Coastguard Worker     if (LHS.first->getType() != RHS.first->getType())
499*9880d681SAndroid Build Coastguard Worker       return getTypeID(LHS.first->getType()) < getTypeID(RHS.first->getType());
500*9880d681SAndroid Build Coastguard Worker     // Then by frequency.
501*9880d681SAndroid Build Coastguard Worker     return LHS.second > RHS.second;
502*9880d681SAndroid Build Coastguard Worker   });
503*9880d681SAndroid Build Coastguard Worker 
504*9880d681SAndroid Build Coastguard Worker   // Ensure that integer and vector of integer constants are at the start of the
505*9880d681SAndroid Build Coastguard Worker   // constant pool.  This is important so that GEP structure indices come before
506*9880d681SAndroid Build Coastguard Worker   // gep constant exprs.
507*9880d681SAndroid Build Coastguard Worker   std::stable_partition(Values.begin() + CstStart, Values.begin() + CstEnd,
508*9880d681SAndroid Build Coastguard Worker                         isIntOrIntVectorValue);
509*9880d681SAndroid Build Coastguard Worker 
510*9880d681SAndroid Build Coastguard Worker   // Rebuild the modified portion of ValueMap.
511*9880d681SAndroid Build Coastguard Worker   for (; CstStart != CstEnd; ++CstStart)
512*9880d681SAndroid Build Coastguard Worker     ValueMap[Values[CstStart].first] = CstStart+1;
513*9880d681SAndroid Build Coastguard Worker }
514*9880d681SAndroid Build Coastguard Worker 
515*9880d681SAndroid Build Coastguard Worker 
516*9880d681SAndroid Build Coastguard Worker /// EnumerateValueSymbolTable - Insert all of the values in the specified symbol
517*9880d681SAndroid Build Coastguard Worker /// table into the values table.
EnumerateValueSymbolTable(const ValueSymbolTable & VST)518*9880d681SAndroid Build Coastguard Worker void ValueEnumerator::EnumerateValueSymbolTable(const ValueSymbolTable &VST) {
519*9880d681SAndroid Build Coastguard Worker   for (ValueSymbolTable::const_iterator VI = VST.begin(), VE = VST.end();
520*9880d681SAndroid Build Coastguard Worker        VI != VE; ++VI)
521*9880d681SAndroid Build Coastguard Worker     EnumerateValue(VI->getValue());
522*9880d681SAndroid Build Coastguard Worker }
523*9880d681SAndroid Build Coastguard Worker 
524*9880d681SAndroid Build Coastguard Worker /// Insert all of the values referenced by named metadata in the specified
525*9880d681SAndroid Build Coastguard Worker /// module.
EnumerateNamedMetadata(const Module & M)526*9880d681SAndroid Build Coastguard Worker void ValueEnumerator::EnumerateNamedMetadata(const Module &M) {
527*9880d681SAndroid Build Coastguard Worker   for (const auto &I : M.named_metadata())
528*9880d681SAndroid Build Coastguard Worker     EnumerateNamedMDNode(&I);
529*9880d681SAndroid Build Coastguard Worker }
530*9880d681SAndroid Build Coastguard Worker 
EnumerateNamedMDNode(const NamedMDNode * MD)531*9880d681SAndroid Build Coastguard Worker void ValueEnumerator::EnumerateNamedMDNode(const NamedMDNode *MD) {
532*9880d681SAndroid Build Coastguard Worker   for (unsigned i = 0, e = MD->getNumOperands(); i != e; ++i)
533*9880d681SAndroid Build Coastguard Worker     EnumerateMetadata(nullptr, MD->getOperand(i));
534*9880d681SAndroid Build Coastguard Worker }
535*9880d681SAndroid Build Coastguard Worker 
getMetadataFunctionID(const Function * F) const536*9880d681SAndroid Build Coastguard Worker unsigned ValueEnumerator::getMetadataFunctionID(const Function *F) const {
537*9880d681SAndroid Build Coastguard Worker   return F ? getValueID(F) + 1 : 0;
538*9880d681SAndroid Build Coastguard Worker }
539*9880d681SAndroid Build Coastguard Worker 
EnumerateMetadata(const Function * F,const Metadata * MD)540*9880d681SAndroid Build Coastguard Worker void ValueEnumerator::EnumerateMetadata(const Function *F, const Metadata *MD) {
541*9880d681SAndroid Build Coastguard Worker   EnumerateMetadata(getMetadataFunctionID(F), MD);
542*9880d681SAndroid Build Coastguard Worker }
543*9880d681SAndroid Build Coastguard Worker 
EnumerateFunctionLocalMetadata(const Function & F,const LocalAsMetadata * Local)544*9880d681SAndroid Build Coastguard Worker void ValueEnumerator::EnumerateFunctionLocalMetadata(
545*9880d681SAndroid Build Coastguard Worker     const Function &F, const LocalAsMetadata *Local) {
546*9880d681SAndroid Build Coastguard Worker   EnumerateFunctionLocalMetadata(getMetadataFunctionID(&F), Local);
547*9880d681SAndroid Build Coastguard Worker }
548*9880d681SAndroid Build Coastguard Worker 
dropFunctionFromMetadata(MetadataMapType::value_type & FirstMD)549*9880d681SAndroid Build Coastguard Worker void ValueEnumerator::dropFunctionFromMetadata(
550*9880d681SAndroid Build Coastguard Worker     MetadataMapType::value_type &FirstMD) {
551*9880d681SAndroid Build Coastguard Worker   SmallVector<const MDNode *, 64> Worklist;
552*9880d681SAndroid Build Coastguard Worker   auto push = [this, &Worklist](MetadataMapType::value_type &MD) {
553*9880d681SAndroid Build Coastguard Worker     auto &Entry = MD.second;
554*9880d681SAndroid Build Coastguard Worker 
555*9880d681SAndroid Build Coastguard Worker     // Nothing to do if this metadata isn't tagged.
556*9880d681SAndroid Build Coastguard Worker     if (!Entry.F)
557*9880d681SAndroid Build Coastguard Worker       return;
558*9880d681SAndroid Build Coastguard Worker 
559*9880d681SAndroid Build Coastguard Worker     // Drop the function tag.
560*9880d681SAndroid Build Coastguard Worker     Entry.F = 0;
561*9880d681SAndroid Build Coastguard Worker 
562*9880d681SAndroid Build Coastguard Worker     // If this is has an ID and is an MDNode, then its operands have entries as
563*9880d681SAndroid Build Coastguard Worker     // well.  We need to drop the function from them too.
564*9880d681SAndroid Build Coastguard Worker     if (Entry.ID)
565*9880d681SAndroid Build Coastguard Worker       if (auto *N = dyn_cast<MDNode>(MD.first))
566*9880d681SAndroid Build Coastguard Worker         Worklist.push_back(N);
567*9880d681SAndroid Build Coastguard Worker   };
568*9880d681SAndroid Build Coastguard Worker   push(FirstMD);
569*9880d681SAndroid Build Coastguard Worker   while (!Worklist.empty())
570*9880d681SAndroid Build Coastguard Worker     for (const Metadata *Op : Worklist.pop_back_val()->operands()) {
571*9880d681SAndroid Build Coastguard Worker       if (!Op)
572*9880d681SAndroid Build Coastguard Worker         continue;
573*9880d681SAndroid Build Coastguard Worker       auto MD = MetadataMap.find(Op);
574*9880d681SAndroid Build Coastguard Worker       if (MD != MetadataMap.end())
575*9880d681SAndroid Build Coastguard Worker         push(*MD);
576*9880d681SAndroid Build Coastguard Worker     }
577*9880d681SAndroid Build Coastguard Worker }
578*9880d681SAndroid Build Coastguard Worker 
EnumerateMetadata(unsigned F,const Metadata * MD)579*9880d681SAndroid Build Coastguard Worker void ValueEnumerator::EnumerateMetadata(unsigned F, const Metadata *MD) {
580*9880d681SAndroid Build Coastguard Worker   // It's vital for reader efficiency that uniqued subgraphs are done in
581*9880d681SAndroid Build Coastguard Worker   // post-order; it's expensive when their operands have forward references.
582*9880d681SAndroid Build Coastguard Worker   // If a distinct node is referenced from a uniqued node, it'll be delayed
583*9880d681SAndroid Build Coastguard Worker   // until the uniqued subgraph has been completely traversed.
584*9880d681SAndroid Build Coastguard Worker   SmallVector<const MDNode *, 32> DelayedDistinctNodes;
585*9880d681SAndroid Build Coastguard Worker 
586*9880d681SAndroid Build Coastguard Worker   // Start by enumerating MD, and then work through its transitive operands in
587*9880d681SAndroid Build Coastguard Worker   // post-order.  This requires a depth-first search.
588*9880d681SAndroid Build Coastguard Worker   SmallVector<std::pair<const MDNode *, MDNode::op_iterator>, 32> Worklist;
589*9880d681SAndroid Build Coastguard Worker   if (const MDNode *N = enumerateMetadataImpl(F, MD))
590*9880d681SAndroid Build Coastguard Worker     Worklist.push_back(std::make_pair(N, N->op_begin()));
591*9880d681SAndroid Build Coastguard Worker 
592*9880d681SAndroid Build Coastguard Worker   while (!Worklist.empty()) {
593*9880d681SAndroid Build Coastguard Worker     const MDNode *N = Worklist.back().first;
594*9880d681SAndroid Build Coastguard Worker 
595*9880d681SAndroid Build Coastguard Worker     // Enumerate operands until we hit a new node.  We need to traverse these
596*9880d681SAndroid Build Coastguard Worker     // nodes' operands before visiting the rest of N's operands.
597*9880d681SAndroid Build Coastguard Worker     MDNode::op_iterator I = std::find_if(
598*9880d681SAndroid Build Coastguard Worker         Worklist.back().second, N->op_end(),
599*9880d681SAndroid Build Coastguard Worker         [&](const Metadata *MD) { return enumerateMetadataImpl(F, MD); });
600*9880d681SAndroid Build Coastguard Worker     if (I != N->op_end()) {
601*9880d681SAndroid Build Coastguard Worker       auto *Op = cast<MDNode>(*I);
602*9880d681SAndroid Build Coastguard Worker       Worklist.back().second = ++I;
603*9880d681SAndroid Build Coastguard Worker 
604*9880d681SAndroid Build Coastguard Worker       // Delay traversing Op if it's a distinct node and N is uniqued.
605*9880d681SAndroid Build Coastguard Worker       if (Op->isDistinct() && !N->isDistinct())
606*9880d681SAndroid Build Coastguard Worker         DelayedDistinctNodes.push_back(Op);
607*9880d681SAndroid Build Coastguard Worker       else
608*9880d681SAndroid Build Coastguard Worker         Worklist.push_back(std::make_pair(Op, Op->op_begin()));
609*9880d681SAndroid Build Coastguard Worker       continue;
610*9880d681SAndroid Build Coastguard Worker     }
611*9880d681SAndroid Build Coastguard Worker 
612*9880d681SAndroid Build Coastguard Worker     // All the operands have been visited.  Now assign an ID.
613*9880d681SAndroid Build Coastguard Worker     Worklist.pop_back();
614*9880d681SAndroid Build Coastguard Worker     MDs.push_back(N);
615*9880d681SAndroid Build Coastguard Worker     MetadataMap[N].ID = MDs.size();
616*9880d681SAndroid Build Coastguard Worker 
617*9880d681SAndroid Build Coastguard Worker     // Flush out any delayed distinct nodes; these are all the distinct nodes
618*9880d681SAndroid Build Coastguard Worker     // that are leaves in last uniqued subgraph.
619*9880d681SAndroid Build Coastguard Worker     if (Worklist.empty() || Worklist.back().first->isDistinct()) {
620*9880d681SAndroid Build Coastguard Worker       for (const MDNode *N : DelayedDistinctNodes)
621*9880d681SAndroid Build Coastguard Worker         Worklist.push_back(std::make_pair(N, N->op_begin()));
622*9880d681SAndroid Build Coastguard Worker       DelayedDistinctNodes.clear();
623*9880d681SAndroid Build Coastguard Worker     }
624*9880d681SAndroid Build Coastguard Worker   }
625*9880d681SAndroid Build Coastguard Worker }
626*9880d681SAndroid Build Coastguard Worker 
enumerateMetadataImpl(unsigned F,const Metadata * MD)627*9880d681SAndroid Build Coastguard Worker const MDNode *ValueEnumerator::enumerateMetadataImpl(unsigned F, const Metadata *MD) {
628*9880d681SAndroid Build Coastguard Worker   if (!MD)
629*9880d681SAndroid Build Coastguard Worker     return nullptr;
630*9880d681SAndroid Build Coastguard Worker 
631*9880d681SAndroid Build Coastguard Worker   assert(
632*9880d681SAndroid Build Coastguard Worker       (isa<MDNode>(MD) || isa<MDString>(MD) || isa<ConstantAsMetadata>(MD)) &&
633*9880d681SAndroid Build Coastguard Worker       "Invalid metadata kind");
634*9880d681SAndroid Build Coastguard Worker 
635*9880d681SAndroid Build Coastguard Worker   auto Insertion = MetadataMap.insert(std::make_pair(MD, MDIndex(F)));
636*9880d681SAndroid Build Coastguard Worker   MDIndex &Entry = Insertion.first->second;
637*9880d681SAndroid Build Coastguard Worker   if (!Insertion.second) {
638*9880d681SAndroid Build Coastguard Worker     // Already mapped.  If F doesn't match the function tag, drop it.
639*9880d681SAndroid Build Coastguard Worker     if (Entry.hasDifferentFunction(F))
640*9880d681SAndroid Build Coastguard Worker       dropFunctionFromMetadata(*Insertion.first);
641*9880d681SAndroid Build Coastguard Worker     return nullptr;
642*9880d681SAndroid Build Coastguard Worker   }
643*9880d681SAndroid Build Coastguard Worker 
644*9880d681SAndroid Build Coastguard Worker   // Don't assign IDs to metadata nodes.
645*9880d681SAndroid Build Coastguard Worker   if (auto *N = dyn_cast<MDNode>(MD))
646*9880d681SAndroid Build Coastguard Worker     return N;
647*9880d681SAndroid Build Coastguard Worker 
648*9880d681SAndroid Build Coastguard Worker   // Save the metadata.
649*9880d681SAndroid Build Coastguard Worker   MDs.push_back(MD);
650*9880d681SAndroid Build Coastguard Worker   Entry.ID = MDs.size();
651*9880d681SAndroid Build Coastguard Worker 
652*9880d681SAndroid Build Coastguard Worker   // Enumerate the constant, if any.
653*9880d681SAndroid Build Coastguard Worker   if (auto *C = dyn_cast<ConstantAsMetadata>(MD))
654*9880d681SAndroid Build Coastguard Worker     EnumerateValue(C->getValue());
655*9880d681SAndroid Build Coastguard Worker 
656*9880d681SAndroid Build Coastguard Worker   return nullptr;
657*9880d681SAndroid Build Coastguard Worker }
658*9880d681SAndroid Build Coastguard Worker 
659*9880d681SAndroid Build Coastguard Worker /// EnumerateFunctionLocalMetadataa - Incorporate function-local metadata
660*9880d681SAndroid Build Coastguard Worker /// information reachable from the metadata.
EnumerateFunctionLocalMetadata(unsigned F,const LocalAsMetadata * Local)661*9880d681SAndroid Build Coastguard Worker void ValueEnumerator::EnumerateFunctionLocalMetadata(
662*9880d681SAndroid Build Coastguard Worker     unsigned F, const LocalAsMetadata *Local) {
663*9880d681SAndroid Build Coastguard Worker   assert(F && "Expected a function");
664*9880d681SAndroid Build Coastguard Worker 
665*9880d681SAndroid Build Coastguard Worker   // Check to see if it's already in!
666*9880d681SAndroid Build Coastguard Worker   MDIndex &Index = MetadataMap[Local];
667*9880d681SAndroid Build Coastguard Worker   if (Index.ID) {
668*9880d681SAndroid Build Coastguard Worker     assert(Index.F == F && "Expected the same function");
669*9880d681SAndroid Build Coastguard Worker     return;
670*9880d681SAndroid Build Coastguard Worker   }
671*9880d681SAndroid Build Coastguard Worker 
672*9880d681SAndroid Build Coastguard Worker   MDs.push_back(Local);
673*9880d681SAndroid Build Coastguard Worker   Index.F = F;
674*9880d681SAndroid Build Coastguard Worker   Index.ID = MDs.size();
675*9880d681SAndroid Build Coastguard Worker 
676*9880d681SAndroid Build Coastguard Worker   EnumerateValue(Local->getValue());
677*9880d681SAndroid Build Coastguard Worker }
678*9880d681SAndroid Build Coastguard Worker 
getMetadataTypeOrder(const Metadata * MD)679*9880d681SAndroid Build Coastguard Worker static unsigned getMetadataTypeOrder(const Metadata *MD) {
680*9880d681SAndroid Build Coastguard Worker   // Strings are emitted in bulk and must come first.
681*9880d681SAndroid Build Coastguard Worker   if (isa<MDString>(MD))
682*9880d681SAndroid Build Coastguard Worker     return 0;
683*9880d681SAndroid Build Coastguard Worker 
684*9880d681SAndroid Build Coastguard Worker   // ConstantAsMetadata doesn't reference anything.  We may as well shuffle it
685*9880d681SAndroid Build Coastguard Worker   // to the front since we can detect it.
686*9880d681SAndroid Build Coastguard Worker   auto *N = dyn_cast<MDNode>(MD);
687*9880d681SAndroid Build Coastguard Worker   if (!N)
688*9880d681SAndroid Build Coastguard Worker     return 1;
689*9880d681SAndroid Build Coastguard Worker 
690*9880d681SAndroid Build Coastguard Worker   // The reader is fast forward references for distinct node operands, but slow
691*9880d681SAndroid Build Coastguard Worker   // when uniqued operands are unresolved.
692*9880d681SAndroid Build Coastguard Worker   return N->isDistinct() ? 2 : 3;
693*9880d681SAndroid Build Coastguard Worker }
694*9880d681SAndroid Build Coastguard Worker 
organizeMetadata()695*9880d681SAndroid Build Coastguard Worker void ValueEnumerator::organizeMetadata() {
696*9880d681SAndroid Build Coastguard Worker   assert(MetadataMap.size() == MDs.size() &&
697*9880d681SAndroid Build Coastguard Worker          "Metadata map and vector out of sync");
698*9880d681SAndroid Build Coastguard Worker 
699*9880d681SAndroid Build Coastguard Worker   if (MDs.empty())
700*9880d681SAndroid Build Coastguard Worker     return;
701*9880d681SAndroid Build Coastguard Worker 
702*9880d681SAndroid Build Coastguard Worker   // Copy out the index information from MetadataMap in order to choose a new
703*9880d681SAndroid Build Coastguard Worker   // order.
704*9880d681SAndroid Build Coastguard Worker   SmallVector<MDIndex, 64> Order;
705*9880d681SAndroid Build Coastguard Worker   Order.reserve(MetadataMap.size());
706*9880d681SAndroid Build Coastguard Worker   for (const Metadata *MD : MDs)
707*9880d681SAndroid Build Coastguard Worker     Order.push_back(MetadataMap.lookup(MD));
708*9880d681SAndroid Build Coastguard Worker 
709*9880d681SAndroid Build Coastguard Worker   // Partition:
710*9880d681SAndroid Build Coastguard Worker   //   - by function, then
711*9880d681SAndroid Build Coastguard Worker   //   - by isa<MDString>
712*9880d681SAndroid Build Coastguard Worker   // and then sort by the original/current ID.  Since the IDs are guaranteed to
713*9880d681SAndroid Build Coastguard Worker   // be unique, the result of std::sort will be deterministic.  There's no need
714*9880d681SAndroid Build Coastguard Worker   // for std::stable_sort.
715*9880d681SAndroid Build Coastguard Worker   std::sort(Order.begin(), Order.end(), [this](MDIndex LHS, MDIndex RHS) {
716*9880d681SAndroid Build Coastguard Worker     return std::make_tuple(LHS.F, getMetadataTypeOrder(LHS.get(MDs)), LHS.ID) <
717*9880d681SAndroid Build Coastguard Worker            std::make_tuple(RHS.F, getMetadataTypeOrder(RHS.get(MDs)), RHS.ID);
718*9880d681SAndroid Build Coastguard Worker   });
719*9880d681SAndroid Build Coastguard Worker 
720*9880d681SAndroid Build Coastguard Worker   // Rebuild MDs, index the metadata ranges for each function in FunctionMDs,
721*9880d681SAndroid Build Coastguard Worker   // and fix up MetadataMap.
722*9880d681SAndroid Build Coastguard Worker   std::vector<const Metadata *> OldMDs = std::move(MDs);
723*9880d681SAndroid Build Coastguard Worker   MDs.reserve(OldMDs.size());
724*9880d681SAndroid Build Coastguard Worker   for (unsigned I = 0, E = Order.size(); I != E && !Order[I].F; ++I) {
725*9880d681SAndroid Build Coastguard Worker     auto *MD = Order[I].get(OldMDs);
726*9880d681SAndroid Build Coastguard Worker     MDs.push_back(MD);
727*9880d681SAndroid Build Coastguard Worker     MetadataMap[MD].ID = I + 1;
728*9880d681SAndroid Build Coastguard Worker     if (isa<MDString>(MD))
729*9880d681SAndroid Build Coastguard Worker       ++NumMDStrings;
730*9880d681SAndroid Build Coastguard Worker   }
731*9880d681SAndroid Build Coastguard Worker 
732*9880d681SAndroid Build Coastguard Worker   // Return early if there's nothing for the functions.
733*9880d681SAndroid Build Coastguard Worker   if (MDs.size() == Order.size())
734*9880d681SAndroid Build Coastguard Worker     return;
735*9880d681SAndroid Build Coastguard Worker 
736*9880d681SAndroid Build Coastguard Worker   // Build the function metadata ranges.
737*9880d681SAndroid Build Coastguard Worker   MDRange R;
738*9880d681SAndroid Build Coastguard Worker   FunctionMDs.reserve(OldMDs.size());
739*9880d681SAndroid Build Coastguard Worker   unsigned PrevF = 0;
740*9880d681SAndroid Build Coastguard Worker   for (unsigned I = MDs.size(), E = Order.size(), ID = MDs.size(); I != E;
741*9880d681SAndroid Build Coastguard Worker        ++I) {
742*9880d681SAndroid Build Coastguard Worker     unsigned F = Order[I].F;
743*9880d681SAndroid Build Coastguard Worker     if (!PrevF) {
744*9880d681SAndroid Build Coastguard Worker       PrevF = F;
745*9880d681SAndroid Build Coastguard Worker     } else if (PrevF != F) {
746*9880d681SAndroid Build Coastguard Worker       R.Last = FunctionMDs.size();
747*9880d681SAndroid Build Coastguard Worker       std::swap(R, FunctionMDInfo[PrevF]);
748*9880d681SAndroid Build Coastguard Worker       R.First = FunctionMDs.size();
749*9880d681SAndroid Build Coastguard Worker 
750*9880d681SAndroid Build Coastguard Worker       ID = MDs.size();
751*9880d681SAndroid Build Coastguard Worker       PrevF = F;
752*9880d681SAndroid Build Coastguard Worker     }
753*9880d681SAndroid Build Coastguard Worker 
754*9880d681SAndroid Build Coastguard Worker     auto *MD = Order[I].get(OldMDs);
755*9880d681SAndroid Build Coastguard Worker     FunctionMDs.push_back(MD);
756*9880d681SAndroid Build Coastguard Worker     MetadataMap[MD].ID = ++ID;
757*9880d681SAndroid Build Coastguard Worker     if (isa<MDString>(MD))
758*9880d681SAndroid Build Coastguard Worker       ++R.NumStrings;
759*9880d681SAndroid Build Coastguard Worker   }
760*9880d681SAndroid Build Coastguard Worker   R.Last = FunctionMDs.size();
761*9880d681SAndroid Build Coastguard Worker   FunctionMDInfo[PrevF] = R;
762*9880d681SAndroid Build Coastguard Worker }
763*9880d681SAndroid Build Coastguard Worker 
incorporateFunctionMetadata(const Function & F)764*9880d681SAndroid Build Coastguard Worker void ValueEnumerator::incorporateFunctionMetadata(const Function &F) {
765*9880d681SAndroid Build Coastguard Worker   NumModuleMDs = MDs.size();
766*9880d681SAndroid Build Coastguard Worker 
767*9880d681SAndroid Build Coastguard Worker   auto R = FunctionMDInfo.lookup(getValueID(&F) + 1);
768*9880d681SAndroid Build Coastguard Worker   NumMDStrings = R.NumStrings;
769*9880d681SAndroid Build Coastguard Worker   MDs.insert(MDs.end(), FunctionMDs.begin() + R.First,
770*9880d681SAndroid Build Coastguard Worker              FunctionMDs.begin() + R.Last);
771*9880d681SAndroid Build Coastguard Worker }
772*9880d681SAndroid Build Coastguard Worker 
EnumerateValue(const Value * V)773*9880d681SAndroid Build Coastguard Worker void ValueEnumerator::EnumerateValue(const Value *V) {
774*9880d681SAndroid Build Coastguard Worker   assert(!V->getType()->isVoidTy() && "Can't insert void values!");
775*9880d681SAndroid Build Coastguard Worker   assert(!isa<MetadataAsValue>(V) && "EnumerateValue doesn't handle Metadata!");
776*9880d681SAndroid Build Coastguard Worker 
777*9880d681SAndroid Build Coastguard Worker   // Check to see if it's already in!
778*9880d681SAndroid Build Coastguard Worker   unsigned &ValueID = ValueMap[V];
779*9880d681SAndroid Build Coastguard Worker   if (ValueID) {
780*9880d681SAndroid Build Coastguard Worker     // Increment use count.
781*9880d681SAndroid Build Coastguard Worker     Values[ValueID-1].second++;
782*9880d681SAndroid Build Coastguard Worker     return;
783*9880d681SAndroid Build Coastguard Worker   }
784*9880d681SAndroid Build Coastguard Worker 
785*9880d681SAndroid Build Coastguard Worker   if (auto *GO = dyn_cast<GlobalObject>(V))
786*9880d681SAndroid Build Coastguard Worker     if (const Comdat *C = GO->getComdat())
787*9880d681SAndroid Build Coastguard Worker       Comdats.insert(C);
788*9880d681SAndroid Build Coastguard Worker 
789*9880d681SAndroid Build Coastguard Worker   // Enumerate the type of this value.
790*9880d681SAndroid Build Coastguard Worker   EnumerateType(V->getType());
791*9880d681SAndroid Build Coastguard Worker 
792*9880d681SAndroid Build Coastguard Worker   if (const Constant *C = dyn_cast<Constant>(V)) {
793*9880d681SAndroid Build Coastguard Worker     if (isa<GlobalValue>(C)) {
794*9880d681SAndroid Build Coastguard Worker       // Initializers for globals are handled explicitly elsewhere.
795*9880d681SAndroid Build Coastguard Worker     } else if (C->getNumOperands()) {
796*9880d681SAndroid Build Coastguard Worker       // If a constant has operands, enumerate them.  This makes sure that if a
797*9880d681SAndroid Build Coastguard Worker       // constant has uses (for example an array of const ints), that they are
798*9880d681SAndroid Build Coastguard Worker       // inserted also.
799*9880d681SAndroid Build Coastguard Worker 
800*9880d681SAndroid Build Coastguard Worker       // We prefer to enumerate them with values before we enumerate the user
801*9880d681SAndroid Build Coastguard Worker       // itself.  This makes it more likely that we can avoid forward references
802*9880d681SAndroid Build Coastguard Worker       // in the reader.  We know that there can be no cycles in the constants
803*9880d681SAndroid Build Coastguard Worker       // graph that don't go through a global variable.
804*9880d681SAndroid Build Coastguard Worker       for (User::const_op_iterator I = C->op_begin(), E = C->op_end();
805*9880d681SAndroid Build Coastguard Worker            I != E; ++I)
806*9880d681SAndroid Build Coastguard Worker         if (!isa<BasicBlock>(*I)) // Don't enumerate BB operand to BlockAddress.
807*9880d681SAndroid Build Coastguard Worker           EnumerateValue(*I);
808*9880d681SAndroid Build Coastguard Worker 
809*9880d681SAndroid Build Coastguard Worker       // Finally, add the value.  Doing this could make the ValueID reference be
810*9880d681SAndroid Build Coastguard Worker       // dangling, don't reuse it.
811*9880d681SAndroid Build Coastguard Worker       Values.push_back(std::make_pair(V, 1U));
812*9880d681SAndroid Build Coastguard Worker       ValueMap[V] = Values.size();
813*9880d681SAndroid Build Coastguard Worker       return;
814*9880d681SAndroid Build Coastguard Worker     }
815*9880d681SAndroid Build Coastguard Worker   }
816*9880d681SAndroid Build Coastguard Worker 
817*9880d681SAndroid Build Coastguard Worker   // Add the value.
818*9880d681SAndroid Build Coastguard Worker   Values.push_back(std::make_pair(V, 1U));
819*9880d681SAndroid Build Coastguard Worker   ValueID = Values.size();
820*9880d681SAndroid Build Coastguard Worker }
821*9880d681SAndroid Build Coastguard Worker 
822*9880d681SAndroid Build Coastguard Worker 
EnumerateType(Type * Ty)823*9880d681SAndroid Build Coastguard Worker void ValueEnumerator::EnumerateType(Type *Ty) {
824*9880d681SAndroid Build Coastguard Worker   unsigned *TypeID = &TypeMap[Ty];
825*9880d681SAndroid Build Coastguard Worker 
826*9880d681SAndroid Build Coastguard Worker   // We've already seen this type.
827*9880d681SAndroid Build Coastguard Worker   if (*TypeID)
828*9880d681SAndroid Build Coastguard Worker     return;
829*9880d681SAndroid Build Coastguard Worker 
830*9880d681SAndroid Build Coastguard Worker   // If it is a non-anonymous struct, mark the type as being visited so that we
831*9880d681SAndroid Build Coastguard Worker   // don't recursively visit it.  This is safe because we allow forward
832*9880d681SAndroid Build Coastguard Worker   // references of these in the bitcode reader.
833*9880d681SAndroid Build Coastguard Worker   if (StructType *STy = dyn_cast<StructType>(Ty))
834*9880d681SAndroid Build Coastguard Worker     if (!STy->isLiteral())
835*9880d681SAndroid Build Coastguard Worker       *TypeID = ~0U;
836*9880d681SAndroid Build Coastguard Worker 
837*9880d681SAndroid Build Coastguard Worker   // Enumerate all of the subtypes before we enumerate this type.  This ensures
838*9880d681SAndroid Build Coastguard Worker   // that the type will be enumerated in an order that can be directly built.
839*9880d681SAndroid Build Coastguard Worker   for (Type *SubTy : Ty->subtypes())
840*9880d681SAndroid Build Coastguard Worker     EnumerateType(SubTy);
841*9880d681SAndroid Build Coastguard Worker 
842*9880d681SAndroid Build Coastguard Worker   // Refresh the TypeID pointer in case the table rehashed.
843*9880d681SAndroid Build Coastguard Worker   TypeID = &TypeMap[Ty];
844*9880d681SAndroid Build Coastguard Worker 
845*9880d681SAndroid Build Coastguard Worker   // Check to see if we got the pointer another way.  This can happen when
846*9880d681SAndroid Build Coastguard Worker   // enumerating recursive types that hit the base case deeper than they start.
847*9880d681SAndroid Build Coastguard Worker   //
848*9880d681SAndroid Build Coastguard Worker   // If this is actually a struct that we are treating as forward ref'able,
849*9880d681SAndroid Build Coastguard Worker   // then emit the definition now that all of its contents are available.
850*9880d681SAndroid Build Coastguard Worker   if (*TypeID && *TypeID != ~0U)
851*9880d681SAndroid Build Coastguard Worker     return;
852*9880d681SAndroid Build Coastguard Worker 
853*9880d681SAndroid Build Coastguard Worker   // Add this type now that its contents are all happily enumerated.
854*9880d681SAndroid Build Coastguard Worker   Types.push_back(Ty);
855*9880d681SAndroid Build Coastguard Worker 
856*9880d681SAndroid Build Coastguard Worker   *TypeID = Types.size();
857*9880d681SAndroid Build Coastguard Worker }
858*9880d681SAndroid Build Coastguard Worker 
859*9880d681SAndroid Build Coastguard Worker // Enumerate the types for the specified value.  If the value is a constant,
860*9880d681SAndroid Build Coastguard Worker // walk through it, enumerating the types of the constant.
EnumerateOperandType(const Value * V)861*9880d681SAndroid Build Coastguard Worker void ValueEnumerator::EnumerateOperandType(const Value *V) {
862*9880d681SAndroid Build Coastguard Worker   EnumerateType(V->getType());
863*9880d681SAndroid Build Coastguard Worker 
864*9880d681SAndroid Build Coastguard Worker   assert(!isa<MetadataAsValue>(V) && "Unexpected metadata operand");
865*9880d681SAndroid Build Coastguard Worker 
866*9880d681SAndroid Build Coastguard Worker   const Constant *C = dyn_cast<Constant>(V);
867*9880d681SAndroid Build Coastguard Worker   if (!C)
868*9880d681SAndroid Build Coastguard Worker     return;
869*9880d681SAndroid Build Coastguard Worker 
870*9880d681SAndroid Build Coastguard Worker   // If this constant is already enumerated, ignore it, we know its type must
871*9880d681SAndroid Build Coastguard Worker   // be enumerated.
872*9880d681SAndroid Build Coastguard Worker   if (ValueMap.count(C))
873*9880d681SAndroid Build Coastguard Worker     return;
874*9880d681SAndroid Build Coastguard Worker 
875*9880d681SAndroid Build Coastguard Worker   // This constant may have operands, make sure to enumerate the types in
876*9880d681SAndroid Build Coastguard Worker   // them.
877*9880d681SAndroid Build Coastguard Worker   for (const Value *Op : C->operands()) {
878*9880d681SAndroid Build Coastguard Worker     // Don't enumerate basic blocks here, this happens as operands to
879*9880d681SAndroid Build Coastguard Worker     // blockaddress.
880*9880d681SAndroid Build Coastguard Worker     if (isa<BasicBlock>(Op))
881*9880d681SAndroid Build Coastguard Worker       continue;
882*9880d681SAndroid Build Coastguard Worker 
883*9880d681SAndroid Build Coastguard Worker     EnumerateOperandType(Op);
884*9880d681SAndroid Build Coastguard Worker   }
885*9880d681SAndroid Build Coastguard Worker }
886*9880d681SAndroid Build Coastguard Worker 
EnumerateAttributes(AttributeSet PAL)887*9880d681SAndroid Build Coastguard Worker void ValueEnumerator::EnumerateAttributes(AttributeSet PAL) {
888*9880d681SAndroid Build Coastguard Worker   if (PAL.isEmpty()) return;  // null is always 0.
889*9880d681SAndroid Build Coastguard Worker 
890*9880d681SAndroid Build Coastguard Worker   // Do a lookup.
891*9880d681SAndroid Build Coastguard Worker   unsigned &Entry = AttributeMap[PAL];
892*9880d681SAndroid Build Coastguard Worker   if (Entry == 0) {
893*9880d681SAndroid Build Coastguard Worker     // Never saw this before, add it.
894*9880d681SAndroid Build Coastguard Worker     Attribute.push_back(PAL);
895*9880d681SAndroid Build Coastguard Worker     Entry = Attribute.size();
896*9880d681SAndroid Build Coastguard Worker   }
897*9880d681SAndroid Build Coastguard Worker 
898*9880d681SAndroid Build Coastguard Worker   // Do lookups for all attribute groups.
899*9880d681SAndroid Build Coastguard Worker   for (unsigned i = 0, e = PAL.getNumSlots(); i != e; ++i) {
900*9880d681SAndroid Build Coastguard Worker     AttributeSet AS = PAL.getSlotAttributes(i);
901*9880d681SAndroid Build Coastguard Worker     unsigned &Entry = AttributeGroupMap[AS];
902*9880d681SAndroid Build Coastguard Worker     if (Entry == 0) {
903*9880d681SAndroid Build Coastguard Worker       AttributeGroups.push_back(AS);
904*9880d681SAndroid Build Coastguard Worker       Entry = AttributeGroups.size();
905*9880d681SAndroid Build Coastguard Worker     }
906*9880d681SAndroid Build Coastguard Worker   }
907*9880d681SAndroid Build Coastguard Worker }
908*9880d681SAndroid Build Coastguard Worker 
incorporateFunction(const Function & F)909*9880d681SAndroid Build Coastguard Worker void ValueEnumerator::incorporateFunction(const Function &F) {
910*9880d681SAndroid Build Coastguard Worker   InstructionCount = 0;
911*9880d681SAndroid Build Coastguard Worker   NumModuleValues = Values.size();
912*9880d681SAndroid Build Coastguard Worker 
913*9880d681SAndroid Build Coastguard Worker   // Add global metadata to the function block.  This doesn't include
914*9880d681SAndroid Build Coastguard Worker   // LocalAsMetadata.
915*9880d681SAndroid Build Coastguard Worker   incorporateFunctionMetadata(F);
916*9880d681SAndroid Build Coastguard Worker 
917*9880d681SAndroid Build Coastguard Worker   // Adding function arguments to the value table.
918*9880d681SAndroid Build Coastguard Worker   for (const auto &I : F.args())
919*9880d681SAndroid Build Coastguard Worker     EnumerateValue(&I);
920*9880d681SAndroid Build Coastguard Worker 
921*9880d681SAndroid Build Coastguard Worker   FirstFuncConstantID = Values.size();
922*9880d681SAndroid Build Coastguard Worker 
923*9880d681SAndroid Build Coastguard Worker   // Add all function-level constants to the value table.
924*9880d681SAndroid Build Coastguard Worker   for (const BasicBlock &BB : F) {
925*9880d681SAndroid Build Coastguard Worker     for (const Instruction &I : BB)
926*9880d681SAndroid Build Coastguard Worker       for (const Use &OI : I.operands()) {
927*9880d681SAndroid Build Coastguard Worker         if ((isa<Constant>(OI) && !isa<GlobalValue>(OI)) || isa<InlineAsm>(OI))
928*9880d681SAndroid Build Coastguard Worker           EnumerateValue(OI);
929*9880d681SAndroid Build Coastguard Worker       }
930*9880d681SAndroid Build Coastguard Worker     BasicBlocks.push_back(&BB);
931*9880d681SAndroid Build Coastguard Worker     ValueMap[&BB] = BasicBlocks.size();
932*9880d681SAndroid Build Coastguard Worker   }
933*9880d681SAndroid Build Coastguard Worker 
934*9880d681SAndroid Build Coastguard Worker   // Optimize the constant layout.
935*9880d681SAndroid Build Coastguard Worker   OptimizeConstants(FirstFuncConstantID, Values.size());
936*9880d681SAndroid Build Coastguard Worker 
937*9880d681SAndroid Build Coastguard Worker   // Add the function's parameter attributes so they are available for use in
938*9880d681SAndroid Build Coastguard Worker   // the function's instruction.
939*9880d681SAndroid Build Coastguard Worker   EnumerateAttributes(F.getAttributes());
940*9880d681SAndroid Build Coastguard Worker 
941*9880d681SAndroid Build Coastguard Worker   FirstInstID = Values.size();
942*9880d681SAndroid Build Coastguard Worker 
943*9880d681SAndroid Build Coastguard Worker   SmallVector<LocalAsMetadata *, 8> FnLocalMDVector;
944*9880d681SAndroid Build Coastguard Worker   // Add all of the instructions.
945*9880d681SAndroid Build Coastguard Worker   for (const BasicBlock &BB : F) {
946*9880d681SAndroid Build Coastguard Worker     for (const Instruction &I : BB) {
947*9880d681SAndroid Build Coastguard Worker       for (const Use &OI : I.operands()) {
948*9880d681SAndroid Build Coastguard Worker         if (auto *MD = dyn_cast<MetadataAsValue>(&OI))
949*9880d681SAndroid Build Coastguard Worker           if (auto *Local = dyn_cast<LocalAsMetadata>(MD->getMetadata()))
950*9880d681SAndroid Build Coastguard Worker             // Enumerate metadata after the instructions they might refer to.
951*9880d681SAndroid Build Coastguard Worker             FnLocalMDVector.push_back(Local);
952*9880d681SAndroid Build Coastguard Worker       }
953*9880d681SAndroid Build Coastguard Worker 
954*9880d681SAndroid Build Coastguard Worker       if (!I.getType()->isVoidTy())
955*9880d681SAndroid Build Coastguard Worker         EnumerateValue(&I);
956*9880d681SAndroid Build Coastguard Worker     }
957*9880d681SAndroid Build Coastguard Worker   }
958*9880d681SAndroid Build Coastguard Worker 
959*9880d681SAndroid Build Coastguard Worker   // Add all of the function-local metadata.
960*9880d681SAndroid Build Coastguard Worker   for (unsigned i = 0, e = FnLocalMDVector.size(); i != e; ++i) {
961*9880d681SAndroid Build Coastguard Worker     // At this point, every local values have been incorporated, we shouldn't
962*9880d681SAndroid Build Coastguard Worker     // have a metadata operand that references a value that hasn't been seen.
963*9880d681SAndroid Build Coastguard Worker     assert(ValueMap.count(FnLocalMDVector[i]->getValue()) &&
964*9880d681SAndroid Build Coastguard Worker            "Missing value for metadata operand");
965*9880d681SAndroid Build Coastguard Worker     EnumerateFunctionLocalMetadata(F, FnLocalMDVector[i]);
966*9880d681SAndroid Build Coastguard Worker   }
967*9880d681SAndroid Build Coastguard Worker }
968*9880d681SAndroid Build Coastguard Worker 
purgeFunction()969*9880d681SAndroid Build Coastguard Worker void ValueEnumerator::purgeFunction() {
970*9880d681SAndroid Build Coastguard Worker   /// Remove purged values from the ValueMap.
971*9880d681SAndroid Build Coastguard Worker   for (unsigned i = NumModuleValues, e = Values.size(); i != e; ++i)
972*9880d681SAndroid Build Coastguard Worker     ValueMap.erase(Values[i].first);
973*9880d681SAndroid Build Coastguard Worker   for (unsigned i = NumModuleMDs, e = MDs.size(); i != e; ++i)
974*9880d681SAndroid Build Coastguard Worker     MetadataMap.erase(MDs[i]);
975*9880d681SAndroid Build Coastguard Worker   for (unsigned i = 0, e = BasicBlocks.size(); i != e; ++i)
976*9880d681SAndroid Build Coastguard Worker     ValueMap.erase(BasicBlocks[i]);
977*9880d681SAndroid Build Coastguard Worker 
978*9880d681SAndroid Build Coastguard Worker   Values.resize(NumModuleValues);
979*9880d681SAndroid Build Coastguard Worker   MDs.resize(NumModuleMDs);
980*9880d681SAndroid Build Coastguard Worker   BasicBlocks.clear();
981*9880d681SAndroid Build Coastguard Worker   NumMDStrings = 0;
982*9880d681SAndroid Build Coastguard Worker }
983*9880d681SAndroid Build Coastguard Worker 
IncorporateFunctionInfoGlobalBBIDs(const Function * F,DenseMap<const BasicBlock *,unsigned> & IDMap)984*9880d681SAndroid Build Coastguard Worker static void IncorporateFunctionInfoGlobalBBIDs(const Function *F,
985*9880d681SAndroid Build Coastguard Worker                                  DenseMap<const BasicBlock*, unsigned> &IDMap) {
986*9880d681SAndroid Build Coastguard Worker   unsigned Counter = 0;
987*9880d681SAndroid Build Coastguard Worker   for (const BasicBlock &BB : *F)
988*9880d681SAndroid Build Coastguard Worker     IDMap[&BB] = ++Counter;
989*9880d681SAndroid Build Coastguard Worker }
990*9880d681SAndroid Build Coastguard Worker 
991*9880d681SAndroid Build Coastguard Worker /// getGlobalBasicBlockID - This returns the function-specific ID for the
992*9880d681SAndroid Build Coastguard Worker /// specified basic block.  This is relatively expensive information, so it
993*9880d681SAndroid Build Coastguard Worker /// should only be used by rare constructs such as address-of-label.
getGlobalBasicBlockID(const BasicBlock * BB) const994*9880d681SAndroid Build Coastguard Worker unsigned ValueEnumerator::getGlobalBasicBlockID(const BasicBlock *BB) const {
995*9880d681SAndroid Build Coastguard Worker   unsigned &Idx = GlobalBasicBlockIDs[BB];
996*9880d681SAndroid Build Coastguard Worker   if (Idx != 0)
997*9880d681SAndroid Build Coastguard Worker     return Idx-1;
998*9880d681SAndroid Build Coastguard Worker 
999*9880d681SAndroid Build Coastguard Worker   IncorporateFunctionInfoGlobalBBIDs(BB->getParent(), GlobalBasicBlockIDs);
1000*9880d681SAndroid Build Coastguard Worker   return getGlobalBasicBlockID(BB);
1001*9880d681SAndroid Build Coastguard Worker }
1002*9880d681SAndroid Build Coastguard Worker 
computeBitsRequiredForTypeIndicies() const1003*9880d681SAndroid Build Coastguard Worker uint64_t ValueEnumerator::computeBitsRequiredForTypeIndicies() const {
1004*9880d681SAndroid Build Coastguard Worker   return Log2_32_Ceil(getTypes().size() + 1);
1005*9880d681SAndroid Build Coastguard Worker }
1006