@@ -160,6 +160,11 @@ class AccessedStorage {
160160 64 - NumAccessedStorageBits,
161161 seenNestedConflict : 1 ,
162162 beginAccessIndex : 63 - NumAccessedStorageBits);
163+
164+ // Define data flow bits for use in the AccessEnforcementDom pass. Each
165+ // begin_access in the function is mapped to one instance of this subclass.
166+ SWIFT_INLINE_BITFIELD (DomAccessedStorage, AccessedStorage, 1 + 1 ,
167+ isInner : 1 , containsRead : 1 );
163168 } Bits;
164169
165170private:
@@ -190,6 +195,10 @@ class AccessedStorage {
190195
191196 Kind getKind () const { return static_cast <Kind>(Bits.AccessedStorage .Kind ); }
192197
198+ // Clear any bits reserved for subclass data. Useful for up-casting back to
199+ // the base class.
200+ void resetSubclassData () { initKind (getKind ()); }
201+
193202 SILValue getValue () const {
194203 assert (getKind () != Argument && getKind () != Global && getKind () != Class);
195204 return value;
@@ -215,6 +224,10 @@ class AccessedStorage {
215224 return objProj;
216225 }
217226
227+ // / Return true if the given storage objects have identical storage locations.
228+ // /
229+ // / This compares only the AccessedStorage base class bits, ignoring the
230+ // / subclass bits. It is used for hash lookup equality.
218231 bool hasIdenticalBase (const AccessedStorage &other) const {
219232 if (getKind () != other.getKind ())
220233 return false ;
@@ -233,7 +246,6 @@ class AccessedStorage {
233246 case Class:
234247 return objProj == other.objProj ;
235248 }
236- llvm_unreachable (" unhandled kind" );
237249 }
238250
239251 // / Return true if the storage is guaranteed local.
@@ -311,31 +323,6 @@ class AccessedStorage {
311323 bool operator !=(const AccessedStorage &) const = delete ;
312324};
313325
314- // / Return true if the given storage objects have identical storage locations.
315- // /
316- // / This compares only the AccessedStorage base class bits, ignoring the
317- // / subclass bits.
318- inline bool accessingIdenticalLocations (AccessedStorage LHS,
319- AccessedStorage RHS) {
320- if (LHS.getKind () != RHS.getKind ())
321- return false ;
322-
323- switch (LHS.getKind ()) {
324- case swift::AccessedStorage::Box:
325- case swift::AccessedStorage::Stack:
326- case swift::AccessedStorage::Nested:
327- case swift::AccessedStorage::Yield:
328- case swift::AccessedStorage::Unidentified:
329- return LHS.getValue () == RHS.getValue ();
330- case swift::AccessedStorage::Argument:
331- return LHS.getParamIndex () == RHS.getParamIndex ();
332- case swift::AccessedStorage::Global:
333- return LHS.getGlobal () == RHS.getGlobal ();
334- case swift::AccessedStorage::Class:
335- return LHS.getObjectProjection () == RHS.getObjectProjection ();
336- }
337- }
338-
339326template <class ImplTy , class ResultTy = void , typename ... ArgTys>
340327class AccessedStorageVisitor {
341328 ImplTy &asImpl () { return static_cast <ImplTy &>(*this ); }
@@ -396,7 +383,7 @@ template <> struct DenseMapInfo<swift::AccessedStorage> {
396383 }
397384
398385 static bool isEqual (swift::AccessedStorage LHS, swift::AccessedStorage RHS) {
399- return swift::accessingIdenticalLocations ( LHS, RHS);
386+ return LHS. hasIdenticalBase ( RHS);
400387 }
401388};
402389
0 commit comments