| //===--- 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, Tag, Description) |
| /// Id is a pass "identifier", used for its enum case, PassKind::Id, |
| /// and type name, as returned by the global function swift::create##Id(). |
| /// |
| /// Tag identifies the pass as a command-line compatible option string. |
| /// |
| /// Description is a short description of the pass. |
| /// |
| /// Id and Tag are unique identifiers which may be used in test |
| /// cases and tools to specify a pass by string. Different tools simply prefer |
| /// different identifier formats. Changing any of one these strings may change |
| /// the functionality of some tests. |
| /// |
| /// This macro must be defined by the includer. |
| #ifndef PASS |
| #error "Macro must be defined by includer" |
| #endif |
| |
| /// IRGEN_PASS(Id, Tag, Description) |
| /// This macro follows the same conventions as PASS(Id, Tag, Description), |
| /// but is used for IRGen passes which are built outside of the |
| /// SILOptimizer library. |
| /// |
| /// An IRGen pass is created by IRGen and needs to be registered with the pass |
| /// manager dynamically. |
| #ifndef IRGEN_PASS |
| #define IRGEN_PASS(Id, Tag, Description) PASS(Id, Tag, 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 Alias Analysis over all Pairs") |
| PASS(ABCOpt, "abcopts", |
| "Array Bounds Check Optimization") |
| PASS(AccessEnforcementSelection, "access-enforcement-selection", |
| "Access Enforcement Selection") |
| PASS(AccessSummaryDumper, "access-summary-dump", |
| "Dump Address Parameter Access Summary") |
| PASS(AccessMarkerElimination, "access-marker-elim", |
| "Access Marker Elimination.") |
| PASS(AddressLowering, "address-lowering", |
| "SIL Address Lowering") |
| PASS(AllocBoxToStack, "allocbox-to-stack", |
| "Stack Promotion of Box Objects") |
| IRGEN_PASS(AllocStackHoisting, "alloc-stack-hoisting", |
| "SIL alloc_stack Hoisting") |
| PASS(ArrayCountPropagation, "array-count-propagation", |
| "Array Count Propagation") |
| PASS(ArrayElementPropagation, "array-element-propagation", |
| "Array Element Propagation") |
| PASS(AssumeSingleThreaded, "sil-assume-single-threaded", |
| "Assume Single-Threaded Environment") |
| PASS(BasicInstructionPropertyDumper, "basic-instruction-property-dump", |
| "Print SIL Instruction MemBehavior and ReleaseBehavior Information") |
| PASS(BasicCalleePrinter, "basic-callee-printer", |
| "Print Basic Callee Analysis for Testing") |
| PASS(CFGPrinter, "view-cfg", |
| "View Function CFGs") |
| PASS(COWArrayOpts, "cowarray-opt", |
| "COW Array Optimization") |
| PASS(CSE, "cse", |
| "Common Subexpression Elimination") |
| PASS(CallerAnalysisPrinter, "caller-analysis-printer", |
| "Print Caller Analysis for Testing") |
| PASS(CapturePromotion, "capture-promotion", |
| "Capture Promotion to Eliminate Escaping Boxes") |
| PASS(CapturePropagation, "capture-prop", |
| "Captured Constant Propagation") |
| PASS(ClosureSpecializer, "closure-specialize", |
| "Closure Specialization on Constant Function Arguments") |
| PASS(CodeSinking, "code-sinking", |
| "Code Sinking") |
| PASS(ComputeDominanceInfo, "compute-dominance-info", |
| "Compute Dominance Information for Testing") |
| PASS(ComputeLoopInfo, "compute-loop-info", |
| "Compute Loop Information for Testing") |
| PASS(ConditionForwarding, "condition-forwarding", |
| "Conditional Branch Forwarding to Fold SIL switch_enum") |
| PASS(CopyForwarding, "copy-forwarding", |
| "Copy Forwarding to Remove Redundant Copies") |
| PASS(EpilogueARCMatcherDumper, "sil-epilogue-arc-dumper", |
| "Print Epilogue retains of Returned Values and Argument releases") |
| PASS(EpilogueRetainReleaseMatcherDumper, "sil-epilogue-retain-release-dumper", |
| "Print Epilogue retains of Returned Values and Argument releases") |
| PASS(RedundantOverflowCheckRemoval, "remove-redundant-overflow-checks", |
| "Redundant Overflow Check Removal") |
| PASS(DCE, "dce", |
| "Dead Code Elimination") |
| PASS(DeadArgSignatureOpt, "dead-arg-signature-opt", |
| "Dead Argument Elimination via Function Specialization") |
| PASS(DeadFunctionElimination, "sil-deadfuncelim", |
| "Dead Function Elimination") |
| PASS(DeadObjectElimination, "deadobject-elim", |
| "Dead Object Elimination for Classes with Trivial Destruction") |
| PASS(DefiniteInitialization, "definite-init", |
| "Definite Initialization for Diagnostics") |
| PASS(Devirtualizer, "devirtualizer", |
| "Indirect Call Devirtualization") |
| PASS(DiagnoseInfiniteRecursion, "diagnose-infinite-recursion", |
| "Diagnose Infinitely-Recursive Code") |
| PASS(DiagnoseStaticExclusivity, "diagnose-static-exclusivity", |
| "Static Enforcement of Law of Exclusivity") |
| PASS(DiagnoseUnreachable, "diagnose-unreachable", |
| "Diagnose Unreachable Code") |
| PASS(DiagnosticConstantPropagation, "diagnostic-constant-propagation", |
| "Constants Propagation for Diagnostics") |
| PASS(EagerSpecializer, "eager-specializer", |
| "Eager Specialization via @_specialize") |
| PASS(EarlyCodeMotion, "early-codemotion", |
| "Early Code Motion without Release Hoisting") |
| PASS(EarlyInliner, "early-inline", |
| "Early Inlining Preserving Semantic Functions") |
| PASS(EmitDFDiagnostics, "dataflow-diagnostics", |
| "Emit SIL Diagnostics") |
| PASS(EscapeAnalysisDumper, "escapes-dump", |
| "Dump Escape Analysis Results") |
| PASS(FunctionOrderPrinter, "function-order-printer", |
| "Print Function Order for Testing") |
| PASS(FunctionSignatureOpts, "function-signature-opts", |
| "Function Signature Optimization") |
| PASS(ARCSequenceOpts, "arc-sequence-opts", |
| "ARC Sequence Optimization") |
| PASS(ARCLoopOpts, "arc-loop-opts", |
| "ARC Loop Optimization") |
| PASS(RedundantLoadElimination, "redundant-load-elim", |
| "Redundant Load Elimination") |
| PASS(DeadStoreElimination, "dead-store-elim", |
| "Dead Store Elimination") |
| PASS(GenericSpecializer, "generic-specializer", |
| "Generic Function Specialization on Static Types") |
| PASS(GlobalOpt, "global-opt", |
| "SIL Global Optimization") |
| PASS(GlobalPropertyOpt, "global-property-opt", |
| "Global Property Optimization") |
| PASS(GuaranteedARCOpts, "guaranteed-arc-opts", |
| "Guaranteed ARC Optimization") |
| PASS(HighLevelCSE, "high-level-cse", |
| "Common Subexpression Elimination on High-Level SIL") |
| PASS(HighLevelLICM, "high-level-licm", |
| "Loop Invariant Code Motion in High-Level SIL") |
| PASS(IVInfoPrinter, "iv-info-printer", |
| "Print Induction Variable Information for Testing") |
| PASS(InstCount, "inst-count", |
| "Record SIL Instruction, Block, and Function Counts as LLVM Statistics") |
| PASS(JumpThreadSimplifyCFG, "jumpthread-simplify-cfg", |
| "Simplify CFG via Jump Threading") |
| PASS(LetPropertiesOpt, "let-properties-opt", |
| "Let Property Optimization") |
| PASS(LICM, "licm", |
| "Loop Invariant Code Motion") |
| PASS(LateCodeMotion, "late-codemotion", |
| "Late Code Motion with Release Hoisting") |
| PASS(LateInliner, "late-inline", |
| "Late Function Inlining") |
| PASS(LoopCanonicalizer, "loop-canonicalizer", |
| "Loop Canonicalization") |
| PASS(LoopInfoPrinter, "loop-info-printer", |
| "Print Loop Information for Testing") |
| PASS(LoopRegionViewText, "loop-region-view-text", |
| "Print Loop Region Information for Testing") |
| PASS(LoopRegionViewCFG, "loop-region-view-cfg", |
| "View Loop Region CFG") |
| PASS(LoopRotate, "loop-rotate", |
| "Loop Rotation") |
| PASS(LoopUnroll, "loop-unroll", |
| "Loop Unrolling") |
| PASS(LowerAggregateInstrs, "lower-aggregate-instrs", |
| "Lower Aggregate SIL Instructions to Multiple Scalar Operations") |
| PASS(MandatoryInlining, "mandatory-inlining", |
| "Mandatory Inlining of Transparent Functions") |
| PASS(Mem2Reg, "mem2reg", |
| "Memory to SSA Value Conversion to Remove Stack Allocation") |
| PASS(MemBehaviorDumper, "mem-behavior-dump", |
| "Print SIL Instruction MemBehavior from Alias Analysis over all Pairs") |
| PASS(LSLocationPrinter, "lslocation-dump", |
| "Print Load-Store Location Results Covering all Accesses") |
| PASS(MergeCondFails, "merge-cond_fails", |
| "Merge SIL cond_fail to Eliminate Redundant Overflow Checks") |
| PASS(MoveCondFailToPreds, "move-cond-fail-to-preds", |
| "Move SIL cond_fail by Hoisting Checks") |
| PASS(NoReturnFolding, "noreturn-folding", |
| "Prune Control Flow at No-Return Calls Using SIL unreachable") |
| PASS(ObjectOutliner, "object-outliner", |
| "Outlining of Global Objects") |
| PASS(Outliner, "outliner", |
| "Function Outlining Optimization") |
| PASS(OwnershipModelEliminator, "ownership-model-eliminator", |
| "Eliminate Ownership Annotation of SIL") |
| PASS(RCIdentityDumper, "rc-id-dumper", |
| "Print Reference Count Identities") |
| PASS(PerfInliner, "inline", |
| "Performance Function Inlining") |
| PASS(PerformanceConstantPropagation, "performance-constant-propagation", |
| "Constant Propagation for Performance without Diagnostics") |
| PASS(PredictableMemoryOptimizations, "predictable-memopt", |
| "Predictable Memory Optimization for Diagnostics") |
| PASS(ReleaseDevirtualizer, "release-devirtualizer", |
| "SIL release Devirtualization") |
| PASS(RetainSinking, "retain-sinking", |
| "SIL retain Sinking") |
| PASS(ReleaseHoisting, "release-hoisting", |
| "SIL release Hoisting") |
| PASS(LateReleaseHoisting, "late-release-hoisting", |
| "Late SIL release Hoisting Preserving Epilogues") |
| IRGEN_PASS(LoadableByAddress, "loadable-address", |
| "SIL Large Loadable type by-address lowering.") |
| PASS(RemovePins, "remove-pins", |
| "Remove SIL pin/unpin pairs") |
| PASS(TempRValueOpt, "temp-rvalue-opt", |
| "Remove short-lived immutable temporary copies") |
| PASS(SideEffectsDumper, "side-effects-dump", |
| "Print Side-Effect Information for all Functions") |
| PASS(SILCleanup, "cleanup", |
| "SIL Cleanup Preparation for IRGen") |
| PASS(SILCombine, "sil-combine", |
| "Combine SIL Instructions via Peephole Optimization") |
| PASS(SILDebugInfoGenerator, "sil-debuginfo-gen", |
| "Generate Debug Information with Source Locations into Textual SIL") |
| PASS(SILLinker, "linker", |
| "Link all SIL Referenced within the Module via Deserialization") |
| PASS(SROA, "sroa", |
| "Scalar Replacement of Aggregate Stack Objects") |
| PASS(SROABBArgs, "sroa-bb-args", |
| "Scalar Replacement of Aggregate SIL Block Arguments") |
| PASS(SimplifyBBArgs, "simplify-bb-args", |
| "SIL Block Argument Simplification") |
| PASS(SimplifyCFG, "-simplify-cfg", |
| "SIL CFG Simplification") |
| PASS(SpeculativeDevirtualization, "specdevirt", |
| "Speculative Devirtualization via Guarded Calls") |
| PASS(SplitAllCriticalEdges, "split-critical-edges", |
| "Split all Critical Edges in the SIL CFG") |
| PASS(SplitNonCondBrCriticalEdges, "split-non-cond_br-critical-edges", |
| "Split all Critical Edges not from SIL cond_br") |
| PASS(StackPromotion, "stack-promotion", |
| "Stack Promotion of Class Objects") |
| PASS(StripDebugInfo, "strip-debug-info", |
| "Strip Debug Information") |
| PASS(SwiftArrayOpts, "array-specialize", |
| "Loop Specialization for Array Properties") |
| PASS(UnsafeGuaranteedPeephole, "unsafe-guaranteed-peephole", |
| "SIL retain/release Peephole Removal for Builtin.unsafeGuaranteed") |
| PASS(UsePrespecialized, "use-prespecialized", |
| "Use Pre-Specialized Functions") |
| PASS(ValueOwnershipKindDumper, "value-ownership-kind-dumper", |
| "Print Value Ownership Kind for Testing") |
| PASS(SemanticARCOpts, "semantic-arc-opts", |
| "Semantic ARC Optimization") |
| PASS(MarkUninitializedFixup, "mark-uninitialized-fixup", |
| "Temporary pass for staging in mark_uninitialized changes.") |
| PASS(SimplifyUnreachableContainingBlocks, "simplify-unreachable-containing-blocks", |
| "Utility pass. Removes all non-term insts from blocks with unreachable terms") |
| PASS(SerializeSILPass, "serialize-sil", |
| "Utility pass. Serializes the current SILModule") |
| PASS(BugReducerTester, "bug-reducer-tester", |
| "sil-bug-reducer Tool Testing by Asserting on a Sentinel Function") |
| PASS_RANGE(AllPasses, AADumper, BugReducerTester) |
| |
| #undef IRGEN_PASS |
| #undef PASS |
| #undef PASS_RANGE |