123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===- llvm/Transforms/Utils/UnrollLoop.h - Unrolling utilities -*- 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 file defines some loop unrolling utilities. It does not define any
- // actual pass or policy, but provides a single function to perform loop
- // unrolling.
- //
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_TRANSFORMS_UTILS_UNROLLLOOP_H
- #define LLVM_TRANSFORMS_UTILS_UNROLLLOOP_H
- #include "llvm/ADT/DenseMap.h"
- #include "llvm/Analysis/TargetTransformInfo.h"
- #include "llvm/Support/InstructionCost.h"
- namespace llvm {
- class AssumptionCache;
- class BasicBlock;
- class BlockFrequencyInfo;
- class DependenceInfo;
- class DominatorTree;
- class Loop;
- class LoopInfo;
- class MDNode;
- class ProfileSummaryInfo;
- class OptimizationRemarkEmitter;
- class ScalarEvolution;
- class StringRef;
- class Value;
- using NewLoopsMap = SmallDenseMap<const Loop *, Loop *, 4>;
- /// @{
- /// Metadata attribute names
- const char *const LLVMLoopUnrollFollowupAll = "llvm.loop.unroll.followup_all";
- const char *const LLVMLoopUnrollFollowupUnrolled =
- "llvm.loop.unroll.followup_unrolled";
- const char *const LLVMLoopUnrollFollowupRemainder =
- "llvm.loop.unroll.followup_remainder";
- /// @}
- const Loop* addClonedBlockToLoopInfo(BasicBlock *OriginalBB,
- BasicBlock *ClonedBB, LoopInfo *LI,
- NewLoopsMap &NewLoops);
- /// Represents the result of a \c UnrollLoop invocation.
- enum class LoopUnrollResult {
- /// The loop was not modified.
- Unmodified,
- /// The loop was partially unrolled -- we still have a loop, but with a
- /// smaller trip count. We may also have emitted epilogue loop if the loop
- /// had a non-constant trip count.
- PartiallyUnrolled,
- /// The loop was fully unrolled into straight-line code. We no longer have
- /// any back-edges.
- FullyUnrolled
- };
- struct UnrollLoopOptions {
- unsigned Count;
- bool Force;
- bool Runtime;
- bool AllowExpensiveTripCount;
- bool UnrollRemainder;
- bool ForgetAllSCEV;
- };
- LoopUnrollResult UnrollLoop(Loop *L, UnrollLoopOptions ULO, LoopInfo *LI,
- ScalarEvolution *SE, DominatorTree *DT,
- AssumptionCache *AC,
- const llvm::TargetTransformInfo *TTI,
- OptimizationRemarkEmitter *ORE, bool PreserveLCSSA,
- Loop **RemainderLoop = nullptr);
- bool UnrollRuntimeLoopRemainder(
- Loop *L, unsigned Count, bool AllowExpensiveTripCount,
- bool UseEpilogRemainder, bool UnrollRemainder, bool ForgetAllSCEV,
- LoopInfo *LI, ScalarEvolution *SE, DominatorTree *DT, AssumptionCache *AC,
- const TargetTransformInfo *TTI, bool PreserveLCSSA,
- Loop **ResultLoop = nullptr);
- LoopUnrollResult UnrollAndJamLoop(Loop *L, unsigned Count, unsigned TripCount,
- unsigned TripMultiple, bool UnrollRemainder,
- LoopInfo *LI, ScalarEvolution *SE,
- DominatorTree *DT, AssumptionCache *AC,
- const TargetTransformInfo *TTI,
- OptimizationRemarkEmitter *ORE,
- Loop **EpilogueLoop = nullptr);
- bool isSafeToUnrollAndJam(Loop *L, ScalarEvolution &SE, DominatorTree &DT,
- DependenceInfo &DI, LoopInfo &LI);
- bool computeUnrollCount(Loop *L, const TargetTransformInfo &TTI,
- DominatorTree &DT, LoopInfo *LI, AssumptionCache *AC,
- ScalarEvolution &SE,
- const SmallPtrSetImpl<const Value *> &EphValues,
- OptimizationRemarkEmitter *ORE, unsigned TripCount,
- unsigned MaxTripCount, bool MaxOrZero,
- unsigned TripMultiple, unsigned LoopSize,
- TargetTransformInfo::UnrollingPreferences &UP,
- TargetTransformInfo::PeelingPreferences &PP,
- bool &UseUpperBound);
- void simplifyLoopAfterUnroll(Loop *L, bool SimplifyIVs, LoopInfo *LI,
- ScalarEvolution *SE, DominatorTree *DT,
- AssumptionCache *AC,
- const TargetTransformInfo *TTI);
- MDNode *GetUnrollMetadata(MDNode *LoopID, StringRef Name);
- TargetTransformInfo::UnrollingPreferences gatherUnrollingPreferences(
- Loop *L, ScalarEvolution &SE, const TargetTransformInfo &TTI,
- BlockFrequencyInfo *BFI, ProfileSummaryInfo *PSI,
- llvm::OptimizationRemarkEmitter &ORE, int OptLevel,
- std::optional<unsigned> UserThreshold, std::optional<unsigned> UserCount,
- std::optional<bool> UserAllowPartial, std::optional<bool> UserRuntime,
- std::optional<bool> UserUpperBound,
- std::optional<unsigned> UserFullUnrollMaxCount);
- InstructionCost ApproximateLoopSize(const Loop *L, unsigned &NumCalls,
- bool &NotDuplicatable, bool &Convergent, const TargetTransformInfo &TTI,
- const SmallPtrSetImpl<const Value *> &EphValues, unsigned BEInsns);
- } // end namespace llvm
- #endif // LLVM_TRANSFORMS_UTILS_UNROLLLOOP_H
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|