mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Previously, whenever an alloc_box that was promoted to an alloc_stack, the new alloc_stack would be lexical. The result was that alloc_boxes which didn't need (or explicitly didn't want, in the case of eager move vars) received lexical alloc_stacks. Here, only add the lexical flag to the new alloc_stack instruction if any of the box's uses are `begin_borrow [lexical]`. That way, alloc_boxes end up having lexical alloc_stacks only if they were "lexical alloc_boxes".
53 lines
1.3 KiB
Plaintext
53 lines
1.3 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
|
|
}
|
|
|