Skip to content

Commit 23af523

Browse files
Add missing trig math-to-llvm conversion patterns
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 898df4b commit 23af523

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)