mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
I put in a simple fixup pass (MarkUninitializedFixup) for staging purposes. I don't expect it to be in tree long. I just did not feel comfortable fixing up in 1 commit all of the passes up to DI. rdar://31521023
83 lines
2.9 KiB
Plaintext
83 lines
2.9 KiB
Plaintext
// 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
|
|
}
|