================
@@ -2431,6 +2431,51 @@ def CIR_CallOp : CIR_CallOpBase<"call",
[NoRegionArguments]> {
];
}
+//===----------------------------------------------------------------------===//
+// CopyOp
+//===----------------------------------------------------------------------===//
+
+def CIR_CopyOp : CIR_Op<"copy",[
+ SameTypeOperands,
+ DeclareOpInterfaceMethods<PromotableMemOpInterface>
+]> {
+ let arguments = (ins
+ Arg<CIR_PointerType, "", [MemWrite]>:$dst,
+ Arg<CIR_PointerType, "", [MemRead]>:$src
+ );
+ let summary = "Copies contents from a CIR pointer to another";
+ let description = [{
+ Given two CIR pointers, `src` and `dst`, `cir.copy` will copy the memory
+ pointed by `src` to the memory pointed by `dst`.
+
+ The number of bytes copied is inferred from the pointee type. The pointee
+ type of `src` and `dst` must match and both must implement the
+ `DataLayoutTypeInterface`.
+
+ Examples:
+
+ ```mlir
+ // Copying contents from one record to another:
+ cir.copy %0 to %1 : !cir.ptr<!record_ty>
+ ```
+ }];
+
+ let assemblyFormat = [{$src `to` $dst
+ attr-dict `:` qualified(type($dst))
+ }];
+ let hasVerifier = 1;
+
+ let extraClassDeclaration = [{
+ /// Returns the pointer type being copied.
+ cir::PointerType getType() { return getSrc().getType(); }
+
+ /// Returns the number of bytes to be copied.
+ unsigned getLength() {
+ return
mlir::DataLayout::closest(*this).getTypeSize(getType().getPointee());
+ }
----------------
xlauko wrote:
This is potentially expensive operation due to linear lookup of datalayout, we
should probably support and encourage:
```
unsigned getLength(mlir::DataLayout &dt) {
return dt.getTypeSize(getType().getPointee());
}
```
https://github.com/llvm/llvm-project/pull/155697
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits