Index: llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp =================================================================== --- llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp +++ llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp @@ -447,6 +447,15 @@ Inst.addOperand(MCOperand::createImm(TypeCode)); outputMCInst(Inst); } + if (!M.getNamedMetadata("spirv.ExecutionMode") && + !M.getNamedMetadata("opencl.enable.FP_CONTRACT")) { + MCInst Inst; + Inst.setOpcode(SPIRV::OpExecutionMode); + Inst.addOperand(MCOperand::createReg(FReg)); + unsigned EM = static_cast(SPIRV::ExecutionMode::ContractionOff); + Inst.addOperand(MCOperand::createImm(EM)); + outputMCInst(Inst); + } } } Index: llvm/test/CodeGen/SPIRV/opencl/metadata/fp_contractions_metadata.ll =================================================================== --- /dev/null +++ llvm/test/CodeGen/SPIRV/opencl/metadata/fp_contractions_metadata.ll @@ -0,0 +1,10 @@ +; RUN: llc -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s + +; CHECK: OpEntryPoint Kernel %[[#ENTRY:]] "foo" +; CHECK-NOT: OpExecutionMode %[[#ENTRY]] ContractionOff +define spir_kernel void @foo() { +entry: + ret void +} + +!opencl.enable.FP_CONTRACT = !{} Index: llvm/test/CodeGen/SPIRV/opencl/metadata/no_fp_contractions_metadata.ll =================================================================== --- /dev/null +++ llvm/test/CodeGen/SPIRV/opencl/metadata/no_fp_contractions_metadata.ll @@ -0,0 +1,9 @@ +; RUN: llc -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s + +; CHECK: OpEntryPoint Kernel %[[#ENTRY:]] "foo" +; CHECK: OpExecutionMode %[[#ENTRY]] ContractionOff +define spir_kernel void @foo() { +entry: + ret void +} +