Skip to content

Commit 6b47e8c

Browse files
authored
Extend the use of the FPFastMathMode decoration (#2506)
Since SPIR-V 1.6 may be used with `OpFNegate` and with the binary floating-point comparison instructions (including `OpOrdered` and `OpUnordered`).
1 parent e1f7ebe commit 6b47e8c

File tree

3 files changed

+133
-7
lines changed

3 files changed

+133
-7
lines changed

lib/SPIRV/SPIRVWriter.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2971,7 +2971,9 @@ bool LLVMToSPIRVBase::transDecoration(Value *V, SPIRVValue *BV) {
29712971
auto Opcode = BVF->getOpcode();
29722972
if (Opcode == Instruction::FAdd || Opcode == Instruction::FSub ||
29732973
Opcode == Instruction::FMul || Opcode == Instruction::FDiv ||
2974-
Opcode == Instruction::FRem) {
2974+
Opcode == Instruction::FRem ||
2975+
((Opcode == Instruction::FNeg || Opcode == Instruction::FCmp) &&
2976+
BM->isAllowedToUseVersion(VersionNumber::SPIRV_1_6))) {
29752977
FastMathFlags FMF = BVF->getFastMathFlags();
29762978
SPIRVWord M{0};
29772979
if (FMF.isFast())

test/transcoding/fcmp.ll

Lines changed: 104 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
11
; RUN: llvm-as %s -o %t.bc
2-
; RUN: llvm-spirv -spirv-text %t.bc -o - | FileCheck %s --check-prefix=CHECK-SPIRV
3-
; RUN: llvm-spirv %t.bc -o %t.spv
2+
; RUN: llvm-spirv -spirv-text %t.bc --spirv-max-version=1.5 -o - | FileCheck %s --check-prefixes=CHECK-SPIRV,CHECK-SPIRV-15
3+
; RUN: llvm-spirv %t.bc --spirv-max-version=1.5 -o %t.spv
44
; RUN: spirv-val %t.spv
55
; RUN: llvm-spirv -r %t.spv -o - | llvm-dis -o - | FileCheck %s --check-prefix=CHECK-LLVM
66

7+
; RUN: llvm-spirv -spirv-text %t.bc --spirv-max-version=1.6
8+
; FileCheck < %t.spt %s --check-prefixes=CHECK-SPIRV,CHECK-SPIRV-16
9+
; RUN: llvm-spirv %t.bc --spirv-max-version=1.6 -o %t.spv
10+
; RUN: spirv-val %t.spv
11+
; RUN: llvm-spirv -r %t.spv -o - | llvm-dis -o %t.rev.ll
12+
; FileCheck < %t.rev.ll %s --check-prefix=CHECK-LLVM-16
13+
714
; CHECK-SPIRV: 3 Name [[#r1:]] "r1"
815
; CHECK-SPIRV: 3 Name [[#r2:]] "r2"
916
; CHECK-SPIRV: 3 Name [[#r3:]] "r3"
@@ -94,7 +101,9 @@
94101
; CHECK-SPIRV: 3 Name [[#r88:]] "r88"
95102
; CHECK-SPIRV: 3 Name [[#r89:]] "r89"
96103
; CHECK-SPIRV: 3 Name [[#r90:]] "r90"
97-
; CHECK-SPIRV-NOT: 4 Decorate {{.*}} FPFastMathMode
104+
; CHECK-SPIRV-15-NOT: 4 Decorate {{.*}} FPFastMathMode
105+
; CHECK-SPIRV-16-NOT: 4 Decorate [[#r1]] FPFastMathMode
106+
; CHECK-SPIRV-16: Decorate [[#r2]] FPFastMathMode 1
98107
; CHECK-SPIRV: 2 TypeBool [[#bool:]]
99108
; CHECK-SPIRV: 5 FOrdEqual [[#bool]] [[#r1]]
100109
; CHECK-SPIRV: 5 FOrdEqual [[#bool]] [[#r2]]
@@ -278,6 +287,98 @@
278287
; CHECK-LLVM: %r89 = fcmp uno float %a, %b
279288
; CHECK-LLVM: %r90 = fcmp uno float %a, %b
280289

290+
291+
; CHECK-LLVM-16: %r1 = fcmp oeq float %a, %b
292+
; CHECK-LLVM-16: %r2 = fcmp nnan oeq float %a, %b
293+
; CHECK-LLVM-16: %r3 = fcmp ninf oeq float %a, %b
294+
; CHECK-LLVM-16: %r4 = fcmp nsz oeq float %a, %b
295+
; CHECK-LLVM-16: %r5 = fcmp arcp oeq float %a, %b
296+
; CHECK-LLVM-16: %r6 = fcmp fast oeq float %a, %b
297+
; CHECK-LLVM-16: %r7 = fcmp nnan ninf oeq float %a, %b
298+
; CHECK-LLVM-16: %r8 = fcmp one float %a, %b
299+
; CHECK-LLVM-16: %r9 = fcmp nnan one float %a, %b
300+
; CHECK-LLVM-16: %r10 = fcmp ninf one float %a, %b
301+
; CHECK-LLVM-16: %r11 = fcmp nsz one float %a, %b
302+
; CHECK-LLVM-16: %r12 = fcmp arcp one float %a, %b
303+
; CHECK-LLVM-16: %r13 = fcmp fast one float %a, %b
304+
; CHECK-LLVM-16: %r14 = fcmp nnan ninf one float %a, %b
305+
; CHECK-LLVM-16: %r15 = fcmp olt float %a, %b
306+
; CHECK-LLVM-16: %r16 = fcmp nnan olt float %a, %b
307+
; CHECK-LLVM-16: %r17 = fcmp ninf olt float %a, %b
308+
; CHECK-LLVM-16: %r18 = fcmp nsz olt float %a, %b
309+
; CHECK-LLVM-16: %r19 = fcmp arcp olt float %a, %b
310+
; CHECK-LLVM-16: %r20 = fcmp fast olt float %a, %b
311+
; CHECK-LLVM-16: %r21 = fcmp nnan ninf olt float %a, %b
312+
; CHECK-LLVM-16: %r22 = fcmp ogt float %a, %b
313+
; CHECK-LLVM-16: %r23 = fcmp nnan ogt float %a, %b
314+
; CHECK-LLVM-16: %r24 = fcmp ninf ogt float %a, %b
315+
; CHECK-LLVM-16: %r25 = fcmp nsz ogt float %a, %b
316+
; CHECK-LLVM-16: %r26 = fcmp arcp ogt float %a, %b
317+
; CHECK-LLVM-16: %r27 = fcmp fast ogt float %a, %b
318+
; CHECK-LLVM-16: %r28 = fcmp nnan ninf ogt float %a, %b
319+
; CHECK-LLVM-16: %r29 = fcmp ole float %a, %b
320+
; CHECK-LLVM-16: %r30 = fcmp nnan ole float %a, %b
321+
; CHECK-LLVM-16: %r31 = fcmp ninf ole float %a, %b
322+
; CHECK-LLVM-16: %r32 = fcmp nsz ole float %a, %b
323+
; CHECK-LLVM-16: %r33 = fcmp arcp ole float %a, %b
324+
; CHECK-LLVM-16: %r34 = fcmp fast ole float %a, %b
325+
; CHECK-LLVM-16: %r35 = fcmp nnan ninf ole float %a, %b
326+
; CHECK-LLVM-16: %r36 = fcmp oge float %a, %b
327+
; CHECK-LLVM-16: %r37 = fcmp nnan oge float %a, %b
328+
; CHECK-LLVM-16: %r38 = fcmp ninf oge float %a, %b
329+
; CHECK-LLVM-16: %r39 = fcmp nsz oge float %a, %b
330+
; CHECK-LLVM-16: %r40 = fcmp arcp oge float %a, %b
331+
; CHECK-LLVM-16: %r41 = fcmp fast oge float %a, %b
332+
; CHECK-LLVM-16: %r42 = fcmp nnan ninf oge float %a, %b
333+
; CHECK-LLVM-16: %r43 = fcmp ord float %a, %b
334+
; CHECK-LLVM-16: %r44 = fcmp ninf ord float %a, %b
335+
; CHECK-LLVM-16: %r45 = fcmp nsz ord float %a, %b
336+
; CHECK-LLVM-16: %r46 = fcmp ueq float %a, %b
337+
; CHECK-LLVM-16: %r47 = fcmp nnan ueq float %a, %b
338+
; CHECK-LLVM-16: %r48 = fcmp ninf ueq float %a, %b
339+
; CHECK-LLVM-16: %r49 = fcmp nsz ueq float %a, %b
340+
; CHECK-LLVM-16: %r50 = fcmp arcp ueq float %a, %b
341+
; CHECK-LLVM-16: %r51 = fcmp fast ueq float %a, %b
342+
; CHECK-LLVM-16: %r52 = fcmp nnan ninf ueq float %a, %b
343+
; CHECK-LLVM-16: %r53 = fcmp une float %a, %b
344+
; CHECK-LLVM-16: %r54 = fcmp nnan une float %a, %b
345+
; CHECK-LLVM-16: %r55 = fcmp ninf une float %a, %b
346+
; CHECK-LLVM-16: %r56 = fcmp nsz une float %a, %b
347+
; CHECK-LLVM-16: %r57 = fcmp arcp une float %a, %b
348+
; CHECK-LLVM-16: %r58 = fcmp fast une float %a, %b
349+
; CHECK-LLVM-16: %r59 = fcmp nnan ninf une float %a, %b
350+
; CHECK-LLVM-16: %r60 = fcmp ult float %a, %b
351+
; CHECK-LLVM-16: %r61 = fcmp nnan ult float %a, %b
352+
; CHECK-LLVM-16: %r62 = fcmp ninf ult float %a, %b
353+
; CHECK-LLVM-16: %r63 = fcmp nsz ult float %a, %b
354+
; CHECK-LLVM-16: %r64 = fcmp arcp ult float %a, %b
355+
; CHECK-LLVM-16: %r65 = fcmp fast ult float %a, %b
356+
; CHECK-LLVM-16: %r66 = fcmp nnan ninf ult float %a, %b
357+
; CHECK-LLVM-16: %r67 = fcmp ugt float %a, %b
358+
; CHECK-LLVM-16: %r68 = fcmp nnan ugt float %a, %b
359+
; CHECK-LLVM-16: %r69 = fcmp ninf ugt float %a, %b
360+
; CHECK-LLVM-16: %r70 = fcmp nsz ugt float %a, %b
361+
; CHECK-LLVM-16: %r71 = fcmp arcp ugt float %a, %b
362+
; CHECK-LLVM-16: %r72 = fcmp fast ugt float %a, %b
363+
; CHECK-LLVM-16: %r73 = fcmp nnan ninf ugt float %a, %b
364+
; CHECK-LLVM-16: %r74 = fcmp ule float %a, %b
365+
; CHECK-LLVM-16: %r75 = fcmp nnan ule float %a, %b
366+
; CHECK-LLVM-16: %r76 = fcmp ninf ule float %a, %b
367+
; CHECK-LLVM-16: %r77 = fcmp nsz ule float %a, %b
368+
; CHECK-LLVM-16: %r78 = fcmp arcp ule float %a, %b
369+
; CHECK-LLVM-16: %r79 = fcmp fast ule float %a, %b
370+
; CHECK-LLVM-16: %r80 = fcmp nnan ninf ule float %a, %b
371+
; CHECK-LLVM-16: %r81 = fcmp uge float %a, %b
372+
; CHECK-LLVM-16: %r82 = fcmp nnan uge float %a, %b
373+
; CHECK-LLVM-16: %r83 = fcmp ninf uge float %a, %b
374+
; CHECK-LLVM-16: %r84 = fcmp nsz uge float %a, %b
375+
; CHECK-LLVM-16: %r85 = fcmp arcp uge float %a, %b
376+
; CHECK-LLVM-16: %r86 = fcmp fast uge float %a, %b
377+
; CHECK-LLVM-16: %r87 = fcmp nnan ninf uge float %a, %b
378+
; CHECK-LLVM-16: %r88 = fcmp uno float %a, %b
379+
; CHECK-LLVM-16: %r89 = fcmp ninf uno float %a, %b
380+
; CHECK-LLVM-16: %r90 = fcmp nsz uno float %a, %b
381+
281382
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"
282383
target triple = "spir-unknown-unknown"
283384

test/transcoding/fneg.ll

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,32 @@
11
; RUN: llvm-as %s -o %t.bc
2-
; RUN: llvm-spirv -spirv-text %t.bc -o - | FileCheck %s --check-prefix=CHECK-SPIRV
3-
; RUN: llvm-spirv %t.bc -o %t.spv
2+
; RUN: llvm-spirv -spirv-text %t.bc --spirv-max-version=1.5 -o - | FileCheck %s --check-prefixes=CHECK-SPIRV,CHECK-SPIRV-15
3+
; RUN: llvm-spirv %t.bc --spirv-max-version=1.5 -o %t.spv
44
; RUN: spirv-val %t.spv
55
; RUN: llvm-spirv -r %t.spv -o - | llvm-dis -o - | FileCheck %s --check-prefix=CHECK-LLVM
66

7+
; RUN: llvm-spirv -spirv-text %t.bc --spirv-max-version=1.6
8+
; FileCheck < %t.spt %s --check-prefixes=CHECK-SPIRV,CHECK-SPIRV-16
9+
; RUN: llvm-spirv %t.bc --spirv-max-version=1.6 -o %t.spv
10+
; RUN: spirv-val %t.spv
11+
; RUN: llvm-spirv -r %t.spv -o - | llvm-dis -o - | FileCheck %s --check-prefix=CHECK-LLVM-16
12+
713
; CHECK-SPIRV: 3 Name [[#r1:]] "r1"
814
; CHECK-SPIRV: 3 Name [[#r2:]] "r2"
915
; CHECK-SPIRV: 3 Name [[#r3:]] "r3"
1016
; CHECK-SPIRV: 3 Name [[#r4:]] "r4"
1117
; CHECK-SPIRV: 3 Name [[#r5:]] "r5"
1218
; CHECK-SPIRV: 3 Name [[#r6:]] "r6"
1319
; CHECK-SPIRV: 3 Name [[#r7:]] "r7"
14-
; CHECK-SPIRV-NOT: 4 Decorate {{.*}} FPFastMathMode
20+
; CHECK-SPIRV-15-NOT: 4 Decorate {{.*}} FPFastMathMode
21+
22+
; CHECK-SPIRV-16-NOT: Decorate [[#r1]] FPFastMathMode
23+
; CHECK-SPIRV-16-DAG: Decorate [[#r2]] FPFastMathMode 1
24+
; CHECK-SPIRV-16-DAG: Decorate [[#r3]] FPFastMathMode 2
25+
; CHECK-SPIRV-16-DAG: Decorate [[#r4]] FPFastMathMode 4
26+
; CHECK-SPIRV-16-DAG: Decorate [[#r5]] FPFastMathMode 8
27+
; CHECK-SPIRV-16-DAG: Decorate [[#r6]] FPFastMathMode 16
28+
; CHECK-SPIRV-16-DAG: Decorate [[#r7]] FPFastMathMode 3
29+
1530
; CHECK-SPIRV: 3 TypeFloat [[float:[0-9]+]] 32
1631
; CHECK-SPIRV: 4 FNegate [[float]] [[#r1]]
1732
; CHECK-SPIRV: 4 FNegate [[float]] [[#r2]]
@@ -29,6 +44,14 @@
2944
; CHECK-LLVM: %r6 = fneg float %a
3045
; CHECK-LLVM: %r7 = fneg float %a
3146

47+
; CHECK-LLVM-16: %r1 = fneg float %a
48+
; CHECK-LLVM-16: %r2 = fneg nnan float %a
49+
; CHECK-LLVM-16: %r3 = fneg ninf float %a
50+
; CHECK-LLVM-16: %r4 = fneg nsz float %a
51+
; CHECK-LLVM-16: %r5 = fneg arcp float %a
52+
; CHECK-LLVM-16: %r6 = fneg fast float %a
53+
; CHECK-LLVM-16: %r7 = fneg nnan ninf float %a
54+
3255
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"
3356
target triple = "spir-unknown-unknown"
3457

0 commit comments

Comments
 (0)