Thanks to visit codestin.com
Credit goes to llvm.org

LLVM 22.0.0git
AMDGPUPromoteAlloca.cpp File Reference
#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 ValuecalculateVectorIndex (Value *Ptr, const std::map< GetElementPtrInst *, WeakTrackingVH > &GEPIdx)
static ValueGEPToVectorIndex (GetElementPtrInst *GEP, AllocaInst *Alloca, Type *VecElemTy, const DataLayout &DL, SmallVector< Instruction * > &NewInsts)
static ValuepromoteAllocaUserToVector (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

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "amdgpu-promote-alloca"

Definition at line 48 of file AMDGPUPromoteAlloca.cpp.

Function Documentation

◆ calculateVectorIndex()

Value * calculateVectorIndex ( Value * Ptr,
const std::map< GetElementPtrInst *, WeakTrackingVH > & GEPIdx )
static

◆ collectAllocaUses()

void collectAllocaUses ( AllocaInst & Alloca,
SmallVectorImpl< Use * > & Uses )
static

Definition at line 239 of file AMDGPUPromoteAlloca.cpp.

References llvm::cast(), llvm::isa(), and Uses.

◆ forEachWorkListItem()

template<typename InstContainer>
void forEachWorkListItem ( const InstContainer & WorkList,
std::function< void(Instruction *)> Fn )
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().

◆ GEPToVectorIndex()

◆ INITIALIZE_PASS_BEGIN()

INITIALIZE_PASS_BEGIN ( AMDGPUPromoteAlloca ,
DEBUG_TYPE ,
"AMDGPU promote alloca to vector or LDS" ,
false ,
false  )

◆ isCallPromotable()

bool isCallPromotable ( CallInst * CI)
static

Definition at line 1197 of file AMDGPUPromoteAlloca.cpp.

References llvm::dyn_cast(), and II.

◆ isSupportedAccessType()

◆ isSupportedMemset()

◆ promoteAllocaUserToVector()

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 )
static

Promotes a single user of the alloca to a vector form.

Parameters
InstInstruction to be promoted.
DLModule Data Layout.
VectorTyVectorized Type.
VecStoreSizeSize of VectorTy in bytes.
ElementSizeSize of VectorTy element type in bytes.
TransferInfoMemTransferInst info map.
GEPVectorIdxGEP -> VectorIdx cache.
CurValCurrent value of the vector (e.g. last stored value)
[out]DeferredLoadsInst is added to this vector if it can't be promoted now. This happens when promoting requires CurVal, but CurVal is nullptr.
Returns
the stored value if 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.

◆ skipToNonAllocaInsertPt()

BasicBlock::iterator skipToNonAllocaInsertPt ( BasicBlock & BB,
BasicBlock::iterator I )
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().

Variable Documentation

◆ DEBUG_TYPE

DEBUG_TYPE

Definition at line 206 of file AMDGPUPromoteAlloca.cpp.

◆ false

AMDGPU promote alloca to vector or false

Definition at line 207 of file AMDGPUPromoteAlloca.cpp.

◆ LDS

AMDGPU promote alloca to vector or LDS