|
LLVM 22.0.0git
|
#include "AMDGPU.h"#include "GCNSubtarget.h"#include "Utils/AMDGPUBaseInfo.h"#include "llvm/ADT/STLExtras.h"#include "llvm/Analysis/CaptureTracking.h"#include "llvm/Analysis/InstSimplifyFolder.h"#include "llvm/Analysis/InstructionSimplify.h"#include "llvm/Analysis/LoopInfo.h"#include "llvm/Analysis/ValueTracking.h"#include "llvm/CodeGen/TargetPassConfig.h"#include "llvm/IR/IRBuilder.h"#include "llvm/IR/IntrinsicInst.h"#include "llvm/IR/IntrinsicsAMDGPU.h"#include "llvm/IR/IntrinsicsR600.h"#include "llvm/IR/PatternMatch.h"#include "llvm/InitializePasses.h"#include "llvm/Pass.h"#include "llvm/Target/TargetMachine.h"#include "llvm/Transforms/Utils/SSAUpdater.h"Go to the source code of this file.
Classes | |
| struct | MemTransferInfo |
Macros | |
| #define | DEBUG_TYPE "amdgpu-promote-alloca" |
Functions | |
| INITIALIZE_PASS_BEGIN (AMDGPUPromoteAlloca, DEBUG_TYPE, "AMDGPU promote alloca to vector or LDS", false, false) INITIALIZE_PASS_END(AMDGPUPromoteAlloca | |
| static void | collectAllocaUses (AllocaInst &Alloca, SmallVectorImpl< Use * > &Uses) |
| static bool | isSupportedMemset (MemSetInst *I, AllocaInst *AI, const DataLayout &DL) |
| static Value * | calculateVectorIndex (Value *Ptr, const std::map< GetElementPtrInst *, WeakTrackingVH > &GEPIdx) |
| static Value * | GEPToVectorIndex (GetElementPtrInst *GEP, AllocaInst *Alloca, Type *VecElemTy, const DataLayout &DL, SmallVector< Instruction * > &NewInsts) |
| static Value * | promoteAllocaUserToVector (Instruction *Inst, const DataLayout &DL, FixedVectorType *VectorTy, unsigned VecStoreSize, unsigned ElementSize, DenseMap< MemTransferInst *, MemTransferInfo > &TransferInfo, std::map< GetElementPtrInst *, WeakTrackingVH > &GEPVectorIdx, Value *CurVal, SmallVectorImpl< LoadInst * > &DeferredLoads) |
| Promotes a single user of the alloca to a vector form. | |
| static bool | isSupportedAccessType (FixedVectorType *VecTy, Type *AccessTy, const DataLayout &DL) |
| template<typename InstContainer> | |
| static void | forEachWorkListItem (const InstContainer &WorkList, std::function< void(Instruction *)> Fn) |
| Iterates over an instruction worklist that may contain multiple instructions from the same basic block, but in a different order. | |
| static BasicBlock::iterator | skipToNonAllocaInsertPt (BasicBlock &BB, BasicBlock::iterator I) |
| Find an insert point after an alloca, after all other allocas clustered at the start of the block. | |
| static bool | isCallPromotable (CallInst *CI) |
Variables | |
| DEBUG_TYPE | |
| AMDGPU promote alloca to vector or | LDS |
| AMDGPU promote alloca to vector or | false |
| #define DEBUG_TYPE "amdgpu-promote-alloca" |
Definition at line 48 of file AMDGPUPromoteAlloca.cpp.
|
static |
Definition at line 390 of file AMDGPUPromoteAlloca.cpp.
References assert(), llvm::dyn_cast(), GEP, llvm::Type::getInt32Ty(), llvm::Constant::getNullValue(), I, and Ptr.
Referenced by promoteAllocaUserToVector().
|
static |
Definition at line 239 of file AMDGPUPromoteAlloca.cpp.
References llvm::cast(), llvm::isa(), and Uses.
|
static |
Iterates over an instruction worklist that may contain multiple instructions from the same basic block, but in a different order.
Definition at line 749 of file AMDGPUPromoteAlloca.cpp.
References llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::clear(), and llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::insert().
|
static |
Definition at line 404 of file AMDGPUPromoteAlloca.cpp.
References assert(), DL, llvm::dyn_cast(), llvm::MapVector< KeyT, ValueT, MapType, VectorType >::front(), GEP, llvm::APInt::isOne(), llvm::APInt::isZero(), llvm::Offset, llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::APInt::sdivrem(), llvm::APInt::sext(), and llvm::MapVector< KeyT, ValueT, MapType, VectorType >::size().
| INITIALIZE_PASS_BEGIN | ( | AMDGPUPromoteAlloca | , |
| DEBUG_TYPE | , | ||
| "AMDGPU promote alloca to vector or LDS" | , | ||
| false | , | ||
| false | ) |
References DEBUG_TYPE, and INITIALIZE_PASS_DEPENDENCY.
Definition at line 1197 of file AMDGPUPromoteAlloca.cpp.
References llvm::dyn_cast(), and II.
|
static |
Definition at line 718 of file AMDGPUPromoteAlloca.cpp.
References DL, llvm::VectorType::getElementType(), llvm::isa(), llvm::CastInst::isBitOrNoopPointerCastable(), and llvm::details::FixedOrScalableQuantity< LeafTy, ValueTy >::isKnownMultipleOf().
|
static |
Definition at line 376 of file AMDGPUPromoteAlloca.cpp.
References DL, llvm::AllocaInst::getAllocatedType(), I, llvm::PatternMatch::m_SpecificInt(), llvm::PatternMatch::match(), and Size.
|
static |
Promotes a single user of the alloca to a vector form.
| Inst | Instruction to be promoted. | |
| DL | Module Data Layout. | |
| VectorTy | Vectorized Type. | |
| VecStoreSize | Size of VectorTy in bytes. | |
| ElementSize | Size of VectorTy element type in bytes. | |
| TransferInfo | MemTransferInst info map. | |
| GEPVectorIdx | GEP -> VectorIdx cache. | |
| CurVal | Current value of the vector (e.g. last stored value) | |
| [out] | DeferredLoads | Inst is added to this vector if it can't be promoted now. This happens when promoting requires CurVal, but CurVal is nullptr. |
Inst would have written to the alloca, or nullptr otherwise. Definition at line 500 of file AMDGPUPromoteAlloca.cpp.
References assert(), calculateVectorIndex(), llvm::cast(), MemTransferInfo::DestIndex, DL, llvm::dyn_cast(), llvm::FixedVectorType::get(), llvm::PoisonValue::get(), llvm::Value::getContext(), llvm::VectorType::getElementCount(), llvm::VectorType::getElementType(), llvm::Type::getIntNTy(), getNumElements(), llvm::FixedVectorType::getNumElements(), llvm::Instruction::getOpcode(), llvm::getPointerOperand(), llvm::Value::getType(), llvm::ConstantInt::getZExtValue(), llvm::isa(), llvm::details::FixedOrScalableQuantity< LeafTy, ValueTy >::isKnownMultipleOf(), llvm::Type::isPointerTy(), llvm::Type::isPtrOrPtrVectorTy(), llvm::Length, llvm_unreachable, llvm::PoisonMaskElem, llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::Value::replaceAllUsesWith(), Size, and MemTransferInfo::SrcIndex.
|
static |
Find an insert point after an alloca, after all other allocas clustered at the start of the block.
Definition at line 787 of file AMDGPUPromoteAlloca.cpp.
References E(), llvm::BasicBlock::end(), I, and llvm::isa().
| DEBUG_TYPE |
Definition at line 206 of file AMDGPUPromoteAlloca.cpp.
| AMDGPU promote alloca to vector or false |
Definition at line 207 of file AMDGPUPromoteAlloca.cpp.
| AMDGPU promote alloca to vector or LDS |
Definition at line 207 of file AMDGPUPromoteAlloca.cpp.
Referenced by llvm::AMDGPUTargetLowering::getTargetNodeName().