Skip to content

Commit e07fa00

Browse files
aratajewvmaksimo
authored andcommitted
Fix SPIRV Friendly IR for OpGenericPtrMemSemantics
Original commit: KhronosGroup/SPIRV-LLVM-Translator@987a1ab
1 parent 00befa1 commit e07fa00

File tree

4 files changed

+29
-2
lines changed

4 files changed

+29
-2
lines changed

llvm-spirv/lib/SPIRV/SPIRVReader.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2908,8 +2908,6 @@ SPIRVToLLVM::transOCLBuiltinPostproc(SPIRVInstruction *BI, CallInst *CI,
29082908
return CastInst::Create(Instruction::Trunc, CI, transType(BI->getType()),
29092909
"cvt", BB);
29102910
}
2911-
if (OC == OpGenericPtrMemSemantics)
2912-
return BinaryOperator::CreateShl(CI, getInt32(M, 8), "", BB);
29132911
if (SPIRVEnableStepExpansion &&
29142912
(DemangledName == "smoothstep" || DemangledName == "step"))
29152913
return expandOCLBuiltinWithScalarArg(CI, DemangledName);

llvm-spirv/lib/SPIRV/SPIRVToOCL.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,10 @@ void SPIRVToOCLBase::visitCallInst(CallInst &CI) {
181181
visitCallSPIRVEnqueueKernel(&CI, OC);
182182
return;
183183
}
184+
if (OC == OpGenericPtrMemSemantics) {
185+
visitCallSPIRVGenericPtrMemSemantics(&CI);
186+
return;
187+
}
184188
if (OCLSPIRVBuiltinMap::rfind(OC))
185189
visitCallSPIRVBuiltin(&CI, OC);
186190
}
@@ -942,6 +946,21 @@ void SPIRVToOCLBase::visitCallSPIRVAvcINTELEvaluateBuiltIn(CallInst *CI,
942946
&Attrs);
943947
}
944948

949+
void SPIRVToOCLBase::visitCallSPIRVGenericPtrMemSemantics(CallInst *CI) {
950+
AttributeList Attrs = CI->getCalledFunction()->getAttributes();
951+
mutateCallInstOCL(
952+
M, CI,
953+
[=](CallInst *, std::vector<Value *> &Args, Type *&RetTy) {
954+
return OCLSPIRVBuiltinMap::rmap(OpGenericPtrMemSemantics);
955+
},
956+
[=](CallInst *CI) -> Instruction * {
957+
auto *Shl = BinaryOperator::CreateShl(CI, getInt32(M, 8), "");
958+
Shl->insertAfter(CI);
959+
return Shl;
960+
},
961+
&Attrs);
962+
}
963+
945964
void SPIRVToOCLBase::visitCallSPIRVBuiltin(CallInst *CI, Op OC) {
946965
AttributeList Attrs = CI->getCalledFunction()->getAttributes();
947966
mutateCallInstOCL(

llvm-spirv/lib/SPIRV/SPIRVToOCL.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,11 @@ class SPIRVToOCLBase : public InstVisitor<SPIRVToOCLBase> {
156156
/// intel_sub_group_avc_mce_get_default_inter_base_multi_reference_penalty
157157
void visitCallSPIRVAvcINTELInstructionBuiltin(CallInst *CI, Op OC);
158158

159+
/// Transform __spirv_GenericPtrMemSemantics to:
160+
/// %0 = call spirv_func i32 @_Z9get_fence
161+
/// %1 = shl i31 %0, 8
162+
void visitCallSPIRVGenericPtrMemSemantics(CallInst *CI);
163+
159164
/// Transform __spirv_* builtins to OCL 2.0 builtins.
160165
/// No change with arguments.
161166
void visitCallSPIRVBuiltin(CallInst *CI, Op OC);

llvm-spirv/test/transcoding/OpGenericPtrMemSemantics.ll

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,17 @@
33
; RUN: FileCheck < %t.txt %s --check-prefix=CHECK-SPIRV
44
; RUN: llvm-spirv %t.bc -o %t.spv
55
; RUN: spirv-val %t.spv
6+
; RUN: llvm-spirv -r --spirv-target-env=SPV-IR %t.spv -o %t.rev.bc
7+
; RUN: llvm-dis < %t.rev.bc | FileCheck %s --check-prefix=CHECK-SPV-IR
68
; RUN: llvm-spirv -r %t.spv -o %t.rev.bc
79
; RUN: llvm-dis < %t.rev.bc | FileCheck %s --check-prefix=CHECK-LLVM
810

911
; CHECK-SPIRV: 4 GenericPtrMemSemantics {{[0-9]+}} [[ResID:[0-9]+]] {{[0-9]+}}
1012
; CHECK-SPIRV-NEXT: 5 ShiftRightLogical {{[0-9]+}} {{[0-9]+}} [[ResID]] {{[0-9]+}}
1113

14+
; CHECK-SPV-IR: call spir_func i32 @_Z30__spirv_GenericPtrMemSemanticsPU3AS4c(i8 addrspace(4)* {{.*}})
15+
; CHECK-SPV-IR: lshr
16+
1217
; Note that round-trip conversion replaces 'get_fence (gentype *ptr)' built-in function with 'get_fence (const gentype *ptr)'.
1318
; CHECK-LLVM: call spir_func i32 @_Z9get_fencePU3AS4Kv(i8
1419
; CHECK-LLVM-NEXT: shl

0 commit comments

Comments
 (0)