blob: cc1676378d1c5122147b99bdb5ca83f50441a596 [file] [log] [blame]
// RUN: %target-sil-opt -enable-sil-verify-all %s -definite-init | FileCheck %s
// These are all regression tests to ensure that the memory promotion pass
// doesn't crash.
import Builtin
import Swift
// Mixed combination of aggregate load/stores and elements.
struct Triple {
var a, b, c : Int
}
// CHECK-LABEL: sil @TripleTest
sil @TripleTest : $@convention(method) (Int, @inout Triple) -> Triple {
bb0(%0 : $Int, %1 : $*Triple):
%4 = alloc_box $Triple
%5 = load %1 : $*Triple
store %5 to %4#1 : $*Triple
%8 = struct_element_addr %4#1 : $*Triple, #Triple.b
store %0 to %8 : $*Int
%10 = load %4#1 : $*Triple
strong_release %4#0 : $@box Triple
return %10 : $Triple
}
struct Single {
var a : Int
}
// CHECK-LABEL: sil @SingleTest
sil @SingleTest : $@convention(method) (@inout Single, Int) -> Single {
bb0(%0 : $*Single, %1 : $Int):
%4 = alloc_box $Single
%5 = load %0 : $*Single
store %5 to %4#1 : $*Single
%8 = struct_element_addr %4#1 : $*Single, #Single.a
store %1 to %8 : $*Int
%10 = load %4#1 : $*Single
strong_release %4#0 : $@box Single
return %10 : $Single
}
class SomeClass {}
enum SomeUnion {
case x(Int)
case y(SomeClass)
}
sil @getSomeClass : $@convention(thin) (@thick SomeClass.Type) -> @owned SomeClass
sil @getSomeUnion : $@convention(thin) (@owned SomeClass, @thin SomeUnion.Type) -> @owned SomeUnion
// CHECK-LABEL: sil @test_union_release
sil @test_union_release : $@convention(thin) () -> () {
bb0:
%0 = tuple ()
%1 = alloc_box $SomeUnion // users: %9, %8
%2 = function_ref @getSomeUnion : $@convention(thin) (@owned SomeClass, @thin SomeUnion.Type) -> @owned SomeUnion // user: %7
%3 = metatype $@thin SomeUnion.Type // user: %7
%4 = function_ref @getSomeClass : $@convention(thin) (@thick SomeClass.Type) -> @owned SomeClass // user: %6
%5 = metatype $@thick SomeClass.Type // user: %6
%6 = apply %4(%5) : $@convention(thin) (@thick SomeClass.Type) -> @owned SomeClass // user: %7
%7 = apply %2(%6, %3) : $@convention(thin) (@owned SomeClass, @thin SomeUnion.Type) -> @owned SomeUnion // user: %8
assign %7 to %1#1 : $*SomeUnion
strong_release %1#0 : $@box SomeUnion
%10 = tuple () // user: %11
return %10 : $()
}