================ @@ -118,6 +118,44 @@ DeletionKind cir::StoreOp::removeBlockingUses( return DeletionKind::Delete; } +//===----------------------------------------------------------------------===// +// Interfaces for CopyOp +//===----------------------------------------------------------------------===// + +bool cir::CopyOp::loadsFrom(const MemorySlot &slot) { + return getSrc() == slot.ptr; +} + +bool cir::CopyOp::storesTo(const MemorySlot &slot) { + return getDst() == slot.ptr; +} + +Value cir::CopyOp::getStored(const MemorySlot &slot, OpBuilder &builder, + Value reachingDef, const DataLayout &dataLayout) { + return cir::LoadOp::create(builder, getLoc(), slot.elemType, getSrc()); +} + +DeletionKind cir::CopyOp::removeBlockingUses( + const MemorySlot &slot, const SmallPtrSetImpl<OpOperand *> &blockingUses, + OpBuilder &builder, mlir::Value reachingDefinition, + const DataLayout &dataLayout) { + if (loadsFrom(slot)) + cir::StoreOp::create(builder, getLoc(), reachingDefinition, getDst(), + /*alignment=*/mlir::IntegerAttr{}, + /*mem-order=*/cir::MemOrderAttr()); + return DeletionKind::Delete; +} + +bool cir::CopyOp::canUsesBeRemoved( + const MemorySlot &slot, const SmallPtrSetImpl<OpOperand *> &blockingUses, + SmallVectorImpl<OpOperand *> &newBlockingUses, + const DataLayout &dataLayout) { + if (getDst() == getSrc()) + return false; + + return getLength() == dataLayout.getTypeSize(slot.elemType); ---------------- xlauko wrote:
For instance here the `getLength` can use already present `dataLayout`. https://github.com/llvm/llvm-project/pull/155697 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits