LLVM 18.0.0git
|
#include "llvm/CodeGen/Analysis.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/TargetInstrInfo.h"
#include "llvm/CodeGen/TargetLowering.h"
#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Module.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Target/TargetMachine.h"
Go to the source code of this file.
Functions | |
static bool | isNoopBitcast (Type *T1, Type *T2, const TargetLoweringBase &TLI) |
static const Value * | getNoopInput (const Value *V, SmallVectorImpl< unsigned > &ValLoc, unsigned &DataBits, const TargetLoweringBase &TLI, const DataLayout &DL) |
Look through operations that will be free to find the earliest source of this value. | |
static bool | slotOnlyDiscardsData (const Value *RetVal, const Value *CallVal, SmallVectorImpl< unsigned > &RetIndices, SmallVectorImpl< unsigned > &CallIndices, bool AllowDifferingSizes, const TargetLoweringBase &TLI, const DataLayout &DL) |
Return true if this scalar return value only has bits discarded on its path from the "tail call" to the "ret". | |
static bool | indexReallyValid (Type *T, unsigned Idx) |
For an aggregate type, determine whether a given index is within bounds or not. | |
static bool | advanceToNextLeafType (SmallVectorImpl< Type * > &SubTypes, SmallVectorImpl< unsigned > &Path) |
Move the given iterators to the next leaf type in depth first traversal. | |
static bool | firstRealType (Type *Next, SmallVectorImpl< Type * > &SubTypes, SmallVectorImpl< unsigned > &Path) |
Find the first non-empty, scalar-like type in Next and setup the iterator components. | |
static bool | nextRealType (SmallVectorImpl< Type * > &SubTypes, SmallVectorImpl< unsigned > &Path) |
Set the iterator data-structures to the next non-empty, non-aggregate subtype. | |
static bool | isPointerBitcastEqualTo (const Value *A, const Value *B) |
Check whether B is a bitcast of a pointer type to another pointer type, which is equal to A. | |
static void | collectEHScopeMembers (DenseMap< const MachineBasicBlock *, int > &EHScopeMembership, int EHScope, const MachineBasicBlock *MBB) |
|
static |
Move the given iterators to the next leaf type in depth first traversal.
Performs a depth-first traversal of the type as specified by its arguments, stopping at the next leaf node (which may be a legitimate scalar type or an empty struct or array).
SubTypes | List of the partial components making up the type from outermost to innermost non-empty aggregate. The element currently represented is SubTypes.back()->getTypeAtIndex(Path.back() - 1). |
Path | Set of extractvalue indices leading from the outermost type (SubTypes[0]) to the leaf node currently represented. |
Definition at line 482 of file Analysis.cpp.
References llvm::SmallVectorTemplateCommon< T, typename >::back(), llvm::ExtractValueInst::getIndexedType(), indexReallyValid(), llvm::Type::isAggregateType(), llvm::SmallVectorTemplateBase< T, bool >::pop_back(), and llvm::SmallVectorTemplateBase< T, bool >::push_back().
Referenced by firstRealType(), and nextRealType().
|
static |
Definition at line 778 of file Analysis.cpp.
References llvm::append_range(), assert(), llvm::SmallVectorBase< Size_T >::empty(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::insert(), llvm::MachineBasicBlock::isEHPad(), llvm::MachineBasicBlock::isEHScopeReturnBlock(), MBB, P, llvm::SmallVectorImpl< T >::pop_back_val(), and llvm::MachineBasicBlock::successors().
Referenced by llvm::getEHScopeMembership().
|
static |
Find the first non-empty, scalar-like type in Next and setup the iterator components.
Assuming Next is an aggregate of some kind, this function will traverse the tree from left to right (i.e. depth-first) looking for the first non-aggregate type which will play a role in function return.
For example, if Next was {[0 x i64], {{}, i32, {}}, i32} then we would setup Path as [1, 1] and SubTypes as [Next, {{}, i32, {}}] to represent the first i32 in that type.
Definition at line 523 of file Analysis.cpp.
References advanceToNextLeafType(), llvm::SmallVectorTemplateCommon< T, typename >::back(), llvm::ExtractValueInst::getIndexedType(), llvm::Type::isAggregateType(), and llvm::SmallVectorTemplateBase< T, bool >::push_back().
Referenced by llvm::returnTypeIsEligibleForTailCall().
|
static |
Look through operations that will be free to find the earliest source of this value.
ValLoc | If V has aggregate type, we will be interested in a particular scalar component. This records its address; the reverse of this list gives a sequence of indices appropriate for an extractvalue to locate the important value. This value is updated during the function and on exit will indicate similar information for the Value returned. |
DataBits | If this function looks through truncate instructions, this will record the smallest size attained. |
Definition at line 332 of file Analysis.cpp.
References llvm::TargetLoweringBase::allowTruncateForTailCall(), llvm::SmallVectorImpl< T >::append(), llvm::ArrayRef< T >::begin(), DL, llvm::ArrayRef< T >::end(), llvm::Value::getType(), I, isNoopBitcast(), llvm::SmallVectorTemplateCommon< T, typename >::rbegin(), llvm::ArrayRef< T >::rbegin(), llvm::ArrayRef< T >::rend(), llvm::SmallVectorImpl< T >::resize(), llvm::ArrayRef< T >::size(), and llvm::SmallVectorBase< Size_T >::size().
Referenced by slotOnlyDiscardsData().
For an aggregate type, determine whether a given index is within bounds or not.
Definition at line 458 of file Analysis.cpp.
References Idx.
Referenced by advanceToNextLeafType().
|
static |
Definition at line 314 of file Analysis.cpp.
References llvm::EVT::getEVT(), llvm::Type::isPointerTy(), llvm::TargetLoweringBase::isTypeLegal(), and T1.
Referenced by getNoopInput().
Check whether B is a bitcast of a pointer type to another pointer type, which is equal to A.
Definition at line 679 of file Analysis.cpp.
References A, assert(), and B.
Referenced by llvm::returnTypeIsEligibleForTailCall().
|
static |
Set the iterator data-structures to the next non-empty, non-aggregate subtype.
Definition at line 552 of file Analysis.cpp.
References advanceToNextLeafType(), assert(), llvm::SmallVectorTemplateCommon< T, typename >::back(), llvm::ExtractValueInst::getIndexedType(), and llvm::Type::isAggregateType().
Referenced by llvm::returnTypeIsEligibleForTailCall().
|
static |
Return true if this scalar return value only has bits discarded on its path from the "tail call" to the "ret".
This includes the obvious noop instructions handled by getNoopInput above as well as free truncations (or extensions prior to the call).
Definition at line 414 of file Analysis.cpp.
References DL, and getNoopInput().
Referenced by llvm::returnTypeIsEligibleForTailCall().