Skip to content

Commit 660929d

Browse files
Merge pull request #40539 from nate-chandler/copy_propagation/rename-options
[NFC] Tweaked SILOptions fields for copy propagation.
2 parents 8631376 + 478136d commit 660929d

File tree

5 files changed

+67
-26
lines changed

5 files changed

+67
-26
lines changed

include/swift/AST/SILOptions.h

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,20 @@ enum class LexicalLifetimesOption : uint8_t {
4444
On,
4545
};
4646

47+
enum class CopyPropagationOption : uint8_t {
48+
// Do not add any copy propagation passes.
49+
Off = 0,
50+
51+
// Only add the copy propagation passes requested by other flags, currently
52+
// just -enable-ossa-modules.
53+
RequestedPassesOnly,
54+
55+
// Add all relevant copy propagation passes. If a setting, e.g.
56+
// -enable-ossa-modules, requests to add copy propagation to the pipeline, do
57+
// so.
58+
On
59+
};
60+
4761
class SILModule;
4862

4963
class SILOptions {
@@ -64,15 +78,12 @@ class SILOptions {
6478
LexicalLifetimesOption LexicalLifetimes =
6579
LexicalLifetimesOption::DiagnosticMarkersOnly;
6680

67-
/// Force-run SIL copy propagation to shorten object lifetime in whatever
68-
/// optimization pipeline is currently used.
69-
/// When this is 'false' the pipeline has default behavior.
70-
bool EnableCopyPropagation = false;
71-
72-
/// Disable SIL copy propagation to preserve object lifetime in whatever
81+
/// Whether to run SIL copy propagation to shorten object lifetime in whatever
7382
/// optimization pipeline is currently used.
74-
/// When this is 'false' the pipeline has default behavior.
75-
bool DisableCopyPropagation = false;
83+
///
84+
/// When this is 'RequestedPassesOnly' the pipeline has default behavior.
85+
CopyPropagationOption CopyPropagation =
86+
CopyPropagationOption::RequestedPassesOnly;
7687

7788
/// Controls whether the SIL ARC optimizations are run.
7889
bool EnableARCOptimizations = true;

lib/Frontend/CompilerInvocation.cpp

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1551,8 +1551,24 @@ static bool ParseSILArgs(SILOptions &Opts, ArgList &Args,
15511551
}
15521552
}
15531553

1554-
Opts.EnableCopyPropagation |= Args.hasArg(OPT_enable_copy_propagation);
1555-
Opts.DisableCopyPropagation |= Args.hasArg(OPT_disable_copy_propagation);
1554+
if (Args.hasArg(OPT_enable_copy_propagation) &&
1555+
Args.hasArg(OPT_disable_copy_propagation)) {
1556+
// Error if copy propagation is enabled and copy propagation is disabled.
1557+
Diags.diagnose(SourceLoc(), diag::error_invalid_arg_combination,
1558+
"enable-copy-propagation", "disable-copy-propagation");
1559+
return true;
1560+
} else if (Args.hasArg(OPT_enable_copy_propagation) &&
1561+
!Args.hasArg(OPT_disable_copy_propagation)) {
1562+
Opts.CopyPropagation = CopyPropagationOption::On;
1563+
} else if (!Args.hasArg(OPT_enable_copy_propagation) &&
1564+
Args.hasArg(OPT_disable_copy_propagation)) {
1565+
Opts.CopyPropagation = CopyPropagationOption::Off;
1566+
} else /*if (!Args.hasArg(OPT_enable_copy_propagation) &&
1567+
!Args.hasArg(OPT_disable_copy_propagation))*/
1568+
{
1569+
Opts.CopyPropagation = CopyPropagationOption::RequestedPassesOnly;
1570+
}
1571+
15561572
Opts.EnableARCOptimizations &= !Args.hasArg(OPT_disable_arc_opts);
15571573
Opts.EnableOSSAModules |= Args.hasArg(OPT_enable_ossa_modules);
15581574
Opts.EnableOSSAOptimizations &= !Args.hasArg(OPT_disable_ossa_opts);

lib/SILOptimizer/PassManager/PassPipeline.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -194,10 +194,10 @@ static void addMandatoryDiagnosticOptPipeline(SILPassPipelinePlan &P) {
194194

195195
// Only issue weak lifetime warnings for users who select object lifetime
196196
// optimization. The risk of spurious warnings outweighs the benefits.
197-
if (P.getOptions().EnableCopyPropagation) {
197+
if (P.getOptions().CopyPropagation == CopyPropagationOption::On) {
198198
P.addDiagnoseLifetimeIssues();
199199
}
200-
200+
201201
P.addGlobalOpt();
202202
P.addPerformanceDiagnostics();
203203

@@ -412,7 +412,7 @@ void addFunctionPasses(SILPassPipelinePlan &P,
412412
if (P.getOptions().EnableOSSAModules) {
413413
// We earlier eliminated ownership if we are not compiling the stdlib. Now
414414
// handle the stdlib functions, re-simplifying, eliminating ARC as we do.
415-
if (!P.getOptions().DisableCopyPropagation) {
415+
if (P.getOptions().CopyPropagation != CopyPropagationOption::Off) {
416416
P.addCopyPropagation();
417417
}
418418
P.addSemanticARCOpts();
@@ -436,7 +436,7 @@ void addFunctionPasses(SILPassPipelinePlan &P,
436436

437437
// Clean up Semantic ARC before we perform additional post-inliner opts.
438438
if (P.getOptions().EnableOSSAModules) {
439-
if (!P.getOptions().DisableCopyPropagation) {
439+
if (P.getOptions().CopyPropagation != CopyPropagationOption::Off) {
440440
P.addCopyPropagation();
441441
}
442442
P.addSemanticARCOpts();
@@ -503,7 +503,7 @@ void addFunctionPasses(SILPassPipelinePlan &P,
503503

504504
// Run a final round of ARC opts when ownership is enabled.
505505
if (P.getOptions().EnableOSSAModules) {
506-
if (!P.getOptions().DisableCopyPropagation) {
506+
if (P.getOptions().CopyPropagation != CopyPropagationOption::Off) {
507507
P.addCopyPropagation();
508508
}
509509
P.addSemanticARCOpts();
@@ -539,7 +539,7 @@ static void addPerfEarlyModulePassPipeline(SILPassPipelinePlan &P) {
539539
// Cleanup after SILGen: remove trivial copies to temporaries.
540540
P.addTempRValueOpt();
541541
// Cleanup after SILGen: remove unneeded borrows/copies.
542-
if (P.getOptions().EnableCopyPropagation) {
542+
if (P.getOptions().CopyPropagation == CopyPropagationOption::On) {
543543
P.addCopyPropagation();
544544
}
545545
P.addSemanticARCOpts();
@@ -863,7 +863,7 @@ SILPassPipelinePlan::getPerformancePassPipeline(const SILOptions &Options) {
863863
// Run one last copy propagation/semantic arc opts run before serialization/us
864864
// lowering ownership.
865865
if (P.getOptions().EnableOSSAModules) {
866-
if (!P.getOptions().DisableCopyPropagation) {
866+
if (P.getOptions().CopyPropagation != CopyPropagationOption::Off) {
867867
P.addCopyPropagation();
868868
}
869869
P.addSemanticARCOpts();
@@ -915,7 +915,7 @@ SILPassPipelinePlan::getOnonePassPipeline(const SILOptions &Options) {
915915
P.startPipeline("non-Diagnostic Enabling Mandatory Optimizations");
916916
P.addForEachLoopUnroll();
917917
P.addMandatoryCombine();
918-
if (P.getOptions().EnableCopyPropagation) {
918+
if (P.getOptions().CopyPropagation == CopyPropagationOption::On) {
919919
// MandatoryCopyPropagation should only be run at -Onone, not -O.
920920
P.addMandatoryCopyPropagation();
921921
}

lib/SILOptimizer/SILCombiner/SILCombine.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -537,9 +537,11 @@ class SILCombine : public SILFunctionTransform {
537537
auto *CHA = PM->getAnalysis<ClassHierarchyAnalysis>();
538538
auto *NLABA = PM->getAnalysis<NonLocalAccessBlockAnalysis>();
539539

540-
bool enableCopyPropagation = getOptions().EnableCopyPropagation;
540+
bool enableCopyPropagation =
541+
getOptions().CopyPropagation == CopyPropagationOption::On;
541542
if (getOptions().EnableOSSAModules) {
542-
enableCopyPropagation = !getOptions().DisableCopyPropagation;
543+
enableCopyPropagation =
544+
getOptions().CopyPropagation != CopyPropagationOption::Off;
543545
}
544546

545547
SILOptFunctionBuilder FuncBuilder(*this);

tools/sil-opt/SILOpt.cpp

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -139,11 +139,11 @@ static llvm::cl::opt<bool> EnableOSSAModules(
139139
"form when optimizing."));
140140

141141
static llvm::cl::opt<bool>
142-
EnableCopyPropagation("enable-copy-propagation",
142+
EnableCopyPropagation("enable-copy-propagation", llvm::cl::init(false),
143143
llvm::cl::desc("Enable the copy propagation pass."));
144144

145145
static llvm::cl::opt<bool> DisableCopyPropagation(
146-
"disable-copy-propagation",
146+
"disable-copy-propagation", llvm::cl::init(false),
147147
llvm::cl::desc("Disable the copy propagation pass."));
148148

149149
namespace {
@@ -524,8 +524,18 @@ int main(int argc, char **argv) {
524524
SILOpts.EnableSpeculativeDevirtualization = EnableSpeculativeDevirtualization;
525525
SILOpts.IgnoreAlwaysInline = IgnoreAlwaysInline;
526526
SILOpts.EnableOSSAModules = EnableOSSAModules;
527-
SILOpts.EnableCopyPropagation = EnableCopyPropagation;
528-
SILOpts.DisableCopyPropagation = DisableCopyPropagation;
527+
528+
if (EnableCopyPropagation && DisableCopyPropagation) {
529+
fprintf(stderr, "Error! Cannot specify both -enable-copy-propagation "
530+
"and -disable-copy-propagation.");
531+
exit(-1);
532+
} else if (EnableCopyPropagation && !DisableCopyPropagation) {
533+
SILOpts.CopyPropagation = CopyPropagationOption::On;
534+
} else if (!EnableCopyPropagation && DisableCopyPropagation) {
535+
SILOpts.CopyPropagation = CopyPropagationOption::Off;
536+
} else /*if (!EnableCopyPropagation && !DisableCopyPropagation)*/ {
537+
SILOpts.CopyPropagation = CopyPropagationOption::RequestedPassesOnly;
538+
}
529539

530540
if (EnableCopyPropagation)
531541
SILOpts.LexicalLifetimes = LexicalLifetimesOption::On;
@@ -538,8 +548,10 @@ int main(int argc, char **argv) {
538548
bool enableLexicalLifetimes =
539549
EnableLexicalLifetimes | EnableExperimentalMoveOnly;
540550
if (enableLexicalLifetimes && !EnableLexicalBorrowScopes) {
541-
fprintf(stderr, "Error! Cannot specify both -enable-lexical-lifetimes "
542-
"and either -enable-lexical-borrow-scopes=false");
551+
fprintf(
552+
stderr,
553+
"Error! Cannot specify both -enable-lexical-borrow-scopes=false and "
554+
"either -enable-lexical-lifetimes or -enable-experimental-move-only.");
543555
exit(-1);
544556
}
545557
if (enableLexicalLifetimes)

0 commit comments

Comments
 (0)