blob: 20aa8f241af2ebdb9e0d3d47030d601975aa3910 [file] [log] [blame]
// RUN: %target-sil-opt -enable-sil-ownership -mark-uninitialized-fixup %s | %FileCheck %s
sil_stage raw
import Builtin
// CHECK-LABEL: sil @single_bb_single_proj_case : $@convention(thin) () -> () {
// CHECK: [[BOX:%.*]] = alloc_box ${ var Builtin.Int32 }
// CHECK: [[PB:%.*]] = project_box [[BOX]]
// CHECK: mark_uninitialized [rootself] [[PB]]
sil @single_bb_single_proj_case : $@convention(thin) () -> () {
bb0:
%0 = alloc_box ${ var Builtin.Int32 }
%1 = mark_uninitialized [rootself] %0 : ${ var Builtin.Int32 }
%2 = project_box %1 : ${ var Builtin.Int32 }, 0
destroy_value %1 : ${ var Builtin.Int32 }
%9999 = tuple()
return %9999 : $()
}
// CHECK-LABEL: sil @single_bb_multiple_proj_case : $@convention(thin) () -> () {
// CHECK: [[BOX:%.*]] = alloc_box ${ var Builtin.Int32 }
// CHECK: [[PB:%.*]] = project_box [[BOX]]
// CHECK: mark_uninitialized [rootself] [[PB]]
// CHECK: project_box [[BOX]]
sil @single_bb_multiple_proj_case : $@convention(thin) () -> () {
bb0:
%0 = alloc_box ${ var Builtin.Int32 }
%1 = mark_uninitialized [rootself] %0 : ${ var Builtin.Int32 }
%2 = project_box %1 : ${ var Builtin.Int32 }, 0
%3 = project_box %1 : ${ var Builtin.Int32 }, 0
destroy_value %1 : ${ var Builtin.Int32 }
%9999 = tuple()
return %9999 : $()
}
// CHECK-LABEL: sil @multiple_bb_case : $@convention(thin) () -> () {
// CHECK: [[BOX:%.*]] = alloc_box ${ var Builtin.Int32 }
// CHECK: [[PB:%.*]] = project_box [[BOX]]
// CHECK: mark_uninitialized [rootself] [[PB]]
// CHECK: br [[NEXT_BB:bb[0-9]+]]
//
// CHECK: [[NEXT_BB]]:
// CHECK: project_box [[BOX]]
sil @multiple_bb_case : $@convention(thin) () -> () {
bb0:
%0 = alloc_box ${ var Builtin.Int32 }
%1 = mark_uninitialized [rootself] %0 : ${ var Builtin.Int32 }
%2 = project_box %1 : ${ var Builtin.Int32 }, 0
br bb1
bb1:
%3 = project_box %1 : ${ var Builtin.Int32 }, 0
destroy_value %1 : ${ var Builtin.Int32 }
%9999 = tuple()
return %9999 : $()
}
struct Bool {
var _value: Builtin.Int1
}
// CHECK-LABEL: sil @test_rauw_uses_of_project_box : $@convention(thin) (Builtin.Int1, @thin Bool.Type) -> Bool {
// CHECK: [[BOX:%.*]] = alloc_box ${ var Bool }
// CHECK: [[PB:%.*]] = project_box [[BOX]]
// CHECK: [[MUI:%.*]] = mark_uninitialized [rootself] [[PB]]
// CHECK: struct_element_addr [[MUI]]
// CHECK: load [trivial] [[MUI]]
// CHECK: destroy_value [[BOX]]
sil @test_rauw_uses_of_project_box : $@convention(thin) (Builtin.Int1, @thin Bool.Type) -> Bool {
bb0(%0 : @trivial $Builtin.Int1, %1 : @trivial $@thin Bool.Type):
%2 = alloc_box ${ var Bool }, var, name "self"
%3 = mark_uninitialized [rootself] %2 : ${ var Bool }
%4 = project_box %3 : ${ var Bool }, 0
debug_value %0 : $Builtin.Int1, let, name "v", argno 1
%6 = struct_element_addr %4 : $*Bool, #Bool._value
assign %0 to %6 : $*Builtin.Int1
%8 = load [trivial] %4 : $*Bool
destroy_value %3 : ${ var Bool }
return %8 : $Bool
}