Files
swift-mirror/test/SILGen/modify_accessor.swift
Erik Eckstein 7cceaff5f3 SIL: don't print operand types in textual SIL
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.
2024-11-21 18:49:52 +01:00

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)
}
}