[InstCombineCalls] Remove zero length atomic memcpy intrinsics

Differential Revision: https://reviews.llvm.org/D28909

llvm-svn: 294452
This commit is contained in:
Igor Laevsky 2017-02-08 14:23:47 +00:00
parent e79e5ee244
commit 4b317fa24e
2 changed files with 32 additions and 0 deletions

View File

@ -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:

View File

@ -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;