From: Slava Zakharin Date: Tue, 8 Nov 2022 03:38:36 +0000 (-0800) Subject: [mlir][arith] Convert fastmath to LLVM dialect for some arith ops. X-Git-Tag: upstream/17.0.6~28266 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e72fb692104ebab682d1ea5aeec39358b11ad407;p=platform%2Fupstream%2Fllvm.git [mlir][arith] Convert fastmath to LLVM dialect for some arith ops. This is a follow-up on D126305 and D136225. We can now preserve fastmath for arith::MaxFOp,MinFOp,RemFOp during ArithToLLVM conversion. Reviewed By: rriddle Differential Revision: https://reviews.llvm.org/D137456 --- diff --git a/mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp b/mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp index 1409b7f..3ad0155 100644 --- a/mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp +++ b/mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp @@ -52,16 +52,16 @@ using FPToSIOpLowering = VectorConvertToLLVMPattern; using FPToUIOpLowering = VectorConvertToLLVMPattern; -// TODO: Add LLVM intrinsic support for fastmath -using MaxFOpLowering = VectorConvertToLLVMPattern; +using MaxFOpLowering = + VectorConvertToLLVMPattern; using MaxSIOpLowering = VectorConvertToLLVMPattern; using MaxUIOpLowering = VectorConvertToLLVMPattern; -// TODO: Add LLVM intrinsic support for fastmath -using MinFOpLowering = VectorConvertToLLVMPattern; +using MinFOpLowering = + VectorConvertToLLVMPattern; using MinSIOpLowering = VectorConvertToLLVMPattern; using MinUIOpLowering = @@ -74,9 +74,9 @@ using NegFOpLowering = VectorConvertToLLVMPattern; using OrIOpLowering = VectorConvertToLLVMPattern; -// TODO: Add LLVM intrinsic support for fastmath -using RemFOpLowering = VectorConvertToLLVMPattern; +using RemFOpLowering = + VectorConvertToLLVMPattern; using RemSIOpLowering = VectorConvertToLLVMPattern; using RemUIOpLowering = diff --git a/mlir/test/Conversion/ArithToLLVM/arith-to-llvm.mlir b/mlir/test/Conversion/ArithToLLVM/arith-to-llvm.mlir index eccd875..d8e49a5 100644 --- a/mlir/test/Conversion/ArithToLLVM/arith-to-llvm.mlir +++ b/mlir/test/Conversion/ArithToLLVM/arith-to-llvm.mlir @@ -453,11 +453,11 @@ func.func @minmaxf(%arg0 : f32, %arg1 : f32) -> f32 { // CHECK-LABEL: @fastmath func.func @fastmath(%arg0: f32, %arg1: f32, %arg2: i32) { -// CHECK: {{.*}} = llvm.fadd %arg0, %arg1 {fastmathFlags = #llvm.fastmath} : f32 -// CHECK: {{.*}} = llvm.fmul %arg0, %arg1 {fastmathFlags = #llvm.fastmath} : f32 -// CHECK: {{.*}} = llvm.fneg %arg0 {fastmathFlags = #llvm.fastmath} : f32 -// CHECK: {{.*}} = llvm.fadd %arg0, %arg1 : f32 -// CHECK: {{.*}} = llvm.fadd %arg0, %arg1 {fastmathFlags = #llvm.fastmath} : f32 +// CHECK: llvm.fadd %arg0, %arg1 {fastmathFlags = #llvm.fastmath} : f32 +// CHECK: llvm.fmul %arg0, %arg1 {fastmathFlags = #llvm.fastmath} : f32 +// CHECK: llvm.fneg %arg0 {fastmathFlags = #llvm.fastmath} : f32 +// CHECK: llvm.fadd %arg0, %arg1 : f32 +// CHECK: llvm.fadd %arg0, %arg1 {fastmathFlags = #llvm.fastmath} : f32 %0 = arith.addf %arg0, %arg1 fastmath : f32 %1 = arith.mulf %arg0, %arg1 fastmath : f32 %2 = arith.negf %arg0 fastmath : f32 @@ -465,3 +465,26 @@ func.func @fastmath(%arg0: f32, %arg1: f32, %arg2: i32) { %4 = arith.addf %arg0, %arg1 fastmath : f32 return } + +// ----- + +// CHECK-LABEL: @ops_supporting_fastmath +func.func @ops_supporting_fastmath(%arg0: f32, %arg1: f32, %arg2: i32) { +// CHECK: llvm.fadd %arg0, %arg1 {fastmathFlags = #llvm.fastmath} : f32 + %0 = arith.addf %arg0, %arg1 fastmath : f32 +// CHECK: llvm.fdiv %arg0, %arg1 {fastmathFlags = #llvm.fastmath} : f32 + %1 = arith.divf %arg0, %arg1 fastmath : f32 +// CHECK: llvm.intr.maxnum(%arg0, %arg1) {fastmathFlags = #llvm.fastmath} : (f32, f32) -> f32 + %2 = arith.maxf %arg0, %arg1 fastmath : f32 +// CHECK: llvm.intr.minnum(%arg0, %arg1) {fastmathFlags = #llvm.fastmath} : (f32, f32) -> f32 + %3 = arith.minf %arg0, %arg1 fastmath : f32 +// CHECK: llvm.fmul %arg0, %arg1 {fastmathFlags = #llvm.fastmath} : f32 + %4 = arith.mulf %arg0, %arg1 fastmath : f32 +// CHECK: llvm.fneg %arg0 {fastmathFlags = #llvm.fastmath} : f32 + %5 = arith.negf %arg0 fastmath : f32 +// CHECK: llvm.frem %arg0, %arg1 {fastmathFlags = #llvm.fastmath} : f32 + %6 = arith.remf %arg0, %arg1 fastmath : f32 +// CHECK: llvm.fsub %arg0, %arg1 {fastmathFlags = #llvm.fastmath} : f32 + %7 = arith.subf %arg0, %arg1 fastmath : f32 + return +}