Skip to content

Commit 7735c3d

Browse files
vmaksimojsji
authored andcommitted
Fix OCL builtins translation in case SPV_KHR_untyped_pointers is enabled (#2723)
This change allows to preserve the correct builtin mangling in reverse translation. Original commit: KhronosGroup/SPIRV-LLVM-Translator@33150bf7b08a0d4
1 parent 64f3301 commit 7735c3d

File tree

4 files changed

+42
-16
lines changed

4 files changed

+42
-16
lines changed

llvm-spirv/lib/SPIRV/SPIRVReader.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4878,6 +4878,18 @@ Instruction *SPIRVToLLVM::transOCLBuiltinFromExtInst(SPIRVExtInst *BC,
48784878
"Not OpenCL extended instruction");
48794879

48804880
std::vector<Type *> ArgTypes = transTypeVector(BC->getArgTypes(), true);
4881+
for (unsigned I = 0; I < ArgTypes.size(); I++) {
4882+
// Special handling for "truly" untyped pointers to preserve correct OCL
4883+
// bultin mangling.
4884+
if (isa<PointerType>(ArgTypes[I]) &&
4885+
BC->getArgValue(I)->isUntypedVariable()) {
4886+
auto *BVar = static_cast<SPIRVUntypedVariableKHR *>(BC->getArgValue(I));
4887+
ArgTypes[I] = TypedPointerType::get(
4888+
transType(BVar->getDataType()),
4889+
SPIRSPIRVAddrSpaceMap::rmap(BVar->getStorageClass()));
4890+
}
4891+
}
4892+
48814893
Type *RetTy = transType(BC->getType());
48824894
std::string MangledName =
48834895
getSPIRVFriendlyIRFunctionName(ExtOp, ArgTypes, RetTy);

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVEntry.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,7 @@ class SPIRVEntry {
342342
bool isVariable() const {
343343
return OpCode == OpVariable || OpCode == OpUntypedVariableKHR;
344344
}
345+
bool isUntypedVariable() const { return OpCode == OpUntypedVariableKHR; }
345346
bool isEndOfBlock() const;
346347
virtual bool isInst() const { return false; }
347348
virtual bool isOperandLiteral(unsigned Index) const {

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVInstruction.h

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1986,14 +1986,16 @@ class SPIRVExtInst : public SPIRVFunctionCallGeneric<OpExtInst, 5> {
19861986
}
19871987
std::vector<SPIRVValue *> getArgValues() {
19881988
std::vector<SPIRVValue *> VArgs;
1989-
for (size_t I = 0; I < Args.size(); ++I) {
1990-
if (isOperandLiteral(I))
1991-
VArgs.push_back(Module->getLiteralAsConstant(Args[I]));
1992-
else
1993-
VArgs.push_back(getValue(Args[I]));
1994-
}
1989+
for (size_t I = 0; I < Args.size(); ++I)
1990+
VArgs.push_back(getArgValue(I));
19951991
return VArgs;
19961992
}
1993+
SPIRVValue *getArgValue(SPIRVWord I) {
1994+
if (isOperandLiteral(I))
1995+
return Module->getLiteralAsConstant(Args[I]);
1996+
return getValue(Args[I]);
1997+
}
1998+
19971999
std::vector<SPIRVType *> getArgTypes() {
19982000
std::vector<SPIRVType *> ArgTypes;
19992001
auto VArgs = getArgValues();

llvm-spirv/test/transcoding/float16.ll

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,34 @@
11
; RUN: llvm-as %s -o %t.bc
22
; RUN: llvm-spirv %t.bc -o %t.spv
33
; RUN: spirv-val %t.spv
4-
; RUN: llvm-spirv %t.spv -to-text -o - | FileCheck %s --check-prefix=CHECK-SPIRV
4+
; RUN: llvm-spirv %t.spv -to-text -o - | FileCheck %s --check-prefixes=CHECK-SPIRV,CHECK-SPIRV-NOEXT
5+
; RUN: llvm-spirv -r %t.spv -o %t.rev.bc
6+
; RUN: llvm-dis %t.rev.bc -o - | FileCheck %s --check-prefix=CHECK-LLVM
7+
8+
; Verify that even though we use the fract instruction with untyped pointers enabled,
9+
; the SPV binary is valid and we get exactly the same output IR after the reverse translation.
10+
; RUN: llvm-spirv %t.bc -o %t.spv --spirv-ext=+SPV_KHR_untyped_pointers
11+
; TODO: enable back once spirv-tools are updated
12+
; R/UN: spirv-val %t.spv
13+
; RUN: llvm-spirv %t.spv -to-text -o - | FileCheck %s --check-prefixes=CHECK-SPIRV,CHECK-SPIRV-EXT
514
; RUN: llvm-spirv -r %t.spv -o %t.rev.bc
615
; RUN: llvm-dis %t.rev.bc -o - | FileCheck %s --check-prefix=CHECK-LLVM
716

817
source_filename = "math_builtin_float_half.cpp"
918
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"
1019
target triple = "spirv64-unknown-unknown"
1120

12-
; CHECK-SPIRV: 3 TypeFloat [[HALF:[0-9]+]] 16
13-
; CHECK-SPIRV: 4 TypePointer [[HALFPTR:[0-9]+]] 7 [[HALF]]
14-
; CHECK-SPIRV: 4 TypeVector [[HALFV2:[0-9]+]] [[HALF]] 2
15-
; CHECK-SPIRV: 4 TypePointer [[HALFV2PTR:[0-9]+]] 7 [[HALFV2]]
16-
; CHECK-SPIRV: 4 Constant [[HALF]] [[CONST:[0-9]+]] 14788
17-
; CHECK-SPIRV: 4 Variable [[HALFPTR]] [[ADDR:[0-9]+]] 7
18-
; CHECK-SPIRV: 4 Variable [[HALFV2PTR]] [[ADDR2:[0-9]+]] 7
19-
; CHECK-SPIRV: 7 ExtInst [[HALF]] [[#]] 1 fract [[CONST]] [[ADDR]]
20-
; CHECK-SPIRV: 7 ExtInst [[HALFV2]] [[#]] 1 fract [[#]] [[ADDR2]]
21+
; CHECK-SPIRV: TypeFloat [[HALF:[0-9]+]] 16
22+
; CHECK-SPIRV-NOEXT: TypePointer [[HALFPTR:[0-9]+]] 7 [[HALF]]
23+
; CHECK-SPIRV-EXT: TypeUntypedPointerKHR [[HALFPTR:[0-9]+]] 7
24+
; CHECK-SPIRV: TypeVector [[HALFV2:[0-9]+]] [[HALF]] 2
25+
; CHECK-SPIRV: TypePointer [[HALFV2PTR:[0-9]+]] 7 [[HALFV2]]
26+
; CHECK-SPIRV: Constant [[HALF]] [[CONST:[0-9]+]] 14788
27+
; CHECK-SPIRV-NOEXT: Variable [[HALFPTR]] [[ADDR:[0-9]+]] 7
28+
; CHECK-SPIRV-EXT: UntypedVariableKHR [[HALFPTR]] [[ADDR:[0-9]+]] 7 [[HALF]]
29+
; CHECK-SPIRV: Variable [[HALFV2PTR]] [[ADDR2:[0-9]+]] 7
30+
; CHECK-SPIRV: ExtInst [[HALF]] [[#]] 1 fract [[CONST]] [[ADDR]]
31+
; CHECK-SPIRV: ExtInst [[HALFV2]] [[#]] 1 fract [[#]] [[ADDR2]]
2132

2233
; CHECK-LLVM: %addr = alloca half
2334
; CHECK-LLVM: %addr2 = alloca <2 x half>

0 commit comments

Comments
 (0)