LLVM 19.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/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/Constants.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.


#define DEBUG_TYPE   "loop-interchange"


 STATISTIC (LoopsInterchanged, "Number of loops interchanged")
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 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)


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


#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 

◆ areInnerLoopLatchPHIsSupported()

static bool areInnerLoopLatchPHIsSupported ( Loop OuterLoop,
Loop InnerLoop 

◆ areOuterLoopExitPHIsSupported()

static bool areOuterLoopExitPHIsSupported ( Loop OuterLoop,
Loop InnerLoop 

◆ findInnerReductionPhi()

static PHINode * findInnerReductionPhi ( Loop L,
Value V 

◆ followLCSSA()

static Value * followLCSSA ( Value SV)

Definition at line 695 of file LoopInterchange.cpp.

References followLCSSA(), and PHI.

Referenced by followLCSSA(), and moveLCSSAPhis().

◆ interChangeDependencies()

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

Definition at line 175 of file LoopInterchange.cpp.

References I, and std::swap().

◆ isLegalToInterChangeLoops()

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

Definition at line 196 of file LoopInterchange.cpp.

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

◆ isLexicographicallyPositive()

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

Definition at line 185 of file LoopInterchange.cpp.

Referenced by isLegalToInterChangeLoops().

◆ moveBBContents()

static void moveBBContents ( BasicBlock FromBB,
Instruction InsertBefore 

Move all instructions except the terminator from FromBB right before InsertBefore.

Definition at line 1391 of file LoopInterchange.cpp.

References llvm::BasicBlock::begin(), llvm::ilist_node_impl< OptionsT >::getIterator(), llvm::Instruction::getParent(), llvm::BasicBlock::getTerminator(), and llvm::BasicBlock::splice().

Referenced by swapBBContents().

◆ moveLCSSAPhis()

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

◆ populateDependencyMatrix()

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

◆ populateWorklist()

static void populateWorklist ( Loop L,
LoopVector &  LoopList 


STATISTIC ( LoopsInterchanged  ,
"Number of loops interchanged"   

◆ swapBBContents()

static void swapBBContents ( BasicBlock BB1,
BasicBlock BB2 

Swap instructions between BB1 and BB2 but keep terminators intact.

Definition at line 1399 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 

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")   

◆ MaxLoopNestDepth

const unsigned MaxLoopNestDepth = 10

Definition at line 73 of file LoopInterchange.cpp.

◆ MaxMemInstrCount

const unsigned MaxMemInstrCount = 100

Definition at line 70 of file LoopInterchange.cpp.

Referenced by populateDependencyMatrix().