Files
swift-mirror/test/SILOptimizer/allocbox_to_stack_lifetime.sil
Nate Chandler 896a464ced [AllocBoxToStack] Lexical borrowees get lexical alloc_stacks.
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".
2022-08-12 11:37:19 -07:00

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
}