From 791d407f7f8376c72584a63f6ffe29cc5759da14 Mon Sep 17 00:00:00 2001 From: DmitryBushev Date: Thu, 17 Dec 2020 17:03:29 +0300 Subject: [PATCH] Update translator for new Fast Composite extension SPV_INTEL_fast_composite extension specification separated some decorations and execution modes from SPV_INTEL_vector_compute --- lib/SPIRV/SPIRVReader.cpp | 8 ++++-- lib/SPIRV/SPIRVWriter.cpp | 11 +++++--- lib/SPIRV/TransOCLMD.cpp | 3 ++ lib/SPIRV/VectorComputeUtil.h | 1 + lib/SPIRV/libSPIRV/SPIRVEnum.h | 5 ++-- lib/SPIRV/libSPIRV/SPIRVIsValidEnum.h | 2 +- lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h | 4 +-- lib/SPIRV/libSPIRV/spirv.hpp | 4 ++- test/callable-attribute-decoration.ll | 2 +- test/fast-composit-entry.ll | 40 +++++++++++++++++++++++++++ 10 files changed, 67 insertions(+), 13 deletions(-) create mode 100644 test/fast-composit-entry.ll diff --git a/lib/SPIRV/SPIRVReader.cpp b/lib/SPIRV/SPIRVReader.cpp index cb26946cfc..672099e3fa 100644 --- a/lib/SPIRV/SPIRVReader.cpp +++ b/lib/SPIRV/SPIRVReader.cpp @@ -2373,6 +2373,12 @@ bool SPIRVToLLVM::transMetadata() { transOCLMetadata(BF); transVectorComputeMetadata(BF); + if (BF->hasDecorate(DecorationCallableFunctionINTEL)) + F->addFnAttr(kVCMetadata::VCCallable); + if (isKernel(BF) && + BF->getExecutionMode(ExecutionModeFastCompositeKernelINTEL)) + F->addFnAttr(kVCMetadata::VCFCEntry); + if (F->getCallingConv() != CallingConv::SPIR_KERNEL) continue; @@ -2509,8 +2515,6 @@ bool SPIRVToLLVM::transVectorComputeMetadata(SPIRVFunction *BF) { SPIRVWord SIMTMode = 0; if (BF->hasDecorate(DecorationSIMTCallINTEL, 0, &SIMTMode)) F->addFnAttr(kVCMetadata::VCSIMTCall, std::to_string(SIMTMode)); - if (BF->hasDecorate(DecorationVectorComputeCallableFunctionINTEL)) - F->addFnAttr(kVCMetadata::VCCallable); for (Function::arg_iterator I = F->arg_begin(), E = F->arg_end(); I != E; ++I) { diff --git a/lib/SPIRV/SPIRVWriter.cpp b/lib/SPIRV/SPIRVWriter.cpp index 06a63af850..0f1a43ca06 100644 --- a/lib/SPIRV/SPIRVWriter.cpp +++ b/lib/SPIRV/SPIRVWriter.cpp @@ -533,6 +533,9 @@ SPIRVFunction *LLVMToSPIRV::transFunctionDecl(Function *F) { if (Attrs.hasAttribute(AttributeList::ReturnIndex, Attribute::SExt)) BF->addDecorate(DecorationFuncParamAttr, FunctionParameterAttributeSext); + if (Attrs.hasFnAttribute(kVCMetadata::VCCallable)) + BF->addDecorate(DecorationCallableFunctionINTEL); + transVectorComputeMetadata(F); SPIRVDBG(dbgs() << "[transFunction] " << *F << " => "; @@ -565,10 +568,6 @@ void LLVMToSPIRV::transVectorComputeMetadata(Function *F) { BF->addDecorate(DecorationSIMTCallINTEL, SIMTMode); } - if (Attrs.hasFnAttribute(kVCMetadata::VCCallable)) { - BF->addDecorate(DecorationVectorComputeCallableFunctionINTEL); - } - for (Function::arg_iterator I = F->arg_begin(), E = F->arg_end(); I != E; ++I) { auto ArgNo = I->getArgNo(); @@ -1637,6 +1636,10 @@ bool LLVMToSPIRV::transExecutionMode() { BF->addExecutionMode(BM->add(new SPIRVExecutionMode( BF, static_cast(EMode), TargetWidth))); } break; + case spv::ExecutionModeFastCompositeKernelINTEL: { + BF->addExecutionMode(BM->add( + new SPIRVExecutionMode(BF, static_cast(EMode)))); + } break; default: llvm_unreachable("invalid execution mode"); } diff --git a/lib/SPIRV/TransOCLMD.cpp b/lib/SPIRV/TransOCLMD.cpp index b5cb5c02e8..184f001f34 100644 --- a/lib/SPIRV/TransOCLMD.cpp +++ b/lib/SPIRV/TransOCLMD.cpp @@ -271,6 +271,9 @@ void TransOCLMD::preprocessVectorComputeMetadata(Module *M, SPIRVMDBuilder *B, .add(SLMSize) .done(); } + if (Attrs.hasFnAttribute(kVCMetadata::VCFCEntry)) { + EM.addOp().add(&F).add(spv::ExecutionModeFastCompositeKernelINTEL).done(); + } } } diff --git a/lib/SPIRV/VectorComputeUtil.h b/lib/SPIRV/VectorComputeUtil.h index fcf082d802..90ce168363 100755 --- a/lib/SPIRV/VectorComputeUtil.h +++ b/lib/SPIRV/VectorComputeUtil.h @@ -109,6 +109,7 @@ const static char VCVolatile[] = "VCVolatile"; const static char VCByteOffset[] = "VCByteOffset"; const static char VCSIMTCall[] = "VCSIMTCall"; const static char VCCallable[] = "VCCallable"; +const static char VCFCEntry[] = "VCFCEntry"; } // namespace kVCMetadata namespace kVCType { diff --git a/lib/SPIRV/libSPIRV/SPIRVEnum.h b/lib/SPIRV/libSPIRV/SPIRVEnum.h index cf9ca06a9d..3471418285 100644 --- a/lib/SPIRV/libSPIRV/SPIRVEnum.h +++ b/lib/SPIRV/libSPIRV/SPIRVEnum.h @@ -247,6 +247,8 @@ template <> inline void SPIRVMap::init() { {CapabilityFloatingPointModeINTEL}); ADD_VEC_INIT(ExecutionModeSharedLocalMemorySizeINTEL, {CapabilityVectorComputeINTEL}); + ADD_VEC_INIT(ExecutionModeFastCompositeKernelINTEL, + {CapabilityFastCompositeINTEL}); } template <> inline void SPIRVMap::init() { @@ -374,8 +376,7 @@ template <> inline void SPIRVMap::init() { {CapabilityFunctionFloatControlINTEL}); ADD_VEC_INIT(DecorationFunctionFloatingPointModeINTEL, {CapabilityFunctionFloatControlINTEL}); - ADD_VEC_INIT(DecorationVectorComputeCallableFunctionINTEL, - {CapabilityVectorComputeINTEL}); + ADD_VEC_INIT(DecorationCallableFunctionINTEL, {CapabilityFastCompositeINTEL}); } template <> inline void SPIRVMap::init() { diff --git a/lib/SPIRV/libSPIRV/SPIRVIsValidEnum.h b/lib/SPIRV/libSPIRV/SPIRVIsValidEnum.h index de2a829621..fe39392d74 100644 --- a/lib/SPIRV/libSPIRV/SPIRVIsValidEnum.h +++ b/lib/SPIRV/libSPIRV/SPIRVIsValidEnum.h @@ -416,7 +416,7 @@ inline bool isValid(spv::Decoration V) { case DecorationFunctionRoundingModeINTEL: case DecorationFunctionDenormModeINTEL: case DecorationFunctionFloatingPointModeINTEL: - case DecorationVectorComputeCallableFunctionINTEL: + case DecorationCallableFunctionINTEL: return true; default: return false; diff --git a/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h b/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h index f1c80b5acf..ab3c2c6c1f 100644 --- a/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h +++ b/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h @@ -351,8 +351,7 @@ template <> inline void SPIRVMap::init() { add(DecorationFunctionDenormModeINTEL, "FunctionDenormModeINTEL"); add(DecorationFunctionFloatingPointModeINTEL, "FunctionFloatingPointModeINTEL"); - add(DecorationVectorComputeCallableFunctionINTEL, - "VectorComputeCallableFunctionINTEL"); + add(DecorationCallableFunctionINTEL, "CallableFunctionINTEL"); } SPIRV_DEF_NAMEMAP(Decoration, SPIRVDecorationNameMap) @@ -510,6 +509,7 @@ template <> inline void SPIRVMap::init() { add(CapabilitySubgroupAvcMotionEstimationChromaINTEL, "SubgroupAvcMotionEstimationChromaINTEL"); add(CapabilityFunctionFloatControlINTEL, "FunctionFloatControlINTEL"); + add(CapabilityFastCompositeINTEL, "FastCompositeINTEL"); } SPIRV_DEF_NAMEMAP(Capability, SPIRVCapabilityNameMap) diff --git a/lib/SPIRV/libSPIRV/spirv.hpp b/lib/SPIRV/libSPIRV/spirv.hpp index 28006694af..00fe0f91a3 100644 --- a/lib/SPIRV/libSPIRV/spirv.hpp +++ b/lib/SPIRV/libSPIRV/spirv.hpp @@ -136,6 +136,7 @@ enum ExecutionMode { ExecutionModeRoundingModeRTNINTEL = 5621, ExecutionModeFloatingPointModeALTINTEL = 5622, ExecutionModeFloatingPointModeIEEEINTEL = 5623, + ExecutionModeFastCompositeKernelINTEL = 6088, ExecutionModeMax = 0x7fffffff, }; @@ -416,7 +417,7 @@ enum Decoration { DecorationFunctionRoundingModeINTEL = 5822, DecorationFunctionDenormModeINTEL = 5823, DecorationFunctionFloatingPointModeINTEL = 6080, - DecorationVectorComputeCallableFunctionINTEL = 6087, + DecorationCallableFunctionINTEL = 6087, DecorationMax = 0x7fffffff, }; @@ -696,6 +697,7 @@ enum Capability { CapabilityRoundToInfinityINTEL = 5582, CapabilityFloatingPointModeINTEL = 5583, CapabilityFunctionFloatControlINTEL = 5821, + CapabilityFastCompositeINTEL = 6093, CapabilityMax = 0x7fffffff, }; diff --git a/test/callable-attribute-decoration.ll b/test/callable-attribute-decoration.ll index dbf5492755..ddd37b9505 100644 --- a/test/callable-attribute-decoration.ll +++ b/test/callable-attribute-decoration.ll @@ -12,7 +12,7 @@ define dso_local <4 x i32> @foo(<4 x i32> %a, <4 x i32> %b) #0 { entry: ret <4 x i32> %a } -; CHECK-SPIRV: 3 Decorate {{[0-9]+}} VectorComputeCallableFunctionINTEL +; CHECK-SPIRV: 3 Decorate {{[0-9]+}} CallableFunctionINTEL ; CHECK-LLVM: attributes ; CHECK-LLVM-SAME: "VCCallable" diff --git a/test/fast-composit-entry.ll b/test/fast-composit-entry.ll new file mode 100644 index 0000000000..ff137b5cb1 --- /dev/null +++ b/test/fast-composit-entry.ll @@ -0,0 +1,40 @@ +; RUN: llvm-as %s -o %t.bc +; RUN: llvm-spirv %t.bc -o %t.spv +; RUN: llvm-spirv %t.spv -o %t.spt --to-text +; RUN: FileCheck < %t.spt %s --check-prefix=CHECK-SPIRV +; RUN: llvm-spirv %t.spv -o %t.bc -r +; RUN: llvm-dis %t.bc -o %t.ll +; RUN: FileCheck < %t.ll %s --check-prefix=CHECK-LLVM + +target triple = "spir64-unknown-unknown" + + +; CHECK-SPIRV: {{[0-9]+}} EntryPoint {{[0-9]+}} [[FOO_ID:[0-9]+]] "foo" +; CHECK-SPIRV: {{[0-9]+}} EntryPoint {{[0-9]+}} [[BAR_ID:[0-9]+]] "bar" +; CHECK-SPIRV: 3 ExecutionMode [[FOO_ID]] 6088 +; CHECK-SPIRV-NOT: 3 ExecutionMode [[BAR_ID]] 6088 + +; CHECK-LLVM: define spir_kernel void @foo +; CHECK-LLVM-SAME: #[[FOO_ATTR_ID:[0-9]+]] +; CHECK-LLVM: define spir_kernel void @bar +; CHECK-LLVM-SAME: #[[BAR_ATTR_ID:[0-9]+]] + +; CHECK-LLVM: attributes #[[FOO_ATTR_ID]] +; CHECK-LLVM-SAME: "VCFCEntry" +; CHECK-LLVM: attributes #[[BAR_ATTR_ID]] +; CHECK-LLVM-NOT: "VCFCEntry" + + +define spir_kernel void @foo(<4 x i32> %a, <4 x i32> %b) #0 { +entry: + ret void +} + +define spir_kernel void @bar(<4 x i32> %a, <4 x i32> %b) #1 { +entry: + ret void +} + +attributes #0 = { noinline nounwind "VCFCEntry" "VCFloatControl"="0" "VCFunction" } +attributes #1 = { noinline nounwind "VCFloatControl"="48" "VCFunction" } +