28 return V.first->getType()->isIntOrIntVectorTy();
32 ValueEnumerator::ValueEnumerator(
const Module *M) {
50 unsigned FirstConstant = Values.size();
55 if (
I->hasInitializer())
56 EnumerateValue(
I->getInitializer());
61 EnumerateValue(
I->getAliasee());
65 if (
I->hasPrefixData())
66 EnumerateValue(
I->getPrefixData());
71 EnumerateNamedMetadata(M);
80 EnumerateType(
I->getType());
86 if (
MDNode *MD = dyn_cast<MDNode>(*OI))
87 if (MD->isFunctionLocal() && MD->getFunction())
90 EnumerateOperandType(*OI);
92 EnumerateType(
I->getType());
93 if (
const CallInst *CI = dyn_cast<CallInst>(
I))
94 EnumerateAttributes(CI->getAttributes());
95 else if (
const InvokeInst *II = dyn_cast<InvokeInst>(
I))
96 EnumerateAttributes(II->getAttributes());
100 I->getAllMetadataOtherThanDebugLoc(MDs);
101 for (
unsigned i = 0, e = MDs.
size(); i != e; ++i)
102 EnumerateMetadata(MDs[i].second);
104 if (!
I->getDebugLoc().isUnknown()) {
106 I->getDebugLoc().getScopeAndInlinedAt(Scope, IA,
I->getContext());
107 if (Scope) EnumerateMetadata(Scope);
108 if (IA) EnumerateMetadata(IA);
114 OptimizeConstants(FirstConstant, Values.size());
119 assert(I != InstructionMap.
end() &&
"Instruction is not mapped!");
124 InstructionMap[
I] = InstructionCount++;
128 if (isa<MDNode>(V) || isa<MDString>(V)) {
130 assert(I != MDValueMap.
end() &&
"Value not in slotcalculator!");
135 assert(I !=
ValueMap.
end() &&
"Value not in slotcalculator!");
147 const char *
Name)
const {
149 OS <<
"Map Name: " << Name <<
"\n";
150 OS <<
"Size: " << Map.
size() <<
"\n";
152 E = Map.
end();
I != E; ++
I) {
154 const Value *V =
I->first;
156 OS <<
"Value: " << V->
getName();
158 OS <<
"Value: [null]\n";
167 OS <<
" " << (*UI)->getName();
178 struct CstSortPredicate {
181 bool operator()(
const std::pair<const Value*, unsigned> &LHS,
182 const std::pair<const Value*, unsigned> &RHS) {
184 if (LHS.first->getType() != RHS.first->getType())
185 return VE.getTypeID(LHS.first->getType()) <
186 VE.getTypeID(RHS.first->getType());
188 return LHS.second > RHS.second;
194 void ValueEnumerator::OptimizeConstants(
unsigned CstStart,
unsigned CstEnd) {
195 if (CstStart == CstEnd || CstStart+1 == CstEnd)
return;
197 CstSortPredicate
P(*
this);
198 std::stable_sort(Values.begin()+CstStart, Values.begin()+CstEnd,
P);
203 std::partition(Values.begin()+CstStart, Values.begin()+CstEnd,
207 for (; CstStart != CstEnd; ++CstStart)
208 ValueMap[Values[CstStart].first] = CstStart+1;
214 void ValueEnumerator::EnumerateValueSymbolTable(
const ValueSymbolTable &VST) {
217 EnumerateValue(VI->getValue());
222 void ValueEnumerator::EnumerateNamedMetadata(
const Module *M) {
225 EnumerateNamedMDNode(
I);
228 void ValueEnumerator::EnumerateNamedMDNode(
const NamedMDNode *MD) {
235 void ValueEnumerator::EnumerateMDNodeOperands(
const MDNode *
N) {
238 if (isa<MDNode>(V) || isa<MDString>(V))
239 EnumerateMetadata(V);
240 else if (!isa<Instruction>(V) && !isa<Argument>(V))
247 void ValueEnumerator::EnumerateMetadata(
const Value *MD) {
248 assert((isa<MDNode>(MD) || isa<MDString>(MD)) &&
"Invalid metadata kind");
257 if (N && N->isFunctionLocal() && N->getFunction()) {
258 EnumerateMDNodeOperands(N);
263 unsigned &MDValueID = MDValueMap[MD];
266 MDValues[MDValueID-1].second++;
269 MDValues.push_back(std::make_pair(MD, 1U));
270 MDValueID = MDValues.size();
274 EnumerateMDNodeOperands(N);
279 void ValueEnumerator::EnumerateFunctionLocalMetadata(
const MDNode *N) {
281 "EnumerateFunctionLocalMetadata called on non-function-local mdnode!");
287 unsigned &MDValueID = MDValueMap[
N];
290 MDValues[MDValueID-1].second++;
293 MDValues.push_back(std::make_pair(N, 1U));
294 MDValueID = MDValues.size();
300 if (
MDNode *O = dyn_cast<MDNode>(V)) {
301 if (O->isFunctionLocal() && O->getFunction())
302 EnumerateFunctionLocalMetadata(O);
303 }
else if (isa<Instruction>(V) || isa<Argument>(V))
308 FunctionLocalMDs.push_back(N);
311 void ValueEnumerator::EnumerateValue(
const Value *V) {
313 assert(!isa<MDNode>(V) && !isa<MDString>(V) &&
314 "EnumerateValue doesn't handle Metadata!");
320 Values[ValueID-1].second++;
327 if (
const Constant *
C = dyn_cast<Constant>(V)) {
328 if (isa<GlobalValue>(
C)) {
330 }
else if (
C->getNumOperands()) {
341 if (!isa<BasicBlock>(*
I))
346 Values.push_back(std::make_pair(V, 1U));
353 Values.push_back(std::make_pair(V, 1U));
354 ValueID = Values.size();
358 void ValueEnumerator::EnumerateType(
Type *Ty) {
359 unsigned *
TypeID = &TypeMap[Ty];
368 if (
StructType *STy = dyn_cast<StructType>(Ty))
369 if (!STy->isLiteral())
379 TypeID = &TypeMap[Ty];
386 if (*TypeID && *TypeID != ~0U)
392 *TypeID = Types.size();
397 void ValueEnumerator::EnumerateOperandType(
const Value *V) {
400 if (
const Constant *
C = dyn_cast<Constant>(V)) {
407 for (
unsigned i = 0, e =
C->getNumOperands(); i != e; ++i) {
408 const Value *Op =
C->getOperand(i);
412 if (isa<BasicBlock>(Op))
continue;
414 EnumerateOperandType(Op);
417 if (
const MDNode *N = dyn_cast<MDNode>(V)) {
420 EnumerateOperandType(Elem);
422 }
else if (isa<MDString>(V) || isa<MDNode>(V))
423 EnumerateMetadata(V);
426 void ValueEnumerator::EnumerateAttributes(
AttributeSet PAL) {
430 unsigned &Entry = AttributeMap[PAL];
438 for (
unsigned i = 0, e = PAL.
getNumSlots(); i != e; ++i) {
440 unsigned &Entry = AttributeGroupMap[AS];
442 AttributeGroups.push_back(AS);
443 Entry = AttributeGroups.size();
449 InstructionCount = 0;
450 NumModuleValues = Values.size();
451 NumModuleMDValues = MDValues.size();
458 FirstFuncConstantID = Values.size();
465 if ((isa<Constant>(*OI) && !isa<GlobalValue>(*OI)) ||
469 BasicBlocks.push_back(BB);
474 OptimizeConstants(FirstFuncConstantID, Values.size());
480 FirstInstID = Values.size();
488 if (
MDNode *MD = dyn_cast<MDNode>(*OI))
489 if (MD->isFunctionLocal() && MD->getFunction())
495 I->getAllMetadataOtherThanDebugLoc(MDs);
496 for (
unsigned i = 0, e = MDs.
size(); i != e; ++i) {
497 MDNode *N = MDs[i].second;
502 if (!
I->getType()->isVoidTy())
508 for (
unsigned i = 0, e = FnLocalMDVector.
size(); i != e; ++i)
509 EnumerateFunctionLocalMetadata(FnLocalMDVector[i]);
514 for (
unsigned i = NumModuleValues, e = Values.size(); i != e; ++i)
516 for (
unsigned i = NumModuleMDValues, e = MDValues.size(); i != e; ++i)
517 MDValueMap.
erase(MDValues[i].first);
518 for (
unsigned i = 0, e = BasicBlocks.size(); i != e; ++i)
521 Values.resize(NumModuleValues);
522 MDValues.resize(NumModuleMDValues);
524 FunctionLocalMDs.clear();
529 unsigned Counter = 0;
531 IDMap[BB] = ++Counter;
538 unsigned &Idx = GlobalBasicBlockIDs[BB];
void push_back(const T &Elt)
const ValueSymbolTable & getValueSymbolTable() const
Get the symbol table of global variable and function identifiers.
iterator begin()
Get an iterator that from the beginning of the symbol table.
The main container class for the LLVM Intermediate Representation.
enable_if_c<!is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type >::type dyn_cast(const Y &Val)
unsigned getNumOperands() const
getNumOperands - Return number of MDNode operands.
named_metadata_iterator named_metadata_end()
void setInstructionID(const Instruction *I)
const Function * getParent() const
Return the enclosing method, or null if none.
MDNode - a tuple of other values.
subtype_iterator subtype_end() const
StringRef getName() const
Value * getOperand(unsigned i) const LLVM_READONLY
getOperand - Return specified operand.
void incorporateFunction(const Function &F)
static bool isIntOrIntVectorValue(const std::pair< const Value *, unsigned > &V)
void dump() const
dump - Support for debugging, callable in GDB: V->dump()
global_iterator global_begin()
bool count(const KeyT &Val) const
count - Return true if the specified key is in the map.
unsigned getInstructionID(const Instruction *I) const
unsigned getValueID(const Value *V) const
iterator find(const KeyT &Val)
iterator end()
Get an iterator to the end of the symbol table.
const std::vector< AttributeSet > & getAttributes() const
unsigned getNumSlots() const
Return the number of slots used in this attribute list. This is the number of arguments that have an ...
alias_iterator alias_end()
LLVM Basic Block Representation.
AttributeSet getSlotAttributes(unsigned Slot) const
Return the attributes at the given slot.
LLVM Constant Representation.
static Type * getVoidTy(LLVMContext &C)
MDNode * getOperand(unsigned i) const
getOperand - Return specified operand.
LLVMContext & getContext() const
All values hold a context through their type.
global_iterator global_end()
Type *const * subtype_iterator
bool erase(const KeyT &Val)
alias_iterator alias_begin()
raw_ostream & dbgs()
dbgs - Return a circular-buffered debug stream.
AttributeSet getAttributes() const
Return the attribute list for this Function.
bool isFunctionLocal() const
isFunctionLocal - Return whether MDNode is local to a function.
void print(raw_ostream &OS, const ValueMapType &Map, const char *Name) const
static void IncorporateFunctionInfoGlobalBBIDs(const Function *F, DenseMap< const BasicBlock *, unsigned > &IDMap)
unsigned getGlobalBasicBlockID(const BasicBlock *BB) const
LLVM Value Representation.
unsigned getNumOperands() const
getNumOperands - Return the number of NamedMDNode operands.
iterator find(const KeyT &Val)
bool isEmpty() const
Return true if there are no attributes.
const Function * getFunction() const
subtype_iterator subtype_begin() const
named_metadata_iterator named_metadata_begin()
bool erase(const KeyT &Val)
bool isVoidTy() const
isVoidTy - Return true if this is 'void'.