Uploaded image for project: 'Swift'
  1. Swift
  2. SR-13903

Make `ApplyInst` a `MultipleValueInstruction`

    XMLWordPrintable

    Details

      Description

      Forum question with context: https://forums.swift.org/t/make-applyinst-a-multiplevalueinstruction/42294


      SIL supports instructions that return multiple values (i.e. multiple result {{SILValue}}s).

      However, apply instructions don't return multiple values. Instead, they produce a single value, which may have a tuple type. This leads to much avoidable destructuring and restructuring of tuples, which complicates SIL transformations like autodiff:

      // example.swift
      @_silgen_name("foo")
      func foo() -> (Int, Int) {
        (0, 0)
      }
      
      @_silgen_name("bar")
      func bar() -> (Int, Int) {
        return foo()
      }
      
      $ swiftc -emit-silgen example.swift
      sil hidden [ossa] @bar : $@convention(thin) () -> (Int, Int) {
      bb0:
        %0 = function_ref @foo : $@convention(thin) () -> (Int, Int)
        %1 = apply %0() : $@convention(thin) () -> (Int, Int)
        (%2, %3) = destructure_tuple %1 : $(Int, Int) // this is not good
        %4 = tuple (%2 : $Int, %3 : $Int)
        return %4 : $(Int, Int)
      }
      

      Instead, we can change ApplyInst to inherit MultipleResultInstruction.

      Steps:

      1. Change definition: make ApplyInst inherit MultipleValueInstruction.

      Fix obvious compilation errors in the compiler codebase. Fix as many tests as possible.

      2. Update and fix ApplyInst users: SIL generation + parsing + verification + printing, analyses and transformations, IRGen.

        Attachments

          Activity

            People

            Assignee:
            sachinvas16 Sachin Vas
            Reporter:
            danzheng Dan Zheng
            Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

              Dates

              Created:
              Updated: