blob: 7fdf5a2cba7787a5718fb47932ffe7ba88fd185d [file] [log] [blame]
// RUN: %target-sil-opt -enable-sil-verify-all %s -devirtualizer | %FileCheck %s
sil_stage canonical
import Builtin
import Swift
/*
class Foo {
var m_val : Int32
init(x : Int32) { m_val = x }
func get() -> Int32 {return m_val}
}
func test_me(x : Int32) -> Foo { return Foo(x) }
func main() { print(test_me(3).get()) } */
class Foo {
var m_val: Int32
init(x: Int32)
func get() -> Int32
}
//CHECK: _TF4main4mainFT_T_
//CHECK: function_ref @_TFC4main3Foo3getfS0_FT_Si
//CHECK: return
sil @_TF4main4mainFT_T_ : $@convention(thin) () -> () {
bb0:
// function_ref swift
%0 = function_ref @_Ts5printFT3valSi_T_ : $@convention(thin) (Int32) -> () // user: %8
%1 = integer_literal $Builtin.Int32, 3 // user: %2
%2 = struct $Int32 (%1 : $Builtin.Int32) // user: %5
%3 = alloc_ref $Foo // users: %6, %7, %4
%4 = ref_element_addr %3 : $Foo, #Foo.m_val // user: %5
store %2 to %4 : $*Int32 // id: %5
%6 = class_method %3 : $Foo, #Foo.get!1 : (Foo) -> () -> Int32, $@convention(method) (@guaranteed Foo) -> Int32 // user: %7
%7 = apply %6(%3) : $@convention(method) (@guaranteed Foo) -> Int32 // user: %8
%8 = apply %0(%7) : $@convention(thin) (Int32) -> ()
%9 = tuple () // user: %10
return %9 : $() // id: %10
}
sil @_Ts5printFT3valSi_T_ : $@convention(thin) (Int32) -> ()
// main.Foo.get (main.Foo)() -> Swift.Int32
sil [noinline] @_TFC4main3Foo3getfS0_FT_Si : $@convention(method) (@guaranteed Foo) -> Int32 {
bb0(%0 : $Foo):
%1 = ref_element_addr %0 : $Foo, #Foo.m_val // user: %2
%2 = load %1 : $*Int32 // user: %4
return %2 : $Int32 // id: %4
}
sil_vtable Foo {
#Foo.get!1: @_TFC4main3Foo3getfS0_FT_Si
}