On Oct 9, 2017, at 9:55 PM, Slava Pestov via swift-dev <swift-dev@swift.org> 
wrote:
>> On Oct 7, 2017, at 2:01 PM, Chris Lattner <clatt...@nondot.org> wrote:
>> Right.  If we ignore source compatibility for the moment, it seems clear 
>> that the best callee side representation for varargs is a borrowing array 
>> slice (like llvm::ArrayRef or UnsafeBufferPointer).  This provides the 
>> essential abstraction needed by varargs without forcing an onerous 
>> representation on the caller, and without implying any reference counting 
>> operations.  This would allow passing an Array, an ArraySlice, a 
>> StaticArray, or anything else with contiguous elements.
>> 
>>> What if I declare my vararg as shared:
>>> 
>>> func takesArgs(_ xs: shared Int…)
>> 
>> This seems like a great way to address the source compatibility issue: a 
>> normal varargs argument could be passed as an Array<T> for compatibility 
>> with existing source, and a “borrowed Int…” could be passed more 
>> efficiently, allowing folks to opt into that.
> 
> I talked about this with Joe today and he came up with an excellent idea.
> 
> We could still change the ABI for varargs so that at the SIL level, the 
> caller passes an UnsafePointer<T> to a stack allocated buffer together with 
> an element count, instead of a reference to the array. Then, as a 
> transitional step, we could have the callee just always first box the varargs 
> into a heap-allocated Swift.Array on entry into the function.

That makes perfect sense to me.  What are the tradeoffs vs passing an 
UnsafeBufferPointer?

> This has the advantage that it gives us a better ABI going forward without 
> impacting source compatibility. Then we can design “tear-off arrays” or 
> whatever we want to do there later, and stage the new behavior in with a new 
> keyword, -swift-version flag or some implementation that maintains perfect 
> backward compatibility with the current semantics.

+1.  I think the common case is to pass the array down the stack or immediately 
consume it (e.g. through a foreach loop), so the array should never have to be 
materialized in a the common case.

> Also, even without the language change, constructing the vararg array inside 
> the callee will theoretically allow the optimizer to optimize it better, 
> eliminating the heap allocation or performing scalar replacement on array 
> elements.

Yep.

> What do you think? It would be a great project for an external contributor 
> who is already familiar with the code base ;-)

That would be great.  I don’t expect to have time to do that myself, but I’d 
love to see it!  :-)

-Chris

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

Reply via email to