Skip to content

Commit cce97b3

Browse files
committed
[SILGen] Used move_value for lexical lets.
Instead of using begin_borrow [lexical] + copy_value.
1 parent ed8dc59 commit cce97b3

26 files changed

+180
-135
lines changed

lib/SILGen/SILGenDecl.cpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -816,11 +816,16 @@ class LetValueInitialization : public Initialization {
816816
}
817817

818818
// Otherwise, if we do not have a no implicit copy variable, just follow
819-
// the "normal path": perform a lexical borrow if the lifetime is lexical.
820-
if (SGF.F.getLifetime(vd, value->getType()).isLexical())
821-
return SGF.B.createBeginBorrow(PrologueLoc, value, /*isLexical*/ true);
822-
else
819+
// the "normal path".
820+
821+
// If the value's not lexical, we're done.
822+
if (!SGF.F.getLifetime(vd, value->getType()).isLexical())
823823
return value;
824+
825+
if (value->getOwnershipKind() == OwnershipKind::Owned)
826+
return SGF.B.createMoveValue(PrologueLoc, value, /*isLexical*/ true);
827+
828+
return SGF.B.createBeginBorrow(PrologueLoc, value, /*isLexical*/ true);
824829
}
825830

826831
void bindValue(SILValue value, SILGenFunction &SGF, bool wasPlusOne,
@@ -2138,6 +2143,11 @@ void SILGenFunction::destroyLocalVariable(SILLocation silLoc, VarDecl *vd) {
21382143
return;
21392144
}
21402145

2146+
if (auto *mvi = dyn_cast<MoveValueInst>(Val.getDefiningInstruction())) {
2147+
B.emitDestroyValueOperation(silLoc, mvi);
2148+
return;
2149+
}
2150+
21412151
if (auto *mvi = dyn_cast<MarkMustCheckInst>(Val.getDefiningInstruction())) {
21422152
if (mvi->hasMoveCheckerKind()) {
21432153
if (auto *cvi = dyn_cast<CopyValueInst>(mvi->getOperand())) {

test/SILGen/cf_members.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ public func foo(_ x: Double) {
6868
// CHECK: [[ZVAL:%.*]] = load [trivial] [[READ]]
6969
// CHECK: [[THUNK:%.*]] = function_ref @$s10cf_members3fooyySdFSo10IAMStruct1VSdcADcfu0_ : $@convention(thin) (Struct1) -> @owned @callee_guaranteed (Double) -> Struct1
7070
// CHECK: [[C:%.*]] = apply [[THUNK]]([[ZVAL]])
71-
// CHECK: [[BORROWED_C:%.*]] = begin_borrow [lexical] [[C]]
71+
// CHECK: [[C_MOVE:%.*]] = move_value [lexical] [[C]]
72+
// CHECK: [[BORROWED_C:%.*]] = begin_borrow [[C_MOVE]]
7273
// CHECK: [[C_COPY:%.*]] = copy_value [[BORROWED_C]]
7374
// CHECK: [[BORROWED_C2:%.*]] = begin_borrow [[C_COPY]]
7475
let c: (Double) -> Struct1 = z.translate(radians:)
@@ -102,7 +103,8 @@ public func foo(_ x: Double) {
102103
// CHECK: [[ZVAL:%.*]] = load [trivial] [[READ]]
103104
// CHECK: [[THUNK:%.*]] = function_ref @$s10cf_members3fooyySdFSo10IAMStruct1VSdcADcfu4_ : $@convention(thin) (Struct1) -> @owned @callee_guaranteed (Double) -> Struct1
104105
// CHECK: [[F:%.*]] = apply [[THUNK]]([[ZVAL]])
105-
// CHECK: [[BORROWED_F:%.*]] = begin_borrow [lexical] [[F]]
106+
// CHECK: [[MOVED_F:%.*]] = move_value [lexical] [[F]]
107+
// CHECK: [[BORROWED_F:%.*]] = begin_borrow [[MOVED_F]]
106108
// CHECK: [[F_COPY:%.*]] = copy_value [[BORROWED_F]]
107109
// CHECK: [[BORROWED_F2:%.*]] = begin_borrow [[F_COPY]]
108110
let f = z.scale

test/SILGen/closures.swift

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -488,14 +488,15 @@ class SuperSub : SuperBase {
488488
// CHECK: [[INNER:%.*]] = function_ref @[[INNER_FUNC_1:\$s8closures8SuperSubC1c[_0-9a-zA-Z]*]] : $@convention(thin) (@guaranteed SuperSub) -> ()
489489
// CHECK: [[SELF_COPY:%.*]] = copy_value [[SELF]]
490490
// CHECK: [[PA:%.*]] = partial_apply [callee_guaranteed] [[INNER]]([[SELF_COPY]])
491-
// CHECK: [[BORROWED_PA:%.*]] = begin_borrow [lexical] [[PA]]
492-
// CHECK: [[PA_COPY:%.*]] = copy_value [[BORROWED_PA]]
493-
// CHECK: [[B:%.*]] = begin_borrow [[PA_COPY]]
494-
// CHECK: apply [[B]]()
491+
// CHECK: [[MOVED_PA:%.*]] = move_value [lexical] [[PA]]
492+
// CHECK: [[B:%.*]] = begin_borrow [[MOVED_PA]]
493+
// CHECK: [[B_COPY:%.*]] = copy_value [[B]]
494+
// CHECK: [[B2:%.*]] = begin_borrow [[B_COPY]]
495+
// CHECK: apply [[B2]]()
496+
// CHECK: end_borrow [[B2]]
497+
// CHECK: destroy_value [[B_COPY]]
495498
// CHECK: end_borrow [[B]]
496-
// CHECK: destroy_value [[PA_COPY]]
497-
// CHECK: end_borrow [[BORROWED_PA]]
498-
// CHECK: destroy_value [[PA]]
499+
// CHECK: destroy_value [[MOVED_PA]]
499500
// CHECK: } // end sil function '$s8closures8SuperSubC1cyyF'
500501
func c() {
501502
// CHECK: sil private [ossa] @[[INNER_FUNC_1]] : $@convention(thin) (@guaranteed SuperSub) -> ()
@@ -520,14 +521,15 @@ class SuperSub : SuperBase {
520521
// CHECK: [[INNER:%.*]] = function_ref @[[INNER_FUNC_1:\$s8closures8SuperSubC1d[_0-9a-zA-Z]*]] : $@convention(thin) (@guaranteed SuperSub) -> ()
521522
// CHECK: [[SELF_COPY:%.*]] = copy_value [[SELF]]
522523
// CHECK: [[PA:%.*]] = partial_apply [callee_guaranteed] [[INNER]]([[SELF_COPY]])
523-
// CHECK: [[BORROWED_PA:%.*]] = begin_borrow [lexical] [[PA]]
524-
// CHECK: [[PA_COPY:%.*]] = copy_value [[BORROWED_PA]]
525-
// CHECK: [[B:%.*]] = begin_borrow [[PA_COPY]]
526-
// CHECK: apply [[B]]()
527-
// CHECK: end_borrow [[B]]
528-
// CHECK: destroy_value [[PA_COPY]]
529-
// CHECK: end_borrow [[BORROWED_PA]]
530-
// CHECK: destroy_value [[PA]]
524+
// CHECK: [[MOVED_PA:%.*]] = move_value [lexical] [[PA]]
525+
// CHECK: [[B:%.*]] = begin_borrow [[MOVED_PA]]
526+
// CHECK: [[PA_COPY:%.*]] = copy_value [[B]]
527+
// CHECK: [[B2:%.*]] = begin_borrow [[PA_COPY]]
528+
// CHECK: apply [[B2]]()
529+
// CHECK: end_borrow [[B2]]
530+
// CHECK: destroy_value [[B_COPY]]
531+
// CHECK: end_borrow [[B]]
532+
// CHECK: destroy_value [[MOVED_PA]]
531533
// CHECK: } // end sil function '$s8closures8SuperSubC1dyyF'
532534
func d() {
533535
// CHECK: sil private [ossa] @[[INNER_FUNC_1]] : $@convention(thin) (@guaranteed SuperSub) -> () {
@@ -563,14 +565,15 @@ class SuperSub : SuperBase {
563565
// CHECK: [[INNER:%.*]] = function_ref @[[INNER_FUNC_NAME2:\$s8closures8SuperSubC1e.*]] : $@convention(thin)
564566
// CHECK: [[ARG_COPY:%.*]] = copy_value [[ARG]]
565567
// CHECK: [[PA:%.*]] = partial_apply [callee_guaranteed] [[INNER]]([[ARG_COPY]])
566-
// CHECK: [[BORROWED_PA:%.*]] = begin_borrow [lexical] [[PA]]
567-
// CHECK: [[PA_COPY:%.*]] = copy_value [[BORROWED_PA]]
568-
// CHECK: [[B:%.*]] = begin_borrow [[PA_COPY]]
569-
// CHECK: apply [[B]]() : $@callee_guaranteed () -> ()
570-
// CHECK: end_borrow [[B]]
571-
// CHECK: destroy_value [[PA_COPY]]
572-
// CHECK: end_borrow [[BORROWED_PA]]
573-
// CHECK: destroy_value [[PA]]
568+
// CHECK: [[MOVED_PA:%.*]] = move_value [lexical] [[PA]]
569+
// CHECK: [[B:%.*]] = begin_borrow [[MOVED_PA]]
570+
// CHECK: [[PA_COPY:%.*]] = copy_value [[B]]
571+
// CHECK: [[B2:%.*]] = begin_borrow [[PA_COPY]]
572+
// CHECK: apply [[B2]]()
573+
// CHECK: end_borrow [[B2]]
574+
// CHECK: destroy_value [[B_COPY]]
575+
// CHECK: end_borrow [[B]]
576+
// CHECK: destroy_value [[MOVED_PA]]
574577
// CHECK: } // end sil function '[[INNER_FUNC_NAME1]]'
575578
func e1() {
576579
// CHECK: sil private [ossa] @[[INNER_FUNC_NAME2]] : $@convention(thin)
@@ -595,7 +598,8 @@ class SuperSub : SuperBase {
595598
// CHECK: [[INNER:%.*]] = function_ref @[[INNER_FUNC_1:\$s8closures8SuperSubC1fyyFyycfU_]] : $@convention(thin) (@guaranteed SuperSub) -> ()
596599
// CHECK: [[SELF_COPY:%.*]] = copy_value [[SELF]]
597600
// CHECK: [[PA:%.*]] = partial_apply [callee_guaranteed] [[INNER]]([[SELF_COPY]])
598-
// CHECK: destroy_value [[PA]]
601+
// CHECK: [[MOVED_PA:%.*]] = move_value [lexical] [[PA]]
602+
// CHECK: destroy_value [[MOVED_PA]]
599603
// CHECK: } // end sil function '$s8closures8SuperSubC1fyyF'
600604
func f() {
601605
// CHECK: sil private [ossa] @[[INNER_FUNC_1]] : $@convention(thin) (@guaranteed SuperSub) -> () {

test/SILGen/errors.swift

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -107,11 +107,12 @@ func dont_return<T>(_ argument: T) throws -> T {
107107

108108
// Catch HomeworkError.CatAteIt.
109109
// CHECK: [[MATCH]]([[T0:%.*]] : @owned $Cat):
110-
// CHECK-NEXT: [[BORROWED_T0:%.*]] = begin_borrow [lexical] [[T0]]
111-
// CHECK-NEXT: debug_value [[BORROWED_T0]] : $Cat
110+
// CHECK-NEXT: [[MOVED_T0:%.*]] = move_value [lexical] [[T0]]
111+
// CHECK-NEXT: debug_value [[MOVED_T0]] : $Cat
112+
// CHECK-NEXT: [[BORROWED_T0:%.*]] = begin_borrow [[MOVED_T0]]
112113
// CHECK-NEXT: [[T0_COPY:%.*]] = copy_value [[BORROWED_T0]]
113114
// CHECK-NEXT: end_borrow [[BORROWED_T0]]
114-
// CHECK-NEXT: destroy_value [[T0]]
115+
// CHECK-NEXT: destroy_value [[MOVED_T0]]
115116
// CHECK-NEXT: dealloc_stack [[DEST_TEMP]]
116117
// CHECK-NEXT: destroy_addr [[SRC_TEMP]]
117118
// CHECK-NEXT: dealloc_stack [[SRC_TEMP]]
@@ -314,10 +315,9 @@ func all_together_now_four(_ flag: Bool) throws -> Cat? {
314315

315316
// Catch HomeworkError.CatAteIt.
316317
// CHECK: [[MATCH_ATE]]([[T0:%.*]] : @owned $Cat):
317-
// CHECK-NEXT: [[T0_BORROW:%.*]] = begin_borrow [lexical] [[T0]]
318-
// CHECK-NEXT: [[T0_COPY:%.*]] = copy_value [[T0_BORROW]]
319-
// CHECK-NEXT: end_borrow [[T0_BORROW]]
320-
// CHECK-NEXT: destroy_value [[T0]]
318+
// CHECK-NEXT: [[MOVED_T0:%.*]] = move_value [lexical] [[T0]]
319+
// CHECK-NEXT: [[T0_COPY:%.*]] = copy_value [[MOVED_T0]]
320+
// CHECK-NEXT: destroy_value [[MOVED_T0]]
321321
// CHECK-NEXT: dealloc_stack [[DEST_TEMP]]
322322
// CHECK-NEXT: destroy_addr [[SRC_TEMP]]
323323
// CHECK-NEXT: dealloc_stack [[SRC_TEMP]]
@@ -326,10 +326,9 @@ func all_together_now_four(_ flag: Bool) throws -> Cat? {
326326

327327
// Catch HomeworkError.CatHidIt.
328328
// CHECK: [[MATCH_HID]]([[T0:%.*]] : @owned $Cat):
329-
// CHECK-NEXT: [[T0_BORROW:%.*]] = begin_borrow [lexical] [[T0]]
330-
// CHECK-NEXT: [[T0_COPY:%.*]] = copy_value [[T0_BORROW]]
331-
// CHECK-NEXT: end_borrow [[T0_BORROW]]
332-
// CHECK-NEXT: destroy_value [[T0]]
329+
// CHECK-NEXT: [[MOVED_T0:%.*]] = move_value [lexical] [[T0]]
330+
// CHECK-NEXT: [[T0_COPY:%.*]] = copy_value [[MOVED_T0]]
331+
// CHECK-NEXT: destroy_value [[MOVED_T0]]
333332
// CHECK-NEXT: dealloc_stack [[DEST_TEMP]]
334333
// CHECK-NEXT: destroy_addr [[SRC_TEMP]]
335334
// CHECK-NEXT: dealloc_stack [[SRC_TEMP]]

test/SILGen/foreach.swift

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -551,18 +551,22 @@ func genericCollectionContinueBreak<T : Collection>(_ xx: T) {
551551
func tupleElements(_ xx: [(C, C)]) {
552552
// CHECK: bb{{.*}}([[PAYLOAD:%.*]] : @owned $(C, C)):
553553
// CHECK: ([[A:%.*]], [[B:%.*]]) = destructure_tuple [[PAYLOAD]]
554-
// CHECK: destroy_value [[B]]
555-
// CHECK: destroy_value [[A]]
554+
// CHECK: [[MOVED_A:%.*]] = move_value [lexical] [[A]]
555+
// CHECK: [[MOVED_B:%.*]] = move_value [lexical] [[B]]
556+
// CHECK: destroy_value [[MOVED_B]]
557+
// CHECK: destroy_value [[MOVED_A]]
556558
for (a, b) in xx {}
557559
// CHECK: bb{{.*}}([[PAYLOAD:%.*]] : @owned $(C, C)):
558560
// CHECK: ([[A:%.*]], [[B:%.*]]) = destructure_tuple [[PAYLOAD]]
561+
// CHECK: [[MOVED_A:%.*]] = move_value [lexical] [[A]]
559562
// CHECK: destroy_value [[B]]
560-
// CHECK: destroy_value [[A]]
563+
// CHECK: destroy_value [[MOVED_A]]
561564
for (a, _) in xx {}
562565
// CHECK: bb{{.*}}([[PAYLOAD:%.*]] : @owned $(C, C)):
563566
// CHECK: ([[A:%.*]], [[B:%.*]]) = destructure_tuple [[PAYLOAD]]
567+
// CHECK: [[MOVED_B:%.*]] = move_value [lexical] [[B]]
564568
// CHECK: destroy_value [[A]]
565-
// CHECK: destroy_value [[B]]
569+
// CHECK: destroy_value [[MOVED_B]]
566570
for (_, b) in xx {}
567571
// CHECK: bb{{.*}}([[PAYLOAD:%.*]] : @owned $(C, C)):
568572
// CHECK: ([[A:%.*]], [[B:%.*]]) = destructure_tuple [[PAYLOAD]]

test/SILGen/guaranteed_closure_context.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ func guaranteed_captures() {
2222
// CHECK: [[IMMUTABLE_TRIVIAL:%.*]] = apply {{.*}} -> S
2323
let immutableTrivial = S()
2424
// CHECK: [[IMMUTABLE_RETAINABLE:%.*]] = apply {{.*}} -> @owned C
25-
// CHECK: [[B_IMMUTABLE_RETAINABLE:%.*]] = begin_borrow [lexical] [[IMMUTABLE_RETAINABLE]] : $C
25+
// CHECK: [[B_IMMUTABLE_RETAINABLE:%.*]] = move_value [lexical] [[IMMUTABLE_RETAINABLE]] : $C
2626
let immutableRetainable = C()
2727
// CHECK: [[IMMUTABLE_ADDRESS_ONLY:%.*]] = alloc_stack [lexical] $any P
2828
let immutableAddressOnly: P = C()
@@ -38,8 +38,9 @@ func guaranteed_captures() {
3838
// CHECK-NOT: copy_value [[IMMUTABLE_RETAINABLE]]
3939

4040
// CHECK: [[MUTABLE_TRIVIAL_BOX_BORROW:%[^,]+]] = begin_borrow [[MUTABLE_TRIVIAL_BOX]]
41+
// CHECK: [[B_IMMUTABLE_RETAINABLE_BORROW:%.*]] = begin_borrow [[B_IMMUTABLE_RETAINABLE]] : $C
4142
// CHECK: [[FN:%.*]] = function_ref [[FN_NAME:@\$s26guaranteed_closure_context0A9_capturesyyF17captureEverythingL_yyF]]
42-
// CHECK: apply [[FN]]([[MUTABLE_TRIVIAL_BOX_BORROW]], [[MUTABLE_RETAINABLE_BOX_LIFETIME]], [[MUTABLE_ADDRESS_ONLY_BOX_LIFETIME]], [[IMMUTABLE_TRIVIAL]], [[B_IMMUTABLE_RETAINABLE]], [[IMMUTABLE_ADDRESS_ONLY]])
43+
// CHECK: apply [[FN]]([[MUTABLE_TRIVIAL_BOX_BORROW]], [[MUTABLE_RETAINABLE_BOX_LIFETIME]], [[MUTABLE_ADDRESS_ONLY_BOX_LIFETIME]], [[IMMUTABLE_TRIVIAL]], [[B_IMMUTABLE_RETAINABLE_BORROW]], [[IMMUTABLE_ADDRESS_ONLY]])
4344
captureEverything()
4445

4546
// CHECK-NOT: copy_value [[MUTABLE_TRIVIAL_BOX]]

test/SILGen/guaranteed_self.swift

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -458,11 +458,12 @@ class LetFieldClass {
458458
// CHECK-NEXT: apply [[KRAKEN_METH]]([[KRAKEN]])
459459
// CHECK: [[KRAKEN_ADDR:%.*]] = ref_element_addr [[CLS]] : $LetFieldClass, #LetFieldClass.letk
460460
// CHECK-NEXT: [[KRAKEN:%.*]] = load [copy] [[KRAKEN_ADDR]]
461-
// CHECK: [[REBORROWED_KRAKEN:%.*]] = begin_borrow [lexical] [[KRAKEN]]
461+
// CHECK: [[MOVED_KRAKEN:%.*]] = move_value [lexical] [[KRAKEN]]
462+
// CHECK: [[REBORROWED_KRAKEN:%.*]] = begin_borrow [[MOVED_KRAKEN]]
462463
// CHECK: [[DESTROY_SHIP_FUN:%.*]] = function_ref @$s15guaranteed_self11destroyShipyyAA6KrakenCF : $@convention(thin) (@guaranteed Kraken) -> ()
463464
// CHECK-NEXT: apply [[DESTROY_SHIP_FUN]]([[REBORROWED_KRAKEN]])
464465
// CHECK-NEXT: end_borrow [[REBORROWED_KRAKEN]]
465-
// CHECK-NEXT: destroy_value [[KRAKEN]]
466+
// CHECK-NEXT: destroy_value [[MOVED_KRAKEN]]
466467
// CHECK-NEXT: [[KRAKEN_BOX:%.*]] = alloc_box ${ var Kraken }
467468
// CHECK-NEXT: [[KRAKEN_LIFETIME:%.+]] = begin_borrow [lexical] [[KRAKEN_BOX]]
468469
// CHECK-NEXT: [[PB:%.*]] = project_box [[KRAKEN_LIFETIME]]
@@ -505,9 +506,11 @@ class LetFieldClass {
505506
// CHECK-NEXT: destroy_value [[KRAKEN]]
506507
// CHECK-NEXT: [[KRAKEN_GETTER_FUN:%.*]] = class_method [[CLS]] : $LetFieldClass, #LetFieldClass.vark!getter : (LetFieldClass) -> () -> Kraken, $@convention(method) (@guaranteed LetFieldClass) -> @owned Kraken
507508
// CHECK-NEXT: [[KRAKEN:%.*]] = apply [[KRAKEN_GETTER_FUN]]([[CLS]])
508-
// CHECK: [[BORROWED_KRAKEN:%.*]] = begin_borrow [lexical] [[KRAKEN]]
509+
// CHECK: [[MOVED_KRAKEN:%.*]] = move_value [lexical] [[KRAKEN]]
510+
// CHECK: [[BORROWED_KRAKEN:%.*]] = begin_borrow [[MOVED_KRAKEN]]
509511
// CHECK: [[DESTROY_SHIP_FUN:%.*]] = function_ref @$s15guaranteed_self11destroyShipyyAA6KrakenCF : $@convention(thin) (@guaranteed Kraken) -> ()
510512
// CHECK-NEXT: apply [[DESTROY_SHIP_FUN]]([[BORROWED_KRAKEN]])
513+
// CHECK-NEXT: end_borrow [[BORROWED_KRAKEN]]
511514
// CHECK-NEXT: [[KRAKEN_BOX:%.*]] = alloc_box ${ var Kraken }
512515
// CHECK-NEXT: [[KRAKEN_LIFETIME:%.+]] = begin_borrow [lexical] [[KRAKEN_BOX]]
513516
// CHECK-NEXT: [[PB:%.*]] = project_box [[KRAKEN_LIFETIME]]
@@ -522,8 +525,7 @@ class LetFieldClass {
522525
// CHECK-NEXT: destroy_value [[KRAKEN_COPY]]
523526
// CHECK-NEXT: end_borrow [[KRAKEN_LIFETIME]]
524527
// CHECK-NEXT: destroy_value [[KRAKEN_BOX]]
525-
// CHECK-NEXT: end_borrow [[BORROWED_KRAKEN]]
526-
// CHECK-NEXT: destroy_value [[KRAKEN]]
528+
// CHECK-NEXT: destroy_value [[MOVED_KRAKEN]]
527529
// CHECK-NEXT: tuple
528530
// CHECK-NEXT: return
529531
func varkMethod() {

test/SILGen/hop_to_executor.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,14 +219,15 @@ actor BlueActorImpl {
219219
// CHECK: bb0([[BLUE:%[0-9]+]] : @guaranteed $BlueActorImpl):
220220
// CHECK: hop_to_executor [[BLUE]] : $BlueActorImpl
221221
// CHECK: [[RED:%[0-9]+]] = apply {{%[0-9]+}}({{%[0-9]+}}) : $@convention(method) (@thick RedActorImpl.Type) -> @owned RedActorImpl
222-
// CHECK: [[REDBORROW:%[0-9]+]] = begin_borrow [lexical] [[RED]] : $RedActorImpl
222+
// CHECK: [[REDMOVE:%[0-9]+]] = move_value [lexical] [[RED]] : $RedActorImpl
223+
// CHECK: [[REDBORROW:%[0-9]+]] = begin_borrow [[REDMOVE]] : $RedActorImpl
223224
// CHECK: [[INTARG:%[0-9]+]] = apply {{%[0-9]+}}({{%[0-9]+}}, {{%[0-9]+}}) : $@convention(method) (Builtin.IntLiteral, @thin Int.Type) -> Int
224225
// CHECK: [[METH:%[0-9]+]] = class_method [[REDBORROW]] : $RedActorImpl, #RedActorImpl.hello : (isolated RedActorImpl) -> (Int) -> (), $@convention(method) (Int, @guaranteed RedActorImpl) -> ()
225226
// CHECK: hop_to_executor [[REDBORROW]] : $RedActorImpl
226227
// CHECK-NEXT: = apply [[METH]]([[INTARG]], [[REDBORROW]]) : $@convention(method) (Int, @guaranteed RedActorImpl) -> ()
227228
// CHECK-NEXT: hop_to_executor [[BLUE]] : $BlueActorImpl
228229
// CHECK: end_borrow [[REDBORROW]] : $RedActorImpl
229-
// CHECK: destroy_value [[RED]] : $RedActorImpl
230+
// CHECK: destroy_value [[REDMOVE]] : $RedActorImpl
230231
// CHECK: } // end sil function '$s4test13BlueActorImplC14createAndGreetyyYaF'
231232
func createAndGreet() async {
232233
let red = RedActorImpl() // <- key difference from `poke` is local construction of the actor

test/SILGen/if_while_binding.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -331,10 +331,10 @@ func testAsPatternInIfLet(_ a : BaseClass?) {
331331
// CHECK: switch_enum [[OPTVAL]] : $Optional<DerivedClass>, case #Optional.some!enumelt: [[ISDERIVEDBB:bb[0-9]+]], case #Optional.none!enumelt: [[NILBB:bb[0-9]+]]
332332

333333
// CHECK: [[ISDERIVEDBB]]([[DERIVEDVAL:%[0-9]+]] : @owned $DerivedClass):
334-
// CHECK: [[BORROWED_DERIVED_VAL:%.*]] = begin_borrow [lexical] [[DERIVEDVAL]]
335-
// CHECK: debug_value [[BORROWED_DERIVED_VAL]] : $DerivedClass
334+
// CHECK: [[MOVED_DERIVED_VAL:%.*]] = move_value [lexical] [[DERIVEDVAL]]
335+
// CHECK: debug_value [[MOVED_DERIVED_VAL]] : $DerivedClass
336336
// => SEMANTIC SIL TODO: This is benign, but scoping wise, this end borrow should be after derived val.
337-
// CHECK: destroy_value [[DERIVEDVAL]] : $DerivedClass
337+
// CHECK: destroy_value [[MOVED_DERIVED_VAL]] : $DerivedClass
338338
// CHECK: br [[EXITBB]]
339339

340340
// CHECK: [[EXITBB]]:

test/SILGen/import_as_member.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,12 @@ public func useClass(d: Double, opts: SomeClass.Options) {
4646
// CHECK: [[OBJ:%[0-9]+]] = apply [[CTOR]]([[D]])
4747
let o = SomeClass(value: d)
4848

49-
// CHECK: [[BORROWED_OBJ:%.*]] = begin_borrow [lexical] [[OBJ]]
49+
// CHECK: [[MOVED_OBJ:%.*]] = move_value [lexical] [[OBJ]]
50+
// CHECK: [[BORROWED_OBJ:%.*]] = begin_borrow [[MOVED_OBJ]]
5051
// CHECK: [[APPLY_FN:%[0-9]+]] = function_ref @IAMSomeClassApplyOptions : $@convention(c) (SomeClass, SomeClass.Options) -> ()
5152
// CHECK: apply [[APPLY_FN]]([[BORROWED_OBJ]], [[OPTS]])
5253
// CHECK: end_borrow [[BORROWED_OBJ]]
53-
// CHECK: destroy_value [[OBJ]]
54+
// CHECK: destroy_value [[MOVED_OBJ]]
5455
o.applyOptions(opts)
5556
}
5657

test/SILGen/indirect_enum.swift

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -366,11 +366,13 @@ func guardTreeA<T>(_ tree: TreeA<T>) {
366366
// CHECK: [[TUPLE_COPY:%.*]] = copy_value [[TUPLE]]
367367
// CHECK: end_borrow [[TUPLE]]
368368
// CHECK: ([[L:%.*]], [[R:%.*]]) = destructure_tuple [[TUPLE_COPY]]
369+
// CHECK: [[MOVED_L:%.*]] = move_value [lexical] [[L]]
370+
// CHECK: [[MOVED_R:%.*]] = move_value [lexical] [[R]]
369371
// CHECK: destroy_value [[BOX]]
370372
guard case .Branch(left: let l, right: let r) = tree else { return }
371373

372-
// CHECK: destroy_value [[R]]
373-
// CHECK: destroy_value [[L]]
374+
// CHECK: destroy_value [[MOVED_R]]
375+
// CHECK: destroy_value [[MOVED_L]]
374376
// CHECK: destroy_addr [[X]]
375377
}
376378

@@ -408,9 +410,11 @@ func guardTreeA<T>(_ tree: TreeA<T>) {
408410
// CHECK: [[TUPLE_COPY:%.*]] = copy_value [[TUPLE]]
409411
// CHECK: end_borrow [[TUPLE]]
410412
// CHECK: ([[L:%.*]], [[R:%.*]]) = destructure_tuple [[TUPLE_COPY]]
413+
// CHECK: [[MOVED_L:%.*]] = move_value [lexical] [[L]]
414+
// CHECK: [[MOVED_R:%.*]] = move_value [lexical] [[R]]
411415
// CHECK: destroy_value [[BOX]]
412-
// CHECK: destroy_value [[R]]
413-
// CHECK: destroy_value [[L]]
416+
// CHECK: destroy_value [[MOVED_R]]
417+
// CHECK: destroy_value [[MOVED_L]]
414418
if case .Branch(left: let l, right: let r) = tree { }
415419
}
416420
// CHECK: [[NO3]]([[ORIGINAL_VALUE:%.*]] : @owned $TreeA<T>):

0 commit comments

Comments
 (0)