Skip to content

Commit 14193f4

Browse files
[SPIR-V] SPIR-V Backend must generate a valid OCL version if working in OpenCL environment (#89199)
If there is no information about OpenCL version we are forced to generate OpenCL 1.0 by default for the OpenCL environment to avoid puzzling run-times with Unknown/0.0 version output. For a reference, LLVM-SPIRV Translator avoids potential issues with run-times in a similar manner.
1 parent e8fce95 commit 14193f4

File tree

2 files changed

+27
-10
lines changed

2 files changed

+27
-10
lines changed

llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -167,10 +167,21 @@ void SPIRVModuleAnalysis::setBaseInfo(const Module &M) {
167167
unsigned MajorNum = getMetadataUInt(VersionMD, 0, 2);
168168
unsigned MinorNum = getMetadataUInt(VersionMD, 1);
169169
unsigned RevNum = getMetadataUInt(VersionMD, 2);
170-
MAI.SrcLangVersion = (MajorNum * 100 + MinorNum) * 1000 + RevNum;
170+
// Prevent Major part of OpenCL version to be 0
171+
MAI.SrcLangVersion =
172+
(std::max(1U, MajorNum) * 100 + MinorNum) * 1000 + RevNum;
171173
} else {
172-
MAI.SrcLang = SPIRV::SourceLanguage::Unknown;
173-
MAI.SrcLangVersion = 0;
174+
// If there is no information about OpenCL version we are forced to generate
175+
// OpenCL 1.0 by default for the OpenCL environment to avoid puzzling
176+
// run-times with Unknown/0.0 version output. For a reference, LLVM-SPIRV
177+
// Translator avoids potential issues with run-times in a similar manner.
178+
if (ST->isOpenCLEnv()) {
179+
MAI.SrcLang = SPIRV::SourceLanguage::OpenCL_CPP;
180+
MAI.SrcLangVersion = 100000;
181+
} else {
182+
MAI.SrcLang = SPIRV::SourceLanguage::Unknown;
183+
MAI.SrcLangVersion = 0;
184+
}
174185
}
175186

176187
if (auto ExtNode = M.getNamedMetadata("opencl.used.extensions")) {
Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
1-
; RUN: llc -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s
1+
; RUN: llc -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-OCL
22
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}
33

4-
; CHECK-DAG: OpCapability Addresses
5-
; CHECK-DAG: OpCapability Linkage
6-
; CHECK-DAG: OpCapability Kernel
7-
; CHECK: %1 = OpExtInstImport "OpenCL.std"
8-
; CHECK: OpMemoryModel Physical64 OpenCL
9-
; CHECK: OpSource Unknown 0
4+
; RUN: llc -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-NOOCL
5+
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %}
6+
7+
; CHECK-DAG: OpCapability Linkage
8+
; CHECK-NOOCL-DAG: OpCapability Shader
9+
; CHECK-OCL-DAG: OpCapability Addresses
10+
; CHECK-OCL-DAG: OpCapability Kernel
11+
; CHECK-OCL: %1 = OpExtInstImport "OpenCL.std"
12+
; CHECK-NOOCL: OpMemoryModel Logical GLSL450
13+
; CHECK-OCL: OpMemoryModel Physical64 OpenCL
14+
; CHECK-NOOCL: OpSource Unknown 0
15+
; CHECK-OCL: OpSource OpenCL_CPP 100000

0 commit comments

Comments
 (0)