@@ -1029,6 +1029,36 @@ SILInstruction::MemoryBehavior SILInstruction::getMemoryBehavior() const {
10291029 MemoryBehavior::MayHaveSideEffects;
10301030 }
10311031
1032+ if (auto *li = dyn_cast<LoadInst>(this )) {
1033+ switch (li->getOwnershipQualifier ()) {
1034+ case LoadOwnershipQualifier::Unqualified:
1035+ case LoadOwnershipQualifier::Trivial:
1036+ return MemoryBehavior::MayRead;
1037+ case LoadOwnershipQualifier::Take:
1038+ // Take deinitializes the underlying memory. Until we separate notions of
1039+ // memory writing from deinitialization (since a take doesn't actually
1040+ // write to the memory), lets be conservative and treat it as may read
1041+ // write.
1042+ return MemoryBehavior::MayReadWrite;
1043+ case LoadOwnershipQualifier::Copy:
1044+ return MemoryBehavior::MayHaveSideEffects;
1045+ }
1046+ llvm_unreachable (" Covered switch isn't covered?!" );
1047+ }
1048+
1049+ if (auto *si = dyn_cast<StoreInst>(this )) {
1050+ switch (si->getOwnershipQualifier ()) {
1051+ case StoreOwnershipQualifier::Unqualified:
1052+ case StoreOwnershipQualifier::Trivial:
1053+ case StoreOwnershipQualifier::Init:
1054+ return MemoryBehavior::MayWrite;
1055+ case StoreOwnershipQualifier::Assign:
1056+ // For the release.
1057+ return MemoryBehavior::MayHaveSideEffects;
1058+ }
1059+ llvm_unreachable (" Covered switch isn't covered?!" );
1060+ }
1061+
10321062 switch (getKind ()) {
10331063#define FULL_INST (CLASS, TEXTUALNAME, PARENT, MEMBEHAVIOR, RELEASINGBEHAVIOR ) \
10341064 case SILInstructionKind::CLASS: \
@@ -1138,6 +1168,18 @@ bool SILInstruction::mayRelease() const {
11381168 }
11391169 return true ;
11401170 }
1171+ case SILInstructionKind::StoreInst:
1172+ switch (cast<StoreInst>(this )->getOwnershipQualifier ()) {
1173+ case StoreOwnershipQualifier::Unqualified:
1174+ case StoreOwnershipQualifier::Init:
1175+ case StoreOwnershipQualifier::Trivial:
1176+ return false ;
1177+ case StoreOwnershipQualifier::Assign:
1178+ // Assign destroys the old value that was in the memory location before we
1179+ // write the new value into the location.
1180+ return true ;
1181+ }
1182+ llvm_unreachable (" Covered switch isn't covered?!" );
11411183 }
11421184}
11431185
0 commit comments