Skip to content

Commit

Permalink
[Frontend] Add flag for pack metadata stack promo.
Browse files Browse the repository at this point in the history
  • Loading branch information
nate-chandler committed Jun 5, 2023
1 parent 0b5a233 commit e200f16
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 0 deletions.
6 changes: 6 additions & 0 deletions include/swift/AST/SILOptions.h
Expand Up @@ -173,6 +173,12 @@ class SILOptions {
/// Require linear OSSA lifetimes after SILGen
bool OSSACompleteLifetimes = false;

/// Enable pack metadata stack "promotion".
///
/// More accurately, enable skipping mandatory heapification of pack metadata
/// when possible.
bool EnablePackMetadataStackPromotion = false;

// The kind of function bodies to skip emitting.
FunctionBodySkipping SkipFunctionBodies = FunctionBodySkipping::None;

Expand Down
10 changes: 10 additions & 0 deletions include/swift/Option/FrontendOptions.td
Expand Up @@ -1028,6 +1028,16 @@ def force_struct_type_layouts : Flag<["-"], "force-struct-type-layouts">,
def enable_layout_string_value_witnesses : Flag<["-"], "enable-layout-string-value-witnesses">,
HelpText<"Enable layout string based value witnesses">;

let Flags = [FrontendOption, NoDriverOption, HelpHidden, ModuleInterfaceOptionIgnorable] in {
def enable_pack_metadata_stack_promotion :
Joined<["-"], "enable-pack-metadata-stack-promotion=">,
HelpText<"Whether to skip heapifying stack metadata packs when possible.">,
MetaVarName<"true|false">;
def enable_pack_metadata_stack_promotion_noArg :
Flag<["-"], "enable-pack-metadata-stack-promotion">,
HelpText<"Skip heapifying stack metadata packs when possible.">;
}

def disable_layout_string_value_witnesses : Flag<["-"], "disable-layout-string-value-witnesses">,
HelpText<"Disable layout string based value witnesses">;

Expand Down
8 changes: 8 additions & 0 deletions lib/DriverTool/sil_opt_main.cpp
Expand Up @@ -239,6 +239,11 @@ struct SILOptOptions {
"enable-experimental-move-only", llvm::cl::init(llvm::cl::BOU_UNSET),
llvm::cl::desc("Enable experimental move-only semantics."));

llvm::cl::opt<bool> EnablePackMetadataStackPromotion = llvm::cl::opt<bool>(
"enable-pack-metadata-stack-promotion", llvm::cl::init(false),
llvm::cl::desc(
"Whether to skip heapifying stack metadata packs when possible."));

llvm::cl::opt<bool>
EnableExperimentalDistributed = llvm::cl::opt<bool>("enable-experimental-distributed",
llvm::cl::desc("Enable experimental distributed actors."));
Expand Down Expand Up @@ -719,6 +724,9 @@ int sil_opt_main(ArrayRef<const char *> argv, void *MainAddr) {
? LexicalLifetimesOption::DiagnosticMarkersOnly
: LexicalLifetimesOption::Off;

SILOpts.EnablePackMetadataStackPromotion =
options.EnablePackMetadataStackPromotion;

if (options.OptModeFlag == OptimizationMode::NotSet) {
if (options.OptimizationGroup == OptGroup::Diagnostics)
SILOpts.OptMode = OptimizationMode::NoOptimization;
Expand Down
24 changes: 24 additions & 0 deletions lib/Frontend/CompilerInvocation.cpp
Expand Up @@ -2066,6 +2066,30 @@ static bool ParseSILArgs(SILOptions &Opts, ArgList &Args,
if (specifiedDestroyHoistingOption)
Opts.DestroyHoisting = *specifiedDestroyHoistingOption;

Optional<bool> enablePackMetadataStackPromotionFlag;
if (Arg *A = Args.getLastArg(OPT_enable_pack_metadata_stack_promotion)) {
enablePackMetadataStackPromotionFlag =
llvm::StringSwitch<Optional<bool>>(A->getValue())
.Case("true", true)
.Case("false", false)
.Default(None);
}
if (Args.getLastArg(OPT_enable_pack_metadata_stack_promotion_noArg)) {
if (!enablePackMetadataStackPromotionFlag.value_or(true)) {
// Error if pack metadata stack promotion has been disabled via the
// meta-var form and enabled via the flag.
Diags.diagnose(SourceLoc(), diag::error_invalid_arg_combination,
"enable-pack-metadata-stack-promotion",
"enable-pack-metadata-stack-promotion=false");
return true;
} else {
enablePackMetadataStackPromotionFlag = true;
}
}
if (enablePackMetadataStackPromotionFlag)
Opts.EnablePackMetadataStackPromotion =
enablePackMetadataStackPromotionFlag.value();

Opts.EnableARCOptimizations &= !Args.hasArg(OPT_disable_arc_opts);
Opts.EnableOSSAModules |= Args.hasArg(OPT_enable_ossa_modules);
Opts.EnableOSSAOptimizations &= !Args.hasArg(OPT_disable_ossa_opts);
Expand Down

0 comments on commit e200f16

Please sign in to comment.