blob: ae09df4f46d6b680f1f770bda73ad84f0ea63f3b [file] [log] [blame]
// RUN: %target-sil-opt -mark-uninitialized-fixup %s | %FileCheck %s
sil_stage raw
import Builtin
// CHECK-LABEL: sil [ossa] @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 [ossa] @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 [ossa] @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 [ossa] @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 [ossa] @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 [ossa] @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 [ossa] @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 [ossa] @test_rauw_uses_of_project_box : $@convention(thin) (Builtin.Int1, @thin Bool.Type) -> Bool {
bb0(%0 : $Builtin.Int1, %1 : $@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
}
// This is a simulation of the type of callee generated by capture promotion.
sil @capture_promotion_generated_callee : $@convention(thin) (@in Bool) -> ()
// CHECK-LABEL: sil [ossa] @test_copyvalue_use_of_projectbox : $@convention(thin) (Builtin.Int1) -> () {
// CHECK: bb0([[ARG:%.*]] : $Builtin.Int1):
// CHECK: [[BOX:%.*]] = alloc_box ${ var Bool }, var, name "self"
// CHECK: [[PB:%.*]] = project_box [[BOX]]
// CHECK: [[MUI:%.*]] = mark_uninitialized [rootself] [[PB]]
// CHECK: [[BOX_COPY:%.*]] = copy_value [[BOX]]
// CHECK: [[PB_BOX_COPY:%.*]] = project_box [[BOX_COPY]]
// CHECK: destroy_value [[BOX_COPY]]
// CHECK: destroy_value [[BOX]]
sil [ossa] @test_copyvalue_use_of_projectbox : $@convention(thin) (Builtin.Int1) -> () {
bb0(%0 : $Builtin.Int1):
// Initial initialization.
%1 = alloc_box ${ var Bool }, var, name "self"
%2 = mark_uninitialized [rootself] %1 : ${ var Bool }
%3 = project_box %2 : ${ var Bool }, 0
%4 = struct_element_addr %3 : $*Bool, #Bool._value
store %0 to [trivial] %4 : $*Builtin.Int1
// copy + project_box for function_call. This can happen via
// capture_promotion.
%5 = function_ref @capture_promotion_generated_callee : $@convention(thin) (@in Bool) -> ()
%6 = copy_value %2 : ${ var Bool }
%7 = project_box %6 : ${ var Bool }, 0
%8 = apply %5(%7) : $@convention(thin) (@in Bool) -> ()
destroy_value %6 : ${ var Bool }
// Epilog
destroy_value %2 : ${ var Bool }
%9999 = tuple()
return %9999 : $()
}