10b57cec5SDimitry Andric //===- ValueEnumerator.cpp - Number values and types for bitcode writer ---===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric // 90b57cec5SDimitry Andric // This file implements the ValueEnumerator class. 100b57cec5SDimitry Andric // 110b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric #include "ValueEnumerator.h" 140b57cec5SDimitry Andric #include "llvm/ADT/SmallVector.h" 150b57cec5SDimitry Andric #include "llvm/Config/llvm-config.h" 160b57cec5SDimitry Andric #include "llvm/IR/Argument.h" 170b57cec5SDimitry Andric #include "llvm/IR/BasicBlock.h" 180b57cec5SDimitry Andric #include "llvm/IR/Constant.h" 190b57cec5SDimitry Andric #include "llvm/IR/DebugInfoMetadata.h" 200b57cec5SDimitry Andric #include "llvm/IR/DerivedTypes.h" 210b57cec5SDimitry Andric #include "llvm/IR/Function.h" 220b57cec5SDimitry Andric #include "llvm/IR/GlobalAlias.h" 230b57cec5SDimitry Andric #include "llvm/IR/GlobalIFunc.h" 240b57cec5SDimitry Andric #include "llvm/IR/GlobalObject.h" 250b57cec5SDimitry Andric #include "llvm/IR/GlobalValue.h" 260b57cec5SDimitry Andric #include "llvm/IR/GlobalVariable.h" 270b57cec5SDimitry Andric #include "llvm/IR/Instruction.h" 280b57cec5SDimitry Andric #include "llvm/IR/Instructions.h" 290b57cec5SDimitry Andric #include "llvm/IR/Metadata.h" 300b57cec5SDimitry Andric #include "llvm/IR/Module.h" 31fe6060f1SDimitry Andric #include "llvm/IR/Operator.h" 320b57cec5SDimitry Andric #include "llvm/IR/Type.h" 330b57cec5SDimitry Andric #include "llvm/IR/Use.h" 340b57cec5SDimitry Andric #include "llvm/IR/User.h" 350b57cec5SDimitry Andric #include "llvm/IR/Value.h" 360b57cec5SDimitry Andric #include "llvm/IR/ValueSymbolTable.h" 370b57cec5SDimitry Andric #include "llvm/Support/Casting.h" 380b57cec5SDimitry Andric #include "llvm/Support/Compiler.h" 390b57cec5SDimitry Andric #include "llvm/Support/Debug.h" 400b57cec5SDimitry Andric #include "llvm/Support/MathExtras.h" 410b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h" 420b57cec5SDimitry Andric #include <algorithm> 430b57cec5SDimitry Andric #include <cstddef> 440b57cec5SDimitry Andric #include <iterator> 450b57cec5SDimitry Andric #include <tuple> 460b57cec5SDimitry Andric 470b57cec5SDimitry Andric using namespace llvm; 480b57cec5SDimitry Andric 490b57cec5SDimitry Andric namespace { 500b57cec5SDimitry Andric 510b57cec5SDimitry Andric struct OrderMap { 520b57cec5SDimitry Andric DenseMap<const Value *, std::pair<unsigned, bool>> IDs; 530b57cec5SDimitry Andric unsigned LastGlobalValueID = 0; 540b57cec5SDimitry Andric 550b57cec5SDimitry Andric OrderMap() = default; 560b57cec5SDimitry Andric 570b57cec5SDimitry Andric bool isGlobalValue(unsigned ID) const { 5881ad6265SDimitry Andric return ID <= LastGlobalValueID; 590b57cec5SDimitry Andric } 600b57cec5SDimitry Andric 610b57cec5SDimitry Andric unsigned size() const { return IDs.size(); } 620b57cec5SDimitry Andric std::pair<unsigned, bool> &operator[](const Value *V) { return IDs[V]; } 630b57cec5SDimitry Andric 640b57cec5SDimitry Andric std::pair<unsigned, bool> lookup(const Value *V) const { 650b57cec5SDimitry Andric return IDs.lookup(V); 660b57cec5SDimitry Andric } 670b57cec5SDimitry Andric 680b57cec5SDimitry Andric void index(const Value *V) { 690b57cec5SDimitry Andric // Explicitly sequence get-size and insert-value operations to avoid UB. 700b57cec5SDimitry Andric unsigned ID = IDs.size() + 1; 710b57cec5SDimitry Andric IDs[V].first = ID; 720b57cec5SDimitry Andric } 730b57cec5SDimitry Andric }; 740b57cec5SDimitry Andric 750b57cec5SDimitry Andric } // end anonymous namespace 760b57cec5SDimitry Andric 770b57cec5SDimitry Andric static void orderValue(const Value *V, OrderMap &OM) { 780b57cec5SDimitry Andric if (OM.lookup(V).first) 790b57cec5SDimitry Andric return; 800b57cec5SDimitry Andric 815ffd83dbSDimitry Andric if (const Constant *C = dyn_cast<Constant>(V)) { 8281ad6265SDimitry Andric if (C->getNumOperands()) { 830b57cec5SDimitry Andric for (const Value *Op : C->operands()) 840b57cec5SDimitry Andric if (!isa<BasicBlock>(Op) && !isa<GlobalValue>(Op)) 850b57cec5SDimitry Andric orderValue(Op, OM); 865ffd83dbSDimitry Andric if (auto *CE = dyn_cast<ConstantExpr>(C)) 875ffd83dbSDimitry Andric if (CE->getOpcode() == Instruction::ShuffleVector) 885ffd83dbSDimitry Andric orderValue(CE->getShuffleMaskForBitcode(), OM); 895ffd83dbSDimitry Andric } 905ffd83dbSDimitry Andric } 910b57cec5SDimitry Andric 920b57cec5SDimitry Andric // Note: we cannot cache this lookup above, since inserting into the map 930b57cec5SDimitry Andric // changes the map's size, and thus affects the other IDs. 940b57cec5SDimitry Andric OM.index(V); 950b57cec5SDimitry Andric } 960b57cec5SDimitry Andric 970b57cec5SDimitry Andric static OrderMap orderModule(const Module &M) { 980b57cec5SDimitry Andric // This needs to match the order used by ValueEnumerator::ValueEnumerator() 990b57cec5SDimitry Andric // and ValueEnumerator::incorporateFunction(). 1000b57cec5SDimitry Andric OrderMap OM; 1010b57cec5SDimitry Andric 10281ad6265SDimitry Andric // Initializers of GlobalValues are processed in 10381ad6265SDimitry Andric // BitcodeReader::ResolveGlobalAndAliasInits(). Match the order there rather 10481ad6265SDimitry Andric // than ValueEnumerator, and match the code in predictValueUseListOrderImpl() 10581ad6265SDimitry Andric // by giving IDs in reverse order. 10681ad6265SDimitry Andric // 10781ad6265SDimitry Andric // Since GlobalValues never reference each other directly (just through 10881ad6265SDimitry Andric // initializers), their relative IDs only matter for determining order of 10981ad6265SDimitry Andric // uses in their initializers. 11081ad6265SDimitry Andric for (const GlobalVariable &G : reverse(M.globals())) 11181ad6265SDimitry Andric orderValue(&G, OM); 11281ad6265SDimitry Andric for (const GlobalAlias &A : reverse(M.aliases())) 11381ad6265SDimitry Andric orderValue(&A, OM); 11481ad6265SDimitry Andric for (const GlobalIFunc &I : reverse(M.ifuncs())) 11581ad6265SDimitry Andric orderValue(&I, OM); 11681ad6265SDimitry Andric for (const Function &F : reverse(M)) 11781ad6265SDimitry Andric orderValue(&F, OM); 11881ad6265SDimitry Andric OM.LastGlobalValueID = OM.size(); 119e8d8bef9SDimitry Andric 120fe6060f1SDimitry Andric auto orderConstantValue = [&OM](const Value *V) { 12181ad6265SDimitry Andric if (isa<Constant>(V) || isa<InlineAsm>(V)) 122fe6060f1SDimitry Andric orderValue(V, OM); 123fe6060f1SDimitry Andric }; 12481ad6265SDimitry Andric 125e8d8bef9SDimitry Andric for (const Function &F : M) { 126e8d8bef9SDimitry Andric if (F.isDeclaration()) 127e8d8bef9SDimitry Andric continue; 12881ad6265SDimitry Andric // Here we need to match the union of ValueEnumerator::incorporateFunction() 12981ad6265SDimitry Andric // and WriteFunction(). Basic blocks are implicitly declared before 13081ad6265SDimitry Andric // anything else (by declaring their size). 13181ad6265SDimitry Andric for (const BasicBlock &BB : F) 13281ad6265SDimitry Andric orderValue(&BB, OM); 13381ad6265SDimitry Andric 13481ad6265SDimitry Andric // Metadata used by instructions is decoded before the actual instructions, 13581ad6265SDimitry Andric // so visit any constants used by it beforehand. 136e8d8bef9SDimitry Andric for (const BasicBlock &BB : F) 137*0fca6ea1SDimitry Andric for (const Instruction &I : BB) { 138*0fca6ea1SDimitry Andric auto OrderConstantFromMetadata = [&](Metadata *MD) { 139*0fca6ea1SDimitry Andric if (const auto *VAM = dyn_cast<ValueAsMetadata>(MD)) { 140fe6060f1SDimitry Andric orderConstantValue(VAM->getValue()); 141*0fca6ea1SDimitry Andric } else if (const auto *AL = dyn_cast<DIArgList>(MD)) { 142fe6060f1SDimitry Andric for (const auto *VAM : AL->getArgs()) 143fe6060f1SDimitry Andric orderConstantValue(VAM->getValue()); 144fe6060f1SDimitry Andric } 145*0fca6ea1SDimitry Andric }; 146*0fca6ea1SDimitry Andric 147*0fca6ea1SDimitry Andric for (DbgVariableRecord &DVR : filterDbgVars(I.getDbgRecordRange())) { 148*0fca6ea1SDimitry Andric OrderConstantFromMetadata(DVR.getRawLocation()); 149*0fca6ea1SDimitry Andric if (DVR.isDbgAssign()) 150*0fca6ea1SDimitry Andric OrderConstantFromMetadata(DVR.getRawAddress()); 151*0fca6ea1SDimitry Andric } 152*0fca6ea1SDimitry Andric 153*0fca6ea1SDimitry Andric for (const Value *V : I.operands()) { 154*0fca6ea1SDimitry Andric if (const auto *MAV = dyn_cast<MetadataAsValue>(V)) 155*0fca6ea1SDimitry Andric OrderConstantFromMetadata(MAV->getMetadata()); 156e8d8bef9SDimitry Andric } 157e8d8bef9SDimitry Andric } 1580b57cec5SDimitry Andric 1590b57cec5SDimitry Andric for (const Argument &A : F.args()) 1600b57cec5SDimitry Andric orderValue(&A, OM); 1610b57cec5SDimitry Andric for (const BasicBlock &BB : F) 1625ffd83dbSDimitry Andric for (const Instruction &I : BB) { 1630b57cec5SDimitry Andric for (const Value *Op : I.operands()) 16481ad6265SDimitry Andric orderConstantValue(Op); 1655ffd83dbSDimitry Andric if (auto *SVI = dyn_cast<ShuffleVectorInst>(&I)) 1665ffd83dbSDimitry Andric orderValue(SVI->getShuffleMaskForBitcode(), OM); 1670b57cec5SDimitry Andric orderValue(&I, OM); 1680b57cec5SDimitry Andric } 16981ad6265SDimitry Andric } 1700b57cec5SDimitry Andric return OM; 1710b57cec5SDimitry Andric } 1720b57cec5SDimitry Andric 1730b57cec5SDimitry Andric static void predictValueUseListOrderImpl(const Value *V, const Function *F, 1740b57cec5SDimitry Andric unsigned ID, const OrderMap &OM, 1750b57cec5SDimitry Andric UseListOrderStack &Stack) { 1760b57cec5SDimitry Andric // Predict use-list order for this one. 1770b57cec5SDimitry Andric using Entry = std::pair<const Use *, unsigned>; 1780b57cec5SDimitry Andric SmallVector<Entry, 64> List; 1790b57cec5SDimitry Andric for (const Use &U : V->uses()) 1800b57cec5SDimitry Andric // Check if this user will be serialized. 1810b57cec5SDimitry Andric if (OM.lookup(U.getUser()).first) 1820b57cec5SDimitry Andric List.push_back(std::make_pair(&U, List.size())); 1830b57cec5SDimitry Andric 1840b57cec5SDimitry Andric if (List.size() < 2) 1850b57cec5SDimitry Andric // We may have lost some users. 1860b57cec5SDimitry Andric return; 1870b57cec5SDimitry Andric 1880b57cec5SDimitry Andric bool IsGlobalValue = OM.isGlobalValue(ID); 1890b57cec5SDimitry Andric llvm::sort(List, [&](const Entry &L, const Entry &R) { 1900b57cec5SDimitry Andric const Use *LU = L.first; 1910b57cec5SDimitry Andric const Use *RU = R.first; 1920b57cec5SDimitry Andric if (LU == RU) 1930b57cec5SDimitry Andric return false; 1940b57cec5SDimitry Andric 1950b57cec5SDimitry Andric auto LID = OM.lookup(LU->getUser()).first; 1960b57cec5SDimitry Andric auto RID = OM.lookup(RU->getUser()).first; 1970b57cec5SDimitry Andric 1980b57cec5SDimitry Andric // If ID is 4, then expect: 7 6 5 1 2 3. 1990b57cec5SDimitry Andric if (LID < RID) { 2000b57cec5SDimitry Andric if (RID <= ID) 2010b57cec5SDimitry Andric if (!IsGlobalValue) // GlobalValue uses don't get reversed. 2020b57cec5SDimitry Andric return true; 2030b57cec5SDimitry Andric return false; 2040b57cec5SDimitry Andric } 2050b57cec5SDimitry Andric if (RID < LID) { 2060b57cec5SDimitry Andric if (LID <= ID) 2070b57cec5SDimitry Andric if (!IsGlobalValue) // GlobalValue uses don't get reversed. 2080b57cec5SDimitry Andric return false; 2090b57cec5SDimitry Andric return true; 2100b57cec5SDimitry Andric } 2110b57cec5SDimitry Andric 2120b57cec5SDimitry Andric // LID and RID are equal, so we have different operands of the same user. 2130b57cec5SDimitry Andric // Assume operands are added in order for all instructions. 2140b57cec5SDimitry Andric if (LID <= ID) 2150b57cec5SDimitry Andric if (!IsGlobalValue) // GlobalValue uses don't get reversed. 2160b57cec5SDimitry Andric return LU->getOperandNo() < RU->getOperandNo(); 2170b57cec5SDimitry Andric return LU->getOperandNo() > RU->getOperandNo(); 2180b57cec5SDimitry Andric }); 2190b57cec5SDimitry Andric 22081ad6265SDimitry Andric if (llvm::is_sorted(List, llvm::less_second())) 2210b57cec5SDimitry Andric // Order is already correct. 2220b57cec5SDimitry Andric return; 2230b57cec5SDimitry Andric 2240b57cec5SDimitry Andric // Store the shuffle. 2250b57cec5SDimitry Andric Stack.emplace_back(V, F, List.size()); 2260b57cec5SDimitry Andric assert(List.size() == Stack.back().Shuffle.size() && "Wrong size"); 2270b57cec5SDimitry Andric for (size_t I = 0, E = List.size(); I != E; ++I) 2280b57cec5SDimitry Andric Stack.back().Shuffle[I] = List[I].second; 2290b57cec5SDimitry Andric } 2300b57cec5SDimitry Andric 2310b57cec5SDimitry Andric static void predictValueUseListOrder(const Value *V, const Function *F, 2320b57cec5SDimitry Andric OrderMap &OM, UseListOrderStack &Stack) { 2330b57cec5SDimitry Andric auto &IDPair = OM[V]; 2340b57cec5SDimitry Andric assert(IDPair.first && "Unmapped value"); 2350b57cec5SDimitry Andric if (IDPair.second) 2360b57cec5SDimitry Andric // Already predicted. 2370b57cec5SDimitry Andric return; 2380b57cec5SDimitry Andric 2390b57cec5SDimitry Andric // Do the actual prediction. 2400b57cec5SDimitry Andric IDPair.second = true; 2410b57cec5SDimitry Andric if (!V->use_empty() && std::next(V->use_begin()) != V->use_end()) 2420b57cec5SDimitry Andric predictValueUseListOrderImpl(V, F, IDPair.first, OM, Stack); 2430b57cec5SDimitry Andric 2440b57cec5SDimitry Andric // Recursive descent into constants. 2455ffd83dbSDimitry Andric if (const Constant *C = dyn_cast<Constant>(V)) { 2465ffd83dbSDimitry Andric if (C->getNumOperands()) { // Visit GlobalValues. 2470b57cec5SDimitry Andric for (const Value *Op : C->operands()) 2480b57cec5SDimitry Andric if (isa<Constant>(Op)) // Visit GlobalValues. 2490b57cec5SDimitry Andric predictValueUseListOrder(Op, F, OM, Stack); 2505ffd83dbSDimitry Andric if (auto *CE = dyn_cast<ConstantExpr>(C)) 2515ffd83dbSDimitry Andric if (CE->getOpcode() == Instruction::ShuffleVector) 2525ffd83dbSDimitry Andric predictValueUseListOrder(CE->getShuffleMaskForBitcode(), F, OM, 2535ffd83dbSDimitry Andric Stack); 2545ffd83dbSDimitry Andric } 2555ffd83dbSDimitry Andric } 2560b57cec5SDimitry Andric } 2570b57cec5SDimitry Andric 2580b57cec5SDimitry Andric static UseListOrderStack predictUseListOrder(const Module &M) { 2590b57cec5SDimitry Andric OrderMap OM = orderModule(M); 2600b57cec5SDimitry Andric 2610b57cec5SDimitry Andric // Use-list orders need to be serialized after all the users have been added 2620b57cec5SDimitry Andric // to a value, or else the shuffles will be incomplete. Store them per 2630b57cec5SDimitry Andric // function in a stack. 2640b57cec5SDimitry Andric // 2650b57cec5SDimitry Andric // Aside from function order, the order of values doesn't matter much here. 2660b57cec5SDimitry Andric UseListOrderStack Stack; 2670b57cec5SDimitry Andric 2680b57cec5SDimitry Andric // We want to visit the functions backward now so we can list function-local 2690b57cec5SDimitry Andric // constants in the last Function they're used in. Module-level constants 2700b57cec5SDimitry Andric // have already been visited above. 2710eae32dcSDimitry Andric for (const Function &F : llvm::reverse(M)) { 272*0fca6ea1SDimitry Andric auto PredictValueOrderFromMetadata = [&](Metadata *MD) { 273*0fca6ea1SDimitry Andric if (const auto *VAM = dyn_cast<ValueAsMetadata>(MD)) { 274*0fca6ea1SDimitry Andric predictValueUseListOrder(VAM->getValue(), &F, OM, Stack); 275*0fca6ea1SDimitry Andric } else if (const auto *AL = dyn_cast<DIArgList>(MD)) { 276*0fca6ea1SDimitry Andric for (const auto *VAM : AL->getArgs()) 277*0fca6ea1SDimitry Andric predictValueUseListOrder(VAM->getValue(), &F, OM, Stack); 278*0fca6ea1SDimitry Andric } 279*0fca6ea1SDimitry Andric }; 2800b57cec5SDimitry Andric if (F.isDeclaration()) 2810b57cec5SDimitry Andric continue; 2820b57cec5SDimitry Andric for (const BasicBlock &BB : F) 2830b57cec5SDimitry Andric predictValueUseListOrder(&BB, &F, OM, Stack); 2840b57cec5SDimitry Andric for (const Argument &A : F.args()) 2850b57cec5SDimitry Andric predictValueUseListOrder(&A, &F, OM, Stack); 286*0fca6ea1SDimitry Andric for (const BasicBlock &BB : F) { 2875ffd83dbSDimitry Andric for (const Instruction &I : BB) { 288*0fca6ea1SDimitry Andric for (DbgVariableRecord &DVR : filterDbgVars(I.getDbgRecordRange())) { 289*0fca6ea1SDimitry Andric PredictValueOrderFromMetadata(DVR.getRawLocation()); 290*0fca6ea1SDimitry Andric if (DVR.isDbgAssign()) 291*0fca6ea1SDimitry Andric PredictValueOrderFromMetadata(DVR.getRawAddress()); 292*0fca6ea1SDimitry Andric } 29381ad6265SDimitry Andric for (const Value *Op : I.operands()) { 2940b57cec5SDimitry Andric if (isa<Constant>(*Op) || isa<InlineAsm>(*Op)) // Visit GlobalValues. 2950b57cec5SDimitry Andric predictValueUseListOrder(Op, &F, OM, Stack); 296*0fca6ea1SDimitry Andric if (const auto *MAV = dyn_cast<MetadataAsValue>(Op)) 297*0fca6ea1SDimitry Andric PredictValueOrderFromMetadata(MAV->getMetadata()); 29881ad6265SDimitry Andric } 2995ffd83dbSDimitry Andric if (auto *SVI = dyn_cast<ShuffleVectorInst>(&I)) 3005ffd83dbSDimitry Andric predictValueUseListOrder(SVI->getShuffleMaskForBitcode(), &F, OM, 3015ffd83dbSDimitry Andric Stack); 3020b57cec5SDimitry Andric predictValueUseListOrder(&I, &F, OM, Stack); 3030b57cec5SDimitry Andric } 30481ad6265SDimitry Andric } 305*0fca6ea1SDimitry Andric } 3060b57cec5SDimitry Andric 3070b57cec5SDimitry Andric // Visit globals last, since the module-level use-list block will be seen 3080b57cec5SDimitry Andric // before the function bodies are processed. 3090b57cec5SDimitry Andric for (const GlobalVariable &G : M.globals()) 3100b57cec5SDimitry Andric predictValueUseListOrder(&G, nullptr, OM, Stack); 3110b57cec5SDimitry Andric for (const Function &F : M) 3120b57cec5SDimitry Andric predictValueUseListOrder(&F, nullptr, OM, Stack); 3130b57cec5SDimitry Andric for (const GlobalAlias &A : M.aliases()) 3140b57cec5SDimitry Andric predictValueUseListOrder(&A, nullptr, OM, Stack); 3150b57cec5SDimitry Andric for (const GlobalIFunc &I : M.ifuncs()) 3160b57cec5SDimitry Andric predictValueUseListOrder(&I, nullptr, OM, Stack); 3170b57cec5SDimitry Andric for (const GlobalVariable &G : M.globals()) 3180b57cec5SDimitry Andric if (G.hasInitializer()) 3190b57cec5SDimitry Andric predictValueUseListOrder(G.getInitializer(), nullptr, OM, Stack); 3200b57cec5SDimitry Andric for (const GlobalAlias &A : M.aliases()) 3210b57cec5SDimitry Andric predictValueUseListOrder(A.getAliasee(), nullptr, OM, Stack); 3220b57cec5SDimitry Andric for (const GlobalIFunc &I : M.ifuncs()) 3230b57cec5SDimitry Andric predictValueUseListOrder(I.getResolver(), nullptr, OM, Stack); 3240b57cec5SDimitry Andric for (const Function &F : M) { 3250b57cec5SDimitry Andric for (const Use &U : F.operands()) 3260b57cec5SDimitry Andric predictValueUseListOrder(U.get(), nullptr, OM, Stack); 3270b57cec5SDimitry Andric } 3280b57cec5SDimitry Andric 3290b57cec5SDimitry Andric return Stack; 3300b57cec5SDimitry Andric } 3310b57cec5SDimitry Andric 3320b57cec5SDimitry Andric static bool isIntOrIntVectorValue(const std::pair<const Value*, unsigned> &V) { 3330b57cec5SDimitry Andric return V.first->getType()->isIntOrIntVectorTy(); 3340b57cec5SDimitry Andric } 3350b57cec5SDimitry Andric 3360b57cec5SDimitry Andric ValueEnumerator::ValueEnumerator(const Module &M, 3370b57cec5SDimitry Andric bool ShouldPreserveUseListOrder) 3380b57cec5SDimitry Andric : ShouldPreserveUseListOrder(ShouldPreserveUseListOrder) { 3390b57cec5SDimitry Andric if (ShouldPreserveUseListOrder) 3400b57cec5SDimitry Andric UseListOrders = predictUseListOrder(M); 3410b57cec5SDimitry Andric 3420b57cec5SDimitry Andric // Enumerate the global variables. 343fe6060f1SDimitry Andric for (const GlobalVariable &GV : M.globals()) { 3440b57cec5SDimitry Andric EnumerateValue(&GV); 345fe6060f1SDimitry Andric EnumerateType(GV.getValueType()); 346fe6060f1SDimitry Andric } 3470b57cec5SDimitry Andric 3480b57cec5SDimitry Andric // Enumerate the functions. 3490b57cec5SDimitry Andric for (const Function & F : M) { 3500b57cec5SDimitry Andric EnumerateValue(&F); 351fe6060f1SDimitry Andric EnumerateType(F.getValueType()); 3520b57cec5SDimitry Andric EnumerateAttributes(F.getAttributes()); 3530b57cec5SDimitry Andric } 3540b57cec5SDimitry Andric 3550b57cec5SDimitry Andric // Enumerate the aliases. 356fe6060f1SDimitry Andric for (const GlobalAlias &GA : M.aliases()) { 3570b57cec5SDimitry Andric EnumerateValue(&GA); 358fe6060f1SDimitry Andric EnumerateType(GA.getValueType()); 359fe6060f1SDimitry Andric } 3600b57cec5SDimitry Andric 3610b57cec5SDimitry Andric // Enumerate the ifuncs. 36204eeddc0SDimitry Andric for (const GlobalIFunc &GIF : M.ifuncs()) { 3630b57cec5SDimitry Andric EnumerateValue(&GIF); 36404eeddc0SDimitry Andric EnumerateType(GIF.getValueType()); 36504eeddc0SDimitry Andric } 3660b57cec5SDimitry Andric 3670b57cec5SDimitry Andric // Remember what is the cutoff between globalvalue's and other constants. 3680b57cec5SDimitry Andric unsigned FirstConstant = Values.size(); 3690b57cec5SDimitry Andric 3700b57cec5SDimitry Andric // Enumerate the global variable initializers and attributes. 3710b57cec5SDimitry Andric for (const GlobalVariable &GV : M.globals()) { 3720b57cec5SDimitry Andric if (GV.hasInitializer()) 3730b57cec5SDimitry Andric EnumerateValue(GV.getInitializer()); 3740b57cec5SDimitry Andric if (GV.hasAttributes()) 3750b57cec5SDimitry Andric EnumerateAttributes(GV.getAttributesAsList(AttributeList::FunctionIndex)); 3760b57cec5SDimitry Andric } 3770b57cec5SDimitry Andric 3780b57cec5SDimitry Andric // Enumerate the aliasees. 3790b57cec5SDimitry Andric for (const GlobalAlias &GA : M.aliases()) 3800b57cec5SDimitry Andric EnumerateValue(GA.getAliasee()); 3810b57cec5SDimitry Andric 3820b57cec5SDimitry Andric // Enumerate the ifunc resolvers. 3830b57cec5SDimitry Andric for (const GlobalIFunc &GIF : M.ifuncs()) 3840b57cec5SDimitry Andric EnumerateValue(GIF.getResolver()); 3850b57cec5SDimitry Andric 3860b57cec5SDimitry Andric // Enumerate any optional Function data. 3870b57cec5SDimitry Andric for (const Function &F : M) 3880b57cec5SDimitry Andric for (const Use &U : F.operands()) 3890b57cec5SDimitry Andric EnumerateValue(U.get()); 3900b57cec5SDimitry Andric 3910b57cec5SDimitry Andric // Enumerate the metadata type. 3920b57cec5SDimitry Andric // 3930b57cec5SDimitry Andric // TODO: Move this to ValueEnumerator::EnumerateOperandType() once bitcode 3940b57cec5SDimitry Andric // only encodes the metadata type when it's used as a value. 3950b57cec5SDimitry Andric EnumerateType(Type::getMetadataTy(M.getContext())); 3960b57cec5SDimitry Andric 3970b57cec5SDimitry Andric // Insert constants and metadata that are named at module level into the slot 3980b57cec5SDimitry Andric // pool so that the module symbol table can refer to them... 3990b57cec5SDimitry Andric EnumerateValueSymbolTable(M.getValueSymbolTable()); 4000b57cec5SDimitry Andric EnumerateNamedMetadata(M); 4010b57cec5SDimitry Andric 4020b57cec5SDimitry Andric SmallVector<std::pair<unsigned, MDNode *>, 8> MDs; 4030b57cec5SDimitry Andric for (const GlobalVariable &GV : M.globals()) { 4040b57cec5SDimitry Andric MDs.clear(); 4050b57cec5SDimitry Andric GV.getAllMetadata(MDs); 4060b57cec5SDimitry Andric for (const auto &I : MDs) 4070b57cec5SDimitry Andric // FIXME: Pass GV to EnumerateMetadata and arrange for the bitcode writer 4080b57cec5SDimitry Andric // to write metadata to the global variable's own metadata block 4090b57cec5SDimitry Andric // (PR28134). 4100b57cec5SDimitry Andric EnumerateMetadata(nullptr, I.second); 4110b57cec5SDimitry Andric } 4120b57cec5SDimitry Andric 4130b57cec5SDimitry Andric // Enumerate types used by function bodies and argument lists. 4140b57cec5SDimitry Andric for (const Function &F : M) { 4150b57cec5SDimitry Andric for (const Argument &A : F.args()) 4160b57cec5SDimitry Andric EnumerateType(A.getType()); 4170b57cec5SDimitry Andric 4180b57cec5SDimitry Andric // Enumerate metadata attached to this function. 4190b57cec5SDimitry Andric MDs.clear(); 4200b57cec5SDimitry Andric F.getAllMetadata(MDs); 4210b57cec5SDimitry Andric for (const auto &I : MDs) 4220b57cec5SDimitry Andric EnumerateMetadata(F.isDeclaration() ? nullptr : &F, I.second); 4230b57cec5SDimitry Andric 4240b57cec5SDimitry Andric for (const BasicBlock &BB : F) 4250b57cec5SDimitry Andric for (const Instruction &I : BB) { 426*0fca6ea1SDimitry Andric // Local metadata is enumerated during function-incorporation, but 427*0fca6ea1SDimitry Andric // any ConstantAsMetadata arguments in a DIArgList should be examined 428*0fca6ea1SDimitry Andric // now. 429*0fca6ea1SDimitry Andric auto EnumerateNonLocalValuesFromMetadata = [&](Metadata *MD) { 430*0fca6ea1SDimitry Andric assert(MD && "Metadata unexpectedly null"); 431*0fca6ea1SDimitry Andric if (const auto *AL = dyn_cast<DIArgList>(MD)) { 432*0fca6ea1SDimitry Andric for (const auto *VAM : AL->getArgs()) { 433*0fca6ea1SDimitry Andric if (isa<ConstantAsMetadata>(VAM)) 434*0fca6ea1SDimitry Andric EnumerateMetadata(&F, VAM); 435*0fca6ea1SDimitry Andric } 436*0fca6ea1SDimitry Andric return; 437*0fca6ea1SDimitry Andric } 438*0fca6ea1SDimitry Andric 439*0fca6ea1SDimitry Andric if (!isa<LocalAsMetadata>(MD)) 440*0fca6ea1SDimitry Andric EnumerateMetadata(&F, MD); 441*0fca6ea1SDimitry Andric }; 442*0fca6ea1SDimitry Andric 443*0fca6ea1SDimitry Andric for (DbgRecord &DR : I.getDbgRecordRange()) { 444*0fca6ea1SDimitry Andric if (DbgLabelRecord *DLR = dyn_cast<DbgLabelRecord>(&DR)) { 445*0fca6ea1SDimitry Andric EnumerateMetadata(&F, DLR->getLabel()); 446*0fca6ea1SDimitry Andric EnumerateMetadata(&F, &*DLR->getDebugLoc()); 447*0fca6ea1SDimitry Andric continue; 448*0fca6ea1SDimitry Andric } 449*0fca6ea1SDimitry Andric // Enumerate non-local location metadata. 450*0fca6ea1SDimitry Andric DbgVariableRecord &DVR = cast<DbgVariableRecord>(DR); 451*0fca6ea1SDimitry Andric EnumerateNonLocalValuesFromMetadata(DVR.getRawLocation()); 452*0fca6ea1SDimitry Andric EnumerateMetadata(&F, DVR.getExpression()); 453*0fca6ea1SDimitry Andric EnumerateMetadata(&F, DVR.getVariable()); 454*0fca6ea1SDimitry Andric EnumerateMetadata(&F, &*DVR.getDebugLoc()); 455*0fca6ea1SDimitry Andric if (DVR.isDbgAssign()) { 456*0fca6ea1SDimitry Andric EnumerateNonLocalValuesFromMetadata(DVR.getRawAddress()); 457*0fca6ea1SDimitry Andric EnumerateMetadata(&F, DVR.getAssignID()); 458*0fca6ea1SDimitry Andric EnumerateMetadata(&F, DVR.getAddressExpression()); 459*0fca6ea1SDimitry Andric } 460*0fca6ea1SDimitry Andric } 4610b57cec5SDimitry Andric for (const Use &Op : I.operands()) { 4620b57cec5SDimitry Andric auto *MD = dyn_cast<MetadataAsValue>(&Op); 4630b57cec5SDimitry Andric if (!MD) { 4640b57cec5SDimitry Andric EnumerateOperandType(Op); 4650b57cec5SDimitry Andric continue; 4660b57cec5SDimitry Andric } 4670b57cec5SDimitry Andric 468*0fca6ea1SDimitry Andric EnumerateNonLocalValuesFromMetadata(MD->getMetadata()); 4690b57cec5SDimitry Andric } 4705ffd83dbSDimitry Andric if (auto *SVI = dyn_cast<ShuffleVectorInst>(&I)) 4715ffd83dbSDimitry Andric EnumerateType(SVI->getShuffleMaskForBitcode()->getType()); 472fe6060f1SDimitry Andric if (auto *GEP = dyn_cast<GetElementPtrInst>(&I)) 473fe6060f1SDimitry Andric EnumerateType(GEP->getSourceElementType()); 474fe6060f1SDimitry Andric if (auto *AI = dyn_cast<AllocaInst>(&I)) 475fe6060f1SDimitry Andric EnumerateType(AI->getAllocatedType()); 4760b57cec5SDimitry Andric EnumerateType(I.getType()); 477fe6060f1SDimitry Andric if (const auto *Call = dyn_cast<CallBase>(&I)) { 4780b57cec5SDimitry Andric EnumerateAttributes(Call->getAttributes()); 479fe6060f1SDimitry Andric EnumerateType(Call->getFunctionType()); 480fe6060f1SDimitry Andric } 4810b57cec5SDimitry Andric 4820b57cec5SDimitry Andric // Enumerate metadata attached with this instruction. 4830b57cec5SDimitry Andric MDs.clear(); 4840b57cec5SDimitry Andric I.getAllMetadataOtherThanDebugLoc(MDs); 4850b57cec5SDimitry Andric for (unsigned i = 0, e = MDs.size(); i != e; ++i) 4860b57cec5SDimitry Andric EnumerateMetadata(&F, MDs[i].second); 4870b57cec5SDimitry Andric 4880b57cec5SDimitry Andric // Don't enumerate the location directly -- it has a special record 4890b57cec5SDimitry Andric // type -- but enumerate its operands. 4900b57cec5SDimitry Andric if (DILocation *L = I.getDebugLoc()) 4910b57cec5SDimitry Andric for (const Metadata *Op : L->operands()) 4920b57cec5SDimitry Andric EnumerateMetadata(&F, Op); 4930b57cec5SDimitry Andric } 4940b57cec5SDimitry Andric } 4950b57cec5SDimitry Andric 4960b57cec5SDimitry Andric // Optimize constant ordering. 4970b57cec5SDimitry Andric OptimizeConstants(FirstConstant, Values.size()); 4980b57cec5SDimitry Andric 4990b57cec5SDimitry Andric // Organize metadata ordering. 5000b57cec5SDimitry Andric organizeMetadata(); 5010b57cec5SDimitry Andric } 5020b57cec5SDimitry Andric 5030b57cec5SDimitry Andric unsigned ValueEnumerator::getInstructionID(const Instruction *Inst) const { 5040b57cec5SDimitry Andric InstructionMapType::const_iterator I = InstructionMap.find(Inst); 5050b57cec5SDimitry Andric assert(I != InstructionMap.end() && "Instruction is not mapped!"); 5060b57cec5SDimitry Andric return I->second; 5070b57cec5SDimitry Andric } 5080b57cec5SDimitry Andric 5090b57cec5SDimitry Andric unsigned ValueEnumerator::getComdatID(const Comdat *C) const { 5100b57cec5SDimitry Andric unsigned ComdatID = Comdats.idFor(C); 5110b57cec5SDimitry Andric assert(ComdatID && "Comdat not found!"); 5120b57cec5SDimitry Andric return ComdatID; 5130b57cec5SDimitry Andric } 5140b57cec5SDimitry Andric 5150b57cec5SDimitry Andric void ValueEnumerator::setInstructionID(const Instruction *I) { 5160b57cec5SDimitry Andric InstructionMap[I] = InstructionCount++; 5170b57cec5SDimitry Andric } 5180b57cec5SDimitry Andric 5190b57cec5SDimitry Andric unsigned ValueEnumerator::getValueID(const Value *V) const { 5200b57cec5SDimitry Andric if (auto *MD = dyn_cast<MetadataAsValue>(V)) 5210b57cec5SDimitry Andric return getMetadataID(MD->getMetadata()); 5220b57cec5SDimitry Andric 5230b57cec5SDimitry Andric ValueMapType::const_iterator I = ValueMap.find(V); 5240b57cec5SDimitry Andric assert(I != ValueMap.end() && "Value not in slotcalculator!"); 5250b57cec5SDimitry Andric return I->second-1; 5260b57cec5SDimitry Andric } 5270b57cec5SDimitry Andric 5280b57cec5SDimitry Andric #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 5290b57cec5SDimitry Andric LLVM_DUMP_METHOD void ValueEnumerator::dump() const { 5300b57cec5SDimitry Andric print(dbgs(), ValueMap, "Default"); 5310b57cec5SDimitry Andric dbgs() << '\n'; 5320b57cec5SDimitry Andric print(dbgs(), MetadataMap, "MetaData"); 5330b57cec5SDimitry Andric dbgs() << '\n'; 5340b57cec5SDimitry Andric } 5350b57cec5SDimitry Andric #endif 5360b57cec5SDimitry Andric 5370b57cec5SDimitry Andric void ValueEnumerator::print(raw_ostream &OS, const ValueMapType &Map, 5380b57cec5SDimitry Andric const char *Name) const { 5390b57cec5SDimitry Andric OS << "Map Name: " << Name << "\n"; 5400b57cec5SDimitry Andric OS << "Size: " << Map.size() << "\n"; 5410eae32dcSDimitry Andric for (const auto &I : Map) { 5420eae32dcSDimitry Andric const Value *V = I.first; 5430b57cec5SDimitry Andric if (V->hasName()) 5440b57cec5SDimitry Andric OS << "Value: " << V->getName(); 5450b57cec5SDimitry Andric else 5460b57cec5SDimitry Andric OS << "Value: [null]\n"; 5470b57cec5SDimitry Andric V->print(errs()); 5480b57cec5SDimitry Andric errs() << '\n'; 5490b57cec5SDimitry Andric 5500b57cec5SDimitry Andric OS << " Uses(" << V->getNumUses() << "):"; 5510b57cec5SDimitry Andric for (const Use &U : V->uses()) { 5520b57cec5SDimitry Andric if (&U != &*V->use_begin()) 5530b57cec5SDimitry Andric OS << ","; 5540b57cec5SDimitry Andric if(U->hasName()) 5550b57cec5SDimitry Andric OS << " " << U->getName(); 5560b57cec5SDimitry Andric else 5570b57cec5SDimitry Andric OS << " [null]"; 5580b57cec5SDimitry Andric 5590b57cec5SDimitry Andric } 5600b57cec5SDimitry Andric OS << "\n\n"; 5610b57cec5SDimitry Andric } 5620b57cec5SDimitry Andric } 5630b57cec5SDimitry Andric 5640b57cec5SDimitry Andric void ValueEnumerator::print(raw_ostream &OS, const MetadataMapType &Map, 5650b57cec5SDimitry Andric const char *Name) const { 5660b57cec5SDimitry Andric OS << "Map Name: " << Name << "\n"; 5670b57cec5SDimitry Andric OS << "Size: " << Map.size() << "\n"; 5680eae32dcSDimitry Andric for (const auto &I : Map) { 5690eae32dcSDimitry Andric const Metadata *MD = I.first; 5700eae32dcSDimitry Andric OS << "Metadata: slot = " << I.second.ID << "\n"; 5710eae32dcSDimitry Andric OS << "Metadata: function = " << I.second.F << "\n"; 5720b57cec5SDimitry Andric MD->print(OS); 5730b57cec5SDimitry Andric OS << "\n"; 5740b57cec5SDimitry Andric } 5750b57cec5SDimitry Andric } 5760b57cec5SDimitry Andric 5770b57cec5SDimitry Andric /// OptimizeConstants - Reorder constant pool for denser encoding. 5780b57cec5SDimitry Andric void ValueEnumerator::OptimizeConstants(unsigned CstStart, unsigned CstEnd) { 5790b57cec5SDimitry Andric if (CstStart == CstEnd || CstStart+1 == CstEnd) return; 5800b57cec5SDimitry Andric 5810b57cec5SDimitry Andric if (ShouldPreserveUseListOrder) 5820b57cec5SDimitry Andric // Optimizing constants makes the use-list order difficult to predict. 5830b57cec5SDimitry Andric // Disable it for now when trying to preserve the order. 5840b57cec5SDimitry Andric return; 5850b57cec5SDimitry Andric 5860b57cec5SDimitry Andric std::stable_sort(Values.begin() + CstStart, Values.begin() + CstEnd, 5870b57cec5SDimitry Andric [this](const std::pair<const Value *, unsigned> &LHS, 5880b57cec5SDimitry Andric const std::pair<const Value *, unsigned> &RHS) { 5890b57cec5SDimitry Andric // Sort by plane. 5900b57cec5SDimitry Andric if (LHS.first->getType() != RHS.first->getType()) 5910b57cec5SDimitry Andric return getTypeID(LHS.first->getType()) < getTypeID(RHS.first->getType()); 5920b57cec5SDimitry Andric // Then by frequency. 5930b57cec5SDimitry Andric return LHS.second > RHS.second; 5940b57cec5SDimitry Andric }); 5950b57cec5SDimitry Andric 5960b57cec5SDimitry Andric // Ensure that integer and vector of integer constants are at the start of the 5970b57cec5SDimitry Andric // constant pool. This is important so that GEP structure indices come before 5980b57cec5SDimitry Andric // gep constant exprs. 5990b57cec5SDimitry Andric std::stable_partition(Values.begin() + CstStart, Values.begin() + CstEnd, 6000b57cec5SDimitry Andric isIntOrIntVectorValue); 6010b57cec5SDimitry Andric 6020b57cec5SDimitry Andric // Rebuild the modified portion of ValueMap. 6030b57cec5SDimitry Andric for (; CstStart != CstEnd; ++CstStart) 6040b57cec5SDimitry Andric ValueMap[Values[CstStart].first] = CstStart+1; 6050b57cec5SDimitry Andric } 6060b57cec5SDimitry Andric 6070b57cec5SDimitry Andric /// EnumerateValueSymbolTable - Insert all of the values in the specified symbol 6080b57cec5SDimitry Andric /// table into the values table. 6090b57cec5SDimitry Andric void ValueEnumerator::EnumerateValueSymbolTable(const ValueSymbolTable &VST) { 6100b57cec5SDimitry Andric for (ValueSymbolTable::const_iterator VI = VST.begin(), VE = VST.end(); 6110b57cec5SDimitry Andric VI != VE; ++VI) 6120b57cec5SDimitry Andric EnumerateValue(VI->getValue()); 6130b57cec5SDimitry Andric } 6140b57cec5SDimitry Andric 6150b57cec5SDimitry Andric /// Insert all of the values referenced by named metadata in the specified 6160b57cec5SDimitry Andric /// module. 6170b57cec5SDimitry Andric void ValueEnumerator::EnumerateNamedMetadata(const Module &M) { 6180b57cec5SDimitry Andric for (const auto &I : M.named_metadata()) 6190b57cec5SDimitry Andric EnumerateNamedMDNode(&I); 6200b57cec5SDimitry Andric } 6210b57cec5SDimitry Andric 6220b57cec5SDimitry Andric void ValueEnumerator::EnumerateNamedMDNode(const NamedMDNode *MD) { 623*0fca6ea1SDimitry Andric for (const MDNode *N : MD->operands()) 624*0fca6ea1SDimitry Andric EnumerateMetadata(nullptr, N); 6250b57cec5SDimitry Andric } 6260b57cec5SDimitry Andric 6270b57cec5SDimitry Andric unsigned ValueEnumerator::getMetadataFunctionID(const Function *F) const { 6280b57cec5SDimitry Andric return F ? getValueID(F) + 1 : 0; 6290b57cec5SDimitry Andric } 6300b57cec5SDimitry Andric 6310b57cec5SDimitry Andric void ValueEnumerator::EnumerateMetadata(const Function *F, const Metadata *MD) { 6320b57cec5SDimitry Andric EnumerateMetadata(getMetadataFunctionID(F), MD); 6330b57cec5SDimitry Andric } 6340b57cec5SDimitry Andric 6350b57cec5SDimitry Andric void ValueEnumerator::EnumerateFunctionLocalMetadata( 6360b57cec5SDimitry Andric const Function &F, const LocalAsMetadata *Local) { 6370b57cec5SDimitry Andric EnumerateFunctionLocalMetadata(getMetadataFunctionID(&F), Local); 6380b57cec5SDimitry Andric } 6390b57cec5SDimitry Andric 640fe6060f1SDimitry Andric void ValueEnumerator::EnumerateFunctionLocalListMetadata( 641fe6060f1SDimitry Andric const Function &F, const DIArgList *ArgList) { 642fe6060f1SDimitry Andric EnumerateFunctionLocalListMetadata(getMetadataFunctionID(&F), ArgList); 643fe6060f1SDimitry Andric } 644fe6060f1SDimitry Andric 6450b57cec5SDimitry Andric void ValueEnumerator::dropFunctionFromMetadata( 6460b57cec5SDimitry Andric MetadataMapType::value_type &FirstMD) { 6470b57cec5SDimitry Andric SmallVector<const MDNode *, 64> Worklist; 6480b57cec5SDimitry Andric auto push = [&Worklist](MetadataMapType::value_type &MD) { 6490b57cec5SDimitry Andric auto &Entry = MD.second; 6500b57cec5SDimitry Andric 6510b57cec5SDimitry Andric // Nothing to do if this metadata isn't tagged. 6520b57cec5SDimitry Andric if (!Entry.F) 6530b57cec5SDimitry Andric return; 6540b57cec5SDimitry Andric 6550b57cec5SDimitry Andric // Drop the function tag. 6560b57cec5SDimitry Andric Entry.F = 0; 6570b57cec5SDimitry Andric 6580b57cec5SDimitry Andric // If this is has an ID and is an MDNode, then its operands have entries as 6590b57cec5SDimitry Andric // well. We need to drop the function from them too. 6600b57cec5SDimitry Andric if (Entry.ID) 6610b57cec5SDimitry Andric if (auto *N = dyn_cast<MDNode>(MD.first)) 6620b57cec5SDimitry Andric Worklist.push_back(N); 6630b57cec5SDimitry Andric }; 6640b57cec5SDimitry Andric push(FirstMD); 6650b57cec5SDimitry Andric while (!Worklist.empty()) 6660b57cec5SDimitry Andric for (const Metadata *Op : Worklist.pop_back_val()->operands()) { 6670b57cec5SDimitry Andric if (!Op) 6680b57cec5SDimitry Andric continue; 6690b57cec5SDimitry Andric auto MD = MetadataMap.find(Op); 6700b57cec5SDimitry Andric if (MD != MetadataMap.end()) 6710b57cec5SDimitry Andric push(*MD); 6720b57cec5SDimitry Andric } 6730b57cec5SDimitry Andric } 6740b57cec5SDimitry Andric 6750b57cec5SDimitry Andric void ValueEnumerator::EnumerateMetadata(unsigned F, const Metadata *MD) { 6760b57cec5SDimitry Andric // It's vital for reader efficiency that uniqued subgraphs are done in 6770b57cec5SDimitry Andric // post-order; it's expensive when their operands have forward references. 6780b57cec5SDimitry Andric // If a distinct node is referenced from a uniqued node, it'll be delayed 6790b57cec5SDimitry Andric // until the uniqued subgraph has been completely traversed. 6800b57cec5SDimitry Andric SmallVector<const MDNode *, 32> DelayedDistinctNodes; 6810b57cec5SDimitry Andric 6820b57cec5SDimitry Andric // Start by enumerating MD, and then work through its transitive operands in 6830b57cec5SDimitry Andric // post-order. This requires a depth-first search. 6840b57cec5SDimitry Andric SmallVector<std::pair<const MDNode *, MDNode::op_iterator>, 32> Worklist; 6850b57cec5SDimitry Andric if (const MDNode *N = enumerateMetadataImpl(F, MD)) 6860b57cec5SDimitry Andric Worklist.push_back(std::make_pair(N, N->op_begin())); 6870b57cec5SDimitry Andric 6880b57cec5SDimitry Andric while (!Worklist.empty()) { 6890b57cec5SDimitry Andric const MDNode *N = Worklist.back().first; 6900b57cec5SDimitry Andric 6910b57cec5SDimitry Andric // Enumerate operands until we hit a new node. We need to traverse these 6920b57cec5SDimitry Andric // nodes' operands before visiting the rest of N's operands. 6930b57cec5SDimitry Andric MDNode::op_iterator I = std::find_if( 6940b57cec5SDimitry Andric Worklist.back().second, N->op_end(), 6950b57cec5SDimitry Andric [&](const Metadata *MD) { return enumerateMetadataImpl(F, MD); }); 6960b57cec5SDimitry Andric if (I != N->op_end()) { 6970b57cec5SDimitry Andric auto *Op = cast<MDNode>(*I); 6980b57cec5SDimitry Andric Worklist.back().second = ++I; 6990b57cec5SDimitry Andric 7000b57cec5SDimitry Andric // Delay traversing Op if it's a distinct node and N is uniqued. 7010b57cec5SDimitry Andric if (Op->isDistinct() && !N->isDistinct()) 7020b57cec5SDimitry Andric DelayedDistinctNodes.push_back(Op); 7030b57cec5SDimitry Andric else 7040b57cec5SDimitry Andric Worklist.push_back(std::make_pair(Op, Op->op_begin())); 7050b57cec5SDimitry Andric continue; 7060b57cec5SDimitry Andric } 7070b57cec5SDimitry Andric 7080b57cec5SDimitry Andric // All the operands have been visited. Now assign an ID. 7090b57cec5SDimitry Andric Worklist.pop_back(); 7100b57cec5SDimitry Andric MDs.push_back(N); 7110b57cec5SDimitry Andric MetadataMap[N].ID = MDs.size(); 7120b57cec5SDimitry Andric 7130b57cec5SDimitry Andric // Flush out any delayed distinct nodes; these are all the distinct nodes 7140b57cec5SDimitry Andric // that are leaves in last uniqued subgraph. 7150b57cec5SDimitry Andric if (Worklist.empty() || Worklist.back().first->isDistinct()) { 7160b57cec5SDimitry Andric for (const MDNode *N : DelayedDistinctNodes) 7170b57cec5SDimitry Andric Worklist.push_back(std::make_pair(N, N->op_begin())); 7180b57cec5SDimitry Andric DelayedDistinctNodes.clear(); 7190b57cec5SDimitry Andric } 7200b57cec5SDimitry Andric } 7210b57cec5SDimitry Andric } 7220b57cec5SDimitry Andric 7230b57cec5SDimitry Andric const MDNode *ValueEnumerator::enumerateMetadataImpl(unsigned F, const Metadata *MD) { 7240b57cec5SDimitry Andric if (!MD) 7250b57cec5SDimitry Andric return nullptr; 7260b57cec5SDimitry Andric 7270b57cec5SDimitry Andric assert( 7280b57cec5SDimitry Andric (isa<MDNode>(MD) || isa<MDString>(MD) || isa<ConstantAsMetadata>(MD)) && 7290b57cec5SDimitry Andric "Invalid metadata kind"); 7300b57cec5SDimitry Andric 7310b57cec5SDimitry Andric auto Insertion = MetadataMap.insert(std::make_pair(MD, MDIndex(F))); 7320b57cec5SDimitry Andric MDIndex &Entry = Insertion.first->second; 7330b57cec5SDimitry Andric if (!Insertion.second) { 7340b57cec5SDimitry Andric // Already mapped. If F doesn't match the function tag, drop it. 7350b57cec5SDimitry Andric if (Entry.hasDifferentFunction(F)) 7360b57cec5SDimitry Andric dropFunctionFromMetadata(*Insertion.first); 7370b57cec5SDimitry Andric return nullptr; 7380b57cec5SDimitry Andric } 7390b57cec5SDimitry Andric 7400b57cec5SDimitry Andric // Don't assign IDs to metadata nodes. 7410b57cec5SDimitry Andric if (auto *N = dyn_cast<MDNode>(MD)) 7420b57cec5SDimitry Andric return N; 7430b57cec5SDimitry Andric 7440b57cec5SDimitry Andric // Save the metadata. 7450b57cec5SDimitry Andric MDs.push_back(MD); 7460b57cec5SDimitry Andric Entry.ID = MDs.size(); 7470b57cec5SDimitry Andric 7480b57cec5SDimitry Andric // Enumerate the constant, if any. 7490b57cec5SDimitry Andric if (auto *C = dyn_cast<ConstantAsMetadata>(MD)) 7500b57cec5SDimitry Andric EnumerateValue(C->getValue()); 7510b57cec5SDimitry Andric 7520b57cec5SDimitry Andric return nullptr; 7530b57cec5SDimitry Andric } 7540b57cec5SDimitry Andric 755fe6060f1SDimitry Andric /// EnumerateFunctionLocalMetadata - Incorporate function-local metadata 7560b57cec5SDimitry Andric /// information reachable from the metadata. 7570b57cec5SDimitry Andric void ValueEnumerator::EnumerateFunctionLocalMetadata( 7580b57cec5SDimitry Andric unsigned F, const LocalAsMetadata *Local) { 7590b57cec5SDimitry Andric assert(F && "Expected a function"); 7600b57cec5SDimitry Andric 7610b57cec5SDimitry Andric // Check to see if it's already in! 7620b57cec5SDimitry Andric MDIndex &Index = MetadataMap[Local]; 7630b57cec5SDimitry Andric if (Index.ID) { 7640b57cec5SDimitry Andric assert(Index.F == F && "Expected the same function"); 7650b57cec5SDimitry Andric return; 7660b57cec5SDimitry Andric } 7670b57cec5SDimitry Andric 7680b57cec5SDimitry Andric MDs.push_back(Local); 7690b57cec5SDimitry Andric Index.F = F; 7700b57cec5SDimitry Andric Index.ID = MDs.size(); 7710b57cec5SDimitry Andric 7720b57cec5SDimitry Andric EnumerateValue(Local->getValue()); 7730b57cec5SDimitry Andric } 7740b57cec5SDimitry Andric 775fe6060f1SDimitry Andric /// EnumerateFunctionLocalListMetadata - Incorporate function-local metadata 776fe6060f1SDimitry Andric /// information reachable from the metadata. 777fe6060f1SDimitry Andric void ValueEnumerator::EnumerateFunctionLocalListMetadata( 778fe6060f1SDimitry Andric unsigned F, const DIArgList *ArgList) { 779fe6060f1SDimitry Andric assert(F && "Expected a function"); 780fe6060f1SDimitry Andric 781fe6060f1SDimitry Andric // Check to see if it's already in! 782fe6060f1SDimitry Andric MDIndex &Index = MetadataMap[ArgList]; 783fe6060f1SDimitry Andric if (Index.ID) { 784fe6060f1SDimitry Andric assert(Index.F == F && "Expected the same function"); 785fe6060f1SDimitry Andric return; 786fe6060f1SDimitry Andric } 787fe6060f1SDimitry Andric 788fe6060f1SDimitry Andric for (ValueAsMetadata *VAM : ArgList->getArgs()) { 789fe6060f1SDimitry Andric if (isa<LocalAsMetadata>(VAM)) { 790fe6060f1SDimitry Andric assert(MetadataMap.count(VAM) && 791fe6060f1SDimitry Andric "LocalAsMetadata should be enumerated before DIArgList"); 792fe6060f1SDimitry Andric assert(MetadataMap[VAM].F == F && 793fe6060f1SDimitry Andric "Expected LocalAsMetadata in the same function"); 794fe6060f1SDimitry Andric } else { 795fe6060f1SDimitry Andric assert(isa<ConstantAsMetadata>(VAM) && 796fe6060f1SDimitry Andric "Expected LocalAsMetadata or ConstantAsMetadata"); 797fe6060f1SDimitry Andric assert(ValueMap.count(VAM->getValue()) && 798fe6060f1SDimitry Andric "Constant should be enumerated beforeDIArgList"); 799fe6060f1SDimitry Andric EnumerateMetadata(F, VAM); 800fe6060f1SDimitry Andric } 801fe6060f1SDimitry Andric } 802fe6060f1SDimitry Andric 803fe6060f1SDimitry Andric MDs.push_back(ArgList); 804fe6060f1SDimitry Andric Index.F = F; 805fe6060f1SDimitry Andric Index.ID = MDs.size(); 806fe6060f1SDimitry Andric } 807fe6060f1SDimitry Andric 8080b57cec5SDimitry Andric static unsigned getMetadataTypeOrder(const Metadata *MD) { 8090b57cec5SDimitry Andric // Strings are emitted in bulk and must come first. 8100b57cec5SDimitry Andric if (isa<MDString>(MD)) 8110b57cec5SDimitry Andric return 0; 8120b57cec5SDimitry Andric 8130b57cec5SDimitry Andric // ConstantAsMetadata doesn't reference anything. We may as well shuffle it 8140b57cec5SDimitry Andric // to the front since we can detect it. 8150b57cec5SDimitry Andric auto *N = dyn_cast<MDNode>(MD); 8160b57cec5SDimitry Andric if (!N) 8170b57cec5SDimitry Andric return 1; 8180b57cec5SDimitry Andric 8190b57cec5SDimitry Andric // The reader is fast forward references for distinct node operands, but slow 8200b57cec5SDimitry Andric // when uniqued operands are unresolved. 8210b57cec5SDimitry Andric return N->isDistinct() ? 2 : 3; 8220b57cec5SDimitry Andric } 8230b57cec5SDimitry Andric 8240b57cec5SDimitry Andric void ValueEnumerator::organizeMetadata() { 8250b57cec5SDimitry Andric assert(MetadataMap.size() == MDs.size() && 8260b57cec5SDimitry Andric "Metadata map and vector out of sync"); 8270b57cec5SDimitry Andric 8280b57cec5SDimitry Andric if (MDs.empty()) 8290b57cec5SDimitry Andric return; 8300b57cec5SDimitry Andric 8310b57cec5SDimitry Andric // Copy out the index information from MetadataMap in order to choose a new 8320b57cec5SDimitry Andric // order. 8330b57cec5SDimitry Andric SmallVector<MDIndex, 64> Order; 8340b57cec5SDimitry Andric Order.reserve(MetadataMap.size()); 8350b57cec5SDimitry Andric for (const Metadata *MD : MDs) 8360b57cec5SDimitry Andric Order.push_back(MetadataMap.lookup(MD)); 8370b57cec5SDimitry Andric 8380b57cec5SDimitry Andric // Partition: 8390b57cec5SDimitry Andric // - by function, then 8400b57cec5SDimitry Andric // - by isa<MDString> 8410b57cec5SDimitry Andric // and then sort by the original/current ID. Since the IDs are guaranteed to 842fcaf7f86SDimitry Andric // be unique, the result of llvm::sort will be deterministic. There's no need 8430b57cec5SDimitry Andric // for std::stable_sort. 8440b57cec5SDimitry Andric llvm::sort(Order, [this](MDIndex LHS, MDIndex RHS) { 8450b57cec5SDimitry Andric return std::make_tuple(LHS.F, getMetadataTypeOrder(LHS.get(MDs)), LHS.ID) < 8460b57cec5SDimitry Andric std::make_tuple(RHS.F, getMetadataTypeOrder(RHS.get(MDs)), RHS.ID); 8470b57cec5SDimitry Andric }); 8480b57cec5SDimitry Andric 8490b57cec5SDimitry Andric // Rebuild MDs, index the metadata ranges for each function in FunctionMDs, 8500b57cec5SDimitry Andric // and fix up MetadataMap. 8510b57cec5SDimitry Andric std::vector<const Metadata *> OldMDs; 8520b57cec5SDimitry Andric MDs.swap(OldMDs); 8530b57cec5SDimitry Andric MDs.reserve(OldMDs.size()); 8540b57cec5SDimitry Andric for (unsigned I = 0, E = Order.size(); I != E && !Order[I].F; ++I) { 8550b57cec5SDimitry Andric auto *MD = Order[I].get(OldMDs); 8560b57cec5SDimitry Andric MDs.push_back(MD); 8570b57cec5SDimitry Andric MetadataMap[MD].ID = I + 1; 8580b57cec5SDimitry Andric if (isa<MDString>(MD)) 8590b57cec5SDimitry Andric ++NumMDStrings; 8600b57cec5SDimitry Andric } 8610b57cec5SDimitry Andric 8620b57cec5SDimitry Andric // Return early if there's nothing for the functions. 8630b57cec5SDimitry Andric if (MDs.size() == Order.size()) 8640b57cec5SDimitry Andric return; 8650b57cec5SDimitry Andric 8660b57cec5SDimitry Andric // Build the function metadata ranges. 8670b57cec5SDimitry Andric MDRange R; 8680b57cec5SDimitry Andric FunctionMDs.reserve(OldMDs.size()); 8690b57cec5SDimitry Andric unsigned PrevF = 0; 8700b57cec5SDimitry Andric for (unsigned I = MDs.size(), E = Order.size(), ID = MDs.size(); I != E; 8710b57cec5SDimitry Andric ++I) { 8720b57cec5SDimitry Andric unsigned F = Order[I].F; 8730b57cec5SDimitry Andric if (!PrevF) { 8740b57cec5SDimitry Andric PrevF = F; 8750b57cec5SDimitry Andric } else if (PrevF != F) { 8760b57cec5SDimitry Andric R.Last = FunctionMDs.size(); 8770b57cec5SDimitry Andric std::swap(R, FunctionMDInfo[PrevF]); 8780b57cec5SDimitry Andric R.First = FunctionMDs.size(); 8790b57cec5SDimitry Andric 8800b57cec5SDimitry Andric ID = MDs.size(); 8810b57cec5SDimitry Andric PrevF = F; 8820b57cec5SDimitry Andric } 8830b57cec5SDimitry Andric 8840b57cec5SDimitry Andric auto *MD = Order[I].get(OldMDs); 8850b57cec5SDimitry Andric FunctionMDs.push_back(MD); 8860b57cec5SDimitry Andric MetadataMap[MD].ID = ++ID; 8870b57cec5SDimitry Andric if (isa<MDString>(MD)) 8880b57cec5SDimitry Andric ++R.NumStrings; 8890b57cec5SDimitry Andric } 8900b57cec5SDimitry Andric R.Last = FunctionMDs.size(); 8910b57cec5SDimitry Andric FunctionMDInfo[PrevF] = R; 8920b57cec5SDimitry Andric } 8930b57cec5SDimitry Andric 8940b57cec5SDimitry Andric void ValueEnumerator::incorporateFunctionMetadata(const Function &F) { 8950b57cec5SDimitry Andric NumModuleMDs = MDs.size(); 8960b57cec5SDimitry Andric 8970b57cec5SDimitry Andric auto R = FunctionMDInfo.lookup(getValueID(&F) + 1); 8980b57cec5SDimitry Andric NumMDStrings = R.NumStrings; 8990b57cec5SDimitry Andric MDs.insert(MDs.end(), FunctionMDs.begin() + R.First, 9000b57cec5SDimitry Andric FunctionMDs.begin() + R.Last); 9010b57cec5SDimitry Andric } 9020b57cec5SDimitry Andric 9030b57cec5SDimitry Andric void ValueEnumerator::EnumerateValue(const Value *V) { 9040b57cec5SDimitry Andric assert(!V->getType()->isVoidTy() && "Can't insert void values!"); 9050b57cec5SDimitry Andric assert(!isa<MetadataAsValue>(V) && "EnumerateValue doesn't handle Metadata!"); 9060b57cec5SDimitry Andric 9070b57cec5SDimitry Andric // Check to see if it's already in! 9080b57cec5SDimitry Andric unsigned &ValueID = ValueMap[V]; 9090b57cec5SDimitry Andric if (ValueID) { 9100b57cec5SDimitry Andric // Increment use count. 9110b57cec5SDimitry Andric Values[ValueID-1].second++; 9120b57cec5SDimitry Andric return; 9130b57cec5SDimitry Andric } 9140b57cec5SDimitry Andric 9150b57cec5SDimitry Andric if (auto *GO = dyn_cast<GlobalObject>(V)) 9160b57cec5SDimitry Andric if (const Comdat *C = GO->getComdat()) 9170b57cec5SDimitry Andric Comdats.insert(C); 9180b57cec5SDimitry Andric 9190b57cec5SDimitry Andric // Enumerate the type of this value. 9200b57cec5SDimitry Andric EnumerateType(V->getType()); 9210b57cec5SDimitry Andric 9220b57cec5SDimitry Andric if (const Constant *C = dyn_cast<Constant>(V)) { 9230b57cec5SDimitry Andric if (isa<GlobalValue>(C)) { 9240b57cec5SDimitry Andric // Initializers for globals are handled explicitly elsewhere. 9250b57cec5SDimitry Andric } else if (C->getNumOperands()) { 9260b57cec5SDimitry Andric // If a constant has operands, enumerate them. This makes sure that if a 9270b57cec5SDimitry Andric // constant has uses (for example an array of const ints), that they are 9280b57cec5SDimitry Andric // inserted also. 9290b57cec5SDimitry Andric 9300b57cec5SDimitry Andric // We prefer to enumerate them with values before we enumerate the user 9310b57cec5SDimitry Andric // itself. This makes it more likely that we can avoid forward references 9320b57cec5SDimitry Andric // in the reader. We know that there can be no cycles in the constants 9330b57cec5SDimitry Andric // graph that don't go through a global variable. 934*0fca6ea1SDimitry Andric for (const Use &U : C->operands()) 935*0fca6ea1SDimitry Andric if (!isa<BasicBlock>(U)) // Don't enumerate BB operand to BlockAddress. 936*0fca6ea1SDimitry Andric EnumerateValue(U); 93781ad6265SDimitry Andric if (auto *CE = dyn_cast<ConstantExpr>(C)) { 9385ffd83dbSDimitry Andric if (CE->getOpcode() == Instruction::ShuffleVector) 9395ffd83dbSDimitry Andric EnumerateValue(CE->getShuffleMaskForBitcode()); 94081ad6265SDimitry Andric if (auto *GEP = dyn_cast<GEPOperator>(CE)) 94181ad6265SDimitry Andric EnumerateType(GEP->getSourceElementType()); 94281ad6265SDimitry Andric } 9430b57cec5SDimitry Andric 9440b57cec5SDimitry Andric // Finally, add the value. Doing this could make the ValueID reference be 9450b57cec5SDimitry Andric // dangling, don't reuse it. 9460b57cec5SDimitry Andric Values.push_back(std::make_pair(V, 1U)); 9470b57cec5SDimitry Andric ValueMap[V] = Values.size(); 9480b57cec5SDimitry Andric return; 9490b57cec5SDimitry Andric } 9500b57cec5SDimitry Andric } 9510b57cec5SDimitry Andric 9520b57cec5SDimitry Andric // Add the value. 9530b57cec5SDimitry Andric Values.push_back(std::make_pair(V, 1U)); 9540b57cec5SDimitry Andric ValueID = Values.size(); 9550b57cec5SDimitry Andric } 9560b57cec5SDimitry Andric 9570b57cec5SDimitry Andric 9580b57cec5SDimitry Andric void ValueEnumerator::EnumerateType(Type *Ty) { 9590b57cec5SDimitry Andric unsigned *TypeID = &TypeMap[Ty]; 9600b57cec5SDimitry Andric 9610b57cec5SDimitry Andric // We've already seen this type. 9620b57cec5SDimitry Andric if (*TypeID) 9630b57cec5SDimitry Andric return; 9640b57cec5SDimitry Andric 9650b57cec5SDimitry Andric // If it is a non-anonymous struct, mark the type as being visited so that we 9660b57cec5SDimitry Andric // don't recursively visit it. This is safe because we allow forward 9670b57cec5SDimitry Andric // references of these in the bitcode reader. 9680b57cec5SDimitry Andric if (StructType *STy = dyn_cast<StructType>(Ty)) 9690b57cec5SDimitry Andric if (!STy->isLiteral()) 9700b57cec5SDimitry Andric *TypeID = ~0U; 9710b57cec5SDimitry Andric 9720b57cec5SDimitry Andric // Enumerate all of the subtypes before we enumerate this type. This ensures 9730b57cec5SDimitry Andric // that the type will be enumerated in an order that can be directly built. 9740b57cec5SDimitry Andric for (Type *SubTy : Ty->subtypes()) 9750b57cec5SDimitry Andric EnumerateType(SubTy); 9760b57cec5SDimitry Andric 9770b57cec5SDimitry Andric // Refresh the TypeID pointer in case the table rehashed. 9780b57cec5SDimitry Andric TypeID = &TypeMap[Ty]; 9790b57cec5SDimitry Andric 9800b57cec5SDimitry Andric // Check to see if we got the pointer another way. This can happen when 9810b57cec5SDimitry Andric // enumerating recursive types that hit the base case deeper than they start. 9820b57cec5SDimitry Andric // 9830b57cec5SDimitry Andric // If this is actually a struct that we are treating as forward ref'able, 9840b57cec5SDimitry Andric // then emit the definition now that all of its contents are available. 9850b57cec5SDimitry Andric if (*TypeID && *TypeID != ~0U) 9860b57cec5SDimitry Andric return; 9870b57cec5SDimitry Andric 9880b57cec5SDimitry Andric // Add this type now that its contents are all happily enumerated. 9890b57cec5SDimitry Andric Types.push_back(Ty); 9900b57cec5SDimitry Andric 9910b57cec5SDimitry Andric *TypeID = Types.size(); 9920b57cec5SDimitry Andric } 9930b57cec5SDimitry Andric 9940b57cec5SDimitry Andric // Enumerate the types for the specified value. If the value is a constant, 9950b57cec5SDimitry Andric // walk through it, enumerating the types of the constant. 9960b57cec5SDimitry Andric void ValueEnumerator::EnumerateOperandType(const Value *V) { 9970b57cec5SDimitry Andric EnumerateType(V->getType()); 9980b57cec5SDimitry Andric 9990b57cec5SDimitry Andric assert(!isa<MetadataAsValue>(V) && "Unexpected metadata operand"); 10000b57cec5SDimitry Andric 10010b57cec5SDimitry Andric const Constant *C = dyn_cast<Constant>(V); 10020b57cec5SDimitry Andric if (!C) 10030b57cec5SDimitry Andric return; 10040b57cec5SDimitry Andric 10050b57cec5SDimitry Andric // If this constant is already enumerated, ignore it, we know its type must 10060b57cec5SDimitry Andric // be enumerated. 10070b57cec5SDimitry Andric if (ValueMap.count(C)) 10080b57cec5SDimitry Andric return; 10090b57cec5SDimitry Andric 10100b57cec5SDimitry Andric // This constant may have operands, make sure to enumerate the types in 10110b57cec5SDimitry Andric // them. 10120b57cec5SDimitry Andric for (const Value *Op : C->operands()) { 10130b57cec5SDimitry Andric // Don't enumerate basic blocks here, this happens as operands to 10140b57cec5SDimitry Andric // blockaddress. 10150b57cec5SDimitry Andric if (isa<BasicBlock>(Op)) 10160b57cec5SDimitry Andric continue; 10170b57cec5SDimitry Andric 10180b57cec5SDimitry Andric EnumerateOperandType(Op); 10190b57cec5SDimitry Andric } 1020fe6060f1SDimitry Andric if (auto *CE = dyn_cast<ConstantExpr>(C)) { 10215ffd83dbSDimitry Andric if (CE->getOpcode() == Instruction::ShuffleVector) 10225ffd83dbSDimitry Andric EnumerateOperandType(CE->getShuffleMaskForBitcode()); 1023fe6060f1SDimitry Andric if (CE->getOpcode() == Instruction::GetElementPtr) 1024fe6060f1SDimitry Andric EnumerateType(cast<GEPOperator>(CE)->getSourceElementType()); 1025fe6060f1SDimitry Andric } 10260b57cec5SDimitry Andric } 10270b57cec5SDimitry Andric 10280b57cec5SDimitry Andric void ValueEnumerator::EnumerateAttributes(AttributeList PAL) { 10290b57cec5SDimitry Andric if (PAL.isEmpty()) return; // null is always 0. 10300b57cec5SDimitry Andric 10310b57cec5SDimitry Andric // Do a lookup. 10320b57cec5SDimitry Andric unsigned &Entry = AttributeListMap[PAL]; 10330b57cec5SDimitry Andric if (Entry == 0) { 10340b57cec5SDimitry Andric // Never saw this before, add it. 10350b57cec5SDimitry Andric AttributeLists.push_back(PAL); 10360b57cec5SDimitry Andric Entry = AttributeLists.size(); 10370b57cec5SDimitry Andric } 10380b57cec5SDimitry Andric 10390b57cec5SDimitry Andric // Do lookups for all attribute groups. 1040349cc55cSDimitry Andric for (unsigned i : PAL.indexes()) { 10410b57cec5SDimitry Andric AttributeSet AS = PAL.getAttributes(i); 10420b57cec5SDimitry Andric if (!AS.hasAttributes()) 10430b57cec5SDimitry Andric continue; 10440b57cec5SDimitry Andric IndexAndAttrSet Pair = {i, AS}; 10450b57cec5SDimitry Andric unsigned &Entry = AttributeGroupMap[Pair]; 10460b57cec5SDimitry Andric if (Entry == 0) { 10470b57cec5SDimitry Andric AttributeGroups.push_back(Pair); 10480b57cec5SDimitry Andric Entry = AttributeGroups.size(); 1049fe6060f1SDimitry Andric 1050fe6060f1SDimitry Andric for (Attribute Attr : AS) { 1051fe6060f1SDimitry Andric if (Attr.isTypeAttribute()) 1052fe6060f1SDimitry Andric EnumerateType(Attr.getValueAsType()); 1053fe6060f1SDimitry Andric } 10540b57cec5SDimitry Andric } 10550b57cec5SDimitry Andric } 10560b57cec5SDimitry Andric } 10570b57cec5SDimitry Andric 10580b57cec5SDimitry Andric void ValueEnumerator::incorporateFunction(const Function &F) { 10590b57cec5SDimitry Andric InstructionCount = 0; 10600b57cec5SDimitry Andric NumModuleValues = Values.size(); 10610b57cec5SDimitry Andric 10620b57cec5SDimitry Andric // Add global metadata to the function block. This doesn't include 10630b57cec5SDimitry Andric // LocalAsMetadata. 10640b57cec5SDimitry Andric incorporateFunctionMetadata(F); 10650b57cec5SDimitry Andric 10660b57cec5SDimitry Andric // Adding function arguments to the value table. 10670b57cec5SDimitry Andric for (const auto &I : F.args()) { 10680b57cec5SDimitry Andric EnumerateValue(&I); 10690b57cec5SDimitry Andric if (I.hasAttribute(Attribute::ByVal)) 10700b57cec5SDimitry Andric EnumerateType(I.getParamByValType()); 1071e8d8bef9SDimitry Andric else if (I.hasAttribute(Attribute::StructRet)) 1072e8d8bef9SDimitry Andric EnumerateType(I.getParamStructRetType()); 1073fe6060f1SDimitry Andric else if (I.hasAttribute(Attribute::ByRef)) 1074fe6060f1SDimitry Andric EnumerateType(I.getParamByRefType()); 10750b57cec5SDimitry Andric } 10760b57cec5SDimitry Andric FirstFuncConstantID = Values.size(); 10770b57cec5SDimitry Andric 10780b57cec5SDimitry Andric // Add all function-level constants to the value table. 10790b57cec5SDimitry Andric for (const BasicBlock &BB : F) { 10805ffd83dbSDimitry Andric for (const Instruction &I : BB) { 10810b57cec5SDimitry Andric for (const Use &OI : I.operands()) { 10820b57cec5SDimitry Andric if ((isa<Constant>(OI) && !isa<GlobalValue>(OI)) || isa<InlineAsm>(OI)) 10830b57cec5SDimitry Andric EnumerateValue(OI); 10840b57cec5SDimitry Andric } 10855ffd83dbSDimitry Andric if (auto *SVI = dyn_cast<ShuffleVectorInst>(&I)) 10865ffd83dbSDimitry Andric EnumerateValue(SVI->getShuffleMaskForBitcode()); 10875ffd83dbSDimitry Andric } 10880b57cec5SDimitry Andric BasicBlocks.push_back(&BB); 10890b57cec5SDimitry Andric ValueMap[&BB] = BasicBlocks.size(); 10900b57cec5SDimitry Andric } 10910b57cec5SDimitry Andric 10920b57cec5SDimitry Andric // Optimize the constant layout. 10930b57cec5SDimitry Andric OptimizeConstants(FirstFuncConstantID, Values.size()); 10940b57cec5SDimitry Andric 10950b57cec5SDimitry Andric // Add the function's parameter attributes so they are available for use in 10960b57cec5SDimitry Andric // the function's instruction. 10970b57cec5SDimitry Andric EnumerateAttributes(F.getAttributes()); 10980b57cec5SDimitry Andric 10990b57cec5SDimitry Andric FirstInstID = Values.size(); 11000b57cec5SDimitry Andric 11010b57cec5SDimitry Andric SmallVector<LocalAsMetadata *, 8> FnLocalMDVector; 1102fe6060f1SDimitry Andric SmallVector<DIArgList *, 8> ArgListMDVector; 1103*0fca6ea1SDimitry Andric 1104*0fca6ea1SDimitry Andric auto AddFnLocalMetadata = [&](Metadata *MD) { 1105*0fca6ea1SDimitry Andric if (!MD) 1106*0fca6ea1SDimitry Andric return; 1107*0fca6ea1SDimitry Andric if (auto *Local = dyn_cast<LocalAsMetadata>(MD)) { 11080b57cec5SDimitry Andric // Enumerate metadata after the instructions they might refer to. 11090b57cec5SDimitry Andric FnLocalMDVector.push_back(Local); 1110*0fca6ea1SDimitry Andric } else if (auto *ArgList = dyn_cast<DIArgList>(MD)) { 1111fe6060f1SDimitry Andric ArgListMDVector.push_back(ArgList); 1112fe6060f1SDimitry Andric for (ValueAsMetadata *VMD : ArgList->getArgs()) { 1113fe6060f1SDimitry Andric if (auto *Local = dyn_cast<LocalAsMetadata>(VMD)) { 1114fe6060f1SDimitry Andric // Enumerate metadata after the instructions they might refer 1115fe6060f1SDimitry Andric // to. 1116fe6060f1SDimitry Andric FnLocalMDVector.push_back(Local); 1117fe6060f1SDimitry Andric } 1118fe6060f1SDimitry Andric } 1119fe6060f1SDimitry Andric } 1120*0fca6ea1SDimitry Andric }; 11210b57cec5SDimitry Andric 1122*0fca6ea1SDimitry Andric // Add all of the instructions. 1123*0fca6ea1SDimitry Andric for (const BasicBlock &BB : F) { 1124*0fca6ea1SDimitry Andric for (const Instruction &I : BB) { 1125*0fca6ea1SDimitry Andric for (const Use &OI : I.operands()) { 1126*0fca6ea1SDimitry Andric if (auto *MD = dyn_cast<MetadataAsValue>(&OI)) 1127*0fca6ea1SDimitry Andric AddFnLocalMetadata(MD->getMetadata()); 1128*0fca6ea1SDimitry Andric } 1129*0fca6ea1SDimitry Andric /// RemoveDIs: Add non-instruction function-local metadata uses. 1130*0fca6ea1SDimitry Andric for (DbgVariableRecord &DVR : filterDbgVars(I.getDbgRecordRange())) { 1131*0fca6ea1SDimitry Andric assert(DVR.getRawLocation() && 1132*0fca6ea1SDimitry Andric "DbgVariableRecord location unexpectedly null"); 1133*0fca6ea1SDimitry Andric AddFnLocalMetadata(DVR.getRawLocation()); 1134*0fca6ea1SDimitry Andric if (DVR.isDbgAssign()) { 1135*0fca6ea1SDimitry Andric assert(DVR.getRawAddress() && 1136*0fca6ea1SDimitry Andric "DbgVariableRecord location unexpectedly null"); 1137*0fca6ea1SDimitry Andric AddFnLocalMetadata(DVR.getRawAddress()); 1138*0fca6ea1SDimitry Andric } 1139*0fca6ea1SDimitry Andric } 11400b57cec5SDimitry Andric if (!I.getType()->isVoidTy()) 11410b57cec5SDimitry Andric EnumerateValue(&I); 11420b57cec5SDimitry Andric } 11430b57cec5SDimitry Andric } 11440b57cec5SDimitry Andric 11450b57cec5SDimitry Andric // Add all of the function-local metadata. 1146*0fca6ea1SDimitry Andric for (const LocalAsMetadata *Local : FnLocalMDVector) { 11470b57cec5SDimitry Andric // At this point, every local values have been incorporated, we shouldn't 11480b57cec5SDimitry Andric // have a metadata operand that references a value that hasn't been seen. 1149*0fca6ea1SDimitry Andric assert(ValueMap.count(Local->getValue()) && 11500b57cec5SDimitry Andric "Missing value for metadata operand"); 1151*0fca6ea1SDimitry Andric EnumerateFunctionLocalMetadata(F, Local); 11520b57cec5SDimitry Andric } 1153fe6060f1SDimitry Andric // DIArgList entries must come after function-local metadata, as it is not 1154fe6060f1SDimitry Andric // possible to forward-reference them. 1155fe6060f1SDimitry Andric for (const DIArgList *ArgList : ArgListMDVector) 1156fe6060f1SDimitry Andric EnumerateFunctionLocalListMetadata(F, ArgList); 11570b57cec5SDimitry Andric } 11580b57cec5SDimitry Andric 11590b57cec5SDimitry Andric void ValueEnumerator::purgeFunction() { 11600b57cec5SDimitry Andric /// Remove purged values from the ValueMap. 1161*0fca6ea1SDimitry Andric for (const auto &V : llvm::drop_begin(Values, NumModuleValues)) 1162*0fca6ea1SDimitry Andric ValueMap.erase(V.first); 11637a6dacacSDimitry Andric for (const Metadata *MD : llvm::drop_begin(MDs, NumModuleMDs)) 11647a6dacacSDimitry Andric MetadataMap.erase(MD); 11654824e7fdSDimitry Andric for (const BasicBlock *BB : BasicBlocks) 11664824e7fdSDimitry Andric ValueMap.erase(BB); 11670b57cec5SDimitry Andric 11680b57cec5SDimitry Andric Values.resize(NumModuleValues); 11690b57cec5SDimitry Andric MDs.resize(NumModuleMDs); 11700b57cec5SDimitry Andric BasicBlocks.clear(); 11710b57cec5SDimitry Andric NumMDStrings = 0; 11720b57cec5SDimitry Andric } 11730b57cec5SDimitry Andric 11740b57cec5SDimitry Andric static void IncorporateFunctionInfoGlobalBBIDs(const Function *F, 11750b57cec5SDimitry Andric DenseMap<const BasicBlock*, unsigned> &IDMap) { 11760b57cec5SDimitry Andric unsigned Counter = 0; 11770b57cec5SDimitry Andric for (const BasicBlock &BB : *F) 11780b57cec5SDimitry Andric IDMap[&BB] = ++Counter; 11790b57cec5SDimitry Andric } 11800b57cec5SDimitry Andric 11810b57cec5SDimitry Andric /// getGlobalBasicBlockID - This returns the function-specific ID for the 11820b57cec5SDimitry Andric /// specified basic block. This is relatively expensive information, so it 11830b57cec5SDimitry Andric /// should only be used by rare constructs such as address-of-label. 11840b57cec5SDimitry Andric unsigned ValueEnumerator::getGlobalBasicBlockID(const BasicBlock *BB) const { 11850b57cec5SDimitry Andric unsigned &Idx = GlobalBasicBlockIDs[BB]; 11860b57cec5SDimitry Andric if (Idx != 0) 11870b57cec5SDimitry Andric return Idx-1; 11880b57cec5SDimitry Andric 11890b57cec5SDimitry Andric IncorporateFunctionInfoGlobalBBIDs(BB->getParent(), GlobalBasicBlockIDs); 11900b57cec5SDimitry Andric return getGlobalBasicBlockID(BB); 11910b57cec5SDimitry Andric } 11920b57cec5SDimitry Andric 1193*0fca6ea1SDimitry Andric uint64_t ValueEnumerator::computeBitsRequiredForTypeIndices() const { 11940b57cec5SDimitry Andric return Log2_32_Ceil(getTypes().size() + 1); 11950b57cec5SDimitry Andric } 1196