Skip to content

Commit c05381f

Browse files
committed
Add LLVM's noinline to metadata/witness accessor functions at Osize
1 parent b489cde commit c05381f

File tree

5 files changed

+27
-0
lines changed

5 files changed

+27
-0
lines changed

lib/IRGen/GenMeta.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1369,6 +1369,9 @@ static llvm::Function *getTypeMetadataAccessFunction(IRGenModule &IGM,
13691369
if (!isTypeMetadataAccessTrivial(IGM, type)) {
13701370
cacheVariable = cast<llvm::GlobalVariable>(
13711371
IGM.getAddrOfTypeMetadataLazyCacheVariable(type, ForDefinition));
1372+
1373+
if (IGM.getOptions().OptimizeForSize)
1374+
accessor->addFnAttr(llvm::Attribute::NoInline);
13721375
}
13731376

13741377
emitLazyCacheAccessFunction(IGM, accessor, cacheVariable,
@@ -1411,6 +1414,9 @@ static llvm::Function *getGenericTypeMetadataAccessFunction(IRGenModule &IGM,
14111414
if (!shouldDefine || !accessor->empty())
14121415
return accessor;
14131416

1417+
if (IGM.getOptions().OptimizeForSize)
1418+
accessor->addFnAttr(llvm::Attribute::NoInline);
1419+
14141420
emitLazyCacheAccessFunction(IGM, accessor, /*cacheVariable=*/nullptr,
14151421
[&](IRGenFunction &IGF) -> llvm::Value* {
14161422
return emitGenericMetadataAccessFunction(IGF, nominal, genericArgs);

lib/IRGen/GenProto.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -986,6 +986,9 @@ getWitnessTableLazyAccessFunction(IRGenModule &IGM,
986986
if (!accessor->empty())
987987
return accessor;
988988

989+
if (IGM.getOptions().OptimizeForSize)
990+
accessor->addFnAttr(llvm::Attribute::NoInline);
991+
989992
// Okay, define the accessor.
990993
auto cacheVariable = cast<llvm::GlobalVariable>(
991994
IGM.getAddrOfWitnessTableLazyCacheVariable(conformance, conformingType,
@@ -1312,6 +1315,8 @@ getAssociatedTypeMetadataAccessFunction(AssociatedType requirement,
13121315
llvm::Function *accessor =
13131316
IGM.getAddrOfAssociatedTypeMetadataAccessFunction(&Conformance,
13141317
requirement);
1318+
if (IGM.getOptions().OptimizeForSize)
1319+
accessor->addFnAttr(llvm::Attribute::NoInline);
13151320

13161321
IRGenFunction IGF(IGM, accessor);
13171322
if (IGM.DebugInfo)
@@ -1420,6 +1425,9 @@ getAssociatedTypeWitnessTableAccessFunction(AssociatedConformance requirement,
14201425
if (IGM.DebugInfo)
14211426
IGM.DebugInfo->emitArtificialFunction(IGF, accessor);
14221427

1428+
if (IGM.getOptions().OptimizeForSize)
1429+
accessor->addFnAttr(llvm::Attribute::NoInline);
1430+
14231431
Explosion parameters = IGF.collectParameters();
14241432

14251433
llvm::Value *associatedTypeMetadata = parameters.claimNext();

test/IRGen/generic_classes.sil

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// RUN: %target-swift-frontend -assume-parsing-unqualified-ownership-sil %s -emit-ir | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-runtime
2+
// RUN: %target-swift-frontend -Osize -assume-parsing-unqualified-ownership-sil %s -emit-ir | %FileCheck %s --check-prefix=OSIZE
23

34
// REQUIRES: CPU=x86_64
45

@@ -365,3 +366,6 @@ entry(%c : $RootGeneric<Int32>):
365366
// CHECK: call %swift.type* @swift_initClassMetadata_UniversalStrategy(%swift.type* [[METADATA]], i64 1, i8*** [[FIELDS_ADDR]], i64* [[OFFSETS]])
366367
// CHECK: ret %swift.type* [[METADATA]]
367368
// CHECK: }
369+
370+
// OSIZE: define hidden %swift.type* @_T015generic_classes11RootGenericCMa(%swift.type*) [[ATTRS:#[0-9]+]] {
371+
// OSIZE: [[ATTRS]] = {{{.*}}noinline

test/IRGen/same_type_constraints.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// RUN: %target-swift-frontend -assume-parsing-unqualified-ownership-sil -emit-ir -primary-file %s -disable-objc-attr-requires-foundation-module | %FileCheck %s
2+
// RUN: %target-swift-frontend -Osize -assume-parsing-unqualified-ownership-sil -emit-ir -primary-file %s -disable-objc-attr-requires-foundation-module | %FileCheck %s --check-prefix=OSIZE
23

34
// <rdar://problem/21665983> IRGen crash with protocol extension involving same-type constraint to X<T>
45
public struct DefaultFoo<T> {
@@ -58,3 +59,6 @@ where Self : CodingType,
5859
Self.ValueType.Coder == Self {
5960
print(Self.ValueType.self)
6061
}
62+
63+
// OSIZE: define internal i8** @_T021same_type_constraints12GenericKlazzCyxq_GAA1EAA4DataQy_RszAaER_r0_lAfA0F4TypePWT(%swift.type* %"GenericKlazz<T, R>.Data", %swift.type* nocapture readonly %"GenericKlazz<T, R>", i8** nocapture readnone %"GenericKlazz<T, R>.E") [[ATTRS:#[0-9]+]] {
64+
// OSIZE: [[ATTRS]] = {{{.*}}noinline

test/IRGen/typemetadata.sil

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// RUN: %target-swift-frontend -assume-parsing-unqualified-ownership-sil -emit-ir %s | %FileCheck %s
2+
// RUN: %target-swift-frontend -Osize -assume-parsing-unqualified-ownership-sil -emit-ir %s | %FileCheck %s --check-prefix=OSIZE
23

34
// REQUIRES: CPU=x86_64
45
// XFAIL: linux
@@ -47,3 +48,7 @@ bb0:
4748
// CHECK: [[RES:%.*]] = phi
4849
// CHECK-NEXT: ret %swift.type* [[RES]]
4950

51+
52+
// OSIZE: define hidden %swift.type* @_T012typemetadata1CCMa() [[ATTR:#[0-9]+]] {
53+
// OSIZE: [[ATTR]] = {{{.*}}noinline
54+

0 commit comments

Comments
 (0)