Skip to content

Commit f260c2e

Browse files
bashbaugjsji
authored andcommitted
adds support for SPV_EXT_arithmetic_fence (#2954)
bashbaug Member bashbaug commented 4 days ago See: https://github.khronos.org/SPIRV-Registry/extensions/EXT/SPV_EXT_arithmetic_fence.html Removes all internal enums for the unpublished SPV_INTEL_arithmetic_fence extension and uses the SPV_EXT_arithmetic_fence support in the headers instead. Registers the SPV_EXT_arithmetic_fence extension. Uses the SPV_EXT_arithmetic_fence extension if it is enabled, otherwise uses the SPV_INTEL_arithmetic_fence extension if it is enabled (for compatibility), otherwise ignores the LLVM arithmetic fence intrinsic (the ignoring part is not new). Updates the arithmetic fence test: Ensures that the right extension support is declared, depending on the enabled extensions. Ensures that the ArithmeticFenceEXT capability is declared when either extension is enabled. Note, the spelling for the capability is unconditionally the EXT version. Ensures that the OpArithmeticFenceEXT is present when either extension is enabled. Ensures that no extension, capability, or instruction is generated when neither extension is enabled. Original commit: KhronosGroup/SPIRV-LLVM-Translator@a35a761c18874df
1 parent 915f3ed commit f260c2e

File tree

9 files changed

+34
-23
lines changed

9 files changed

+34
-23
lines changed

llvm-spirv/include/LLVMSPIRVExtensions.inc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ EXT(SPV_INTEL_fpga_invocation_pipelining_attributes)
5353
EXT(SPV_INTEL_token_type)
5454
EXT(SPV_INTEL_debug_module)
5555
EXT(SPV_INTEL_runtime_aligned)
56+
EXT(SPV_EXT_arithmetic_fence)
5657
EXT(SPV_INTEL_arithmetic_fence)
5758
EXT(SPV_INTEL_bfloat16_conversion)
5859
EXT(SPV_INTEL_joint_matrix)

llvm-spirv/lib/SPIRV/SPIRVReader.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2913,7 +2913,7 @@ Value *SPIRVToLLVM::transValueWithoutDecoration(SPIRVValue *BV, Function *F,
29132913
return mapValue(
29142914
BV, transArbFloatInst(static_cast<SPIRVInstruction *>(BV), BB, true));
29152915

2916-
case internal::OpArithmeticFenceINTEL: {
2916+
case OpArithmeticFenceEXT: {
29172917
IRBuilder<> Builder(BB);
29182918
auto *BC = static_cast<SPIRVUnary *>(BV);
29192919
Type *RetTy = transType(BC->getType());

llvm-spirv/lib/SPIRV/SPIRVWriter.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4931,10 +4931,17 @@ SPIRVValue *LLVMToSPIRVBase::transIntrinsicInst(IntrinsicInst *II,
49314931
case Intrinsic::arithmetic_fence: {
49324932
SPIRVType *Ty = transType(II->getType());
49334933
SPIRVValue *Op = transValue(II->getArgOperand(0), BB);
4934+
if (BM->isAllowedToUseExtension(ExtensionID::SPV_EXT_arithmetic_fence)) {
4935+
BM->addCapability(CapabilityArithmeticFenceEXT);
4936+
BM->addExtension(ExtensionID::SPV_EXT_arithmetic_fence);
4937+
return BM->addUnaryInst(OpArithmeticFenceEXT, Ty, Op, BB);
4938+
}
49344939
if (BM->isAllowedToUseExtension(ExtensionID::SPV_INTEL_arithmetic_fence)) {
4935-
BM->addCapability(internal::CapabilityFPArithmeticFenceINTEL);
4940+
// Note: SPV_INTEL_arithmetic_fence was unpublished and superseded by
4941+
// SPV_EXT_arithmetic_fence.
4942+
BM->addCapability(CapabilityArithmeticFenceEXT);
49364943
BM->addExtension(ExtensionID::SPV_INTEL_arithmetic_fence);
4937-
return BM->addUnaryInst(internal::OpArithmeticFenceINTEL, Ty, Op, BB);
4944+
return BM->addUnaryInst(OpArithmeticFenceEXT, Ty, Op, BB);
49384945
}
49394946
return Op;
49404947
}

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1698,10 +1698,8 @@ _SPIRV_OP(SignBitSet)
16981698
_SPIRV_OP(Any)
16991699
_SPIRV_OP(All)
17001700
_SPIRV_OP(BitCount)
1701+
_SPIRV_OP(ArithmeticFenceEXT)
17011702
#undef _SPIRV_OP
1702-
#define _SPIRV_OP_INTERNAL(x) typedef SPIRVUnaryInst<internal::Op##x> SPIRV##x;
1703-
_SPIRV_OP_INTERNAL(ArithmeticFenceINTEL)
1704-
#undef _SPIRV_OP_INTERNAL
17051703

17061704
class SPIRVAccessChainBase : public SPIRVInstTemplateBase {
17071705
public:

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -654,11 +654,11 @@ template <> inline void SPIRVMap<Capability, std::string>::init() {
654654
add(CapabilityFPGALatencyControlINTEL, "FPGALatencyControlINTEL");
655655
add(CapabilityFPMaxErrorINTEL, "FPMaxErrorINTEL");
656656
add(CapabilityRegisterLimitsINTEL, "RegisterLimitsINTEL");
657+
add(CapabilityArithmeticFenceEXT, "ArithmeticFenceEXT");
657658
// From spirv_internal.hpp
658659
add(internal::CapabilityFastCompositeINTEL, "FastCompositeINTEL");
659660
add(internal::CapabilityOptNoneINTEL, "OptNoneINTEL");
660661
add(internal::CapabilityTokenTypeINTEL, "TokenTypeINTEL");
661-
add(internal::CapabilityFPArithmeticFenceINTEL, "FPArithmeticFenceINTEL");
662662
add(internal::CapabilityBfloat16ConversionINTEL, "Bfloat16ConversionINTEL");
663663
add(internal::CapabilityJointMatrixINTEL, "JointMatrixINTEL");
664664
add(internal::CapabilityHWThreadQueryINTEL, "HWThreadQueryINTEL");

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -570,6 +570,7 @@ _SPIRV_OP(ConstantCompositeContinuedINTEL, 6091)
570570
_SPIRV_OP(SpecConstantCompositeContinuedINTEL, 6092)
571571
_SPIRV_OP(ControlBarrierArriveINTEL, 6142)
572572
_SPIRV_OP(ControlBarrierWaitINTEL, 6143)
573+
_SPIRV_OP(ArithmeticFenceEXT, 6145)
573574
_SPIRV_OP(GroupIMulKHR, 6401)
574575
_SPIRV_OP(GroupFMulKHR, 6402)
575576
_SPIRV_OP(GroupBitwiseAndKHR, 6403)

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
_SPIRV_OP_INTERNAL(Forward, internal::OpForward)
44
_SPIRV_OP_INTERNAL(TypeTokenINTEL, internal::OpTypeTokenINTEL)
5-
_SPIRV_OP_INTERNAL(ArithmeticFenceINTEL, internal::OpArithmeticFenceINTEL)
65
_SPIRV_OP_INTERNAL(ConvertFToBF16INTEL, internal::OpConvertFToBF16INTEL)
76
_SPIRV_OP_INTERNAL(ConvertBF16ToFINTEL, internal::OpConvertBF16ToFINTEL)
87
_SPIRV_OP_INTERNAL(TypeJointMatrixINTEL, internal::OpTypeJointMatrixINTEL)

llvm-spirv/lib/SPIRV/libSPIRV/spirv_internal.hpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ enum InternalOp {
6868
IOpJointMatrixSUMadINTEL = 6128,
6969
IOpJointMatrixUSMadINTEL = 6129,
7070
IOpJointMatrixUUMadINTEL = 6130,
71-
IOpArithmeticFenceINTEL = 6145,
7271
IOpTaskSequenceCreateINTEL = 6163,
7372
IOpTaskSequenceAsyncINTEL = 6164,
7473
IOpTaskSequenceGetINTEL = 6165,
@@ -112,7 +111,6 @@ enum InternalCapability {
112111
ICapBfloat16ConversionINTEL = 6115,
113112
ICapabilityJointMatrixINTEL = 6118,
114113
ICapabilityHWThreadQueryINTEL = 6134,
115-
ICapFPArithmeticFenceINTEL = 6144,
116114
ICapGlobalVariableDecorationsINTEL = 6146,
117115
ICapabilityTaskSequenceINTEL = 6162,
118116
ICapabilityCooperativeMatrixCheckedInstructionsINTEL = 6192,
@@ -272,7 +270,6 @@ constexpr SourceLanguage SourceLanguageCPP20 =
272270

273271
constexpr Op OpForward = static_cast<Op>(IOpForward);
274272
constexpr Op OpTypeTokenINTEL = static_cast<Op>(IOpTypeTokenINTEL);
275-
constexpr Op OpArithmeticFenceINTEL = static_cast<Op>(IOpArithmeticFenceINTEL);
276273
constexpr Op OpConvertFToBF16INTEL = static_cast<Op>(IOpConvertFToBF16INTEL);
277274
constexpr Op OpConvertBF16ToFINTEL = static_cast<Op>(IOpConvertBF16ToFINTEL);
278275

@@ -295,8 +292,6 @@ constexpr Capability CapabilityOptNoneINTEL =
295292
static_cast<Capability>(ICapOptNoneINTEL);
296293
constexpr Capability CapabilityTokenTypeINTEL =
297294
static_cast<Capability>(ICapTokenTypeINTEL);
298-
constexpr Capability CapabilityFPArithmeticFenceINTEL =
299-
static_cast<Capability>(ICapFPArithmeticFenceINTEL);
300295
constexpr Capability CapabilityBfloat16ConversionINTEL =
301296
static_cast<Capability>(ICapBfloat16ConversionINTEL);
302297
constexpr Capability CapabilityGlobalVariableDecorationsINTEL =

llvm-spirv/test/extensions/INTEL/SPV_INTEL_arithmetic_fence/arithmetic_fence.ll

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,42 @@
11
; RUN: llvm-as %s -o %t.bc
2-
; RUN: llvm-spirv %t.bc --spirv-ext=+SPV_INTEL_arithmetic_fence -o %t.spv
3-
; RUN: llvm-spirv %t.spv --to-text -o %t.spt
4-
; RUN: FileCheck < %t.spt %s --check-prefix=CHECK-SPIRV
2+
; RUN: llvm-spirv %t.bc --spirv-ext=+SPV_EXT_arithmetic_fence -spirv-text -o - | FileCheck %s --check-prefixes=CHECK-SPIRV-EXT,CHECK-SPIRV
3+
; RUN: llvm-spirv %t.bc --spirv-ext=+SPV_INTEL_arithmetic_fence -spirv-text -o - | FileCheck %s --check-prefixes=CHECK-SPIRV-INTEL,CHECK-SPIRV
4+
; RUN: llvm-spirv %t.bc --spirv-ext=+SPV_EXT_arithmetic_fence,+SPV_INTEL_arithmetic_fence -spirv-text -o - | FileCheck %s --check-prefixes=CHECK-SPIRV-EXT,CHECK-SPIRV
55

6+
7+
; RUN: llvm-spirv %t.bc --spirv-ext=+SPV_EXT_arithmetic_fence -o %t.spv
68
; RUN: llvm-spirv -r %t.spv -o %t.rev.bc
79
; RUN: llvm-dis < %t.rev.bc | FileCheck %s --check-prefix=CHECK-LLVM
810

11+
912
; RUN: llvm-spirv %t.bc -o %t.negative.spv
10-
; RUN: llvm-spirv %t.negative.spv --to-text -o %t.negative.spt
11-
; RUN: FileCheck < %t.negative.spt %s --check-prefix=CHECK-SPIRV-NEG
13+
; RUN: llvm-spirv %t.negative.spv --to-text -o - | FileCheck %s --check-prefix=CHECK-SPIRV-NEG
14+
1215

1316
; RUN: llvm-spirv -r %t.negative.spv -o %t.negative.rev.bc
1417
; RUN: llvm-dis < %t.negative.rev.bc | FileCheck %s --check-prefix=CHECK-LLVM-NEG
1518

16-
; CHECK-SPIRV: Capability FPArithmeticFenceINTEL
17-
; CHECK-SPIRV: Extension "SPV_INTEL_arithmetic_fence"
19+
20+
; Note: The capability is unconditionally printed with the EXT suffix.
21+
; CHECK-SPIRV: Capability ArithmeticFenceEXT
22+
23+
; CHECK-SPIRV-EXT: Extension "SPV_EXT_arithmetic_fence"
24+
; CHECK-SPIRV-INTEL: Extension "SPV_INTEL_arithmetic_fence"
25+
1826
; CHECK-SPIRV: Name [[#Res:]] "t"
1927
; CHECK-SPIRV: TypeFloat [[#ResTy:]] 64
2028
; CHECK-SPIRV: FAdd [[#ResTy]] [[#Target:]]
21-
; CHECK-SPIRV: ArithmeticFenceINTEL [[#ResTy]] [[#Res]] [[#Target]]
29+
; Note: The instruction is unconditional printed with the EXT suffix.
30+
; CHECK-SPIRV: ArithmeticFenceEXT [[#ResTy]] [[#Res]] [[#Target]]
2231

2332
; CHECK-LLVM: [[#Op:]] = fadd fast double %a, %a
2433
; CHECK-LLVM: %t = call double @llvm.arithmetic.fence.f64(double %[[#Op]])
2534
; CHECK-LLVM: declare double @llvm.arithmetic.fence.f64(double)
2635

27-
; CHECK-SPIRV-NEG-NOT: Capability FPArithmeticFenceINTEL
36+
; CHECK-SPIRV-NEG-NOT: Capability ArithmeticFenceEXT
37+
; CHECK-SPIRV-NEG-NOT: Extension "SPV_EXT_arithmetic_fence"
2838
; CHECK-SPIRV-NEG-NOT: Extension "SPV_INTEL_arithmetic_fence"
29-
; CHECK-SPIRV-NEG-NOT: ArithmeticFenceINTEL
39+
; CHECK-SPIRV-NEG-NOT: ArithmeticFenceEXT
3040

3141
; CHECK-LLVM-NEG-NOT: declare double @llvm.arithmetic.fence.f64(double)
3242

0 commit comments

Comments
 (0)