Ok I checked, in the version from my original email we have: callq _swift_retain
movq %rbx, %rdi callq __TF4main3barFVS_3FooT_ movq %rbx, %rdi callq _swift_release Which makes foo obviously non-uniquely referenced inside bar, preventing COW optimization. So it seems the optimizer somehow doesn't notice it's dead here and doesn't transfer ownership (?). On Fri, Apr 1, 2016 at 5:49 PM, Patrick Pijnappel < patrickpijnap...@gmail.com> wrote: > The modified version doesn't seem to change any of the results (on -O or > -Onone). Note that the problem is that it's *not* uniquely referenced > inside bar where it actually should be – that would mean that ownership is > currently not directly transferred right? > > On Fri, Apr 1, 2016 at 10:27 AM, Joe Groff <jgr...@apple.com> wrote: > >> >> > On Mar 31, 2016, at 4:21 PM, Joe Groff via swift-dev < >> swift-dev@swift.org> wrote: >> > >> >> >> >> On Mar 31, 2016, at 3:58 PM, Patrick Pijnappel via swift-dev < >> swift-dev@swift.org> wrote: >> >> >> >> In trying to implement a COW type, but I'm running into problems with >> isUniqueReferenced breaking in even fairly simple cases. For example (with >> -O) the code below prints "bar: false", commenting out the print in test() >> makes it print "bar: true", and removing the var parameter var foo: Foo and >> using var foo = foo instead breaks it again. Am I doing something wrong >> here? >> >> >> >> class FooStorage { var x: Int = 0 } >> >> >> >> struct Foo { var storage = FooStorage() } >> >> >> >> func bar(var foo: Foo) { >> >> print("bar: \(isUniquelyReferencedNonObjC(&foo.storage))") >> >> } >> >> >> >> func test() { >> >> var foo = Foo() >> >> print("test: \(isUniquelyReferencedNonObjC(&foo.storage))") >> >> bar(foo) >> >> } >> >> >> >> test() >> > >> > You're not doing anything wrong, this is just the ARC optimizer at >> work. `foo` inside `test` is dead after the call to `bar`, so ownership is >> transferred directly to `bar`'s parameter. >> >> If you want to ensure that `foo` remains alive despite this, you can use >> `withExtendedLifetime`: >> >> class FooStorage { var x: Int = 0 } >> >> struct Foo { var storage = FooStorage() } >> >> func bar(var foo: Foo) { >> print("bar: \(isUniquelyReferencedNonObjC(&foo.storage))") >> } >> >> func test() { >> var foo = Foo() >> print("test: \(isUniquelyReferencedNonObjC(&foo.storage))") >> withExtendedLifetime(foo) { >> bar(foo) >> } >> } >> >> -Joe > > >
_______________________________________________ swift-dev mailing list swift-dev@swift.org https://lists.swift.org/mailman/listinfo/swift-dev