[llvm] d6f6cda - [SPIR-V] Fix inttoptr type deduction with ptr.annotation (#189219)
via llvm-commits
llvm-commits at lists.llvm.org
Sun May 10 02:38:38 PDT 2026
Author: Michal Paszkowski
Date: 2026-05-10T02:38:34-07:00
New Revision: d6f6cdaddadb9929dd6778697b3ea422acae2c08
URL: https://github.com/llvm/llvm-project/commit/d6f6cdaddadb9929dd6778697b3ea422acae2c08
DIFF: https://github.com/llvm/llvm-project/commit/d6f6cdaddadb9929dd6778697b3ea422acae2c08.diff
LOG: [SPIR-V] Fix inttoptr type deduction with ptr.annotation (#189219)
Opaque pointer inttoptr was recording ptr as a pointee type, so
OpConvertUToPtr was emitted as pointer-to-pointer and then bitcasted
back. Please see an example below.
LLVM IR:
```
%p = inttoptr i64 %x to ptr addrspace(1)
%a = call ptr addrspace(1) @llvm.ptr.annotation(... %p ...)
call spir_func void @prefetch(ptr addrspace(1) %a, ...)
```
SPIR-V (before the change):
```
%p2 = OpConvertUToPtr %_ptr_CrossWorkgroup__ptr_CrossWorkgroup_uchar %x
%p1 = OpBitcast %_ptr_CrossWorkgroup_uchar %p2
OpFunctionCall ... %p1 ...
```
Skip assigning pointee type for inttoptr when the destination is
untyped, fallback later recovers the correct single pointer type.
Added:
llvm/test/CodeGen/SPIRV/extensions/SPV_INTEL_cache_controls/inttoptr-no-double-pointer.ll
Modified:
llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp b/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp
index c9b66ccfbdbd1..b6e71c7b76348 100644
--- a/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp
@@ -747,6 +747,8 @@ void SPIRVEmitIntrinsics::maybeAssignPtrType(Type *&Ty, Value *Op, Type *RefTy,
if (!UnknownElemTypeI8)
return;
insertTodoType(Op);
+ if (isa<IntToPtrInst>(Op))
+ return;
}
Ty = RefTy;
}
diff --git a/llvm/test/CodeGen/SPIRV/extensions/SPV_INTEL_cache_controls/inttoptr-no-double-pointer.ll b/llvm/test/CodeGen/SPIRV/extensions/SPV_INTEL_cache_controls/inttoptr-no-double-pointer.ll
new file mode 100644
index 0000000000000..ded7d19a4dc50
--- /dev/null
+++ b/llvm/test/CodeGen/SPIRV/extensions/SPV_INTEL_cache_controls/inttoptr-no-double-pointer.ll
@@ -0,0 +1,37 @@
+; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown --spirv-ext=+SPV_INTEL_cache_controls,+SPV_INTEL_variable_length_array %s -o - | FileCheck %s
+; TODO: %if spirv-tools %{ llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown --spirv-ext=+SPV_INTEL_cache_controls,+SPV_INTEL_variable_length_array %s -o - -filetype=obj | spirv-val %}
+
+; Check that inttoptr followed by ptr.annotation does not produce a
+; double-pointer type for OpConvertUToPtr (and there is no OpBitcast back to
+; single-pointer type).
+
+; CHECK-DAG: %[[#UCHAR:]] = OpTypeInt 8 0
+; CHECK-DAG: %[[#PTR:]] = OpTypePointer CrossWorkgroup %[[#UCHAR]]
+; CHECK: %[[#CONV:]] = OpConvertUToPtr %[[#PTR]]
+; CHECK-NOT: OpBitcast %[[#PTR]] %[[#CONV]]
+; CHECK: OpFunctionCall %[[#]] %[[#]] %[[#CONV]]
+
+ at .str.file = private unnamed_addr addrspace(1) constant [1 x i8] zeroinitializer, section "llvm.metadata", align 1
+ at .str.cachecontrol = private unnamed_addr addrspace(1) constant [13 x i8] c"{6442:\220,1\22}\00", section "llvm.metadata", align 1
+ at .str.cachecontrol.1 = private unnamed_addr addrspace(1) constant [13 x i8] c"{6442:\221,1\22}\00", section "llvm.metadata", align 1
+
+declare spir_func void @_Z45intel_sub_group_2d_block_prefetch_16b_8r16x2cPU3AS1viiiDv2_i(ptr addrspace(1) nonnull, i32, i32, i32, <2 x i32>) #0
+
+define spir_kernel void @test_inttoptr_annotation(ptr addrspace(1) %base) {
+entry:
+ %int = ptrtoint ptr addrspace(1) %base to i64
+ %vec = insertelement <4 x i64> zeroinitializer, i64 %int, i64 0
+ %cast = bitcast <4 x i64> %vec to <8 x i32>
+ %recast = bitcast <8 x i32> %cast to <4 x i64>
+ %extracted = extractelement <4 x i64> %recast, i64 0
+ %int2ptr = inttoptr i64 %extracted to ptr addrspace(1)
+ %coords = insertelement <2 x i32> zeroinitializer, i32 42, i32 1
+ %a1 = call ptr addrspace(1) @llvm.ptr.annotation.p1.p1(ptr addrspace(1) %int2ptr, ptr addrspace(1) @.str.cachecontrol, ptr addrspace(1) @.str.file, i32 0, ptr addrspace(1) null)
+ %a2 = call ptr addrspace(1) @llvm.ptr.annotation.p1.p1(ptr addrspace(1) %a1, ptr addrspace(1) @.str.cachecontrol.1, ptr addrspace(1) @.str.file, i32 0, ptr addrspace(1) null)
+ call spir_func void @_Z45intel_sub_group_2d_block_prefetch_16b_8r16x2cPU3AS1viiiDv2_i(ptr addrspace(1) nonnull %a2, i32 8192, i32 4096, i32 8192, <2 x i32> %coords) #0
+ ret void
+}
+
+declare ptr addrspace(1) @llvm.ptr.annotation.p1.p1(ptr addrspace(1), ptr addrspace(1), ptr addrspace(1), i32, ptr addrspace(1))
+
+attributes #0 = { nounwind memory(argmem: read) }
More information about the llvm-commits
mailing list