[Mlir-commits] [mlir] 0f861ec - [MLIR][NVVM] Add `nvvm.cos` OP (#193792)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Fri Apr 24 08:19:36 PDT 2026
Author: Guray Ozen
Date: 2026-04-24T17:19:31+02:00
New Revision: 0f861ec33ae6c0b0573207e4796e5a85748ff413
URL: https://github.com/llvm/llvm-project/commit/0f861ec33ae6c0b0573207e4796e5a85748ff413
DIFF: https://github.com/llvm/llvm-project/commit/0f861ec33ae6c0b0573207e4796e5a85748ff413.diff
LOG: [MLIR][NVVM] Add `nvvm.cos` OP (#193792)
Implement `nvvm.cos` with ftz flag
Added:
Modified:
mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td
mlir/lib/Dialect/LLVMIR/IR/NVVMDialect.cpp
mlir/test/Dialect/LLVMIR/nvvm-transcendentals.mlir
mlir/test/Target/LLVMIR/nvvm/transcendentals.mlir
Removed:
################################################################################
diff --git a/mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td b/mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td
index 5804cb7d40be3..9f01d44cadd76 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td
@@ -543,6 +543,21 @@ def NVVM_SinOp : NVVM_SingleResultIntrinsicOp<"sin",
let assemblyFormat = "$src attr-dict `:` type($src)";
}
+
+def NVVM_CosOp : NVVM_SingleResultIntrinsicOp<"cos",
+ [Pure, SameOperandsAndResultType]> {
+ let summary = "Cosine (fast approximation)";
+ let description = [{
+ Computes a fast approximation of the cosine of the input value (in
+ radians). The `ftz` attribute, when set, flushes subnormal inputs
+ and results to sign-preserving zero.
+ }];
+ let arguments = (ins F32:$src,
+ DefaultValuedAttr<BoolAttr, "false">:$ftz);
+ let results = (outs F32:$res);
+ let assemblyFormat = "$src attr-dict `:` type($src)";
+}
+
//===----------------------------------------------------------------------===//
// NVVM redux op definitions
//===----------------------------------------------------------------------===//
diff --git a/mlir/lib/Dialect/LLVMIR/IR/NVVMDialect.cpp b/mlir/lib/Dialect/LLVMIR/IR/NVVMDialect.cpp
index b0cebd45624a9..8b4f832997a0f 100644
--- a/mlir/lib/Dialect/LLVMIR/IR/NVVMDialect.cpp
+++ b/mlir/lib/Dialect/LLVMIR/IR/NVVMDialect.cpp
@@ -3464,6 +3464,16 @@ mlir::NVVM::IDArgPair NVVM::BarrierOp::getIntrinsicIDAndArgs(
return {id, std::move(args)};
}
+mlir::NVVM::IDArgPair
+CosOp::getIntrinsicIDAndArgs(Operation &op, LLVM::ModuleTranslation &mt,
+ llvm::IRBuilderBase &builder) {
+ auto thisOp = cast<NVVM::CosOp>(op);
+ llvm::Intrinsic::ID id = thisOp.getFtz()
+ ? llvm::Intrinsic::nvvm_cos_approx_ftz_f
+ : llvm::Intrinsic::nvvm_cos_approx_f;
+ return {id, {mt.lookupValue(thisOp.getSrc())}};
+}
+
mlir::NVVM::IDArgPair
SinOp::getIntrinsicIDAndArgs(Operation &op, LLVM::ModuleTranslation &mt,
llvm::IRBuilderBase &builder) {
diff --git a/mlir/test/Dialect/LLVMIR/nvvm-transcendentals.mlir b/mlir/test/Dialect/LLVMIR/nvvm-transcendentals.mlir
index c773e3f06a612..777152e0fd797 100644
--- a/mlir/test/Dialect/LLVMIR/nvvm-transcendentals.mlir
+++ b/mlir/test/Dialect/LLVMIR/nvvm-transcendentals.mlir
@@ -1,5 +1,20 @@
// RUN: mlir-opt %s -split-input-file | FileCheck %s
+// CHECK-LABEL: @nvvm_cos_f32
+func.func @nvvm_cos_f32(%arg0: f32) -> f32 {
+ // CHECK: nvvm.cos {{.*}} : f32
+ %0 = nvvm.cos %arg0 : f32
+ return %0 : f32
+}
+
+// CHECK-LABEL: @nvvm_cos_ftz_f32
+func.func @nvvm_cos_ftz_f32(%arg0: f32) -> f32 {
+ // CHECK: nvvm.cos {{.*}} {ftz = true} : f32
+ %0 = nvvm.cos %arg0 {ftz = true} : f32
+ return %0 : f32
+}
+// RUN: mlir-opt %s -split-input-file | FileCheck %s
+
// CHECK-LABEL: @nvvm_sin_f32
func.func @nvvm_sin_f32(%arg0: f32) -> f32 {
// CHECK: nvvm.sin {{.*}} : f32
diff --git a/mlir/test/Target/LLVMIR/nvvm/transcendentals.mlir b/mlir/test/Target/LLVMIR/nvvm/transcendentals.mlir
index 65374c9bd5e87..06da78820b25f 100644
--- a/mlir/test/Target/LLVMIR/nvvm/transcendentals.mlir
+++ b/mlir/test/Target/LLVMIR/nvvm/transcendentals.mlir
@@ -13,3 +13,17 @@ llvm.func @nvvm_sin_ftz(%arg0: f32) -> f32 {
%0 = nvvm.sin %arg0 {ftz = true} : f32
llvm.return %0 : f32
}
+
+// CHECK-LABEL: @nvvm_cos
+llvm.func @nvvm_cos(%arg0: f32) -> f32 {
+ // CHECK: call float @llvm.nvvm.cos.approx.f(float %{{.*}})
+ %0 = nvvm.cos %arg0 : f32
+ llvm.return %0 : f32
+}
+
+// CHECK-LABEL: @nvvm_cos_ftz
+llvm.func @nvvm_cos_ftz(%arg0: f32) -> f32 {
+ // CHECK: call float @llvm.nvvm.cos.approx.ftz.f(float %{{.*}})
+ %0 = nvvm.cos %arg0 {ftz = true} : f32
+ llvm.return %0 : f32
+}
More information about the Mlir-commits
mailing list