blob: 81f7544cb92d4265c06ec062b89645e834ec8afd [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 #13.
// CHECK: (1): %0 = alloc_stack $boo
// CHECK: (1): %1 = alloc_stack $baz
// CHECK: 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#1 : $*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#1 : $*baz // id: %9
strong_release %8 : $baz // id: %10
strong_release %4 : $boo // id: %11
%12 = tuple () // user: %15
dealloc_stack %1#0 : $*@local_storage baz // id: %13
dealloc_stack %0#0 : $*@local_storage boo // id: %14
return %12 : $() // id: %15
}
// CHECK-LABEL: with_parent_child_relation_reftype_tests
// CHECK: PAIR #54.
// CHECK: (0): %4 = apply %2(%3) : $@convention(thin) (@thick boo.Type) -> @owned boo
// CHECK: (0): %8 = apply %6(%7) : $@convention(thin) (@thick goo.Type) -> @owned goo
// CHECK: 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#1 : $*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#1 : $*goo // id: %9
strong_release %8 : $goo // id: %10
strong_release %4 : $boo // id: %11
%12 = tuple () // user: %15
dealloc_stack %1#0 : $*@local_storage goo // id: %13
dealloc_stack %0#0 : $*@local_storage boo // id: %14
return %12 : $() // id: %15
}
// CHECK-LABEL: @builtin_test
// Check that a raw pointer address may alias everything.
// CHECK: MayAlias
// CHECK: PAIR #31.
// CHECK: (1): %0 = alloc_box $Builtin.RawPointer
// CHECK: (1): %1 = alloc_box $Builtin.NativeObject
// CHECK: MayAlias
// CHECK: PAIR #33.
// CHECK: (1): %0 = alloc_box $Builtin.RawPointer
// CHECK: (1): %2 = alloc_box $Builtin.UnknownObject
// CHECK: MayAlias
// CHECK: PAIR #35.
// CHECK: (1): %0 = alloc_box $Builtin.RawPointer
// CHECK: (1): %3 = alloc_box $Builtin.Int8
// CHECK: MayAlias
// CHECK: PAIR #37.
// CHECK: (1): %0 = alloc_box $Builtin.RawPointer
// CHECK: (1): %4 = alloc_box $Builtin.Int32
// CHECK: MayAlias
// CHECK: PAIR #39.
// CHECK: (1): %0 = alloc_box $Builtin.RawPointer
// CHECK: (1): %5 = alloc_box $Builtin.FPIEEE32
// CHECK: MayAlias
// CHECK: PAIR #41.
// CHECK: (1): %0 = alloc_box $Builtin.RawPointer
// CHECK: (1): %6 = alloc_box $Builtin.FPIEEE64
// CHECK: MayAlias
// CHECK: PAIR #43.
// CHECK: (1): %0 = alloc_box $Builtin.RawPointer
// CHECK: (1): %7 = alloc_box $Builtin.RawPointer
// CHECK: MayAlias
// CHECK: PAIR #45.
// CHECK: (1): %0 = alloc_box $Builtin.RawPointer
// CHECK: (1): %8 = alloc_box $Builtin.NativeObject
// CHECK: MayAlias
// CHECK: PAIR #47.
// CHECK: (1): %0 = alloc_box $Builtin.RawPointer
// CHECK: (1): %9 = alloc_box $Builtin.UnknownObject
// CHECK: MayAlias
// CHECK: PAIR #49.
// CHECK: (1): %0 = alloc_box $Builtin.RawPointer
// CHECK: (1): %10 = alloc_box $Builtin.Int8
// CHECK: MayAlias
// CHECK: PAIR #51.
// CHECK: (1): %0 = alloc_box $Builtin.RawPointer
// CHECK: (1): %11 = alloc_box $Builtin.Int32
// CHECK: MayAlias
// CHECK: PAIR #55.
// CHECK: (1): %0 = alloc_box $Builtin.RawPointer
// CHECK: (1): %13 = alloc_box $Builtin.FPIEEE64
// CHECK: 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 #86.
// CHECK: (1): %1 = alloc_box $Builtin.NativeObject
// CHECK: (1): %2 = alloc_box $Builtin.UnknownObject
// CHECK: NoAlias
// CHECK: PAIR #88.
// CHECK: (1): %1 = alloc_box $Builtin.NativeObject
// CHECK: (1): %3 = alloc_box $Builtin.Int8
// CHECK: NoAlias
// CHECK: PAIR #90.
// CHECK: (1): %1 = alloc_box $Builtin.NativeObject
// CHECK: (1): %4 = alloc_box $Builtin.Int32
// CHECK: NoAlias
// CHECK: PAIR #92.
// CHECK: (1): %1 = alloc_box $Builtin.NativeObject
// CHECK: (1): %5 = alloc_box $Builtin.FPIEEE32
// CHECK: NoAlias
// CHECK: PAIR #94.
// CHECK: (1): %1 = alloc_box $Builtin.NativeObject
// CHECK: (1): %6 = alloc_box $Builtin.FPIEEE64
// CHECK: NoAlias
// CHECK: PAIR #96.
// CHECK: (1): %1 = alloc_box $Builtin.NativeObject
// CHECK: (1): %7 = alloc_box $Builtin.RawPointer
// CHECK: MayAlias
// CHECK: PAIR #98.
// CHECK: (1): %1 = alloc_box $Builtin.NativeObject
// CHECK: (1): %8 = alloc_box $Builtin.NativeObject
// CHECK: MayAlias
// CHECK: PAIR #100.
// CHECK: (1): %1 = alloc_box $Builtin.NativeObject
// CHECK: (1): %9 = alloc_box $Builtin.UnknownObject
// CHECK: NoAlias
// CHECK: PAIR #102.
// CHECK: (1): %1 = alloc_box $Builtin.NativeObject
// CHECK: (1): %10 = alloc_box $Builtin.Int8
// CHECK: NoAlias
// CHECK: PAIR #104.
// CHECK: (1): %1 = alloc_box $Builtin.NativeObject
// CHECK: (1): %11 = alloc_box $Builtin.Int32
// CHECK: NoAlias
// CHECK: PAIR #106.
// CHECK: (1): %1 = alloc_box $Builtin.NativeObject
// CHECK: (1): %12 = alloc_box $Builtin.FPIEEE32
// CHECK: NoAlias
// CHECK: PAIR #108.
// CHECK: (1): %1 = alloc_box $Builtin.NativeObject
// CHECK: (1): %13 = alloc_box $Builtin.FPIEEE64
// CHECK: 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 #137.
// CHECK: (1): %2 = alloc_box $Builtin.UnknownObject
// CHECK: (1): %3 = alloc_box $Builtin.Int8
// CHECK: NoAlias
// CHECK: PAIR #139.
// CHECK: (1): %2 = alloc_box $Builtin.UnknownObject
// CHECK: (1): %4 = alloc_box $Builtin.Int32
// CHECK: NoAlias
// CHECK: PAIR #141.
// CHECK: (1): %2 = alloc_box $Builtin.UnknownObject
// CHECK: (1): %5 = alloc_box $Builtin.FPIEEE32
// CHECK: NoAlias
// CHECK: PAIR #143.
// CHECK: (1): %2 = alloc_box $Builtin.UnknownObject
// CHECK: (1): %6 = alloc_box $Builtin.FPIEEE64
// CHECK: NoAlias
// CHECK: PAIR #145.
// CHECK: (1): %2 = alloc_box $Builtin.UnknownObject
// CHECK: (1): %7 = alloc_box $Builtin.RawPointer
// CHECK: MayAlias
// CHECK: PAIR #147.
// CHECK: (1): %2 = alloc_box $Builtin.UnknownObject
// CHECK: (1): %8 = alloc_box $Builtin.NativeObject
// CHECK: NoAlias
// CHECK: PAIR #149.
// CHECK: (1): %2 = alloc_box $Builtin.UnknownObject
// CHECK: (1): %9 = alloc_box $Builtin.UnknownObject
// CHECK: MayAlias
// CHECK: PAIR #151.
// CHECK: (1): %2 = alloc_box $Builtin.UnknownObject
// CHECK: (1): %10 = alloc_box $Builtin.Int8
// CHECK: NoAlias
// CHECK: PAIR #153.
// CHECK: (1): %2 = alloc_box $Builtin.UnknownObject
// CHECK: (1): %11 = alloc_box $Builtin.Int32
// CHECK: NoAlias
// CHECK: PAIR #155.
// CHECK: (1): %2 = alloc_box $Builtin.UnknownObject
// CHECK: (1): %12 = alloc_box $Builtin.FPIEEE32
// CHECK: NoAlias
// CHECK: PAIR #157.
// CHECK: (1): %2 = alloc_box $Builtin.UnknownObject
// CHECK: (1): %13 = alloc_box $Builtin.FPIEEE64
// CHECK: NoAlias
// Next check that Int8 addresses can only alias Int8 addresses and raw
// pointers. This includes ensuring that Int8 can not alias Int32 addresses.
// CHECK: PAIR #184.
// CHECK: (1): %3 = alloc_box $Builtin.Int8
// CHECK: (1): %4 = alloc_box $Builtin.Int32
// CHECK: NoAlias
// CHECK: PAIR #186.
// CHECK: (1): %3 = alloc_box $Builtin.Int8
// CHECK: (1): %5 = alloc_box $Builtin.FPIEEE32
// CHECK: NoAlias
// CHECK: PAIR #188.
// CHECK: (1): %3 = alloc_box $Builtin.Int8
// CHECK: (1): %6 = alloc_box $Builtin.FPIEEE64
// CHECK: NoAlias
// CHECK: PAIR #190.
// CHECK: (1): %3 = alloc_box $Builtin.Int8
// CHECK: (1): %7 = alloc_box $Builtin.RawPointer
// CHECK: MayAlias
// CHECK: PAIR #192.
// CHECK: (1): %3 = alloc_box $Builtin.Int8
// CHECK: (1): %8 = alloc_box $Builtin.NativeObject
// CHECK: NoAlias
// CHECK: PAIR #194.
// CHECK: (1): %3 = alloc_box $Builtin.Int8
// CHECK: (1): %9 = alloc_box $Builtin.UnknownObject
// CHECK: NoAlias
// CHECK: PAIR #196.
// CHECK: (1): %3 = alloc_box $Builtin.Int8
// CHECK: (1): %10 = alloc_box $Builtin.Int8
// CHECK: MayAlias
// CHECK: PAIR #198.
// CHECK: (1): %3 = alloc_box $Builtin.Int8
// CHECK: (1): %11 = alloc_box $Builtin.Int32
// CHECK: NoAlias
// CHECK: PAIR #200.
// CHECK: (1): %3 = alloc_box $Builtin.Int8
// CHECK: (1): %12 = alloc_box $Builtin.FPIEEE32
// CHECK: NoAlias
// CHECK: PAIR #202.
// CHECK: (1): %3 = alloc_box $Builtin.Int8
// CHECK: (1): %13 = alloc_box $Builtin.FPIEEE64
// CHECK: 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 can not alias FPIEEE32.
// CHECK: PAIR #266.
// CHECK: (1): %5 = alloc_box $Builtin.FPIEEE32
// CHECK: (1): %6 = alloc_box $Builtin.FPIEEE64
// CHECK: NoAlias
// CHECK: PAIR #268.
// CHECK: (1): %5 = alloc_box $Builtin.FPIEEE32
// CHECK: (1): %7 = alloc_box $Builtin.RawPointer
// CHECK: MayAlias
// CHECK: PAIR #270.
// CHECK: (1): %5 = alloc_box $Builtin.FPIEEE32
// CHECK: (1): %8 = alloc_box $Builtin.NativeObject
// CHECK: NoAlias
// CHECK: PAIR #272.
// CHECK: (1): %5 = alloc_box $Builtin.FPIEEE32
// CHECK: (1): %9 = alloc_box $Builtin.UnknownObject
// CHECK: NoAlias
// CHECK: PAIR #274.
// CHECK: (1): %5 = alloc_box $Builtin.FPIEEE32
// CHECK: (1): %10 = alloc_box $Builtin.Int8
// CHECK: NoAlias
// CHECK: PAIR #276.
// CHECK: (1): %5 = alloc_box $Builtin.FPIEEE32
// CHECK: (1): %11 = alloc_box $Builtin.Int32
// CHECK: NoAlias
// CHECK: PAIR #278.
// CHECK: (1): %5 = alloc_box $Builtin.FPIEEE32
// CHECK: (1): %12 = alloc_box $Builtin.FPIEEE32
// CHECK: MayAlias
// CHECK: PAIR #280.
// CHECK: (1): %5 = alloc_box $Builtin.FPIEEE32
// CHECK: (1): %13 = alloc_box $Builtin.FPIEEE64
// CHECK: 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
// 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.
%7 = alloc_box $Builtin.RawPointer
%8 = alloc_box $Builtin.NativeObject
%9 = alloc_box $Builtin.UnknownObject
%10 = alloc_box $Builtin.Int8
%11 = alloc_box $Builtin.Int32
%12 = alloc_box $Builtin.FPIEEE32
%13 = alloc_box $Builtin.FPIEEE64
%14 = tuple()
return %14 : $()
}
// 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 #431.
// CHECK: (1): %6 = alloc_box $STest_S3
// CHECK: (1): %7 = alloc_box $STest_S1
// CHECK: MayAlias
// CHECK: PAIR #433.
// CHECK: (1): %6 = alloc_box $STest_S3
// CHECK: (1): %8 = alloc_box $STest_S2
// CHECK: NoAlias
// CHECK: PAIR #435.
// CHECK: (1): %6 = alloc_box $STest_S3
// CHECK: (1): %9 = alloc_box $STest_E1
// CHECK: MayAlias
// CHECK: PAIR #437.
// CHECK: (1): %6 = alloc_box $STest_S3
// CHECK: (1): %10 = alloc_box $STest_E2
// CHECK: NoAlias
// CHECK: PAIR #439.
// CHECK: (1): %6 = alloc_box $STest_S3
// CHECK: (1): %11 = alloc_box $STest_C1
// CHECK: MayAlias
// CHECK: PAIR #441.
// CHECK: (1): %6 = alloc_box $STest_S3
// CHECK: (1): %12 = alloc_box $STest_C2
// CHECK: NoAlias
// CHECK: PAIR #443.
// CHECK: (1): %6 = alloc_box $STest_S3
// CHECK: (1): %13 = alloc_box $STest_S3
// CHECK: MayAlias
// CHECK: PAIR #445.
// CHECK: (1): %6 = alloc_box $STest_S3
// CHECK: (1): %14 = alloc_box $Builtin.RawPointer
// CHECK: MayAlias
// CHECK: PAIR #447.
// CHECK: (1): %6 = alloc_box $STest_S3
// CHECK: (1): %15 = alloc_box $Builtin.NativeObject
// CHECK: NoAlias
// CHECK: PAIR #449.
// CHECK: (1): %6 = alloc_box $STest_S3
// CHECK: (1): %16 = alloc_box $Builtin.UnknownObject
// CHECK: MayAlias
// CHECK: PAIR #451.
// CHECK: (1): %6 = alloc_box $STest_S3
// CHECK: (1): %17 = alloc_box $Builtin.Int32
// CHECK: MayAlias
// CHECK: PAIR #453.
// CHECK: (1): %6 = alloc_box $STest_S3
// CHECK: (1): %18 = alloc_box $Builtin.FPIEEE32
// CHECK: 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
%9 = alloc_box $STest_S1
%10 = alloc_box $STest_S2
%11 = alloc_box $STest_E1
%12 = alloc_box $STest_E2
%13 = alloc_box $STest_C1
%14 = alloc_box $STest_C2
%15 = alloc_box $STest_S3
%16 = alloc_box $Builtin.RawPointer
%17 = alloc_box $Builtin.NativeObject
%18 = alloc_box $Builtin.UnknownObject
%19 = alloc_box $Builtin.Int32
%20 = alloc_box $Builtin.FPIEEE32
%9999 = tuple()
return %9999 : $()
}
// CHECK-LABEL: @enum_tests
// CHECK: PAIR #429.
// CHECK: (1): %6 = alloc_box $ETest_E3
// CHECK: (1): %6 = alloc_box $ETest_E3
// CHECK: MustAlias
// CHECK: PAIR #431.
// CHECK: (1): %6 = alloc_box $ETest_E3
// CHECK: (1): %7 = alloc_box $ETest_S1
// CHECK: MayAlias
// CHECK: PAIR #433.
// CHECK: (1): %6 = alloc_box $ETest_E3
// CHECK: (1): %8 = alloc_box $ETest_S2
// CHECK: NoAlias
// CHECK: PAIR #435.
// CHECK: (1): %6 = alloc_box $ETest_E3
// CHECK: (1): %9 = alloc_box $ETest_E1
// CHECK: MayAlias
// CHECK: PAIR #437.
// CHECK: (1): %6 = alloc_box $ETest_E3
// CHECK: (1): %10 = alloc_box $ETest_E2
// CHECK: NoAlias
// CHECK: PAIR #439.
// CHECK: (1): %6 = alloc_box $ETest_E3
// CHECK: (1): %11 = alloc_box $ETest_C1
// CHECK: MayAlias
// CHECK: PAIR #441.
// CHECK: (1): %6 = alloc_box $ETest_E3
// CHECK: (1): %12 = alloc_box $ETest_C2
// CHECK: NoAlias
// CHECK: PAIR #443.
// CHECK: (1): %6 = alloc_box $ETest_E3
// CHECK: (1): %13 = alloc_box $ETest_E3
// CHECK: MayAlias
// CHECK: PAIR #445.
// CHECK: (1): %6 = alloc_box $ETest_E3
// CHECK: (1): %14 = alloc_box $Builtin.RawPointer
// CHECK: MayAlias
// CHECK: PAIR #447.
// CHECK: (1): %6 = alloc_box $ETest_E3
// CHECK: (1): %15 = alloc_box $Builtin.NativeObject
// CHECK: NoAlias
// CHECK: PAIR #449.
// CHECK: (1): %6 = alloc_box $ETest_E3
// CHECK: (1): %16 = alloc_box $Builtin.UnknownObject
// CHECK: MayAlias
// CHECK: PAIR #451.
// CHECK: (1): %6 = alloc_box $ETest_E3
// CHECK: (1): %17 = alloc_box $Builtin.Int32
// CHECK: MayAlias
// CHECK: PAIR #453.
// CHECK: (1): %6 = alloc_box $ETest_E3
// CHECK: (1): %18 = alloc_box $Builtin.FPIEEE32
// CHECK: 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
%9 = alloc_box $ETest_S1
%10 = alloc_box $ETest_S2
%11 = alloc_box $ETest_E1
%12 = alloc_box $ETest_E2
%13 = alloc_box $ETest_C1
%14 = alloc_box $ETest_C2
%15 = alloc_box $ETest_E3
%16 = alloc_box $Builtin.RawPointer
%17 = alloc_box $Builtin.NativeObject
%18 = alloc_box $Builtin.UnknownObject
%19 = alloc_box $Builtin.Int32
%20 = alloc_box $Builtin.FPIEEE32
%9999 = tuple()
return %9999 : $()
}
// CHECK-LABEL: @class_tests
// CHECK: PAIR #27.
// CHECK: (1): %0 = alloc_box $CTest_C1
// CHECK: (1): %0 = alloc_box $CTest_C1
// CHECK: MustAlias
// CHECK: PAIR #29.
// CHECK: (1): %0 = alloc_box $CTest_C1
// CHECK: (1): %1 = alloc_box $CTest_C2
// CHECK: NoAlias
// CHECK: PAIR #31.
// CHECK: (1): %0 = alloc_box $CTest_C1
// CHECK: (1): %2 = alloc_box $CTest_C3
// CHECK: MayAlias
// CHECK: PAIR #33.
// CHECK: (1): %0 = alloc_box $CTest_C1
// CHECK: (1): %3 = alloc_box $CTest_C1
// CHECK: MayAlias
// CHECK: PAIR #35.
// CHECK: (1): %0 = alloc_box $CTest_C1
// CHECK: (1): %4 = alloc_box $CTest_C2
// CHECK: NoAlias
// CHECK: PAIR #37.
// CHECK: (1): %0 = alloc_box $CTest_C1
// CHECK: (1): %5 = alloc_box $CTest_C3
// CHECK: MayAlias
// CHECK: PAIR #39.
// CHECK: (1): %0 = alloc_box $CTest_C1
// CHECK: (1): %6 = alloc_box $AnyObject
// CHECK: MayAlias
// CHECK: PAIR #41.
// CHECK: (1): %0 = alloc_box $CTest_C1
// CHECK: (1): %7 = alloc_box $Builtin.RawPointer
// CHECK: MayAlias
// CHECK: PAIR #43.
// CHECK: (1): %0 = alloc_box $CTest_C1
// CHECK: (1): %8 = alloc_box $Builtin.NativeObject
// CHECK: MayAlias
// CHECK: PAIR #45.
// CHECK: (1): %0 = alloc_box $CTest_C1
// CHECK: (1): %9 = alloc_box $Builtin.UnknownObject
// CHECK: MayAlias
// CHECK: PAIR #47.
// CHECK: (1): %0 = alloc_box $CTest_C1
// CHECK: (1): %10 = alloc_box $Builtin.Int8
// CHECK: NoAlias
// CHECK: PAIR #49.
// CHECK: (1): %0 = alloc_box $CTest_C1
// CHECK: (1): %11 = alloc_box $Builtin.Int32
// CHECK: NoAlias
// CHECK: PAIR #51.
// CHECK: (1): %0 = alloc_box $CTest_C1
// CHECK: (1): %12 = alloc_box $Builtin.FPIEEE32
// CHECK: NoAlias
// CHECK: PAIR #80.
// CHECK: (1): %1 = alloc_box $CTest_C2
// CHECK: (1): %2 = alloc_box $CTest_C3
// CHECK: NoAlias
// CHECK: PAIR #82.
// CHECK: (1): %1 = alloc_box $CTest_C2
// CHECK: (1): %3 = alloc_box $CTest_C1
// CHECK: NoAlias
// CHECK: PAIR #84.
// CHECK: (1): %1 = alloc_box $CTest_C2
// CHECK: (1): %4 = alloc_box $CTest_C2
// CHECK: MayAlias
// CHECK: PAIR #86.
// CHECK: (1): %1 = alloc_box $CTest_C2
// CHECK: (1): %5 = alloc_box $CTest_C3
// CHECK: NoAlias
// CHECK: PAIR #88.
// CHECK: (1): %1 = alloc_box $CTest_C2
// CHECK: (1): %6 = alloc_box $AnyObject
// CHECK: MayAlias
// CHECK: PAIR #90.
// CHECK: (1): %1 = alloc_box $CTest_C2
// CHECK: (1): %7 = alloc_box $Builtin.RawPointer
// CHECK: MayAlias
// CHECK: PAIR #92.
// CHECK: (1): %1 = alloc_box $CTest_C2
// CHECK: (1): %8 = alloc_box $Builtin.NativeObject
// CHECK: MayAlias
// CHECK: PAIR #94.
// CHECK: (1): %1 = alloc_box $CTest_C2
// CHECK: (1): %9 = alloc_box $Builtin.UnknownObject
// CHECK: MayAlias
// CHECK: PAIR #96.
// CHECK: (1): %1 = alloc_box $CTest_C2
// CHECK: (1): %10 = alloc_box $Builtin.Int8
// CHECK: NoAlias
// CHECK: PAIR #98.
// CHECK: (1): %1 = alloc_box $CTest_C2
// CHECK: (1): %11 = alloc_box $Builtin.Int32
// CHECK: NoAlias
// CHECK: PAIR #100.
// CHECK: (1): %1 = alloc_box $CTest_C2
// CHECK: (1): %12 = alloc_box $Builtin.FPIEEE32
// CHECK: NoAlias
// CHECK: PAIR #125.
// CHECK: (1): %2 = alloc_box $CTest_C3
// CHECK: (1): %2 = alloc_box $CTest_C3
// CHECK: MustAlias
// CHECK: PAIR #127.
// CHECK: (1): %2 = alloc_box $CTest_C3
// CHECK: (1): %3 = alloc_box $CTest_C1
// CHECK: MayAlias
// CHECK: PAIR #129.
// CHECK: (1): %2 = alloc_box $CTest_C3
// CHECK: (1): %4 = alloc_box $CTest_C2
// CHECK: NoAlias
// CHECK: PAIR #131.
// CHECK: (1): %2 = alloc_box $CTest_C3
// CHECK: (1): %5 = alloc_box $CTest_C3
// CHECK: MayAlias
// CHECK: PAIR #133.
// CHECK: (1): %2 = alloc_box $CTest_C3
// CHECK: (1): %6 = alloc_box $AnyObject
// CHECK: MayAlias
// CHECK: PAIR #135.
// CHECK: (1): %2 = alloc_box $CTest_C3
// CHECK: (1): %7 = alloc_box $Builtin.RawPointer
// CHECK: MayAlias
// CHECK: PAIR #137.
// CHECK: (1): %2 = alloc_box $CTest_C3
// CHECK: (1): %8 = alloc_box $Builtin.NativeObject
// CHECK: MayAlias
// CHECK: PAIR #139.
// CHECK: (1): %2 = alloc_box $CTest_C3
// CHECK: (1): %9 = alloc_box $Builtin.UnknownObject
// CHECK: MayAlias
// CHECK: PAIR #141.
// CHECK: (1): %2 = alloc_box $CTest_C3
// CHECK: (1): %10 = alloc_box $Builtin.Int8
// CHECK: NoAlias
// CHECK: PAIR #143.
// CHECK: (1): %2 = alloc_box $CTest_C3
// CHECK: (1): %11 = alloc_box $Builtin.Int32
// CHECK: NoAlias
// CHECK: PAIR #145.
// CHECK: (1): %2 = alloc_box $CTest_C3
// CHECK: (1): %12 = alloc_box $Builtin.FPIEEE32
// CHECK: 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 = alloc_box $CTest_C1
%4 = alloc_box $CTest_C2
%5 = alloc_box $CTest_C3
%6 = alloc_box $AnyObject
%16 = alloc_box $Builtin.RawPointer
%17 = alloc_box $Builtin.NativeObject
%18 = alloc_box $Builtin.UnknownObject
%19 = alloc_box $Builtin.Int8
%20 = alloc_box $Builtin.Int32
%21 = alloc_box $Builtin.FPIEEE32
%9999 = tuple()
return %9999 : $()
}
struct TTest_S1 {
var x : Builtin.Int32
}
enum TTest_E1 {
case No
case Yes(Builtin.Int8)
}
// CHECK-LABEL: @tuple_tests
// CHECK: PAIR #27.
// CHECK: (1): %0 = alloc_box $(Builtin.RawPointer, Builtin.Int64)
// CHECK: (1): %1 = alloc_box $(TTest_S1, Builtin.Int64)
// CHECK: NoAlias
// CHECK: PAIR #29.
// CHECK: (1): %0 = alloc_box $(Builtin.RawPointer, Builtin.Int64)
// CHECK: (1): %2 = alloc_box $(TTest_E1, Builtin.Int64)
// CHECK: NoAlias
// CHECK: PAIR #31.
// CHECK: (1): %0 = alloc_box $(Builtin.RawPointer, Builtin.Int64)
// CHECK: (1): %3 = alloc_box $(Builtin.RawPointer, Builtin.Int64)
// CHECK: MayAlias
// CHECK: PAIR #33.
// CHECK: (1): %0 = alloc_box $(Builtin.RawPointer, Builtin.Int64)
// CHECK: (1): %4 = alloc_box $(TTest_S1, Builtin.Int64)
// CHECK: NoAlias
// CHECK: PAIR #35.
// CHECK: (1): %0 = alloc_box $(Builtin.RawPointer, Builtin.Int64)
// CHECK: (1): %5 = alloc_box $(TTest_E1, Builtin.Int64)
// CHECK: NoAlias
// CHECK: PAIR #37.
// CHECK: (1): %0 = alloc_box $(Builtin.RawPointer, Builtin.Int64)
// CHECK: (1): %6 = alloc_box $Builtin.RawPointer
// CHECK: MayAlias
// CHECK: PAIR #39.
// CHECK: (1): %0 = alloc_box $(Builtin.RawPointer, Builtin.Int64)
// CHECK: (1): %7 = alloc_box $Builtin.NativeObject
// CHECK: NoAlias
// CHECK: PAIR #41.
// CHECK: (1): %0 = alloc_box $(Builtin.RawPointer, Builtin.Int64)
// CHECK: (1): %8 = alloc_box $Builtin.UnknownObject
// CHECK: MayAlias
// CHECK: PAIR #43.
// CHECK: (1): %0 = alloc_box $(Builtin.RawPointer, Builtin.Int64)
// CHECK: (1): %9 = alloc_box $Builtin.Int8
// CHECK: NoAlias
// CHECK: PAIR #45.
// CHECK: (1): %0 = alloc_box $(Builtin.RawPointer, Builtin.Int64)
// CHECK: (1): %10 = alloc_box $Builtin.Int32
// CHECK: NoAlias
// CHECK: PAIR #47.
// CHECK: (1): %0 = alloc_box $(Builtin.RawPointer, Builtin.Int64)
// CHECK: (1): %11 = alloc_box $Builtin.FPIEEE32
// CHECK: NoAlias
// CHECK: PAIR #78.
// CHECK: (1): %1 = alloc_box $(TTest_S1, Builtin.Int64)
// CHECK: (1): %4 = alloc_box $(TTest_S1, Builtin.Int64)
// CHECK: MayAlias
// CHECK: PAIR #80.
// CHECK: (1): %1 = alloc_box $(TTest_S1, Builtin.Int64)
// CHECK: (1): %5 = alloc_box $(TTest_E1, Builtin.Int64)
// CHECK: NoAlias
// CHECK: PAIR #82.
// CHECK: (1): %1 = alloc_box $(TTest_S1, Builtin.Int64)
// CHECK: (1): %6 = alloc_box $Builtin.RawPointer
// CHECK: MayAlias
// CHECK: PAIR #84.
// CHECK: (1): %1 = alloc_box $(TTest_S1, Builtin.Int64)
// CHECK: (1): %7 = alloc_box $Builtin.NativeObject
// CHECK: NoAlias
// CHECK: PAIR #86.
// CHECK: (1): %1 = alloc_box $(TTest_S1, Builtin.Int64)
// CHECK: (1): %8 = alloc_box $Builtin.UnknownObject
// CHECK: MayAlias
// CHECK: PAIR #88.
// CHECK: (1): %1 = alloc_box $(TTest_S1, Builtin.Int64)
// CHECK: (1): %9 = alloc_box $Builtin.Int8
// CHECK: NoAlias
// CHECK: PAIR #90.
// CHECK: (1): %1 = alloc_box $(TTest_S1, Builtin.Int64)
// CHECK: (1): %10 = alloc_box $Builtin.Int32
// CHECK: MayAlias
// CHECK: PAIR #92.
// CHECK: (1): %1 = alloc_box $(TTest_S1, Builtin.Int64)
// CHECK: (1): %11 = alloc_box $Builtin.FPIEEE32
// CHECK: NoAlias
// CHECK: PAIR #119.
// CHECK: (1): %2 = alloc_box $(TTest_E1, Builtin.Int64)
// CHECK: (1): %4 = alloc_box $(TTest_S1, Builtin.Int64)
// CHECK: NoAlias
// CHECK: PAIR #121.
// CHECK: (1): %2 = alloc_box $(TTest_E1, Builtin.Int64)
// CHECK: (1): %5 = alloc_box $(TTest_E1, Builtin.Int64)
// CHECK: MayAlias
// CHECK: PAIR #123.
// CHECK: (1): %2 = alloc_box $(TTest_E1, Builtin.Int64)
// CHECK: (1): %6 = alloc_box $Builtin.RawPointer
// CHECK: MayAlias
// CHECK: PAIR #125.
// CHECK: (1): %2 = alloc_box $(TTest_E1, Builtin.Int64)
// CHECK: (1): %7 = alloc_box $Builtin.NativeObject
// CHECK: NoAlias
// CHECK: PAIR #127.
// CHECK: (1): %2 = alloc_box $(TTest_E1, Builtin.Int64)
// CHECK: (1): %8 = alloc_box $Builtin.UnknownObject
// CHECK: MayAlias
// CHECK: PAIR #129.
// CHECK: (1): %2 = alloc_box $(TTest_E1, Builtin.Int64)
// CHECK: (1): %9 = alloc_box $Builtin.Int8
// CHECK: MayAlias
// CHECK: PAIR #131.
// CHECK: (1): %2 = alloc_box $(TTest_E1, Builtin.Int64)
// CHECK: (1): %10 = alloc_box $Builtin.Int32
// CHECK: NoAlias
// CHECK: PAIR #133.
// CHECK: (1): %2 = alloc_box $(TTest_E1, Builtin.Int64)
// CHECK: (1): %11 = alloc_box $Builtin.FPIEEE32
// CHECK: NoAlias
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 = alloc_box $(Builtin.RawPointer, Builtin.Int64)
%4 = alloc_box $(TTest_S1, Builtin.Int64)
%5 = alloc_box $(TTest_E1, Builtin.Int64)
%16 = alloc_box $Builtin.RawPointer
%17 = alloc_box $Builtin.NativeObject
%18 = alloc_box $Builtin.UnknownObject
%19 = alloc_box $Builtin.Int8
%20 = alloc_box $Builtin.Int32
%21 = alloc_box $Builtin.FPIEEE32
%9999 = tuple()
return %9999 : $()
}
// Check that TBAA fails when the root is unchecked_addr_cast or
// pointer_to_address.
//
// CHECK-LABEL: @tbaa_dump
// CHECK: PAIR #2.
// CHECK-NEXT: (0): %0 = argument of bb0 : $*Builtin.Int64
// CHECK-NEXT: (0): %3 = unchecked_addr_cast %0 : $*Builtin.Int64 to $*Builtin.Int32
// CHECK-NEXT: MayAlias
// CHECK: PAIR #5.
// CHECK-NEXT: (0): %0 = argument of bb0 : $*Builtin.Int64
// CHECK-NEXT: (0): %7 = pointer_to_address %6 : $Builtin.RawPointer to $*Builtin.Int32
// FIXME: This should be MayAlias unless the pointer_to_address instruction
// comes with a "must not alias" flag.
// CHECK-NEXT: NoAlias
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 $*Builtin.Int32
store %4 to %7 : $*Builtin.Int32
%8 = load %0 : $*Builtin.Int64
return %8 : $Builtin.Int64
}