Skip to content

Commit 66204f4

Browse files
committed
SILGen: Peephole away initializer call in ArrayExpr when building an Array<T>
1 parent 0975c16 commit 66204f4

File tree

3 files changed

+8
-9
lines changed

3 files changed

+8
-9
lines changed

lib/SILGen/SILGenExpr.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3684,6 +3684,11 @@ RValue RValueEmitter::visitArrayExpr(ArrayExpr *E, SGFContext C) {
36843684

36853685
arg = scope.popPreservingValue(std::move(arg));
36863686

3687+
// If we're building an array, we don't have to call the initializer;
3688+
// we've already built one.
3689+
if (arrayTy->isEqual(E->getType()))
3690+
return arg;
3691+
36873692
// Call the builtin initializer.
36883693
return SGF.emitApplyAllocatingInitializer(
36893694
loc, E->getInitializer(), std::move(arg), E->getType(), C);

test/SILGen/literals.swift

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -245,10 +245,7 @@ func makeBasic<T : FooProtocol>() -> T { return T() }
245245
// CHECK: try_apply [[FN]]<T>([[POINTER1]]) : {{.*}} normal bb1, error bb2
246246

247247
// CHECK: bb1([[TMP:%.*]] : $()):
248-
// CHECK: [[METATYPE:%.*]] = metatype $@thin Array<T>.Type
249-
// CHECK: [[CTOR:%.*]] = function_ref @$sSa12arrayLiteralSayxGxd_tcfC : $@convention(method) <τ_0_0> (@owned Array<τ_0_0>, @thin Array<τ_0_0>.Type) -> @owned Array<τ_0_0>
250-
// CHECK: [[RESULT:%.*]] = apply [[CTOR]]<T>([[ARR]], [[METATYPE]])
251-
// CHECK: return [[RESULT]]
248+
// CHECK: return [[ARR]]
252249

253250
// CHECK: bb2([[ERR:%.*]] : @owned $Error):
254251
// CHECK: [[DEALLOC:%.*]] = function_ref @$ss29_deallocateUninitializedArrayyySayxGnlF

test/SILGen/objc_bridging_array.swift

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,11 @@ func setChildren(p: Parent, c: Child) {
2525
// CHECK: [[BUFFER:%.*]] = pointer_to_address [[BUFFER_PTR]] : $Builtin.RawPointer to [strict] $*Child
2626
// CHECK: [[CHILD:%.*]] = copy_value %1 : $Child
2727
// CHECK: store [[CHILD]] to [init] [[BUFFER]] : $*Child
28-
// CHECK: [[METATYPE:%.*]] = metatype $@thin Array<Child>.Type
29-
// CHECK: [[FN:%.*]] = function_ref @$sSa12arrayLiteralSayxGxd_tcfC : $@convention(method) <τ_0_0> (@owned Array<τ_0_0>, @thin Array<τ_0_0>.Type) -> @owned Array<τ_0_0>
30-
// CHECK: [[NEW_ARRAY:%.*]] = apply [[FN]]<Child>([[ARRAY]], [[METATYPE]]) : $@convention(method) <τ_0_0> (@owned Array<τ_0_0>, @thin Array<τ_0_0>.Type) -> @owned Array<τ_0_0>
3128
// CHECK: [[FN:%.*]] = function_ref @$sSa10FoundationE19_bridgeToObjectiveCSo7NSArrayCyF : $@convention(method) <τ_0_0> (@guaranteed Array<τ_0_0>) -> @owned NSArray
32-
// CHECK: [[BORROW_ARRAY:%.*]] = begin_borrow [[NEW_ARRAY]] : $Array<Child>
29+
// CHECK: [[BORROW_ARRAY:%.*]] = begin_borrow [[ARRAY]] : $Array<Child>
3330
// CHECK: [[BRIDGED_ARRAY:%.*]] = apply [[FN]]<Child>([[BORROW_ARRAY]]) : $@convention(method) <τ_0_0> (@guaranteed Array<τ_0_0>) -> @owned NSArray
3431
// CHECK: end_borrow [[BORROW_ARRAY]] : $Array<Child>
35-
// CHECK: destroy_value [[NEW_ARRAY]] : $Array<Child>
32+
// CHECK: destroy_value [[ARRAY]] : $Array<Child>
3633
// CHECK: [[FN:%.*]] = objc_method [[COPIED]] : $[[OPENED_TYPE]], #Parent.children!setter.1.foreign : <Self where Self : Parent> (Self) -> ([Child]) -> (), $@convention(objc_method) <τ_0_0 where τ_0_0 : Parent> (NSArray, τ_0_0) -> ()
3734
// CHECK: apply [[FN]]<[[OPENED_TYPE]]>([[BRIDGED_ARRAY]], [[COPIED]]) : $@convention(objc_method) <τ_0_0 where τ_0_0 : Parent> (NSArray, τ_0_0) -> ()
3835
// CHECK: destroy_value [[BRIDGED_ARRAY]] : $NSArray

0 commit comments

Comments
 (0)