[PATCH 71/79] [Backport to 15] Implement support for SPV_KHR_shader_clock (#2026...
authorAleksander Mielczarek <110471911+naxiiv@users.noreply.github.com>
Wed, 8 Nov 2023 23:29:03 +0000 (01:29 +0200)
committerAndreas Beckmann <anbe@debian.org>
Thu, 14 Mar 2024 19:01:08 +0000 (20:01 +0100)
Link to the spec: https://github.com/KhronosGroup/SPIRV-Registry/blob/main/extensions/KHR/SPV_KHR_shader_clock.asciidoc

Co-authored-by: jgstarIntel <joey.genfi@intel.com>
Gbp-Pq: Name 0071-Backport-to-15-Implement-support-for-SPV_KHR_shader_.patch

include/LLVMSPIRVExtensions.inc
lib/SPIRV/libSPIRV/SPIRVInstruction.h
lib/SPIRV/libSPIRV/SPIRVOpCodeEnum.h
test/extensions/KHR/SPV_KHR_shader_clock/shader_clock.ll [new file with mode: 0644]

index e3bc506cabcdd5a55976a7e5f0e9d0601ee8767d..5a23275b6bd12cb7e9561de08ecbf5d4dce81379 100644 (file)
@@ -13,6 +13,7 @@ EXT(SPV_KHR_bit_instructions)
 EXT(SPV_KHR_uniform_group_instructions)
 EXT(SPV_KHR_subgroup_rotate)
 EXT(SPV_KHR_non_semantic_info)
+EXT(SPV_KHR_shader_clock)
 EXT(SPV_INTEL_subgroups)
 EXT(SPV_INTEL_media_block_io)
 EXT(SPV_INTEL_device_side_avc_motion_estimation)
index bd5b338c5b3d85e4a5669b9723408904ec7df1b9..91b88f0045721069fcbdc9c6db911360a80408ea 100644 (file)
@@ -3662,6 +3662,42 @@ protected:
   typedef SPIRVTensorFloat32RoundingINTELInstBase<internal::Op##x> SPIRV##x;
 _SPIRV_OP(RoundFToTF32INTEL)
 #undef _SPIRV_OP
-} // namespace SPIRV
 
+template <Op OC> class SPIRVReadClockKHRInstBase : public SPIRVUnaryInst<OC> {
+protected:
+  SPIRVCapVec getRequiredCapability() const override {
+    return getVec(CapabilityShaderClockKHR);
+  }
+
+  llvm::Optional<ExtensionID> getRequiredExtension() const override {
+    return ExtensionID::SPV_KHR_shader_clock;
+  }
+
+  void validate() const override {
+    SPIRVUnaryInst<OC>::validate();
+
+    SPIRVType *ResCompTy = this->getType();
+    SPIRVWord ResCompCount = 1;
+    if (ResCompTy->isTypeVector()) {
+      ResCompCount = ResCompTy->getVectorComponentCount();
+      ResCompTy = ResCompTy->getVectorComponentType();
+    }
+    auto InstName = OpCodeNameMap::map(OC);
+    SPIRVErrorLog &SPVErrLog = this->getModule()->getErrorLog();
+
+    // check for either 64 bit int type or two element vector of 32 bit int
+    // types.
+    SPVErrLog.checkError(
+        ResCompTy->isTypeInt(64) ||
+            (ResCompCount == 2 && ResCompTy->isTypeInt(32)),
+        SPIRVEC_InvalidInstruction,
+        InstName + "\nResult value must be a scalar of integer"
+                   " 64-bit type or two element vector of 32-bit type\n");
+  }
+};
+#define _SPIRV_OP(x, ...) typedef SPIRVReadClockKHRInstBase<Op##x> SPIRV##x;
+_SPIRV_OP(ReadClockKHR)
+#undef _SPIRV_OP
+
+} // namespace SPIRV
 #endif // SPIRV_LIBSPIRV_SPIRVINSTRUCTION_H
index 94197e7bb0400ac9af6c0aa0923de39b854530b2..a6961fcb0baf342bdca5d6bcf6cd767e4101b2dd 100644 (file)
@@ -335,6 +335,7 @@ _SPIRV_OP(SUDotKHR, 4452)
 _SPIRV_OP(SDotAccSatKHR, 4453)
 _SPIRV_OP(UDotAccSatKHR, 4454)
 _SPIRV_OP(SUDotAccSatKHR, 4455)
+_SPIRV_OP(ReadClockKHR, 5056)
 _SPIRV_OP(SubgroupShuffleINTEL, 5571)
 _SPIRV_OP(SubgroupShuffleDownINTEL, 5572)
 _SPIRV_OP(SubgroupShuffleUpINTEL, 5573)
diff --git a/test/extensions/KHR/SPV_KHR_shader_clock/shader_clock.ll b/test/extensions/KHR/SPV_KHR_shader_clock/shader_clock.ll
new file mode 100644 (file)
index 0000000..4ccfceb
--- /dev/null
@@ -0,0 +1,46 @@
+; RUN: llvm-as %s -o %t.bc
+; RUN: llvm-spirv %t.bc -o %t.spv --spirv-ext=+SPV_KHR_shader_clock
+; 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.rev.bc -r -emit-opaque-pointers --spirv-target-env=SPV-IR
+; RUN: llvm-dis %t.rev.bc -o %t.rev.ll
+; RUN: FileCheck < %t.rev.ll %s --check-prefix=CHECK-LLVM
+
+; RUN: not llvm-spirv %t.bc 2>&1 | FileCheck %s --check-prefix=CHECK-ERROR
+; CHECK-ERROR: RequiresExtension: Feature requires the following SPIR-V extension:
+; CHECK-ERROR-NEXT: SPV_KHR_shader_clock
+
+target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-n8:16:32:64"
+target triple = "spir64-unknown-unknown"
+
+; CHECK-SPIRV: Capability ShaderClockKHR
+; CHECK-SPIRV: Extension "SPV_KHR_shader_clock"
+; CHECK-SPIRV: TypeInt [[#I32Ty:]] 32
+; CHECK-SPIRV: TypeInt [[#I64Ty:]] 64
+; CHECK-SPIRV: TypeVector [[#I32v2Ty:]] [[#I32Ty]] 2
+
+; CHECK-SPIRV: FunctionParameter [[#I32Ty]] [[I32ValId:.*]]
+
+; CHECK-SPIRV: ReadClockKHR [[#I32v2Ty]] [[#]] [[I32ValId]]
+; CHECK-SPIRV: ReadClockKHR [[#I64Ty]] [[#]] [[I32ValId]]
+
+; CHECK-LLVM: call spir_func <2 x i32> @_Z20__spirv_ReadClockKHR
+; CHECK-LLVM: call spir_func i64 @_Z20__spirv_ReadClockKHR
+
+define spir_func void @_Z7read_types(i32 %a) {
+  %1 = tail call spir_func <2 x i32> @_Z20__spirv_ReadClockKHRIDv2_jET_j(i32 %a)
+  %2 = tail call spir_func i64 @_Z20__spirv_ReadClockKHRImET_j(i32 %a)
+  ret void
+}
+
+declare spir_func <2 x i32> @_Z20__spirv_ReadClockKHRIDv2_jET_j(i32)
+
+declare spir_func i64 @_Z20__spirv_ReadClockKHRImET_j(i32)
+
+!opencl.spir.version = !{!0}
+!spirv.Source = !{!1}
+!llvm.ident = !{!2}
+
+!0 = !{i32 1, i32 2}
+!1 = !{i32 4, i32 100000}
+!2 = !{!"clang version 16.0.0"}