Skip to content

Commit 4036246

Browse files
authored
Merge pull request #68725 from apple/revert-68688-embedded-serialize-everything
Revert "[embedded] Make CMO's 'serialize everything' mode even more aggressive and allow serialization of private and shared functions"
2 parents 4481cbd + 2a039b4 commit 4036246

File tree

5 files changed

+41
-113
lines changed

5 files changed

+41
-113
lines changed

include/swift/AST/SILOptions.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,7 @@ enum class DestroyHoistingOption : uint8_t {
6969
enum class CrossModuleOptimizationMode : uint8_t {
7070
Off = 0,
7171
Default = 1,
72-
Aggressive = 2,
73-
Everything = 3,
72+
Aggressive = 2
7473
};
7574

7675
class SILModule;

lib/Frontend/CompilerInvocation.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3117,7 +3117,6 @@ bool CompilerInvocation::parseArgs(
31173117
if (LangOpts.hasFeature(Feature::Embedded)) {
31183118
IRGenOpts.InternalizeAtLink = true;
31193119
IRGenOpts.DisableLegacyTypeInfo = true;
3120-
SILOpts.CMOMode = CrossModuleOptimizationMode::Everything;
31213120
}
31223121

31233122
return false;

lib/SILOptimizer/IPO/CrossModuleOptimization.cpp

Lines changed: 23 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -60,15 +60,11 @@ class CrossModuleOptimization {
6060
/// avoid code size increase.
6161
bool conservative;
6262

63-
/// True if CMO should serialize literally everything in the module,
64-
/// regardless of linkage.
65-
bool everything;
66-
6763
typedef llvm::DenseMap<SILFunction *, bool> FunctionFlags;
6864

6965
public:
70-
CrossModuleOptimization(SILModule &M, bool conservative, bool everything)
71-
: M(M), conservative(conservative), everything(everything) { }
66+
CrossModuleOptimization(SILModule &M, bool conservative)
67+
: M(M), conservative(conservative) { }
7268

7369
void serializeFunctionsInModule();
7470

@@ -168,10 +164,9 @@ void CrossModuleOptimization::serializeFunctionsInModule() {
168164

169165
// Start with public functions.
170166
for (SILFunction &F : M) {
171-
if (F.getLinkage() == SILLinkage::Public || everything) {
172-
if (canSerializeFunction(&F, canSerializeFlags, /*maxDepth*/ 64)) {
167+
if (F.getLinkage() == SILLinkage::Public) {
168+
if (canSerializeFunction(&F, canSerializeFlags, /*maxDepth*/ 64))
173169
serializeFunction(&F, canSerializeFlags);
174-
}
175170
}
176171
}
177172
}
@@ -194,11 +189,6 @@ bool CrossModuleOptimization::canSerializeFunction(
194189
// it to true at the end of this function.
195190
canSerializeFlags[function] = false;
196191

197-
if (everything) {
198-
canSerializeFlags[function] = true;
199-
return true;
200-
}
201-
202192
if (DeclContext *funcCtxt = function->getDeclContext()) {
203193
if (!canUseFromInline(funcCtxt))
204194
return false;
@@ -402,9 +392,6 @@ static bool couldBeLinkedStatically(DeclContext *funcCtxt, SILModule &module) {
402392

403393
/// Returns true if the \p declCtxt can be used from a serialized function.
404394
bool CrossModuleOptimization::canUseFromInline(DeclContext *declCtxt) {
405-
if (everything)
406-
return true;
407-
408395
if (!M.getSwiftModule()->canBeUsedForCrossModuleOptimization(declCtxt))
409396
return false;
410397

@@ -423,9 +410,6 @@ bool CrossModuleOptimization::canUseFromInline(DeclContext *declCtxt) {
423410

424411
/// Returns true if the function \p func can be used from a serialized function.
425412
bool CrossModuleOptimization::canUseFromInline(SILFunction *function) {
426-
if (everything)
427-
return true;
428-
429413
if (DeclContext *funcCtxt = function->getDeclContext()) {
430414
if (!canUseFromInline(funcCtxt))
431415
return false;
@@ -455,12 +439,14 @@ bool CrossModuleOptimization::shouldSerialize(SILFunction *function) {
455439
if (function->isSerialized())
456440
return false;
457441

458-
if (everything)
459-
return true;
460-
461442
if (function->hasSemanticsAttr("optimize.no.crossmodule"))
462443
return false;
463444

445+
// In embedded Swift we serialize everything.
446+
if (SerializeEverything ||
447+
function->getASTContext().LangOpts.hasFeature(Feature::Embedded))
448+
return true;
449+
464450
if (!conservative) {
465451
// The basic heuristic: serialize all generic functions, because it makes a
466452
// huge difference if generic functions can be specialized or not.
@@ -666,29 +652,23 @@ class CrossModuleOptimizationPass: public SILModuleTransform {
666652
return;
667653
if (!M.isWholeModule())
668654
return;
669-
655+
670656
bool conservative = false;
671-
bool everything = SerializeEverything;
672-
switch (M.getOptions().CMOMode) {
673-
case swift::CrossModuleOptimizationMode::Off:
674-
break;
675-
case swift::CrossModuleOptimizationMode::Default:
676-
conservative = true;
677-
break;
678-
case swift::CrossModuleOptimizationMode::Aggressive:
679-
conservative = false;
680-
break;
681-
case swift::CrossModuleOptimizationMode::Everything:
682-
everything = true;
683-
break;
684-
}
685-
686-
if (!everything &&
687-
M.getOptions().CMOMode == swift::CrossModuleOptimizationMode::Off) {
688-
return;
657+
// In embedded Swift we serialize everything.
658+
if (!M.getASTContext().LangOpts.hasFeature(Feature::Embedded)) {
659+
switch (M.getOptions().CMOMode) {
660+
case swift::CrossModuleOptimizationMode::Off:
661+
return;
662+
case swift::CrossModuleOptimizationMode::Default:
663+
conservative = true;
664+
break;
665+
case swift::CrossModuleOptimizationMode::Aggressive:
666+
conservative = false;
667+
break;
668+
}
689669
}
690670

691-
CrossModuleOptimization CMO(M, conservative, everything);
671+
CrossModuleOptimization CMO(M, conservative);
692672
CMO.serializeFunctionsInModule();
693673
}
694674
};

test/embedded/globals.swift

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: %target-swift-emit-ir -target armv7-apple-none-macho -parse-stdlib -module-name Swift %s -enable-experimental-feature Embedded -wmo -parse-as-library | %FileCheck %s --check-prefix CHECK --check-prefix CHECK-NONOPT
1+
// RUN: %target-swift-emit-ir -target armv7-apple-none-macho -parse-stdlib -module-name Swift %s -enable-experimental-feature Embedded -wmo -parse-as-library | %FileCheck %s
22
// RUN: %target-swift-emit-ir -target armv7-apple-none-macho -parse-stdlib -module-name Swift %s -enable-experimental-feature Embedded -wmo -parse-as-library -O | %FileCheck %s
33

44
// REQUIRES: swift_in_compiler
@@ -98,19 +98,19 @@ extension MyPublicEnum {
9898
public static var static_mypublicstruct_4: MyPublicStruct = MyPublicStruct(x: 0, y: 0)
9999
}
100100

101-
// CHECK-NONOPT: @"$ss12global_int_133_056BEF60D619AD2945081A9CBFC2AAE9LLSivp" = {{.*}}zeroinitializer
102-
// CHECK: @"$ss12global_int_2Sivp" = {{.*}}zeroinitializer
103-
// CHECK-NONOPT: @"$ss12global_int_333_056BEF60D619AD2945081A9CBFC2AAE9LLSivp" = {{.*}}zeroinitializer
104-
// CHECK: @"$ss12global_int_4Sivp" = {{.*}}zeroinitializer
105-
// CHECK-NONOPT: @"$ss12MyPublicEnumO12static_int_133_056BEF60D619AD2945081A9CBFC2AAE9LLSivpZ" = {{.*}}zeroinitializer
106-
// CHECK: @"$ss12MyPublicEnumO12static_int_2SivpZ" = {{.*}}zeroinitializer
107-
// CHECK-NONOPT: @"$ss12MyPublicEnumO12static_int_333_056BEF60D619AD2945081A9CBFC2AAE9LLSivpZ" = {{.*}}zeroinitializer
108-
// CHECK: @"$ss12MyPublicEnumO12static_int_4SivpZ" = {{.*}}zeroinitializer
109-
// CHECK-NONOPT: @"$ss24global_my_publicstruct_133_056BEF60D619AD2945081A9CBFC2AAE9LLs14MyPublicStructVvp" = {{.*}}zeroinitializer
110-
// CHECK: @"$ss24global_my_publicstruct_2s14MyPublicStructVvp" = {{.*}}zeroinitializer
111-
// CHECK-NONOPT: @"$ss24global_my_publicstruct_333_056BEF60D619AD2945081A9CBFC2AAE9LLs14MyPublicStructVvp" = {{.*}}zeroinitializer
112-
// CHECK: @"$ss24global_my_publicstruct_4s14MyPublicStructVvp" = {{.*}}zeroinitializer
113-
// CHECK-NOT: static_my_publicstruct_1
114-
// CHECK: @"$ss12MyPublicEnumO23static_mypublicstruct_2s0aB6StructVvpZ" = {{.*}}zeroinitializer
115-
// CHECK-NOT: static_my_publicstruct_3
116-
// CHECK: @"$ss12MyPublicEnumO23static_mypublicstruct_4s0aB6StructVvpZ" = {{.*}}zeroinitializer
101+
// CHECK-NOT: global_int_1
102+
// CHECK: @"$ss12global_int_2Sivp" = {{.*}}zeroinitializer
103+
// CHECK-NOT: global_int_3
104+
// CHECK: @"$ss12global_int_4Sivp" = {{.*}}zeroinitializer
105+
// CHECK-NOT: static_int_1
106+
// CHECK: @"$ss12MyPublicEnumO12static_int_2SivpZ" = {{.*}}zeroinitializer
107+
// CHECK-NOT: static_int_3
108+
// CHECK: @"$ss12MyPublicEnumO12static_int_4SivpZ" = {{.*}}zeroinitializer
109+
// CHECK-NOT: global_my_publicstruct_1
110+
// CHECK: @"$ss24global_my_publicstruct_2s14MyPublicStructVvp" = {{.*}}zeroinitializer
111+
// CHECK-NOT: global_my_publicstruct_3
112+
// CHECK: @"$ss24global_my_publicstruct_4s14MyPublicStructVvp" = {{.*}}zeroinitializer
113+
// CHECK-NOT: stati_my_publicstruct_1
114+
// CHECK: @"$ss12MyPublicEnumO23static_mypublicstruct_2s0aB6StructVvpZ" = {{.*}}zeroinitializer
115+
// CHECK-NOT: stati_my_publicstruct_3
116+
// CHECK: @"$ss12MyPublicEnumO23static_mypublicstruct_4s0aB6StructVvpZ" = {{.*}}zeroinitializer

test/embedded/modules-print-exec.swift

Lines changed: 0 additions & 50 deletions
This file was deleted.

0 commit comments

Comments
 (0)