LLVM API Documentation
#include "llvm/Transforms/Utils/Local.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/InstructionSimplify.h"
#include "llvm/Analysis/MemoryBuiltins.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/IR/CFG.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DIBuilder.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DebugInfo.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/GetElementPtrTypeIterator.h"
#include "llvm/IR/GlobalAlias.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/MDBuilder.h"
#include "llvm/IR/Metadata.h"
#include "llvm/IR/Operator.h"
#include "llvm/IR/ValueHandle.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/raw_ostream.h"
Go to the source code of this file.
Defines | |
#define | DEBUG_TYPE "local" |
Typedefs | |
typedef SmallVector < BasicBlock *, 16 > | PredBlockVector |
typedef DenseMap< BasicBlock *, Value * > | IncomingValueMap |
Functions | |
STATISTIC (NumRemoved,"Number of unreachable basic blocks removed") | |
static bool | areAllUsesEqual (Instruction *I) |
static bool | CanMergeValues (Value *First, Value *Second) |
static bool | CanPropagatePredecessorsForPHIs (BasicBlock *BB, BasicBlock *Succ) |
static Value * | selectIncomingValueForBlock (Value *OldVal, BasicBlock *BB, IncomingValueMap &IncomingValues) |
Determines the value to use as the phi node input for a block. | |
static void | gatherIncomingValuesToPhi (PHINode *PN, IncomingValueMap &IncomingValues) |
Create a map from block to value for the operands of a given phi. | |
static void | replaceUndefValuesInPhi (PHINode *PN, const IncomingValueMap &IncomingValues) |
Replace the incoming undef values to a phi with the values from a block-to-value map. | |
static void | redirectValuesFromPredecessorsToPhi (BasicBlock *BB, const PredBlockVector &BBPreds, PHINode *PN) |
Replace a value flowing from a block to a phi with potentially multiple instances of that value flowing from the block's predecessors to the phi. | |
static unsigned | enforceKnownAlignment (Value *V, unsigned Align, unsigned PrefAlign, const DataLayout *TD) |
static bool | LdStHasDebugValue (DIVariable &DIVar, Instruction *I) |
See if there is a dbg.value intrinsic for DIVar before I. | |
static bool | isArray (AllocaInst *AI) |
Determine whether this alloca is either a VLA or an array. | |
static void | changeToUnreachable (Instruction *I, bool UseLLVMTrap) |
static void | changeToCall (InvokeInst *II) |
changeToCall - Convert the specified invoke into a normal call. | |
static bool | markAliveBlocks (BasicBlock *BB, SmallPtrSetImpl< BasicBlock * > &Reachable) |
#define DEBUG_TYPE "local" |
typedef DenseMap<BasicBlock *, Value *> IncomingValueMap |
typedef SmallVector<BasicBlock *, 16> PredBlockVector |
static bool areAllUsesEqual | ( | Instruction * | I | ) | [static] |
areAllUsesEqual - Check whether the uses of a value are all the same. This is similar to Instruction::hasOneUse() except this will also return true when there are no uses or multiple uses that all refer to the same value.
Definition at line 366 of file Local.cpp.
References llvm::Value::user_begin(), and llvm::Value::user_end().
Referenced by llvm::RecursivelyDeleteDeadPHINode().
static bool CanMergeValues | ( | Value * | First, |
Value * | Second | ||
) | [static] |
CanMergeValues - Return true if we can choose one of these values to use in place of the other. Note that we will always choose the non-undef value to keep.
Definition at line 541 of file Local.cpp.
Referenced by CanPropagatePredecessorsForPHIs().
static bool CanPropagatePredecessorsForPHIs | ( | BasicBlock * | BB, |
BasicBlock * | Succ | ||
) | [static] |
CanPropagatePredecessorsForPHIs - Return true if we can fold BB, an almost-empty BB ending in an unconditional branch to Succ, into Succ.
Assumption: Succ is the single successor for BB.
Definition at line 550 of file Local.cpp.
References llvm::BasicBlock::begin(), CanMergeValues(), llvm::SmallPtrSetImpl< PtrType >::count(), llvm::dbgs(), DEBUG, llvm::dyn_cast(), llvm::PHINode::getIncomingBlock(), llvm::PHINode::getIncomingValue(), llvm::PHINode::getIncomingValueForBlock(), llvm::Value::getName(), llvm::PHINode::getNumIncomingValues(), llvm::BasicBlock::getSinglePredecessor(), I, llvm::pred_begin(), llvm::pred_end(), and llvm::succ_begin().
Referenced by llvm::TryToSimplifyUncondBranchFromEmptyBlock().
static void changeToCall | ( | InvokeInst * | II | ) | [static] |
changeToCall - Convert the specified invoke into a normal call.
Definition at line 1166 of file Local.cpp.
References llvm::CallInst::Create(), llvm::BranchInst::Create(), llvm::Instruction::eraseFromParent(), llvm::InvokeInst::getAttributes(), llvm::InvokeInst::getCalledValue(), llvm::InvokeInst::getCallingConv(), llvm::Instruction::getDebugLoc(), llvm::InvokeInst::getNormalDest(), llvm::Instruction::getParent(), llvm::InvokeInst::getUnwindDest(), llvm::User::op_begin(), llvm::User::op_end(), llvm::BasicBlock::removePredecessor(), and llvm::Value::replaceAllUsesWith().
Referenced by markAliveBlocks().
static void changeToUnreachable | ( | Instruction * | I, |
bool | UseLLVMTrap | ||
) | [static] |
changeToUnreachable - Insert an unreachable instruction before the specified instruction, making it and the rest of the code in the block dead.
Definition at line 1139 of file Local.cpp.
References llvm::CallInst::Create(), llvm::BasicBlock::end(), llvm::iplist< NodeTy, Traits >::erase(), llvm::UndefValue::get(), llvm::Value::getContext(), llvm::Instruction::getDebugLoc(), llvm::Intrinsic::getDeclaration(), llvm::BasicBlock::getInstList(), llvm::Instruction::getParent(), llvm::BasicBlock::getParent(), llvm::GlobalValue::getParent(), I, llvm::BasicBlock::removePredecessor(), llvm::succ_begin(), and llvm::succ_end().
Referenced by markAliveBlocks().
static unsigned enforceKnownAlignment | ( | Value * | V, |
unsigned | Align, | ||
unsigned | PrefAlign, | ||
const DataLayout * | TD | ||
) | [static] |
enforceKnownAlignment - If the specified pointer points to an object that we control, modify the object's alignment to PrefAlign. This isn't often possible though. If alignment is important, a more reliable approach is to simply align all global variables and allocation instructions to their preferred alignment from the beginning.
Definition at line 896 of file Local.cpp.
References Align(), llvm::DataLayout::exceedsNaturalStackAlignment(), and llvm::Value::stripPointerCasts().
Referenced by llvm::getOrEnforceKnownAlignment().
static void gatherIncomingValuesToPhi | ( | PHINode * | PN, |
IncomingValueMap & | IncomingValues | ||
) | [static] |
Create a map from block to value for the operands of a given phi.
Create a map from block to value for each non-undef value flowing into PN
.
PN | The phi we are collecting the map for. |
IncomingValues | [out] The map from block to value for this phi. |
Definition at line 645 of file Local.cpp.
References llvm::PHINode::getIncomingBlock(), llvm::PHINode::getIncomingValue(), llvm::PHINode::getNumIncomingValues(), and llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT >::insert().
Referenced by redirectValuesFromPredecessorsToPhi().
static bool isArray | ( | AllocaInst * | AI | ) | [static] |
Determine whether this alloca is either a VLA or an array.
Definition at line 1041 of file Local.cpp.
References llvm::SequentialType::getElementType(), llvm::AllocaInst::getType(), llvm::AllocaInst::isArrayAllocation(), and llvm::Type::isArrayTy().
Referenced by llvm::LowerDbgDeclare().
static bool LdStHasDebugValue | ( | DIVariable & | DIVar, |
Instruction * | I | ||
) | [static] |
See if there is a dbg.value intrinsic for DIVar before I.
===---------------------------------------------------------------------===// Dbg Intrinsic utilities
Definition at line 975 of file Local.cpp.
References llvm::iplist< NodeTy, Traits >::begin(), llvm::BasicBlock::getInstList(), llvm::User::getOperand(), and llvm::Instruction::getParent().
Referenced by llvm::ConvertDebugDeclareToDebugValue().
static bool markAliveBlocks | ( | BasicBlock * | BB, |
SmallPtrSetImpl< BasicBlock * > & | Reachable | ||
) | [static] |
Definition at line 1183 of file Local.cpp.
References llvm::BasicBlock::begin(), changeToCall(), changeToUnreachable(), llvm::ConstantFoldTerminator(), llvm::BranchInst::Create(), llvm::SmallVectorBase::empty(), llvm::BasicBlock::end(), llvm::Instruction::eraseFromParent(), llvm::BasicBlock::getTerminator(), llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::SmallVectorImpl< T >::pop_back_val(), llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back(), llvm::succ_begin(), and llvm::succ_end().
Referenced by llvm::removeUnreachableBlocks().
static void redirectValuesFromPredecessorsToPhi | ( | BasicBlock * | BB, |
const PredBlockVector & | BBPreds, | ||
PHINode * | PN | ||
) | [static] |
Replace a value flowing from a block to a phi with potentially multiple instances of that value flowing from the block's predecessors to the phi.
BB | The block with the value flowing into the phi. |
BBPreds | The predecessors of BB. |
PN | The phi that we are updating. |
Definition at line 683 of file Local.cpp.
References llvm::PHINode::addIncoming(), gatherIncomingValuesToPhi(), llvm::PHINode::getIncomingBlock(), llvm::PHINode::getIncomingValue(), llvm::PHINode::getNumIncomingValues(), getParent(), llvm::PHINode::removeIncomingValue(), replaceUndefValuesInPhi(), selectIncomingValueForBlock(), and llvm::SmallVectorTemplateCommon< T, typename >::size().
Referenced by llvm::TryToSimplifyUncondBranchFromEmptyBlock().
static void replaceUndefValuesInPhi | ( | PHINode * | PN, |
const IncomingValueMap & | IncomingValues | ||
) | [static] |
Replace the incoming undef values to a phi with the values from a block-to-value map.
PN | The phi we are replacing the undefs in. |
IncomingValues | A map from block to value. |
Definition at line 661 of file Local.cpp.
References llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT >::end(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT >::find(), llvm::PHINode::getIncomingBlock(), llvm::PHINode::getIncomingValue(), llvm::PHINode::getNumIncomingValues(), and llvm::PHINode::setIncomingValue().
Referenced by redirectValuesFromPredecessorsToPhi().
static Value* selectIncomingValueForBlock | ( | Value * | OldVal, |
BasicBlock * | BB, | ||
IncomingValueMap & | IncomingValues | ||
) | [static] |
Determines the value to use as the phi node input for a block.
Select between OldVal
any value that we know flows from BB
to a particular phi on the basis of which one (if either) is not undef. Update IncomingValues based on the selected value.
OldVal | The value we are considering selecting. |
BB | The block that the value flows in from. |
IncomingValues | A map from block-to-value for other phi inputs that we have examined. |
Definition at line 620 of file Local.cpp.
References llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT >::count(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT >::end(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT >::find(), and llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT >::insert().
Referenced by redirectValuesFromPredecessorsToPhi().
STATISTIC | ( | NumRemoved | , |
"Number of unreachable basic blocks removed" | |||
) |