Skip to content

Commit dd33e59

Browse files
authored
add support for SPV_EXT_optnone (#2951)
Specifically: Updates SPIR-V headers to the latest tag, to pull in support for SPV_EXT_optnone (and more). Removes all internal enums for SPV_INTEL_optnone and uses the support in the headers instead. Registers the SPV_EXT_optnone extension. Uses the SPV_EXT_optnone extension if it is enabled, otherwise uses the SPV_INTEL_optnone extension if it is enabled, otherwise ignores the OptimizeNone attribute (the ignoring part is not new). Updates the OptNone test: Ensures that the right extension support is declared, depending on the enabled extensions. Ensures that the OptNone capability is declared when either extension is enabled. Note, the spelling for the capability is unconditionally the EXT version. Ensures that the Function Control is present when either extension is enabled.
1 parent cb6891b commit dd33e59

File tree

8 files changed

+38
-28
lines changed

8 files changed

+38
-28
lines changed

include/LLVMSPIRVExtensions.inc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ EXT(SPV_INTEL_fpga_cluster_attributes)
4646
EXT(SPV_INTEL_loop_fuse)
4747
EXT(SPV_INTEL_long_constant_composite) // TODO: rename to
4848
// SPV_INTEL_long_composites later
49+
EXT(SPV_EXT_optnone)
4950
EXT(SPV_INTEL_optnone)
5051
EXT(SPV_INTEL_fpga_dsp_control)
5152
EXT(SPV_INTEL_memory_access_aliasing)

lib/SPIRV/SPIRVInternal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ inline void
251251
SPIRVMap<Attribute::AttrKind, SPIRVFunctionControlMaskKind>::init() {
252252
add(Attribute::AlwaysInline, FunctionControlInlineMask);
253253
add(Attribute::NoInline, FunctionControlDontInlineMask);
254-
add(Attribute::OptimizeNone, internal::FunctionControlOptNoneINTELMask);
254+
add(Attribute::OptimizeNone, FunctionControlOptNoneEXTMask);
255255
}
256256
typedef SPIRVMap<Attribute::AttrKind, SPIRVFunctionControlMaskKind>
257257
SPIRSPIRVFuncCtlMaskMap;

lib/SPIRV/SPIRVWriter.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5538,10 +5538,15 @@ SPIRVWord LLVMToSPIRVBase::transFunctionControlMask(Function *F) {
55385538
[&](Attribute::AttrKind Attr, SPIRVFunctionControlMaskKind Mask) {
55395539
if (F->hasFnAttribute(Attr)) {
55405540
if (Attr == Attribute::OptimizeNone) {
5541-
if (!BM->isAllowedToUseExtension(ExtensionID::SPV_INTEL_optnone))
5541+
if (BM->isAllowedToUseExtension(ExtensionID::SPV_EXT_optnone)) {
5542+
BM->addExtension(ExtensionID::SPV_EXT_optnone);
5543+
BM->addCapability(CapabilityOptNoneEXT);
5544+
} else if (BM->isAllowedToUseExtension(
5545+
ExtensionID::SPV_INTEL_optnone)) {
5546+
BM->addExtension(ExtensionID::SPV_INTEL_optnone);
5547+
BM->addCapability(CapabilityOptNoneINTEL);
5548+
} else
55425549
return;
5543-
BM->addExtension(ExtensionID::SPV_INTEL_optnone);
5544-
BM->addCapability(internal::CapabilityOptNoneINTEL);
55455550
}
55465551
FCM |= Mask;
55475552
}
@@ -7031,6 +7036,7 @@ bool runSpirvBackend(Module *M, std::string &Result, std::string &ErrMsg,
70317036
SPIRV::ExtensionID::SPV_INTEL_cache_controls,
70327037
SPIRV::ExtensionID::SPV_INTEL_global_variable_fpga_decorations,
70337038
SPIRV::ExtensionID::SPV_INTEL_global_variable_host_access,
7039+
SPIRV::ExtensionID::SPV_EXT_optnone,
70347040
SPIRV::ExtensionID::SPV_INTEL_optnone,
70357041
SPIRV::ExtensionID::SPV_INTEL_usm_storage_classes,
70367042
SPIRV::ExtensionID::SPV_INTEL_subgroups,

lib/SPIRV/libSPIRV/SPIRVIsValidEnum.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ inline bool isValidFunctionControlMask(SPIRVWord Mask) {
294294
ValidMask |= FunctionControlDontInlineMask;
295295
ValidMask |= FunctionControlPureMask;
296296
ValidMask |= FunctionControlConstMask;
297-
ValidMask |= internal::FunctionControlOptNoneINTELMask;
297+
ValidMask |= FunctionControlOptNoneEXTMask;
298298

299299
return (Mask & ~ValidMask) == 0;
300300
}

lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -623,7 +623,7 @@ template <> inline void SPIRVMap<Capability, std::string>::init() {
623623
add(CapabilityAtomicFloat32AddEXT, "AtomicFloat32AddEXT");
624624
add(CapabilityAtomicFloat64AddEXT, "AtomicFloat64AddEXT");
625625
add(CapabilityLongCompositesINTEL, "LongCompositesINTEL");
626-
add(CapabilityOptNoneINTEL, "OptNoneINTEL");
626+
add(CapabilityOptNoneEXT, "OptNoneEXT");
627627
add(CapabilityAtomicFloat16AddEXT, "AtomicFloat16AddEXT");
628628
add(CapabilityDebugInfoModuleINTEL, "DebugInfoModuleINTEL");
629629
add(CapabilitySplitBarrierINTEL, "SplitBarrierINTEL");
@@ -642,7 +642,6 @@ template <> inline void SPIRVMap<Capability, std::string>::init() {
642642
add(CapabilityRegisterLimitsINTEL, "RegisterLimitsINTEL");
643643
// From spirv_internal.hpp
644644
add(internal::CapabilityFastCompositeINTEL, "FastCompositeINTEL");
645-
add(internal::CapabilityOptNoneINTEL, "OptNoneINTEL");
646645
add(internal::CapabilityTokenTypeINTEL, "TokenTypeINTEL");
647646
add(internal::CapabilityFPArithmeticFenceINTEL, "FPArithmeticFenceINTEL");
648647
add(internal::CapabilityBfloat16ConversionINTEL, "Bfloat16ConversionINTEL");

lib/SPIRV/libSPIRV/spirv_internal.hpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,6 @@ enum InternalDecoration {
107107

108108
enum InternalCapability {
109109
ICapFastCompositeINTEL = 6093,
110-
ICapOptNoneINTEL = 6094,
111110
ICapTokenTypeINTEL = 6112,
112111
ICapBfloat16ConversionINTEL = 6115,
113112
ICapabilityJointMatrixINTEL = 6118,
@@ -132,8 +131,6 @@ enum InternalCapability {
132131
ICapabilityBindlessImagesINTEL = 6528
133132
};
134133

135-
enum InternalFunctionControlMask { IFunctionControlOptNoneINTELMask = 0x10000 };
136-
137134
enum InternalExecutionMode {
138135
IExecModeFastCompositeKernelINTEL = 6088,
139136
IExecModeNamedSubgroupSizeINTEL = 6446,
@@ -291,8 +288,6 @@ constexpr Decoration DecorationArgumentAttributeINTEL =
291288

292289
constexpr Capability CapabilityFastCompositeINTEL =
293290
static_cast<Capability>(ICapFastCompositeINTEL);
294-
constexpr Capability CapabilityOptNoneINTEL =
295-
static_cast<Capability>(ICapOptNoneINTEL);
296291
constexpr Capability CapabilityTokenTypeINTEL =
297292
static_cast<Capability>(ICapTokenTypeINTEL);
298293
constexpr Capability CapabilityFPArithmeticFenceINTEL =
@@ -302,9 +297,6 @@ constexpr Capability CapabilityBfloat16ConversionINTEL =
302297
constexpr Capability CapabilityGlobalVariableDecorationsINTEL =
303298
static_cast<Capability>(ICapGlobalVariableDecorationsINTEL);
304299

305-
constexpr FunctionControlMask FunctionControlOptNoneINTELMask =
306-
static_cast<FunctionControlMask>(IFunctionControlOptNoneINTELMask);
307-
308300
constexpr ExecutionMode ExecutionModeFastCompositeKernelINTEL =
309301
static_cast<ExecutionMode>(IExecModeFastCompositeKernelINTEL);
310302

spirv-headers-tag.conf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
efb6b4099ddb8fa60f62956dee592c4b94ec6a49
1+
3f17b2af6784bfa2c5aa5dbb8e0e74a607dd8b3b

test/optnone.ll

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,44 @@
11
; RUN: llvm-as %s -o %t.bc
2-
; RUN: llvm-spirv %t.bc --spirv-ext=+SPV_INTEL_optnone -spirv-text -o - | FileCheck %s --check-prefix=CHECK-SPIRV
2+
; RUN: llvm-spirv %t.bc --spirv-ext=+SPV_EXT_optnone -spirv-text -o - | FileCheck %s --check-prefix=CHECK-SPIRV-EXT
3+
; RUN: llvm-spirv %t.bc --spirv-ext=+SPV_INTEL_optnone -spirv-text -o - | FileCheck %s --check-prefix=CHECK-SPIRV-INTEL
4+
; RUN: llvm-spirv %t.bc --spirv-ext=+SPV_EXT_optnone,+SPV_INTEL_optnone -spirv-text -o - | FileCheck %s --check-prefix=CHECK-SPIRV-BOTH
35

4-
; RUN: llvm-spirv --spirv-ext=+SPV_INTEL_optnone %t.bc -o %t.spv
6+
7+
; RUN: llvm-spirv --spirv-ext=+SPV_EXT_optnone %t.bc -o %t.spv
58
; RUN: llvm-spirv -r %t.spv -o %t.rev.bc
69
; RUN: llvm-dis < %t.rev.bc | FileCheck %s --check-prefix=CHECK-LLVM
710

811
; Check that optnone is correctly ignored when extension is not enabled
9-
; RUN: llvm-spirv %t.bc -spirv-text -o - | FileCheck %s --check-prefix=CHECK-SPIRV-NO-EXT
12+
; RUN: llvm-spirv %t.bc -spirv-text -o - | FileCheck %s --check-prefix=CHECK-SPIRV-NONE
1013

1114
; RUN: llvm-spirv %t.bc -o %t.spv
1215
; RUN: llvm-spirv -r %t.spv -o %t.rev.bc
13-
; RUN: llvm-dis < %t.rev.bc | FileCheck %s --check-prefix=CHECK-LLVM-NO-EXT
16+
; RUN: llvm-dis < %t.rev.bc | FileCheck %s --check-prefix=CHECK-LLVM-NONE
17+
18+
; Note: The capability is unconditionally printed with the EXT suffix.
19+
; CHECK-SPIRV-EXT: Capability OptNoneEXT
20+
; CHECK-SPIRV-INTEL: Capability OptNoneEXT
21+
; CHECK-SPIRV-BOTH: Capability OptNoneEXT
1422

15-
; CHECK-SPIRV: Capability OptNoneINTEL
16-
; CHECK-SPIRV: Extension "SPV_INTEL_optnone"
23+
; CHECK-SPIRV-EXT: Extension "SPV_EXT_optnone"
24+
; CHECK-SPIRV-INTEL: Extension "SPV_INTEL_optnone"
25+
; Note: When both extensions are enabled, prefer the EXT extension.
26+
; CHECK-SPIRV-BOTH: Extension "SPV_EXT_optnone"
1727

1828
; Per SPIR-V spec:
1929
; FunctionControlDontInlineMask = 0x2 (2)
20-
; Per SPIR-V spec extension SPV_INTEL_optnone:
21-
; FunctionControlOptNoneINTELMask = 0x10000 (65536)
22-
; CHECK-SPIRV: Function {{[0-9]+}} {{[0-9]+}} 65538
23-
; CHECK-SPIRV-NO-EXT: Function {{[0-9]+}} {{[0-9]+}} 2
30+
; Per SPIR-V spec extension spec:
31+
; FunctionControlOptNoneMask = 0x10000 (65536)
32+
; CHECK-SPIRV-EXT: Function {{[0-9]+}} {{[0-9]+}} 65538
33+
; CHECK-SPIRV-INTEL: Function {{[0-9]+}} {{[0-9]+}} 65538
34+
; CHECK-SPIRV-BOTH: Function {{[0-9]+}} {{[0-9]+}} 65538
35+
; CHECK-SPIRV-NONE: Function {{[0-9]+}} {{[0-9]+}} 2
2436

2537
; CHECK-LLVM: define spir_func void @_Z3foov() #[[ATTR:[0-9]+]]
2638
; CHECK-LLVM: #[[ATTR]] = { {{.*}}noinline{{.*}}optnone{{.*}} }
2739

28-
; CHECK-LLVM-NO-EXT: define spir_func void @_Z3foov() #[[ATTR:[0-9]+]]
29-
; CHECK-LLVM-NO-EXT-NOT: #[[ATTR]] = { {{.*}}noinline{{.*}}optnone{{.*}} }
40+
; CHECK-LLVM-NONE: define spir_func void @_Z3foov() #[[ATTR:[0-9]+]]
41+
; CHECK-LLVM-NONE-NOT: #[[ATTR]] = { {{.*}}noinline{{.*}}optnone{{.*}} }
3042

3143
target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
3244
target triple = "spir-unknown-unknown"

0 commit comments

Comments
 (0)