LLVM  4.0.0
Classes | Public Member Functions | List of all members
llvm::JumpThreadingPass Class Reference

This pass performs 'jump threading', which looks at blocks that have multiple predecessors and multiple successors. More...

#include <JumpThreading.h>

Inheritance diagram for llvm::JumpThreadingPass:
[legend]
Collaboration diagram for llvm::JumpThreadingPass:
[legend]

Public Member Functions

 JumpThreadingPass (int T=-1)
 
bool runImpl (Function &F, TargetLibraryInfo *TLI_, LazyValueInfo *LVI_, bool HasProfileData_, std::unique_ptr< BlockFrequencyInfo > BFI_, std::unique_ptr< BranchProbabilityInfo > BPI_)
 
PreservedAnalyses run (Function &F, FunctionAnalysisManager &AM)
 
void releaseMemory ()
 
void FindLoopHeaders (Function &F)
 FindLoopHeaders - We do not want jump threading to turn proper loop structures into irreducible loops. More...
 
bool ProcessBlock (BasicBlock *BB)
 ProcessBlock - If there are any predecessors whose control can be threaded through to a successor, transform them now. More...
 
bool ThreadEdge (BasicBlock *BB, const SmallVectorImpl< BasicBlock * > &PredBBs, BasicBlock *SuccBB)
 ThreadEdge - We have decided that it is safe and profitable to factor the blocks in PredBBs to one predecessor, then thread an edge from it to SuccBB across BB. More...
 
bool DuplicateCondBranchOnPHIIntoPred (BasicBlock *BB, const SmallVectorImpl< BasicBlock * > &PredBBs)
 DuplicateCondBranchOnPHIIntoPred - PredBB contains an unconditional branch to BB which contains an i1 PHI node and a conditional branch on that PHI. More...
 
bool ComputeValueKnownInPredecessors (Value *V, BasicBlock *BB, jumpthreading::PredValueInfo &Result, jumpthreading::ConstantPreference Preference, Instruction *CxtI=nullptr)
 ComputeValueKnownInPredecessors - Given a basic block BB and a value V, see if we can infer that the value is a known ConstantInt/BlockAddress or undef in any of our predecessors. More...
 
bool ProcessThreadableEdges (Value *Cond, BasicBlock *BB, jumpthreading::ConstantPreference Preference, Instruction *CxtI=nullptr)
 
bool ProcessBranchOnPHI (PHINode *PN)
 ProcessBranchOnPHI - We have an otherwise unthreadable conditional branch on a PHI node in the current block. More...
 
bool ProcessBranchOnXOR (BinaryOperator *BO)
 ProcessBranchOnXOR - We have an otherwise unthreadable conditional branch on a xor instruction in the current block. More...
 
bool ProcessImpliedCondition (BasicBlock *BB)
 
bool SimplifyPartiallyRedundantLoad (LoadInst *LI)
 SimplifyPartiallyRedundantLoad - If LI is an obviously partially redundant load instruction, eliminate it by replacing it with a PHI node. More...
 
bool TryToUnfoldSelect (CmpInst *CondCmp, BasicBlock *BB)
 TryToUnfoldSelect - Look for blocks of the form bb1: a = select br bb. More...
 
bool TryToUnfoldSelectInCurrBB (BasicBlock *BB)
 TryToUnfoldSelectInCurrBB - Look for PHI/Select in the same BB of the form bb: p = phi [false, bb1], [true, bb2], [false, bb3], [true, bb4], ... More...
 

Additional Inherited Members

- Static Public Member Functions inherited from llvm::PassInfoMixin< JumpThreadingPass >
static StringRef name ()
 Gets the name of the pass we are mixed into. More...
 

Detailed Description

This pass performs 'jump threading', which looks at blocks that have multiple predecessors and multiple successors.

If one or more of the predecessors of the block can be proven to always jump to one of the successors, we forward the edge from the predecessor to the successor by duplicating the contents of this block.

An example of when this can occur is code like this:

if () { ... X = 4; } if (X < 3) {

In this case, the unconditional branch at the end of the first if can be revectored to the false side of the second if.

Definition at line 59 of file JumpThreading.h.

Constructor & Destructor Documentation

JumpThreadingPass::JumpThreadingPass ( int  T = -1)

Definition at line 113 of file JumpThreading.cpp.

References BBDuplicateThreshold.

Member Function Documentation

bool JumpThreadingPass::ComputeValueKnownInPredecessors ( Value V,
BasicBlock BB,
jumpthreading::PredValueInfo Result,
jumpthreading::ConstantPreference  Preference,
Instruction CxtI = nullptr 
)

ComputeValueKnownInPredecessors - Given a basic block BB and a value V, see if we can infer that the value is a known ConstantInt/BlockAddress or undef in any of our predecessors.

If so, return the known list of value and pred BB in the result vector.

This returns true if there were any known values.

TODO: Per PR2563, we could infer value range information about a predecessor based on its terminator.

If I is a PHI node, then we know the incoming values for any constants.

Definition at line 375 of file JumpThreading.cpp.

References llvm::APIntOps::And(), assert(), C, llvm::Value::DoPHITranslation(), llvm::dyn_cast(), llvm::SmallVectorImpl< T >::emplace_back(), llvm::SmallVectorBase::empty(), llvm::ConstantInt::get(), llvm::ConstantExpr::get(), llvm::ConstantExpr::getCast(), llvm::ConstantExpr::getCompare(), llvm::Value::getContext(), llvm::Module::getDataLayout(), llvm::ConstantInt::getFalse(), llvm::PHINode::getIncomingBlock(), llvm::PHINode::getIncomingValue(), llvm::Type::getInt1Ty(), getKnownConstant(), llvm::Instruction::getModule(), llvm::ConstantExpr::getNot(), llvm::PHINode::getNumIncomingValues(), llvm::Instruction::getOpcode(), llvm::User::getOperand(), llvm::Instruction::getParent(), getParent(), llvm::Type::getPrimitiveSizeInBits(), llvm::ConstantInt::getTrue(), llvm::Value::getType(), I, i, llvm::Type::isIntegerTy(), llvm::APIntOps::Or(), P, llvm::predecessors(), llvm::SmallVectorTemplateBase< T, isPodLike >::push_back(), SI, llvm::SimplifyCmpInst(), llvm::Sched::Source, llvm::LazyValueInfo::Unknown, llvm::jumpthreading::WantBlockAddress, llvm::jumpthreading::WantInteger, and llvm::APIntOps::Xor().

bool JumpThreadingPass::DuplicateCondBranchOnPHIIntoPred ( BasicBlock BB,
const SmallVectorImpl< BasicBlock * > &  PredBBs 
)
void JumpThreadingPass::FindLoopHeaders ( Function F)

FindLoopHeaders - We do not want jump threading to turn proper loop structures into irreducible loops.

Doing this breaks up the loop nesting hierarchy and pessimizes later transformations. To prevent this from happening, we first have to find the loop headers. Here we approximate this by finding targets of backedges in the CFG.

Note that there definitely are cases when we want to allow threading of edges across a loop header. For example, threading a jump from outside the loop (the preheader) to an exit block of the loop is definitely profitable. It is also almost always profitable to thread backedges from within the loop to exit blocks, and is often profitable to thread backedges to other blocks within the loop (forming a nested loop). This simple analysis is not rich enough to track all of these properties and keep it up-to-date as the CFG mutates, so we don't allow any of these transformations.

Definition at line 341 of file JumpThreading.cpp.

References llvm::FindFunctionBackedges().

bool JumpThreadingPass::ProcessBlock ( BasicBlock BB)
bool JumpThreadingPass::ProcessBranchOnPHI ( PHINode PN)

ProcessBranchOnPHI - We have an otherwise unthreadable conditional branch on a PHI node in the current block.

See if there are any simplifications we can do based on inputs to the phi node.

Definition at line 1290 of file JumpThreading.cpp.

References llvm::PHINode::getIncomingBlock(), llvm::PHINode::getNumIncomingValues(), llvm::Instruction::getParent(), llvm::BasicBlock::getTerminator(), i, and llvm::SmallVectorImpl< T >::resize().

bool JumpThreadingPass::ProcessBranchOnXOR ( BinaryOperator BO)
bool JumpThreadingPass::ProcessImpliedCondition ( BasicBlock BB)
bool JumpThreadingPass::ProcessThreadableEdges ( Value Cond,
BasicBlock BB,
jumpthreading::ConstantPreference  Preference,
Instruction CxtI = nullptr 
)
void llvm::JumpThreadingPass::releaseMemory ( )
inline

Definition at line 96 of file JumpThreading.h.

PreservedAnalyses JumpThreadingPass::run ( Function F,
FunctionAnalysisManager AM 
)
bool JumpThreadingPass::runImpl ( Function F,
TargetLibraryInfo TLI_,
LazyValueInfo LVI_,
bool  HasProfileData_,
std::unique_ptr< BlockFrequencyInfo BFI_,
std::unique_ptr< BranchProbabilityInfo BPI_ 
)
bool JumpThreadingPass::SimplifyPartiallyRedundantLoad ( LoadInst LI)
bool JumpThreadingPass::ThreadEdge ( BasicBlock BB,
const SmallVectorImpl< BasicBlock * > &  PredBBs,
BasicBlock SuccBB 
)

ThreadEdge - We have decided that it is safe and profitable to factor the blocks in PredBBs to one predecessor, then thread an edge from it to SuccBB across BB.

Transform the IR to reflect this change.

Definition at line 1452 of file JumpThreading.cpp.

References llvm::SSAUpdater::AddAvailableValue(), AddPHINodeEntriesForMappedBlock(), llvm::BasicBlock::begin(), llvm::BasicBlock::Create(), llvm::BranchInst::Create(), llvm::dbgs(), DEBUG, llvm::dyn_cast(), llvm::SmallVectorBase::empty(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::end(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::find(), llvm::BasicBlock::getContext(), llvm::Instruction::getDebugLoc(), llvm::PHINode::getIncomingValueForBlock(), llvm::BasicBlock::getInstList(), getJumpThreadDuplicationCost(), llvm::Value::getName(), llvm::User::getNumOperands(), llvm::TerminatorInst::getNumSuccessors(), llvm::User::getOperand(), llvm::Instruction::getParent(), llvm::BasicBlock::getParent(), llvm::TerminatorInst::getSuccessor(), llvm::BasicBlock::getTerminator(), I, i, llvm::SSAUpdater::Initialize(), llvm::BasicBlock::moveAfter(), llvm::SmallVectorImpl< T >::pop_back_val(), llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back(), llvm::iplist_impl< IntrusiveListT, TraitsT >::push_back(), llvm::SSAUpdater::RewriteUse(), llvm::Instruction::setDebugLoc(), llvm::Value::setName(), llvm::User::setOperand(), llvm::TerminatorInst::setSuccessor(), llvm::SimplifyInstructionsInBlock(), and llvm::SmallVectorTemplateCommon< T >::size().

bool JumpThreadingPass::TryToUnfoldSelect ( CmpInst CondCmp,
BasicBlock BB 
)
bool JumpThreadingPass::TryToUnfoldSelectInCurrBB ( BasicBlock BB)

TryToUnfoldSelectInCurrBB - Look for PHI/Select in the same BB of the form bb: p = phi [false, bb1], [true, bb2], [false, bb3], [true, bb4], ...

s = select p, trueval, falseval

And expand the select into a branch structure. This later enables jump-threading over bb in this pass.

Using the similar approach of SimplifyCFG::FoldCondBranchOnPHI(), unfold select if the associated PHI has at least one constant. If the unfolded select is not jump-threaded, it will be folded again in the later optimizations.

Definition at line 1978 of file JumpThreading.cpp.

References llvm::PHINode::addIncoming(), llvm::BasicBlock::begin(), llvm::PHINode::Create(), llvm::dyn_cast(), llvm::Instruction::eraseFromParent(), llvm::SelectInst::getCondition(), llvm::SelectInst::getFalseValue(), llvm::PHINode::getIncomingBlock(), llvm::PHINode::getIncomingValue(), llvm::PHINode::getNumIncomingValues(), llvm::Instruction::getParent(), llvm::SelectInst::getTrueValue(), llvm::Value::getType(), llvm::Value::hasOneUse(), i, llvm::Type::isIntegerTy(), llvm::Value::replaceAllUsesWith(), SI, llvm::SplitBlockAndInsertIfThen(), and llvm::Instruction::user_back().


The documentation for this class was generated from the following files: