From: Igor Laevsky Date: Wed, 8 Feb 2017 14:23:47 +0000 (+0000) Subject: [InstCombineCalls] Remove zero length atomic memcpy intrinsics X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=25ddfba83378042c2ea1254f254cb7bf40d82b48;p=llvm [InstCombineCalls] Remove zero length atomic memcpy intrinsics Differential Revision: https://reviews.llvm.org/D28909 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@294452 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/IR/IntrinsicInst.h b/include/llvm/IR/IntrinsicInst.h index 7f4eb0e9df8..f69b5bfc0be 100644 --- a/include/llvm/IR/IntrinsicInst.h +++ b/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(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(V) && classof(cast(V)); + } + }; + /// This is the common base class for memset/memcpy/memmove. class MemIntrinsic : public IntrinsicInst { public: diff --git a/lib/Transforms/InstCombine/InstCombineCalls.cpp b/lib/Transforms/InstCombine/InstCombineCalls.cpp index f088671c6d7..13f2f9e9c72 100644 --- a/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -1835,6 +1835,12 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) { if (Changed) return II; } + if (auto *AMI = dyn_cast(II)) { + if (Constant *C = dyn_cast(AMI->getNumElements())) + if (C->isNullValue()) + return eraseInstFromFunction(*AMI); + } + if (Instruction *I = SimplifyNVVMIntrinsic(II, *this)) return I;