Skip to content

Commit 6189e8e

Browse files
authored
Merge pull request #36031 from gottesmm/pr-3c9f3fdecad83d37bd4c97bc5116da95c64279e8
[ownership] Make whether or not we serialize in OSSA form based off of a flag instead of off of whether or not we are processing the stdlib.
2 parents 9756b8b + 91317c7 commit 6189e8e

File tree

11 files changed

+38
-15
lines changed

11 files changed

+38
-15
lines changed

include/swift/AST/SILOptions.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,11 @@ class SILOptions {
8989
/// and go from OSSA to non-ownership SIL.
9090
bool StopOptimizationBeforeLoweringOwnership = false;
9191

92+
/// Do we always serialize SIL in OSSA form?
93+
///
94+
/// If this is disabled we do not serialize in OSSA form when optimizing.
95+
bool EnableOSSAModules = false;
96+
9297
// The kind of function bodies to skip emitting.
9398
FunctionBodySkipping SkipFunctionBodies = FunctionBodySkipping::None;
9499

include/swift/Option/FrontendOptions.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -789,6 +789,10 @@ def disable_ast_verifier : Flag<["-"], "disable-ast-verifier">,
789789
"disabled. NOTE: Can not be used if enable-ast-verifier is used "
790790
"as well">;
791791

792+
def enable_ossa_modules : Flag<["-"], "enable-ossa-modules">,
793+
HelpText<"Always serialize SIL in ossa form. If this flag is not passed in, "
794+
"when optimizing ownership will be lowered before serializing SIL">;
795+
792796
def new_driver_path
793797
: Separate<["-"], "new-driver-path">, MetaVarName<"<path>">,
794798
HelpText<"Path of the new driver to be used">;

lib/Frontend/CompilerInvocation.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1186,6 +1186,7 @@ static bool ParseSILArgs(SILOptions &Opts, ArgList &Args,
11861186
Opts.RemoveRuntimeAsserts |= Args.hasArg(OPT_RemoveRuntimeAsserts);
11871187

11881188
Opts.EnableARCOptimizations &= !Args.hasArg(OPT_disable_arc_opts);
1189+
Opts.EnableOSSAModules |= Args.hasArg(OPT_enable_ossa_modules);
11891190
Opts.EnableOSSAOptimizations &= !Args.hasArg(OPT_disable_ossa_opts);
11901191
Opts.EnableSpeculativeDevirtualization |= Args.hasArg(OPT_enable_spec_devirt);
11911192
Opts.DisableSILPerfOptimizations |= Args.hasArg(OPT_disable_sil_perf_optzns);

lib/SILOptimizer/PassManager/PassPipeline.cpp

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -347,12 +347,11 @@ void addFunctionPasses(SILPassPipelinePlan &P,
347347
P.addDevirtualizer();
348348
P.addARCSequenceOpts();
349349

350-
if (!P.getOptions().SerializeStdlibWithOwnershipWithOpts) {
350+
if (P.getOptions().EnableOSSAModules) {
351351
// We earlier eliminated ownership if we are not compiling the stdlib. Now
352352
// handle the stdlib functions, re-simplifying, eliminating ARC as we do.
353353
P.addCopyPropagation();
354354
P.addSemanticARCOpts();
355-
P.addNonTransparentFunctionOwnershipModelEliminator();
356355
}
357356

358357
switch (OpLevel) {
@@ -372,7 +371,7 @@ void addFunctionPasses(SILPassPipelinePlan &P,
372371
}
373372

374373
// Clean up Semantic ARC before we perform additional post-inliner opts.
375-
if (P.getOptions().SerializeStdlibWithOwnershipWithOpts) {
374+
if (P.getOptions().EnableOSSAModules) {
376375
P.addCopyPropagation();
377376
P.addSemanticARCOpts();
378377
}
@@ -437,7 +436,7 @@ void addFunctionPasses(SILPassPipelinePlan &P,
437436
P.addARCSequenceOpts();
438437

439438
// Run a final round of ARC opts when ownership is enabled.
440-
if (P.getOptions().SerializeStdlibWithOwnershipWithOpts) {
439+
if (P.getOptions().EnableOSSAModules) {
441440
P.addCopyPropagation();
442441
P.addSemanticARCOpts();
443442
}
@@ -490,7 +489,8 @@ static void addPerfEarlyModulePassPipeline(SILPassPipelinePlan &P) {
490489
if (P.getOptions().StopOptimizationBeforeLoweringOwnership)
491490
return;
492491

493-
P.addNonStdlibNonTransparentFunctionOwnershipModelEliminator();
492+
if (!P.getOptions().EnableOSSAModules)
493+
P.addNonTransparentFunctionOwnershipModelEliminator();
494494

495495
// Start by linking in referenced functions from other modules.
496496
P.addPerformanceSILLinker();
@@ -778,15 +778,13 @@ SILPassPipelinePlan::getPerformancePassPipeline(const SILOptions &Options) {
778778
//
779779
// FIXME: When *not* emitting a .swiftmodule, skip the high-level function
780780
// pipeline to save compile time.
781-
//
782-
// NOTE: Ownership is now stripped within this function for the stdlib.
783781
addHighLevelFunctionPipeline(P);
784782

785783
addHighLevelModulePipeline(P);
786784

787785
// Run one last copy propagation/semantic arc opts run before serialization/us
788786
// lowering ownership.
789-
if (P.getOptions().SerializeStdlibWithOwnershipWithOpts) {
787+
if (P.getOptions().EnableOSSAModules) {
790788
P.addCopyPropagation();
791789
P.addSemanticARCOpts();
792790
}

stdlib/public/core/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,7 @@ endif()
286286

287287
# STAGING: Temporarily avoids having to write #fileID in Swift.swiftinterface.
288288
list(APPEND swift_stdlib_compile_flags "-Xfrontend" "-enable-experimental-concise-pound-file")
289+
list(APPEND swift_stdlib_compile_flags "-Xfrontend" "-enable-ossa-modules")
289290

290291
if(SWIFT_CHECK_ESSENTIAL_STDLIB)
291292
add_swift_target_library(swift_stdlib_essential ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} IS_STDLIB IS_STDLIB_CORE

test/SIL/Serialization/shared_function_serialization.sil

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// RUN: %empty-directory(%t)
2-
// RUN: %target-swift-frontend %S/Inputs/shared_function_serialization_input.swift -o %t/Swift.swiftmodule -emit-module -parse-as-library -parse-stdlib -module-link-name swiftCore -module-name Swift -O
3-
// RUN: %target-sil-opt -enable-sil-verify-all -I %t -performance-linker -inline %s -o - | %FileCheck %s
2+
// RUN: %target-swift-frontend %S/Inputs/shared_function_serialization_input.swift -o %t/Swift.swiftmodule -emit-module -parse-as-library -parse-stdlib -module-link-name swiftCore -module-name Swift -O -enable-ossa-modules
3+
// RUN: %target-sil-opt -enable-sil-verify-all -I %t -performance-linker -enable-ossa-modules -inline %s -o - | %FileCheck %s
44

55
// CHECK: sil private @top_level_code
66
// CHECK: sil public_external [serialized] [ossa] @$ss1XVABycfC{{.*}}

test/Serialization/early-serialization.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// RUN: %empty-directory(%t)
2-
// RUN: %target-swift-frontend -emit-module -O -module-name Swift -module-link-name swiftCore -parse-as-library -parse-stdlib -emit-module %s -o %t/Swift.swiftmodule
2+
// RUN: %target-swift-frontend -emit-module -O -module-name Swift -module-link-name swiftCore -parse-as-library -parse-stdlib -emit-module %s -o %t/Swift.swiftmodule -enable-ossa-modules
33
// RUN: %target-sil-opt -enable-sil-verify-all %t/Swift.swiftmodule -emit-sorted-sil -o - | %FileCheck %s
44

55
// Test that early serialization works as expected:

test/sil-func-extractor/load-serialized-sil.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
// RUN: %target-swift-frontend -primary-file %s -module-name Swift -g -module-link-name swiftCore -O -parse-as-library -parse-stdlib -emit-module -emit-module-path - -o /dev/null | %target-sil-func-extractor -module-name="Swift" -func='$ss1XV4testyyF' | %FileCheck %s
2-
// RUN: %target-swift-frontend -primary-file %s -module-name Swift -g -O -parse-as-library -parse-stdlib -emit-sib -o - | %target-sil-func-extractor -module-name="Swift" -func='$ss1XV4testyyF' | %FileCheck %s -check-prefix=SIB-CHECK
1+
// RUN: %target-swift-frontend -primary-file %s -module-name Swift -g -module-link-name swiftCore -O -parse-as-library -parse-stdlib -emit-module -emit-module-path - -enable-ossa-modules -o /dev/null | %target-sil-func-extractor -module-name="Swift" -enable-ossa-modules -func='$ss1XV4testyyF' | %FileCheck %s
2+
// RUN: %target-swift-frontend -primary-file %s -module-name Swift -g -O -parse-as-library -parse-stdlib -emit-sib -enable-ossa-modules -o - | %target-sil-func-extractor -module-name="Swift" -enable-ossa-modules -func='$ss1XV4testyyF' | %FileCheck %s -check-prefix=SIB-CHECK
33

44
// CHECK: import Builtin
55
// CHECK: import Swift

test/sil-opt/sil-opt.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
// RUN: %target-swift-frontend -primary-file %s -module-name Swift -g -module-link-name swiftCore -O -parse-as-library -parse-stdlib -emit-module -emit-module-path - -o /dev/null | %target-sil-opt -enable-sil-verify-all -module-name="Swift" -emit-sorted-sil | %FileCheck %s
2-
// RUN: %target-swift-frontend -primary-file %s -module-name Swift -g -O -parse-as-library -parse-stdlib -emit-sib -o - | %target-sil-opt -enable-sil-verify-all -module-name="Swift" -emit-sorted-sil | %FileCheck %s -check-prefix=SIB-CHECK
1+
// RUN: %target-swift-frontend -primary-file %s -enable-ossa-modules -module-name Swift -g -module-link-name swiftCore -O -parse-as-library -parse-stdlib -emit-module -emit-module-path - -o /dev/null | %target-sil-opt -enable-sil-verify-all -module-name="Swift" -emit-sorted-sil | %FileCheck %s
2+
// RUN: %target-swift-frontend -primary-file %s -enable-ossa-modules -module-name Swift -g -O -parse-as-library -parse-stdlib -emit-sib -o - | %target-sil-opt -enable-sil-verify-all -module-name="Swift" -emit-sorted-sil | %FileCheck %s -check-prefix=SIB-CHECK
33

44
// CHECK: import Builtin
55
// CHECK: import Swift

tools/sil-func-extractor/SILFunctionExtractor.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,12 @@ DisableASTDump("sil-disable-ast-dump", llvm::cl::Hidden,
110110
llvm::cl::init(false),
111111
llvm::cl::desc("Do not dump AST."));
112112

113+
static llvm::cl::opt<bool> EnableOSSAModules(
114+
"enable-ossa-modules",
115+
llvm::cl::desc("Do we always serialize SIL in OSSA form? If "
116+
"this is disabled we do not serialize in OSSA "
117+
"form when optimizing."));
118+
113119
// This function isn't referenced outside its translation unit, but it
114120
// can't use the "static" keyword because its address is used for
115121
// getMainExecutable (since some platforms don't support taking the
@@ -247,6 +253,7 @@ int main(int argc, char **argv) {
247253
SILOptions &Opts = Invocation.getSILOptions();
248254
Opts.EmitVerboseSIL = EmitVerboseSIL;
249255
Opts.EmitSortedSIL = EmitSortedSIL;
256+
Opts.EnableOSSAModules = EnableOSSAModules;
250257

251258
serialization::ExtendedValidationInfo extendedInfo;
252259
llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> FileBufOrErr =

tools/sil-opt/SILOpt.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,12 @@ static llvm::cl::opt<bool>
111111
EnableSpeculativeDevirtualization("enable-spec-devirt",
112112
llvm::cl::desc("Enable Speculative Devirtualization pass."));
113113

114+
static llvm::cl::opt<bool> EnableOSSAModules(
115+
"enable-ossa-modules",
116+
llvm::cl::desc("Do we always serialize SIL in OSSA form? If "
117+
"this is disabled we do not serialize in OSSA "
118+
"form when optimizing."));
119+
114120
namespace {
115121
enum class EnforceExclusivityMode {
116122
Unchecked, // static only
@@ -456,6 +462,7 @@ int main(int argc, char **argv) {
456462

457463
SILOpts.EnableSpeculativeDevirtualization = EnableSpeculativeDevirtualization;
458464
SILOpts.IgnoreAlwaysInline = IgnoreAlwaysInline;
465+
SILOpts.EnableOSSAModules = EnableOSSAModules;
459466

460467
serialization::ExtendedValidationInfo extendedInfo;
461468
llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> FileBufOrErr =

0 commit comments

Comments
 (0)