Skip to content

Commit b30f628

Browse files
authored
Add SPV_ALTERA_arbitrary_precision_integers (#3606)
When both SPV_ALTERA_arbitrary_precision_integers and SPV_INTEL_arbitrary_precision_integers extensions are enabled - INTEL's version takes priority. Addresses #3566
1 parent a76f820 commit b30f628

File tree

5 files changed

+77
-6
lines changed

5 files changed

+77
-6
lines changed

include/LLVMSPIRVExtensions.inc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ EXT(SPV_INTEL_function_pointers)
3232
EXT(SPV_INTEL_kernel_attributes)
3333
EXT(SPV_INTEL_io_pipes)
3434
EXT(SPV_INTEL_inline_assembly)
35+
EXT(SPV_ALTERA_arbitrary_precision_integers)
3536
EXT(SPV_INTEL_arbitrary_precision_integers)
3637
EXT(SPV_INTEL_optimization_hints)
3738
EXT(SPV_INTEL_float_controls2)

lib/SPIRV/SPIRVLowerLLVMIntrinsic.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,9 +139,19 @@ void SPIRVLowerLLVMIntrinsicBase::visitIntrinsicInst(CallInst &I) {
139139
auto It = LLVMIntrinsicMapEntries.find(IntrinsicName);
140140
if (It != LLVMIntrinsicMapEntries.end())
141141
MapEntry = &It->second;
142+
auto IsRequiredExtAllowed = [&](ExtensionID Ext) {
143+
if (Opts.isAllowedToUseExtension(Ext))
144+
return true;
145+
// SPV_ALTERA_arbitrary_precision_integers is equivalent to
146+
// SPV_INTEL_arbitrary_precision_integers.
147+
if (Ext == ExtensionID::SPV_INTEL_arbitrary_precision_integers)
148+
return Opts.isAllowedToUseExtension(
149+
ExtensionID::SPV_ALTERA_arbitrary_precision_integers);
150+
return false;
151+
};
142152
if (!MapEntry ||
143153
!(MapEntry->RequiredExtension == NO_REQUIRED_EXTENSION ||
144-
Opts.isAllowedToUseExtension(MapEntry->RequiredExtension)) ||
154+
IsRequiredExtAllowed(MapEntry->RequiredExtension)) ||
145155
Opts.isAllowedToUseExtension(MapEntry->ForbiddenExtension))
146156
return;
147157

lib/SPIRV/SPIRVWriter.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,8 @@ SPIRVType *LLVMToSPIRVBase::transType(Type *T) {
390390
// capabilities.
391391
if (BM->isAllowedToUseExtension(
392392
ExtensionID::SPV_INTEL_arbitrary_precision_integers) ||
393+
BM->isAllowedToUseExtension(
394+
ExtensionID::SPV_ALTERA_arbitrary_precision_integers) ||
393395
BM->getErrorLog().checkError(
394396
(BitWidth == 4 &&
395397
BM->isAllowedToUseExtension(ExtensionID::SPV_INTEL_int4)) ||
@@ -1400,7 +1402,9 @@ SPIRVValue *LLVMToSPIRVBase::transConstant(Value *V) {
14001402
if (BitWidth > 64) {
14011403
BM->getErrorLog().checkError(
14021404
BM->isAllowedToUseExtension(
1403-
ExtensionID::SPV_INTEL_arbitrary_precision_integers),
1405+
ExtensionID::SPV_INTEL_arbitrary_precision_integers) ||
1406+
BM->isAllowedToUseExtension(
1407+
ExtensionID::SPV_ALTERA_arbitrary_precision_integers),
14041408
SPIRVEC_InvalidBitWidth, std::to_string(BitWidth));
14051409
return BM->addConstant(ExpectedType, ConstI->getValue());
14061410
}

lib/SPIRV/libSPIRV/SPIRVType.h

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,9 @@ class SPIRVTypeInt : public SPIRVType {
175175
break;
176176
default:
177177
if (Module->isAllowedToUseExtension(
178-
ExtensionID::SPV_INTEL_arbitrary_precision_integers))
178+
ExtensionID::SPV_INTEL_arbitrary_precision_integers) ||
179+
Module->isAllowedToUseExtension(
180+
ExtensionID::SPV_ALTERA_arbitrary_precision_integers))
179181
CV.push_back(CapabilityArbitraryPrecisionIntegersINTEL);
180182
}
181183
return CV;
@@ -185,15 +187,21 @@ class SPIRVTypeInt : public SPIRVType {
185187
case 4: {
186188
if (Module->isAllowedToUseExtension(ExtensionID::SPV_INTEL_int4))
187189
return ExtensionID::SPV_INTEL_int4;
188-
return ExtensionID::SPV_INTEL_arbitrary_precision_integers;
190+
if (Module->isAllowedToUseExtension(
191+
ExtensionID::SPV_INTEL_arbitrary_precision_integers))
192+
return ExtensionID::SPV_INTEL_arbitrary_precision_integers;
193+
return ExtensionID::SPV_ALTERA_arbitrary_precision_integers;
189194
}
190195
case 8:
191196
case 16:
192197
case 32:
193198
case 64:
194199
return {};
195200
default:
196-
return ExtensionID::SPV_INTEL_arbitrary_precision_integers;
201+
if (Module->isAllowedToUseExtension(
202+
ExtensionID::SPV_INTEL_arbitrary_precision_integers))
203+
return ExtensionID::SPV_INTEL_arbitrary_precision_integers;
204+
return ExtensionID::SPV_ALTERA_arbitrary_precision_integers;
197205
}
198206
}
199207

@@ -206,7 +214,9 @@ class SPIRVTypeInt : public SPIRVType {
206214
BitWidth == 8 || BitWidth == 16 || BitWidth == 32 ||
207215
BitWidth == 64 ||
208216
Module->isAllowedToUseExtension(
209-
ExtensionID::SPV_INTEL_arbitrary_precision_integers)) &&
217+
ExtensionID::SPV_INTEL_arbitrary_precision_integers) ||
218+
Module->isAllowedToUseExtension(
219+
ExtensionID::SPV_ALTERA_arbitrary_precision_integers)) &&
210220
"Invalid bit width");
211221
}
212222

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
; RUN: llvm-spirv %s --spirv-ext=+SPV_ALTERA_arbitrary_precision_integers -o %t.spv
2+
; RUN: llvm-spirv %t.spv -to-text -o %t.spt
3+
; RUN: FileCheck < %t.spt %s --check-prefix=CHECK-SPIRV
4+
5+
; RUN: llvm-spirv -r %t.spv -o %t.rev.bc
6+
; RUN: llvm-dis < %t.rev.bc | FileCheck %s --check-prefix=CHECK-LLVM
7+
8+
; RUN: llvm-spirv -spirv-text -r %t.spt -o %t.rev.bc
9+
; RUN: llvm-dis < %t.rev.bc | FileCheck %s --check-prefix=CHECK-LLVM
10+
11+
; CHECK-SPIRV: Capability ArbitraryPrecisionIntegersINTEL
12+
; CHECK-SPIRV: Extension "SPV_ALTERA_arbitrary_precision_integers"
13+
14+
; CHECK-SPIRV-DAG: TypeInt {{[0-9]+}} 13 0
15+
; CHECK-SPIRV-DAG: TypeInt {{[0-9]+}} 58 0
16+
; CHECK-SPIRV-DAG: TypeInt {{[0-9]+}} 30 0
17+
18+
; Test that when both extensions are enabled, INTEL takes priority.
19+
; RUN: llvm-spirv %s --spirv-ext=+SPV_ALTERA_arbitrary_precision_integers,+SPV_INTEL_arbitrary_precision_integers -o %t.both.spv
20+
; RUN: llvm-spirv %t.both.spv -to-text -o %t.both.spt
21+
; RUN: FileCheck < %t.both.spt %s --check-prefix=CHECK-BOTH
22+
23+
; CHECK-BOTH: Capability ArbitraryPrecisionIntegersINTEL
24+
; CHECK-BOTH: Extension "SPV_INTEL_arbitrary_precision_integers"
25+
; CHECK-BOTH-NOT: Extension "SPV_ALTERA_arbitrary_precision_integers"
26+
27+
target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
28+
target triple = "spir64-unknown-unknown"
29+
30+
; CHECK-LLVM: @a = addrspace(1) global i13 0, align 2
31+
@a = addrspace(1) global i13 0, align 2
32+
; CHECK-LLVM: @b = addrspace(1) global i58 0, align 8
33+
@b = addrspace(1) global i58 0, align 8
34+
35+
; Function Attrs: noinline nounwind optnone
36+
; CHECK-LLVM: void @_Z4funci(i30 %a)
37+
define spir_func void @_Z4funci(i30 %a) {
38+
entry:
39+
; CHECK-LLVM: %a.addr = alloca i30
40+
%a.addr = alloca i30, align 4
41+
; CHECK-LLVM: store i30 %a, ptr %a.addr
42+
store i30 %a, ptr %a.addr, align 4
43+
; CHECK-LLVM: store i30 1, ptr %a.addr
44+
store i30 1, ptr %a.addr, align 4
45+
ret void
46+
}

0 commit comments

Comments
 (0)