LLVM 19.0.0git
Namespaces | Macros | Functions | Variables
LoopUnrollAndJamPass.cpp File Reference
#include "llvm/Transforms/Scalar/LoopUnrollAndJamPass.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/PriorityWorklist.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Analysis/AssumptionCache.h"
#include "llvm/Analysis/CodeMetrics.h"
#include "llvm/Analysis/DependenceAnalysis.h"
#include "llvm/Analysis/LoopAnalysisManager.h"
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/Analysis/LoopNestAnalysis.h"
#include "llvm/Analysis/LoopPass.h"
#include "llvm/Analysis/OptimizationRemarkEmitter.h"
#include "llvm/Analysis/ScalarEvolution.h"
#include "llvm/Analysis/TargetTransformInfo.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/Metadata.h"
#include "llvm/IR/PassManager.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Transforms/Scalar/LoopPassManager.h"
#include "llvm/Transforms/Utils/LoopPeel.h"
#include "llvm/Transforms/Utils/LoopUtils.h"
#include "llvm/Transforms/Utils/UnrollLoop.h"
#include <cassert>
#include <cstdint>

Go to the source code of this file.

Namespaces

namespace  llvm
 This is an optimization pass for GlobalISel generic memory operations.
 

Macros

#define DEBUG_TYPE   "loop-unroll-and-jam"
 

Functions

static MDNodegetUnrollMetadataForLoop (const Loop *L, StringRef Name)
 
static bool hasAnyUnrollPragma (const Loop *L, StringRef Prefix)
 
static bool hasUnrollAndJamEnablePragma (const Loop *L)
 
static unsigned unrollAndJamCountPragmaValue (const Loop *L)
 
static uint64_t getUnrollAndJammedLoopSize (unsigned LoopSize, TargetTransformInfo::UnrollingPreferences &UP)
 
static bool computeUnrollAndJamCount (Loop *L, Loop *SubLoop, const TargetTransformInfo &TTI, DominatorTree &DT, LoopInfo *LI, AssumptionCache *AC, ScalarEvolution &SE, const SmallPtrSetImpl< const Value * > &EphValues, OptimizationRemarkEmitter *ORE, unsigned OuterTripCount, unsigned OuterTripMultiple, const UnrollCostEstimator &OuterUCE, unsigned InnerTripCount, unsigned InnerLoopSize, TargetTransformInfo::UnrollingPreferences &UP, TargetTransformInfo::PeelingPreferences &PP)
 
static LoopUnrollResult tryToUnrollAndJamLoop (Loop *L, DominatorTree &DT, LoopInfo *LI, ScalarEvolution &SE, const TargetTransformInfo &TTI, AssumptionCache &AC, DependenceInfo &DI, OptimizationRemarkEmitter &ORE, int OptLevel)
 
static bool tryToUnrollAndJamLoop (LoopNest &LN, DominatorTree &DT, LoopInfo &LI, ScalarEvolution &SE, const TargetTransformInfo &TTI, AssumptionCache &AC, DependenceInfo &DI, OptimizationRemarkEmitter &ORE, int OptLevel, LPMUpdater &U)
 

Variables

static cl::opt< boolAllowUnrollAndJam ("allow-unroll-and-jam", cl::Hidden, cl::desc("Allows loops to be unroll-and-jammed."))
 
static cl::opt< unsignedUnrollAndJamCount ("unroll-and-jam-count", cl::Hidden, cl::desc("Use this unroll count for all loops including those with " "unroll_and_jam_count pragma values, for testing purposes"))
 
static cl::opt< unsignedUnrollAndJamThreshold ("unroll-and-jam-threshold", cl::init(60), cl::Hidden, cl::desc("Threshold to use for inner loop when doing unroll and jam."))
 
static cl::opt< unsignedPragmaUnrollAndJamThreshold ("pragma-unroll-and-jam-threshold", cl::init(1024), cl::Hidden, cl::desc("Unrolled size limit for loops with an unroll_and_jam(full) or " "unroll_count pragma."))
 
static const char *const LLVMLoopUnrollAndJamFollowupAll
 
static const char *const LLVMLoopUnrollAndJamFollowupInner
 
static const char *const LLVMLoopUnrollAndJamFollowupOuter
 
static const char *const LLVMLoopUnrollAndJamFollowupRemainderInner
 
static const char *const LLVMLoopUnrollAndJamFollowupRemainderOuter
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "loop-unroll-and-jam"

Definition at line 54 of file LoopUnrollAndJamPass.cpp.

Function Documentation

◆ computeUnrollAndJamCount()

static bool computeUnrollAndJamCount ( Loop L,
Loop SubLoop,
const TargetTransformInfo TTI,
DominatorTree DT,
LoopInfo LI,
AssumptionCache AC,
ScalarEvolution SE,
const SmallPtrSetImpl< const Value * > &  EphValues,
OptimizationRemarkEmitter ORE,
unsigned  OuterTripCount,
unsigned  OuterTripMultiple,
const UnrollCostEstimator OuterUCE,
unsigned  InnerTripCount,
unsigned  InnerLoopSize,
TargetTransformInfo::UnrollingPreferences UP,
TargetTransformInfo::PeelingPreferences PP 
)
static

◆ getUnrollAndJammedLoopSize()

static uint64_t getUnrollAndJammedLoopSize ( unsigned  LoopSize,
TargetTransformInfo::UnrollingPreferences UP 
)
static

◆ getUnrollMetadataForLoop()

static MDNode * getUnrollMetadataForLoop ( const Loop L,
StringRef  Name 
)
static

◆ hasAnyUnrollPragma()

static bool hasAnyUnrollPragma ( const Loop L,
StringRef  Prefix 
)
static

◆ hasUnrollAndJamEnablePragma()

static bool hasUnrollAndJamEnablePragma ( const Loop L)
static

Definition at line 122 of file LoopUnrollAndJamPass.cpp.

References getUnrollMetadataForLoop().

Referenced by computeUnrollAndJamCount().

◆ tryToUnrollAndJamLoop() [1/2]

static LoopUnrollResult tryToUnrollAndJamLoop ( Loop L,
DominatorTree DT,
LoopInfo LI,
ScalarEvolution SE,
const TargetTransformInfo TTI,
AssumptionCache AC,
DependenceInfo DI,
OptimizationRemarkEmitter ORE,
int  OptLevel 
)
static

Definition at line 279 of file LoopUnrollAndJamPass.cpp.

References AllowUnrollAndJam, llvm::TargetTransformInfo::UnrollingPreferences::BEInsns, llvm::UnrollCostEstimator::canUnroll(), llvm::CodeMetrics::collectEphemeralValues(), computeUnrollAndJamCount(), llvm::UnrollCostEstimator::Convergent, llvm::TargetTransformInfo::UnrollingPreferences::Count, llvm::dbgs(), llvm::FullyUnrolled, llvm::gatherPeelingPreferences(), llvm::gatherUnrollingPreferences(), llvm::Loop::getLoopID(), llvm::LoopBase< BlockT, LoopT >::getLoopLatch(), llvm::UnrollCostEstimator::getRolledLoopSize(), llvm::ScalarEvolution::getSmallConstantTripCount(), llvm::ScalarEvolution::getSmallConstantTripMultiple(), hasAnyUnrollPragma(), llvm::hasUnrollAndJamTransformation(), llvm::isSafeToUnrollAndJam(), LLVM_DEBUG, LLVMLoopUnrollAndJamFollowupAll, LLVMLoopUnrollAndJamFollowupInner, LLVMLoopUnrollAndJamFollowupOuter, LLVMLoopUnrollAndJamFollowupRemainderInner, LLVMLoopUnrollAndJamFollowupRemainderOuter, llvm::makeFollowupLoopID(), llvm::UnrollCostEstimator::NumInlineCandidates, llvm::PartiallyUnrolled, llvm::Loop::setLoopID(), llvm::TM_Disable, llvm::TM_ForcedByUser, llvm::Unmodified, llvm::TargetTransformInfo::UnrollingPreferences::UnrollAndJam, llvm::TargetTransformInfo::UnrollingPreferences::UnrollAndJamInnerLoopThreshold, llvm::UnrollAndJamLoop(), UnrollAndJamThreshold, and llvm::TargetTransformInfo::UnrollingPreferences::UnrollRemainder.

Referenced by llvm::LoopUnrollAndJamPass::run(), and tryToUnrollAndJamLoop().

◆ tryToUnrollAndJamLoop() [2/2]

static bool tryToUnrollAndJamLoop ( LoopNest LN,
DominatorTree DT,
LoopInfo LI,
ScalarEvolution SE,
const TargetTransformInfo TTI,
AssumptionCache AC,
DependenceInfo DI,
OptimizationRemarkEmitter ORE,
int  OptLevel,
LPMUpdater U 
)
static

◆ unrollAndJamCountPragmaValue()

static unsigned unrollAndJamCountPragmaValue ( const Loop L)
static

Variable Documentation

◆ AllowUnrollAndJam

cl::opt< bool > AllowUnrollAndJam("allow-unroll-and-jam", cl::Hidden, cl::desc("Allows loops to be unroll-and-jammed.")) ( "allow-unroll-and-jam"  ,
cl::Hidden  ,
cl::desc("Allows loops to be unroll-and-jammed.")   
)
static

Referenced by tryToUnrollAndJamLoop().

◆ LLVMLoopUnrollAndJamFollowupAll

const char* const LLVMLoopUnrollAndJamFollowupAll
static
Initial value:
=
"llvm.loop.unroll_and_jam.followup_all"

Metadata attribute names

Definition at line 58 of file LoopUnrollAndJamPass.cpp.

Referenced by tryToUnrollAndJamLoop().

◆ LLVMLoopUnrollAndJamFollowupInner

const char* const LLVMLoopUnrollAndJamFollowupInner
static
Initial value:
=
"llvm.loop.unroll_and_jam.followup_inner"

Definition at line 60 of file LoopUnrollAndJamPass.cpp.

Referenced by tryToUnrollAndJamLoop().

◆ LLVMLoopUnrollAndJamFollowupOuter

const char* const LLVMLoopUnrollAndJamFollowupOuter
static
Initial value:
=
"llvm.loop.unroll_and_jam.followup_outer"

Definition at line 62 of file LoopUnrollAndJamPass.cpp.

Referenced by tryToUnrollAndJamLoop().

◆ LLVMLoopUnrollAndJamFollowupRemainderInner

const char* const LLVMLoopUnrollAndJamFollowupRemainderInner
static
Initial value:
=
"llvm.loop.unroll_and_jam.followup_remainder_inner"

Definition at line 64 of file LoopUnrollAndJamPass.cpp.

Referenced by tryToUnrollAndJamLoop().

◆ LLVMLoopUnrollAndJamFollowupRemainderOuter

const char* const LLVMLoopUnrollAndJamFollowupRemainderOuter
static
Initial value:
=
"llvm.loop.unroll_and_jam.followup_remainder_outer"

Definition at line 66 of file LoopUnrollAndJamPass.cpp.

Referenced by tryToUnrollAndJamLoop().

◆ PragmaUnrollAndJamThreshold

cl::opt< unsigned > PragmaUnrollAndJamThreshold("pragma-unroll-and-jam-threshold", cl::init(1024), cl::Hidden, cl::desc("Unrolled size limit for loops with an unroll_and_jam(full) or " "unroll_count pragma.")) ( "pragma-unroll-and-jam-threshold"  ,
cl::init(1024)  ,
cl::Hidden  ,
cl::desc("Unrolled size limit for loops with an unroll_and_jam(full) or " "unroll_count pragma.")   
)
static

◆ UnrollAndJamCount

cl::opt< unsigned > UnrollAndJamCount("unroll-and-jam-count", cl::Hidden, cl::desc("Use this unroll count for all loops including those with " "unroll_and_jam_count pragma values, for testing purposes")) ( "unroll-and-jam-count"  ,
cl::Hidden  ,
cl::desc("Use this unroll count for all loops including those with " "unroll_and_jam_count pragma values, for testing purposes")   
)
static

◆ UnrollAndJamThreshold

cl::opt< unsigned > UnrollAndJamThreshold("unroll-and-jam-threshold", cl::init(60), cl::Hidden, cl::desc("Threshold to use for inner loop when doing unroll and jam.")) ( "unroll-and-jam-threshold"  ,
cl::init(60)  ,
cl::Hidden  ,
cl::desc("Threshold to use for inner loop when doing unroll and jam.")   
)
static

Referenced by tryToUnrollAndJamLoop().