summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
Diffstat (limited to 'llvm')
-rw-r--r--llvm/include/llvm/IR/IntrinsicInst.h26
-rw-r--r--llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp6
2 files changed, 32 insertions, 0 deletions
diff --git a/llvm/include/llvm/IR/IntrinsicInst.h b/llvm/include/llvm/IR/IntrinsicInst.h
index 7f4eb0e9df8..f69b5bfc0be 100644
--- a/llvm/include/llvm/IR/IntrinsicInst.h
+++ b/llvm/include/llvm/IR/IntrinsicInst.h
@@ -191,6 +191,32 @@ namespace llvm {
}
};
+ /// This class represents atomic memcpy intrinsic
+ /// TODO: Integrate this class into MemIntrinsic hierarchy.
+ class ElementAtomicMemCpyInst : public IntrinsicInst {
+ public:
+ Value *getRawDest() const { return getArgOperand(0); }
+ Value *getRawSource() const { return getArgOperand(1); }
+
+ Value *getNumElements() const { return getArgOperand(2); }
+ void setNumElements(Value *V) { setArgOperand(2, V); }
+
+ uint64_t getSrcAlignment() const { return getParamAlignment(1); }
+ uint64_t getDstAlignment() const { return getParamAlignment(2); }
+
+ uint64_t getElementSizeInBytes() const {
+ Value *Arg = getArgOperand(3);
+ return cast<ConstantInt>(Arg)->getZExtValue();
+ }
+
+ static inline bool classof(const IntrinsicInst *I) {
+ return I->getIntrinsicID() == Intrinsic::memcpy_element_atomic;
+ }
+ static inline bool classof(const Value *V) {
+ return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
+ }
+ };
+
/// This is the common base class for memset/memcpy/memmove.
class MemIntrinsic : public IntrinsicInst {
public:
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
index f088671c6d7..13f2f9e9c72 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
@@ -1835,6 +1835,12 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
if (Changed) return II;
}
+ if (auto *AMI = dyn_cast<ElementAtomicMemCpyInst>(II)) {
+ if (Constant *C = dyn_cast<Constant>(AMI->getNumElements()))
+ if (C->isNullValue())
+ return eraseInstFromFunction(*AMI);
+ }
+
if (Instruction *I = SimplifyNVVMIntrinsic(II, *this))
return I;
OpenPOWER on IntegriCloud