[Mlir-commits] [mlir] [mlir][ptr] Add conversion to LLVM for all existing `ptr` ops (PR #156053)
Shenghang Tsai
llvmlistbot at llvm.org
Mon Sep 29 01:24:31 PDT 2025
jackalcooper wrote:
Thanks for contributing this!
One issue I encountered when trying to refactor existing `!llvm.ptr` based implementation to `!ptr.ptr<#ptr.generic_space>`:
- `ptr.load` expects a `!ptr.ptr`
- in `ptr.to_ptr`'s to-llvm conversion `ToPtrOpConversion`, it is calling `MemRefDescriptor(adaptor.getPtr()).alignedPtr` which produce a `!llvm.ptr`
- When `ptr.load` reads a pointer originated from memref, a unresolvable `"builtin.unrealized_conversion_cast"(%20) : (!llvm.ptr) -> !ptr.ptr<#ptr.generic_space>` is created.
the IR:
```mlir
# get memref from alloca
%alloca_0 = memref.alloca() : memref<64xi64, #ptr.generic_space>
# get aligned ptr from memref descriptor
%0 = ptr.to_ptr %alloca : memref<64xi64, #ptr.generic_space> -> <#ptr.generic_space>
# do something with the aligned ptr
%1 = call @enif_get_int64(%arg0, %arg1, %0) : (!ptr.ptr<#ptr.generic_space>, i64, !ptr.ptr<#ptr.generic_space>) -> i32
# load the ptr.ptr
%2 = ptr.load %0 : !ptr.ptr<#ptr.generic_space> -> i64
```
```mlir
# get aligned ptr from memref descriptor
%10 = llvm.extractvalue %9[1] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
# do something with the aligned ptr
%12 = llvm.call @enif_get_int64(%arg0, %arg1, %10) : (!llvm.ptr, i64, !llvm.ptr) -> i32
# load the ptr.ptr, which is a now a llvm.ptr
%11 = builtin.unrealized_conversion_cast %10 : !llvm.ptr to !ptr.ptr<#ptr.generic_space>
%13 = ptr.load %11 : !ptr.ptr<#ptr.generic_space> -> i64
```
https://github.com/llvm/llvm-project/pull/156053
More information about the Mlir-commits
mailing list