Skip to content

Commit 3f13aa2

Browse files
committed
[silgen] Change SILGenApply to use destructure, eliminating copies at -Onone, and simplifying code.
rdar://43493020
1 parent d5d575b commit 3f13aa2

16 files changed

+51
-140
lines changed

lib/SILGen/SILGenApply.cpp

Lines changed: 10 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -4492,40 +4492,17 @@ RValue SILGenFunction::emitApply(ResultPlanPtr &&resultPlan,
44924492
} else if (substFnConv.getNumDirectSILResults() == 1) {
44934493
addManagedDirectResult(rawDirectResult, *directSILResults.begin());
44944494
} else {
4495-
llvm::SmallVector<std::pair<SILValue, const SILResultInfo &>, 8>
4496-
copiedResults;
4497-
{
4498-
Scope S(Cleanups, CleanupLocation::get(loc));
4499-
4500-
// First create an rvalue cleanup for our direct result.
4501-
ManagedValue managedDirectResult =
4502-
emitManagedRValueWithCleanup(rawDirectResult);
4503-
// Then borrow the managed direct result.
4504-
ManagedValue borrowedDirectResult =
4505-
managedDirectResult.borrow(*this, loc);
4506-
// Then create unmanaged copies of the direct result and forward the
4507-
// result as expected by addManageDirectResult.
4508-
unsigned Index = 0;
4509-
for (const SILResultInfo &directResult : directSILResults) {
4510-
ManagedValue elt =
4511-
B.createTupleExtract(loc, borrowedDirectResult, Index,
4512-
substFnConv.getSILType(directResult));
4513-
SILValue v = elt.copyUnmanaged(*this, loc).forward(*this);
4514-
// We assume that unowned inner pointers, autoreleased values, and
4515-
// indirect values are never returned in tuples.
4516-
// FIXME: can this assertion be removed without lowered addresses?
4517-
assert(directResult.getConvention() == ResultConvention::Owned ||
4518-
directResult.getConvention() == ResultConvention::Unowned ||
4519-
!substFnConv.useLoweredAddresses());
4520-
copiedResults.push_back({v, directResult});
4521-
++Index;
4522-
}
4523-
// Then allow the cleanups to be emitted in the proper reverse order.
4524-
}
4495+
auto directSILResultsIter = directSILResults.begin();
45254496
// Finally add our managed direct results.
4526-
for (auto p : copiedResults) {
4527-
addManagedDirectResult(p.first, p.second);
4528-
}
4497+
B.emitDestructureValueOperation(
4498+
loc, rawDirectResult, [&](unsigned index, SILValue v) {
4499+
auto directResult = *directSILResultsIter;
4500+
++directSILResultsIter;
4501+
assert(directResult.getConvention() == ResultConvention::Owned ||
4502+
directResult.getConvention() == ResultConvention::Unowned ||
4503+
!substFnConv.useLoweredAddresses());
4504+
addManagedDirectResult(v, directResult);
4505+
});
45294506
}
45304507

45314508
// If there was a foreign error convention, consider it.

lib/SILGen/SILGenBuilder.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,7 @@ class SILGenBuilder : public SILBuilder {
411411
using SILBuilder::createReturn;
412412
ReturnInst *createReturn(SILLocation Loc, ManagedValue ReturnValue);
413413

414+
using SILBuilder::emitDestructureValueOperation;
414415
/// Perform either a tuple or struct destructure and then pass its components
415416
/// as managed value one by one with an index to the closure.
416417
void emitDestructureValueOperation(

test/IRGen/generic_tuples.swift

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,6 @@ func callDupC(_ c: C) { _ = dupC(c) }
6767
// CHECK-NEXT: [[TUPLE:%.*]] = call swiftcc { %T14generic_tuples1CC*, %T14generic_tuples1CC* } @"$S14generic_tuples4dupCyx_xtxAA1CCRbzlF"(%T14generic_tuples1CC* %0, %swift.type* [[METATYPE]])
6868
// CHECK-NEXT: [[LEFT:%.*]] = extractvalue { %T14generic_tuples1CC*, %T14generic_tuples1CC* } [[TUPLE]], 0
6969
// CHECK-NEXT: [[RIGHT:%.*]] = extractvalue { %T14generic_tuples1CC*, %T14generic_tuples1CC* } [[TUPLE]], 1
70-
// CHECK-NEXT: [[LEFT_CAST:%.*]] = bitcast %T14generic_tuples1CC* [[LEFT]] to %swift.refcounted*
71-
// CHECK-NEXT: call %swift.refcounted* @swift_retain(%swift.refcounted* returned [[LEFT_CAST]]
72-
// CHECK-NEXT: [[RIGHT_CAST:%.*]] = bitcast %T14generic_tuples1CC* [[RIGHT]] to %swift.refcounted*
73-
// CHECK-NEXT: call %swift.refcounted* @swift_retain(%swift.refcounted* returned [[RIGHT_CAST]]
74-
// CHECK-NEXT: call void bitcast (void (%swift.refcounted*)* @swift_release to void (%T14generic_tuples1CC*)*)(%T14generic_tuples1CC* [[LEFT]])
75-
// CHECK-NEXT: call void bitcast (void (%swift.refcounted*)* @swift_release to void (%T14generic_tuples1CC*)*)(%T14generic_tuples1CC* [[RIGHT]])
7670
// CHECK-NEXT: call void bitcast (void (%swift.refcounted*)* @swift_release to void (%T14generic_tuples1CC*)*)(%T14generic_tuples1CC* [[RIGHT]])
7771
// CHECK-NEXT: call void bitcast (void (%swift.refcounted*)* @swift_release to void (%T14generic_tuples1CC*)*)(%T14generic_tuples1CC* [[LEFT]])
7872
// CHECK-NEXT: ret void

test/SILGen/accessors.swift

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,7 @@ func test0(_ ref: A) {
5454
// CHECK-NEXT: [[T0:%.*]] = address_to_pointer [[BUFFER]]
5555
// CHECK-NEXT: [[T1:%.*]] = class_method [[ARG]] : $A, #A.array!materializeForSet.1
5656
// CHECK-NEXT: [[T2:%.*]] = apply [[T1]]([[T0]], [[STORAGE]], [[ARG]])
57-
// CHECK-NEXT: [[T3:%.*]] = tuple_extract [[T2]] {{.*}}, 0
58-
// CHECK-NEXT: [[OPT_CALLBACK:%.*]] = tuple_extract [[T2]] {{.*}}, 1
57+
// CHECK-NEXT: ([[T3:%.*]], [[OPT_CALLBACK:%.*]]) = destructure_tuple [[T2]]
5958
// CHECK-NEXT: [[T4:%.*]] = pointer_to_address [[T3]]
6059
// CHECK-NEXT: [[ADDR:%.*]] = mark_dependence [[T4]] : $*OrdinarySub on [[ARG]] : $A
6160
// CHECK-NEXT: [[ACCESS:%.*]] = begin_access [modify] [unsafe] [[ADDR]] : $*OrdinarySub
@@ -112,8 +111,7 @@ func test1(_ ref: B) {
112111
// CHECK-NEXT: [[T0:%.*]] = address_to_pointer [[BUFFER]]
113112
// CHECK-NEXT: [[T1:%.*]] = class_method [[ARG]] : $B, #B.array!materializeForSet.1
114113
// CHECK-NEXT: [[T2:%.*]] = apply [[T1]]([[T0]], [[STORAGE]], [[ARG]])
115-
// CHECK-NEXT: [[T3:%.*]] = tuple_extract [[T2]] {{.*}}, 0
116-
// CHECK-NEXT: [[OPT_CALLBACK:%.*]] = tuple_extract [[T2]] {{.*}}, 1
114+
// CHECK-NEXT: ([[T3:%.*]], [[OPT_CALLBACK:%.*]]) = destructure_tuple [[T2]]
117115
// CHECK-NEXT: [[T4:%.*]] = pointer_to_address [[T3]]
118116
// CHECK-NEXT: [[ADDR:%.*]] = mark_dependence [[T4]] : $*MutatingSub on [[ARG]] : $B
119117
// CHECK-NEXT: [[ACCESS:%.*]] = begin_access [modify] [unsafe] [[ADDR]] : $*MutatingSub
@@ -140,8 +138,7 @@ func test1(_ ref: B) {
140138
// CHECK-NEXT: [[T0:%.*]] = address_to_pointer [[BUFFER2]]
141139
// CHECK-NEXT: [[T1:%.*]] = class_method [[ARG]] : $B, #B.array!materializeForSet.1
142140
// CHECK-NEXT: [[T2:%.*]] = apply [[T1]]([[T0]], [[STORAGE2]], [[ARG]])
143-
// CHECK-NEXT: [[T3:%.*]] = tuple_extract [[T2]] {{.*}}, 0
144-
// CHECK-NEXT: [[OPT_CALLBACK:%.*]] = tuple_extract [[T2]] {{.*}}, 1
141+
// CHECK-NEXT: ([[T3:%.*]], [[OPT_CALLBACK:%.*]]) = destructure_tuple [[T2]]
145142
// CHECK-NEXT: [[T4:%.*]] = pointer_to_address [[T3]]
146143
// CHECK-NEXT: [[ADDR:%.*]] = mark_dependence [[T4]] : $*MutatingSub on [[ARG]] : $B
147144
// CHECK-NEXT: [[ACCESS:%.*]] = begin_access [modify] [unsafe] [[ADDR]] : $*MutatingSub

test/SILGen/decls.swift

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,7 @@ func tuple_patterns() {
5555
// CHECK: [[HADDR:%[0-9]+]] = alloc_box ${ var Double }
5656
// CHECK: [[PBH:%.*]] = project_box [[HADDR]]
5757
// CHECK: [[EFGH:%[0-9]+]] = apply
58-
// CHECK: [[E:%[0-9]+]] = tuple_extract {{.*}}, 0
59-
// CHECK: [[F:%[0-9]+]] = tuple_extract {{.*}}, 1
60-
// CHECK: [[H:%[0-9]+]] = tuple_extract {{.*}}, 2
58+
// CHECK: ([[E:%[0-9]+]], [[F:%[0-9]+]], [[H:%[0-9]+]]) = destructure_tuple
6159
// CHECK: store [[E]] to [trivial] [[PBE]]
6260
// CHECK: store [[F]] to [trivial] [[PBF]]
6361
// CHECK: store [[H]] to [trivial] [[PBH]]
@@ -79,8 +77,7 @@ func tuple_patterns() {
7977
// CHECK: [[KADDR:%[0-9]+]] = alloc_box ${ var () }
8078
// CHECK-NOT: alloc_box ${ var Double }
8179
// CHECK: [[J_K_:%[0-9]+]] = apply
82-
// CHECK: [[J:%[0-9]+]] = tuple_extract {{.*}}, 0
83-
// CHECK: [[K:%[0-9]+]] = tuple_extract {{.*}}, 2
80+
// CHECK: ([[J:%[0-9]+]], [[K:%[0-9]+]], {{%[0-9]+}}) = destructure_tuple
8481
// CHECK: store [[J]] to [trivial] [[PBJ]]
8582
var (j,_,k,_) : (Int, Float, (), Double) = MRV()
8683
}

test/SILGen/default_constructor.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,7 @@ struct D {
3333
// CHECK: [[PB_THIS:%.*]] = project_box [[THIS]]
3434
// CHECK: [[INIT:%[0-9]+]] = function_ref @$S19default_constructor1DV1iSivpfi
3535
// CHECK: [[RESULT:%[0-9]+]] = apply [[INIT]]()
36-
// CHECK: [[INTVAL:%[0-9]+]] = tuple_extract [[RESULT]] : $(Int, Double), 0
37-
// CHECK: [[FLOATVAL:%[0-9]+]] = tuple_extract [[RESULT]] : $(Int, Double), 1
36+
// CHECK: ([[INTVAL:%[0-9]+]], [[FLOATVAL:%[0-9]+]]) = destructure_tuple [[RESULT]]
3837
// CHECK: [[IADDR:%[0-9]+]] = struct_element_addr [[PB_THIS]] : $*D, #D.i
3938
// CHECK: assign [[INTVAL]] to [[IADDR]]
4039
// CHECK: [[JADDR:%[0-9]+]] = struct_element_addr [[PB_THIS]] : $*D, #D.j

test/SILGen/errors.swift

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -416,12 +416,7 @@ func test_variadic(_ cat: Cat) throws {
416416
// CHECK: [[N:%.*]] = integer_literal $Builtin.Word, 4
417417
// CHECK: [[T0:%.*]] = function_ref @$Ss27_allocateUninitializedArray{{.*}}F
418418
// CHECK: [[T1:%.*]] = apply [[T0]]<Cat>([[N]])
419-
// CHECK: [[BORROWED_T1:%.*]] = begin_borrow [[T1]]
420-
// CHECK: [[BORROWED_ARRAY:%.*]] = tuple_extract [[BORROWED_T1]] : $(Array<Cat>, Builtin.RawPointer), 0
421-
// CHECK: [[ARRAY:%.*]] = copy_value [[BORROWED_ARRAY]]
422-
// CHECK: [[T2:%.*]] = tuple_extract [[BORROWED_T1]] : $(Array<Cat>, Builtin.RawPointer), 1
423-
// CHECK: end_borrow [[BORROWED_T1]] from [[T1]]
424-
// CHECK: destroy_value [[T1]]
419+
// CHECK: ([[ARRAY:%.*]], [[T2:%.*]]) = destructure_tuple [[T1]]
425420
// CHECK: [[ELT0:%.*]] = pointer_to_address [[T2]] : $Builtin.RawPointer to [strict] $*Cat
426421
// Element 0.
427422
// CHECK: [[T0:%.*]] = function_ref @$S6errors10make_a_catAA3CatCyKF : $@convention(thin) () -> (@owned Cat, @error Error)
@@ -537,8 +532,7 @@ func supportFirstStructure<B: Buildable>(_ b: inout B) throws {
537532
// CHECK: [[BUFFER_CAST:%.*]] = address_to_pointer [[BUFFER]] : $*B.Structure to $Builtin.RawPointer
538533
// CHECK: [[MAT:%.*]] = witness_method $B, #Buildable.firstStructure!materializeForSet.1 :
539534
// CHECK: [[T1:%.*]] = apply [[MAT]]<B>([[BUFFER_CAST]], [[MATBUFFER]], [[BASE:%[0-9]*]])
540-
// CHECK: [[T2:%.*]] = tuple_extract [[T1]] : {{.*}}, 0
541-
// CHECK: [[CALLBACK:%.*]] = tuple_extract [[T1]] : {{.*}}, 1
535+
// CHECK: ([[T2:%.*]], [[CALLBACK:%.*]]) = destructure_tuple [[T1]]
542536
// CHECK: [[T3:%.*]] = pointer_to_address [[T2]] : $Builtin.RawPointer to [strict] $*B.Structure
543537
// CHECK: [[T4:%.*]] = mark_dependence [[T3]] : $*B.Structure on [[BASE]] : $*B
544538
// CHECK: [[T5:%.*]] = begin_access [modify] [unsafe] [[T4]] : $*B.Structure
@@ -574,8 +568,7 @@ func supportStructure<B: Buildable>(_ b: inout B, name: String) throws {
574568
// CHECK: [[MAT:%.*]] = witness_method $B, #Buildable.subscript!materializeForSet.1 :
575569
// CHECK: [[T1:%.*]] = apply [[MAT]]<B>([[BUFFER_CAST]], [[MATBUFFER]], [[BORROWED_INDEX_COPY]], [[BASE:%[0-9]*]])
576570
// CHECK: end_borrow [[BORROWED_INDEX_COPY]] from [[INDEX_COPY]]
577-
// CHECK: [[T2:%.*]] = tuple_extract [[T1]] : {{.*}}, 0
578-
// CHECK: [[CALLBACK:%.*]] = tuple_extract [[T1]] : {{.*}}, 1
571+
// CHECK: ([[T2:%.*]], [[CALLBACK:%.*]]) = destructure_tuple [[T1]]
579572
// CHECK: [[T3:%.*]] = pointer_to_address [[T2]] : $Builtin.RawPointer to [strict] $*B.Structure
580573
// CHECK: [[T4:%.*]] = mark_dependence [[T3]] : $*B.Structure on [[BASE]] : $*B
581574
// CHECK: [[T5:%.*]] = begin_access [modify] [unsafe] [[T4]] : $*B.Structure
@@ -684,12 +677,7 @@ func supportStructure(_ b: inout OwnedBridge, name: String) throws {
684677
// CHECK-NEXT: [[ADDRESSOR:%.*]] = function_ref @$S6errors11OwnedBridgeVyAA5PylonVSSciaO :
685678
// CHECK-NEXT: [[T0:%.*]] = apply [[ADDRESSOR]]([[BORROWED_ARG2_COPY]], [[WRITE]])
686679
// CHECK-NEXT: end_borrow [[BORROWED_ARG2_COPY]]
687-
// CHECK-NEXT: [[BORROWED_T0:%.*]] = begin_borrow [[T0]]
688-
// CHECK-NEXT: [[T1:%.*]] = tuple_extract [[BORROWED_T0]] : {{.*}}, 0
689-
// CHECK-NEXT: [[BORROWED_OWNER:%.*]] = tuple_extract [[BORROWED_T0]] : {{.*}}, 1
690-
// CHECK-NEXT: [[OWNER:%.*]] = copy_value [[BORROWED_OWNER]]
691-
// CHECK-NEXT: end_borrow [[BORROWED_T0]] from [[T0]]
692-
// CHECK-NEXT: destroy_value [[T0]]
680+
// CHECK-NEXT: ([[T1:%.*]], [[OWNER:%.*]]) = destructure_tuple [[T0]]
693681
// CHECK-NEXT: [[T3:%.*]] = struct_extract [[T1]]
694682
// CHECK-NEXT: [[T4:%.*]] = pointer_to_address [[T3]]
695683
// CHECK-NEXT: [[T5:%.*]] = mark_dependence [[T4]] : $*Pylon on [[OWNER]]
@@ -730,12 +718,7 @@ func supportStructure(_ b: inout PinnedBridge, name: String) throws {
730718
// CHECK-NEXT: [[ADDRESSOR:%.*]] = function_ref @$S6errors12PinnedBridgeVyAA5PylonVSSciaP :
731719
// CHECK-NEXT: [[T0:%.*]] = apply [[ADDRESSOR]]([[BORROWED_ARG2_COPY]], [[WRITE]])
732720
// CHECK-NEXT: end_borrow [[BORROWED_ARG2_COPY]]
733-
// CHECK-NEXT: [[BORROWED_T0:%.*]] = begin_borrow [[T0]]
734-
// CHECK-NEXT: [[T1:%.*]] = tuple_extract [[BORROWED_T0]] : {{.*}}, 0
735-
// CHECK-NEXT: [[BORROWED_OWNER:%.*]] = tuple_extract [[BORROWED_T0]] : {{.*}}, 1
736-
// CHECK-NEXT: [[OWNER:%.*]] = copy_value [[BORROWED_OWNER]]
737-
// CHECK-NEXT: end_borrow [[BORROWED_T0]] from [[T0]]
738-
// CHECK-NEXT: destroy_value [[T0]]
721+
// CHECK-NEXT: ([[T1:%.*]], [[OWNER:%.*]]) = destructure_tuple [[T0]]
739722
// CHECK-NEXT: [[T3:%.*]] = struct_extract [[T1]]
740723
// CHECK-NEXT: [[T4:%.*]] = pointer_to_address [[T3]]
741724
// CHECK-NEXT: [[T5:%.*]] = mark_dependence [[T4]] : $*Pylon on [[OWNER]]

test/SILGen/expressions.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -448,11 +448,11 @@ func tuple_element(_ x: (Int, Float)) {
448448
// CHECK: apply
449449

450450
int(tuple().0)
451-
// CHECK: [[ZERO:%.*]] = tuple_extract {{%.*}} : {{.*}}, 0
451+
// CHECK: ([[ZERO:%.*]], {{%.*}}) = destructure_tuple
452452
// CHECK: apply {{.*}}([[ZERO]])
453453

454454
float(tuple().1)
455-
// CHECK: [[ONE:%.*]] = tuple_extract {{%.*}} : {{.*}}, 1
455+
// CHECK: ({{%.*}}, [[ONE:%.*]]) = destructure_tuple
456456
// CHECK: apply {{.*}}([[ONE]])
457457
}
458458

test/SILGen/keypath_application.swift

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -138,17 +138,13 @@ func writebackNesting(x: inout Int,
138138
// -- apply keypath y
139139
// CHECK: [[PROJECT_FN:%.*]] = function_ref @{{.*}}_projectKeyPathWritable
140140
// CHECK: [[PROJECT_RET:%.*]] = apply [[PROJECT_FN]]
141-
// CHECK: [[PROJECT_RET_BORROW:%.*]] = begin_borrow [[PROJECT_RET]]
142-
// CHECK: [[PROJECT_RET_BORROW_OWNER:%.*]] = tuple_extract [[PROJECT_RET_BORROW]] {{.*}}, 1
143-
// CHECK: [[OWNER_Y:%.*]] = copy_value [[PROJECT_RET_BORROW_OWNER]]
141+
// CHECK: ({{%.*}}, [[OWNER_Y:%.*]]) = destructure_tuple [[PROJECT_RET]]
144142
// -- get 'u'
145143
// CHECK: function_ref @$SSi19keypath_applicationE1uSivg
146144
// -- apply keypath z
147145
// CHECK: [[PROJECT_FN:%.*]] = function_ref @{{.*}}_projectKeyPathWritable
148146
// CHECK: [[PROJECT_RET:%.*]] = apply [[PROJECT_FN]]
149-
// CHECK: [[PROJECT_RET_BORROW:%.*]] = begin_borrow [[PROJECT_RET]]
150-
// CHECK: [[PROJECT_RET_BORROW_OWNER:%.*]] = tuple_extract [[PROJECT_RET_BORROW]] {{.*}}, 1
151-
// CHECK: [[OWNER_Z:%.*]] = copy_value [[PROJECT_RET_BORROW_OWNER]]
147+
// CHECK: ({{%.*}}, [[OWNER_Z:%.*]]) = destructure_tuple [[PROJECT_RET]]
152148

153149
// -- set 'tt'
154150
// CHECK: function_ref @$SSi19keypath_applicationE2ttSivs

test/SILGen/lifetime.swift

Lines changed: 14 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -218,17 +218,9 @@ func tuple_with_ref_ignore_return() {
218218
tuple_with_ref_elements()
219219
// CHECK: [[FUNC:%[0-9]+]] = function_ref @$S8lifetime23tuple_with_ref_elementsAA3ValV_AA3RefC_ADtAFtyF
220220
// CHECK: [[TUPLE:%[0-9]+]] = apply [[FUNC]]
221-
// CHECK: [[BORROWED_TUPLE:%.*]] = begin_borrow [[TUPLE]]
222-
// CHECK: [[T0:%[0-9]+]] = tuple_extract [[BORROWED_TUPLE]] : {{.*}}, 0
223-
// CHECK: [[T1_0:%[0-9]+]] = tuple_extract [[BORROWED_TUPLE]] : {{.*}}, 1
224-
// CHECK: [[T1_0_COPY:%.*]] = copy_value [[T1_0]]
225-
// CHECK: [[T1_1:%[0-9]+]] = tuple_extract [[BORROWED_TUPLE]] : {{.*}}, 2
226-
// CHECK: [[T2:%[0-9]+]] = tuple_extract [[BORROWED_TUPLE]] : {{.*}}, 3
227-
// CHECK: [[T2_COPY:%.*]] = copy_value [[T2]]
228-
// CHECK: end_borrow [[BORROWED_TUPLE]] from [[TUPLE]]
229-
// CHECK: destroy_value [[TUPLE]]
230-
// CHECK: destroy_value [[T2_COPY]]
231-
// CHECK: destroy_value [[T1_0_COPY]]
221+
// CHECK: ([[T0:%.*]], [[T1_0:%.*]], [[T1_1:%.*]], [[T2:%.*]]) = destructure_tuple [[TUPLE]]
222+
// CHECK: destroy_value [[T2]]
223+
// CHECK: destroy_value [[T1_0]]
232224
// CHECK: return
233225
}
234226

@@ -381,8 +373,7 @@ func logical_lvalue_lifetime(_ r: RefWithProp, _ i: Int, _ v: Val) {
381373
// CHECK: [[T0:%.*]] = address_to_pointer [[ALEPH_PROP_TEMP]]
382374
// CHECK: [[MATERIALIZE_METHOD:%[0-9]+]] = class_method [[BORROWED_R2]] : $RefWithProp, #RefWithProp.aleph_prop!materializeForSet.1 :
383375
// CHECK: [[MATERIALIZE:%.*]] = apply [[MATERIALIZE_METHOD]]([[T0]], [[STORAGE]], [[BORROWED_R2]])
384-
// CHECK: [[PTR:%.*]] = tuple_extract [[MATERIALIZE]] : {{.*}}, 0
385-
// CHECK: [[OPTCALLBACK:%.*]] = tuple_extract [[MATERIALIZE]] : {{.*}}, 1
376+
// CHECK: ([[PTR:%.*]], [[OPTCALLBACK:%.*]]) = destructure_tuple [[MATERIALIZE]]
386377
// CHECK: [[ADDR:%.*]] = pointer_to_address [[PTR]]
387378
// CHECK: [[MARKED_ADDR:%.*]] = mark_dependence [[ADDR]] : $*Aleph on [[R2]]
388379
// CHECK: {{.*}}([[CALLBACK_ADDR:%.*]] :
@@ -420,19 +411,14 @@ class Foo<T> {
420411
// -- initialization for y
421412
// CHECK: [[Y_INIT:%[0-9]+]] = function_ref @$S8lifetime3FooC1ySi_AA3RefCtvpfi : $@convention(thin) <τ_0_0> () -> (Int, @owned Ref)
422413
// CHECK: [[Y_VALUE:%[0-9]+]] = apply [[Y_INIT]]<T>()
423-
// CHECK: [[BORROWED_Y_VALUE:%.*]] = begin_borrow [[Y_VALUE]]
424-
// CHECK: [[Y_EXTRACTED_0:%.*]] = tuple_extract [[BORROWED_Y_VALUE]] : $(Int, Ref), 0
425-
// CHECK: [[Y_EXTRACTED_1:%.*]] = tuple_extract [[BORROWED_Y_VALUE]] : $(Int, Ref), 1
426-
// CHECK: [[COPIED_Y_EXTRACTED_1:%.*]] = copy_value [[Y_EXTRACTED_1]]
427-
// CHECK: end_borrow [[BORROWED_Y_VALUE]] from [[Y_VALUE]]
428-
// CHECK: destroy_value [[Y_VALUE]]
414+
// CHECK: ([[Y_EXTRACTED_0:%.*]], [[Y_EXTRACTED_1:%.*]]) = destructure_tuple
429415
// CHECK: [[BORROWED_THIS:%.*]] = begin_borrow [[THIS]]
430416
// CHECK: [[THIS_Y:%.*]] = ref_element_addr [[BORROWED_THIS]] : {{.*}}, #Foo.y
431417
// CHECK: [[WRITE:%.*]] = begin_access [modify] [dynamic] [[THIS_Y]] : $*(Int, Ref)
432418
// CHECK: [[THIS_Y_0:%.*]] = tuple_element_addr [[WRITE]] : $*(Int, Ref), 0
433419
// CHECK: assign [[Y_EXTRACTED_0]] to [[THIS_Y_0]]
434420
// CHECK: [[THIS_Y_1:%.*]] = tuple_element_addr [[WRITE]] : $*(Int, Ref), 1
435-
// CHECK: assign [[COPIED_Y_EXTRACTED_1]] to [[THIS_Y_1]]
421+
// CHECK: assign [[Y_EXTRACTED_1]] to [[THIS_Y_1]]
436422
// CHECK: end_access [[WRITE]] : $*(Int, Ref)
437423
// CHECK: end_borrow [[BORROWED_THIS]] from [[THIS]]
438424

@@ -778,24 +764,19 @@ func tuple_explosion() {
778764
int(tuple().0)
779765
// CHECK: [[F:%[0-9]+]] = function_ref @$S8lifetime5tupleSi_AA3RefCtyF
780766
// CHECK: [[TUPLE:%[0-9]+]] = apply [[F]]()
781-
// CHECK: [[BORROWED_TUPLE:%.*]] = begin_borrow [[TUPLE]]
782-
// CHECK: [[T1:%[0-9]+]] = tuple_extract [[BORROWED_TUPLE]] : {{.*}}, 1
783-
// CHECK: [[T1_COPY:%.*]] = copy_value [[T1]]
784-
// CHECK: end_borrow [[BORROWED_TUPLE]] from [[TUPLE]]
785-
// CHECK: destroy_value [[T1_COPY]]
786-
// CHECK-NOT: tuple_extract [[TUPLE]] : {{.*}}, 1
767+
// CHECK: ({{%.*}}, [[T1:%.*]]) = destructure_tuple [[TUPLE]]
768+
// CHECK: destroy_value [[T1]]
769+
// CHECK-NOT: destructure_tuple [[TUPLE]]
770+
// CHECK-NOT: tuple_extract [[TUPLE]]
787771
// CHECK-NOT: destroy_value
788772

789773
ref(tuple().1)
790774
// CHECK: [[F:%[0-9]+]] = function_ref @$S8lifetime5tupleSi_AA3RefCtyF
791775
// CHECK: [[TUPLE:%[0-9]+]] = apply [[F]]()
792-
// CHECK: [[BORROWED_TUPLE:%.*]] = begin_borrow [[TUPLE]]
793-
// CHECK: [[T1:%[0-9]+]] = tuple_extract [[BORROWED_TUPLE]] : {{.*}}, 1
794-
// CHECK: [[T1_COPY:%.*]] = copy_value [[T1]]
795-
// CHECK: end_borrow [[BORROWED_TUPLE]] from [[TUPLE]]
796-
// CHECK: destroy_value [[TUPLE]]
797-
// CHECK-NOT: destroy_value [[T1]]
798-
// CHECK-NOT: tuple_extract [[TUPLE]] : {{.*}}, 1
776+
// CHECK: ({{%.*}}, [[T1:%.*]]) = destructure_tuple [[TUPLE]]
777+
// CHECK: destroy_value [[T1]]
778+
// CHECK-NOT: destructure_tuple [[TUPLE]]
779+
// CHECK-NOT: tuple_extract [[TUPLE]]
799780
// CHECK-NOT: destroy_value [[TUPLE]]
800781
}
801782

test/SILGen/objc_properties.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ class NonObjCClassWithObjCProperty {
198198
// CHECK: bb0([[ARG:%.*]] : @guaranteed $NonObjCClassWithObjCProperty):
199199
// CHECK: [[MATERIALIZE_FOR_SET:%.*]] = class_method [[ARG]] : $NonObjCClassWithObjCProperty, #NonObjCClassWithObjCProperty.property!materializeForSet.1
200200
// CHECK: [[TUPLE:%.*]] = apply [[MATERIALIZE_FOR_SET]]({{.*}}, {{.*}}, [[ARG]])
201-
// CHECK: [[RAW_POINTER:%.*]] = tuple_extract [[TUPLE]] : $(Builtin.RawPointer, Optional<Builtin.RawPointer>), 0
201+
// CHECK: ([[RAW_POINTER:%.*]], {{%.*}}) = destructure_tuple [[TUPLE]]
202202
// CHECK: [[OBJECT:%.*]] = pointer_to_address [[RAW_POINTER]] : $Builtin.RawPointer to [strict] $*NSObject
203203
// CHECK: [[OBJECT_DEP:%.*]] = mark_dependence [[OBJECT]] : $*NSObject on [[ARG]]
204204
// CHECK: [[OBJECT_ACCESS:%.*]] = begin_access [modify] [unsafe] [[OBJECT_DEP]] : $*NSObject

0 commit comments

Comments
 (0)