diff --git a/mlir/lib/Conversion/GPUToNVVM/LowerGpuOpsToNVVMOps.cpp b/mlir/lib/Conversion/GPUToNVVM/LowerGpuOpsToNVVMOps.cpp --- a/mlir/lib/Conversion/GPUToNVVM/LowerGpuOpsToNVVMOps.cpp +++ b/mlir/lib/Conversion/GPUToNVVM/LowerGpuOpsToNVVMOps.cpp @@ -681,8 +681,8 @@ populateGpuToNVVMConversionPatterns(converter, patterns); ConversionTarget target(getContext()); target.addIllegalDialect(); - target.addIllegalOp(); + target.addIllegalOp(); target.addIllegalOp(); target.addLegalDialect(); target.addLegalDialect(); @@ -719,6 +719,12 @@ "__nv_cos"); patterns.insert>(converter, "__nv_expf", "__nv_exp"); + patterns.insert>(converter, "__nv_logf", + "__nv_log"); + patterns.insert>(converter, "__nv_log10f", + "__nv_log10"); + patterns.insert>(converter, "__nv_log2f", + "__nv_log2"); patterns.insert>(converter, "__nv_tanhf", "__nv_tanh"); } diff --git a/mlir/lib/Conversion/GPUToROCDL/LowerGpuOpsToROCDLOps.cpp b/mlir/lib/Conversion/GPUToROCDL/LowerGpuOpsToROCDLOps.cpp --- a/mlir/lib/Conversion/GPUToROCDL/LowerGpuOpsToROCDLOps.cpp +++ b/mlir/lib/Conversion/GPUToROCDL/LowerGpuOpsToROCDLOps.cpp @@ -58,13 +58,19 @@ "__ocml_cos_f64"); patterns.insert>(converter, "__ocml_exp_f32", "__ocml_exp_f64"); + patterns.insert>(converter, "__ocml_log_f32", + "__ocml_log_f64"); + patterns.insert>( + converter, "__ocml_log10_f32", "__ocml_log10_f64"); + patterns.insert>(converter, "__ocml_log2_f32", + "__ocml_log2_f64"); patterns.insert>(converter, "__ocml_tanh_f32", "__ocml_tanh_f64"); ConversionTarget target(getContext()); target.addLegalDialect(); - target.addIllegalOp(); + target.addIllegalOp(); target.addDynamicallyLegalOp( gpu::filterIllegalLLVMIntrinsics({"tanh", "tanhf"}, m.getContext())); target.addIllegalOp(); diff --git a/mlir/test/Conversion/GPUToNVVM/gpu-to-nvvm.mlir b/mlir/test/Conversion/GPUToNVVM/gpu-to-nvvm.mlir --- a/mlir/test/Conversion/GPUToNVVM/gpu-to-nvvm.mlir +++ b/mlir/test/Conversion/GPUToNVVM/gpu-to-nvvm.mlir @@ -154,21 +154,6 @@ } } -// ----- - -gpu.module @test_module { - // CHECK: llvm.func @__nv_tanhf(!llvm.float) -> !llvm.float - // CHECK: llvm.func @__nv_tanh(!llvm.double) -> !llvm.double - // CHECK-LABEL: func @gpu_tanh - func @gpu_tanh(%arg_f32 : f32, %arg_f64 : f64) { - %result32 = std.tanh %arg_f32 : f32 - // CHECK: llvm.call @__nv_tanhf(%{{.*}}) : (!llvm.float) -> !llvm.float - %result64 = std.tanh %arg_f64 : f64 - // CHECK: llvm.call @__nv_tanh(%{{.*}}) : (!llvm.double) -> !llvm.double - std.return - } -} - // ----- gpu.module @test_module { // CHECK: llvm.func @__nv_expf(!llvm.float) -> !llvm.float @@ -187,6 +172,66 @@ // ----- +gpu.module @test_module { + // CHECK: llvm.func @__nv_logf(!llvm.float) -> !llvm.float + // CHECK: llvm.func @__nv_log(!llvm.double) -> !llvm.double + // CHECK-LABEL: func @gpu_log + func @gpu_log(%arg_f32 : f32, %arg_f64 : f64) { + %result32 = std.log %arg_f32 : f32 + // CHECK: llvm.call @__nv_logf(%{{.*}}) : (!llvm.float) -> !llvm.float + %result64 = std.log %arg_f64 : f64 + // CHECK: llvm.call @__nv_log(%{{.*}}) : (!llvm.double) -> !llvm.double + std.return + } +} + +// ----- + +gpu.module @test_module { + // CHECK: llvm.func @__nv_log10f(!llvm.float) -> !llvm.float + // CHECK: llvm.func @__nv_log10(!llvm.double) -> !llvm.double + // CHECK-LABEL: func @gpu_log10 + func @gpu_log10(%arg_f32 : f32, %arg_f64 : f64) { + %result32 = std.log10 %arg_f32 : f32 + // CHECK: llvm.call @__nv_log10f(%{{.*}}) : (!llvm.float) -> !llvm.float + %result64 = std.log10 %arg_f64 : f64 + // CHECK: llvm.call @__nv_log10(%{{.*}}) : (!llvm.double) -> !llvm.double + std.return + } +} + +// ----- + +gpu.module @test_module { + // CHECK: llvm.func @__nv_log2f(!llvm.float) -> !llvm.float + // CHECK: llvm.func @__nv_log2(!llvm.double) -> !llvm.double + // CHECK-LABEL: func @gpu_log2 + func @gpu_log2(%arg_f32 : f32, %arg_f64 : f64) { + %result32 = std.log2 %arg_f32 : f32 + // CHECK: llvm.call @__nv_log2f(%{{.*}}) : (!llvm.float) -> !llvm.float + %result64 = std.log2 %arg_f64 : f64 + // CHECK: llvm.call @__nv_log2(%{{.*}}) : (!llvm.double) -> !llvm.double + std.return + } +} + +// ----- + +gpu.module @test_module { + // CHECK: llvm.func @__nv_tanhf(!llvm.float) -> !llvm.float + // CHECK: llvm.func @__nv_tanh(!llvm.double) -> !llvm.double + // CHECK-LABEL: func @gpu_tanh + func @gpu_tanh(%arg_f32 : f32, %arg_f64 : f64) { + %result32 = std.tanh %arg_f32 : f32 + // CHECK: llvm.call @__nv_tanhf(%{{.*}}) : (!llvm.float) -> !llvm.float + %result64 = std.tanh %arg_f64 : f64 + // CHECK: llvm.call @__nv_tanh(%{{.*}}) : (!llvm.double) -> !llvm.double + std.return + } +} + +// ----- + // Test that we handled properly operation with SymbolTable other than module op gpu.module @test_module { "test.symbol_scope"() ({ diff --git a/mlir/test/Conversion/GPUToROCDL/gpu-to-rocdl.mlir b/mlir/test/Conversion/GPUToROCDL/gpu-to-rocdl.mlir --- a/mlir/test/Conversion/GPUToROCDL/gpu-to-rocdl.mlir +++ b/mlir/test/Conversion/GPUToROCDL/gpu-to-rocdl.mlir @@ -81,21 +81,6 @@ } } -// ----- - -gpu.module @kernel_module { - // CHECK: llvm.func @__ocml_tanh_f32(!llvm.float) -> !llvm.float - // CHECK: llvm.func @__ocml_tanh_f64(!llvm.double) -> !llvm.double - // CHECK-LABEL: func @gpu_tanh - func @gpu_tanh(%arg_f32 : f32, %arg_f64 : f64) { - %result32 = std.tanh %arg_f32 : f32 - // CHECK: llvm.call @__ocml_tanh_f32(%{{.*}}) : (!llvm.float) -> !llvm.float - %result64 = std.tanh %arg_f64 : f64 - // CHECK: llvm.call @__ocml_tanh_f64(%{{.*}}) : (!llvm.double) -> !llvm.double - std.return - } -} - // ----- gpu.module @kernel_module { // CHECK: llvm.func @__ocml_exp_f32(!llvm.float) -> !llvm.float @@ -134,3 +119,63 @@ "test.finish" () : () -> () }) : () -> () } + +// ----- + +gpu.module @kernel_module { + // CHECK: llvm.func @__ocml_log_f32(!llvm.float) -> !llvm.float + // CHECK: llvm.func @__ocml_log_f64(!llvm.double) -> !llvm.double + // CHECK-LABEL: func @gpu_log + func @gpu_log(%arg_f32 : f32, %arg_f64 : f64) { + %result32 = std.log %arg_f32 : f32 + // CHECK: llvm.call @__ocml_log_f32(%{{.*}}) : (!llvm.float) -> !llvm.float + %result64 = std.log %arg_f64 : f64 + // CHECK: llvm.call @__ocml_log_f64(%{{.*}}) : (!llvm.double) -> !llvm.double + std.return + } +} + +// ----- + +gpu.module @kernel_module { + // CHECK: llvm.func @__ocml_log10_f32(!llvm.float) -> !llvm.float + // CHECK: llvm.func @__ocml_log10_f64(!llvm.double) -> !llvm.double + // CHECK-LABEL: func @gpu_log10 + func @gpu_log10(%arg_f32 : f32, %arg_f64 : f64) { + %result32 = std.log10 %arg_f32 : f32 + // CHECK: llvm.call @__ocml_log10_f32(%{{.*}}) : (!llvm.float) -> !llvm.float + %result64 = std.log10 %arg_f64 : f64 + // CHECK: llvm.call @__ocml_log10_f64(%{{.*}}) : (!llvm.double) -> !llvm.double + std.return + } +} + +// ----- + +gpu.module @kernel_module { + // CHECK: llvm.func @__ocml_log2_f32(!llvm.float) -> !llvm.float + // CHECK: llvm.func @__ocml_log2_f64(!llvm.double) -> !llvm.double + // CHECK-LABEL: func @gpu_log2 + func @gpu_log2(%arg_f32 : f32, %arg_f64 : f64) { + %result32 = std.log2 %arg_f32 : f32 + // CHECK: llvm.call @__ocml_log2_f32(%{{.*}}) : (!llvm.float) -> !llvm.float + %result64 = std.log2 %arg_f64 : f64 + // CHECK: llvm.call @__ocml_log2_f64(%{{.*}}) : (!llvm.double) -> !llvm.double + std.return + } +} + +// ----- + +gpu.module @kernel_module { + // CHECK: llvm.func @__ocml_tanh_f32(!llvm.float) -> !llvm.float + // CHECK: llvm.func @__ocml_tanh_f64(!llvm.double) -> !llvm.double + // CHECK-LABEL: func @gpu_tanh + func @gpu_tanh(%arg_f32 : f32, %arg_f64 : f64) { + %result32 = std.tanh %arg_f32 : f32 + // CHECK: llvm.call @__ocml_tanh_f32(%{{.*}}) : (!llvm.float) -> !llvm.float + %result64 = std.tanh %arg_f64 : f64 + // CHECK: llvm.call @__ocml_tanh_f64(%{{.*}}) : (!llvm.double) -> !llvm.double + std.return + } +}