mirror of
https://github.com/opnsense/src.git
synced 2026-03-18 08:41:30 -04:00
126 lines
5.2 KiB
C++
126 lines
5.2 KiB
C++
//===- llvm/Transforms/Utils/UnrollLoop.h - Unrolling utilities -*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// 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/ADT/StringRef.h"
|
|
#include "llvm/Analysis/TargetTransformInfo.h"
|
|
#include "llvm/Transforms/Utils/ValueMapper.h"
|
|
|
|
namespace llvm {
|
|
|
|
class AssumptionCache;
|
|
class BasicBlock;
|
|
class DependenceInfo;
|
|
class DominatorTree;
|
|
class Loop;
|
|
class LoopInfo;
|
|
class MDNode;
|
|
class OptimizationRemarkEmitter;
|
|
class ScalarEvolution;
|
|
|
|
using NewLoopsMap = SmallDenseMap<const Loop *, Loop *, 4>;
|
|
|
|
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
|
|
};
|
|
|
|
LoopUnrollResult UnrollLoop(Loop *L, unsigned Count, unsigned TripCount,
|
|
bool Force, bool AllowRuntime,
|
|
bool AllowExpensiveTripCount, bool PreserveCondBr,
|
|
bool PreserveOnlyFirst, unsigned TripMultiple,
|
|
unsigned PeelCount, bool UnrollRemainder,
|
|
LoopInfo *LI, ScalarEvolution *SE,
|
|
DominatorTree *DT, AssumptionCache *AC,
|
|
OptimizationRemarkEmitter *ORE, bool PreserveLCSSA);
|
|
|
|
bool UnrollRuntimeLoopRemainder(Loop *L, unsigned Count,
|
|
bool AllowExpensiveTripCount,
|
|
bool UseEpilogRemainder, bool UnrollRemainder,
|
|
LoopInfo *LI,
|
|
ScalarEvolution *SE, DominatorTree *DT,
|
|
AssumptionCache *AC,
|
|
bool PreserveLCSSA);
|
|
|
|
void computePeelCount(Loop *L, unsigned LoopSize,
|
|
TargetTransformInfo::UnrollingPreferences &UP,
|
|
unsigned &TripCount, ScalarEvolution &SE);
|
|
|
|
bool canPeel(Loop *L);
|
|
|
|
bool peelLoop(Loop *L, unsigned PeelCount, LoopInfo *LI, ScalarEvolution *SE,
|
|
DominatorTree *DT, AssumptionCache *AC, bool PreserveLCSSA);
|
|
|
|
LoopUnrollResult UnrollAndJamLoop(Loop *L, unsigned Count, unsigned TripCount,
|
|
unsigned TripMultiple, bool UnrollRemainder,
|
|
LoopInfo *LI, ScalarEvolution *SE,
|
|
DominatorTree *DT, AssumptionCache *AC,
|
|
OptimizationRemarkEmitter *ORE);
|
|
|
|
bool isSafeToUnrollAndJam(Loop *L, ScalarEvolution &SE, DominatorTree &DT,
|
|
DependenceInfo &DI);
|
|
|
|
bool computeUnrollCount(Loop *L, const TargetTransformInfo &TTI,
|
|
DominatorTree &DT, LoopInfo *LI, ScalarEvolution &SE,
|
|
const SmallPtrSetImpl<const Value *> &EphValues,
|
|
OptimizationRemarkEmitter *ORE, unsigned &TripCount,
|
|
unsigned MaxTripCount, unsigned &TripMultiple,
|
|
unsigned LoopSize,
|
|
TargetTransformInfo::UnrollingPreferences &UP,
|
|
bool &UseUpperBound);
|
|
|
|
BasicBlock *foldBlockIntoPredecessor(BasicBlock *BB, LoopInfo *LI,
|
|
ScalarEvolution *SE, DominatorTree *DT);
|
|
|
|
void remapInstruction(Instruction *I, ValueToValueMapTy &VMap);
|
|
|
|
void simplifyLoopAfterUnroll(Loop *L, bool SimplifyIVs, LoopInfo *LI,
|
|
ScalarEvolution *SE, DominatorTree *DT,
|
|
AssumptionCache *AC);
|
|
|
|
MDNode *GetUnrollMetadata(MDNode *LoopID, StringRef Name);
|
|
|
|
TargetTransformInfo::UnrollingPreferences gatherUnrollingPreferences(
|
|
Loop *L, ScalarEvolution &SE, const TargetTransformInfo &TTI, int OptLevel,
|
|
Optional<unsigned> UserThreshold, Optional<unsigned> UserCount,
|
|
Optional<bool> UserAllowPartial, Optional<bool> UserRuntime,
|
|
Optional<bool> UserUpperBound, Optional<bool> UserAllowPeeling);
|
|
|
|
unsigned 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
|