Skip to content

Commit c5699c9

Browse files
committed
[IRGen] Enabled pack metadata stack promo.
Set the flag and updated the tests.
1 parent c51d53b commit c5699c9

File tree

3 files changed

+14
-24
lines changed

3 files changed

+14
-24
lines changed

include/swift/AST/SILOptions.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ class SILOptions {
177177
///
178178
/// More accurately, enable skipping mandatory heapification of pack metadata
179179
/// when possible.
180-
bool EnablePackMetadataStackPromotion = false;
180+
bool EnablePackMetadataStackPromotion = true;
181181

182182
// The kind of function bodies to skip emitting.
183183
FunctionBodySkipping SkipFunctionBodies = FunctionBodySkipping::None;

lib/DriverTool/sil_opt_main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ struct SILOptOptions {
240240
llvm::cl::desc("Enable experimental move-only semantics."));
241241

242242
llvm::cl::opt<bool> EnablePackMetadataStackPromotion = llvm::cl::opt<bool>(
243-
"enable-pack-metadata-stack-promotion", llvm::cl::init(false),
243+
"enable-pack-metadata-stack-promotion", llvm::cl::init(true),
244244
llvm::cl::desc(
245245
"Whether to skip heapifying stack metadata packs when possible."));
246246

test/IRGen/variadic_generic_functions.sil

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,10 @@ struct Gen2<Fwd : Q> : Q {}
3232
// CHECK: [[METADATA_ELEMENT_0:%[^,]+]] = getelementptr inbounds [1 x %swift.type*], [1 x %swift.type*]* [[METADATA_PACK]]
3333
// CHECK: store %swift.type* bitcast {{.*}}$s26variadic_generic_functions3S_2VMf{{.*}}, %swift.type** [[METADATA_ELEMENT_0]]
3434
// CHECK: [[METADATA_PACK_PTR:%[^,]+]] = bitcast [1 x %swift.type*]* [[METADATA_PACK]] to %swift.type**
35-
// CHECK: [[HEAPIFIED_METADATA_PACK_PTR:%[^,]+]] = call swiftcc %swift.type** @swift_allocateMetadataPack(%swift.type** [[METADATA_PACK_PTR]], i64 1)
3635
// CHECK: [[WTABLE_ELEMENT_0:%[^,]+]] = getelementptr inbounds [1 x i8**], [1 x i8**]* [[WTABLE_PACK]]
3736
// CHECK: store i8** getelementptr inbounds {{.*}}$s26variadic_generic_functions3S_2VAA1PAAWP{{.*}}, i8*** [[WTABLE_ELEMENT_0]]
3837
// CHECK: [[WTABLE_PACK_PTR:%[^,]+]] = bitcast [1 x i8**]* [[WTABLE_PACK]] to i8***
39-
// CHECK: [[HEAPIFIED_WTABLE_PACK_PTR:%[^%]+]] = call swiftcc i8*** @swift_allocateWitnessTablePack(i8*** [[WTABLE_PACK_PTR]], i64 1)
40-
// CHECK: call swiftcc void @g([[INT]] 1, %swift.type** [[HEAPIFIED_METADATA_PACK_PTR]], i8*** [[HEAPIFIED_WTABLE_PACK_PTR]])
38+
// CHECK: call swiftcc void @g([[INT]] 1, %swift.type** [[METADATA_PACK_PTR]], i8*** [[WTABLE_PACK_PTR]])
4139
sil @c : $() -> () {
4240
%g = function_ref @g : $@convention(thin) <each T : P> () -> ()
4341
apply %g<Pack{S_2}>() : $@convention(thin) <each T : P> () -> ()
@@ -91,10 +89,9 @@ sil @f1c : $<each T : PA where repeat each T.A : P> () -> () {}
9189
// CHECK-SAME: i8*** %"each T.PA",
9290
// CHECK-SAME: i8*** [[ASSOCIATEDTYPES_CONFORMANCES_TO_Q:%[^,]+]])
9391
// CHECK: [[ASSOCIATEDTYPES:%[^,]+]] = alloca %swift.type*, [[INT]] [[SHAPE]]
94-
// CHECK: [[HEAPIFIED_ASSOCIATEDTYPES:%[^,]+]] = call swiftcc %swift.type** @swift_allocateMetadataPack(%swift.type** [[ASSOCIATEDTYPES]], i64 %0)
9592
// CHECK: call swiftcc void @associatedtype_with_added_conformance_callee(
9693
// CHECK-SAME: [[INT]] [[SHAPE]],
97-
// CHECK-SAME: %swift.type** [[HEAPIFIED_ASSOCIATEDTYPES]],
94+
// CHECK-SAME: %swift.type** [[ASSOCIATEDTYPES]],
9895
// CHECK-SAME: i8*** [[ASSOCIATEDTYPES_CONFORMANCES_TO_Q]])
9996
sil @associatedtype_with_added_conformance : $<each T : PA where repeat each T.A : Q> () -> () {
10097
%callee = function_ref @associatedtype_with_added_conformance_callee : $@convention(thin) <each T : Q> () -> ()
@@ -112,10 +109,9 @@ sil @associatedtype_with_added_conformance_callee : $<each T : Q> () -> () {}
112109
// CHECK-SAME: i8*** %"each T.A.QA",
113110
// CHECK-SAME: i8*** [[ASSOCIATEDTYPES_CONFORMANCES_TO_Q:%[^,]+]])
114111
// CHECK: [[ASSOCIATEDTYPES:%[^,]+]] = alloca %swift.type*, [[INT]] [[SHAPE]]
115-
// CHECK: [[HEAPIFIED_ASSOCIATEDTYPES:%[^,]+]] = call swiftcc %swift.type** @swift_allocateMetadataPack(%swift.type** [[ASSOCIATEDTYPES]], i64 [[SHAPE]])
116112
// CHECK: call swiftcc void @associatedtype_with_added_conformance_2_callee(
117113
// CHECK-SAME: [[INT]] [[SHAPE]],
118-
// CHECK-SAME: %swift.type** [[HEAPIFIED_ASSOCIATEDTYPES]],
114+
// CHECK-SAME: %swift.type** [[ASSOCIATEDTYPES]],
119115
// CHECK-SAME: i8*** [[ASSOCIATEDTYPES_CONFORMANCES_TO_Q]])
120116
sil @associatedtype_with_added_conformance_2 : $<each T : PA where repeat each T.A : QA, repeat each T.A.A : R> () -> () {
121117
%j = function_ref @associatedtype_with_added_conformance_2_callee : $@convention(thin) <each T : R> () -> ()
@@ -131,15 +127,13 @@ sil @associatedtype_with_added_conformance_2_callee : $<each T : R> () -> () {}
131127
// CHECK-SAME: %swift.type** %"each T",
132128
// CHECK-SAME: i8*** %"each T.Q")
133129
// CHECK: [[GEN2_TYPES:%[^,]+]] = alloca %swift.type*, [[INT]] [[SHAPE]]
134-
// CHECK: [[HEAPIFIED_GEN2_TYPES:%[^,]+]] = call swiftcc %swift.type** @swift_allocateMetadataPack(%swift.type** [[GEN2_TYPES]], i64 [[SHAPE]])
135130
// CHECK: [[STORED_STACK_LOC:%[^,]+]] = call i8* @llvm.stacksave()
136131
// CHECK: [[GEN2_CONFORMANCES_TO_Q:%[^,]+]] = alloca i8**, [[INT]] [[SHAPE]]
137-
// CHECK: [[HEAPIFIED_GEN2_CONFORMANCES_TO_Q:%[^%]+]] = call swiftcc i8*** @swift_allocateWitnessTablePack(i8*** [[GEN2_CONFORMANCES_TO_Q]], i64 [[SHAPE]])
138-
// CHECK: call void @llvm.stackrestore(i8* [[STORED_STACK_LOC]])
139132
// CHECK: call swiftcc void @associatedtype_with_forwarded_conformance_1_callee(
140133
// CHECK-SAME: [[INT]] [[SHAPE]],
141-
// CHECK-SAME: %swift.type** [[HEAPIFIED_GEN2_TYPES]],
142-
// CHECK-SAME: i8*** [[HEAPIFIED_GEN2_CONFORMANCES_TO_Q]])
134+
// CHECK-SAME: %swift.type** [[GEN2_TYPES]],
135+
// CHECK-SAME: i8*** [[GEN2_CONFORMANCES_TO_Q]])
136+
// CHECK: call void @llvm.stackrestore(i8* [[STORED_STACK_LOC]])
143137
sil @associatedtype_with_forwarded_conformance_1 : $<each T : Q> () -> () {
144138
%i = function_ref @associatedtype_with_forwarded_conformance_1_callee : $@convention(thin) <each T : Q> () -> ()
145139
apply %i<Pack{repeat Gen2<each T>}>() : $@convention(thin) <each T : Q> () -> ()
@@ -156,16 +150,14 @@ sil @associatedtype_with_forwarded_conformance_1_callee : $<each T : Q> () -> ()
156150
// CHECK-SAME: i8*** %"each T.PA",
157151
// CHECK-SAME: i8*** %"each T.A.Q")
158152
// CHECK: [[GEN1_TYPES:%[^,]+]] = alloca %swift.type*, [[INT]] [[SHAPE]]
159-
// CHECK: [[HEAPIFIED_GEN1_TYPES:%[^,]+]] = call swiftcc %swift.type** @swift_allocateMetadataPack(%swift.type** [[GEN1_TYPES]], i64 [[SHAPE]])
160153
// CHECK: [[STORED_STACK_LOC:%[^,]+]] = call i8* @llvm.stacksave()
161154
// CHECK: [[GEN1_CONFORMANCES_TO_PA:%[^,]+]] = alloca i8**, [[INT]] [[SHAPE]]
162-
// CHECK: [[HEAPIFIED_GEN1_CONFORMANCES_TO_PA:%[^%]+]] = call swiftcc i8*** @swift_allocateWitnessTablePack(i8*** [[GEN1_CONFORMANCES_TO_PA]], i64 [[SHAPE]])
163-
// CHECK: call void @llvm.stackrestore(i8* [[STORED_STACK_LOC]])
164155
// CHECK: call swiftcc void @generictype_with_forwarded_conformance_2_callee(
165156
// CHECK-SAME: [[INT]] [[SHAPE]],
166-
// CHECK-SAME: %swift.type** [[HEAPIFIED_GEN1_TYPES]],
167-
// CHECK-SAME: i8*** [[HEAPIFIED_GEN1_CONFORMANCES_TO_PA]],
157+
// CHECK-SAME: %swift.type** [[GEN1_TYPES]],
158+
// CHECK-SAME: i8*** [[GEN1_CONFORMANCES_TO_PA]],
168159
// CHECK-SAME: i8*** %"each T.A.Q")
160+
// CHECK: call void @llvm.stackrestore(i8* [[STORED_STACK_LOC]])
169161
sil @generictype_with_forwarded_conformance_2 : $<each T : PA where repeat each T.A : Q>() -> () {
170162
%callee = function_ref @generictype_with_forwarded_conformance_2_callee : $@convention(thin) <each T : PA where repeat each T.A : Q> () -> ()
171163
apply %callee<Pack{repeat Gen1<each T>}>() : $@convention(thin) <each T : PA where repeat each T.A : Q> () -> ()
@@ -181,16 +173,14 @@ sil @generictype_with_forwarded_conformance_2_callee : $<each T : PA where repea
181173
// CHECK-SAME: i8*** %"each T.PA",
182174
// CHECK-SAME: i8*** %"each T.A.Q")
183175
// CHECK: [[GEN1_GEN1_TYPES:%[^,]+]] = alloca %swift.type*, [[INT]] [[SHAPE]]
184-
// CHECK: [[HEAPIFIED_GEN1_GEN1_TYPES:%[^%]+]] = call swiftcc %swift.type** @swift_allocateMetadataPack(%swift.type** [[GEN1_GEN1_TYPES]], i64 [[SHAPE]])
185176
// CHECK: [[STORED_STACK_LOC:%[^,]+]] = call i8* @llvm.stacksave()
186177
// CHECK: [[GEN1_GEN1_CONFORMANCES_TO_PA:%[^,]+]] = alloca i8**, [[INT]] [[SHAPE]]
187-
// CHECK: [[HEAPIFIED_GEN1_GEN1_CONFORMANCES_TO_PA:%[^%]+]] = call swiftcc i8*** @swift_allocateWitnessTablePack(i8*** [[GEN1_GEN1_CONFORMANCES_TO_PA]], i64 [[SHAPE]])
188-
// CHECK: call void @llvm.stackrestore(i8* [[STORED_STACK_LOC]])
189178
// CHECK: call swiftcc void @generic_with_forwarded_conformance_3_callee(
190179
// CHECK-SAME: [[INT]] [[SHAPE]],
191-
// CHECK-SAME: %swift.type** [[HEAPIFIED_GEN1_GEN1_TYPES]],
192-
// CHECK-SAME: i8*** [[HEAPIFIED_GEN1_GEN1_CONFORMANCES_TO_PA]],
180+
// CHECK-SAME: %swift.type** [[GEN1_GEN1_TYPES]],
181+
// CHECK-SAME: i8*** [[GEN1_GEN1_CONFORMANCES_TO_PA]],
193182
// CHECK-SAME: i8*** %"each T.A.Q")
183+
// CHECK: call void @llvm.stackrestore(i8* [[STORED_STACK_LOC]])
194184
sil @generic_with_forwarded_conformance_3 : $<each T : PA where repeat each T.A : Q> () -> () {
195185
%callee = function_ref @generic_with_forwarded_conformance_3_callee : $@convention(thin) <each T : PA where repeat each T.A : Q> () -> ()
196186
apply %callee<Pack{repeat Gen1<Gen1<each T>>}>() : $@convention(thin) <each T : PA where repeat each T.A : Q> () -> ()

0 commit comments

Comments
 (0)