@@ -1466,6 +1466,42 @@ static bool ParseSILArgs(SILOptions &Opts, ArgList &Args,
14661466 // -Ounchecked might also set removal of runtime asserts (cond_fail).
14671467 Opts.RemoveRuntimeAsserts |= Args.hasArg (OPT_RemoveRuntimeAsserts);
14681468
1469+ Optional<CopyPropagationOption> specifiedCopyPropagationOption;
1470+ if (Arg *A = Args.getLastArg (OPT_copy_propagation_state_EQ)) {
1471+ specifiedCopyPropagationOption =
1472+ llvm::StringSwitch<Optional<CopyPropagationOption>>(A->getValue ())
1473+ .Case (" true" , CopyPropagationOption::On)
1474+ .Case (" false" , CopyPropagationOption::Off)
1475+ .Case (" requested-passes-only" ,
1476+ CopyPropagationOption::RequestedPassesOnly)
1477+ .Default (None);
1478+ }
1479+ if (Args.hasArg (OPT_enable_copy_propagation)) {
1480+ if (specifiedCopyPropagationOption) {
1481+ if (*specifiedCopyPropagationOption == CopyPropagationOption::Off) {
1482+ // Error if copy propagation has been set to ::Off via the meta-var form
1483+ // and enabled via the flag.
1484+ Diags.diagnose (SourceLoc (), diag::error_invalid_arg_combination,
1485+ " enable-copy-propagation" ,
1486+ " enable-copy-propagation=false" );
1487+ return true ;
1488+ } else if (*specifiedCopyPropagationOption ==
1489+ CopyPropagationOption::RequestedPassesOnly) {
1490+ // Error if copy propagation has been set to ::RequestedPassesOnly via
1491+ // the meta-var form and enabled via the flag.
1492+ Diags.diagnose (SourceLoc (), diag::error_invalid_arg_combination,
1493+ " enable-copy-propagation" ,
1494+ " enable-copy-propagation=requested-passes-only" );
1495+ return true ;
1496+ }
1497+ } else {
1498+ specifiedCopyPropagationOption = CopyPropagationOption::On;
1499+ }
1500+ }
1501+ if (specifiedCopyPropagationOption) {
1502+ Opts.CopyPropagation = *specifiedCopyPropagationOption;
1503+ }
1504+
14691505 Optional<bool > enableLexicalBorrowScopesFlag;
14701506 if (Arg *A = Args.getLastArg (OPT_enable_lexical_borrow_scopes)) {
14711507 enableLexicalBorrowScopesFlag =
@@ -1525,13 +1561,14 @@ static bool ParseSILArgs(SILOptions &Opts, ArgList &Args,
15251561 return true ;
15261562 }
15271563
1528- // -enable- copy- propagation implies -enable-lexical-lifetimes unless
1529- // otherwise specified .
1530- if (Args. hasArg (OPT_enable_copy_propagation) )
1564+ // Unless overridden below, enabling copy propagation means enabling lexical
1565+ // lifetimes .
1566+ if (Opts. CopyPropagation == CopyPropagationOption::On )
15311567 Opts.LexicalLifetimes = LexicalLifetimesOption::On;
15321568
1533- // -disable-copy-propagation implies -enable-lexical-lifetimes=false
1534- if (Args.hasArg (OPT_disable_copy_propagation))
1569+ // Unless overridden below, disable copy propagation means disabling lexical
1570+ // lifetimes.
1571+ if (Opts.CopyPropagation == CopyPropagationOption::Off)
15351572 Opts.LexicalLifetimes = LexicalLifetimesOption::DiagnosticMarkersOnly;
15361573
15371574 // If move-only is enabled, always enable lexical lifetime as well. Move-only
@@ -1554,24 +1591,6 @@ static bool ParseSILArgs(SILOptions &Opts, ArgList &Args,
15541591 }
15551592 }
15561593
1557- if (Args.hasArg (OPT_enable_copy_propagation) &&
1558- Args.hasArg (OPT_disable_copy_propagation)) {
1559- // Error if copy propagation is enabled and copy propagation is disabled.
1560- Diags.diagnose (SourceLoc (), diag::error_invalid_arg_combination,
1561- " enable-copy-propagation" , " disable-copy-propagation" );
1562- return true ;
1563- } else if (Args.hasArg (OPT_enable_copy_propagation) &&
1564- !Args.hasArg (OPT_disable_copy_propagation)) {
1565- Opts.CopyPropagation = CopyPropagationOption::On;
1566- } else if (!Args.hasArg (OPT_enable_copy_propagation) &&
1567- Args.hasArg (OPT_disable_copy_propagation)) {
1568- Opts.CopyPropagation = CopyPropagationOption::Off;
1569- } else /* if (!Args.hasArg(OPT_enable_copy_propagation) &&
1570- !Args.hasArg(OPT_disable_copy_propagation))*/
1571- {
1572- Opts.CopyPropagation = CopyPropagationOption::RequestedPassesOnly;
1573- }
1574-
15751594 Opts.EnableARCOptimizations &= !Args.hasArg (OPT_disable_arc_opts);
15761595 Opts.EnableOSSAModules |= Args.hasArg (OPT_enable_ossa_modules);
15771596 Opts.EnableOSSAOptimizations &= !Args.hasArg (OPT_disable_ossa_opts);
0 commit comments