| // 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 |
| } |