Skip to content

Commit 6e34b18

Browse files
committed
[Frontend] Add flag for pack metadata stack promo.
1 parent 3798be2 commit 6e34b18

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
@@ -176,6 +176,12 @@ class SILOptions {
176176
/// Require linear OSSA lifetimes after SILGen
177177
bool OSSACompleteLifetimes = false;
178178

179+
/// Enable pack metadata stack "promotion".
180+
///
181+
/// More accurately, enable skipping mandatory heapification of pack metadata
182+
/// when possible.
183+
bool EnablePackMetadataStackPromotion = false;
184+
179185
// The kind of function bodies to skip emitting.
180186
FunctionBodySkipping SkipFunctionBodies = FunctionBodySkipping::None;
181187

include/swift/Option/FrontendOptions.td

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

1024+
let Flags = [FrontendOption, NoDriverOption, HelpHidden, ModuleInterfaceOptionIgnorable] in {
1025+
def enable_pack_metadata_stack_promotion :
1026+
Joined<["-"], "enable-pack-metadata-stack-promotion=">,
1027+
HelpText<"Whether to skip heapifying stack metadata packs when possible.">,
1028+
MetaVarName<"true|false">;
1029+
def enable_pack_metadata_stack_promotion_noArg :
1030+
Flag<["-"], "enable-pack-metadata-stack-promotion">,
1031+
HelpText<"Skip heapifying stack metadata packs when possible.">;
1032+
}
1033+
10241034
def disable_layout_string_value_witnesses : Flag<["-"], "disable-layout-string-value-witnesses">,
10251035
HelpText<"Disable layout string based value witnesses">;
10261036

lib/Frontend/CompilerInvocation.cpp

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

2027+
Optional<bool> enablePackMetadataStackPromotionFlag;
2028+
if (Arg *A = Args.getLastArg(OPT_enable_pack_metadata_stack_promotion)) {
2029+
enablePackMetadataStackPromotionFlag =
2030+
llvm::StringSwitch<Optional<bool>>(A->getValue())
2031+
.Case("true", true)
2032+
.Case("false", false)
2033+
.Default(None);
2034+
}
2035+
if (Args.getLastArg(OPT_enable_pack_metadata_stack_promotion_noArg)) {
2036+
if (!enablePackMetadataStackPromotionFlag.value_or(true)) {
2037+
// Error if pack metadata stack promotion has been disabled via the
2038+
// meta-var form and enabled via the flag.
2039+
Diags.diagnose(SourceLoc(), diag::error_invalid_arg_combination,
2040+
"enable-pack-metadata-stack-promotion",
2041+
"enable-pack-metadata-stack-promotion=false");
2042+
return true;
2043+
} else {
2044+
enablePackMetadataStackPromotionFlag = true;
2045+
}
2046+
}
2047+
if (enablePackMetadataStackPromotionFlag)
2048+
Opts.EnablePackMetadataStackPromotion =
2049+
enablePackMetadataStackPromotionFlag.value();
2050+
20272051
Opts.EnableARCOptimizations &= !Args.hasArg(OPT_disable_arc_opts);
20282052
Opts.EnableOSSAModules |= Args.hasArg(OPT_enable_ossa_modules);
20292053
Opts.EnableOSSAOptimizations &= !Args.hasArg(OPT_disable_ossa_opts);

tools/sil-opt/SILOpt.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,12 @@ static llvm::cl::opt<llvm::cl::boolOrDefault> EnableExperimentalMoveOnly(
144144
"enable-experimental-move-only", llvm::cl::init(llvm::cl::BOU_UNSET),
145145
llvm::cl::desc("Enable experimental move-only semantics."));
146146

147+
static llvm::cl::opt<bool> EnablePackMetadataStackPromotion =
148+
llvm::cl::opt<bool>(
149+
"enable-pack-metadata-stack-promotion", llvm::cl::init(false),
150+
llvm::cl::desc(
151+
"Whether to skip heapifying stack metadata packs when possible."));
152+
147153
static llvm::cl::opt<bool>
148154
EnableExperimentalDistributed("enable-experimental-distributed",
149155
llvm::cl::desc("Enable experimental distributed actors."));
@@ -708,6 +714,8 @@ int main(int argc, char **argv) {
708714
? LexicalLifetimesOption::DiagnosticMarkersOnly
709715
: LexicalLifetimesOption::Off;
710716

717+
SILOpts.EnablePackMetadataStackPromotion = EnablePackMetadataStackPromotion;
718+
711719
if (OptModeFlag == OptimizationMode::NotSet) {
712720
if (OptimizationGroup == OptGroup::Diagnostics)
713721
SILOpts.OptMode = OptimizationMode::NoOptimization;

0 commit comments

Comments
 (0)