> On Oct 10, 2016, at 6:23 PM, Joe Groff <jgr...@apple.com> wrote:
> 
> 
>> On Oct 7, 2016, at 11:10 PM, Andrew Trick via swift-dev 
>> <swift-dev@swift.org> wrote:
>> ** World 1: SSA @inout
>> 
>> Projecting an element produces a new SILValue. Does this SILValue have
>> it's own ownership associated with it's lifetime, or is it derived
>> from it's parent object by looking through projections?
>> 
>> Either way, projecting any subelement requires reconstructing the
>> entire aggregate in SIL, through all nesting levels. This will
>> generate a massive amount of SILValues. Superficially they all need
>> their own storage.
>> 
>> [We could claim that projections don't need storage, but that only
>> solves one side of the problem.]
>> 
>> [I argue that this actually obscures the producer/consumer
>> relationship, which is the opposite of the intention of moving to
>> SSA. Projecting subelements for mutation fundamentally doesn't make
>> sense. It does make sense to borrow a subelement (not for
>> mutation). It also makes sense to project a mutable storage
>> location. The natural way to project a storage location is by
>> projecting an address...]
> 
> I think there's a size threshold at which SSA @inout is manageable, and might 
> lead to overall better register-oriented code, if the aggregates can be 
> exploded into a small number of individual values. The cost of reconstructing 
> the aggregate could be mitigated somewhat by introducing 'insert' 
> instructions for aggregates to pair with the projection instructions, similar 
> to how LLVM has insert/extractelement. "%x = project_value %y.field; %x' = 
> transform(%x); %y' = insert %y.field, %x" isn't too terrible compared to the 
> address-oriented formulation. Tracking ownership state through projections 
> and insertions might tricky; haven't thought about that aspect.
> 
> -Joe

We would have to make sure SROA+mem2reg could still kick in. If that happens, I 
don’t think we need to worry about inout ownership semantics anymore. A 
struct_extract is then essentially a borrow. It’s parent’s lifetime needs to be 
guaranteed, but I don’t know if the subobject needs explicit scoping in SIL 
since there’s no inout scopes to worry about and nothing for the runtime to do 
when the scope ends .

(Incidentally, this would never happen to a CoW type that has a uniqueness 
check—to mutate a CoW type, it’s value needs to be in memory). 

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

Reply via email to