- //===-- Scalar.h - Scalar Transformations -----------------------*- C++ -*-===// 
- // 
- // 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 
- // 
- //===----------------------------------------------------------------------===// 
- // 
- // This header file defines prototypes for accessor functions that expose passes 
- // in the Scalar transformations library. 
- // 
- //===----------------------------------------------------------------------===// 
-   
- #ifndef LLVM_TRANSFORMS_SCALAR_H 
- #define LLVM_TRANSFORMS_SCALAR_H 
-   
- #include "llvm/Transforms/Utils/SimplifyCFGOptions.h" 
- #include <functional> 
-   
- namespace llvm { 
-   
- class Function; 
- class FunctionPass; 
- class ModulePass; 
- class Pass; 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // AlignmentFromAssumptions - Use assume intrinsics to set load/store 
- // alignments. 
- // 
- FunctionPass *createAlignmentFromAssumptionsPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // SCCP - Sparse conditional constant propagation. 
- // 
- FunctionPass *createSCCPPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // RedundantDbgInstElimination - This pass removes redundant dbg intrinsics 
- // without modifying the CFG of the function.  It is a FunctionPass. 
- // 
- Pass *createRedundantDbgInstEliminationPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // DeadCodeElimination - This pass is more powerful than DeadInstElimination, 
- // because it is worklist driven that can potentially revisit instructions when 
- // their other instructions become dead, to eliminate chains of dead 
- // computations. 
- // 
- FunctionPass *createDeadCodeEliminationPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // DeadStoreElimination - This pass deletes stores that are post-dominated by 
- // must-aliased stores and are not loaded used between the stores. 
- // 
- FunctionPass *createDeadStoreEliminationPass(); 
-   
-   
- //===----------------------------------------------------------------------===// 
- // 
- // CallSiteSplitting - This pass split call-site based on its known argument 
- // values. 
- FunctionPass *createCallSiteSplittingPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // AggressiveDCE - This pass uses the SSA based Aggressive DCE algorithm.  This 
- // algorithm assumes instructions are dead until proven otherwise, which makes 
- // it more successful are removing non-obviously dead instructions. 
- // 
- FunctionPass *createAggressiveDCEPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // GuardWidening - An optimization over the @llvm.experimental.guard intrinsic 
- // that (optimistically) combines multiple guards into one to have fewer checks 
- // at runtime. 
- // 
- FunctionPass *createGuardWideningPass(); 
-   
-   
- //===----------------------------------------------------------------------===// 
- // 
- // LoopGuardWidening - Analogous to the GuardWidening pass, but restricted to a 
- // single loop at a time for use within a LoopPassManager.  Desired effect is 
- // to widen guards into preheader or a single guard within loop if that's not 
- // possible. 
- // 
- Pass *createLoopGuardWideningPass(); 
-   
-   
- //===----------------------------------------------------------------------===// 
- // 
- // BitTrackingDCE - This pass uses a bit-tracking DCE algorithm in order to 
- // remove computations of dead bits. 
- // 
- FunctionPass *createBitTrackingDCEPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // SROA - Replace aggregates or pieces of aggregates with scalar SSA values. 
- // 
- FunctionPass *createSROAPass(bool PreserveCFG = true); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // InductiveRangeCheckElimination - Transform loops to elide range checks on 
- // linear functions of the induction variable. 
- // 
- Pass *createInductiveRangeCheckEliminationPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // InductionVariableSimplify - Transform induction variables in a program to all 
- // use a single canonical induction variable per loop. 
- // 
- Pass *createIndVarSimplifyPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // LICM - This pass is a loop invariant code motion and memory promotion pass. 
- // 
- Pass *createLICMPass(); 
- Pass *createLICMPass(unsigned LicmMssaOptCap, 
-                      unsigned LicmMssaNoAccForPromotionCap, 
-                      bool AllowSpeculation); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // LoopSink - This pass sinks invariants from preheader to loop body where 
- // frequency is lower than loop preheader. 
- // 
- Pass *createLoopSinkPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // LoopPredication - This pass does loop predication on guards. 
- // 
- Pass *createLoopPredicationPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // LoopInterchange - This pass interchanges loops to provide a more 
- // cache-friendly memory access patterns. 
- // 
- Pass *createLoopInterchangePass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // LoopFlatten - This pass flattens nested loops into a single loop. 
- // 
- FunctionPass *createLoopFlattenPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // LoopStrengthReduce - This pass is strength reduces GEP instructions that use 
- // a loop's canonical induction variable as one of their indices. 
- // 
- Pass *createLoopStrengthReducePass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // LoopInstSimplify - This pass simplifies instructions in a loop's body. 
- // 
- Pass *createLoopInstSimplifyPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // LoopUnroll - This pass is a simple loop unrolling pass. 
- // 
- Pass *createLoopUnrollPass(int OptLevel = 2, bool OnlyWhenForced = false, 
-                            bool ForgetAllSCEV = false, int Threshold = -1, 
-                            int Count = -1, int AllowPartial = -1, 
-                            int Runtime = -1, int UpperBound = -1, 
-                            int AllowPeeling = -1); 
- // Create an unrolling pass for full unrolling that uses exact trip count only 
- // and also does peeling. 
- Pass *createSimpleLoopUnrollPass(int OptLevel = 2, bool OnlyWhenForced = false, 
-                                  bool ForgetAllSCEV = false); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // LoopUnrollAndJam - This pass is a simple loop unroll and jam pass. 
- // 
- Pass *createLoopUnrollAndJamPass(int OptLevel = 2); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // LoopReroll - This pass is a simple loop rerolling pass. 
- // 
- Pass *createLoopRerollPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // LoopRotate - This pass is a simple loop rotating pass. 
- // 
- Pass *createLoopRotatePass(int MaxHeaderSize = -1, bool PrepareForLTO = false); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // LoopIdiom - This pass recognizes and replaces idioms in loops. 
- // 
- Pass *createLoopIdiomPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // LoopVersioningLICM - This pass is a loop versioning pass for LICM. 
- // 
- Pass *createLoopVersioningLICMPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // DemoteRegisterToMemoryPass - This pass is used to demote registers to memory 
- // references. In basically undoes the PromoteMemoryToRegister pass to make cfg 
- // hacking easier. 
- // 
- FunctionPass *createDemoteRegisterToMemoryPass(); 
- extern char &DemoteRegisterToMemoryID; 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // Reassociate - This pass reassociates commutative expressions in an order that 
- // is designed to promote better constant propagation, GCSE, LICM, PRE... 
- // 
- // For example:  4 + (x + 5)  ->  x + (4 + 5) 
- // 
- FunctionPass *createReassociatePass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // JumpThreading - Thread control through mult-pred/multi-succ blocks where some 
- // preds always go to some succ. Thresholds other than minus one 
- // override the internal BB duplication default threshold. 
- // 
- FunctionPass *createJumpThreadingPass(int Threshold = -1); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // DFAJumpThreading - When a switch statement inside a loop is used to 
- // implement a deterministic finite automata we can jump thread the switch 
- // statement reducing number of conditional jumps. 
- // 
- FunctionPass *createDFAJumpThreadingPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // CFGSimplification - Merge basic blocks, eliminate unreachable blocks, 
- // simplify terminator instructions, convert switches to lookup tables, etc. 
- // 
- FunctionPass *createCFGSimplificationPass( 
-     SimplifyCFGOptions Options = SimplifyCFGOptions(), 
-     std::function<bool(const Function &)> Ftor = nullptr); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // FlattenCFG - flatten CFG, reduce number of conditional branches by using 
- // parallel-and and parallel-or mode, etc... 
- // 
- FunctionPass *createFlattenCFGPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // CFG Structurization - Remove irreducible control flow 
- // 
- /// 
- /// When \p SkipUniformRegions is true the structizer will not structurize 
- /// regions that only contain uniform branches. 
- Pass *createStructurizeCFGPass(bool SkipUniformRegions = false); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // TailCallElimination - This pass eliminates call instructions to the current 
- // function which occur immediately before return instructions. 
- // 
- FunctionPass *createTailCallEliminationPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // EarlyCSE - This pass performs a simple and fast CSE pass over the dominator 
- // tree. 
- // 
- FunctionPass *createEarlyCSEPass(bool UseMemorySSA = false); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // GVNHoist - This pass performs a simple and fast GVN pass over the dominator 
- // tree to hoist common expressions from sibling branches. 
- // 
- FunctionPass *createGVNHoistPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // GVNSink - This pass uses an "inverted" value numbering to decide the 
- // similarity of expressions and sinks similar expressions into successors. 
- // 
- FunctionPass *createGVNSinkPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // MergedLoadStoreMotion - This pass merges loads and stores in diamonds. Loads 
- // are hoisted into the header, while stores sink into the footer. 
- // 
- FunctionPass *createMergedLoadStoreMotionPass(bool SplitFooterBB = false); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // GVN - This pass performs global value numbering and redundant load 
- // elimination cotemporaneously. 
- // 
- FunctionPass *createNewGVNPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // DivRemPairs - Hoist/decompose integer division and remainder instructions. 
- // 
- FunctionPass *createDivRemPairsPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // MemCpyOpt - This pass performs optimizations related to eliminating memcpy 
- // calls and/or combining multiple stores into memset's. 
- // 
- FunctionPass *createMemCpyOptPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // LoopDeletion - This pass performs DCE of non-infinite loops that it 
- // can prove are dead. 
- // 
- Pass *createLoopDeletionPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // ConstantHoisting - This pass prepares a function for expensive constants. 
- // 
- FunctionPass *createConstantHoistingPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // Sink - Code Sinking 
- // 
- FunctionPass *createSinkingPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // LowerAtomic - Lower atomic intrinsics to non-atomic form 
- // 
- Pass *createLowerAtomicPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // LowerGuardIntrinsic - Lower guard intrinsics to normal control flow. 
- // 
- Pass *createLowerGuardIntrinsicPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // LowerMatrixIntrinsics - Lower matrix intrinsics to vector operations. 
- // 
- Pass *createLowerMatrixIntrinsicsPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // LowerMatrixIntrinsicsMinimal - Lower matrix intrinsics to vector operations 
- //                               (lightweight, does not require extra analysis) 
- // 
- Pass *createLowerMatrixIntrinsicsMinimalPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // LowerWidenableCondition - Lower widenable condition to i1 true. 
- // 
- Pass *createLowerWidenableConditionPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // MergeICmps - Merge integer comparison chains into a memcmp 
- // 
- Pass *createMergeICmpsLegacyPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // ValuePropagation - Propagate CFG-derived value information 
- // 
- Pass *createCorrelatedValuePropagationPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // InferAddressSpaces - Modify users of addrspacecast instructions with values 
- // in the source address space if using the destination address space is slower 
- // on the target. If AddressSpace is left to its default value, it will be 
- // obtained from the TargetTransformInfo. 
- // 
- FunctionPass *createInferAddressSpacesPass(unsigned AddressSpace = ~0u); 
- extern char &InferAddressSpacesID; 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // LowerExpectIntrinsics - Removes llvm.expect intrinsics and creates 
- // "block_weights" metadata. 
- FunctionPass *createLowerExpectIntrinsicPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // TLSVariableHoist - This pass reduce duplicated TLS address call. 
- // 
- FunctionPass *createTLSVariableHoistPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // LowerConstantIntrinsicss - Expand any remaining llvm.objectsize and 
- // llvm.is.constant intrinsic calls, even for the unknown cases. 
- // 
- FunctionPass *createLowerConstantIntrinsicsPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // PartiallyInlineLibCalls - Tries to inline the fast path of library 
- // calls such as sqrt. 
- // 
- FunctionPass *createPartiallyInlineLibCallsPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // SeparateConstOffsetFromGEP - Split GEPs for better CSE 
- // 
- FunctionPass *createSeparateConstOffsetFromGEPPass(bool LowerGEP = false); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // SpeculativeExecution - Aggressively hoist instructions to enable 
- // speculative execution on targets where branches are expensive. 
- // 
- FunctionPass *createSpeculativeExecutionPass(); 
-   
- // Same as createSpeculativeExecutionPass, but does nothing unless 
- // TargetTransformInfo::hasBranchDivergence() is true. 
- FunctionPass *createSpeculativeExecutionIfHasBranchDivergencePass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // StraightLineStrengthReduce - This pass strength-reduces some certain 
- // instruction patterns in straight-line code. 
- // 
- FunctionPass *createStraightLineStrengthReducePass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // PlaceSafepoints - Rewrite any IR calls to gc.statepoints and insert any 
- // safepoint polls (method entry, backedge) that might be required.  This pass 
- // does not generate explicit relocation sequences - that's handled by 
- // RewriteStatepointsForGC which can be run at an arbitrary point in the pass 
- // order following this pass. 
- // 
- FunctionPass *createPlaceSafepointsPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // RewriteStatepointsForGC - Rewrite any gc.statepoints which do not yet have 
- // explicit relocations to include explicit relocations. 
- // 
- ModulePass *createRewriteStatepointsForGCLegacyPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // Float2Int - Demote floats to ints where possible. 
- // 
- FunctionPass *createFloat2IntPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // NaryReassociate - Simplify n-ary operations by reassociation. 
- // 
- FunctionPass *createNaryReassociatePass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // LoopDistribute - Distribute loops. 
- // 
- FunctionPass *createLoopDistributePass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // LoopFuse - Fuse loops. 
- // 
- FunctionPass *createLoopFusePass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // LoopLoadElimination - Perform loop-aware load elimination. 
- // 
- FunctionPass *createLoopLoadEliminationPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // LoopVersioning - Perform loop multi-versioning. 
- // 
- FunctionPass *createLoopVersioningPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // LoopDataPrefetch - Perform data prefetching in loops. 
- // 
- FunctionPass *createLoopDataPrefetchPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // LibCallsShrinkWrap - Shrink-wraps a call to function if the result is not 
- // used. 
- // 
- FunctionPass *createLibCallsShrinkWrapPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // LoopSimplifyCFG - This pass performs basic CFG simplification on loops, 
- // primarily to help other loop passes. 
- // 
- Pass *createLoopSimplifyCFGPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // WarnMissedTransformations - This pass emits warnings for leftover forced 
- // transformations. 
- // 
- Pass *createWarnMissedTransformationsPass(); 
-   
- //===----------------------------------------------------------------------===// 
- // 
- // This pass does instruction simplification on each 
- // instruction in a function. 
- // 
- FunctionPass *createInstSimplifyLegacyPass(); 
-   
-   
- //===----------------------------------------------------------------------===// 
- // 
- // createScalarizeMaskedMemIntrinPass - Replace masked load, store, gather 
- // and scatter intrinsics with scalar code when target doesn't support them. 
- // 
- FunctionPass *createScalarizeMaskedMemIntrinLegacyPass(); 
- } // End llvm namespace 
-   
- #endif 
-