blob: 47af2fbc41a4ca980e4cc20573303d928c02177b [file] [log] [blame]
// RUN: %target-sil-opt %s -aa=typed-access-tb-aa -aa-dump -o /dev/null | FileCheck %s
// REQUIRES: asserts
import Builtin
///////////////////////
// Type Declarations //
///////////////////////
class foo {
deinit
init()
}
class boo : foo {
deinit
override init()
}
class baz : foo {
deinit
override init()
}
class goo : boo {
deinit
override init()
}
sil @boo_init : $@convention(thin) (@thick boo.Type) -> @owned boo
sil @baz_init : $@convention(thin) (@thick baz.Type) -> @owned baz
sil @goo_init : $@convention(thin) (@thick goo.Type) -> @owned goo
// CHECK-LABEL: no_parent_child_relation_reftype_tests
// CHECK: PAIR #1.
// CHECK-NEXT: %0 = alloc_stack $boo
// CHECK-NEXT: %1 = alloc_stack $baz
// CHECK-NEXT: NoAlias
sil hidden @no_parent_child_relation_reftype_tests : $@convention(thin) () -> () {
bb0:
%0 = alloc_stack $boo, var, name "a" // users: %5, %14
%1 = alloc_stack $baz, var, name "b" // users: %9, %13
%2 = function_ref @boo_init : $@convention(thin) (@thick boo.Type) -> @owned boo // user: %4
%3 = metatype $@thick boo.Type // user: %4
%4 = apply %2(%3) : $@convention(thin) (@thick boo.Type) -> @owned boo // users: %5, %11
store %4 to %0 : $*boo // id: %5
%6 = function_ref @baz_init : $@convention(thin) (@thick baz.Type) -> @owned baz // user: %8
%7 = metatype $@thick baz.Type // user: %8
%8 = apply %6(%7) : $@convention(thin) (@thick baz.Type) -> @owned baz // users: %9, %10
store %8 to %1 : $*baz // id: %9
strong_release %8 : $baz // id: %10
strong_release %4 : $boo // id: %11
%12 = tuple () // user: %15
dealloc_stack %1 : $*baz // id: %13
dealloc_stack %0 : $*boo // id: %14
return %12 : $() // id: %15
}
// CHECK-LABEL: with_parent_child_relation_reftype_tests
// CHECK: PAIR #33.
// CHECK-NEXT: %4 = apply %2(%3) : $@convention(thin) (@thick boo.Type) -> @owned boo
// CHECK-NEXT: %8 = apply %6(%7) : $@convention(thin) (@thick goo.Type) -> @owned goo
// CHECK-NEXT: MayAlias
sil hidden @with_parent_child_relation_reftype_tests : $@convention(thin) () -> () {
bb0:
%0 = alloc_stack $boo, var, name "a" // users: %5, %14
%1 = alloc_stack $goo, var, name "b" // users: %9, %13
%2 = function_ref @boo_init : $@convention(thin) (@thick boo.Type) -> @owned boo // user: %4
%3 = metatype $@thick boo.Type // user: %4
%4 = apply %2(%3) : $@convention(thin) (@thick boo.Type) -> @owned boo // users: %5, %11
store %4 to %0 : $*boo // id: %5
%6 = function_ref @goo_init : $@convention(thin) (@thick goo.Type) -> @owned goo // user: %8
%7 = metatype $@thick goo.Type // user: %8
%8 = apply %6(%7) : $@convention(thin) (@thick goo.Type) -> @owned goo // users: %9, %10
store %8 to %1 : $*goo // id: %9
strong_release %8 : $goo // id: %10
strong_release %4 : $boo // id: %11
%12 = tuple () // user: %15
dealloc_stack %1 : $*goo // id: %13
dealloc_stack %0 : $*boo // id: %14
return %12 : $() // id: %15
}
// CHECK-LABEL: @builtin_test
// Check that a raw pointer address may alias everything.
// CHECK: PAIR #134.
// CHECK-NEXT: %7 = project_box %0 : $@box Builtin.RawPointer
// CHECK-NEXT: %8 = project_box %1 : $@box Builtin.NativeObject
// CHECK-NEXT: MayAlias
// CHECK: PAIR #135.
// CHECK-NEXT: %7 = project_box %0 : $@box Builtin.RawPointer
// CHECK-NEXT: %9 = project_box %2 : $@box Builtin.UnknownObject
// CHECK-NEXT: MayAlias
// CHECK: PAIR #136.
// CHECK-NEXT: %7 = project_box %0 : $@box Builtin.RawPointer
// CHECK-NEXT: %10 = project_box %3 : $@box Builtin.Int8
// CHECK-NEXT: MayAlias
// CHECK: PAIR #137.
// CHECK-NEXT: %7 = project_box %0 : $@box Builtin.RawPointer
// CHECK-NEXT: %11 = project_box %4 : $@box Builtin.Int32
// CHECK-NEXT: MayAlias
// CHECK: PAIR #138.
// CHECK-NEXT: %7 = project_box %0 : $@box Builtin.RawPointer
// CHECK-NEXT: %12 = project_box %5 : $@box Builtin.FPIEEE32
// CHECK-NEXT: MayAlias
// CHECK: PAIR #139.
// CHECK-NEXT: %7 = project_box %0 : $@box Builtin.RawPointer
// CHECK-NEXT: %13 = project_box %6 : $@box Builtin.FPIEEE64
// CHECK-NEXT: MayAlias
// CHECK: PAIR #140.
// CHECK-NEXT: %7 = project_box %0 : $@box Builtin.RawPointer
// CHECK-NEXT: %14 = project_box %0 : $@box Builtin.RawPointer
// CHECK-NEXT: MayAlias
// CHECK: PAIR #141.
// CHECK-NEXT: %7 = project_box %0 : $@box Builtin.RawPointer
// CHECK-NEXT: %15 = project_box %1 : $@box Builtin.NativeObject
// CHECK-NEXT: MayAlias
// CHECK: PAIR #142.
// CHECK-NEXT: %7 = project_box %0 : $@box Builtin.RawPointer
// CHECK-NEXT: %16 = project_box %2 : $@box Builtin.UnknownObject
// CHECK-NEXT: MayAlias
// CHECK: PAIR #143.
// CHECK-NEXT: %7 = project_box %0 : $@box Builtin.RawPointer
// CHECK-NEXT: %17 = project_box %3 : $@box Builtin.Int8
// CHECK-NEXT: MayAlias
// CHECK: PAIR #144.
// CHECK-NEXT: %7 = project_box %0 : $@box Builtin.RawPointer
// CHECK-NEXT: %18 = project_box %4 : $@box Builtin.Int32
// CHECK-NEXT: MayAlias
// CHECK: PAIR #145.
// CHECK-NEXT: %7 = project_box %0 : $@box Builtin.RawPointer
// CHECK-NEXT: %19 = project_box %5 : $@box Builtin.FPIEEE32
// CHECK-NEXT: MayAlias
// CHECK: PAIR #146.
// CHECK-NEXT: %7 = project_box %0 : $@box Builtin.RawPointer
// CHECK-NEXT: %20 = project_box %6 : $@box Builtin.FPIEEE64
// CHECK-NEXT: MayAlias
// Now check that a native object address may:
//
// 1. May alias raw pointer addresses.
// 2. Not alias an unknown object. Objective-C objects are allocated differently
// than Swift objects and may not alias.
// 3. Does not alias scalar addresses. This can only occur via inttoptr and the
// like. Since we are using type oracles we are allowed to make the assumption
// that this type of type punning can be ignored.
// 4. May alias addresses to other Builtin.NativeObjects
// CHECK: PAIR #149.
// CHECK-NEXT: %8 = project_box %1 : $@box Builtin.NativeObject
// CHECK-NEXT: %9 = project_box %2 : $@box Builtin.UnknownObject
// CHECK-NEXT: NoAlias
// CHECK: PAIR #150.
// CHECK-NEXT: %8 = project_box %1 : $@box Builtin.NativeObject
// CHECK-NEXT: %10 = project_box %3 : $@box Builtin.Int8
// CHECK-NEXT: NoAlias
// CHECK: PAIR #151.
// CHECK-NEXT: %8 = project_box %1 : $@box Builtin.NativeObject
// CHECK-NEXT: %11 = project_box %4 : $@box Builtin.Int32
// CHECK-NEXT: NoAlias
// CHECK: PAIR #152.
// CHECK-NEXT: %8 = project_box %1 : $@box Builtin.NativeObject
// CHECK-NEXT: %12 = project_box %5 : $@box Builtin.FPIEEE32
// CHECK-NEXT: NoAlias
// CHECK: PAIR #153.
// CHECK-NEXT: %8 = project_box %1 : $@box Builtin.NativeObject
// CHECK-NEXT: %13 = project_box %6 : $@box Builtin.FPIEEE64
// CHECK-NEXT: NoAlias
// CHECK: PAIR #154.
// CHECK-NEXT: %8 = project_box %1 : $@box Builtin.NativeObject
// CHECK-NEXT: %14 = project_box %0 : $@box Builtin.RawPointer
// CHECK-NEXT: MayAlias
// CHECK: PAIR #155.
// CHECK-NEXT: %8 = project_box %1 : $@box Builtin.NativeObject
// CHECK-NEXT: %15 = project_box %1 : $@box Builtin.NativeObject
// CHECK-NEXT: MayAlias
// CHECK: PAIR #156.
// CHECK-NEXT: %8 = project_box %1 : $@box Builtin.NativeObject
// CHECK-NEXT: %16 = project_box %2 : $@box Builtin.UnknownObject
// CHECK-NEXT: NoAlias
// CHECK: PAIR #157.
// CHECK-NEXT: %8 = project_box %1 : $@box Builtin.NativeObject
// CHECK-NEXT: %17 = project_box %3 : $@box Builtin.Int8
// CHECK-NEXT: NoAlias
// CHECK: PAIR #158.
// CHECK-NEXT: %8 = project_box %1 : $@box Builtin.NativeObject
// CHECK-NEXT: %18 = project_box %4 : $@box Builtin.Int32
// CHECK-NEXT: NoAlias
// CHECK: PAIR #159.
// CHECK-NEXT: %8 = project_box %1 : $@box Builtin.NativeObject
// CHECK-NEXT: %19 = project_box %5 : $@box Builtin.FPIEEE32
// CHECK-NEXT: NoAlias
// CHECK: PAIR #160.
// CHECK-NEXT: %8 = project_box %1 : $@box Builtin.NativeObject
// CHECK-NEXT: %20 = project_box %6 : $@box Builtin.FPIEEE64
// CHECK-NEXT: NoAlias
// Check that unknown object addresses may only alias raw pointer addresses and
// other unknown object addresses. Anything else should be no alias.
// CHECK: PAIR #163.
// CHECK-NEXT: %9 = project_box %2 : $@box Builtin.UnknownObject
// CHECK-NEXT: %10 = project_box %3 : $@box Builtin.Int8
// CHECK-NEXT: NoAlias
// CHECK: PAIR #164.
// CHECK-NEXT: %9 = project_box %2 : $@box Builtin.UnknownObject
// CHECK-NEXT: %11 = project_box %4 : $@box Builtin.Int32
// CHECK-NEXT: NoAlias
// CHECK: PAIR #165.
// CHECK-NEXT: %9 = project_box %2 : $@box Builtin.UnknownObject
// CHECK-NEXT: %12 = project_box %5 : $@box Builtin.FPIEEE32
// CHECK-NEXT: NoAlias
// CHECK: PAIR #166.
// CHECK-NEXT: %9 = project_box %2 : $@box Builtin.UnknownObject
// CHECK-NEXT: %13 = project_box %6 : $@box Builtin.FPIEEE64
// CHECK-NEXT: NoAlias
// CHECK: PAIR #167.
// CHECK-NEXT: %9 = project_box %2 : $@box Builtin.UnknownObject
// CHECK-NEXT: %14 = project_box %0 : $@box Builtin.RawPointer
// CHECK-NEXT: MayAlias
// CHECK: PAIR #168.
// CHECK-NEXT: %9 = project_box %2 : $@box Builtin.UnknownObject
// CHECK-NEXT: %15 = project_box %1 : $@box Builtin.NativeObject
// CHECK-NEXT: NoAlias
// CHECK: PAIR #169.
// CHECK-NEXT: %9 = project_box %2 : $@box Builtin.UnknownObject
// CHECK-NEXT: %16 = project_box %2 : $@box Builtin.UnknownObject
// CHECK-NEXT: MayAlias
// CHECK: PAIR #170.
// CHECK-NEXT: %9 = project_box %2 : $@box Builtin.UnknownObject
// CHECK-NEXT: %17 = project_box %3 : $@box Builtin.Int8
// CHECK-NEXT: NoAlias
// CHECK: PAIR #171.
// CHECK-NEXT: %9 = project_box %2 : $@box Builtin.UnknownObject
// CHECK-NEXT: %18 = project_box %4 : $@box Builtin.Int32
// CHECK-NEXT: NoAlias
// CHECK: PAIR #172.
// CHECK-NEXT: %9 = project_box %2 : $@box Builtin.UnknownObject
// CHECK-NEXT: %19 = project_box %5 : $@box Builtin.FPIEEE32
// CHECK-NEXT: NoAlias
// CHECK: PAIR #173.
// CHECK-NEXT: %9 = project_box %2 : $@box Builtin.UnknownObject
// CHECK-NEXT: %20 = project_box %6 : $@box Builtin.FPIEEE64
// CHECK-NEXT: NoAlias
// Next check that Int8 addresses can only alias Int8 addresses and raw
// pointers. This includes ensuring that Int8 cannot alias Int32 addresses.
// CHECK: PAIR #176.
// CHECK-NEXT: %10 = project_box %3 : $@box Builtin.Int8
// CHECK-NEXT: %11 = project_box %4 : $@box Builtin.Int32
// CHECK-NEXT: NoAlias
// CHECK: PAIR #177.
// CHECK-NEXT: %10 = project_box %3 : $@box Builtin.Int8
// CHECK-NEXT: %12 = project_box %5 : $@box Builtin.FPIEEE32
// CHECK-NEXT: NoAlias
// CHECK: PAIR #178.
// CHECK-NEXT: %10 = project_box %3 : $@box Builtin.Int8
// CHECK-NEXT: %13 = project_box %6 : $@box Builtin.FPIEEE64
// CHECK-NEXT: NoAlias
// CHECK: PAIR #179.
// CHECK-NEXT: %10 = project_box %3 : $@box Builtin.Int8
// CHECK-NEXT: %14 = project_box %0 : $@box Builtin.RawPointer
// CHECK-NEXT: MayAlias
// CHECK: PAIR #180.
// CHECK-NEXT: %10 = project_box %3 : $@box Builtin.Int8
// CHECK-NEXT: %15 = project_box %1 : $@box Builtin.NativeObject
// CHECK-NEXT: NoAlias
// CHECK: PAIR #181.
// CHECK-NEXT: %10 = project_box %3 : $@box Builtin.Int8
// CHECK-NEXT: %16 = project_box %2 : $@box Builtin.UnknownObject
// CHECK-NEXT: NoAlias
// CHECK: PAIR #182.
// CHECK-NEXT: %10 = project_box %3 : $@box Builtin.Int8
// CHECK-NEXT: %17 = project_box %3 : $@box Builtin.Int8
// CHECK-NEXT: MayAlias
// CHECK: PAIR #183.
// CHECK-NEXT: %10 = project_box %3 : $@box Builtin.Int8
// CHECK-NEXT: %18 = project_box %4 : $@box Builtin.Int32
// CHECK-NEXT: NoAlias
// CHECK: PAIR #184.
// CHECK-NEXT: %10 = project_box %3 : $@box Builtin.Int8
// CHECK-NEXT: %19 = project_box %5 : $@box Builtin.FPIEEE32
// CHECK-NEXT: NoAlias
// CHECK: PAIR #185.
// CHECK-NEXT: %10 = project_box %3 : $@box Builtin.Int8
// CHECK-NEXT: %20 = project_box %6 : $@box Builtin.FPIEEE64
// CHECK-NEXT: NoAlias
// Finally conclude by checking that FPIEEE32 addresses only can alias raw
// pointer addresses and other FPIEEE32 addresses. Again this includes proving
// that FPIEEE64 addresses cannot alias FPIEEE32.
// CHECK: PAIR #199.
// CHECK-NEXT: %12 = project_box %5 : $@box Builtin.FPIEEE32
// CHECK-NEXT: %13 = project_box %6 : $@box Builtin.FPIEEE64
// CHECK-NEXT: NoAlias
// CHECK: PAIR #200.
// CHECK-NEXT: %12 = project_box %5 : $@box Builtin.FPIEEE32
// CHECK-NEXT: %14 = project_box %0 : $@box Builtin.RawPointer
// CHECK-NEXT: MayAlias
// CHECK: PAIR #201.
// CHECK-NEXT: %12 = project_box %5 : $@box Builtin.FPIEEE32
// CHECK-NEXT: %15 = project_box %1 : $@box Builtin.NativeObject
// CHECK-NEXT: NoAlias
// CHECK: PAIR #202.
// CHECK-NEXT: %12 = project_box %5 : $@box Builtin.FPIEEE32
// CHECK-NEXT: %16 = project_box %2 : $@box Builtin.UnknownObject
// CHECK-NEXT: NoAlias
// CHECK: PAIR #203.
// CHECK-NEXT: %12 = project_box %5 : $@box Builtin.FPIEEE32
// CHECK-NEXT: %17 = project_box %3 : $@box Builtin.Int8
// CHECK-NEXT: NoAlias
// CHECK: PAIR #204.
// CHECK-NEXT: %12 = project_box %5 : $@box Builtin.FPIEEE32
// CHECK-NEXT: %18 = project_box %4 : $@box Builtin.Int32
// CHECK-NEXT: NoAlias
// CHECK: PAIR #205.
// CHECK-NEXT: %12 = project_box %5 : $@box Builtin.FPIEEE32
// CHECK-NEXT: %19 = project_box %5 : $@box Builtin.FPIEEE32
// CHECK-NEXT: MayAlias
// CHECK: PAIR #206.
// CHECK-NEXT: %12 = project_box %5 : $@box Builtin.FPIEEE32
// CHECK-NEXT: %20 = project_box %6 : $@box Builtin.FPIEEE64
// CHECK-NEXT: NoAlias
sil @builtin_test : $@convention(thin) () -> () {
bb0:
%0 = alloc_box $Builtin.RawPointer
%1 = alloc_box $Builtin.NativeObject
%2 = alloc_box $Builtin.UnknownObject
%3 = alloc_box $Builtin.Int8
%4 = alloc_box $Builtin.Int32
%5 = alloc_box $Builtin.FPIEEE32
%6 = alloc_box $Builtin.FPIEEE64
%7 = project_box %0 : $@box Builtin.RawPointer
%8 = project_box %1 : $@box Builtin.NativeObject
%9 = project_box %2 : $@box Builtin.UnknownObject
%10 = project_box %3 : $@box Builtin.Int8
%11 = project_box %4 : $@box Builtin.Int32
%12 = project_box %5 : $@box Builtin.FPIEEE32
%13 = project_box %6 : $@box Builtin.FPIEEE64
// This second block ensures that we gain the benefits of not repeating
// already known values with being able to have associated with the output for
// each type each of the items we are trying to check aliasing against. This
// makes it simpler to write these tests.
%14 = project_box %0 : $@box Builtin.RawPointer
%15 = project_box %1 : $@box Builtin.NativeObject
%16 = project_box %2 : $@box Builtin.UnknownObject
%17 = project_box %3 : $@box Builtin.Int8
%18 = project_box %4 : $@box Builtin.Int32
%19 = project_box %5 : $@box Builtin.FPIEEE32
%20 = project_box %6 : $@box Builtin.FPIEEE64
%21 = tuple()
return %21 : $()
}
// Make sure that struct addresses:
//
// 1. Alias address types that they contain.
// 2. Do not alias address types that they do not contain.
// 3. Do not alias Builtin.ObjectPointers.
// 4. Aliases raw pointers.
// CHECK-LABEL: @struct_tests
// CHECK: PAIR #339.
// CHECK-NEXT: %13 = project_box %6 : $@box STest_S3
// CHECK-NEXT: %14 = project_box %0 : $@box STest_S1
// CHECK-NEXT: MayAlias
// CHECK: PAIR #340.
// CHECK-NEXT: %13 = project_box %6 : $@box STest_S3
// CHECK-NEXT: %15 = project_box %1 : $@box STest_S2
// CHECK-NEXT: NoAlias
// CHECK: PAIR #341.
// CHECK-NEXT: %13 = project_box %6 : $@box STest_S3
// CHECK-NEXT: %16 = project_box %2 : $@box STest_E1
// CHECK-NEXT: MayAlias
// CHECK: PAIR #342.
// CHECK-NEXT: %13 = project_box %6 : $@box STest_S3
// CHECK-NEXT: %17 = project_box %3 : $@box STest_E2
// CHECK-NEXT: NoAlias
// CHECK: PAIR #343.
// CHECK-NEXT: %13 = project_box %6 : $@box STest_S3
// CHECK-NEXT: %18 = project_box %4 : $@box STest_C1
// CHECK-NEXT: MayAlias
// CHECK: PAIR #344.
// CHECK-NEXT: %13 = project_box %6 : $@box STest_S3
// CHECK-NEXT: %19 = project_box %5 : $@box STest_C2
// CHECK-NEXT: NoAlias
// CHECK: PAIR #345.
// CHECK-NEXT: %13 = project_box %6 : $@box STest_S3
// CHECK-NEXT: %20 = project_box %6 : $@box STest_S3
// CHECK-NEXT: MayAlias
// CHECK: PAIR #351.
// CHECK-NEXT: %13 = project_box %6 : $@box STest_S3
// CHECK-NEXT: %26 = project_box %21 : $@box Builtin.RawPointer
// CHECK-NEXT: MayAlias
// CHECK: PAIR #352.
// CHECK-NEXT: %13 = project_box %6 : $@box STest_S3
// CHECK-NEXT: %27 = project_box %22 : $@box Builtin.NativeObject
// CHECK-NEXT: NoAlias
// CHECK: PAIR #353.
// CHECK-NEXT: %13 = project_box %6 : $@box STest_S3
// CHECK-NEXT: %28 = project_box %23 : $@box Builtin.UnknownObject
// CHECK-NEXT: NoAlias
// CHECK: PAIR #354.
// CHECK-NEXT: %13 = project_box %6 : $@box STest_S3
// CHECK-NEXT: %29 = project_box %24 : $@box Builtin.Int32
// CHECK-NEXT: MayAlias
// CHECK: PAIR #355.
// CHECK-NEXT: %13 = project_box %6 : $@box STest_S3
// CHECK-NEXT: %30 = project_box %25 : $@box Builtin.FPIEEE32
// CHECK-NEXT: NoAlias
struct STest_S1 {
var a : Builtin.Int32
}
struct STest_S2 {
var b : Builtin.Int34
}
enum STest_E1 {
case Yes(STest_S1)
case No
}
enum STest_E2 {
case Yes(STest_S2)
case No
}
class STest_C1 {
var a : Builtin.Int32
init()
}
class STest_C2 {
var a : Builtin.Int64
init()
}
struct STest_S3 {
var s : STest_S1
var e : STest_E1
var c : STest_C1
}
sil @struct_tests : $@convention(thin) () -> () {
%0 = alloc_box $STest_S1
%1 = alloc_box $STest_S2
%2 = alloc_box $STest_E1
%3 = alloc_box $STest_E2
%4 = alloc_box $STest_C1
%5 = alloc_box $STest_C2
%6 = alloc_box $STest_S3
%7 = project_box %0 : $@box STest_S1
%8 = project_box %1 : $@box STest_S2
%9 = project_box %2 : $@box STest_E1
%10 = project_box %3 : $@box STest_E2
%11 = project_box %4 : $@box STest_C1
%12 = project_box %5 : $@box STest_C2
%13 = project_box %6 : $@box STest_S3
%14 = project_box %0 : $@box STest_S1
%15 = project_box %1 : $@box STest_S2
%16 = project_box %2 : $@box STest_E1
%17 = project_box %3 : $@box STest_E2
%18 = project_box %4 : $@box STest_C1
%19 = project_box %5 : $@box STest_C2
%20 = project_box %6 : $@box STest_S3
%21 = alloc_box $Builtin.RawPointer
%22 = alloc_box $Builtin.NativeObject
%23 = alloc_box $Builtin.UnknownObject
%24 = alloc_box $Builtin.Int32
%25 = alloc_box $Builtin.FPIEEE32
%26 = project_box %21 : $@box Builtin.RawPointer
%27 = project_box %22 : $@box Builtin.NativeObject
%28 = project_box %23 : $@box Builtin.UnknownObject
%29 = project_box %24 : $@box Builtin.Int32
%30 = project_box %25 : $@box Builtin.FPIEEE32
%9999 = tuple()
return %9999 : $()
}
// CHECK-LABEL: @enum_tests
// CHECK: PAIR #339.
// CHECK-NEXT: %13 = project_box %6 : $@box ETest_E3
// CHECK-NEXT: %14 = project_box %0 : $@box ETest_S1
// CHECK-NEXT: MayAlias
// CHECK: PAIR #340.
// CHECK-NEXT: %13 = project_box %6 : $@box ETest_E3
// CHECK-NEXT: %15 = project_box %1 : $@box ETest_S2
// CHECK-NEXT: NoAlias
// CHECK: PAIR #341.
// CHECK-NEXT: %13 = project_box %6 : $@box ETest_E3
// CHECK-NEXT: %16 = project_box %2 : $@box ETest_E1
// CHECK-NEXT: MayAlias
// CHECK: PAIR #342.
// CHECK-NEXT: %13 = project_box %6 : $@box ETest_E3
// CHECK-NEXT: %17 = project_box %3 : $@box ETest_E2
// CHECK-NEXT: NoAlias
// CHECK: PAIR #343.
// CHECK-NEXT: %13 = project_box %6 : $@box ETest_E3
// CHECK-NEXT: %18 = project_box %4 : $@box ETest_C1
// CHECK-NEXT: MayAlias
// CHECK: PAIR #344.
// CHECK-NEXT: %13 = project_box %6 : $@box ETest_E3
// CHECK-NEXT: %19 = project_box %5 : $@box ETest_C2
// CHECK-NEXT: NoAlias
// CHECK: PAIR #345.
// CHECK-NEXT: %13 = project_box %6 : $@box ETest_E3
// CHECK-NEXT: %20 = project_box %6 : $@box ETest_E3
// CHECK-NEXT: MayAlias
// CHECK: PAIR #351.
// CHECK-NEXT: %13 = project_box %6 : $@box ETest_E3
// CHECK-NEXT: %26 = project_box %21 : $@box Builtin.RawPointer
// CHECK-NEXT: MayAlias
// CHECK: PAIR #352.
// CHECK-NEXT: %13 = project_box %6 : $@box ETest_E3
// CHECK-NEXT: %27 = project_box %22 : $@box Builtin.NativeObject
// CHECK-NEXT: NoAlias
// CHECK: PAIR #353.
// CHECK-NEXT: %13 = project_box %6 : $@box ETest_E3
// CHECK-NEXT: %28 = project_box %23 : $@box Builtin.UnknownObject
// CHECK-NEXT: NoAlias
// CHECK: PAIR #354.
// CHECK-NEXT: %13 = project_box %6 : $@box ETest_E3
// CHECK-NEXT: %29 = project_box %24 : $@box Builtin.Int32
// CHECK-NEXT: MayAlias
// CHECK: PAIR #355.
// CHECK-NEXT: %13 = project_box %6 : $@box ETest_E3
// CHECK-NEXT: %30 = project_box %25 : $@box Builtin.FPIEEE32
// CHECK-NEXT: NoAlias
struct ETest_S1 {
var a : Builtin.Int32
}
struct ETest_S2 {
var b : Builtin.Int34
}
enum ETest_E1 {
case Yes(ETest_S1)
case No
}
enum ETest_E2 {
case Yes(ETest_S2)
case No
}
class ETest_C1 {
var a : Builtin.Int32
init()
}
class ETest_C2 {
var a : Builtin.Int64
init()
}
enum ETest_E3 {
case S(ETest_S1)
case E(ETest_E1)
case C(ETest_C1)
case Unknown
}
sil @enum_tests : $@convention(thin) () -> () {
%0 = alloc_box $ETest_S1
%1 = alloc_box $ETest_S2
%2 = alloc_box $ETest_E1
%3 = alloc_box $ETest_E2
%4 = alloc_box $ETest_C1
%5 = alloc_box $ETest_C2
%6 = alloc_box $ETest_E3
%7 = project_box %0 : $@box ETest_S1
%8 = project_box %1 : $@box ETest_S2
%9 = project_box %2 : $@box ETest_E1
%10 = project_box %3 : $@box ETest_E2
%11 = project_box %4 : $@box ETest_C1
%12 = project_box %5 : $@box ETest_C2
%13 = project_box %6 : $@box ETest_E3
%14 = project_box %0 : $@box ETest_S1
%15 = project_box %1 : $@box ETest_S2
%16 = project_box %2 : $@box ETest_E1
%17 = project_box %3 : $@box ETest_E2
%18 = project_box %4 : $@box ETest_C1
%19 = project_box %5 : $@box ETest_C2
%20 = project_box %6 : $@box ETest_E3
%21 = alloc_box $Builtin.RawPointer
%22 = alloc_box $Builtin.NativeObject
%23 = alloc_box $Builtin.UnknownObject
%24 = alloc_box $Builtin.Int32
%25 = alloc_box $Builtin.FPIEEE32
%26 = project_box %21 : $@box Builtin.RawPointer
%27 = project_box %22 : $@box Builtin.NativeObject
%28 = project_box %23 : $@box Builtin.UnknownObject
%29 = project_box %24 : $@box Builtin.Int32
%30 = project_box %25 : $@box Builtin.FPIEEE32
%9999 = tuple()
return %9999 : $()
}
// CHECK-LABEL: @class_tests
// CHECK: PAIR #72.
// CHECK-NEXT: %3 = project_box %0 : $@box CTest_C1
// CHECK-NEXT: %6 = project_box %0 : $@box CTest_C1
// CHECK-NEXT: MayAlias
// CHECK: PAIR #73.
// CHECK-NEXT: %3 = project_box %0 : $@box CTest_C1
// CHECK-NEXT: %7 = project_box %1 : $@box CTest_C2
// CHECK-NEXT: NoAlias
// CHECK: PAIR #74.
// CHECK-NEXT: %3 = project_box %0 : $@box CTest_C1
// CHECK-NEXT: %8 = project_box %2 : $@box CTest_C3
// CHECK-NEXT: MayAlias
// CHECK: PAIR #82.
// CHECK-NEXT: %3 = project_box %0 : $@box CTest_C1
// CHECK-NEXT: %16 = project_box %9 : $@box AnyObject
// CHECK-NEXT: MayAlias
// CHECK: PAIR #83.
// CHECK-NEXT: %3 = project_box %0 : $@box CTest_C1
// CHECK-NEXT: %17 = project_box %10 : $@box Builtin.RawPointer
// CHECK-NEXT: MayAlias
// CHECK: PAIR #84.
// CHECK-NEXT: %3 = project_box %0 : $@box CTest_C1
// CHECK-NEXT: %18 = project_box %11 : $@box Builtin.NativeObject
// CHECK-NEXT: MayAlias
// CHECK: PAIR #85.
// CHECK-NEXT: %3 = project_box %0 : $@box CTest_C1
// CHECK-NEXT: %19 = project_box %12 : $@box Builtin.UnknownObject
// CHECK-NEXT: MayAlias
// CHECK: PAIR #86.
// CHECK-NEXT: %3 = project_box %0 : $@box CTest_C1
// CHECK-NEXT: %20 = project_box %13 : $@box Builtin.Int8
// CHECK-NEXT: NoAlias
// CHECK: PAIR #87.
// CHECK-NEXT: %3 = project_box %0 : $@box CTest_C1
// CHECK-NEXT: %21 = project_box %14 : $@box Builtin.Int32
// CHECK-NEXT: NoAlias
// CHECK: PAIR #88.
// CHECK-NEXT: %3 = project_box %0 : $@box CTest_C1
// CHECK-NEXT: %22 = project_box %15 : $@box Builtin.FPIEEE32
// CHECK-NEXT: NoAlias
// CHECK: PAIR #91.
// CHECK-NEXT: %4 = project_box %1 : $@box CTest_C2
// CHECK-NEXT: %5 = project_box %2 : $@box CTest_C3
// CHECK-NEXT: NoAlias
// CHECK: PAIR #92.
// CHECK-NEXT: %4 = project_box %1 : $@box CTest_C2
// CHECK-NEXT: %6 = project_box %0 : $@box CTest_C1
// CHECK-NEXT: NoAlias
// CHECK: PAIR #93.
// CHECK-NEXT: %4 = project_box %1 : $@box CTest_C2
// CHECK-NEXT: %7 = project_box %1 : $@box CTest_C2
// CHECK-NEXT: MayAlias
// CHECK: PAIR #94.
// CHECK-NEXT: %4 = project_box %1 : $@box CTest_C2
// CHECK-NEXT: %8 = project_box %2 : $@box CTest_C3
// CHECK-NEXT: NoAlias
// CHECK: PAIR #102.
// CHECK-NEXT: %4 = project_box %1 : $@box CTest_C2
// CHECK-NEXT: %16 = project_box %9 : $@box AnyObject
// CHECK-NEXT: MayAlias
// CHECK: PAIR #103.
// CHECK-NEXT: %4 = project_box %1 : $@box CTest_C2
// CHECK-NEXT: %17 = project_box %10 : $@box Builtin.RawPointer
// CHECK-NEXT: MayAlias
// CHECK: PAIR #104.
// CHECK-NEXT: %4 = project_box %1 : $@box CTest_C2
// CHECK-NEXT: %18 = project_box %11 : $@box Builtin.NativeObject
// CHECK-NEXT: MayAlias
// CHECK: PAIR #105.
// CHECK-NEXT: %4 = project_box %1 : $@box CTest_C2
// CHECK-NEXT: %19 = project_box %12 : $@box Builtin.UnknownObject
// CHECK-NEXT: MayAlias
// CHECK: PAIR #106.
// CHECK-NEXT: %4 = project_box %1 : $@box CTest_C2
// CHECK-NEXT: %20 = project_box %13 : $@box Builtin.Int8
// CHECK-NEXT: NoAlias
// CHECK: PAIR #107.
// CHECK-NEXT: %4 = project_box %1 : $@box CTest_C2
// CHECK-NEXT: %21 = project_box %14 : $@box Builtin.Int32
// CHECK-NEXT: NoAlias
// CHECK: PAIR #108.
// CHECK-NEXT: %4 = project_box %1 : $@box CTest_C2
// CHECK-NEXT: %22 = project_box %15 : $@box Builtin.FPIEEE32
// CHECK-NEXT: NoAlias
// CHECK: PAIR #111.
// CHECK-NEXT: %5 = project_box %2 : $@box CTest_C3
// CHECK-NEXT: %6 = project_box %0 : $@box CTest_C1
// CHECK-NEXT: MayAlias
// CHECK: PAIR #112.
// CHECK-NEXT: %5 = project_box %2 : $@box CTest_C3
// CHECK-NEXT: %7 = project_box %1 : $@box CTest_C2
// CHECK-NEXT: NoAlias
// CHECK: PAIR #113.
// CHECK-NEXT: %5 = project_box %2 : $@box CTest_C3
// CHECK-NEXT: %8 = project_box %2 : $@box CTest_C3
// CHECK-NEXT: MayAlias
// CHECK: PAIR #121.
// CHECK-NEXT: %5 = project_box %2 : $@box CTest_C3
// CHECK-NEXT: %16 = project_box %9 : $@box AnyObject
// CHECK-NEXT: MayAlias
// CHECK: PAIR #122.
// CHECK-NEXT: %5 = project_box %2 : $@box CTest_C3
// CHECK-NEXT: %17 = project_box %10 : $@box Builtin.RawPointer
// CHECK-NEXT: MayAlias
// CHECK: PAIR #123.
// CHECK-NEXT: %5 = project_box %2 : $@box CTest_C3
// CHECK-NEXT: %18 = project_box %11 : $@box Builtin.NativeObject
// CHECK-NEXT: MayAlias
// CHECK: PAIR #124.
// CHECK-NEXT: %5 = project_box %2 : $@box CTest_C3
// CHECK-NEXT: %19 = project_box %12 : $@box Builtin.UnknownObject
// CHECK-NEXT: MayAlias
// CHECK: PAIR #125.
// CHECK-NEXT: %5 = project_box %2 : $@box CTest_C3
// CHECK-NEXT: %20 = project_box %13 : $@box Builtin.Int8
// CHECK-NEXT: NoAlias
// CHECK: PAIR #126.
// CHECK-NEXT: %5 = project_box %2 : $@box CTest_C3
// CHECK-NEXT: %21 = project_box %14 : $@box Builtin.Int32
// CHECK-NEXT: NoAlias
// CHECK: PAIR #127.
// CHECK-NEXT: %5 = project_box %2 : $@box CTest_C3
// CHECK-NEXT: %22 = project_box %15 : $@box Builtin.FPIEEE32
// CHECK-NEXT: NoAlias
class CTest_C1 {
var x : Builtin.Int32
init()
}
class CTest_C2 {
var z : Builtin.FPIEEE32
init()
}
class CTest_C3 : CTest_C1 {
var y : Builtin.Int8
override init()
}
protocol AnyObject {}
sil @class_tests : $@convention(thin) () -> () {
%0 = alloc_box $CTest_C1
%1 = alloc_box $CTest_C2
%2 = alloc_box $CTest_C3
%3 = project_box %0 : $@box CTest_C1
%4 = project_box %1 : $@box CTest_C2
%5 = project_box %2 : $@box CTest_C3
%6 = project_box %0 : $@box CTest_C1
%7 = project_box %1 : $@box CTest_C2
%8 = project_box %2 : $@box CTest_C3
%9 = alloc_box $AnyObject
%10 = alloc_box $Builtin.RawPointer
%11 = alloc_box $Builtin.NativeObject
%12 = alloc_box $Builtin.UnknownObject
%13 = alloc_box $Builtin.Int8
%14 = alloc_box $Builtin.Int32
%15 = alloc_box $Builtin.FPIEEE32
%16 = project_box %9 : $@box AnyObject
%17 = project_box %10 : $@box Builtin.RawPointer
%18 = project_box %11 : $@box Builtin.NativeObject
%19 = project_box %12 : $@box Builtin.UnknownObject
%20 = project_box %13 : $@box Builtin.Int8
%21 = project_box %14 : $@box Builtin.Int32
%22 = project_box %15 : $@box Builtin.FPIEEE32
%9999 = tuple()
return %9999 : $()
}
// CHECK-LABEL: @tuple_tests
// CHECK: PAIR #66.
// CHECK-NEXT: %3 = project_box %0 : $@box (Builtin.RawPointer, Builtin.Int64)
// CHECK-NEXT: %6 = project_box %0 : $@box (Builtin.RawPointer, Builtin.Int64)
// CHECK-NEXT: MayAlias
// CHECK: PAIR #67.
// CHECK-NEXT: %3 = project_box %0 : $@box (Builtin.RawPointer, Builtin.Int64)
// CHECK-NEXT: %7 = project_box %1 : $@box (TTest_S1, Builtin.Int64)
// CHECK-NEXT: NoAlias
// CHECK: PAIR #68.
// CHECK-NEXT: %3 = project_box %0 : $@box (Builtin.RawPointer, Builtin.Int64)
// CHECK-NEXT: %8 = project_box %2 : $@box (TTest_E1, Builtin.Int64)
// CHECK-NEXT: NoAlias
// CHECK: PAIR #75.
// CHECK-NEXT: %3 = project_box %0 : $@box (Builtin.RawPointer, Builtin.Int64)
// CHECK-NEXT: %15 = project_box %9 : $@box Builtin.RawPointer
// CHECK-NEXT: MayAlias
// CHECK: PAIR #76.
// CHECK-NEXT: %3 = project_box %0 : $@box (Builtin.RawPointer, Builtin.Int64)
// CHECK-NEXT: %16 = project_box %10 : $@box Builtin.NativeObject
// CHECK-NEXT: NoAlias
// CHECK: PAIR #77.
// CHECK-NEXT: %3 = project_box %0 : $@box (Builtin.RawPointer, Builtin.Int64)
// CHECK-NEXT: %17 = project_box %11 : $@box Builtin.UnknownObject
// CHECK-NEXT: NoAlias
// CHECK: PAIR #78.
// CHECK-NEXT: %3 = project_box %0 : $@box (Builtin.RawPointer, Builtin.Int64)
// CHECK-NEXT: %18 = project_box %12 : $@box Builtin.Int8
// CHECK-NEXT: NoAlias
// CHECK: PAIR #79.
// CHECK-NEXT: %3 = project_box %0 : $@box (Builtin.RawPointer, Builtin.Int64)
// CHECK-NEXT: %19 = project_box %13 : $@box Builtin.Int32
// CHECK-NEXT: NoAlias
// CHECK: PAIR #80.
// CHECK-NEXT: %3 = project_box %0 : $@box (Builtin.RawPointer, Builtin.Int64)
// CHECK-NEXT: %20 = project_box %14 : $@box Builtin.FPIEEE32
// CHECK-NEXT: NoAlias
// CHECK: PAIR #85.
// CHECK-NEXT: %4 = project_box %1 : $@box (TTest_S1, Builtin.Int64)
// CHECK-NEXT: %7 = project_box %1 : $@box (TTest_S1, Builtin.Int64)
// CHECK-NEXT: MayAlias
// CHECK: PAIR #86.
// CHECK-NEXT: %4 = project_box %1 : $@box (TTest_S1, Builtin.Int64)
// CHECK-NEXT: %8 = project_box %2 : $@box (TTest_E1, Builtin.Int64)
// CHECK-NEXT: NoAlias
// CHECK: PAIR #93.
// CHECK-NEXT: %4 = project_box %1 : $@box (TTest_S1, Builtin.Int64)
// CHECK-NEXT: %15 = project_box %9 : $@box Builtin.RawPointer
// CHECK-NEXT: MayAlias
// CHECK: PAIR #94.
// CHECK-NEXT: %4 = project_box %1 : $@box (TTest_S1, Builtin.Int64)
// CHECK-NEXT: %16 = project_box %10 : $@box Builtin.NativeObject
// CHECK-NEXT: NoAlias
// CHECK: PAIR #95.
// CHECK-NEXT: %4 = project_box %1 : $@box (TTest_S1, Builtin.Int64)
// CHECK-NEXT: %17 = project_box %11 : $@box Builtin.UnknownObject
// CHECK-NEXT: NoAlias
// CHECK: PAIR #96.
// CHECK-NEXT: %4 = project_box %1 : $@box (TTest_S1, Builtin.Int64)
// CHECK-NEXT: %18 = project_box %12 : $@box Builtin.Int8
// CHECK-NEXT: NoAlias
// CHECK: PAIR #97.
// CHECK-NEXT: %4 = project_box %1 : $@box (TTest_S1, Builtin.Int64)
// CHECK-NEXT: %19 = project_box %13 : $@box Builtin.Int32
// CHECK-NEXT: MayAlias
// CHECK: PAIR #98.
// CHECK-NEXT: %4 = project_box %1 : $@box (TTest_S1, Builtin.Int64)
// CHECK-NEXT: %20 = project_box %14 : $@box Builtin.FPIEEE32
// CHECK-NEXT: NoAlias
// CHECK: PAIR #102.
// CHECK-NEXT: %5 = project_box %2 : $@box (TTest_E1, Builtin.Int64)
// CHECK-NEXT: %7 = project_box %1 : $@box (TTest_S1, Builtin.Int64)
// CHECK-NEXT: NoAlias
// CHECK: PAIR #103.
// CHECK-NEXT: %5 = project_box %2 : $@box (TTest_E1, Builtin.Int64)
// CHECK-NEXT: %8 = project_box %2 : $@box (TTest_E1, Builtin.Int64)
// CHECK-NEXT: MayAlias
// CHECK: PAIR #110.
// CHECK-NEXT: %5 = project_box %2 : $@box (TTest_E1, Builtin.Int64)
// CHECK-NEXT: %15 = project_box %9 : $@box Builtin.RawPointer
// CHECK-NEXT: MayAlias
// CHECK: PAIR #111.
// CHECK-NEXT: %5 = project_box %2 : $@box (TTest_E1, Builtin.Int64)
// CHECK-NEXT: %16 = project_box %10 : $@box Builtin.NativeObject
// CHECK-NEXT: NoAlias
// CHECK: PAIR #112.
// CHECK-NEXT: %5 = project_box %2 : $@box (TTest_E1, Builtin.Int64)
// CHECK-NEXT: %17 = project_box %11 : $@box Builtin.UnknownObject
// CHECK-NEXT: NoAlias
// CHECK: PAIR #113.
// CHECK-NEXT: %5 = project_box %2 : $@box (TTest_E1, Builtin.Int64)
// CHECK-NEXT: %18 = project_box %12 : $@box Builtin.Int8
// CHECK-NEXT: MayAlias
// CHECK: PAIR #114.
// CHECK-NEXT: %5 = project_box %2 : $@box (TTest_E1, Builtin.Int64)
// CHECK-NEXT: %19 = project_box %13 : $@box Builtin.Int32
// CHECK-NEXT: NoAlias
// CHECK: PAIR #115.
// CHECK-NEXT: %5 = project_box %2 : $@box (TTest_E1, Builtin.Int64)
// CHECK-NEXT: %20 = project_box %14 : $@box Builtin.FPIEEE32
// CHECK-NEXT: NoAlias
struct TTest_S1 {
var x : Builtin.Int32
}
enum TTest_E1 {
case No
case Yes(Builtin.Int8)
}
sil @tuple_tests : $@convention(thin) () -> () {
%0 = alloc_box $(Builtin.RawPointer, Builtin.Int64)
%1 = alloc_box $(TTest_S1, Builtin.Int64)
%2 = alloc_box $(TTest_E1, Builtin.Int64)
%3 = project_box %0 : $@box (Builtin.RawPointer, Builtin.Int64)
%4 = project_box %1 : $@box (TTest_S1, Builtin.Int64)
%5 = project_box %2 : $@box (TTest_E1, Builtin.Int64)
%6 = project_box %0 : $@box (Builtin.RawPointer, Builtin.Int64)
%7 = project_box %1 : $@box (TTest_S1, Builtin.Int64)
%8 = project_box %2 : $@box (TTest_E1, Builtin.Int64)
%9 = alloc_box $Builtin.RawPointer
%10 = alloc_box $Builtin.NativeObject
%11 = alloc_box $Builtin.UnknownObject
%12 = alloc_box $Builtin.Int8
%13 = alloc_box $Builtin.Int32
%14 = alloc_box $Builtin.FPIEEE32
%15 = project_box %9 : $@box Builtin.RawPointer
%16 = project_box %10 : $@box Builtin.NativeObject
%17 = project_box %11 : $@box Builtin.UnknownObject
%18 = project_box %12 : $@box Builtin.Int8
%19 = project_box %13 : $@box Builtin.Int32
%20 = project_box %14 : $@box Builtin.FPIEEE32
%9999 = tuple()
return %9999 : $()
}
// Check that TBAA fails when the root is unchecked_addr_cast or
// pointer_to_address without [strict].
//
// CHECK-LABEL: @tbaa_dump
// CHECK: PAIR #2.
// CHECK-NEXT: %0 = argument of bb0 : $*Builtin.Int64
// CHECK-NEXT: %3 = unchecked_addr_cast %0 : $*Builtin.Int64 to $*Builtin.Int32
// CHECK-NEXT: MayAlias
// CHECK: PAIR #5.
// CHECK-NEXT: %0 = argument of bb0 : $*Builtin.Int64
// CHECK-NEXT: %7 = pointer_to_address %6 : $Builtin.RawPointer to [strict] $*Builtin.Int32
// CHECK-NEXT: NoAlias
// CHECK: PAIR #6.
// CHECK-NEXT: %0 = argument of bb0 : $*Builtin.Int64
// CHECK-NEXT: %9 = pointer_to_address %6 : $Builtin.RawPointer to $*Builtin.Int32
// CHECK-NEXT: MayAlias
sil @tbaa_dump : $@convention(thin) (@in Builtin.Int64) -> Builtin.Int64 {
bb0(%0 : $*Builtin.Int64):
%1 = integer_literal $Builtin.Int64, 42
store %1 to %0 : $*Builtin.Int64
%3 = unchecked_addr_cast %0 : $*Builtin.Int64 to $*Builtin.Int32
%4 = integer_literal $Builtin.Int32, 0
store %4 to %3 : $*Builtin.Int32
%6 = address_to_pointer %0 : $*Builtin.Int64 to $Builtin.RawPointer
%7 = pointer_to_address %6 : $Builtin.RawPointer to [strict] $*Builtin.Int32
store %4 to %7 : $*Builtin.Int32
%9 = pointer_to_address %6 : $Builtin.RawPointer to $*Builtin.Int32
store %4 to %9 : $*Builtin.Int32
%10 = load %0 : $*Builtin.Int64
return %10 : $Builtin.Int64
}
// CHECK-LABEL: @test_project_box
// CHECK: PAIR #10.
// CHECK-NEXT: %2 = project_box %0 : $@box Builtin.Int32
// CHECK-NEXT: %3 = project_box %1 : $@box Builtin.Int64
// CHECK-NEXT: NoAlias
sil @test_project_box : $@convention(thin) (@box Builtin.Int32, @box Builtin.Int64) -> () {
bb0(%0 : $@box Builtin.Int32, %1 : $@box Builtin.Int64):
%2 = project_box %0 : $@box Builtin.Int32
%3 = project_box %1 : $@box Builtin.Int64
%r = tuple()
return %r : $()
}