Skip to content

Commit 8659507

Browse files
delecuijsji
authored andcommitted
Fix SPIR-V Builtin OpGenericCastToPtr transformation to OCL (#2763)
OpGenericCastToPtrExplict is for dynamic cast and OpGenericCastToPtr is for static cast. OpGenericCastToPtrExplict is already transformed to to_{global|local|private} OCL builtins, but the handling for OpGenericCastToPtr is missing. Looks we can transform OpGenericCastToPtr to addrspacecast instruction directly in SPIRV to OCL transformation. Signed-off-by: Cui, Dele <[email protected]> Original commit: KhronosGroup/SPIRV-LLVM-Translator@21e96548e242860
1 parent 77ca54d commit 8659507

File tree

3 files changed

+68
-0
lines changed

3 files changed

+68
-0
lines changed

llvm-spirv/lib/SPIRV/SPIRVToOCL.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,10 @@ void SPIRVToOCLBase::visitCallInst(CallInst &CI) {
156156
visitCallBuildNDRangeBuiltIn(&CI, OC, DemangledName);
157157
return;
158158
}
159+
if (OC == OpGenericCastToPtr) {
160+
visitCallGenericCastToPtrBuiltIn(&CI, OC);
161+
return;
162+
}
159163
if (OC == OpGenericCastToPtrExplicit) {
160164
visitCallGenericCastToPtrExplicitBuiltIn(&CI, OC);
161165
return;
@@ -629,6 +633,18 @@ void SPIRVToOCLBase::visitCallBuildNDRangeBuiltIn(CallInst *CI, Op OC,
629633
.moveArg(2, 0);
630634
}
631635

636+
void SPIRVToOCLBase::visitCallGenericCastToPtrBuiltIn(CallInst *CI, Op OC) {
637+
assert(CI->getCalledFunction() && "Unexpected indirect call");
638+
IRBuilder<> Builder(CI);
639+
Value *PtrArg = CI->getArgOperand(0);
640+
auto AddrSpace =
641+
static_cast<SPIRAddressSpace>(CI->getType()->getPointerAddressSpace());
642+
Type *NewTy = PointerType::get(PtrArg->getType(), AddrSpace);
643+
Value *ASC = Builder.CreateAddrSpaceCast(PtrArg, NewTy);
644+
CI->replaceAllUsesWith(ASC);
645+
CI->eraseFromParent();
646+
}
647+
632648
void SPIRVToOCLBase::visitCallGenericCastToPtrExplicitBuiltIn(CallInst *CI,
633649
Op OC) {
634650
assert(CI->getCalledFunction() && "Unexpected indirect call");

llvm-spirv/lib/SPIRV/SPIRVToOCL.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,10 @@ class SPIRVToOCLBase : public InstVisitor<SPIRVToOCLBase>,
107107
/// intel_sub_group_media_block_write
108108
void visitCallSPIRVImageMediaBlockBuiltin(CallInst *CI, Op OC);
109109

110+
/// Transform __spirv_OpGenericCastToPtr_To{Global|Local|Private} to llvm
111+
/// addrspacecast instruction.
112+
void visitCallGenericCastToPtrBuiltIn(CallInst *CI, Op OC);
113+
110114
/// Transform __spirv_OpGenericCastToPtrExplicit_To{Global|Local|Private} to
111115
/// to_{global|local|private} OCL builtin.
112116
void visitCallGenericCastToPtrExplicitBuiltIn(CallInst *CI, Op OC);
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
; REQUIRES: pass-plugin
2+
; UNSUPPORTED: target={{.*windows.*}}
3+
4+
; RUN: opt %load_spirv_lib -passes=spirv-to-ocl20 %s -S -o - | FileCheck %s --check-prefixes=CHECK-LLVM-OCL
5+
6+
%id = type { %arr }
7+
%arr = type { [1 x i64] }
8+
9+
@__spirv_BuiltInGlobalInvocationId = external local_unnamed_addr addrspace(1) constant <3 x i64>
10+
11+
; Check that SPIR-V Builtin GenericCastToPtr and GenericCastToPtrExplicit can be transformed to OCL.
12+
13+
; CHECK-LLVM-OCL-LABEL: void @test(
14+
; CHECK-LLVM-OCL: %[[VAR_1:.*]] = addrspacecast ptr addrspace(1) %idx to ptr addrspace(4)
15+
; CHECK-LLVM-OCL-NEXT: %[[VAR_2:.*]] = addrspacecast ptr addrspace(3) %_arg_LocalA to ptr addrspace(4)
16+
; CHECK-LLVM-OCL-NEXT: %[[VAR_3:.*]] = addrspacecast ptr %var to ptr addrspace(4)
17+
; CHECK-LLVM-OCL-NEXT: addrspacecast ptr addrspace(4) %[[VAR_1]] to ptr addrspace(1)
18+
; CHECK-LLVM-OCL-NEXT: addrspacecast ptr addrspace(4) %[[VAR_2]] to ptr addrspace(3)
19+
; CHECK-LLVM-OCL-NEXT: addrspacecast ptr addrspace(4) %[[VAR_3]] to ptr
20+
; CHECK-LLVM-OCL-NEXT: call spir_func ptr addrspace(1) @__to_global(ptr addrspace(4) %[[VAR_1]])
21+
; CHECK-LLVM-OCL-NEXT: call spir_func ptr addrspace(3) @__to_local(ptr addrspace(4) %[[VAR_2]])
22+
; CHECK-LLVM-OCL-NEXT: call spir_func ptr @__to_private(ptr addrspace(4) %[[VAR_3]])
23+
24+
define spir_kernel void @test(ptr addrspace(1) %_arg_GlobalA, ptr byval(%id) %_arg_GlobalId, ptr addrspace(3) %_arg_LocalA) {
25+
entry:
26+
%var = alloca i32
27+
%p0 = load i64, ptr %_arg_GlobalId
28+
%add = getelementptr inbounds i32, ptr addrspace(1) %_arg_GlobalA, i64 %p0
29+
%p2 = load i64, ptr addrspace(1) @__spirv_BuiltInGlobalInvocationId
30+
%idx = getelementptr inbounds i32, ptr addrspace(1) %add, i64 %p2
31+
%var1 = addrspacecast ptr addrspace(1) %idx to ptr addrspace(4)
32+
%var2 = addrspacecast ptr addrspace(3) %_arg_LocalA to ptr addrspace(4)
33+
%var3 = addrspacecast ptr %var to ptr addrspace(4)
34+
%G = call spir_func ptr addrspace(1) @_Z33__spirv_GenericCastToPtr_ToGlobalPvi(ptr addrspace(4) %var1, i32 5)
35+
%L = call spir_func ptr addrspace(3) @_Z32__spirv_GenericCastToPtr_ToLocalPvi(ptr addrspace(4) %var2, i32 4)
36+
%P = call spir_func ptr @_Z34__spirv_GenericCastToPtr_ToPrivatePvi(ptr addrspace(4) %var3, i32 7)
37+
%GE = call spir_func ptr addrspace(1) @_Z41__spirv_GenericCastToPtrExplicit_ToGlobalPvi(ptr addrspace(4) %var1, i32 5)
38+
%LE = call spir_func ptr addrspace(3) @_Z40__spirv_GenericCastToPtrExplicit_ToLocalPvi(ptr addrspace(4) %var2, i32 4)
39+
%PE = call spir_func ptr @_Z42__spirv_GenericCastToPtrExplicit_ToPrivatePvi(ptr addrspace(4) %var3, i32 7)
40+
ret void
41+
}
42+
43+
declare spir_func ptr addrspace(1) @_Z33__spirv_GenericCastToPtr_ToGlobalPvi(ptr addrspace(4), i32)
44+
declare spir_func ptr addrspace(3) @_Z32__spirv_GenericCastToPtr_ToLocalPvi(ptr addrspace(4), i32)
45+
declare spir_func ptr @_Z34__spirv_GenericCastToPtr_ToPrivatePvi(ptr addrspace(4), i32)
46+
declare spir_func ptr addrspace(1) @_Z41__spirv_GenericCastToPtrExplicit_ToGlobalPvi(ptr addrspace(4), i32)
47+
declare spir_func ptr addrspace(3) @_Z40__spirv_GenericCastToPtrExplicit_ToLocalPvi(ptr addrspace(4), i32)
48+
declare spir_func ptr @_Z42__spirv_GenericCastToPtrExplicit_ToPrivatePvi(ptr addrspace(4), i32)

0 commit comments

Comments
 (0)