mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
For example:
```
%0 = load %1
copy_addr %1 to %2
```
->
```
%0 = load %1
store %0 to %2
```
This is important for MandatoryRedundantLoadElimination to be able to create statically initialized globals in the mandatory pipeline.
For example:
```
public struct MyStruct {
public static let r: Range<Int> = 1 ..< 3
}
```
gets a statically initialized global, even at Onone, with this improvement.
rdar://149356742
77 lines
3.5 KiB
Swift
77 lines
3.5 KiB
Swift
// RUN: %target-swift-frontend -emit-silgen -enable-experimental-feature ReferenceBindings -o - %s | %FileCheck %s
|
|
// RUN: %target-swift-frontend -emit-sil -sil-verify-all -enable-experimental-feature ReferenceBindings -o - %s | %FileCheck -check-prefix=SIL %s
|
|
|
|
// REQUIRES: swift_feature_ReferenceBindings
|
|
|
|
class Klass {}
|
|
struct S {
|
|
var k = Klass()
|
|
}
|
|
|
|
func doSomething() {}
|
|
|
|
// Before the transformation, our access scope is not to end of scope... so
|
|
// doSomething() is not within the access scope.
|
|
//
|
|
// CHECK-LABEL: sil hidden [ossa] @$s18reference_bindings13testBindToVaryyF : $@convention(thin) () -> () {
|
|
// CHECK: [[BOX:%.*]] = alloc_box ${ var Int }, var, name "x"
|
|
// CHECK: [[LIFETIME:%.*]] = begin_borrow [var_decl] %0
|
|
// CHECK: [[PROJECT:%.*]] = project_box [[LIFETIME]]
|
|
// CHECK: [[INOUT_BOX:%.*]] = alloc_box ${ var Int }, var, name "x2"
|
|
// CHECK: [[UNRESOLVED_BINDING:%.*]] = mark_unresolved_reference_binding [inout] [[INOUT_BOX]]
|
|
// CHECK: [[INOUT_LIFETIME:%.*]] = begin_borrow [var_decl] [[UNRESOLVED_BINDING]]
|
|
// CHECK: [[INOUT_PROJECT:%.*]] = project_box [[INOUT_LIFETIME]]
|
|
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[PROJECT]]
|
|
// CHECK: copy_addr [[ACCESS]] to [init] [[INOUT_PROJECT]]
|
|
// CHECK: end_access [[ACCESS]]
|
|
// CHECK: [[FUNC:%.*]] = function_ref @$s18reference_bindings11doSomethingyyF : $@convention(thin) () -> ()
|
|
// CHECK: apply [[FUNC]]()
|
|
// CHECK: destroy_value [[UNRESOLVED_BINDING]]
|
|
// CHECK: destroy_value [[BOX]]
|
|
// CHECK: } // end sil function '$s18reference_bindings13testBindToVaryyF'
|
|
|
|
// SIL: sil hidden @$s18reference_bindings13testBindToVaryyF : $@convention(thin) () -> () {
|
|
// SIL: bb0:
|
|
// SIL: [[BOX:%.*]] = alloc_stack [var_decl] $Int, var, name "x"
|
|
// SIL: [[INOUT_BOX:%.*]] = alloc_stack [var_decl] $Int, var, name "x2"
|
|
// SIL: [[ACCESS:%.*]] = begin_access [modify] [static] [[BOX]]
|
|
// SIL: store {{%.*}} to [[INOUT_BOX]]
|
|
// SIL: [[FUNC:%.*]] = function_ref @$s18reference_bindings11doSomethingyyF : $@convention(thin) () -> ()
|
|
// SIL: apply [[FUNC]]()
|
|
// SIL: store {{%.*}} to [[ACCESS]]
|
|
// SIL: end_access [[ACCESS]]
|
|
// SIL: } // end sil function '$s18reference_bindings13testBindToVaryyF'
|
|
func testBindToVar() {
|
|
var x = 5
|
|
inout x2 = x
|
|
doSomething()
|
|
}
|
|
|
|
// CHECK-LABEL: sil hidden [ossa] @$s18reference_bindings15testBindToInOutyySSzF : $@convention(thin) (@inout String) -> () {
|
|
// CHECK: bb0([[ARG:%.*]] : $*String):
|
|
// CHECK: [[BOX:%.*]] = alloc_box ${ var String }
|
|
// CHECK: [[MARK:%.*]] = mark_unresolved_reference_binding [inout] [[BOX]]
|
|
// CHECK: [[LIFETIME:%.*]] = begin_borrow [var_decl] [[MARK]]
|
|
// CHECK: [[PROJECT:%.*]] = project_box [[LIFETIME]]
|
|
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[ARG]]
|
|
// CHECK: copy_addr [[ACCESS]] to [init] [[PROJECT]]
|
|
// CHECK: end_access [[ACCESS]]
|
|
// CHECK: apply {{%.*}}()
|
|
// CHECK: destroy_value [[MARK]]
|
|
// CHECK: } // end sil function '$s18reference_bindings15testBindToInOutyySSzF'
|
|
|
|
// SIL-LABEL: sil hidden @$s18reference_bindings15testBindToInOutyySSzF : $@convention(thin) (@inout String) -> () {
|
|
// SIL: bb0([[ARG:%.*]] : $*String):
|
|
// SIL: [[STACK:%.*]] = alloc_stack [var_decl] $String
|
|
// SIL: [[ACCESS:%.*]] = begin_access [modify] [static] [[ARG]]
|
|
// SIL: copy_addr [take] [[ACCESS]] to [init] [[STACK]]
|
|
// SIL: apply {{%.*}}
|
|
// SIL: copy_addr [take] [[STACK]] to [init] [[ACCESS]]
|
|
// SIL: end_access [[ACCESS]]
|
|
// SIL: dealloc_stack [[STACK]]
|
|
// SIL: } // end sil function '$s18reference_bindings15testBindToInOutyySSzF'
|
|
func testBindToInOut(_ x: inout String) {
|
|
inout y = x
|
|
doSomething()
|
|
}
|