Skip to content

Commit e200f16

Browse files
committed
[Frontend] Add flag for pack metadata stack promo.
1 parent 0b5a233 commit e200f16

File tree

4 files changed

+48
-0
lines changed

4 files changed

+48
-0
lines changed

include/swift/AST/SILOptions.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,12 @@ class SILOptions {
173173
/// Require linear OSSA lifetimes after SILGen
174174
bool OSSACompleteLifetimes = false;
175175

176+
/// Enable pack metadata stack "promotion".
177+
///
178+
/// More accurately, enable skipping mandatory heapification of pack metadata
179+
/// when possible.
180+
bool EnablePackMetadataStackPromotion = false;
181+
176182
// The kind of function bodies to skip emitting.
177183
FunctionBodySkipping SkipFunctionBodies = FunctionBodySkipping::None;
178184

include/swift/Option/FrontendOptions.td

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1028,6 +1028,16 @@ def force_struct_type_layouts : Flag<["-"], "force-struct-type-layouts">,
10281028
def enable_layout_string_value_witnesses : Flag<["-"], "enable-layout-string-value-witnesses">,
10291029
HelpText<"Enable layout string based value witnesses">;
10301030

1031+
let Flags = [FrontendOption, NoDriverOption, HelpHidden, ModuleInterfaceOptionIgnorable] in {
1032+
def enable_pack_metadata_stack_promotion :
1033+
Joined<["-"], "enable-pack-metadata-stack-promotion=">,
1034+
HelpText<"Whether to skip heapifying stack metadata packs when possible.">,
1035+
MetaVarName<"true|false">;
1036+
def enable_pack_metadata_stack_promotion_noArg :
1037+
Flag<["-"], "enable-pack-metadata-stack-promotion">,
1038+
HelpText<"Skip heapifying stack metadata packs when possible.">;
1039+
}
1040+
10311041
def disable_layout_string_value_witnesses : Flag<["-"], "disable-layout-string-value-witnesses">,
10321042
HelpText<"Disable layout string based value witnesses">;
10331043

lib/DriverTool/sil_opt_main.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,11 @@ struct SILOptOptions {
239239
"enable-experimental-move-only", llvm::cl::init(llvm::cl::BOU_UNSET),
240240
llvm::cl::desc("Enable experimental move-only semantics."));
241241

242+
llvm::cl::opt<bool> EnablePackMetadataStackPromotion = llvm::cl::opt<bool>(
243+
"enable-pack-metadata-stack-promotion", llvm::cl::init(false),
244+
llvm::cl::desc(
245+
"Whether to skip heapifying stack metadata packs when possible."));
246+
242247
llvm::cl::opt<bool>
243248
EnableExperimentalDistributed = llvm::cl::opt<bool>("enable-experimental-distributed",
244249
llvm::cl::desc("Enable experimental distributed actors."));
@@ -719,6 +724,9 @@ int sil_opt_main(ArrayRef<const char *> argv, void *MainAddr) {
719724
? LexicalLifetimesOption::DiagnosticMarkersOnly
720725
: LexicalLifetimesOption::Off;
721726

727+
SILOpts.EnablePackMetadataStackPromotion =
728+
options.EnablePackMetadataStackPromotion;
729+
722730
if (options.OptModeFlag == OptimizationMode::NotSet) {
723731
if (options.OptimizationGroup == OptGroup::Diagnostics)
724732
SILOpts.OptMode = OptimizationMode::NoOptimization;

lib/Frontend/CompilerInvocation.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2066,6 +2066,30 @@ static bool ParseSILArgs(SILOptions &Opts, ArgList &Args,
20662066
if (specifiedDestroyHoistingOption)
20672067
Opts.DestroyHoisting = *specifiedDestroyHoistingOption;
20682068

2069+
Optional<bool> enablePackMetadataStackPromotionFlag;
2070+
if (Arg *A = Args.getLastArg(OPT_enable_pack_metadata_stack_promotion)) {
2071+
enablePackMetadataStackPromotionFlag =
2072+
llvm::StringSwitch<Optional<bool>>(A->getValue())
2073+
.Case("true", true)
2074+
.Case("false", false)
2075+
.Default(None);
2076+
}
2077+
if (Args.getLastArg(OPT_enable_pack_metadata_stack_promotion_noArg)) {
2078+
if (!enablePackMetadataStackPromotionFlag.value_or(true)) {
2079+
// Error if pack metadata stack promotion has been disabled via the
2080+
// meta-var form and enabled via the flag.
2081+
Diags.diagnose(SourceLoc(), diag::error_invalid_arg_combination,
2082+
"enable-pack-metadata-stack-promotion",
2083+
"enable-pack-metadata-stack-promotion=false");
2084+
return true;
2085+
} else {
2086+
enablePackMetadataStackPromotionFlag = true;
2087+
}
2088+
}
2089+
if (enablePackMetadataStackPromotionFlag)
2090+
Opts.EnablePackMetadataStackPromotion =
2091+
enablePackMetadataStackPromotionFlag.value();
2092+
20692093
Opts.EnableARCOptimizations &= !Args.hasArg(OPT_disable_arc_opts);
20702094
Opts.EnableOSSAModules |= Args.hasArg(OPT_enable_ossa_modules);
20712095
Opts.EnableOSSAOptimizations &= !Args.hasArg(OPT_disable_ossa_opts);

0 commit comments

Comments
 (0)