We currently always pass inout parameters indirectly, but it seems to me that 
for inout parameters that are of small trivial types like Int or CGSize, a 
value-result calling convention might always be preferable, and we might want 
to codify that in the stable ABI. Values of these types are likely to be SSAed, 
and the indirect convention forces memory traffic that would otherwise be 
unnecessary. On ARMv7 and ARM64, the argument and return register sets are the 
same, so a value-result convention is likely to be able to compile down to 
in-place operations on those registers, so it's a potential code size win too.

(Value-result is not a clear win for nontrivial types, since it forces a load 
and retain onto the outermost caller that inouts a value in memory, since we 
can't invalidate the memory during the inout call. The extra retain would 
potentially defeat COW optimization. We have primitives like 
`isUniquelyReferenced` that depend on mutable references being in memory too.)

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

Reply via email to