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