Skip to content

Commit

Permalink
Fix SPIRV Friendly IR for OpGenericPtrMemSemantics
Browse files Browse the repository at this point in the history
  • Loading branch information
aratajew authored and vmaksimo committed Dec 28, 2021
1 parent 00befa1 commit e07fa00
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 2 deletions.
2 changes: 0 additions & 2 deletions llvm-spirv/lib/SPIRV/SPIRVReader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2908,8 +2908,6 @@ SPIRVToLLVM::transOCLBuiltinPostproc(SPIRVInstruction *BI, CallInst *CI,
return CastInst::Create(Instruction::Trunc, CI, transType(BI->getType()),
"cvt", BB);
}
if (OC == OpGenericPtrMemSemantics)
return BinaryOperator::CreateShl(CI, getInt32(M, 8), "", BB);
if (SPIRVEnableStepExpansion &&
(DemangledName == "smoothstep" || DemangledName == "step"))
return expandOCLBuiltinWithScalarArg(CI, DemangledName);
Expand Down
19 changes: 19 additions & 0 deletions llvm-spirv/lib/SPIRV/SPIRVToOCL.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,10 @@ void SPIRVToOCLBase::visitCallInst(CallInst &CI) {
visitCallSPIRVEnqueueKernel(&CI, OC);
return;
}
if (OC == OpGenericPtrMemSemantics) {
visitCallSPIRVGenericPtrMemSemantics(&CI);
return;
}
if (OCLSPIRVBuiltinMap::rfind(OC))
visitCallSPIRVBuiltin(&CI, OC);
}
Expand Down Expand Up @@ -942,6 +946,21 @@ void SPIRVToOCLBase::visitCallSPIRVAvcINTELEvaluateBuiltIn(CallInst *CI,
&Attrs);
}

void SPIRVToOCLBase::visitCallSPIRVGenericPtrMemSemantics(CallInst *CI) {
AttributeList Attrs = CI->getCalledFunction()->getAttributes();
mutateCallInstOCL(
M, CI,
[=](CallInst *, std::vector<Value *> &Args, Type *&RetTy) {
return OCLSPIRVBuiltinMap::rmap(OpGenericPtrMemSemantics);
},
[=](CallInst *CI) -> Instruction * {
auto *Shl = BinaryOperator::CreateShl(CI, getInt32(M, 8), "");
Shl->insertAfter(CI);
return Shl;
},
&Attrs);
}

void SPIRVToOCLBase::visitCallSPIRVBuiltin(CallInst *CI, Op OC) {
AttributeList Attrs = CI->getCalledFunction()->getAttributes();
mutateCallInstOCL(
Expand Down
5 changes: 5 additions & 0 deletions llvm-spirv/lib/SPIRV/SPIRVToOCL.h
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,11 @@ class SPIRVToOCLBase : public InstVisitor<SPIRVToOCLBase> {
/// intel_sub_group_avc_mce_get_default_inter_base_multi_reference_penalty
void visitCallSPIRVAvcINTELInstructionBuiltin(CallInst *CI, Op OC);

/// Transform __spirv_GenericPtrMemSemantics to:
/// %0 = call spirv_func i32 @_Z9get_fence
/// %1 = shl i31 %0, 8
void visitCallSPIRVGenericPtrMemSemantics(CallInst *CI);

/// Transform __spirv_* builtins to OCL 2.0 builtins.
/// No change with arguments.
void visitCallSPIRVBuiltin(CallInst *CI, Op OC);
Expand Down
5 changes: 5 additions & 0 deletions llvm-spirv/test/transcoding/OpGenericPtrMemSemantics.ll
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,17 @@
; RUN: FileCheck < %t.txt %s --check-prefix=CHECK-SPIRV
; RUN: llvm-spirv %t.bc -o %t.spv
; RUN: spirv-val %t.spv
; RUN: llvm-spirv -r --spirv-target-env=SPV-IR %t.spv -o %t.rev.bc
; RUN: llvm-dis < %t.rev.bc | FileCheck %s --check-prefix=CHECK-SPV-IR
; RUN: llvm-spirv -r %t.spv -o %t.rev.bc
; RUN: llvm-dis < %t.rev.bc | FileCheck %s --check-prefix=CHECK-LLVM

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

; CHECK-SPV-IR: call spir_func i32 @_Z30__spirv_GenericPtrMemSemanticsPU3AS4c(i8 addrspace(4)* {{.*}})
; CHECK-SPV-IR: lshr

; Note that round-trip conversion replaces 'get_fence (gentype *ptr)' built-in function with 'get_fence (const gentype *ptr)'.
; CHECK-LLVM: call spir_func i32 @_Z9get_fencePU3AS4Kv(i8
; CHECK-LLVM-NEXT: shl
Expand Down

0 comments on commit e07fa00

Please sign in to comment.