Skip to content

Commit 14e2c5f

Browse files
StuartDBradysvenvh
authored andcommitted
Add translation of FPFastMathMode decorations
This includes tests for OpFAdd, OpFSub, OpFMul, OpFDiv, OpFRem and OpFNegate.
1 parent 7bb245d commit 14e2c5f

File tree

7 files changed

+333
-5
lines changed

7 files changed

+333
-5
lines changed

lib/SPIRV/SPIRVReader.cpp

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -827,6 +827,25 @@ static void applyNoIntegerWrapDecorations(const SPIRVValue *BV,
827827
}
828828
}
829829

830+
static void applyFPFastMathModeDecorations(const SPIRVValue *BV,
831+
Instruction *Inst) {
832+
SPIRVWord V;
833+
FastMathFlags FMF;
834+
if (BV->hasDecorate(DecorationFPFastMathMode, 0, &V)) {
835+
if (V & FPFastMathModeNotNaNMask)
836+
FMF.setNoNaNs();
837+
if (V & FPFastMathModeNotInfMask)
838+
FMF.setNoInfs();
839+
if (V & FPFastMathModeNSZMask)
840+
FMF.setNoSignedZeros();
841+
if (V & FPFastMathModeAllowRecipMask)
842+
FMF.setAllowReciprocal();
843+
if (V & FPFastMathModeFastMask)
844+
FMF.setFast();
845+
Inst->setFastMathFlags(FMF);
846+
}
847+
}
848+
830849
BinaryOperator *SPIRVToLLVM::transShiftLogicalBitwiseInst(SPIRVValue *BV,
831850
BasicBlock *BB,
832851
Function *F) {
@@ -841,6 +860,7 @@ BinaryOperator *SPIRVToLLVM::transShiftLogicalBitwiseInst(SPIRVValue *BV,
841860
transValue(BBN->getOperand(1), F, BB),
842861
BV->getName(), BB);
843862
applyNoIntegerWrapDecorations(BV, Inst);
863+
applyFPFastMathModeDecorations(BV, Inst);
844864
return Inst;
845865
}
846866

@@ -1919,9 +1939,10 @@ Value *SPIRVToLLVM::transValueWithoutDecoration(SPIRVValue *BV, Function *F,
19191939

19201940
case OpFNegate: {
19211941
SPIRVUnary *BC = static_cast<SPIRVUnary *>(BV);
1922-
return mapValue(
1923-
BV, BinaryOperator::CreateFNeg(transValue(BC->getOperand(0), F, BB),
1924-
BV->getName(), BB));
1942+
auto Neg = BinaryOperator::CreateFNeg(transValue(BC->getOperand(0), F, BB),
1943+
BV->getName(), BB);
1944+
applyFPFastMathModeDecorations(BV, Neg);
1945+
return mapValue(BV, Neg);
19251946
}
19261947

19271948
case OpNot:

test/OpFAdd.spvasm

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
; REQUIRES: spirv-as
2+
; RUN: spirv-as --target-env spv1.0 -o %t.spv %s
3+
; RUN: spirv-val %t.spv
4+
; RUN: llvm-spirv -r -o - %t.spv | llvm-dis | FileCheck %s
5+
OpCapability Addresses
6+
OpCapability Kernel
7+
OpMemoryModel Physical32 OpenCL
8+
OpEntryPoint Kernel %1 "testFAdd"
9+
OpName %a "a"
10+
OpName %b "b"
11+
OpName %r1 "r1"
12+
OpName %r2 "r2"
13+
OpName %r3 "r3"
14+
OpName %r4 "r4"
15+
OpName %r5 "r5"
16+
OpName %r6 "r6"
17+
OpName %r7 "r7"
18+
OpName %r8 "r8"
19+
OpName %r9 "r9"
20+
OpDecorate %r2 FPFastMathMode None
21+
OpDecorate %r3 FPFastMathMode NotNaN
22+
OpDecorate %r4 FPFastMathMode NotInf
23+
OpDecorate %r5 FPFastMathMode NSZ
24+
OpDecorate %r6 FPFastMathMode AllowRecip
25+
OpDecorate %r7 FPFastMathMode Fast
26+
OpDecorate %r8 FPFastMathMode NotNaN|NotInf
27+
OpDecorate %r9 FPFastMathMode NotNaN|Fast
28+
%void = OpTypeVoid
29+
%float = OpTypeFloat 32
30+
%5 = OpTypeFunction %void %float %float
31+
%1 = OpFunction %void None %5
32+
%a = OpFunctionParameter %float
33+
%b = OpFunctionParameter %float
34+
%6 = OpLabel
35+
%r1 = OpFAdd %float %a %b
36+
%r2 = OpFAdd %float %a %b
37+
%r3 = OpFAdd %float %a %b
38+
%r4 = OpFAdd %float %a %b
39+
%r5 = OpFAdd %float %a %b
40+
%r6 = OpFAdd %float %a %b
41+
%r7 = OpFAdd %float %a %b
42+
%r8 = OpFAdd %float %a %b
43+
%r9 = OpFAdd %float %a %b
44+
OpReturn
45+
OpFunctionEnd
46+
47+
; CHECK: %r1 = fadd float %a, %b
48+
; CHECK: %r2 = fadd float %a, %b
49+
; CHECK: %r3 = fadd nnan float %a, %b
50+
; CHECK: %r4 = fadd ninf float %a, %b
51+
; CHECK: %r5 = fadd nsz float %a, %b
52+
; CHECK: %r6 = fadd arcp float %a, %b
53+
; CHECK: %r7 = fadd fast float %a, %b
54+
; CHECK: %r8 = fadd nnan ninf float %a, %b
55+
; CHECK: %r9 = fadd fast float %a, %b

test/OpFDiv.spvasm

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
; REQUIRES: spirv-as
2+
; RUN: spirv-as --target-env spv1.0 -o %t.spv %s
3+
; RUN: spirv-val %t.spv
4+
; RUN: llvm-spirv -r -o - %t.spv | llvm-dis | FileCheck %s
5+
OpCapability Addresses
6+
OpCapability Kernel
7+
OpMemoryModel Physical32 OpenCL
8+
OpEntryPoint Kernel %1 "testFDiv"
9+
OpName %a "a"
10+
OpName %b "b"
11+
OpName %r1 "r1"
12+
OpName %r2 "r2"
13+
OpName %r3 "r3"
14+
OpName %r4 "r4"
15+
OpName %r5 "r5"
16+
OpName %r6 "r6"
17+
OpName %r7 "r7"
18+
OpName %r8 "r8"
19+
OpName %r9 "r9"
20+
OpDecorate %r2 FPFastMathMode None
21+
OpDecorate %r3 FPFastMathMode NotNaN
22+
OpDecorate %r4 FPFastMathMode NotInf
23+
OpDecorate %r5 FPFastMathMode NSZ
24+
OpDecorate %r6 FPFastMathMode AllowRecip
25+
OpDecorate %r7 FPFastMathMode Fast
26+
OpDecorate %r8 FPFastMathMode NotNaN|NotInf
27+
OpDecorate %r9 FPFastMathMode NotNaN|Fast
28+
%void = OpTypeVoid
29+
%float = OpTypeFloat 32
30+
%5 = OpTypeFunction %void %float %float
31+
%1 = OpFunction %void None %5
32+
%a = OpFunctionParameter %float
33+
%b = OpFunctionParameter %float
34+
%6 = OpLabel
35+
%r1 = OpFDiv %float %a %b
36+
%r2 = OpFDiv %float %a %b
37+
%r3 = OpFDiv %float %a %b
38+
%r4 = OpFDiv %float %a %b
39+
%r5 = OpFDiv %float %a %b
40+
%r6 = OpFDiv %float %a %b
41+
%r7 = OpFDiv %float %a %b
42+
%r8 = OpFDiv %float %a %b
43+
%r9 = OpFDiv %float %a %b
44+
OpReturn
45+
OpFunctionEnd
46+
47+
; CHECK: %r1 = fdiv float %a, %b
48+
; CHECK: %r2 = fdiv float %a, %b
49+
; CHECK: %r3 = fdiv nnan float %a, %b
50+
; CHECK: %r4 = fdiv ninf float %a, %b
51+
; CHECK: %r5 = fdiv nsz float %a, %b
52+
; CHECK: %r6 = fdiv arcp float %a, %b
53+
; CHECK: %r7 = fdiv fast float %a, %b
54+
; CHECK: %r8 = fdiv nnan ninf float %a, %b
55+
; CHECK: %r9 = fdiv fast float %a, %b

test/OpFMul.spvasm

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
; REQUIRES: spirv-as
2+
; RUN: spirv-as --target-env spv1.0 -o %t.spv %s
3+
; RUN: spirv-val %t.spv
4+
; RUN: llvm-spirv -r -o - %t.spv | llvm-dis | FileCheck %s
5+
OpCapability Addresses
6+
OpCapability Kernel
7+
OpMemoryModel Physical32 OpenCL
8+
OpEntryPoint Kernel %1 "testFMul"
9+
OpName %a "a"
10+
OpName %b "b"
11+
OpName %r1 "r1"
12+
OpName %r2 "r2"
13+
OpName %r3 "r3"
14+
OpName %r4 "r4"
15+
OpName %r5 "r5"
16+
OpName %r6 "r6"
17+
OpName %r7 "r7"
18+
OpName %r8 "r8"
19+
OpName %r9 "r9"
20+
OpDecorate %r2 FPFastMathMode None
21+
OpDecorate %r3 FPFastMathMode NotNaN
22+
OpDecorate %r4 FPFastMathMode NotInf
23+
OpDecorate %r5 FPFastMathMode NSZ
24+
OpDecorate %r6 FPFastMathMode AllowRecip
25+
OpDecorate %r7 FPFastMathMode Fast
26+
OpDecorate %r8 FPFastMathMode NotNaN|NotInf
27+
OpDecorate %r9 FPFastMathMode NotNaN|Fast
28+
%void = OpTypeVoid
29+
%float = OpTypeFloat 32
30+
%5 = OpTypeFunction %void %float %float
31+
%1 = OpFunction %void None %5
32+
%a = OpFunctionParameter %float
33+
%b = OpFunctionParameter %float
34+
%6 = OpLabel
35+
%r1 = OpFMul %float %a %b
36+
%r2 = OpFMul %float %a %b
37+
%r3 = OpFMul %float %a %b
38+
%r4 = OpFMul %float %a %b
39+
%r5 = OpFMul %float %a %b
40+
%r6 = OpFMul %float %a %b
41+
%r7 = OpFMul %float %a %b
42+
%r8 = OpFMul %float %a %b
43+
%r9 = OpFMul %float %a %b
44+
OpReturn
45+
OpFunctionEnd
46+
47+
; CHECK: %r1 = fmul float %a, %b
48+
; CHECK: %r2 = fmul float %a, %b
49+
; CHECK: %r3 = fmul nnan float %a, %b
50+
; CHECK: %r4 = fmul ninf float %a, %b
51+
; CHECK: %r5 = fmul nsz float %a, %b
52+
; CHECK: %r6 = fmul arcp float %a, %b
53+
; CHECK: %r7 = fmul fast float %a, %b
54+
; CHECK: %r8 = fmul nnan ninf float %a, %b
55+
; CHECK: %r9 = fmul fast float %a, %b

test/OpFNegate.spvasm

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
; REQUIRES: spirv-as
2+
; RUN: spirv-as --target-env spv1.0 -o %t.spv %s
3+
; RUN: spirv-val %t.spv
4+
; RUN: llvm-spirv -r -o - %t.spv | llvm-dis | FileCheck %s
5+
OpCapability Addresses
6+
OpCapability Kernel
7+
OpMemoryModel Physical32 OpenCL
8+
OpEntryPoint Kernel %1 "testFNegate"
9+
OpName %a "a"
10+
OpName %r1 "r1"
11+
OpName %r2 "r2"
12+
OpName %r3 "r3"
13+
OpName %r4 "r4"
14+
OpName %r5 "r5"
15+
OpName %r6 "r6"
16+
OpName %r7 "r7"
17+
OpName %r8 "r8"
18+
OpName %r9 "r9"
19+
OpDecorate %r2 FPFastMathMode None
20+
OpDecorate %r3 FPFastMathMode NotNaN
21+
OpDecorate %r4 FPFastMathMode NotInf
22+
OpDecorate %r5 FPFastMathMode NSZ
23+
OpDecorate %r6 FPFastMathMode AllowRecip
24+
OpDecorate %r7 FPFastMathMode Fast
25+
OpDecorate %r8 FPFastMathMode NotNaN|NotInf
26+
OpDecorate %r9 FPFastMathMode NotNaN|Fast
27+
%void = OpTypeVoid
28+
%float = OpTypeFloat 32
29+
%5 = OpTypeFunction %void %float
30+
%1 = OpFunction %void None %5
31+
%a = OpFunctionParameter %float
32+
%6 = OpLabel
33+
%r1 = OpFNegate %float %a
34+
%r2 = OpFNegate %float %a
35+
%r3 = OpFNegate %float %a
36+
%r4 = OpFNegate %float %a
37+
%r5 = OpFNegate %float %a
38+
%r6 = OpFNegate %float %a
39+
%r7 = OpFNegate %float %a
40+
%r8 = OpFNegate %float %a
41+
%r9 = OpFNegate %float %a
42+
OpReturn
43+
OpFunctionEnd
44+
45+
; CHECK: %r1 = fsub float -0.000000e+00, %a
46+
; CHECK: %r2 = fsub float -0.000000e+00, %a
47+
; CHECK: %r3 = fsub nnan float -0.000000e+00, %a
48+
; CHECK: %r4 = fsub ninf float -0.000000e+00, %a
49+
; CHECK: %r5 = fsub nsz float -0.000000e+00, %a
50+
; CHECK: %r6 = fsub arcp float -0.000000e+00, %a
51+
; CHECK: %r7 = fsub fast float -0.000000e+00, %a
52+
; CHECK: %r8 = fsub nnan ninf float -0.000000e+00, %a
53+
; CHECK: %r9 = fsub fast float -0.000000e+00, %a

test/OpFRem.spvasm

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,55 @@
11
; REQUIRES: spirv-as
22
; RUN: spirv-as --target-env spv1.0 -o %t.spv %s
3+
; RUN: spirv-val %t.spv
34
; RUN: llvm-spirv -r -o - %t.spv | llvm-dis | FileCheck %s
45
OpCapability Addresses
56
OpCapability Kernel
67
OpMemoryModel Physical32 OpenCL
78
OpEntryPoint Kernel %1 "testFRem"
89
OpName %a "a"
910
OpName %b "b"
11+
OpName %r1 "r1"
12+
OpName %r2 "r2"
13+
OpName %r3 "r3"
14+
OpName %r4 "r4"
15+
OpName %r5 "r5"
16+
OpName %r6 "r6"
17+
OpName %r7 "r7"
18+
OpName %r8 "r8"
19+
OpName %r9 "r9"
20+
OpDecorate %r2 FPFastMathMode None
21+
OpDecorate %r3 FPFastMathMode NotNaN
22+
OpDecorate %r4 FPFastMathMode NotInf
23+
OpDecorate %r5 FPFastMathMode NSZ
24+
OpDecorate %r6 FPFastMathMode AllowRecip
25+
OpDecorate %r7 FPFastMathMode Fast
26+
OpDecorate %r8 FPFastMathMode NotNaN|NotInf
27+
OpDecorate %r9 FPFastMathMode NotNaN|Fast
1028
%void = OpTypeVoid
1129
%float = OpTypeFloat 32
1230
%5 = OpTypeFunction %void %float %float
1331
%1 = OpFunction %void None %5
1432
%a = OpFunctionParameter %float
1533
%b = OpFunctionParameter %float
1634
%6 = OpLabel
17-
%7 = OpFRem %float %a %b
35+
%r1 = OpFRem %float %a %b
36+
%r2 = OpFRem %float %a %b
37+
%r3 = OpFRem %float %a %b
38+
%r4 = OpFRem %float %a %b
39+
%r5 = OpFRem %float %a %b
40+
%r6 = OpFRem %float %a %b
41+
%r7 = OpFRem %float %a %b
42+
%r8 = OpFRem %float %a %b
43+
%r9 = OpFRem %float %a %b
1844
OpReturn
1945
OpFunctionEnd
2046

21-
; CHECK: frem float %a, %b
47+
; CHECK: %r1 = frem float %a, %b
48+
; CHECK: %r2 = frem float %a, %b
49+
; CHECK: %r3 = frem nnan float %a, %b
50+
; CHECK: %r4 = frem ninf float %a, %b
51+
; CHECK: %r5 = frem nsz float %a, %b
52+
; CHECK: %r6 = frem arcp float %a, %b
53+
; CHECK: %r7 = frem fast float %a, %b
54+
; CHECK: %r8 = frem nnan ninf float %a, %b
55+
; CHECK: %r9 = frem fast float %a, %b

test/OpFSub.spvasm

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
; REQUIRES: spirv-as
2+
; RUN: spirv-as --target-env spv1.0 -o %t.spv %s
3+
; RUN: spirv-val %t.spv
4+
; RUN: llvm-spirv -r -o - %t.spv | llvm-dis | FileCheck %s
5+
OpCapability Addresses
6+
OpCapability Kernel
7+
OpMemoryModel Physical32 OpenCL
8+
OpEntryPoint Kernel %1 "testFSub"
9+
OpName %a "a"
10+
OpName %b "b"
11+
OpName %r1 "r1"
12+
OpName %r2 "r2"
13+
OpName %r3 "r3"
14+
OpName %r4 "r4"
15+
OpName %r5 "r5"
16+
OpName %r6 "r6"
17+
OpName %r7 "r7"
18+
OpName %r8 "r8"
19+
OpName %r9 "r9"
20+
OpDecorate %r2 FPFastMathMode None
21+
OpDecorate %r3 FPFastMathMode NotNaN
22+
OpDecorate %r4 FPFastMathMode NotInf
23+
OpDecorate %r5 FPFastMathMode NSZ
24+
OpDecorate %r6 FPFastMathMode AllowRecip
25+
OpDecorate %r7 FPFastMathMode Fast
26+
OpDecorate %r8 FPFastMathMode NotNaN|NotInf
27+
OpDecorate %r9 FPFastMathMode NotNaN|Fast
28+
%void = OpTypeVoid
29+
%float = OpTypeFloat 32
30+
%5 = OpTypeFunction %void %float %float
31+
%1 = OpFunction %void None %5
32+
%a = OpFunctionParameter %float
33+
%b = OpFunctionParameter %float
34+
%6 = OpLabel
35+
%r1 = OpFSub %float %a %b
36+
%r2 = OpFSub %float %a %b
37+
%r3 = OpFSub %float %a %b
38+
%r4 = OpFSub %float %a %b
39+
%r5 = OpFSub %float %a %b
40+
%r6 = OpFSub %float %a %b
41+
%r7 = OpFSub %float %a %b
42+
%r8 = OpFSub %float %a %b
43+
%r9 = OpFSub %float %a %b
44+
OpReturn
45+
OpFunctionEnd
46+
47+
; CHECK: %r1 = fsub float %a, %b
48+
; CHECK: %r2 = fsub float %a, %b
49+
; CHECK: %r3 = fsub nnan float %a, %b
50+
; CHECK: %r4 = fsub ninf float %a, %b
51+
; CHECK: %r5 = fsub nsz float %a, %b
52+
; CHECK: %r6 = fsub arcp float %a, %b
53+
; CHECK: %r7 = fsub fast float %a, %b
54+
; CHECK: %r8 = fsub nnan ninf float %a, %b
55+
; CHECK: %r9 = fsub fast float %a, %b

0 commit comments

Comments
 (0)