| // RUN: %target-sil-opt -enable-sil-ownership -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 : $() |
| } |