LLVM  4.0.0
Macros | Functions | Variables
LoopUnswitch.cpp File Reference
#include "llvm/Transforms/Scalar.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/GlobalsModRef.h"
#include "llvm/Analysis/AssumptionCache.h"
#include "llvm/Analysis/CodeMetrics.h"
#include "llvm/Analysis/InstructionSimplify.h"
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/Analysis/LoopPass.h"
#include "llvm/Analysis/ScalarEvolution.h"
#include "llvm/Analysis/TargetTransformInfo.h"
#include "llvm/Analysis/BlockFrequencyInfoImpl.h"
#include "llvm/Analysis/BlockFrequencyInfo.h"
#include "llvm/Analysis/BranchProbabilityInfo.h"
#include "llvm/Support/BranchProbability.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/MDBuilder.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
#include "llvm/Transforms/Utils/Cloning.h"
#include "llvm/Transforms/Utils/Local.h"
#include "llvm/Transforms/Utils/LoopUtils.h"
#include <algorithm>
#include <map>
#include <set>
Include dependency graph for LoopUnswitch.cpp:

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "loop-unswitch"
 

Functions

 STATISTIC (NumBranches,"Number of branches unswitched")
 
 STATISTIC (NumSwitches,"Number of switches unswitched")
 
 STATISTIC (NumGuards,"Number of guards unswitched")
 
 STATISTIC (NumSelects,"Number of selects unswitched")
 
 STATISTIC (NumTrivial,"Number of unswitches that are trivial")
 
 STATISTIC (NumSimplify,"Number of simplifications of unswitched code")
 
 STATISTIC (TotalInsts,"Total number of instructions analyzed")
 
 INITIALIZE_PASS_BEGIN (LoopUnswitch,"loop-unswitch","Unswitch loops", false, false) INITIALIZE_PASS_END(LoopUnswitch
 
static ValueFindLIVLoopCondition (Value *Cond, Loop *L, bool &Changed, DenseMap< Value *, Value * > &Cache)
 Cond is a condition that occurs in L. More...
 
static ValueFindLIVLoopCondition (Value *Cond, Loop *L, bool &Changed)
 
static bool isTrivialLoopExitBlockHelper (Loop *L, BasicBlock *BB, BasicBlock *&ExitBB, std::set< BasicBlock * > &Visited)
 Check to see if all paths from BB exit the loop with no side effects (including infinite loops). More...
 
static BasicBlockisTrivialLoopExitBlock (Loop *L, BasicBlock *BB)
 Return true if the specified block unconditionally leads to an exit from the specified loop, and has no side-effects in the process. More...
 
static LoopCloneLoop (Loop *L, Loop *PL, ValueToValueMapTy &VM, LoopInfo *LI, LPPassManager *LPM)
 Recursively clone the specified loop and all of its children, mapping the blocks with the specified map. More...
 
static void RemoveFromWorklist (Instruction *I, std::vector< Instruction * > &Worklist)
 Remove all instances of I from the worklist vector specified. More...
 
static void ReplaceUsesOfWith (Instruction *I, Value *V, std::vector< Instruction * > &Worklist, Loop *L, LPPassManager *LPM)
 When we find that I really equals V, remove I from the program, replacing all uses with V and update the worklist. More...
 

Variables

static cl::opt< unsignedThreshold ("loop-unswitch-threshold", cl::desc("Max loop size to unswitch"), cl::init(100), cl::Hidden)
 
static cl::opt< boolLoopUnswitchWithBlockFrequency ("loop-unswitch-with-block-frequency", cl::init(false), cl::Hidden, cl::desc("Enable the use of the block frequency analysis to access PGO ""heuristics to minimize code growth in cold regions."))
 
static cl::opt< unsignedColdnessThreshold ("loop-unswitch-coldness-threshold", cl::init(1), cl::Hidden, cl::desc("Coldness threshold in percentage. The loop header frequency ""(relative to the entry frequency) is compared with this ""threshold to determine if non-trivial unswitching should be ""enabled."))
 
loop unswitch
 
loop Unswitch loops
 
loop Unswitch false
 

Macro Definition Documentation

#define DEBUG_TYPE   "loop-unswitch"

Definition at line 64 of file LoopUnswitch.cpp.

Function Documentation

static Loop* CloneLoop ( Loop L,
Loop PL,
ValueToValueMapTy VM,
LoopInfo LI,
LPPassManager LPM 
)
static

Recursively clone the specified loop and all of its children, mapping the blocks with the specified map.

Definition at line 763 of file LoopUnswitch.cpp.

References llvm::LoopBase< N, M >::addBasicBlockToLoop(), llvm::LPPassManager::addLoop(), llvm::LoopBase< N, M >::block_begin(), llvm::LoopBase< N, M >::block_end(), E, llvm::LoopInfoBase< N, M >::getLoopFor(), I, and L.

static Value* FindLIVLoopCondition ( Value Cond,
Loop L,
bool Changed,
DenseMap< Value *, Value * > &  Cache 
)
static
static Value* FindLIVLoopCondition ( Value Cond,
Loop L,
bool Changed 
)
static

Definition at line 439 of file LoopUnswitch.cpp.

References FindLIVLoopCondition().

INITIALIZE_PASS_BEGIN ( LoopUnswitch  ,
"loop-unswitch ,
"Unswitch loops ,
false  ,
false   
)
static BasicBlock* isTrivialLoopExitBlock ( Loop L,
BasicBlock BB 
)
static

Return true if the specified block unconditionally leads to an exit from the specified loop, and has no side-effects in the process.

If so, return the block that is exited to, otherwise return null.

Definition at line 733 of file LoopUnswitch.cpp.

References llvm::LoopBase< N, M >::getHeader(), and isTrivialLoopExitBlockHelper().

static bool isTrivialLoopExitBlockHelper ( Loop L,
BasicBlock BB,
BasicBlock *&  ExitBB,
std::set< BasicBlock * > &  Visited 
)
static

Check to see if all paths from BB exit the loop with no side effects (including infinite loops).

If true, we return true and set ExitBB to the block we exit through.

Definition at line 698 of file LoopUnswitch.cpp.

References llvm::LoopBase< N, M >::contains(), E, I, llvm::succ_begin(), and llvm::succ_end().

Referenced by isTrivialLoopExitBlock().

static void RemoveFromWorklist ( Instruction I,
std::vector< Instruction * > &  Worklist 
)
static

Remove all instances of I from the worklist vector specified.

Definition at line 1174 of file LoopUnswitch.cpp.

References I, and llvm::sys::fs::remove().

Referenced by ReplaceUsesOfWith().

static void ReplaceUsesOfWith ( Instruction I,
Value V,
std::vector< Instruction * > &  Worklist,
Loop L,
LPPassManager LPM 
)
static

When we find that I really equals V, remove I from the program, replacing all uses with V and update the worklist.

Definition at line 1183 of file LoopUnswitch.cpp.

References llvm::dbgs(), DEBUG, llvm::LPPassManager::deleteSimpleAnalysisValue(), llvm::Instruction::eraseFromParent(), llvm::User::getNumOperands(), llvm::User::getOperand(), i, RemoveFromWorklist(), llvm::Value::replaceAllUsesWith(), and llvm::Value::users().

STATISTIC ( NumBranches  ,
"Number of branches unswitched"   
)
STATISTIC ( NumSwitches  ,
"Number of switches unswitched"   
)
STATISTIC ( NumGuards  ,
"Number of guards unswitched"   
)
STATISTIC ( NumSelects  ,
"Number of selects unswitched"   
)
STATISTIC ( NumTrivial  ,
"Number of unswitches that are trivial"   
)
STATISTIC ( NumSimplify  ,
"Number of simplifications of unswitched code"   
)
STATISTIC ( TotalInsts  ,
"Total number of instructions analyzed"   
)

Variable Documentation

cl::opt<unsigned> ColdnessThreshold("loop-unswitch-coldness-threshold", cl::init(1), cl::Hidden, cl::desc("Coldness threshold in percentage. The loop header frequency ""(relative to the entry frequency) is compared with this ""threshold to determine if non-trivial unswitching should be ""enabled."))
static
loop Unswitch false

Definition at line 384 of file LoopUnswitch.cpp.

loop Unswitch loops

Definition at line 384 of file LoopUnswitch.cpp.

cl::opt<bool> LoopUnswitchWithBlockFrequency("loop-unswitch-with-block-frequency", cl::init(false), cl::Hidden, cl::desc("Enable the use of the block frequency analysis to access PGO ""heuristics to minimize code growth in cold regions."))
static
cl::opt<unsigned> Threshold("loop-unswitch-threshold", cl::desc("Max loop size to unswitch"), cl::init(100), cl::Hidden)
static
loop unswitch

Definition at line 384 of file LoopUnswitch.cpp.