blob: 8e66137b729fe1625243d4f2e1f214da8b214e17 [file] [log] [blame]
//===--- Passes.def - Swift SILPass Metaprogramming -------------*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
//
// This file defines macros used for macro-metaprogramming with SILPasses.
//
//===----------------------------------------------------------------------===//
/// PASS(Id, Name, Description)
/// The pass is identified by PassKind::Id, and there exists a
/// global function swift::create##Id().
///
/// This macro must be defined by the includer.
#ifndef PASS
#error "Macro must be defined by includer"
#endif
/// IRGEN_PASS(Id, Name, Description)
/// The pass is identified by PassKind::Id.
/// An IRGen pass is created by IRGen and needs to be register with the pass
/// manager dynamically.
#ifndef IRGEN_PASS
#define IRGEN_PASS(Id, Name, Description) PASS(Id, Name, Description)
#endif
/// PASS_RANGE(RANGE_ID, START, END)
/// Pass IDs between PassKind::START and PassKind::END, inclusive,
/// fall within the set known as
#ifndef PASS_RANGE
#define PASS_RANGE(Id, First, Last)
#endif
PASS(AADumper, "aa-dump",
"Dump AA result for all pairs of ValueKinds in all functions")
PASS(ABCOpt, "abcopts",
"Optimization of array bounds checks")
PASS(AddressLowering, "address-lowering",
"SIL AddressOnly lowering.")
PASS(AllocBoxToStack, "allocbox-to-stack",
"Promote heap allocations to stack allocations")
IRGEN_PASS(AllocStackHoisting, "alloc-stack-hoisting",
"Hoist generic alloc_stack instructions to the entry block")
PASS(ArrayCountPropagation, "array-count-propagation",
"Propagate the count of arrays")
PASS(ArrayElementPropagation, "array-element-propagation",
"Propagate the value of array elements")
PASS(AssumeSingleThreaded, "sil-assume-single-threaded",
"Assume that code will be executed in a single-threaded environment")
PASS(BasicInstructionPropertyDumper, "basic-instruction-property-dump",
"Dump MemBehavior and ReleaseBehavior results from calling "
"SILInstruction::{getMemoryBehavior,getReleasingBehavior}()"
" on all instructions")
PASS(BasicCalleePrinter, "basic-callee-printer",
"Construct basic callee analysis and use it to print callees "
"for testing purposes")
PASS(CFGPrinter, "view-cfg",
"View the CFG of all passed in functions")
PASS(COWArrayOpts, "cowarray-opt",
"COW Array optimizations")
PASS(CSE, "cse",
"Common subexpression elimination")
PASS(CallerAnalysisPrinter, "caller-analysis-printer",
"Print callsites of every function in the module")
PASS(CapturePromotion, "capture-promotion",
"Promote captures from by-reference to by-value")
PASS(CapturePropagation, "capture-prop",
"Captured Constant Propagation")
PASS(ClosureSpecializer, "closure-specialize",
"Specialize functions passed a closure to call the closure directly")
PASS(CodeSinking, "code-sinking",
"Sinks code closer to users")
PASS(ComputeDominanceInfo, "compute-dominance-info",
"Utility pass that computes (post-)dominance info for all functions in "
"order to help test dominanceinfo updating")
PASS(ComputeLoopInfo, "compute-loop-info",
"Utility pass that computes loop info for all functions in order to help "
"test loop info updating")
PASS(ConditionForwarding, "condition-forwarding",
"Forward conditional branch instructions")
PASS(CopyForwarding, "copy-forwarding",
"Eliminate redundant copies")
PASS(EpilogueARCMatcherDumper, "sil-epilogue-arc-dumper",
"Dump epilogue retains for return value and releases for arguments")
PASS(EpilogueRetainReleaseMatcherDumper, "sil-epilogue-retain-release-dumper",
"Dump epilogue retains for return value and releases for arguments")
PASS(RedundantOverflowCheckRemoval, "remove-redundant-overflow-checks",
"Removes redundant overflow checks")
PASS(DCE, "dce",
"Eliminate dead code")
PASS(DeadArgSignatureOpt, "dead-arg-signature-opt",
"Create function with removed dead arguments")
PASS(DeadFunctionElimination, "sil-deadfuncelim",
"Remove unused functions")
PASS(DeadObjectElimination, "deadobject-elim",
"Eliminate unused objects that do not have destructors with side effects")
PASS(DefiniteInitialization, "definite-init",
"Definite Initialization")
PASS(Devirtualizer, "devirtualizer", "Devirtualize indirect calls")
PASS(DiagnoseUnreachable, "diagnose-unreachable",
"Diagnose Unreachable Code")
PASS(DiagnosticConstantPropagation, "diagnostic-constant-propagation",
"Propagate constants and emit diagnostics")
PASS(EagerSpecializer, "eager-specializer",
"Specialize speculatively and insert dispatch guarded by type checks")
PASS(EarlyCodeMotion, "early-codemotion",
"Code motion without release hoisting")
PASS(EarlyInliner, "early-inline",
"Inline functions that are not marked as having special semantics")
PASS(EmitDFDiagnostics, "dataflow-diagnostics",
"Emit SIL Diagnostics")
PASS(EscapeAnalysisDumper, "escapes-dump",
"Dumps the results of escape analysis for all functions")
PASS(ExternalDefsToDecls, "external-defs-to-decls",
"Convert external definitions to decls")
PASS(ExternalFunctionDefinitionsElimination, "external-func-definition-elim",
"Eliminate external function definitions")
PASS(FunctionOrderPrinter, "function-order-printer",
"Print function orderings for test purposes")
PASS(FunctionSignatureOpts, "function-signature-opts",
"Create function with optimized signatures")
PASS(ARCSequenceOpts, "arc-sequence-opts",
"Optimize sequences of retain/release opts by removing redundant inner "
"retain/release sequences")
PASS(ARCLoopOpts, "arc-loop-opts",
"Run all arc loop passes")
PASS(RedundantLoadElimination, "redundant-load-elim",
"Multiple basic block redundant load elimination")
PASS(DeadStoreElimination, "dead-store-elim",
"Multiple basic block dead store elimination")
PASS(GenericSpecializer, "generic-specializer",
"Specialization of generic functions by static types")
PASS(GlobalOpt, "global-opt",
"Global variable optimizations")
PASS(GlobalPropertyOpt, "global-property-opt",
"Optimize properties")
PASS(GuaranteedARCOpts, "guaranteed-arc-opts",
"Guaranteed ARC optimizations")
PASS(HighLevelCSE, "high-level-cse",
"Common subexpression elimination on High-level SIL")
PASS(HighLevelLICM, "high-level-licm",
"High Level Loop invariant code motion")
PASS(IVInfoPrinter, "iv-info-printer",
"Display induction variable information")
PASS(InstCount, "inst-count",
"Count all instructions in the module using llvm Statistics")
PASS(JumpThreadSimplifyCFG, "simplify-cfg",
"Clean up the CFG of SIL functions")
PASS(LetPropertiesOpt, "let-properties-opt",
"SIL let properties optimization")
PASS(LICM, "licm",
"Loop invariant code motion")
PASS(LateCodeMotion, "late-codemotion",
"Code motion with release hoisting")
PASS(LateInliner, "late-inline",
"Run the late inliner")
PASS(LoopCanonicalizer, "loop-canonicalizer",
"Canonicalize loops")
PASS(LoopInfoPrinter, "loop-info-printer",
"Display loop information")
PASS(LoopRegionViewText, "loop-region-view-text",
"Construct the loop region data structure and dump its contents as text")
PASS(LoopRegionViewCFG, "loop-region-view-cfg",
"Construct the loop region data structure and dump its contents as a pdf cfg")
PASS(LoopRotate, "loop-rotate",
"Rotate loops")
PASS(LoopUnroll, "loop-unroll",
"Unroll loops")
PASS(LowerAggregateInstrs, "lower-aggregate-instrs",
"Lower aggregate instructions to scalar instructions")
PASS(MandatoryInlining, "mandatory-inlining",
"Inline transparent functions")
PASS(Mem2Reg, "mem2reg",
"Promote stack allocations to SSA values")
PASS(MemBehaviorDumper, "mem-behavior-dump",
"Dump MemBehavior results from alias analysis for all instruction pairs")
PASS(LSLocationPrinter, "lslocation-dump",
"Dump LSLocation results from analyzing all accessed locations")
PASS(MergeCondFails, "merge-cond_fails",
"Remove redundant overflow checks")
PASS(MoveCondFailToPreds, "move-cond-fail-to-preds",
"Test pass that hoists conditional fails to predecessors blocks when "
"profitable")
PASS(NoReturnFolding, "noreturn-folding",
"Add 'unreachable' after noreturn calls")
PASS(OwnershipModelEliminator, "ownership-model-eliminator",
"Eliminate SIL ownership constructs that are not supported by the whole"
" compiler from the IR")
PASS(RCIdentityDumper, "rc-id-dumper",
"Dump the RCIdentity of all values in a function")
// TODO: It makes no sense to have early inliner, late inliner, and
// perf inliner in terms of names.
PASS(PerfInliner, "inline",
"Inline functions which are determined to be less than a pre-set cost")
PASS(PerformanceConstantPropagation, "performance-constant-propagation",
"Propagate constants and do not emit diagnostics")
PASS(PredictableMemoryOptimizations, "predictable-memopt",
"Predictable early memory optimizations")
PASS(ReleaseDevirtualizer, "release-devirtualizer",
"Devirtualize release-instructions")
PASS(RetainSinking, "retain-sinking",
"Sink retains")
PASS(ReleaseHoisting, "release-hoisting",
"Hoist releases")
PASS(LateReleaseHoisting, "late-release-hoisting",
"Hoist releases")
PASS(RemovePins, "remove-pins",
"Remove pin/unpin pairs")
PASS(SideEffectsDumper, "side-effects-dump",
"Dumps the results of side-effect analysis for all functions")
PASS(SILCleanup, "cleanup",
"Cleanup SIL in preparation for IRGen")
PASS(SILCombine, "sil-combine",
"Perform small peepholes and combine operations")
PASS(SILDebugInfoGenerator, "sil-debuginfo-gen",
"Write a SIL file for debugging")
PASS(SILLinker, "linker",
"Link in all of the serialized SIL referenced in the module")
PASS(SROA, "sroa",
"SIL scalar replacement of aggregates")
PASS(SROABBArgs, "sroa-bb-args",
"SIL scalar replacement of aggregates of bb arguments")
PASS(SimplifyBBArgs, "simplify-bb-args",
"Simplify basic block arguments")
// TODO: What should this be called. We are just following what was previously in SILOpt.
PASS(SimplifyCFG, "normal-simplify-cfg",
"Clean up the CFG of SIL functions")
PASS(SpeculativeDevirtualization, "specdevirt",
"Speculate targets of virtual calls")
PASS(SplitAllCriticalEdges, "split-critical-edges",
"Split all critical edges")
PASS(SplitNonCondBrCriticalEdges, "split-non-cond_br-critical-edges",
"Split all critical edges that do not involve cond_br")
PASS(StackPromotion, "stack-promotion",
"Promote allocated objects on the stack")
PASS(StripDebugInfo, "strip-debug-info",
"Strip debug info")
PASS(SwiftArrayOpts, "array-specialize",
"Specialize arrays")
PASS(UnsafeGuaranteedPeephole, "unsafe-guaranteed-peephole",
"Peephole retain/release removal for regions denoted by "
"Builtin.unsafeGuaranteed")
PASS(UsePrespecialized, "use-prespecialized",
"Use pre-specialized functions")
PASS(ValueOwnershipKindDumper, "value-ownership-kind-dumper",
"Print the value ownership kind of all ValueBase in a SILModule")
PASS(BugReducerTester, "bug-reducer-tester",
"Utility pass for testing sil-bug-reducer. Asserts when visits an apply that calls a specific function")
PASS_RANGE(AllPasses, AADumper, BugReducerTester)
#undef IRGEN_PASS
#undef PASS
#undef PASS_RANGE