Skip to content

Commit 42b1df4

Browse files
[mlir][math] Add missing trig math-to-llvm conversion patterns (#141069)
asin, acos, atan, and atan2 were being lowered to libm calls instead of llvm intrinsics. Add the conversion patterns to handle these intrinsics and update tests to expect this.
1 parent d56deea commit 42b1df4

File tree

3 files changed

+250
-10
lines changed

3 files changed

+250
-10
lines changed

flang/test/Intrinsics/math-codegen.fir

Lines changed: 162 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -378,13 +378,167 @@ func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
378378
func.func private @llvm.round.f32(f32) -> f32
379379
func.func private @llvm.round.f64(f64) -> f64
380380

381+
//--- asin_fast.fir
382+
// RUN: fir-opt %t/asin_fast.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/asin_fast.fir
383+
// CHECK: @_QPtest_real4
384+
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.asin({{%[A-Za-z0-9._]+}}) : (f32) -> f32
385+
386+
// CHECK: @_QPtest_real8
387+
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.asin({{%[A-Za-z0-9._]+}}) : (f64) -> f64
388+
389+
func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
390+
%0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
391+
%1 = fir.load %arg0 : !fir.ref<f32>
392+
%2 = math.asin %1 : f32
393+
fir.store %2 to %0 : !fir.ref<f32>
394+
%3 = fir.load %0 : !fir.ref<f32>
395+
return %3 : f32
396+
}
397+
func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
398+
%0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
399+
%1 = fir.load %arg0 : !fir.ref<f64>
400+
%2 = math.asin %1 : f64
401+
fir.store %2 to %0 : !fir.ref<f64>
402+
%3 = fir.load %0 : !fir.ref<f64>
403+
return %3 : f64
404+
}
405+
406+
//--- asin_relaxed.fir
407+
// RUN: fir-opt %t/asin_relaxed.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/asin_relaxed.fir
408+
// CHECK: @_QPtest_real4
409+
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.asin({{%[A-Za-z0-9._]+}}) : (f32) -> f32
410+
411+
// CHECK: @_QPtest_real8
412+
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.asin({{%[A-Za-z0-9._]+}}) : (f64) -> f64
413+
414+
func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
415+
%0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
416+
%1 = fir.load %arg0 : !fir.ref<f32>
417+
%2 = math.asin %1 : f32
418+
fir.store %2 to %0 : !fir.ref<f32>
419+
%3 = fir.load %0 : !fir.ref<f32>
420+
return %3 : f32
421+
}
422+
func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
423+
%0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
424+
%1 = fir.load %arg0 : !fir.ref<f64>
425+
%2 = math.asin %1 : f64
426+
fir.store %2 to %0 : !fir.ref<f64>
427+
%3 = fir.load %0 : !fir.ref<f64>
428+
return %3 : f64
429+
}
430+
431+
//--- asin_precise.fir
432+
// RUN: fir-opt %t/asin_precise.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/asin_precise.fir
433+
// CHECK: @_QPtest_real4
434+
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @asinf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
435+
436+
// CHECK: @_QPtest_real8
437+
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @asin({{%[A-Za-z0-9._]+}}) : (f64) -> f64
438+
439+
func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
440+
%0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
441+
%1 = fir.load %arg0 : !fir.ref<f32>
442+
%2 = fir.call @asinf(%1) : (f32) -> f32
443+
fir.store %2 to %0 : !fir.ref<f32>
444+
%3 = fir.load %0 : !fir.ref<f32>
445+
return %3 : f32
446+
}
447+
func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
448+
%0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
449+
%1 = fir.load %arg0 : !fir.ref<f64>
450+
%2 = fir.call @asin(%1) : (f64) -> f64
451+
fir.store %2 to %0 : !fir.ref<f64>
452+
%3 = fir.load %0 : !fir.ref<f64>
453+
return %3 : f64
454+
}
455+
func.func private @asinf(f32) -> f32
456+
func.func private @asin(f64) -> f64
457+
458+
//--- acos_fast.fir
459+
// RUN: fir-opt %t/acos_fast.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/acos_fast.fir
460+
// CHECK: @_QPtest_real4
461+
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.acos({{%[A-Za-z0-9._]+}}) : (f32) -> f32
462+
463+
// CHECK: @_QPtest_real8
464+
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.acos({{%[A-Za-z0-9._]+}}) : (f64) -> f64
465+
466+
func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
467+
%0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
468+
%1 = fir.load %arg0 : !fir.ref<f32>
469+
%2 = math.acos %1 : f32
470+
fir.store %2 to %0 : !fir.ref<f32>
471+
%3 = fir.load %0 : !fir.ref<f32>
472+
return %3 : f32
473+
}
474+
func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
475+
%0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
476+
%1 = fir.load %arg0 : !fir.ref<f64>
477+
%2 = math.acos %1 : f64
478+
fir.store %2 to %0 : !fir.ref<f64>
479+
%3 = fir.load %0 : !fir.ref<f64>
480+
return %3 : f64
481+
}
482+
483+
//--- acos_relaxed.fir
484+
// RUN: fir-opt %t/acos_relaxed.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/acos_relaxed.fir
485+
// CHECK: @_QPtest_real4
486+
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.acos({{%[A-Za-z0-9._]+}}) : (f32) -> f32
487+
488+
// CHECK: @_QPtest_real8
489+
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.acos({{%[A-Za-z0-9._]+}}) : (f64) -> f64
490+
491+
func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
492+
%0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
493+
%1 = fir.load %arg0 : !fir.ref<f32>
494+
%2 = math.acos %1 : f32
495+
fir.store %2 to %0 : !fir.ref<f32>
496+
%3 = fir.load %0 : !fir.ref<f32>
497+
return %3 : f32
498+
}
499+
func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
500+
%0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
501+
%1 = fir.load %arg0 : !fir.ref<f64>
502+
%2 = math.acos %1 : f64
503+
fir.store %2 to %0 : !fir.ref<f64>
504+
%3 = fir.load %0 : !fir.ref<f64>
505+
return %3 : f64
506+
}
507+
508+
//--- acos_precise.fir
509+
// RUN: fir-opt %t/acos_precise.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/acos_precise.fir
510+
// CHECK: @_QPtest_real4
511+
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @acosf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
512+
513+
// CHECK: @_QPtest_real8
514+
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @acos({{%[A-Za-z0-9._]+}}) : (f64) -> f64
515+
516+
func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
517+
%0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
518+
%1 = fir.load %arg0 : !fir.ref<f32>
519+
%2 = fir.call @acosf(%1) : (f32) -> f32
520+
fir.store %2 to %0 : !fir.ref<f32>
521+
%3 = fir.load %0 : !fir.ref<f32>
522+
return %3 : f32
523+
}
524+
func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
525+
%0 = fir.alloca f64 {bindc_name = "test_real8", uniq_name = "_QFtest_real8Etest_real8"}
526+
%1 = fir.load %arg0 : !fir.ref<f64>
527+
%2 = fir.call @acos(%1) : (f64) -> f64
528+
fir.store %2 to %0 : !fir.ref<f64>
529+
%3 = fir.load %0 : !fir.ref<f64>
530+
return %3 : f64
531+
}
532+
func.func private @acosf(f32) -> f32
533+
func.func private @acos(f64) -> f64
534+
381535
//--- atan_fast.fir
382536
// RUN: fir-opt %t/atan_fast.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/atan_fast.fir
383537
// CHECK: @_QPtest_real4
384-
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @atanf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
538+
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.atan({{%[A-Za-z0-9._]+}}) : (f32) -> f32
385539

386540
// CHECK: @_QPtest_real8
387-
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @atan({{%[A-Za-z0-9._]+}}) : (f64) -> f64
541+
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.atan({{%[A-Za-z0-9._]+}}) : (f64) -> f64
388542

389543
func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
390544
%0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
@@ -406,10 +560,10 @@ func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
406560
//--- atan_relaxed.fir
407561
// RUN: fir-opt %t/atan_relaxed.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/atan_relaxed.fir
408562
// CHECK: @_QPtest_real4
409-
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @atanf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
563+
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.atan({{%[A-Za-z0-9._]+}}) : (f32) -> f32
410564

411565
// CHECK: @_QPtest_real8
412-
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @atan({{%[A-Za-z0-9._]+}}) : (f64) -> f64
566+
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.atan({{%[A-Za-z0-9._]+}}) : (f64) -> f64
413567

414568
func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
415569
%0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
@@ -458,10 +612,10 @@ func.func private @atan(f64) -> f64
458612
//--- atan2_fast.fir
459613
// RUN: fir-opt %t/atan2_fast.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/atan2_fast.fir
460614
// CHECK: @_QPtest_real4
461-
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @atan2f({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f32, f32) -> f32
615+
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.atan2({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f32, f32) -> f32
462616

463617
// CHECK: @_QPtest_real8
464-
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @atan2({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f64, f64) -> f64
618+
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.atan2({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f64, f64) -> f64
465619

466620
func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}, %arg1: !fir.ref<f32> {fir.bindc_name = "y"}) -> f32 {
467621
%0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
@@ -485,10 +639,10 @@ func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}, %arg1: !fi
485639
//--- atan2_relaxed.fir
486640
// RUN: fir-opt %t/atan2_relaxed.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/atan2_relaxed.fir
487641
// CHECK: @_QPtest_real4
488-
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @atan2f({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f32, f32) -> f32
642+
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.atan2({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f32, f32) -> f32
489643

490644
// CHECK: @_QPtest_real8
491-
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @atan2({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f64, f64) -> f64
645+
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.atan2({{%[A-Za-z0-9._]+}}, {{%[A-Za-z0-9._]+}}) : (f64, f64) -> f64
492646

493647
func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}, %arg1: !fir.ref<f32> {fir.bindc_name = "y"}) -> f32 {
494648
%0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}

mlir/lib/Conversion/MathToLLVM/MathToLLVM.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ using CopySignOpLowering =
4242
ConvertFMFMathToLLVMPattern<math::CopySignOp, LLVM::CopySignOp>;
4343
using CosOpLowering = ConvertFMFMathToLLVMPattern<math::CosOp, LLVM::CosOp>;
4444
using CoshOpLowering = ConvertFMFMathToLLVMPattern<math::CoshOp, LLVM::CoshOp>;
45+
using AcosOpLowering = ConvertFMFMathToLLVMPattern<math::AcosOp, LLVM::ACosOp>;
4546
using CtPopFOpLowering =
4647
VectorConvertToLLVMPattern<math::CtPopOp, LLVM::CtPopOp>;
4748
using Exp2OpLowering = ConvertFMFMathToLLVMPattern<math::Exp2Op, LLVM::Exp2Op>;
@@ -62,12 +63,15 @@ using RoundOpLowering =
6263
ConvertFMFMathToLLVMPattern<math::RoundOp, LLVM::RoundOp>;
6364
using SinOpLowering = ConvertFMFMathToLLVMPattern<math::SinOp, LLVM::SinOp>;
6465
using SinhOpLowering = ConvertFMFMathToLLVMPattern<math::SinhOp, LLVM::SinhOp>;
66+
using ASinOpLowering = ConvertFMFMathToLLVMPattern<math::AsinOp, LLVM::ASinOp>;
6567
using SqrtOpLowering = ConvertFMFMathToLLVMPattern<math::SqrtOp, LLVM::SqrtOp>;
6668
using FTruncOpLowering =
6769
ConvertFMFMathToLLVMPattern<math::TruncOp, LLVM::FTruncOp>;
6870
using TanOpLowering = ConvertFMFMathToLLVMPattern<math::TanOp, LLVM::TanOp>;
6971
using TanhOpLowering = ConvertFMFMathToLLVMPattern<math::TanhOp, LLVM::TanhOp>;
70-
72+
using ATanOpLowering = ConvertFMFMathToLLVMPattern<math::AtanOp, LLVM::ATanOp>;
73+
using ATan2OpLowering =
74+
ConvertFMFMathToLLVMPattern<math::Atan2Op, LLVM::ATan2Op>;
7175
// A `CtLz/CtTz/absi(a)` is converted into `CtLz/CtTz/absi(a, false)`.
7276
template <typename MathOp, typename LLVMOp>
7377
struct IntOpWithFlagLowering : public ConvertOpToLLVMPattern<MathOp> {
@@ -353,6 +357,7 @@ void mlir::populateMathToLLVMConversionPatterns(
353357
CopySignOpLowering,
354358
CosOpLowering,
355359
CoshOpLowering,
360+
AcosOpLowering,
356361
CountLeadingZerosOpLowering,
357362
CountTrailingZerosOpLowering,
358363
CtPopFOpLowering,
@@ -371,10 +376,13 @@ void mlir::populateMathToLLVMConversionPatterns(
371376
RsqrtOpLowering,
372377
SinOpLowering,
373378
SinhOpLowering,
379+
ASinOpLowering,
374380
SqrtOpLowering,
375381
FTruncOpLowering,
376382
TanOpLowering,
377-
TanhOpLowering
383+
TanhOpLowering,
384+
ATanOpLowering,
385+
ATan2OpLowering
378386
>(converter, benefit);
379387
// clang-format on
380388
}

mlir/test/Conversion/MathToLLVM/math-to-llvm.mlir

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,84 @@ func.func @trigonometrics(%arg0: f32) {
177177

178178
// -----
179179

180+
// CHECK-LABEL: func @inverse_trigonometrics
181+
// CHECK-SAME: [[ARG0:%.+]]: f32
182+
func.func @inverse_trigonometrics(%arg0: f32) {
183+
// CHECK: llvm.intr.asin([[ARG0]]) : (f32) -> f32
184+
%0 = math.asin %arg0 : f32
185+
186+
// CHECK: llvm.intr.acos([[ARG0]]) : (f32) -> f32
187+
%1 = math.acos %arg0 : f32
188+
189+
// CHECK: llvm.intr.atan([[ARG0]]) : (f32) -> f32
190+
%2 = math.atan %arg0 : f32
191+
func.return
192+
}
193+
194+
// -----
195+
196+
// CHECK-LABEL: func @atan2
197+
// CHECK-SAME: [[ARG0:%.+]]: f32, [[ARG1:%.+]]: f32
198+
func.func @atan2(%arg0: f32, %arg1: f32) {
199+
// CHECK: llvm.intr.atan2([[ARG0]], [[ARG1]]) : (f32, f32) -> f32
200+
%0 = math.atan2 %arg0, %arg1 : f32
201+
func.return
202+
}
203+
204+
// -----
205+
206+
// CHECK-LABEL: func @inverse_trigonometrics_vector
207+
// CHECK-SAME: [[ARG0:%.+]]: vector<4xf32>
208+
func.func @inverse_trigonometrics_vector(%arg0: vector<4xf32>) {
209+
// CHECK: llvm.intr.asin([[ARG0]]) : (vector<4xf32>) -> vector<4xf32>
210+
%0 = math.asin %arg0 : vector<4xf32>
211+
212+
// CHECK: llvm.intr.acos([[ARG0]]) : (vector<4xf32>) -> vector<4xf32>
213+
%1 = math.acos %arg0 : vector<4xf32>
214+
215+
// CHECK: llvm.intr.atan([[ARG0]]) : (vector<4xf32>) -> vector<4xf32>
216+
%2 = math.atan %arg0 : vector<4xf32>
217+
func.return
218+
}
219+
220+
// -----
221+
222+
// CHECK-LABEL: func @atan2_vector
223+
// CHECK-SAME: [[ARG0:%.+]]: vector<4xf32>, [[ARG1:%.+]]: vector<4xf32>
224+
func.func @atan2_vector(%arg0: vector<4xf32>, %arg1: vector<4xf32>) {
225+
// CHECK: llvm.intr.atan2([[ARG0]], [[ARG1]]) : (vector<4xf32>, vector<4xf32>) -> vector<4xf32>
226+
%0 = math.atan2 %arg0, %arg1 : vector<4xf32>
227+
func.return
228+
}
229+
230+
// -----
231+
232+
// CHECK-LABEL: func @inverse_trigonometrics_fmf
233+
// CHECK-SAME: [[ARG0:%.+]]: f32
234+
func.func @inverse_trigonometrics_fmf(%arg0: f32) {
235+
// CHECK: llvm.intr.asin([[ARG0]]) {fastmathFlags = #llvm.fastmath<fast>} : (f32) -> f32
236+
%0 = math.asin %arg0 fastmath<fast> : f32
237+
238+
// CHECK: llvm.intr.acos([[ARG0]]) {fastmathFlags = #llvm.fastmath<fast>} : (f32) -> f32
239+
%1 = math.acos %arg0 fastmath<fast> : f32
240+
241+
// CHECK: llvm.intr.atan([[ARG0]]) {fastmathFlags = #llvm.fastmath<fast>} : (f32) -> f32
242+
%2 = math.atan %arg0 fastmath<fast> : f32
243+
func.return
244+
}
245+
246+
// -----
247+
248+
// CHECK-LABEL: func @atan2_fmf
249+
// CHECK-SAME: [[ARG0:%.+]]: f32, [[ARG1:%.+]]: f32
250+
func.func @atan2_fmf(%arg0: f32, %arg1: f32) {
251+
// CHECK: llvm.intr.atan2([[ARG0]], [[ARG1]]) {fastmathFlags = #llvm.fastmath<fast>} : (f32, f32) -> f32
252+
%0 = math.atan2 %arg0, %arg1 fastmath<fast> : f32
253+
func.return
254+
}
255+
256+
// -----
257+
180258
// CHECK-LABEL: func @hyperbolics
181259
// CHECK-SAME: [[ARG0:%.+]]: f32
182260
func.func @hyperbolics(%arg0: f32) {

0 commit comments

Comments
 (0)