================
@@ -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
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits