@@ -54,8 +54,12 @@ swift::createIncrementBefore(SILValue Ptr, SILInstruction *InsertPt) {
54
54
55
55
// If Ptr is refcounted itself, create the strong_retain and
56
56
// return.
57
- if (Ptr->getType ().isReferenceCounted (B.getModule ()))
58
- return B.createStrongRetain (Loc, Ptr, B.getDefaultAtomicity ());
57
+ if (Ptr->getType ().isReferenceCounted (B.getModule ())) {
58
+ if (Ptr->getType ().is <UnownedStorageType>())
59
+ return B.createUnownedRetain (Loc, Ptr, B.getDefaultAtomicity ());
60
+ else
61
+ return B.createStrongRetain (Loc, Ptr, B.getDefaultAtomicity ());
62
+ }
59
63
60
64
// Otherwise, create the retain_value.
61
65
return B.createRetainValue (Loc, Ptr, B.getDefaultAtomicity ());
@@ -74,8 +78,12 @@ swift::createDecrementBefore(SILValue Ptr, SILInstruction *InsertPt) {
74
78
auto Loc = RegularLocation (SourceLoc ());
75
79
76
80
// If Ptr has reference semantics itself, create a strong_release.
77
- if (Ptr->getType ().isReferenceCounted (B.getModule ()))
78
- return B.createStrongRelease (Loc, Ptr, B.getDefaultAtomicity ());
81
+ if (Ptr->getType ().isReferenceCounted (B.getModule ())) {
82
+ if (Ptr->getType ().is <UnownedStorageType>())
83
+ return B.createUnownedRelease (Loc, Ptr, B.getDefaultAtomicity ());
84
+ else
85
+ return B.createStrongRelease (Loc, Ptr, B.getDefaultAtomicity ());
86
+ }
79
87
80
88
// Otherwise create a release value.
81
89
return B.createReleaseValue (Loc, Ptr, B.getDefaultAtomicity ());
0 commit comments