/// ProfileFunction - Creates a hash-code for the function which is the same /// for any two functions that will compare equal, without looking at the /// instructions inside the function. static unsigned ProfileFunction(const Function *F) { const FunctionType *FTy = F->getFunctionType(); FoldingSetNodeID ID; ID.AddInteger(F->size()); ID.AddInteger(F->getCallingConv()); ID.AddBoolean(F->hasGC()); ID.AddBoolean(FTy->isVarArg()); ID.AddInteger(FTy->getReturnType()->getTypeID()); for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i) ID.AddInteger(FTy->getParamType(i)->getTypeID()); return ID.ComputeHash(); }
/// FindNodeOrInsertPos - Look up the node specified by ID. If it exists, /// return it. If not, return the insertion token that will make insertion /// faster. FoldingSetImpl::Node *FoldingSetImpl::FindNodeOrInsertPos(const FoldingSetNodeID &ID, void *&InsertPos) { unsigned IDHash = ID.ComputeHash(); void **Bucket = GetBucketFor(IDHash, Buckets, NumBuckets); void *Probe = *Bucket; InsertPos = nullptr; FoldingSetNodeID TempID; while (Node *NodeInBucket = GetNextPtr(Probe)) { if (NodeEquals(NodeInBucket, ID, IDHash, TempID)) return NodeInBucket; TempID.clear(); Probe = NodeInBucket->getNextInBucket(); } // Didn't find the node, return null with the bucket as the InsertPos. InsertPos = Bucket; return nullptr; }
static void Profile(FoldingSetNodeID &ID, const AttributeWithIndex *Attr, unsigned NumAttrs) { for (unsigned i = 0; i != NumAttrs; ++i) ID.AddInteger(uint64_t(Attr[i].Attrs) << 32 | unsigned(Attr[i].Index)); }
void MDNode::Profile(FoldingSetNodeID &ID) const { for (unsigned i = 0, e = getNumOperands(); i != e; ++i) ID.AddPointer(getOperand(i)); }
void ARMConstantPoolValue::addSelectionDAGCSEId(FoldingSetNodeID &ID) { ID.AddInteger(LabelId); ID.AddInteger(PCAdjust); }
void ARMConstantPoolMBB::addSelectionDAGCSEId(FoldingSetNodeID &ID) { ID.AddPointer(MBB); ARMConstantPoolValue::addSelectionDAGCSEId(ID); }
void Pointer::Profile(FoldingSetNodeID &ID, const Type *Ty, const Value *Val) { ID.Add(Ty); ID.AddPointer(Val); }
/// Profile - Used to gather unique data for the abbreviation folding set. /// void DIEAbbrevData::Profile(FoldingSetNodeID &ID) const { ID.AddInteger(Attribute); ID.AddInteger(Form); }
/// Profile - Used to gather unique data for the abbreviation folding set. /// void DIEAbbrevData::Profile(FoldingSetNodeID &ID) const { // Explicitly cast to an integer type for which FoldingSetNodeID has // overloads. Otherwise MSVC 2010 thinks this call is ambiguous. ID.AddInteger(unsigned(Attribute)); ID.AddInteger(unsigned(Form)); }
void SystemZConstantPoolValue::addSelectionDAGCSEId(FoldingSetNodeID &ID) { ID.AddPointer(GV); ID.AddInteger(Modifier); }
void ARMConstantPoolConstant::addSelectionDAGCSEId(FoldingSetNodeID &ID) { ID.AddPointer(CVal); for (const auto *GV : GVars) ID.AddPointer(GV); ARMConstantPoolValue::addSelectionDAGCSEId(ID); }
unsigned DenseMapInfo<DebugLoc>::getHashValue(const DebugLoc &Key) { FoldingSetNodeID ID; ID.AddInteger(Key.LineCol); ID.AddInteger(Key.ScopeIdx); return ID.ComputeHash(); }
void MDNode::Profile(FoldingSetNodeID &ID) const { for (unsigned i = 0, e = getNumOperands(); i != e; ++i) ID.AddPointer(getOperand(i)); ID.AddBoolean(isFunctionLocal()); }
void ConstantBool::Profile(FoldingSetNodeID &ID, const Type *Ty, const bool &Val) { ID.Add(Ty); ID.AddBoolean(Val); }
void ConstantInt::Profile(FoldingSetNodeID &ID, const Type *Ty, const int &Val) { ID.Add(Ty); ID.AddInteger(Val); }
static void Profile(FoldingSetNodeID &ID, ArrayRef<AttributeWithIndex> Attrs){ for (unsigned i = 0, e = Attrs.size(); i != e; ++i) { ID.AddInteger(Attrs[i].Attrs.Raw()); ID.AddInteger(Attrs[i].Index); } }
// Replace value from this node's operand list. void MDNode::replaceOperand(MDNodeOperand *Op, Value *To) { Value *From = *Op; // If is possible that someone did GV->RAUW(inst), replacing a global variable // with an instruction or some other function-local object. If this is a // non-function-local MDNode, it can't point to a function-local object. // Handle this case by implicitly dropping the MDNode reference to null. // Likewise if the MDNode is function-local but for a different function. if (To && isFunctionLocalValue(To)) { if (!isFunctionLocal()) To = 0; else { const Function *F = getFunction(); const Function *FV = getFunctionForValue(To); // Metadata can be function-local without having an associated function. // So only consider functions to have changed if non-null. if (F && FV && F != FV) To = 0; } } if (From == To) return; // Update the operand. Op->set(To); // If this node is already not being uniqued (because one of the operands // already went to null), then there is nothing else to do here. if (isNotUniqued()) return; LLVMContextImpl *pImpl = getType()->getContext().pImpl; // Remove "this" from the context map. FoldingSet doesn't have to reprofile // this node to remove it, so we don't care what state the operands are in. pImpl->MDNodeSet.RemoveNode(this); // If we are dropping an argument to null, we choose to not unique the MDNode // anymore. This commonly occurs during destruction, and uniquing these // brings little reuse. Also, this means we don't need to include // isFunctionLocal bits in FoldingSetNodeIDs for MDNodes. if (To == 0) { setIsNotUniqued(); return; } // Now that the node is out of the folding set, get ready to reinsert it. // First, check to see if another node with the same operands already exists // in the set. If so, then this node is redundant. FoldingSetNodeID ID; Profile(ID); void *InsertPoint; if (MDNode *N = pImpl->MDNodeSet.FindNodeOrInsertPos(ID, InsertPoint)) { replaceAllUsesWith(N); destroy(); return; } // Cache the operand hash. Hash = ID.ComputeHash(); // InsertPoint will have been set by the FindNodeOrInsertPos call. pImpl->MDNodeSet.InsertNode(this, InsertPoint); // If this MDValue was previously function-local but no longer is, clear // its function-local flag. if (isFunctionLocal() && !isFunctionLocalValue(To)) { bool isStillFunctionLocal = false; for (unsigned i = 0, e = getNumOperands(); i != e; ++i) { Value *V = getOperand(i); if (!V) continue; if (isFunctionLocalValue(V)) { isStillFunctionLocal = true; break; } } if (!isStillFunctionLocal) setValueSubclassData(getSubclassDataFromValue() & ~FunctionLocalBit); } }
void SuppressInlineDefensiveChecksVisitor::Profile(FoldingSetNodeID &ID) const { static int id = 0; ID.AddPointer(&id); ID.AddPointer(StartN); ID.Add(V); }
/// Profile - Used to gather unique data for the folding set. /// void DWLabel::Profile(FoldingSetNodeID &ID) const { ID.AddString(Tag); ID.AddInteger(Number); }
void ARMConstantPoolSymbol::addSelectionDAGCSEId(FoldingSetNodeID &ID) { ID.AddString(S); ARMConstantPoolValue::addSelectionDAGCSEId(ID); }
/// Profile - Gather unique data for the object. /// void MachineMemOperand::Profile(FoldingSetNodeID &ID) const { ID.AddInteger(Offset); ID.AddInteger(Size); ID.AddPointer(V); ID.AddInteger(Flags); }
void ConstantFloat::Profile(FoldingSetNodeID &ID, const Type *Ty, const float &Val) { ID.Add(Ty); ID.AddInteger((long)Val); }