[swift-dev] SIL proposal: remove multiple results from SILValue

Erik Eckstein eeckstein at apple.com
Fri Dec 4 11:51:12 CST 2015


> On Dec 4, 2015, at 9:34 AM, John McCall <rjmccall at apple.com> wrote:
> 
>> On Dec 4, 2015, at 9:06 AM, Erik Eckstein <eeckstein at apple.com> wrote:
>> Hi,
>> 
>> currently some instructions, like alloc_stack and alloc_box (I think they are the only ones) return 2 values. For this we have the "result number" in SILValue, e.g. %3#0, %3#1
>> 
>> We could represent the same by using a projection instruction, e.g.
>> 
>> %3 = alloc_stack $Type  // == the old %3#0
>> %4 = project_stack %1   // == the old %3#1
>> 
>> And actually we already have the project_box instruction.
>> 
>> This would simplify SILValues and many places in optimization passes/analysis. Yesterday I spent several hours to debug a problem where in some pass the wrong result number was used.
>> 
>> What do you think?
> 
> This would mean generating a lot of extra instructions for a lot of very common cases, like alloc_stack.

A quick grep on the optimized stdlib sil shows that we would need only about 5% more instructions. And probably a smaller fraction of more instruction-related memory, because the project_* instructions are small.
About compile time, I'm not sure. On the one hand we will have more instructions, on the other hand we would not have to mask out the ValueDef/ResultNumbers from SILValue every time we use it.
IMO this is a reasonable tradeoff for making the SIL simpler.

> 
> Was your bug related to the implicit conversion of a SILInstruction* -> SILValue that silently uses result 0?  I’ve been thinking for a while that we should make that conditional on the SILInstruction having exactly one result.

Some sort of: it was a value.getDef() which should just be the value.


> 
> John.



More information about the swift-dev mailing list