Skip to content

Commit e06db4a

Browse files
authored
Merge pull request #79825 from gottesmm/pr-07b2e4050930bb96f12c1c63c958545d4bc20cea
[sil] Add missing flag to SILDeclRef's hash and change SILDeclRef to use llvm::hash_combine instead of rolling its own hash combiner.
2 parents c7ddbee + 58ea40b commit e06db4a

File tree

1 file changed

+19
-20
lines changed

1 file changed

+19
-20
lines changed

include/swift/SIL/SILDeclRef.h

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -407,13 +407,6 @@ struct SILDeclRef {
407407
/// Return the expected linkage of this declaration.
408408
SILLinkage getLinkage(ForDefinition_t forDefinition) const;
409409

410-
/// Return the hash code for the SIL declaration.
411-
friend llvm::hash_code hash_value(const SILDeclRef &ref) {
412-
return llvm::hash_combine(
413-
ref.loc.getOpaqueValue(), static_cast<int>(ref.kind), ref.isForeign,
414-
ref.distributedThunk, ref.defaultArgIndex, ref.isAsyncLetClosure);
415-
}
416-
417410
bool operator==(SILDeclRef rhs) const {
418411
return loc.getOpaqueValue() == rhs.loc.getOpaqueValue() &&
419412
kind == rhs.kind && isForeign == rhs.isForeign &&
@@ -613,6 +606,24 @@ struct SILDeclRef {
613606

614607
bool hasAsync() const;
615608

609+
/// Return the hash code for the SIL declaration.
610+
friend llvm::hash_code hash_value(swift::SILDeclRef ref) {
611+
return llvm::hash_combine(
612+
llvm::hash_value(ref.loc.getOpaqueValue()),
613+
llvm::hash_value(unsigned(ref.kind)),
614+
llvm::hash_value(
615+
(ref.kind == swift::SILDeclRef::Kind::DefaultArgGenerator)
616+
? ref.defaultArgIndex
617+
: 0),
618+
llvm::hash_value(ref.isForeign),
619+
llvm::hash_value(ref.pointer.getOpaqueValue()),
620+
llvm::hash_value(ref.distributedThunk),
621+
llvm::hash_value(unsigned(ref.backDeploymentKind)),
622+
llvm::hash_value(ref.isKnownToBeLocal),
623+
llvm::hash_value(ref.isRuntimeAccessible),
624+
llvm::hash_value(ref.isAsyncLetClosure));
625+
}
626+
616627
private:
617628
friend struct llvm::DenseMapInfo<swift::SILDeclRef>;
618629
/// Produces a SILDeclRef from an opaque value.
@@ -660,19 +671,7 @@ template<> struct DenseMapInfo<swift::SILDeclRef> {
660671
nullptr);
661672
}
662673
static unsigned getHashValue(swift::SILDeclRef Val) {
663-
unsigned h1 = PointerInfo::getHashValue(Val.loc.getOpaqueValue());
664-
unsigned h2 = UnsignedInfo::getHashValue(unsigned(Val.kind));
665-
unsigned h3 = (Val.kind == Kind::DefaultArgGenerator)
666-
? UnsignedInfo::getHashValue(Val.defaultArgIndex)
667-
: 0;
668-
unsigned h4 = UnsignedInfo::getHashValue(Val.isForeign);
669-
unsigned h5 = PointerInfo::getHashValue(Val.pointer.getOpaqueValue());
670-
unsigned h6 = UnsignedInfo::getHashValue(Val.distributedThunk);
671-
unsigned h7 = UnsignedInfo::getHashValue(unsigned(Val.backDeploymentKind));
672-
unsigned h8 = UnsignedInfo::getHashValue(Val.isKnownToBeLocal);
673-
unsigned h9 = UnsignedInfo::getHashValue(Val.isRuntimeAccessible);
674-
return h1 ^ (h2 << 4) ^ (h3 << 9) ^ (h4 << 7) ^ (h5 << 11) ^ (h6 << 8) ^
675-
(h7 << 10) ^ (h8 << 13) ^ (h9 << 15);
674+
return hash_value(Val);
676675
}
677676
static bool isEqual(swift::SILDeclRef const &LHS,
678677
swift::SILDeclRef const &RHS) {

0 commit comments

Comments
 (0)