blob: 2084cbae77346d6a4ac570a83b4e753deef2bcde [file] [edit]
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
include "llvm/Option/LibraryOptions.td"
def CodeGenOptions : OptionsStruct;
// CodeGenPrepare.cpp
defm : BoolField<"bbsections-guided-section-prefix", "true",
"Use the basic-block-sections profile to determine the text section prefix for hot functions. "
"Functions with basic-block-sections profile will be placed in `.text.hot` regardless of their FDO profile info. "
"Other functions won't be impacted, i.e., their prefixes will be decided by FDO/sampleFDO profiles">;
defm : BoolField<"cgp-addr-sink-combine-base-gv", "true",
"Allow combining of BaseGV field in Address sinking">;
defm : BoolField<"cgp-addr-sink-combine-base-offs", "true",
"Allow combining of BaseOffs field in Address sinking">;
defm : BoolField<"cgp-addr-sink-combine-base-reg", "true",
"Allow combining of BaseReg field in Address sinking">;
defm : BoolField<"cgp-addr-sink-combine-scaled-reg", "true",
"Allow combining of ScaledReg field in Address sinking">;
defm : BoolField<"cgp-addr-sink-new-phis", "false",
"Allow creation of Phis in Address sinking">;
defm : BoolField<"cgp-addr-sink-new-select", "true",
"Allow creation of selects in Address sinking">;
defm : OptionalBoolField<"cgp-addr-sink-using-gep",
"Address sinking in CGP using GEPs">;
defm : BoolField<"cgp-andcmp-sinking", "true",
"Enable sinking and/cmp into branches">;
defm : BoolField<"cgp-branch-opts", "true",
"Enable branch optimizations in CodeGenPrepare">;
defm : BoolField<"cgp-complex-addr-modes", "true",
"Enable combining addressing modes with different parts in optimizeMemoryInst">;
defm : BoolField<"cgp-delete-phis", "true",
"Enable elimination of dead PHI nodes">;
defm : BoolField<"cgp-ext-ld-promotion", "true",
"Enable ext(promotable(ld)) -> promoted(ext(ld)) optimization in CodeGenPrepare">;
defm : BoolField<"cgp-force-split-store", "false",
"Force store splitting no matter what the target query says">;
defm : ValueField<"cgp-freq-ratio-to-skip-merge", "uint64_t", "2",
"Skip merging empty blocks if (frequency of empty block) / (frequency of destination block) is greater than this ratio">;
defm : BoolField<"cgp-gc-opts", "true",
"Enable GC optimizations in CodeGenPrepare">;
defm : ValueField<"cgp-huge-func", "unsigned", "10000",
"Least BB number of huge function">;
defm : BoolField<"cgp-icmp-eq2icmp-st", "false",
"Enable ICMP_EQ to ICMP_S(L|G)T conversion">;
defm : ValueField<"cgp-max-address-users-to-scan", "unsigned", "100",
"Max number of address users to look at">;
defm : BoolField<"cgp-optimize-phi-types", "true",
"Enable converting phi types in CodeGenPrepare">;
defm : BoolField<"cgp-preheader-prot", "true",
"Protect loop preheaders from removal">;
defm : BoolField<"cgp-select2branch", "true",
"Enable select to branch conversion">;
defm : BoolField<"cgp-split-large-offset-gep", "true",
"Enable splitting large offset of GEP">;
defm : BoolField<"cgp-store-extract", "true",
"Enable store(extract) optimizations in CodeGenPrepare">;
defm : BoolField<"cgp-stress-ext-ld-promotion", "false",
"Stress test ext(promotable(ld)) -> promoted(ext(ld)) optimization in CodeGenPrepare">;
defm : BoolField<"cgp-stress-store-extract", "false",
"Stress test store(extract) optimizations in CodeGenPrepare">;
defm : BoolField<"cgp-type-promotion-merge", "true",
"Enable merging of redundant sexts when one is dominating the other">;
defm : BoolField<"cgp-verify-bfi-updates", "false",
"Enable BFI update verification for CodeGenPrepare">;
defm : BoolField<"profile-guided-section-prefix", "true",
"Use profile info to add section prefix for hot/cold functions">;
defm : BoolField<"profile-unknown-in-special-section", "false",
"In profiling mode like sampleFDO, if a function doesn't have profile, we cannot tell the function is cold for sure because it may be a function newly added without ever being sampled. "
"With the flag enabled, compiler can put such profile unknown functions into a special section, so runtime system can choose to handle it in a different way than .text section, to save RAM for example">;
// TargetPassConfig.cpp
defm : BoolField<"basic-block-section-match-infer", "false",
"Enable matching and inference when generating basic block sections">;
defm : BoolField<"codegen-pipeline-trigger-crash", "false",
"Trigger crash in codegen pipeline">;
defm : OptionalBoolField<"debugify-and-strip-all-safe",
"Debugify MIR before and Strip debug after each pass except those known to be unsafe when debug info is present">;
defm : OptionalBoolField<"debugify-check-and-strip-all-safe",
"Debugify MIR before, by checking and stripping the debug info after, each pass except those known to be unsafe when debug info is present">;
defm : BoolField<"disable-atexit-based-global-dtor-lowering", "false",
"For MachO, disable atexit()-based global destructor lowering">;
defm : BoolField<"disable-block-placement", "false",
"Disable probability-driven block placement">;
defm : BoolField<"disable-branch-fold", "false",
"Disable branch folding">;
// Disable the pass to fix unwind information. Whether the pass is included in
// the pipeline is controlled via the target options, this option serves as
// manual override.
defm : BoolField<"disable-cfi-fixup", "false",
"Disable the CFI fixup pass">;
defm : BoolField<"disable-cgp", "false",
"Disable Codegen Prepare">;
defm : BoolField<"disable-constant-hoisting", "false",
"Disable ConstantHoisting">;
defm : BoolField<"disable-copyprop", "false",
"Disable Copy Propagation pass">;
defm : BoolField<"disable-early-ifcvt", "false",
"Disable Early If-conversion">;
defm : BoolField<"disable-early-taildup", "false",
"Disable pre-register allocation tail duplication">;
defm : BoolField<"disable-expand-reductions", "false",
"Disable the expand reduction intrinsics pass from running">;
// Disable MIRProfileLoader before BlockPlacement. This is for debugging and
// tuning purposes.
defm : BoolField<"disable-layout-fsprofile-loader", "false",
"Disable MIRProfileLoader before BlockPlacement">;
defm : BoolField<"disable-lsr", "false",
"Disable Loop Strength Reduction Pass">;
defm : BoolField<"disable-machine-cse", "false",
"Disable Machine Common Subexpression Elimination">;
defm : BoolField<"disable-machine-dce", "false",
"Disable Machine Dead Code Elimination">;
defm : BoolField<"disable-machine-licm", "false",
"Disable Machine LICM">;
defm : BoolField<"disable-machine-sink", "false",
"Disable Machine Sinking">;
defm : BoolField<"disable-partial-libcall-inlining", "false",
"Disable Partial Libcall Inlining">;
defm : BoolField<"disable-post-ra", "false",
"Disable Post Regalloc Scheduler">;
defm : BoolField<"disable-postra-machine-licm", "false",
"Disable Machine LICM">;
defm : BoolField<"disable-postra-machine-sink", "false",
"Disable PostRA Machine Sinking">;
// Disable MIRProfileLoader before RegAlloc. This is for debugging and tuning
// purpose.
defm : BoolField<"disable-ra-fsprofile-loader", "false",
"Disable MIRProfileLoader before RegAlloc">;
defm : BoolField<"disable-replace-with-vec-lib", "false",
"Disable replace with vector math call pass">;
defm : BoolField<"disable-select-optimize", "true",
"Disable the select-optimization pass from running">;
defm : BoolField<"disable-ssc", "false",
"Disable Stack Slot Coloring">;
defm : BoolField<"disable-tail-duplicate", "false",
"Disable tail duplication">;
defm : BoolField<"enable-block-placement-stats", "false",
"Collect probability-driven block placement stats">;
defm : BoolField<"enable-gc-empty-basic-blocks", "false",
"Enable garbage-collecting empty basic blocks">;
defm : BoolField<"enable-global-merge-func", "false",
"Enable global merge functions that are based on hash function">;
defm : BoolField<"enable-implicit-null-checks", "false",
"Fold null checks into faulting memory operations">;
defm : OptionalBoolField<"enable-ipra",
"Enable interprocedural register allocation to reduce load/store at procedure calls">;
defm : EnumField<"function-splitting", "std::optional<FunctionSplittingMode>", "std::nullopt",
"none,bbsections,all",
["FunctionSplittingMode::None", "FunctionSplittingMode::BBSectionsOnly",
"FunctionSplittingMode::All"],
"Which functions are eligible for late function splitting">;
// -fast-isel selects FastISel at any optimization level, and -fast-isel=0
// disables it at -O0, where it is used unless GlobalISel is enabled.
defm : OptionalBoolField<"fast-isel",
"Enable the \"fast\" instruction selector">;
let MetaVarName = "<filename>" in
defm : ValueField<"fs-profile-file", "StringRef", "",
"Flow Sensitive profile file name">;
let MetaVarName = "<filename>" in
defm : ValueField<"fs-remapping-file", "StringRef", "",
"Flow Sensitive profile remapping file name">;
defm : OptionalBoolField<"global-isel",
"Enable the \"global\" instruction selector">;
defm : EnumField<"global-isel-abort", "std::optional<GlobalISelAbortMode>", "std::nullopt",
"0,1,2", ["GlobalISelAbortMode::Disable", "GlobalISelAbortMode::Enable",
"GlobalISelAbortMode::DisableWithDiag"],
"Enable abort calls when \"global\" instruction selection fails to lower/select an instruction">;
// Temporary option to allow experimenting with MachineScheduler as a post-RA
// scheduler. Targets can "properly" enable this with
// substitutePass(&PostRASchedulerID, &PostMachineSchedulerID).
// Targets can return true in targetSchedulesPostRAScheduling() and
// insert a PostRA scheduling pass wherever it wants.
defm : BoolField<"misched-postra", "false",
"Run MachineScheduler post regalloc (independent of preRA sched)">;
// FIXME: remove this after switching to NPM or GlobalISel, whichever gets there
// first...
defm : BoolField<"print-after-isel", "false",
"Print machine instrs after ISel">;
defm : BoolField<"print-isel-input", "false",
"Print LLVM IR input to isel pass">;
defm : BoolField<"print-regusage", "false",
"Print register usage details collected for IPRA">;
defm : OptionalBoolField<"regalloc-fast-tied",
"Have the fast register allocator lower tied operands itself instead of running TwoAddressInstructionPass (overrides the target's default)">;
defm : BoolField<"split-static-data", "false",
"Split static data sections into hot and cold sections using profile information">;
let MetaVarName = "<pass-name>" in
defm : ValueField<"start-after", "StringRef", "",
"Resume compilation after a specific pass">;
let MetaVarName = "<pass-name>" in
defm : ValueField<"start-before", "StringRef", "",
"Resume compilation before a specific pass">;
let MetaVarName = "<pass-name>" in
defm : ValueField<"stop-after", "StringRef", "",
"Stop compilation after a specific pass">;
let MetaVarName = "<pass-name>" in
defm : ValueField<"stop-before", "StringRef", "",
"Stop compilation before a specific pass">;
defm : OptionalBoolField<"verify-machineinstrs",
"Verify generated machine code">;