Skip to content

Commit f508931

Browse files
authored
[Backport to 14] Limit the instructions that enable BFloat16ArithmeticINTEL capability (#3586)
We should not require `CapabilityBFloat16ArithmeticINTEL` for the instructions that are allowed by `SPV_KHR_bfloat16` (e.g. conversion instructions). Without the fix the test is failing with: ``` RequiresExtension: Feature requires the following SPIR-V extension: SPV_INTEL_bfloat16_arithmetic ```
1 parent 8241e15 commit f508931

File tree

2 files changed

+58
-1
lines changed

2 files changed

+58
-1
lines changed

lib/SPIRV/libSPIRV/SPIRVModule.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1578,7 +1578,8 @@ SPIRVInstruction *SPIRVModuleImpl::addUnaryInst(Op TheOpCode,
15781578
SPIRVType *TheType,
15791579
SPIRVValue *Op,
15801580
SPIRVBasicBlock *BB) {
1581-
if (TheType->isTypeFloat(16, FPEncodingBFloat16KHR) && TheOpCode != OpDot)
1581+
if (TheType->isTypeFloat(16, FPEncodingBFloat16KHR) &&
1582+
(TheOpCode == OpFNegate || isUnaryPredicateOpCode(TheOpCode)))
15821583
addCapability(internal::CapabilityBFloat16ArithmeticINTEL);
15831584
return addInstruction(
15841585
SPIRVInstTemplateBase::create(TheOpCode, TheType, getId(),
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
; RUN: llvm-as %s -o %t.bc
2+
; RUN: llvm-spirv %t.bc --spirv-ext=+SPV_KHR_bfloat16 -o %t.spv
3+
; RUN: llvm-spirv %t.spv -to-text -o - | FileCheck %s --check-prefix=CHECK-SPIRV
4+
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+
; RUN: not llvm-spirv %t.bc 2>&1 >/dev/null | FileCheck %s --check-prefix=CHECK-ERROR
9+
; RUN: not llvm-spirv %t.bc --spirv-ext=+SPV_INTEL_bfloat16_arithmetic 2>&1 >/dev/null | FileCheck %s --check-prefix=CHECK-ERROR
10+
; CHECK-ERROR: RequiresExtension: Feature requires the following SPIR-V extension:
11+
12+
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"
13+
target triple = "spir64-unknown-unknown"
14+
15+
; CHECK-SPIRV: Capability BFloat16TypeKHR
16+
; CHECK-SPIRV-NOT: Capability BFloat16ArithmeticINTEL
17+
; CHECK-SPIRV-NOT: Extension "SPV_INTEL_bfloat16_arithmetic"
18+
; CHECK-SPIRV: Extension "SPV_KHR_bfloat16"
19+
; CHECK-SPIRV: TypeFloat [[BFLOAT:[0-9]+]] 16 0
20+
; CHECK-SPIRV: Variable [[#]] [[ADDR1:[0-9]+]]
21+
; CHECK-SPIRV: Load [[BFLOAT]] [[DATA1:[0-9]+]] [[ADDR1]]
22+
; CHECK-SPIRV: ConvertFToU [[#]] [[#]] [[DATA1]]
23+
; CHECK-SPIRV: ConvertFToS [[#]] [[#]] [[DATA1]]
24+
; CHECK-SPIRV: ConvertSToF [[BFLOAT]] [[#]] [[#]]
25+
; CHECK-SPIRV: ConvertUToF [[BFLOAT]] [[#]] [[#]]
26+
27+
28+
; CHECK-LLVM: [[ADDR1:[%a-z0-9]+]] = alloca bfloat
29+
; CHECK-LLVM: [[DATA1:[%a-z0-9]+]] = load bfloat, bfloat* [[ADDR1]]
30+
; CHECK-LLVM: %OpConvertFToU = fptoui bfloat [[DATA1]] to i32
31+
; CHECK-LLVM: %OpConvertFToS = fptosi bfloat [[DATA1]] to i32
32+
; CHECK-LLVM: %OpConvertSToF = sitofp i32 0 to bfloat
33+
; CHECK-LLVM: %OpConvertUToF = uitofp i32 0 to bfloat
34+
35+
define spir_kernel void @testConversions() {
36+
entry:
37+
%addr1 = alloca bfloat
38+
%data1 = load bfloat, bfloat* %addr1
39+
%OpConvertFToU = fptoui bfloat %data1 to i32
40+
%OpConvertFToS = fptosi bfloat %data1 to i32
41+
%OpConvertSToF = sitofp i32 0 to bfloat
42+
%OpConvertUToF = uitofp i32 0 to bfloat
43+
ret void
44+
}
45+
46+
!opencl.enable.FP_CONTRACT = !{}
47+
!opencl.spir.version = !{!0}
48+
!opencl.ocl.version = !{!1}
49+
!opencl.used.extensions = !{!2}
50+
!opencl.used.optional.core.features = !{!3}
51+
!opencl.compiler.options = !{!3}
52+
53+
!0 = !{i32 1, i32 2}
54+
!1 = !{i32 2, i32 0}
55+
!2 = !{!"cl_khr_fp16"}
56+
!3 = !{}

0 commit comments

Comments
 (0)