mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Type annotations for instruction operands are omitted, e.g. ``` %3 = struct $S(%1, %2) ``` Operand types are redundant anyway and were only used for sanity checking in the SIL parser. But: operand types _are_ printed if the definition of the operand value was not printed yet. This happens: * if the block with the definition appears after the block where the operand's instruction is located * if a block or instruction is printed in isolation, e.g. in a debugger The old behavior can be restored with `-Xllvm -sil-print-types`. This option is added to many existing test files which check for operand types in their check-lines.
121 lines
4.9 KiB
Swift
121 lines
4.9 KiB
Swift
// RUN: %target-swift-emit-silgen -Xllvm -sil-print-types %s | %FileCheck %s
|
|
|
|
func readwrite(_ : inout String) {}
|
|
|
|
struct SimpleModify {
|
|
var stored: String
|
|
|
|
var modifiable: String {
|
|
get {}
|
|
// CHECK-LABEL: sil hidden [ossa] @$s15modify_accessor12SimpleModifyV10modifiableSSvM
|
|
// CHECK-SAME: : $@yield_once @convention(method) (@inout SimpleModify) -> @yields @inout String {
|
|
// CHECK: [[SELF:%.*]] = begin_access [modify] [unknown] %0 : $*SimpleModify
|
|
// CHECK-NEXT: [[FIELD:%.*]] = struct_element_addr [[SELF]] : $*SimpleModify, #SimpleModify.stored
|
|
// CHECK-NEXT: yield [[FIELD]] : $*String, resume bb1, unwind bb2
|
|
// CHECK: bb1:
|
|
// CHECK-NEXT: end_access [[SELF]] : $*SimpleModify
|
|
// CHECK-NEXT: [[RET:%.*]] = tuple ()
|
|
// CHECK-NEXT: return [[RET]] : $()
|
|
// CHECK: bb2:
|
|
// CHECK-NEXT: end_access [[SELF]] : $*SimpleModify
|
|
// CHECK-NEXT: unwind
|
|
_modify {
|
|
yield &stored
|
|
}
|
|
}
|
|
|
|
// CHECK-LABEL: sil hidden [ossa] @$s15modify_accessor12SimpleModifyV3set6stringySS_tF
|
|
// CHECK: [[VALUE:%.*]] = copy_value %0 : $String
|
|
// CHECK-NEXT: [[SELF:%.*]] = begin_access [modify] [unknown] %1 : $*SimpleModify
|
|
// CHECK-NEXT: // function_ref
|
|
// CHECK-NEXT: [[MODIFYFN:%.*]] = function_ref @$s15modify_accessor12SimpleModifyV10modifiableSSvM
|
|
// CHECK-NEXT: ([[FIELD:%.*]], [[TOKEN:%.*]]) = begin_apply [[MODIFYFN]]([[SELF]])
|
|
// CHECK-NEXT: assign [[VALUE]] to [[FIELD]] : $*String
|
|
// CHECK-NEXT: end_apply [[TOKEN]]
|
|
// CHECK-NEXT: end_access [[SELF]] : $*SimpleModify
|
|
// CHECK-NEXT: [[RET:%.*]] = tuple ()
|
|
// CHECK-NEXT: return [[RET]] : $()
|
|
mutating func set(string: String) {
|
|
modifiable = string
|
|
}
|
|
|
|
// CHECK-LABEL: sil hidden [ossa] @$s15modify_accessor12SimpleModifyV0A0yyF
|
|
// CHECK: [[SELF:%.*]] = begin_access [modify] [unknown] %0 : $*SimpleModify
|
|
// CHECK-NEXT: // function_ref
|
|
// CHECK-NEXT: [[MODIFYFN:%.*]] = function_ref @$s15modify_accessor12SimpleModifyV10modifiableSSvM
|
|
// CHECK-NEXT: ([[FIELD:%.*]], [[TOKEN:%.*]]) = begin_apply [[MODIFYFN]]([[SELF]])
|
|
// CHECK-NEXT: // function_ref
|
|
// CHECK-NEXT: [[READWRITE:%.*]] = function_ref @$s15modify_accessor9readwriteyySSzF
|
|
// CHECK-NEXT: apply [[READWRITE]]([[FIELD]])
|
|
// CHECK-NEXT: end_apply [[TOKEN]]
|
|
// CHECK-NEXT: end_access [[SELF]] : $*SimpleModify
|
|
// CHECK-NEXT: [[RET:%.*]] = tuple ()
|
|
// CHECK-NEXT: return [[RET]] : $()
|
|
mutating func modify() {
|
|
readwrite(&modifiable)
|
|
}
|
|
}
|
|
|
|
class SetterSynthesisFromModify {
|
|
var stored: String = "test"
|
|
var modifiable: String {
|
|
get { return stored }
|
|
// CHECK: sil hidden [transparent] [ossa] @$s15modify_accessor25SetterSynthesisFromModifyC10modifiableSSvs
|
|
// CHECK: debug_value
|
|
// CHECK-NEXT: debug_value
|
|
// CHECK-NEXT: [[VALUE_BORROW:%.*]] = begin_borrow %0 : $String
|
|
// CHECK-NEXT: [[VALUE:%.*]] = copy_value [[VALUE_BORROW]] : $String
|
|
// CHECK-NEXT: // function_ref
|
|
// CHECK-NEXT: [[MODIFYFN:%.*]] = function_ref @$s15modify_accessor25SetterSynthesisFromModifyC10modifiableSSvM
|
|
// CHECK-NEXT: ([[FIELD:%.*]], [[TOKEN:%.*]]) = begin_apply [[MODIFYFN]](%1)
|
|
// CHECK-NEXT: assign [[VALUE]] to [[FIELD]] : $*String
|
|
// CHECK-NEXT: end_apply [[TOKEN]]
|
|
// CHECK-NEXT: end_borrow [[VALUE_BORROW]]
|
|
// CHECK-NEXT: destroy_value %0 : $String
|
|
// CHECK-NEXT: [[RET:%.*]] = tuple ()
|
|
// CHECK-NEXT: return [[RET]] : $()
|
|
_modify {
|
|
yield &stored
|
|
}
|
|
}
|
|
}
|
|
|
|
struct ModifyAndSet {
|
|
var stored: String
|
|
|
|
var modifiable: String {
|
|
get { return stored }
|
|
_modify { yield &stored }
|
|
set(value) { stored = value }
|
|
}
|
|
|
|
// CHECK-LABEL: sil hidden [ossa] @$s15modify_accessor12ModifyAndSetV3set6stringySS_tF
|
|
// CHECK: [[VALUE:%.*]] = copy_value %0 : $String
|
|
// CHECK-NEXT: [[SELF:%.*]] = begin_access [modify] [unknown] %1 : $*ModifyAndSet
|
|
// CHECK-NEXT: // function_ref
|
|
// CHECK-NEXT: [[SETTERFN:%.*]] = function_ref @$s15modify_accessor12ModifyAndSetV10modifiableSSvs
|
|
// CHECK-NEXT: apply [[SETTERFN]]([[VALUE]], [[SELF]])
|
|
// CHECK-NEXT: end_access [[SELF]] : $*ModifyAndSet
|
|
// CHECK-NEXT: [[RET:%.*]] = tuple ()
|
|
// CHECK-NEXT: return [[RET]] : $()
|
|
mutating func set(string: String) {
|
|
modifiable = string
|
|
}
|
|
|
|
// CHECK-LABEL: sil hidden [ossa] @$s15modify_accessor12ModifyAndSetV0A0yyF
|
|
// CHECK: [[SELF:%.*]] = begin_access [modify] [unknown] %0 : $*ModifyAndSet
|
|
// CHECK-NEXT: // function_ref
|
|
// CHECK-NEXT: [[MODIFYFN:%.*]] = function_ref @$s15modify_accessor12ModifyAndSetV10modifiableSSvM
|
|
// CHECK-NEXT: ([[FIELD:%.*]], [[TOKEN:%.*]]) = begin_apply [[MODIFYFN]]([[SELF]])
|
|
// CHECK-NEXT: // function_ref
|
|
// CHECK-NEXT: [[READWRITE:%.*]] = function_ref @$s15modify_accessor9readwriteyySSzF
|
|
// CHECK-NEXT: apply [[READWRITE]]([[FIELD]])
|
|
// CHECK-NEXT: end_apply [[TOKEN]]
|
|
// CHECK-NEXT: end_access [[SELF]] : $*ModifyAndSet
|
|
// CHECK-NEXT: [[RET:%.*]] = tuple ()
|
|
// CHECK-NEXT: return [[RET]] : $()
|
|
mutating func modify() {
|
|
readwrite(&modifiable)
|
|
}
|
|
}
|