> On Oct 5, 2016, at 4:48 PM, Michael Gottesman <mgottes...@apple.com> wrote:
>> On Oct 5, 2016, at 4:40 PM, Michael Gottesman via swift-dev 
>> <swift-dev@swift.org <mailto:swift-dev@swift.org>> wrote:
>> 
>>> 
>>> On Oct 4, 2016, at 1:04 PM, John McCall <rjmcc...@apple.com 
>>> <mailto:rjmcc...@apple.com>> wrote:
>>> 
>>>> 
>>>> On Sep 30, 2016, at 11:54 PM, Michael Gottesman via swift-dev 
>>>> <swift-dev@swift.org <mailto:swift-dev@swift.org>> wrote:
>>>> 
>>>> The document attached below contains the first "Semantic ARC" mini 
>>>> proposal: the High Level ARC Memory Operations Proposal.
>>>> 
>>>> An html rendered version of this markdown document is available at the 
>>>> following URL:
>>>> 
>>>> https://gottesmm.github.io/proposals/high-level-arc-memory-operations.html 
>>>> <https://gottesmm.github.io/proposals/high-level-arc-memory-operations.html>
>>>> 
>>>> ----
>>>> 
>>>> # Summary
>>>> 
>>>> This document proposes:
>>>> 
>>>> 1. adding the `load_strong`, `store_strong` instructions to SIL. These can 
>>>> only
>>>>    be used with memory locations of `non-trivial` type.
>>> 
>>> I would really like to avoid using the word "strong" here.  Under the 
>>> current proposal, these instructions will be usable with arbitrary 
>>> non-trivial types, not just primitive class references.  Even if you think 
>>> of an aggregate that happens to contain one or more strong references as 
>>> some sort of aggregate strong reference (which is questionable but not 
>>> completely absurd), we already have loadable non-strong class references 
>>> that this operation would be usable with, like native unowned references.  
>>> "load_strong %0 : $*@sil_unowned T" as an operation yielding a scalar 
>>> "@sil_unowned T" is ridiculous, and it will only get more ridiculous when 
>>> we eventually allow this operation to work with types that are currently 
>>> address-only, like weak references.
>>> 
>>> Brainstorming:
>>> 
>>> Something like load_copy and store_copy would be a bit unfortunate, since 
>>> store_copy doesn't actually copy the source operand and we want to have a 
>>> load_copy [take].
>>> 
>>> load_value and store_value seem excessively generic.  It's not like 
>>> non-trivial types aren't values.
>>> 
>>> One question that comes to mind: do we actually need new instructions here 
>>> other than for staging purposes?  We don't actually need new instructions 
>>> for pseudo-linear SIL to work; we just need to say that we only enforce 
>>> pseudo-linearity for non-trivial types.
>>> 
>>> If we just want the instruction to be explicit about ownership so that we 
>>> can easily distinguish these cases, we can make the rule always explicit, 
>>> e.g.:
>>>   load [take] %0 : $*MyClass
>>>   load [copy] %0 : $*MyClass
>>>   load [trivial] %0 : $*Int
>>> 
>>>   store %0 to [initialization] %1 : $*MyClass
>>>   store %0 to [assignment] %1 : $*MyClass
>>>   store %0 to [trivial] %1 : $*Int
>>> 
>>> John.
>> 
>> The reason why I originally suggested to go the load_strong route is that we 
>> already have load_weak, load_unowned instructions. If I could add a 
>> load_strong instruction, then it would make sense to assign an engineer to 
>> do a pass over all 3 of these instructions and combine them into 1 load 
>> instruction. That is, first transform into a form amenable for 
>> canonicalization and then canonicalize all at once.
>> 
>> As you pointed out, both load_unowned and load_weak involve representation 
>> changes in type (for instance the change of weak pointers to Optional<T>). 
>> Such a change would be against the "spirit" of a load instruction to perform 
>> such representation changes versus ownership changes.
>> 
>> In terms of the properties that we actually want here, what is important is 
>> that we can verify that no non-trivially typed values are loaded in an 
>> unsafe unowned manner. That can be done also with ownership flags on 
>> load/store.
>> 
>> Does this sound reasonable:
>> 
>> 1. We introduce two enums that define memory ownership changes, one for load 
>> and one for store. Both of these enums will contain a [trivial] ownership.
>> 2. We enforce in the verifier that non-trivial types must have a non-trivial 
>> ownership modifier on any memory operations that they are involved in.
> 
> Sorry for not being explicit. I will not add new instructions, just 
> modifiers. Assuming that this is agreeable to you, I am going to prepare a 
> quick additional version of the proposal document.

That sounds great, thanks.

John.
_______________________________________________
swift-dev mailing list
swift-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-dev

Reply via email to