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