summaryrefslogtreecommitdiff
path: root/include/llvm/Analysis/MemoryLocation.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/llvm/Analysis/MemoryLocation.h')
-rw-r--r--include/llvm/Analysis/MemoryLocation.h29
1 files changed, 18 insertions, 11 deletions
diff --git a/include/llvm/Analysis/MemoryLocation.h b/include/llvm/Analysis/MemoryLocation.h
index f2cb2a123f2e4..c1080742e83a2 100644
--- a/include/llvm/Analysis/MemoryLocation.h
+++ b/include/llvm/Analysis/MemoryLocation.h
@@ -16,6 +16,7 @@
#ifndef LLVM_ANALYSIS_MEMORYLOCATION_H
#define LLVM_ANALYSIS_MEMORYLOCATION_H
+#include "llvm/ADT/Optional.h"
#include "llvm/ADT/DenseMapInfo.h"
#include "llvm/IR/CallSite.h"
#include "llvm/IR/Metadata.h"
@@ -68,17 +69,23 @@ public:
static MemoryLocation get(const AtomicCmpXchgInst *CXI);
static MemoryLocation get(const AtomicRMWInst *RMWI);
static MemoryLocation get(const Instruction *Inst) {
- if (auto *I = dyn_cast<LoadInst>(Inst))
- return get(I);
- else if (auto *I = dyn_cast<StoreInst>(Inst))
- return get(I);
- else if (auto *I = dyn_cast<VAArgInst>(Inst))
- return get(I);
- else if (auto *I = dyn_cast<AtomicCmpXchgInst>(Inst))
- return get(I);
- else if (auto *I = dyn_cast<AtomicRMWInst>(Inst))
- return get(I);
- llvm_unreachable("unsupported memory instruction");
+ return *MemoryLocation::getOrNone(Inst);
+ }
+ static Optional<MemoryLocation> getOrNone(const Instruction *Inst) {
+ switch (Inst->getOpcode()) {
+ case Instruction::Load:
+ return get(cast<LoadInst>(Inst));
+ case Instruction::Store:
+ return get(cast<StoreInst>(Inst));
+ case Instruction::VAArg:
+ return get(cast<VAArgInst>(Inst));
+ case Instruction::AtomicCmpXchg:
+ return get(cast<AtomicCmpXchgInst>(Inst));
+ case Instruction::AtomicRMW:
+ return get(cast<AtomicRMWInst>(Inst));
+ default:
+ return None;
+ }
}
/// Return a location representing the source of a memory transfer.