LLVM 20.0.0git
Macros | Functions | Variables
LoopInterchange.cpp File Reference
#include "llvm/Transforms/Scalar/LoopInterchange.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/StringSet.h"
#include "llvm/Analysis/DependenceAnalysis.h"
#include "llvm/Analysis/LoopCacheAnalysis.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/ScalarEvolutionExpressions.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/DiagnosticInfo.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/InstrTypes.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/User.h"
#include "llvm/IR/Value.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Transforms/Scalar/LoopPassManager.h"
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
#include "llvm/Transforms/Utils/LoopUtils.h"
#include <cassert>
#include <utility>
#include <vector>

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "loop-interchange"
 

Functions

 STATISTIC (LoopsInterchanged, "Number of loops interchanged")
 
static void printDepMatrix (CharMatrix &DepMatrix)
 
static bool populateDependencyMatrix (CharMatrix &DepMatrix, unsigned Level, Loop *L, DependenceInfo *DI, ScalarEvolution *SE)
 
static void interChangeDependencies (CharMatrix &DepMatrix, unsigned FromIndx, unsigned ToIndx)
 
static bool isLexicographicallyPositive (std::vector< char > &DV)
 
static bool isLegalToInterChangeLoops (CharMatrix &DepMatrix, unsigned InnerLoopId, unsigned OuterLoopId)
 
static void populateWorklist (Loop &L, LoopVector &LoopList)
 
static bool hasMinimumLoopDepth (SmallVectorImpl< Loop * > &LoopList)
 
static ValuefollowLCSSA (Value *SV)
 
static PHINodefindInnerReductionPhi (Loop *L, Value *V)
 
static bool areInnerLoopExitPHIsSupported (Loop *InnerL, Loop *OuterL, SmallPtrSetImpl< PHINode * > &Reductions)
 
static bool areOuterLoopExitPHIsSupported (Loop *OuterLoop, Loop *InnerLoop)
 
static bool areInnerLoopLatchPHIsSupported (Loop *OuterLoop, Loop *InnerLoop)
 
static void moveBBContents (BasicBlock *FromBB, Instruction *InsertBefore)
 Move all instructions except the terminator from FromBB right before InsertBefore.
 
static void swapBBContents (BasicBlock *BB1, BasicBlock *BB2)
 Swap instructions between BB1 and BB2 but keep terminators intact.
 
static void updateSuccessor (BranchInst *BI, BasicBlock *OldBB, BasicBlock *NewBB, std::vector< DominatorTree::UpdateType > &DTUpdates, bool MustUpdateOnce=true)
 
static void moveLCSSAPhis (BasicBlock *InnerExit, BasicBlock *InnerHeader, BasicBlock *InnerLatch, BasicBlock *OuterHeader, BasicBlock *OuterLatch, BasicBlock *OuterExit, Loop *InnerLoop, LoopInfo *LI)
 

Variables

static cl::opt< int > LoopInterchangeCostThreshold ("loop-interchange-threshold", cl::init(0), cl::Hidden, cl::desc("Interchange if you gain more than this number"))
 
static const unsigned MaxMemInstrCount = 100
 
static const unsigned MaxLoopNestDepth = 10
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "loop-interchange"

Definition at line 52 of file LoopInterchange.cpp.

Function Documentation

◆ areInnerLoopExitPHIsSupported()

static bool areInnerLoopExitPHIsSupported ( Loop InnerL,
Loop OuterL,
SmallPtrSetImpl< PHINode * > &  Reductions 
)
static

◆ areInnerLoopLatchPHIsSupported()

static bool areInnerLoopLatchPHIsSupported ( Loop OuterLoop,
Loop InnerLoop 
)
static

◆ areOuterLoopExitPHIsSupported()

static bool areOuterLoopExitPHIsSupported ( Loop OuterLoop,
Loop InnerLoop 
)
static

◆ findInnerReductionPhi()

static PHINode * findInnerReductionPhi ( Loop L,
Value V 
)
static

◆ followLCSSA()

static Value * followLCSSA ( Value SV)
static

Definition at line 706 of file LoopInterchange.cpp.

References followLCSSA(), and PHI.

Referenced by followLCSSA(), and moveLCSSAPhis().

◆ hasMinimumLoopDepth()

static bool hasMinimumLoopDepth ( SmallVectorImpl< Loop * > &  LoopList)
static

◆ interChangeDependencies()

static void interChangeDependencies ( CharMatrix &  DepMatrix,
unsigned  FromIndx,
unsigned  ToIndx 
)
static

Definition at line 179 of file LoopInterchange.cpp.

References I, and std::swap().

◆ isLegalToInterChangeLoops()

static bool isLegalToInterChangeLoops ( CharMatrix &  DepMatrix,
unsigned  InnerLoopId,
unsigned  OuterLoopId 
)
static

Definition at line 200 of file LoopInterchange.cpp.

References isLexicographicallyPositive(), and std::swap().

◆ isLexicographicallyPositive()

static bool isLexicographicallyPositive ( std::vector< char > &  DV)
static

Definition at line 189 of file LoopInterchange.cpp.

Referenced by isLegalToInterChangeLoops().

◆ moveBBContents()

static void moveBBContents ( BasicBlock FromBB,
Instruction InsertBefore 
)
static

◆ moveLCSSAPhis()

static void moveLCSSAPhis ( BasicBlock InnerExit,
BasicBlock InnerHeader,
BasicBlock InnerLatch,
BasicBlock OuterHeader,
BasicBlock OuterLatch,
BasicBlock OuterExit,
Loop InnerLoop,
LoopInfo LI 
)
static

◆ populateDependencyMatrix()

static bool populateDependencyMatrix ( CharMatrix &  DepMatrix,
unsigned  Level,
Loop L,
DependenceInfo DI,
ScalarEvolution SE 
)
static

◆ populateWorklist()

static void populateWorklist ( Loop L,
LoopVector &  LoopList 
)
static

◆ printDepMatrix()

static void printDepMatrix ( CharMatrix &  DepMatrix)
static

Definition at line 76 of file LoopInterchange.cpp.

References D, llvm::dbgs(), and LLVM_DEBUG.

◆ STATISTIC()

STATISTIC ( LoopsInterchanged  ,
"Number of loops interchanged"   
)

◆ swapBBContents()

static void swapBBContents ( BasicBlock BB1,
BasicBlock BB2 
)
static

Swap instructions between BB1 and BB2 but keep terminators intact.

Definition at line 1410 of file LoopInterchange.cpp.

References llvm::BasicBlock::getTerminator(), I, llvm::map_range(), and moveBBContents().

◆ updateSuccessor()

static void updateSuccessor ( BranchInst BI,
BasicBlock OldBB,
BasicBlock NewBB,
std::vector< DominatorTree::UpdateType > &  DTUpdates,
bool  MustUpdateOnce = true 
)
static

Variable Documentation

◆ LoopInterchangeCostThreshold

cl::opt< int > LoopInterchangeCostThreshold("loop-interchange-threshold", cl::init(0), cl::Hidden, cl::desc("Interchange if you gain more than this number")) ( "loop-interchange-threshold"  ,
cl::init(0)  ,
cl::Hidden  ,
cl::desc("Interchange if you gain more than this number")   
)
static

◆ MaxLoopNestDepth

const unsigned MaxLoopNestDepth = 10
static

Definition at line 73 of file LoopInterchange.cpp.

◆ MaxMemInstrCount

const unsigned MaxMemInstrCount = 100
static

Definition at line 70 of file LoopInterchange.cpp.

Referenced by populateDependencyMatrix().