[Mlir-commits] [mlir] [mlir][core|ptr] Add `PtrLikeTypeInterface` and casting ops to the `ptr` dialect (PR #137469)

Fabian Mora llvmlistbot at llvm.org
Wed May 14 05:08:41 PDT 2025


================
@@ -17,6 +17,75 @@ include "mlir/Interfaces/SideEffectInterfaces.td"
 include "mlir/Interfaces/ViewLikeInterface.td"
 include "mlir/IR/OpAsmInterface.td"
 
+//===----------------------------------------------------------------------===//
+// FromPtrOp
+//===----------------------------------------------------------------------===//
+
+def Ptr_FromPtrOp : Pointer_Op<"from_ptr", [
+    Pure, OptionalTypesMatchWith<"metadata type", "result", "metadata",
+            "PtrMetadataType::get(cast<PtrLikeTypeInterface>($_self))">
+  ]> {
+  let summary = "Casts a `!ptr.ptr` value to a ptr-like value.";
+  let description = [{
+    The `from_ptr` operation casts a `ptr` value to a ptr-like object. It's
+    important to note that:
+    - The ptr-like object cannot be a `!ptr.ptr`.
+    - The memory-space of both the `ptr` and ptr-like object must match.
+    - The cast is side-effect free.
+
+    If the ptr-like object type has metadata, then the operation expects the
+    metadata as an argument or expects that the flag `trivial_metadata` is set.
+    If `trivial_metadata` is set, then it is assumed that the metadata can be
+    reconstructed statically from the pointer-like type.
----------------
fabianmcg wrote:

It's not an implementation impossibility of the folding logic, but rather an affirmation to the compiler that the user guarantees it's safe to do it, even when the cast is lossy like with `memref`.

My main point with this flag is to make it explicit that there's something potentially hazardous taking place. Otherwise an user could end up with something like:
```mlir
%v1 = from_ptr %p : !ptr.ptr<0> -> memref<f32, 0>
memref.dealloc %v1 : memref<f32, 0>
```
Which is potentially dangerous, and no warnings were raised.  Instead having:

```mlir
%v1 = from_ptr %p trivial_metadata : !ptr.ptr<0> -> memref<f32, 0>
memref.dealloc %v1 : memref<f32, 0>
```
At least places the burden on the user of the op.


https://github.com/llvm/llvm-project/pull/137469


More information about the Mlir-commits mailing list