From e200f164a9efe68a79b1eeca1b5a5b3cdd486c9e Mon Sep 17 00:00:00 2001 From: Nate Chandler Date: Fri, 26 May 2023 09:05:57 -0700 Subject: [PATCH] [Frontend] Add flag for pack metadata stack promo. --- include/swift/AST/SILOptions.h | 6 ++++++ include/swift/Option/FrontendOptions.td | 10 ++++++++++ lib/DriverTool/sil_opt_main.cpp | 8 ++++++++ lib/Frontend/CompilerInvocation.cpp | 24 ++++++++++++++++++++++++ 4 files changed, 48 insertions(+) diff --git a/include/swift/AST/SILOptions.h b/include/swift/AST/SILOptions.h index 6d42ba5611dd1..c7f85aaf217ef 100644 --- a/include/swift/AST/SILOptions.h +++ b/include/swift/AST/SILOptions.h @@ -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; diff --git a/include/swift/Option/FrontendOptions.td b/include/swift/Option/FrontendOptions.td index a4f7f6faafc4c..df09e0f4ac622 100644 --- a/include/swift/Option/FrontendOptions.td +++ b/include/swift/Option/FrontendOptions.td @@ -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">; diff --git a/lib/DriverTool/sil_opt_main.cpp b/lib/DriverTool/sil_opt_main.cpp index 6dd232562ad41..b75517cd23f0d 100644 --- a/lib/DriverTool/sil_opt_main.cpp +++ b/lib/DriverTool/sil_opt_main.cpp @@ -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 EnablePackMetadataStackPromotion = llvm::cl::opt( + "enable-pack-metadata-stack-promotion", llvm::cl::init(false), + llvm::cl::desc( + "Whether to skip heapifying stack metadata packs when possible.")); + llvm::cl::opt EnableExperimentalDistributed = llvm::cl::opt("enable-experimental-distributed", llvm::cl::desc("Enable experimental distributed actors.")); @@ -719,6 +724,9 @@ int sil_opt_main(ArrayRef 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; diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index 1f95a1d734226..8b15ac0ca0f79 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -2066,6 +2066,30 @@ static bool ParseSILArgs(SILOptions &Opts, ArgList &Args, if (specifiedDestroyHoistingOption) Opts.DestroyHoisting = *specifiedDestroyHoistingOption; + Optional enablePackMetadataStackPromotionFlag; + if (Arg *A = Args.getLastArg(OPT_enable_pack_metadata_stack_promotion)) { + enablePackMetadataStackPromotionFlag = + llvm::StringSwitch>(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);