| // RUN: %target-sil-opt -enforce-exclusivity=checked -emit-sorted-sil -access-marker-elim %s | %FileCheck %s |
| |
| sil_stage raw |
| |
| import Builtin |
| import Swift |
| import SwiftShims |
| |
| public struct S { |
| @sil_stored var i: Builtin.Int64 { get set } |
| init(i: Int) |
| } |
| |
| // CHECK-LABEL: sil hidden [noinline] @f010_initS : $@convention(thin) () -> @owned S { |
| // CHECK: bb0: |
| // CHECK: %[[BOX:.*]] = alloc_box ${ var S }, var, name "s" |
| // CHECK: %[[ADDRS:.*]] = project_box %[[BOX]] : ${ var S }, 0 |
| // CHECK: %[[NUM:.*]] = integer_literal $Builtin.Int64, 1 |
| // CHECK-NOT: begin_access |
| // CHECK: %[[ADDRI:.*]] = struct_element_addr %[[ADDRS]] : $*S, #S.i |
| // CHECK: assign %[[NUM]] to %[[ADDRI]] : $*Builtin.Int64 |
| // CHECK-NOT: end_access |
| // CHECK-NOT: begin_access |
| // CHECK: %[[VALS:.*]] = load [trivial] %[[ADDRS]] : $*S |
| // CHECK-NOT: end_access |
| // CHECK: destroy_value %[[BOX]] : ${ var S } |
| // CHECK: return %[[VALS]] : $S |
| // CHECK-LABEL: } // end sil function 'f010_initS' |
| sil hidden [noinline] @f010_initS : $@convention(thin) () -> @owned S { |
| bb0: |
| %0 = alloc_box ${ var S }, var, name "s" |
| %1 = project_box %0 : ${ var S }, 0 |
| %2 = integer_literal $Builtin.Int64, 1 |
| %3 = begin_access [modify] [unknown] %1 : $*S |
| %4 = struct_element_addr %3 : $*S, #S.i |
| assign %2 to %4 : $*Builtin.Int64 |
| end_access %3 : $*S |
| %7 = begin_access [read] [unknown] %1 : $*S |
| %8 = load [trivial] %7 : $*S |
| end_access %7 : $*S |
| destroy_value %0 : ${ var S } |
| return %8 : $S |
| } |
| |
| // Test that box arguments are dynamic. |
| // And since inactive elimination currently eliminates all dynamic markers, |
| // they are gone from the output. |
| // |
| // CHECK-LABEL: sil hidden @f020_boxArg : $@convention(thin) (@owned { var Builtin.Int64 }) -> () { |
| // CHECK: bb0(%0 : ${ var Builtin.Int64 }): |
| // CHECK: [[ADR:%.*]] = project_box %0 : ${ var Builtin.Int64 }, 0 |
| // CHECK: [[VAL:%.*]] = integer_literal $Builtin.Int64, 42 |
| // CHECK: store [[VAL]] to [trivial] [[ADR]] : $*Builtin.Int64 |
| // CHECK: destroy_value %0 : ${ var Builtin.Int64 } |
| // CHECK: return %{{.*}} : $() |
| // CHECK-LABEL: } // end sil function 'f020_boxArg' |
| sil hidden @f020_boxArg : $@convention(thin) (@owned { var Builtin.Int64 }) -> () { |
| bb0(%0 : ${ var Builtin.Int64 }): |
| %1 = project_box %0 : ${ var Builtin.Int64 }, 0 |
| %3 = integer_literal $Builtin.Int64, 42 |
| %5 = begin_access [modify] [unknown] %1 : $*Builtin.Int64 |
| store %3 to [trivial] %5 : $*Builtin.Int64 |
| end_access %5 : $*Builtin.Int64 |
| destroy_value %0 : ${ var Builtin.Int64 } |
| %9 = tuple () |
| return %9 : $() |
| } |