@@ -231,28 +231,36 @@ enum class OwnershipQualifiedKind {
231
231
Unqualified,
232
232
};
233
233
234
- } // end anonymous namespace
234
+ struct OwnershipQualifiedKindVisitor : SILInstructionVisitor<OwnershipQualifiedKindVisitor, OwnershipQualifiedKind> {
235
+
236
+ OwnershipQualifiedKind visitValueBase (ValueBase *V) {
237
+ return OwnershipQualifierKind::NotApplicable;
238
+ }
235
239
236
- static OwnershipQualifiedKind
237
- getOwnershipQualifiedKind (const SILInstruction &I) {
238
- switch (I.getKind ()) {
239
- case ValueKind::LoadInst:
240
- if (cast<LoadInst>(I).getOwnershipQualifier () ==
241
- LoadOwnershipQualifier::Unqualified)
240
+ #define QUALIFIED_INST (CLASS ) \
241
+ OwnershipQualifiedKind visit ## CLASS(CLASS *I) { \
242
+ return OwnershipQualifierKind::Qualified; \
243
+ }
244
+ QUALIFIED_INST (EndBorrowInst)
245
+ QUALIFIED_INST (LoadBorrowInst)
246
+ QUALIFIED_INST (CopyValueInst)
247
+ QUALIFIED_INST (DestroyValueInst)
248
+ #undef QUALIFIED_INST
249
+
250
+ OwnershipQualifierKind visitLoadInst (LoadInst *LI) {
251
+ if (LI->getOwnershipQualifier () == LoadOwnershipQualifier::Unqualified)
242
252
return OwnershipQualifiedKind::Unqualified;
243
253
return OwnershipQualifiedKind::Qualified;
244
- case ValueKind::StoreInst:
245
- if (cast<StoreInst>(I).getOwnershipQualifier () ==
246
- StoreOwnershipQualifier::Unqualified)
254
+ }
255
+
256
+ OwnershipQualifierKind visitStoreInst (StoreInst *SI) {
257
+ if (SI->getOwnershipQualifier () == StoreOwnershipQualifier::Unqualified)
247
258
return OwnershipQualifiedKind::Unqualified;
248
259
return OwnershipQualifiedKind::Qualified;
249
- case ValueKind::LoadBorrowInst:
250
- case ValueKind::EndBorrowInst:
251
- return OwnershipQualifiedKind::Qualified;
252
- default :
253
- return OwnershipQualifiedKind::NotApplicable;
254
260
}
255
- }
261
+ };
262
+
263
+ } // end anonymous namespace
256
264
257
265
bool FunctionOwnershipEvaluator::evaluate (const SILInstruction &I) {
258
266
assert (I.getFunction () == F.get () && " Can not evaluate function ownership "
@@ -265,7 +273,7 @@ bool FunctionOwnershipEvaluator::evaluate(const SILInstruction &I) {
265
273
if (!I.getModule ().getOptions ().EnableSILOwnership )
266
274
return true ;
267
275
268
- switch (getOwnershipQualifiedKind (I)) {
276
+ switch (OwnershipQualifiedKindVisitor (). visit (I)) {
269
277
case OwnershipQualifiedKind::Unqualified: {
270
278
// If we already know that the function has unqualified ownership, just
271
279
// return early.
0 commit comments