|
LLVM
4.0.0
|
#include "llvm/Transforms/Utils/Local.h"#include "llvm/ADT/DenseMap.h"#include "llvm/ADT/DenseSet.h"#include "llvm/ADT/Hashing.h"#include "llvm/ADT/STLExtras.h"#include "llvm/ADT/SetVector.h"#include "llvm/ADT/SmallPtrSet.h"#include "llvm/ADT/Statistic.h"#include "llvm/Analysis/EHPersonalities.h"#include "llvm/Analysis/InstructionSimplify.h"#include "llvm/Analysis/MemoryBuiltins.h"#include "llvm/Analysis/LazyValueInfo.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/PatternMatch.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.
Macros | |
| #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) |
| areAllUsesEqual - Check whether the uses of a value are all the same. More... | |
| static bool | simplifyAndDCEInstruction (Instruction *I, SmallSetVector< Instruction *, 16 > &WorkList, const DataLayout &DL, const TargetLibraryInfo *TLI) |
| static bool | CanMergeValues (Value *First, Value *Second) |
| CanMergeValues - Return true if we can choose one of these values to use in place of the other. More... | |
| static bool | CanPropagatePredecessorsForPHIs (BasicBlock *BB, BasicBlock *Succ) |
| CanPropagatePredecessorsForPHIs - Return true if we can fold BB, an almost-empty BB ending in an unconditional branch to Succ, into Succ. More... | |
| static Value * | selectIncomingValueForBlock (Value *OldVal, BasicBlock *BB, IncomingValueMap &IncomingValues) |
| Determines the value to use as the phi node input for a block. More... | |
| static void | gatherIncomingValuesToPhi (PHINode *PN, IncomingValueMap &IncomingValues) |
| Create a map from block to value for the operands of a given phi. More... | |
| 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. More... | |
| 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. More... | |
| static unsigned | enforceKnownAlignment (Value *V, unsigned Align, unsigned PrefAlign, const DataLayout &DL) |
| enforceKnownAlignment - If the specified pointer points to an object that we control, modify the object's alignment to PrefAlign. More... | |
| static bool | LdStHasDebugValue (DILocalVariable *DIVar, DIExpression *DIExpr, Instruction *I) |
| ===---------------------------------------------------------------——===// Dbg Intrinsic utilities More... | |
| static bool | PhiHasDebugValue (DILocalVariable *DIVar, DIExpression *DIExpr, PHINode *APN) |
| See if there is a dbg.value intrinsic for DIVar for the PHI node. More... | |
| static bool | isArray (AllocaInst *AI) |
| Determine whether this alloca is either a VLA or an array. More... | |
| static void | DIExprAddDeref (SmallVectorImpl< uint64_t > &Expr) |
| static void | DIExprAddOffset (SmallVectorImpl< uint64_t > &Expr, int Offset) |
| static DIExpression * | BuildReplacementDIExpr (DIBuilder &Builder, DIExpression *DIExpr, bool Deref, int Offset) |
| static void | replaceOneDbgValueForAlloca (DbgValueInst *DVI, Value *NewAddress, DIBuilder &Builder, int Offset) |
| static void | changeToCall (InvokeInst *II) |
| changeToCall - Convert the specified invoke into a normal call. More... | |
| static bool | markAliveBlocks (Function &F, SmallPtrSetImpl< BasicBlock * > &Reachable) |
| static const Optional< BitPart > & | collectBitParts (Value *V, bool MatchBSwaps, bool MatchBitReversals, std::map< Value *, Optional< BitPart >> &BPS) |
| Analyze the specified subexpression and see if it is capable of providing pieces of a bswap or bitreverse. More... | |
| static bool | bitTransformIsCorrectForBSwap (unsigned From, unsigned To, unsigned BitWidth) |
| static bool | bitTransformIsCorrectForBitReverse (unsigned From, unsigned To, unsigned BitWidth) |
| typedef DenseMap<BasicBlock *, Value *> IncomingValueMap |
| typedef SmallVector<BasicBlock *, 16> PredBlockVector |
|
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 393 of file Local.cpp.
References llvm::Value::user_begin(), and llvm::Value::user_end().
Referenced by llvm::RecursivelyDeleteDeadPHINode().
|
static |
Definition at line 1987 of file Local.cpp.
Referenced by llvm::recognizeBSwapOrBitReverseIdiom().
Definition at line 1976 of file Local.cpp.
Referenced by llvm::recognizeBSwapOrBitReverseIdiom().
|
static |
Definition at line 1268 of file Local.cpp.
References llvm::SmallVectorImpl< T >::append(), llvm::DIBuilder::createExpression(), DIExprAddDeref(), DIExprAddOffset(), llvm::DIExpression::elements_begin(), and llvm::DIExpression::elements_end().
Referenced by llvm::replaceDbgDeclare().
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 620 of file Local.cpp.
Referenced by CanPropagatePredecessorsForPHIs().
|
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 629 of file Local.cpp.
References assert(), 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 |
changeToCall - Convert the specified invoke into a normal call.
Definition at line 1404 of file Local.cpp.
References llvm::InvokeInst::arg_begin(), llvm::InvokeInst::arg_end(), AMDGPU::RuntimeMD::KeyName::Args, 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::OperandBundleUser< InstrTy, OpIteratorTy >::getOperandBundlesAsDefs(), llvm::Instruction::getParent(), llvm::InvokeInst::getUnwindDest(), llvm::BasicBlock::removePredecessor(), llvm::Value::replaceAllUsesWith(), llvm::CallInst::setAttributes(), llvm::CallInst::setCallingConv(), llvm::Instruction::setDebugLoc(), and llvm::Value::takeName().
Referenced by markAliveBlocks(), and llvm::removeUnwindEdge().
|
static |
Analyze the specified subexpression and see if it is capable of providing pieces of a bswap or bitreverse.
The subexpression provides a potential piece of a bswap or bitreverse if it can be proven that each non-zero bit in the output of the expression came from a corresponding bit in some other value. This function is recursive, and the end result is a mapping of bitnumber to bitnumber. It is the caller's responsibility to validate that the bitnumber to bitnumber mapping is correct for a bswap or bitreverse.
For example, if the current subexpression if "(shl i32 %X, 24)" then we know that the expression deposits the low byte of X into the high byte of the result and that all other bits are zero. This expression is accepted and a BitPart is returned with Provider set to X and Provenance[24-31] set to [0-7].
To avoid revisiting values, the BitPart results are memoized into the provided map. To avoid unnecessary copying of BitParts, BitParts are constructed in-place in the BPS map. Because of this BPS needs to store BitParts objects, not pointers. As we need the concept of a nullptr BitParts (Value has been analyzed and the analysis failed), we an Optional type instead to provide the same functionality.
Because we pass around references into BPS, we must use a container that does not invalidate internal references (std::map instead of DenseMap).
Definition at line 1858 of file Local.cpp.
References A, llvm::APIntOps::And(), B, llvm::tgtok::Bit, for(), getBitWidth(), llvm::Value::getType(), I, i, llvm::None, llvm::APIntOps::Or(), and P.
Referenced by llvm::recognizeBSwapOrBitReverseIdiom().
|
static |
Definition at line 1254 of file Local.cpp.
References llvm::SmallVectorTemplateBase< T, isPodLike >::push_back().
Referenced by BuildReplacementDIExpr(), and replaceOneDbgValueForAlloca().
|
static |
Definition at line 1258 of file Local.cpp.
References llvm::SmallVectorTemplateBase< T, isPodLike >::push_back().
Referenced by BuildReplacementDIExpr(), and replaceOneDbgValueForAlloca().
|
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 973 of file Local.cpp.
References assert(), llvm::DataLayout::exceedsNaturalStackAlignment(), and llvm::Value::stripPointerCasts().
Referenced by llvm::getOrEnforceKnownAlignment().
|
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 724 of file Local.cpp.
References llvm::PHINode::getIncomingBlock(), llvm::PHINode::getIncomingValue(), llvm::PHINode::getNumIncomingValues(), i, and llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::insert().
Referenced by redirectValuesFromPredecessorsToPhi().
|
static |
Determine whether this alloca is either a VLA or an array.
Definition at line 1178 of file Local.cpp.
References llvm::PointerType::getElementType(), llvm::AllocaInst::getType(), llvm::AllocaInst::isArrayAllocation(), and llvm::Type::isArrayTy().
Referenced by llvm::LowerDbgDeclare().
|
static |
===---------------------------------------------------------------——===// Dbg Intrinsic utilities
See if there is a dbg.value intrinsic for DIVar before I.
Definition at line 1053 of file Local.cpp.
References llvm::BasicBlock::getInstList(), llvm::User::getOperand(), and llvm::Instruction::getParent().
Referenced by llvm::ConvertDebugDeclareToDebugValue().
|
static |
Definition at line 1461 of file Local.cpp.
References llvm::canSimplifyInvokeNoUnwind(), changeToCall(), llvm::changeToUnreachable(), llvm::ConstantFoldTerminator(), llvm::BranchInst::Create(), E, llvm::Instruction::eraseFromParent(), llvm::Function::front(), llvm::BasicBlock::getFirstNonPHI(), llvm::hash_combine_range(), I, llvm::SmallPtrSetImpl< PtrType >::insert(), isEqual(), llvm::Instruction::isIdenticalTo(), llvm::PatternMatch::m_CombineOr(), llvm::PatternMatch::m_Undef(), llvm::PatternMatch::m_Zero(), llvm::PatternMatch::match(), llvm::SmallVectorImpl< T >::pop_back_val(), Ptr, llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back(), SI, llvm::Successor, llvm::successors(), llvm::MCID::Terminator, llvm::User::value_op_begin(), and llvm::User::value_op_end().
Referenced by llvm::removeUnreachableBlocks().
|
static |
See if there is a dbg.value intrinsic for DIVar for the PHI node.
Definition at line 1072 of file Local.cpp.
References assert(), and llvm::FindAllocaDbgValues().
Referenced by llvm::ConvertDebugDeclareToDebugValue().
|
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 762 of file Local.cpp.
References llvm::PHINode::addIncoming(), assert(), gatherIncomingValuesToPhi(), llvm::PHINode::getIncomingBlock(), llvm::PHINode::getIncomingValue(), llvm::PHINode::getNumIncomingValues(), getParent(), i, llvm::PHINode::removeIncomingValue(), replaceUndefValuesInPhi(), selectIncomingValueForBlock(), and llvm::SmallVectorTemplateCommon< T, typename >::size().
Referenced by llvm::TryToSimplifyUncondBranchFromEmptyBlock().
|
static |
Definition at line 1312 of file Local.cpp.
References llvm::SmallVectorImpl< T >::append(), assert(), llvm::DIBuilder::createExpression(), DIExprAddDeref(), DIExprAddOffset(), llvm::Instruction::eraseFromParent(), llvm::Instruction::getDebugLoc(), llvm::DbgValueInst::getExpression(), llvm::DbgValueInst::getOffset(), llvm::DbgValueInst::getVariable(), and llvm::DIBuilder::insertDbgValueIntrinsic().
Referenced by llvm::replaceDbgValueForAlloca().
|
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 740 of file Local.cpp.
References llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::end(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::find(), llvm::PHINode::getIncomingBlock(), llvm::PHINode::getIncomingValue(), llvm::PHINode::getNumIncomingValues(), i, and llvm::PHINode::setIncomingValue().
Referenced by redirectValuesFromPredecessorsToPhi().
|
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 699 of file Local.cpp.
References assert(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::count(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::end(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::find(), and llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::insert().
Referenced by redirectValuesFromPredecessorsToPhi().
|
static |
Definition at line 433 of file Local.cpp.
References llvm::Instruction::eraseFromParent(), llvm::User::getNumOperands(), llvm::User::getOperand(), i, llvm::SetVector< T, SmallVector< T, N >, SmallDenseSet< T, N > >::insert(), llvm::isInstructionTriviallyDead(), llvm::Value::replaceAllUsesWith(), llvm::User::setOperand(), llvm::SimplifyInstruction(), llvm::Value::use_empty(), and llvm::Value::users().
Referenced by llvm::SimplifyInstructionsInBlock().
| STATISTIC | ( | NumRemoved | , |
| "Number of unreachable basic blocks removed" | |||
| ) |
1.8.6