LLVM API Documentation
#include "llvm/Transforms/Scalar.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/AssumptionTracker.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/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/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 <algorithm>
#include <map>
#include <set>
Go to the source code of this file.
Defines | |
#define | DEBUG_TYPE "loop-unswitch" |
Functions | |
STATISTIC (NumBranches,"Number of branches unswitched") | |
STATISTIC (NumSwitches,"Number of switches 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 Value * | FindLIVLoopCondition (Value *Cond, Loop *L, bool &Changed) |
static bool | isTrivialLoopExitBlockHelper (Loop *L, BasicBlock *BB, BasicBlock *&ExitBB, std::set< BasicBlock * > &Visited) |
static BasicBlock * | isTrivialLoopExitBlock (Loop *L, BasicBlock *BB) |
static Loop * | CloneLoop (Loop *L, Loop *PL, ValueToValueMapTy &VM, LoopInfo *LI, LPPassManager *LPM) |
static void | RemoveFromWorklist (Instruction *I, std::vector< Instruction * > &Worklist) |
static void | ReplaceUsesOfWith (Instruction *I, Value *V, std::vector< Instruction * > &Worklist, Loop *L, LPPassManager *LPM) |
Variables | |
static cl::opt< unsigned > | Threshold ("loop-unswitch-threshold", cl::desc("Max loop size to unswitch"), cl::init(100), cl::Hidden) |
loop | unswitch |
loop Unswitch | loops |
loop Unswitch | false |
#define DEBUG_TYPE "loop-unswitch" |
Definition at line 56 of file LoopUnswitch.cpp.
static Loop* CloneLoop | ( | Loop * | L, |
Loop * | PL, | ||
ValueToValueMapTy & | VM, | ||
LoopInfo * | LI, | ||
LPPassManager * | LPM | ||
) | [static] |
CloneLoop - Recursively clone the specified loop and all of its children, mapping the blocks with the specified map.
Definition at line 668 of file LoopUnswitch.cpp.
References llvm::LoopBase< BlockT, LoopT >::addBasicBlockToLoop(), llvm::LoopBase< BlockT, LoopT >::begin(), llvm::LoopBase< BlockT, LoopT >::block_begin(), llvm::LoopBase< BlockT, LoopT >::block_end(), llvm::LoopBase< BlockT, LoopT >::end(), llvm::LoopInfo::getBase(), llvm::LoopInfo::getLoopFor(), I, llvm::LPPassManager::insertLoop(), and llvm::GC::Loop.
static Value* FindLIVLoopCondition | ( | Value * | Cond, |
Loop * | L, | ||
bool & | Changed | ||
) | [static] |
FindLIVLoopCondition - Cond is a condition that occurs in L. If it is invariant in the loop, or has an invariant piece, return the invariant. Otherwise, return null.
Definition at line 351 of file LoopUnswitch.cpp.
References llvm::APIntOps::And(), llvm::Value::getType(), llvm::Type::isVectorTy(), llvm::Loop::makeLoopInvariant(), and llvm::APIntOps::Or().
INITIALIZE_PASS_BEGIN | ( | LoopUnswitch | , |
"loop-unswitch" | , | ||
"Unswitch loops" | , | ||
false | , | ||
false | |||
) |
static BasicBlock* isTrivialLoopExitBlock | ( | Loop * | L, |
BasicBlock * | BB | ||
) | [static] |
isTrivialLoopExitBlock - 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 547 of file LoopUnswitch.cpp.
References llvm::LoopBase< BlockT, LoopT >::getHeader(), and isTrivialLoopExitBlockHelper().
static bool isTrivialLoopExitBlockHelper | ( | Loop * | L, |
BasicBlock * | BB, | ||
BasicBlock *& | ExitBB, | ||
std::set< BasicBlock * > & | Visited | ||
) | [static] |
isTrivialLoopExitBlock - 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 512 of file LoopUnswitch.cpp.
References llvm::BasicBlock::begin(), llvm::LoopBase< BlockT, LoopT >::contains(), llvm::BasicBlock::end(), I, llvm::succ_begin(), and llvm::succ_end().
Referenced by isTrivialLoopExitBlock().
static void RemoveFromWorklist | ( | Instruction * | I, |
std::vector< Instruction * > & | Worklist | ||
) | [static] |
RemoveFromWorklist - Remove all instances of I from the worklist vector specified.
Definition at line 928 of file LoopUnswitch.cpp.
References I, and llvm::LibFunc::remove.
Referenced by ReplaceUsesOfWith().
static void ReplaceUsesOfWith | ( | Instruction * | I, |
Value * | V, | ||
std::vector< Instruction * > & | Worklist, | ||
Loop * | L, | ||
LPPassManager * | LPM | ||
) | [static] |
ReplaceUsesOfWith - 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 937 of file LoopUnswitch.cpp.
References llvm::dbgs(), DEBUG, llvm::LPPassManager::deleteSimpleAnalysisValue(), llvm::Instruction::eraseFromParent(), llvm::User::getNumOperands(), llvm::User::getOperand(), RemoveFromWorklist(), llvm::Value::replaceAllUsesWith(), and llvm::Value::users().
STATISTIC | ( | NumBranches | , |
"Number of branches unswitched" | |||
) |
STATISTIC | ( | NumSwitches | , |
"Number of switches 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" | |||
) |
loop Unswitch false |
Definition at line 341 of file LoopUnswitch.cpp.
loop Unswitch loops |
Definition at line 341 of file LoopUnswitch.cpp.
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 341 of file LoopUnswitch.cpp.