mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
The rewrite was missing the intentional omission of `dealloc_stack`s corresponding to `[dead_end]` `dealloc_box`es. Add the necessary bridging to get to parity with the original. Without this check, `dealloc_box [dead_end]`s are promoted to `dealloc_stack`s but the memory projected out of such `alloc_box`s need not be valid. rdar://159271158
74 lines
1.8 KiB
Plaintext
74 lines
1.8 KiB
Plaintext
// RUN: %target-sil-opt -enable-sil-verify-all %s -allocbox-to-stack -enable-lexical-lifetimes | %FileCheck %s
|
|
|
|
sil_stage raw
|
|
|
|
import Builtin
|
|
|
|
struct Int {
|
|
var _value: Builtin.Int64
|
|
}
|
|
|
|
struct Bool {
|
|
var _value: Builtin.Int1
|
|
}
|
|
|
|
protocol Error {}
|
|
|
|
// CHECK-LABEL: sil [ossa] @promote_nonlexical
|
|
// CHECK: alloc_stack $
|
|
// CHECK-NOT: alloc_box
|
|
// CHECK-NOT: destroy_value
|
|
// CHECK: return
|
|
// CHECK-LABEL: } // end sil function 'promote_nonlexical'
|
|
sil [ossa] @promote_nonlexical : $@convention(thin) (Int) -> Int {
|
|
bb0(%0 : $Int):
|
|
%1 = alloc_box ${ var Int }
|
|
%1a = project_box %1 : ${ var Int }, 0
|
|
store %0 to [trivial] %1a : $*Int
|
|
|
|
%3 = load [trivial] %1a : $*Int
|
|
destroy_value %1 : ${ var Int }
|
|
return %3 : $Int
|
|
}
|
|
|
|
// CHECK-LABEL: sil [ossa] @promote_lexical
|
|
// CHECK: alloc_stack [lexical]
|
|
// CHECK-NOT: alloc_box
|
|
// CHECK-NOT: destroy_value
|
|
// CHECK: return
|
|
// CHECK-LABEL: } // end sil function 'promote_lexical'
|
|
sil [ossa] @promote_lexical : $@convention(thin) (Int) -> Int {
|
|
bb0(%0 : $Int):
|
|
%1 = alloc_box ${ var Int }
|
|
%b = begin_borrow [lexical] %1 : ${ var Int }
|
|
%1a = project_box %b : ${ var Int }, 0
|
|
store %0 to [trivial] %1a : $*Int
|
|
|
|
%3 = load [trivial] %1a : $*Int
|
|
end_borrow %b : ${ var Int }
|
|
destroy_value %1 : ${ var Int }
|
|
return %3 : $Int
|
|
}
|
|
|
|
// CHECK-LABEL: sil [ossa] @keep_dead_end : {{.*}} {
|
|
// CHECK: [[STACK:%[^,]+]] = alloc_stack
|
|
// CHECK: cond_br undef, [[DIE:bb[0-9]+]]
|
|
// CHECK: [[DIE]]:
|
|
// CHECK-NEXT: unreachable
|
|
// CHECK-LABEL: } // end sil function 'keep_dead_end'
|
|
sil [ossa] @keep_dead_end : $@convention(thin) () -> () {
|
|
bb0:
|
|
%b = alloc_box ${ var Int }
|
|
cond_br undef, die, exit
|
|
|
|
die:
|
|
dealloc_box [dead_end] %b : ${ var Int }
|
|
unreachable
|
|
|
|
exit:
|
|
dealloc_box %b : ${ var Int }
|
|
%retval = tuple ()
|
|
return %retval : $()
|
|
|
|
}
|