@@ -1029,6 +1029,36 @@ SILInstruction::MemoryBehavior SILInstruction::getMemoryBehavior() const {
1029
1029
MemoryBehavior::MayHaveSideEffects;
1030
1030
}
1031
1031
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
+
1032
1062
switch (getKind ()) {
1033
1063
#define FULL_INST (CLASS, TEXTUALNAME, PARENT, MEMBEHAVIOR, RELEASINGBEHAVIOR ) \
1034
1064
case SILInstructionKind::CLASS: \
@@ -1138,6 +1168,18 @@ bool SILInstruction::mayRelease() const {
1138
1168
}
1139
1169
return true ;
1140
1170
}
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?!" );
1141
1183
}
1142
1184
}
1143
1185
0 commit comments