Skip to content

Commit abb2da8

Browse files
committed
Add a flag -enable-default-cmo to enable default cross-module-optimization.
So far, the swift-frontend decided by itself if CMO can be enabled. This caused problems when used with an old driver, which doesn't consider CMO. Now, the driver decides when to use default CMO by passing this flag to swift-frontend.
1 parent 45acb91 commit abb2da8

File tree

6 files changed

+35
-9
lines changed

6 files changed

+35
-9
lines changed

include/swift/AST/SILOptions.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,12 @@ enum class DestroyHoistingOption : uint8_t {
6666
On = 1
6767
};
6868

69+
enum class CrossModuleOptimizationMode : uint8_t {
70+
Off = 0,
71+
Default = 1,
72+
Aggressive = 2
73+
};
74+
6975
class SILModule;
7076

7177
class SILOptions {
@@ -117,7 +123,7 @@ class SILOptions {
117123
bool DisableSILPerfOptimizations = false;
118124

119125
/// Controls whether cross module optimization is enabled.
120-
bool CrossModuleOptimization = false;
126+
CrossModuleOptimizationMode CMOMode = CrossModuleOptimizationMode::Off;
121127

122128
/// Enables experimental performance annotations.
123129
bool EnablePerformanceAnnotations = false;

include/swift/Option/Options.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -812,6 +812,10 @@ def Oplayground : Flag<["-"], "Oplayground">, Group<O_Group>,
812812
Flags<[HelpHidden, FrontendOption, ModuleInterfaceOption]>,
813813
HelpText<"Compile with optimizations appropriate for a playground">;
814814

815+
def EnbaleDefaultCMO : Flag<["-"], "enable-default-cmo">,
816+
Flags<[HelpHidden, FrontendOption]>,
817+
HelpText<"Perform conservative cross-module optimization">;
818+
815819
def CrossModuleOptimization : Flag<["-"], "cross-module-optimization">,
816820
Flags<[HelpHidden, FrontendOption]>,
817821
HelpText<"Perform cross-module optimization">;

lib/Frontend/CompilerInvocation.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1745,7 +1745,11 @@ static bool ParseSILArgs(SILOptions &Opts, ArgList &Args,
17451745
OPT_enable_actor_data_race_checks,
17461746
OPT_disable_actor_data_race_checks, /*default=*/false);
17471747
Opts.DisableSILPerfOptimizations |= Args.hasArg(OPT_disable_sil_perf_optzns);
1748-
Opts.CrossModuleOptimization |= Args.hasArg(OPT_CrossModuleOptimization);
1748+
if (Args.hasArg(OPT_CrossModuleOptimization)) {
1749+
Opts.CMOMode = CrossModuleOptimizationMode::Aggressive;
1750+
} else if (Args.hasArg(OPT_EnbaleDefaultCMO)) {
1751+
Opts.CMOMode = CrossModuleOptimizationMode::Default;
1752+
}
17491753
Opts.EnablePerformanceAnnotations |=
17501754
Args.hasArg(OPT_ExperimentalPerformanceAnnotations);
17511755
Opts.VerifyAll |= Args.hasArg(OPT_sil_verify_all);

lib/FrontendTool/FrontendTool.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -702,7 +702,8 @@ static bool writeTBDIfNeeded(CompilerInstance &Instance) {
702702
return false;
703703
}
704704

705-
if (Invocation.getSILOptions().CrossModuleOptimization) {
705+
if (Invocation.getSILOptions().CMOMode ==
706+
CrossModuleOptimizationMode::Aggressive) {
706707
Instance.getDiags().diagnose(SourceLoc(),
707708
diag::tbd_not_supported_with_cmo);
708709
return false;
@@ -1406,7 +1407,7 @@ static bool validateTBDIfNeeded(const CompilerInvocation &Invocation,
14061407
}
14071408

14081409
// Cross-module optimization does not support TBD.
1409-
if (Invocation.getSILOptions().CrossModuleOptimization) {
1410+
if (Invocation.getSILOptions().CMOMode == CrossModuleOptimizationMode::Aggressive) {
14101411
return false;
14111412
}
14121413

lib/SILOptimizer/IPO/CrossModuleOptimization.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -613,9 +613,20 @@ class CrossModuleOptimizationPass: public SILModuleTransform {
613613
return;
614614
if (!M.isWholeModule())
615615
return;
616+
617+
bool conservative = false;
618+
switch (M.getOptions().CMOMode) {
619+
case swift::CrossModuleOptimizationMode::Off:
620+
return;
621+
case swift::CrossModuleOptimizationMode::Default:
622+
conservative = true;
623+
break;
624+
case swift::CrossModuleOptimizationMode::Aggressive:
625+
conservative = false;
626+
break;
627+
}
616628

617-
CrossModuleOptimization CMO(M,
618-
/*conservative*/ !M.getOptions().CrossModuleOptimization);
629+
CrossModuleOptimization CMO(M, conservative);
619630
CMO.serializeFunctionsInModule();
620631
}
621632
};

test/SILOptimizer/default-cmo.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11

22
// RUN: %empty-directory(%t)
33

4-
// RUN: %target-build-swift -O -wmo -parse-as-library -emit-module -emit-module-path=%t/Submodule.swiftmodule -module-name=Submodule %S/Inputs/cross-module/default-submodule.swift -c -o %t/submodule.o
5-
// RUN: %target-build-swift -O -wmo -parse-as-library -emit-module -emit-module-path=%t/Module.swiftmodule -module-name=Module -I%t -I%S/Inputs/cross-module %S/Inputs/cross-module/default-module.swift -c -o %t/module.o
6-
// RUN: %target-build-swift -O -wmo -parse-as-library -emit-tbd -emit-tbd-path %t/ModuleTBD.tbd -emit-module -emit-module-path=%t/ModuleTBD.swiftmodule -module-name=ModuleTBD -I%t -I%S/Inputs/cross-module %S/Inputs/cross-module/default-module.swift -c -o %t/moduletbd.o
4+
// RUN: %target-build-swift -O -wmo -Xfrontend -enable-default-cmo -parse-as-library -emit-module -emit-module-path=%t/Submodule.swiftmodule -module-name=Submodule %S/Inputs/cross-module/default-submodule.swift -c -o %t/submodule.o
5+
// RUN: %target-build-swift -O -wmo -Xfrontend -enable-default-cmo -parse-as-library -emit-module -emit-module-path=%t/Module.swiftmodule -module-name=Module -I%t -I%S/Inputs/cross-module %S/Inputs/cross-module/default-module.swift -c -o %t/module.o
6+
// RUN: %target-build-swift -O -wmo -Xfrontend -enable-default-cmo -parse-as-library -emit-tbd -emit-tbd-path %t/ModuleTBD.tbd -emit-module -emit-module-path=%t/ModuleTBD.swiftmodule -module-name=ModuleTBD -I%t -I%S/Inputs/cross-module %S/Inputs/cross-module/default-module.swift -c -o %t/moduletbd.o
77

88
// RUN: %target-build-swift -O -wmo -module-name=Main -I%t %s -emit-sil | %FileCheck %s
99

0 commit comments

Comments
 (0)