LLVM: lib/Transforms/Utils/Local.cpp File Reference (original) (raw)

Go to the source code of this file.

Typedefs
using PredBlockVector = SmallVector< BasicBlock *, 16 >
using IncomingValueMap = SmallDenseMap< BasicBlock *, Value *, 16 >
using DbgValReplacement = std::optional< DIExpression * >
A replacement for a dbg.value expression.
Functions
STATISTIC (NumRemoved, "Number of unreachable basic blocks removed")
STATISTIC (NumPHICSEs, "Number of PHI's that got CSE'd")
static bool areAllUsesEqual (Instruction *I)
areAllUsesEqual - Check whether the uses of a value are all the same.
static bool simplifyAndDCEInstruction (Instruction *I, SmallSetVector< Instruction *, 16 > &WorkList, const DataLayout &DL, const TargetLibraryInfo *TLI)
static bool CanMergeValues (Value *First, Value *Second)
Return true if we can choose one of these values to use in place of the other.
static bool CanPropagatePredecessorsForPHIs (BasicBlock *BB, BasicBlock *Succ, const SmallPtrSetImpl< BasicBlock * > &BBPreds)
Return true if we can fold BB, an almost-empty BB ending in an unconditional branch to Succ, into 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 bool CanRedirectPredsOfEmptyBBToSucc (BasicBlock *BB, BasicBlock *Succ, const SmallPtrSetImpl< BasicBlock * > &BBPreds, BasicBlock *&CommonPred)
static bool introduceTooManyPhiEntries (BasicBlock *BB, BasicBlock *Succ)
Check whether removing BB will make the phis in its Succ have too many incoming entries.
static void redirectValuesFromPredecessorsToPhi (BasicBlock *BB, const PredBlockVector &BBPreds, PHINode *PN, BasicBlock *CommonPred)
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 bool EliminateDuplicatePHINodesNaiveImpl (BasicBlock *BB, SmallPtrSetImpl< PHINode * > &ToRemove)
static bool EliminateDuplicatePHINodesSetBasedImpl (BasicBlock *BB, SmallPtrSetImpl< PHINode * > &ToRemove)
static bool PhiHasDebugValue (DILocalVariable *DIVar, DIExpression *DIExpr, PHINode *APN)
===------------------------------------------------------------------—===// Dbg Intrinsic utilities
static bool valueCoversEntireFragment (Type *ValTy, DbgVariableIntrinsic *DII)
Check if the alloc size of ValTy is large enough to cover the variable (or fragment of the variable) described by DII.
static bool valueCoversEntireFragment (Type *ValTy, DbgVariableRecord *DVR)
static void insertDbgValueOrDbgVariableRecord (DIBuilder &Builder, Value *DV, DILocalVariable *DIVar, DIExpression *DIExpr, const DebugLoc &NewLoc, BasicBlock::iterator Instr)
static void insertDbgValueOrDbgVariableRecordAfter (DIBuilder &Builder, Value *DV, DILocalVariable *DIVar, DIExpression *DIExpr, const DebugLoc &NewLoc, BasicBlock::iterator Instr)
static DIExpression * dropInitialDeref (const DIExpression *DIExpr)
static bool isArray (AllocaInst *AI)
Determine whether this alloca is either a VLA or an array.
static bool isStructure (AllocaInst *AI)
Determine whether this alloca is a structure.
static void insertDbgVariableRecordsForPHIs (BasicBlock *BB, SmallVectorImpl< PHINode * > &InsertedPHIs)
static void updateOneDbgValueForAlloca (const DebugLoc &Loc, DILocalVariable *DIVar, DIExpression *DIExpr, Value *NewAddress, DbgValueInst *DVI, DbgVariableRecord *DVR, DIBuilder &Builder, int Offset)
template<typename T >
static void salvageDbgAssignAddress (T *Assign)
Value * getSalvageOpsForGEP (GetElementPtrInst *GEP, const DataLayout &DL, uint64_t CurrentLocOps, SmallVectorImpl< uint64_t > &Opcodes, SmallVectorImpl< Value * > &AdditionalValues)
uint64_t getDwarfOpForBinOp (Instruction::BinaryOps Opcode)
static void handleSSAValueOperands (uint64_t CurrentLocOps, SmallVectorImpl< uint64_t > &Opcodes, SmallVectorImpl< Value * > &AdditionalValues, Instruction *I)
Value * getSalvageOpsForBinOp (BinaryOperator *BI, uint64_t CurrentLocOps, SmallVectorImpl< uint64_t > &Opcodes, SmallVectorImpl< Value * > &AdditionalValues)
uint64_t getDwarfOpForIcmpPred (CmpInst::Predicate Pred)
Value * getSalvageOpsForIcmpOp (ICmpInst *Icmp, uint64_t CurrentLocOps, SmallVectorImpl< uint64_t > &Opcodes, SmallVectorImpl< Value * > &AdditionalValues)
static bool rewriteDebugUsers (Instruction &From, Value &To, Instruction &DomPoint, DominatorTree &DT, function_ref< DbgValReplacement(DbgVariableIntrinsic &DII)> RewriteExpr, function_ref< DbgValReplacement(DbgVariableRecord &DVR)> RewriteDVRExpr)
Point debug users of From to To using exprs given by RewriteExpr, possibly moving/undefing users to prevent use-before-def.
static bool isBitCastSemanticsPreserving (const DataLayout &DL, Type *FromTy, Type *ToTy)
Check if a bitcast between a value of type FromTy to type ToTy would losslessly preserve the bits and semantics of the value.
static bool markAliveBlocks (Function &F, SmallPtrSetImpl< BasicBlock * > &Reachable, DomTreeUpdater *DTU=nullptr)
static void combineMetadata (Instruction *K, const Instruction *J, bool DoesKMove, bool AAOnly=false)
If AAOnly is set, only intersect alias analysis metadata and preserve other known metadata.
template<typename RootType , typename ShouldReplaceFn >
static unsigned replaceDominatedUsesWith (Value *From, Value *To, const RootType &Root, const ShouldReplaceFn &ShouldReplace)
static const std::optional< BitPart > & collectBitParts (Value *V, bool MatchBSwaps, bool MatchBitReversals, std::map< Value *, std::optional< BitPart > > &BPS, int Depth, bool &FoundRoot)
Analyze the specified subexpression and see if it is capable of providing pieces of a bswap or bitreverse.
static bool bitTransformIsCorrectForBSwap (unsigned From, unsigned To, unsigned BitWidth)
static bool bitTransformIsCorrectForBitReverse (unsigned From, unsigned To, unsigned BitWidth)
Variables
cl::opt< bool > UseNewDbgInfoFormat
static cl::opt< bool > PHICSEDebugHash ("phicse-debug-hash", cl::init(false), cl::Hidden, cl::desc("Perform extra assertion checking to verify that PHINodes's hash " "function is well-behaved w.r.t. its isEqual predicate"))
static cl::opt< unsigned > PHICSENumPHISmallSize ("phicse-num-phi-smallsize", cl::init(32), cl::Hidden, cl::desc("When the basic block contains not more than this number of PHI nodes, " "perform a (faster!) exhaustive search instead of set-driven one."))
static cl::opt< unsigned > MaxPhiEntriesIncreaseAfterRemovingEmptyBlock ("max-phi-entries-increase-after-removing-empty-block", cl::init(1000), cl::Hidden, cl::desc("Stop removing an empty block if removing it will introduce more " "than this number of phi entries in its successor"))
static const unsigned BitPartRecursionMaxDepth = 48

DEBUG_TYPE

#define DEBUG_TYPE "local"

DbgValReplacement

A replacement for a dbg.value expression.

Definition at line 2666 of file Local.cpp.

IncomingValueMap

PredBlockVector

areAllUsesEqual()

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 638 of file Local.cpp.

References I.

Referenced by llvm::RecursivelyDeleteDeadPHINode().

bitTransformIsCorrectForBitReverse()

bitTransformIsCorrectForBSwap()

CanMergeValues()

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 871 of file Local.cpp.

References assert(), llvm::BasicBlock::begin(), CanMergeValues(), llvm::SmallPtrSetImpl< PtrType >::count(), llvm::dbgs(), llvm::PHINode::getIncomingBlock(), llvm::PHINode::getIncomingValue(), llvm::PHINode::getIncomingValueForBlock(), llvm::Value::getName(), llvm::PHINode::getNumIncomingValues(), llvm::ilist_detail::node_parent_access< NodeTy, ParentTy >::getParent(), llvm::BasicBlock::getSinglePredecessor(), I, LLVM_DEBUG, and llvm::succ_begin().

Referenced by llvm::TryToSimplifyUncondBranchFromEmptyBlock().

CanRedirectPredsOfEmptyBBToSucc()

collectBitParts()

static const std::optional< BitPart > & collectBitParts ( Value * V, bool MatchBSwaps, bool MatchBitReversals, std::map< Value *, std::optional< BitPart > > & BPS, int Depth, bool & FoundRoot ) 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 proved 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].

For vector types, all analysis is performed at the per-element level. No cross-element analysis is supported (shuffle/insertion/reduction), and all constant masks must be splatted across all elements.

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 3860 of file Local.cpp.

References A, B, BitPartRecursionMaxDepth, llvm::BitWidth, llvm::CallingConv::C, collectBitParts(), llvm::dbgs(), llvm::Depth, for(), getIntrinsicID(), llvm::APInt::getZExtValue(), I, LHS, LLVM_DEBUG, llvm::PatternMatch::m_And(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_BitReverse(), llvm::PatternMatch::m_BSwap(), llvm::PatternMatch::m_FShl(), llvm::PatternMatch::m_FShr(), llvm::PatternMatch::m_LogicalShift(), llvm::PatternMatch::m_Or(), llvm::PatternMatch::m_Trunc(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_ZExt(), llvm::PatternMatch::match(), P, llvm::APInt::popcount(), RHS, llvm::APInt::uge(), X, and Y.

Referenced by collectBitParts(), and llvm::recognizeBSwapOrBitReverseIdiom().

combineMetadata()

If AAOnly is set, only intersect alias analysis metadata and preserve other known metadata.

Unknown metadata is always dropped.

Definition at line 3313 of file Local.cpp.

References llvm::MMRAMetadata::combine(), llvm::MDNode::getMergedCallsiteMetadata(), llvm::MDNode::getMergedMemProfMetadata(), llvm::MDNode::getMergedProfMetadata(), llvm::Instruction::getMetadata(), llvm::MDNode::getMostGenericAliasScope(), llvm::MDNode::getMostGenericAlignmentOrDereferenceable(), llvm::MDNode::getMostGenericFPMath(), llvm::MDNode::getMostGenericNoaliasAddrspace(), llvm::MDNode::getMostGenericRange(), llvm::MDNode::getMostGenericTBAA(), llvm::MDNode::intersect(), llvm::intersectAccessGroups(), and llvm_unreachable.

Referenced by llvm::combineAAMetadata(), and llvm::combineMetadataForCSE().

dropInitialDeref()

EliminateDuplicatePHINodesNaiveImpl()

EliminateDuplicatePHINodesSetBasedImpl()

Definition at line 1428 of file Local.cpp.

References assert(), llvm::BasicBlock::begin(), llvm::PHINode::block_begin(), llvm::PHINode::block_end(), llvm::detail::DenseSetImpl< ValueT, MapTy, ValueInfoT >::clear(), getHashValueImpl(), llvm::hash_combine(), llvm::hash_combine_range(), I, llvm::detail::DenseSetImpl< ValueT, MapTy, ValueInfoT >::insert(), isEqual(), isEqualImpl(), isSentinel(), LHS, PHICSEDebugHash, PHICSENumPHISmallSize, llvm::detail::DenseSetImpl< ValueT, MapTy, ValueInfoT >::reserve(), RHS, ToRemove, llvm::User::value_op_begin(), and llvm::User::value_op_end().

Referenced by llvm::EliminateDuplicatePHINodes().

gatherIncomingValuesToPhi()

getDwarfOpForBinOp()

getDwarfOpForIcmpPred()

getSalvageOpsForBinOp()

getSalvageOpsForGEP()

Definition at line 2461 of file Local.cpp.

References llvm::SmallVectorImpl< T >::append(), llvm::DIExpression::appendOffset(), assert(), llvm::SmallVectorTemplateCommon< T, typename >::begin(), llvm::BitWidth, DL, llvm::dwarf::DW_OP_LLVM_arg, llvm::MapVector< KeyT, ValueT, MapType, VectorType >::empty(), GEP, llvm::APInt::getSExtValue(), llvm::SmallVectorImpl< T >::insert(), llvm::Offset, and llvm::SmallVectorTemplateBase< T, bool >::push_back().

Referenced by llvm::salvageDebugInfoImpl().

getSalvageOpsForIcmpOp()

handleSSAValueOperands()

insertDbgValueOrDbgVariableRecord()

insertDbgValueOrDbgVariableRecordAfter()

insertDbgVariableRecordsForPHIs()

Definition at line 2078 of file Local.cpp.

References assert(), llvm::DbgVariableRecord::clone(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::end(), llvm::MapVector< KeyT, ValueT, MapType, VectorType >::end(), llvm::BasicBlock::end(), llvm::filterDbgVars(), llvm::MapVector< KeyT, ValueT, MapType, VectorType >::find(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::find(), llvm::BasicBlock::getFirstInsertionPt(), llvm::BasicBlock::getFirstNonPHI(), I, llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::insert(), llvm::MapVector< KeyT, ValueT, MapType, VectorType >::insert(), llvm::BasicBlock::insertDbgRecordBefore(), llvm::is_contained(), llvm::Instruction::isEHPad(), llvm::DbgVariableRecord::location_ops(), PHI, llvm::DbgVariableRecord::replaceVariableLocationOp(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::size(), and llvm::SmallVectorBase< Size_T >::size().

Referenced by llvm::insertDebugValuesForPHIs().

introduceTooManyPhiEntries()

isArray()

isBitCastSemanticsPreserving()

Check if a bitcast between a value of type FromTy to type ToTy would losslessly preserve the bits and semantics of the value.

This predicate is symmetric, i.e swapping FromTy and ToTy should give the same result.

Note that Type::canLosslesslyBitCastTo is not suitable here because it allows semantically unequivalent bitcasts, such as <2 x i64> -> <4 x i32>, and also does not allow lossless pointer <-> integer conversions.

Definition at line 2769 of file Local.cpp.

References DL, and llvm::Type::isIntOrPtrTy().

Referenced by llvm::replaceAllDbgUsesWith().

isStructure()

markAliveBlocks()

Definition at line 3038 of file Local.cpp.

References llvm::canSimplifyInvokeNoUnwind(), llvm::changeToCall(), llvm::changeToUnreachable(), llvm::ConstantFoldTerminator(), llvm::BranchInst::Create(), llvm::BasicBlock::Create(), llvm::SmallVectorBase< Size_T >::empty(), F, llvm::BasicBlock::getFirstNonPHI(), llvm::Value::getName(), llvm::hash_combine_range(), I, II, llvm::SmallPtrSetImpl< PtrType >::insert(), isEqual(), LHS, llvm::PatternMatch::m_CombineOr(), llvm::PatternMatch::m_Undef(), llvm::PatternMatch::m_Zero(), llvm::PatternMatch::match(), llvm::NullPointerIsDefined(), llvm::SmallVectorImpl< T >::pop_back_val(), Ptr, llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::BasicBlock::removePredecessor(), RHS, llvm::Successor, llvm::successors(), llvm::User::value_op_begin(), and llvm::User::value_op_end().

Referenced by llvm::removeUnreachableBlocks().

PhiHasDebugValue()

redirectValuesFromPredecessorsToPhi()

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.

Parameters

BB The block with the value flowing into the phi.
BBPreds The predecessors of BB.
PN The phi that we are updating.
CommonPred The common predecessor of BB and PN's BasicBlock

Definition at line 1089 of file Local.cpp.

References llvm::PHINode::addIncoming(), assert(), gatherIncomingValuesToPhi(), llvm::PHINode::getIncomingBlock(), llvm::PHINode::getIncomingValue(), llvm::PHINode::getIncomingValueForBlock(), llvm::PHINode::getNumIncomingValues(), getParent(), llvm::PHINode::removeIncomingValue(), replaceUndefValuesInPhi(), and selectIncomingValueForBlock().

Referenced by llvm::TryToSimplifyUncondBranchFromEmptyBlock().

replaceDominatedUsesWith()

template<typename RootType , typename ShouldReplaceFn >

replaceUndefValuesInPhi()

Replace the incoming undef values to a phi with the values from a block-to-value map.

Parameters

PN The phi we are replacing the undefs in.
IncomingValues A map from block to value.

Definition at line 983 of file Local.cpp.

References llvm::count_if(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::end(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::find(), llvm::UndefValue::get(), llvm::PHINode::getIncomingBlock(), llvm::PHINode::getIncomingValue(), llvm::PHINode::getNumIncomingValues(), llvm::Value::getType(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::PHINode::setIncomingValue(), and llvm::SmallVectorBase< Size_T >::size().

Referenced by redirectValuesFromPredecessorsToPhi().

rewriteDebugUsers()

Point debug users of From to To using exprs given by RewriteExpr, possibly moving/undefing users to prevent use-before-def.

Returns true if changes are made.

Definition at line 2671 of file Local.cpp.

References llvm::SmallPtrSetImpl< PtrType >::count(), llvm::dbgs(), llvm::DominatorTree::dominates(), llvm::SmallPtrSetImplBase::empty(), llvm::SmallVectorBase< Size_T >::empty(), llvm::findDbgUsers(), From, llvm::DbgRecord::getMarker(), llvm::Instruction::getNextNonDebugInstruction(), llvm::ilist_detail::node_parent_access< NodeTy, ParentTy >::getParent(), llvm::SmallPtrSetImpl< PtrType >::insert(), LLVM_DEBUG, llvm::DbgMarker::MarkedInstr, llvm::Instruction::moveAfter(), llvm::DbgRecord::removeFromParent(), llvm::DbgVariableRecord::replaceVariableLocationOp(), llvm::DbgVariableIntrinsic::replaceVariableLocationOp(), llvm::salvageDebugInfo(), llvm::DbgVariableRecord::setExpression(), llvm::DbgVariableIntrinsic::setExpression(), and Users.

Referenced by llvm::replaceAllDbgUsesWith().

salvageDbgAssignAddress()

template<typename T >

static void salvageDbgAssignAddress ( T * Assign) static

selectIncomingValueForBlock()

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.

Parameters

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.

Returns

the selected value.

Definition at line 942 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().

simplifyAndDCEInstruction()

STATISTIC() [1/2]

STATISTIC ( NumPHICSEs ,
"Number of PHI's that got CSE'd"
)

STATISTIC() [2/2]

STATISTIC ( NumRemoved ,
"Number of unreachable basic blocks removed"
)

updateOneDbgValueForAlloca()

valueCoversEntireFragment() [1/2]

Check if the alloc size of ValTy is large enough to cover the variable (or fragment of the variable) described by DII.

This is primarily intended as a helper for the different ConvertDebugDeclareToDebugValue functions. The dbg.declare that is converted describes an alloca'd variable, so we need to use the alloc size of the value when doing the comparison. E.g. an i1 value will be identified as covering an n-bit fragment, if the store size of i1 is at least n bits.

Definition at line 1641 of file Local.cpp.

References assert(), DL, llvm::DIExpression::getActiveBits(), llvm::Instruction::getDataLayout(), llvm::DbgVariableIntrinsic::getExpression(), llvm::TypeSize::getFixed(), llvm::DbgVariableIntrinsic::getNumVariableLocationOps(), llvm::DbgVariableIntrinsic::getVariable(), llvm::DbgVariableIntrinsic::getVariableLocationOp(), and llvm::DbgVariableIntrinsic::isAddressOfVariable().

Referenced by llvm::ConvertDebugDeclareToDebugValue().

valueCoversEntireFragment() [2/2]

Definition at line 1668 of file Local.cpp.

References assert(), DL, llvm::DIExpression::getActiveBits(), llvm::Module::getDataLayout(), llvm::DbgVariableRecord::getExpression(), llvm::TypeSize::getFixed(), llvm::DbgRecord::getModule(), llvm::DbgVariableRecord::getNumVariableLocationOps(), llvm::DbgVariableRecord::getVariable(), llvm::DbgVariableRecord::getVariableLocationOp(), and llvm::DbgVariableRecord::isAddressOfVariable().

BitPartRecursionMaxDepth

MaxPhiEntriesIncreaseAfterRemovingEmptyBlock

cl::opt< unsigned > MaxPhiEntriesIncreaseAfterRemovingEmptyBlock("max-phi-entries-increase-after-removing-empty-block", cl::init(1000), cl::Hidden, cl::desc("Stop removing an empty block if removing it will introduce more " "than this number of phi entries in its successor")) ( "max-phi-entries-increase-after-removing-empty-block" , cl::init(1000) , cl::Hidden , cl::desc("Stop removing an empty block if removing it will introduce more " "than this number of phi entries in its successor") ) static

PHICSEDebugHash

cl::opt< bool > PHICSEDebugHash("phicse-debug-hash", cl::init(false), cl::Hidden, cl::desc("Perform extra assertion checking to verify that PHINodes's hash " "function is well-behaved w.r.t. its isEqual predicate")) ( "phicse-debug-hash" , cl::init(false) , cl::Hidden , cl::desc("Perform extra assertion checking to verify that PHINodes's hash " "function is well-behaved w.r.t. its isEqual predicate") ) static

PHICSENumPHISmallSize

cl::opt< unsigned > PHICSENumPHISmallSize("phicse-num-phi-smallsize", cl::init(32), cl::Hidden, cl::desc( "When the basic block contains not more than this number of PHI nodes, " "perform a (faster!) exhaustive search instead of set-driven one.")) ( "phicse-num-phi-smallsize" , cl::init(32) , cl::Hidden , cl::desc( "When the basic block contains not more than this number of PHI nodes, " "perform a (faster!) exhaustive search instead of set-driven one.") ) static

UseNewDbgInfoFormat