123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===-- 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
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|