From: Arseniy Obolenskiy Date: Thu, 9 Jul 2026 18:42:27 +0200 Subject: [03/13] [Backport to 22] Allow FPFastMathMode decoration on OpFmaKHR (#3820) Origin: upstream, https://github.com/KhronosGroup/SPIRV-LLVM-Translator/commit/39d3c567ef11eac8f8d8010ab24ebf4123dd1102 Inspired by https://github.com/llvm/llvm-project/pull/206143 --- lib/SPIRV/SPIRVWriter.cpp | 2 +- test/extensions/KHR/SPV_KHR_fma/fma.ll | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/SPIRV/SPIRVWriter.cpp b/lib/SPIRV/SPIRVWriter.cpp index eab572d9..2f0b3a46 100644 --- a/lib/SPIRV/SPIRVWriter.cpp +++ b/lib/SPIRV/SPIRVWriter.cpp @@ -3203,7 +3203,7 @@ bool LLVMToSPIRVBase::transDecoration(Value *V, SPIRVValue *BV) { auto Opcode = BVF->getOpcode(); if (Opcode == Instruction::FAdd || Opcode == Instruction::FSub || Opcode == Instruction::FMul || Opcode == Instruction::FDiv || - Opcode == Instruction::FRem || + Opcode == Instruction::FRem || BV->getOpCode() == OpFmaKHR || ((Opcode == Instruction::FNeg || Opcode == Instruction::FCmp || BV->isExtInst()) && BM->isAllowedToUseVersion(VersionNumber::SPIRV_1_6))) { diff --git a/test/extensions/KHR/SPV_KHR_fma/fma.ll b/test/extensions/KHR/SPV_KHR_fma/fma.ll index 9fadfeb9..2a167079 100644 --- a/test/extensions/KHR/SPV_KHR_fma/fma.ll +++ b/test/extensions/KHR/SPV_KHR_fma/fma.ll @@ -7,6 +7,9 @@ ; RUN: FileCheck < %t.rev.ll %s --check-prefix=CHECK-LLVM ; RUN: llvm-spirv -r %t.spv --spirv-target-env=SPV-IR -o - | llvm-dis -o %t.rev.ll ; RUN: FileCheck < %t.rev.ll %s --check-prefix=CHECK-LLVM +; RUN: llvm-spirv %s --spirv-ext=+SPV_KHR_fma -o %t-fmf.spv +; RUNx: spirv-val %t-fmf.spv +; RUN: llvm-spirv %t-fmf.spv -to-text -o - | FileCheck %s --check-prefix=CHECK-SPIRV-FMF ; RUN: llvm-spirv %s -spirv-text -o %t.spt ; RUN: FileCheck < %t.spt %s --check-prefix=CHECK-SPIRV-NO-EXT @@ -25,6 +28,9 @@ ; CHECK-SPIRV: FmaKHR [[#TYPE_VEC]] [[#]] ; CHECK-SPIRV: FmaKHR [[#TYPE_FLOAT]] [[#]] +; CHECK-SPIRV-FMF: Decorate [[#FMF_RES:]] FPFastMathMode 3 +; CHECK-SPIRV-FMF: FmaKHR [[#]] [[#FMF_RES]] + ; CHECK-SPIRV-NO-EXT-NOT: Capability FMAKHR ; CHECK-SPIRV-NO-EXT-NOT: Extension "SPV_KHR_fma" ; CHECK-SPIRV-NO-EXT: TypeFloat [[#TYPE_FLOAT:]] 32 @@ -66,6 +72,12 @@ entry: ret float %result } +define spir_func float @test_fma_fast_math(float %a, float %b, float %c) { +entry: + %result = call nnan ninf float @llvm.fma.f32(float %a, float %b, float %c) + ret float %result +} + declare float @llvm.fma.f32(float, float, float) declare <4 x float> @llvm.fma.v4f32(<4 x float>, <4 x float>, <4 x float>) declare spir_func float @_Z15__spirv_ocl_fmafff(float, float, float) -- 2.55.0