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