[llvm] 220815a - [AMDGPUPerfHintAnalysis] Avoid getPointerElementType()
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Mon Dec 13 07:48:28 PST 2021
Author: Nikita Popov
Date: 2021-12-13T16:48:21+01:00
New Revision: 220815a91a31459c9401604ce5859f2d61579c4b
URL: https://github.com/llvm/llvm-project/commit/220815a91a31459c9401604ce5859f2d61579c4b
DIFF: https://github.com/llvm/llvm-project/commit/220815a91a31459c9401604ce5859f2d61579c4b.diff
LOG: [AMDGPUPerfHintAnalysis] Avoid getPointerElementType()
Extract the load/store type from the instruction rather than
fetching it from the pointer element type.
Added:
Modified:
llvm/lib/Target/AMDGPU/AMDGPUPerfHintAnalysis.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUPerfHintAnalysis.cpp b/llvm/lib/Target/AMDGPU/AMDGPUPerfHintAnalysis.cpp
index 2aa02299ecdc..8ad344816ad2 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUPerfHintAnalysis.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUPerfHintAnalysis.cpp
@@ -119,31 +119,27 @@ struct AMDGPUPerfHint {
bool isConstantAddr(const Value *V) const;
};
-static const Value *getMemoryInstrPtr(const Instruction *Inst) {
- if (auto LI = dyn_cast<LoadInst>(Inst)) {
- return LI->getPointerOperand();
- }
- if (auto SI = dyn_cast<StoreInst>(Inst)) {
- return SI->getPointerOperand();
- }
- if (auto AI = dyn_cast<AtomicCmpXchgInst>(Inst)) {
- return AI->getPointerOperand();
- }
- if (auto AI = dyn_cast<AtomicRMWInst>(Inst)) {
- return AI->getPointerOperand();
- }
- if (auto MI = dyn_cast<AnyMemIntrinsic>(Inst)) {
- return MI->getRawDest();
- }
-
- return nullptr;
+static std::pair<const Value *, const Type *> getMemoryInstrPtrAndType(
+ const Instruction *Inst) {
+ if (auto LI = dyn_cast<LoadInst>(Inst))
+ return {LI->getPointerOperand(), LI->getType()};
+ if (auto SI = dyn_cast<StoreInst>(Inst))
+ return {SI->getPointerOperand(), SI->getValueOperand()->getType()};
+ if (auto AI = dyn_cast<AtomicCmpXchgInst>(Inst))
+ return {AI->getPointerOperand(), AI->getCompareOperand()->getType()};
+ if (auto AI = dyn_cast<AtomicRMWInst>(Inst))
+ return {AI->getPointerOperand(), AI->getValOperand()->getType()};
+ if (auto MI = dyn_cast<AnyMemIntrinsic>(Inst))
+ return {MI->getRawDest(), Type::getInt8Ty(MI->getContext())};
+
+ return {nullptr, nullptr};
}
bool AMDGPUPerfHint::isIndirectAccess(const Instruction *Inst) const {
LLVM_DEBUG(dbgs() << "[isIndirectAccess] " << *Inst << '\n');
SmallSet<const Value *, 32> WorkSet;
SmallSet<const Value *, 32> Visited;
- if (const Value *MO = getMemoryInstrPtr(Inst)) {
+ if (const Value *MO = getMemoryInstrPtrAndType(Inst).first) {
if (isGlobalAddr(MO))
WorkSet.insert(MO);
}
@@ -209,10 +205,8 @@ AMDGPUPerfHintAnalysis::FuncInfo *AMDGPUPerfHint::visit(const Function &F) {
for (auto &B : F) {
LastAccess = MemAccessInfo();
for (auto &I : B) {
- if (const Value *Ptr = getMemoryInstrPtr(&I)) {
- unsigned Size = divideCeil(
- Ptr->getType()->getPointerElementType()->getPrimitiveSizeInBits(),
- 32);
+ if (const Type *Ty = getMemoryInstrPtrAndType(&I).second) {
+ unsigned Size = divideCeil(Ty->getPrimitiveSizeInBits(), 32);
if (isIndirectAccess(&I))
FI.IAMInstCost += Size;
if (isLargeStride(&I))
@@ -326,7 +320,7 @@ bool AMDGPUPerfHint::isLargeStride(const Instruction *Inst) {
AMDGPUPerfHint::MemAccessInfo
AMDGPUPerfHint::makeMemAccessInfo(Instruction *Inst) const {
MemAccessInfo MAI;
- const Value *MO = getMemoryInstrPtr(Inst);
+ const Value *MO = getMemoryInstrPtrAndType(Inst).first;
LLVM_DEBUG(dbgs() << "[isLargeStride] MO: " << *MO << '\n');
// Do not treat local-addr memory access as large stride.
More information about the llvm-commits
mailing list