LLVM 19.0.0git
Classes | Macros | Functions | Variables
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
 
AMDGPU promote alloca to vector or false INITIALIZE_PASS_BEGIN (AMDGPUPromoteAllocaToVector, DEBUG_TYPE "-to-vector", "AMDGPU promote alloca to vector", false, false) INITIALIZE_PASS_END(AMDGPUPromoteAllocaToVector
 
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 *, Value * > &GEPIdx)
 
static ValueGEPToVectorIndex (GetElementPtrInst *GEP, AllocaInst *Alloca, Type *VecElemTy, const DataLayout &DL)
 
static ValuepromoteAllocaUserToVector (Instruction *Inst, const DataLayout &DL, FixedVectorType *VectorTy, unsigned VecStoreSize, unsigned ElementSize, DenseMap< MemTransferInst *, MemTransferInfo > &TransferInfo, std::map< GetElementPtrInst *, Value * > &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 bool isCallPromotable (CallInst *CI)
 

Variables

 DEBUG_TYPE
 
AMDGPU promote alloca to vector or LDS
 
AMDGPU promote alloca to vector or false
 
AMDGPU promote alloca to vector or false DEBUG_TYPE to vector
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "amdgpu-promote-alloca"

Definition at line 48 of file AMDGPUPromoteAlloca.cpp.

Function Documentation

◆ calculateVectorIndex()

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

◆ collectAllocaUses()

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

Definition at line 252 of file AMDGPUPromoteAlloca.cpp.

References llvm::SmallVectorImpl< T >::pop_back_val(), and Uses.

◆ forEachWorkListItem()

template<typename InstContainer >
static 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 686 of file AMDGPUPromoteAlloca.cpp.

References llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::insert().

◆ GEPToVectorIndex()

static Value * GEPToVectorIndex ( GetElementPtrInst GEP,
AllocaInst Alloca,
Type VecElemTy,
const DataLayout DL 
)
static

◆ INITIALIZE_PASS_BEGIN() [1/2]

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

◆ INITIALIZE_PASS_BEGIN() [2/2]

AMDGPU promote alloca to vector or false INITIALIZE_PASS_BEGIN ( AMDGPUPromoteAllocaToVector  ,
DEBUG_TYPE "-to-vector"  ,
"AMDGPU promote alloca to vector"  ,
false  ,
false   
)

◆ isCallPromotable()

static bool isCallPromotable ( CallInst CI)
static

Definition at line 1091 of file AMDGPUPromoteAlloca.cpp.

References llvm::IntrinsicInst::getIntrinsicID().

◆ isSupportedAccessType()

static bool isSupportedAccessType ( FixedVectorType VecTy,
Type AccessTy,
const DataLayout DL 
)
static

◆ isSupportedMemset()

static bool isSupportedMemset ( MemSetInst I,
AllocaInst AI,
const DataLayout DL 
)
static

◆ promoteAllocaUserToVector()

static Value * promoteAllocaUserToVector ( Instruction Inst,
const DataLayout DL,
FixedVectorType VectorTy,
unsigned  VecStoreSize,
unsigned  ElementSize,
DenseMap< MemTransferInst *, MemTransferInfo > &  TransferInfo,
std::map< GetElementPtrInst *, Value * > &  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 444 of file AMDGPUPromoteAlloca.cpp.

References assert(), calculateVectorIndex(), llvm::IRBuilderBase::CreateAdd(), llvm::IRBuilderBase::CreateBitCast(), llvm::IRBuilderBase::CreateBitOrPointerCast(), llvm::IRBuilderBase::CreateExtractElement(), llvm::IRBuilderBase::CreateInsertElement(), llvm::IRBuilderBase::CreateIntToPtr(), llvm::IRBuilderBase::CreateLoad(), llvm::IRBuilderBase::CreateShuffleVector(), llvm::IRBuilderBase::CreateVectorSplat(), MemTransferInfo::DestIndex, DL, llvm::FixedVectorType::get(), llvm::PoisonValue::get(), llvm::Value::getContext(), llvm::VectorType::getElementCount(), llvm::VectorType::getElementType(), llvm::IRBuilderBase::getIntN(), llvm::IRBuilderBase::getIntNTy(), llvm::FixedVectorType::getNumElements(), llvm::Instruction::getOpcode(), llvm::getPointerOperand(), llvm::IRBuilderBase::getPtrTy(), llvm::Value::getType(), llvm::ConstantInt::getZExtValue(), Idx, Intr, llvm::details::FixedOrScalableQuantity< LeafTy, ValueTy >::isKnownMultipleOf(), llvm::Type::isPointerTy(), llvm::Type::isPtrOrPtrVectorTy(), llvm::Length, llvm_unreachable, llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::Value::replaceAllUsesWith(), llvm::IRBuilderBase::SetInsertPoint(), Size, and MemTransferInfo::SrcIndex.

Variable Documentation

◆ DEBUG_TYPE

DEBUG_TYPE

Definition at line 208 of file AMDGPUPromoteAlloca.cpp.

◆ false

AMDGPU promote alloca to vector or false DEBUG_TYPE to AMDGPU promote alloca to false

Definition at line 209 of file AMDGPUPromoteAlloca.cpp.

◆ LDS

AMDGPU promote alloca to vector or LDS

◆ vector

AMDGPU promote alloca to vector or false DEBUG_TYPE to AMDGPU promote alloca to vector

Definition at line 214 of file AMDGPUPromoteAlloca.cpp.

Referenced by llvm::LLT::fixed_vector(), and llvm::LLT::scalable_vector().