LLVM
8.0.1
|
#include "llvm/Transforms/Scalar/JumpThreading.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/Analysis/BlockFrequencyInfo.h"
#include "llvm/Analysis/BranchProbabilityInfo.h"
#include "llvm/Analysis/CFG.h"
#include "llvm/Analysis/ConstantFolding.h"
#include "llvm/Analysis/GlobalsModRef.h"
#include "llvm/Analysis/GuardUtils.h"
#include "llvm/Analysis/InstructionSimplify.h"
#include "llvm/Analysis/LazyValueInfo.h"
#include "llvm/Analysis/Loads.h"
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/Analysis/TargetLibraryInfo.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/CFG.h"
#include "llvm/IR/Constant.h"
#include "llvm/IR/ConstantRange.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DomTreeUpdater.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/IntrinsicInst.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/MDBuilder.h"
#include "llvm/IR/Metadata.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/PassManager.h"
#include "llvm/IR/PatternMatch.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/Use.h"
#include "llvm/IR/User.h"
#include "llvm/IR/Value.h"
#include "llvm/Pass.h"
#include "llvm/Support/BlockFrequency.h"
#include "llvm/Support/BranchProbability.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Transforms/Scalar.h"
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
#include "llvm/Transforms/Utils/Cloning.h"
#include "llvm/Transforms/Utils/Local.h"
#include "llvm/Transforms/Utils/SSAUpdater.h"
#include "llvm/Transforms/Utils/ValueMapper.h"
#include <algorithm>
#include <cassert>
#include <cstddef>
#include <cstdint>
#include <iterator>
#include <memory>
#include <utility>
Go to the source code of this file.
Macros | |
#define | DEBUG_TYPE "jump-threading" |
Functions | |
STATISTIC (NumThreads, "Number of jumps threaded") | |
STATISTIC (NumFolds, "Number of terminators folded") | |
STATISTIC (NumDupes, "Number of branch blocks duplicated to eliminate phi") | |
INITIALIZE_PASS_BEGIN (JumpThreading, "jump-threading", "Jump Threading", false, false) INITIALIZE_PASS_END(JumpThreading | |
static void | updatePredecessorProfileMetadata (PHINode *PN, BasicBlock *BB) |
static void | ReplaceFoldableUses (Instruction *Cond, Value *ToVal) |
static unsigned | getJumpThreadDuplicationCost (BasicBlock *BB, Instruction *StopAt, unsigned Threshold) |
Return the cost of duplicating a piece of this block from first non-phi and before StopAt instruction to thread across it. More... | |
static Constant * | getKnownConstant (Value *Val, ConstantPreference Preference) |
getKnownConstant - Helper method to determine if we can thread over a terminator with the given value as its condition, and if so what value to use for that. More... | |
static unsigned | GetBestDestForJumpOnUndef (BasicBlock *BB) |
GetBestDestForBranchOnUndef - If we determine that the specified block ends in an undefined jump, decide which block is best to revector to. More... | |
static bool | hasAddressTakenAndUsed (BasicBlock *BB) |
static bool | isOpDefinedInBlock (Value *Op, BasicBlock *BB) |
Return true if Op is an instruction defined in the given block. More... | |
static BasicBlock * | FindMostPopularDest (BasicBlock *BB, const SmallVectorImpl< std::pair< BasicBlock *, BasicBlock *>> &PredToDestList) |
FindMostPopularDest - The specified list contains multiple possible threadable destinations. More... | |
static void | AddPHINodeEntriesForMappedBlock (BasicBlock *PHIBB, BasicBlock *OldPred, BasicBlock *NewPred, DenseMap< Instruction *, Value *> &ValueMap) |
AddPHINodeEntriesForMappedBlock - We're adding 'NewPred' as a new predecessor to the PHIBB block. More... | |
Variables | |
static cl::opt< unsigned > | BBDuplicateThreshold ("jump-threading-threshold", cl::desc("Max block size to duplicate for jump threading"), cl::init(6), cl::Hidden) |
static cl::opt< unsigned > | ImplicationSearchThreshold ("jump-threading-implication-search-threshold", cl::desc("The number of predecessors to search for a stronger " "condition to use to thread over a weaker condition"), cl::init(3), cl::Hidden) |
static cl::opt< bool > | PrintLVIAfterJumpThreading ("print-lvi-after-jump-threading", cl::desc("Print the LazyValueInfo cache after JumpThreading"), cl::init(false), cl::Hidden) |
jump | threading |
jump Jump | Threading |
jump Jump | false |
#define DEBUG_TYPE "jump-threading" |
Definition at line 83 of file JumpThreading.cpp.
|
static |
AddPHINodeEntriesForMappedBlock - We're adding 'NewPred' as a new predecessor to the PHIBB block.
If it has PHI nodes, add entries for NewPred using the entries from OldPred (suitably mapped).
Definition at line 1884 of file JumpThreading.cpp.
References llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::end(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::find(), I, and llvm::BasicBlock::phis().
Referenced by llvm::JumpThreadingPass::DuplicateCondBranchOnPHIIntoPred(), and llvm::JumpThreadingPass::ThreadEdge().
|
static |
FindMostPopularDest - The specified list contains multiple possible threadable destinations.
Pick the one that occurs the most frequently in the list.
Definition at line 1509 of file JumpThreading.cpp.
References assert(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::begin(), llvm::SmallVectorImpl< T >::clear(), llvm::SmallVectorBase::empty(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::end(), llvm::Instruction::getNumSuccessors(), llvm::Instruction::getSuccessor(), llvm::BasicBlock::getTerminator(), llvm::is_contained(), and llvm::SmallVectorTemplateBase< T >::push_back().
Referenced by llvm::JumpThreadingPass::ProcessThreadableEdges().
|
static |
GetBestDestForBranchOnUndef - If we determine that the specified block ends in an undefined jump, decide which block is best to revector to.
Since we can pick an arbitrary destination, we pick the successor with the fewest predecessors. This should reduce the in-degree of the others.
Definition at line 948 of file JumpThreading.cpp.
References llvm::Instruction::getNumSuccessors(), llvm::Instruction::getSuccessor(), llvm::BasicBlock::getTerminator(), and llvm::pred_size().
Referenced by llvm::JumpThreadingPass::ProcessBlock(), and llvm::JumpThreadingPass::ProcessThreadableEdges().
|
static |
Return the cost of duplicating a piece of this block from first non-phi and before StopAt instruction to thread across it.
Stop scanning the block when exceeding the threshold. If duplication is impossible, returns ~0U.
Ignore PHI nodes, these will be flattened when duplication happens.
Definition at line 460 of file JumpThreading.cpp.
References assert(), llvm::BasicBlock::getFirstNonPHI(), llvm::Instruction::getParent(), llvm::BasicBlock::getTerminator(), I, and Size.
Referenced by llvm::JumpThreadingPass::DuplicateCondBranchOnPHIIntoPred(), llvm::JumpThreadingPass::ThreadEdge(), and llvm::JumpThreadingPass::ThreadGuard().
|
static |
getKnownConstant - Helper method to determine if we can thread over a terminator with the given value as its condition, and if so what value to use for that.
What kind of value this is depends on whether we want an integer or a block address, but an undef is always accepted. Returns null if Val is null or not an appropriate constant.
Definition at line 557 of file JumpThreading.cpp.
References llvm::dyn_cast(), llvm::Value::stripPointerCasts(), and llvm::jumpthreading::WantBlockAddress.
Referenced by llvm::JumpThreadingPass::ComputeValueKnownInPredecessorsImpl(), and llvm::JumpThreadingPass::ProcessBlock().
|
static |
Definition at line 966 of file JumpThreading.cpp.
References llvm::BlockAddress::get(), llvm::BasicBlock::hasAddressTaken(), llvm::Constant::removeDeadConstantUsers(), and llvm::Value::use_empty().
Referenced by llvm::JumpThreadingPass::ProcessBlock().
|
static |
Return true if Op is an instruction defined in the given block.
Definition at line 1261 of file JumpThreading.cpp.
Referenced by llvm::JumpThreadingPass::SimplifyPartiallyRedundantLoad().
|
static |
Definition at line 435 of file JumpThreading.cpp.
References assert(), llvm::Instruction::eraseFromParent(), llvm::Instruction::getParent(), llvm::Value::getType(), I, llvm::isGuaranteedToTransferExecutionToSuccessor(), llvm::Instruction::mayHaveSideEffects(), llvm::replaceNonLocalUsesWith(), llvm::reverse(), and llvm::Value::use_empty().
Referenced by llvm::JumpThreadingPass::ProcessBlock(), and llvm::JumpThreadingPass::ProcessThreadableEdges().
STATISTIC | ( | NumThreads | , |
"Number of jumps threaded" | |||
) |
STATISTIC | ( | NumFolds | , |
"Number of terminators folded" | |||
) |
STATISTIC | ( | NumDupes | , |
"Number of branch blocks duplicated to eliminate phi" | |||
) |
|
static |
Definition at line 205 of file JumpThreading.cpp.
References llvm::AMDGPUISD::BFI, llvm::dbgs(), llvm::dyn_cast(), llvm::Instruction::extractProfMetadata(), F(), llvm::BranchProbability::getBranchProbability(), llvm::BranchProbability::getCompl(), llvm::BasicBlock::getContext(), llvm::PHINode::getIncomingBlock(), llvm::PHINode::getIncomingValue(), llvm::Value::getName(), llvm::BranchProbability::getNumerator(), llvm::PHINode::getNumIncomingValues(), llvm::Instruction::getParent(), llvm::BranchInst::getSuccessor(), llvm::BasicBlock::getTerminator(), llvm::ConstantInt::getType(), llvm::Function::hasProfileData(), llvm::BranchInst::isConditional(), llvm::Type::isIntegerTy(), llvm::ConstantInt::isOne(), llvm::DomTreeUpdater::Lazy, llvm::LLVMContext::MD_prof, PrintLVIAfterJumpThreading, llvm::SmallVectorTemplateBase< T >::push_back(), llvm::DominatorTreeBase< NodeT, IsPostDom >::reset(), llvm::JumpThreadingPass::runImpl(), runOnFunction(), and llvm::Instruction::setMetadata().
Referenced by llvm::JumpThreadingPass::ProcessBlock().
|
static |
Referenced by llvm::JumpThreadingPass::JumpThreadingPass().
jump Jump false |
Definition at line 158 of file JumpThreading.cpp.
|
static |
Referenced by llvm::JumpThreadingPass::ProcessImpliedCondition().
|
static |
Referenced by updatePredecessorProfileMetadata().
jump threading |
Definition at line 158 of file JumpThreading.cpp.
jump Jump Threading |
Definition at line 158 of file JumpThreading.cpp.