[llvm] 438cc10 - [IR] Add getAccessType to Instruction
Luke Lau via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 21 08:17:30 PDT 2023
Author: Luke Lau
Date: 2023-06-21T16:17:25+01:00
New Revision: 438cc10b8ed0e54a312fe44dc4234c5231104603
URL: https://github.com/llvm/llvm-project/commit/438cc10b8ed0e54a312fe44dc4234c5231104603
DIFF: https://github.com/llvm/llvm-project/commit/438cc10b8ed0e54a312fe44dc4234c5231104603.diff
LOG: [IR] Add getAccessType to Instruction
There are multiple places in the code where the type of memory being accessed from an instruction needs to be obtained, including an upcoming patch to improve GEP cost modeling. This deduplicates the logic between them. It's not strictly NFC as EarlyCSE/LoopStrengthReduce may catch more intrinsics now.
Reviewed By: nikic
Differential Revision: https://reviews.llvm.org/D150583
Added:
Modified:
llvm/include/llvm/IR/Instruction.h
llvm/lib/IR/Instruction.cpp
llvm/lib/Transforms/Scalar/EarlyCSE.cpp
llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/IR/Instruction.h b/llvm/include/llvm/IR/Instruction.h
index 7de412873b97b..5fd8b27447b77 100644
--- a/llvm/include/llvm/IR/Instruction.h
+++ b/llvm/include/llvm/IR/Instruction.h
@@ -647,6 +647,9 @@ class Instruction : public User,
/// Return true if this instruction has a volatile memory access.
bool isVolatile() const LLVM_READONLY;
+ /// Return the type this instruction accesses in memory, if any.
+ Type *getAccessType() const LLVM_READONLY;
+
/// Return true if this instruction may throw an exception.
///
/// If IncludePhaseOneUnwind is set, this will also include cases where
diff --git a/llvm/lib/IR/Instruction.cpp b/llvm/lib/IR/Instruction.cpp
index 42efaede16351..90acdeab44184 100644
--- a/llvm/lib/IR/Instruction.cpp
+++ b/llvm/lib/IR/Instruction.cpp
@@ -743,6 +743,42 @@ bool Instruction::isVolatile() const {
}
}
+Type *Instruction::getAccessType() const {
+ switch (getOpcode()) {
+ case Instruction::Store:
+ return cast<StoreInst>(this)->getValueOperand()->getType();
+ case Instruction::Load:
+ case Instruction::AtomicRMW:
+ return getType();
+ case Instruction::AtomicCmpXchg:
+ return cast<AtomicCmpXchgInst>(this)->getNewValOperand()->getType();
+ case Instruction::Call:
+ case Instruction::Invoke:
+ if (const IntrinsicInst *II = dyn_cast<IntrinsicInst>(this)) {
+ switch (II->getIntrinsicID()) {
+ case Intrinsic::masked_load:
+ case Intrinsic::masked_gather:
+ case Intrinsic::masked_expandload:
+ case Intrinsic::vp_load:
+ case Intrinsic::vp_gather:
+ case Intrinsic::experimental_vp_strided_load:
+ return II->getType();
+ case Intrinsic::masked_store:
+ case Intrinsic::masked_scatter:
+ case Intrinsic::masked_compressstore:
+ case Intrinsic::vp_store:
+ case Intrinsic::vp_scatter:
+ case Intrinsic::experimental_vp_strided_store:
+ return II->getOperand(0)->getType();
+ default:
+ break;
+ }
+ }
+ }
+
+ return nullptr;
+}
+
static bool canUnwindPastLandingPad(const LandingPadInst *LP,
bool IncludePhaseOneUnwind) {
// Because phase one unwinding skips cleanup landingpads, we effectively
diff --git a/llvm/lib/Transforms/Scalar/EarlyCSE.cpp b/llvm/lib/Transforms/Scalar/EarlyCSE.cpp
index 3ac315a4f9fa2..6344c997bde5d 100644
--- a/llvm/lib/Transforms/Scalar/EarlyCSE.cpp
+++ b/llvm/lib/Transforms/Scalar/EarlyCSE.cpp
@@ -819,17 +819,7 @@ class EarlyCSE {
Type *getValueType() const {
// TODO: handle target-specific intrinsics.
- if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(Inst)) {
- switch (II->getIntrinsicID()) {
- case Intrinsic::masked_load:
- return II->getType();
- case Intrinsic::masked_store:
- return II->getArgOperand(0)->getType();
- default:
- return nullptr;
- }
- }
- return getLoadStoreType(Inst);
+ return Inst->getAccessType();
}
bool mayReadFromMemory() const {
diff --git a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
index a863eab7c604c..8b32052a29d37 100644
--- a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
+++ b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
@@ -896,9 +896,14 @@ static bool isAddressUse(const TargetTransformInfo &TTI,
/// Return the type of the memory being accessed.
static MemAccessTy getAccessType(const TargetTransformInfo &TTI,
Instruction *Inst, Value *OperandVal) {
- MemAccessTy AccessTy(Inst->getType(), MemAccessTy::UnknownAddressSpace);
+ MemAccessTy AccessTy = MemAccessTy::getUnknown(Inst->getContext());
+
+ // First get the type of memory being accessed.
+ if (Type *Ty = Inst->getAccessType())
+ AccessTy.MemTy = Ty;
+
+ // Then get the pointer address space.
if (const StoreInst *SI = dyn_cast<StoreInst>(Inst)) {
- AccessTy.MemTy = SI->getOperand(0)->getType();
AccessTy.AddrSpace = SI->getPointerAddressSpace();
} else if (const LoadInst *LI = dyn_cast<LoadInst>(Inst)) {
AccessTy.AddrSpace = LI->getPointerAddressSpace();
@@ -923,7 +928,6 @@ static MemAccessTy getAccessType(const TargetTransformInfo &TTI,
II->getArgOperand(0)->getType()->getPointerAddressSpace();
break;
case Intrinsic::masked_store:
- AccessTy.MemTy = II->getOperand(0)->getType();
AccessTy.AddrSpace =
II->getArgOperand(1)->getType()->getPointerAddressSpace();
break;
More information about the llvm-commits
mailing list