1- ! RUN: %flang_fc1 -ffast-math -emit-mlir -o - %s | FileCheck %s --check-prefixes=CHECK%if target=x86_64{{.*}} %{,CHECK-KIND10%}%if flang-supports-f128-math %{,CHECK-KIND16%}
1+ ! RUN: %flang_fc1 -ffast-real-mod -emit-mlir -o - %s | FileCheck %s --check-prefixes=CHECK-FRM%if target=x86_64{{.*}} %{,CHECK-FRM-KIND10%}%if flang-supports-f128-math %{,CHECK-FRM-KIND16%}
2+ ! RUN: %flang_fc1 -ffast-real-mod -fno-fast-real-mod -emit-mlir -o - %s | FileCheck %s --check-prefixes=CHECK-NFRM%if target=x86_64{{.*}} %{,CHECK-NFRM-KIND10%}%if flang-supports-f128-math %{,CHECK-NFRM-KIND16%}
3+ ! RUN: %flang_fc1 -fno-fast-real-mod -ffast-real-mod -emit-mlir -o - %s | FileCheck %s --check-prefixes=CHECK-FRM%if target=x86_64{{.*}} %{,CHECK-FRM-KIND10%}%if flang-supports-f128-math %{,CHECK-FRM-KIND16%}
4+ ! RUN: %flang_fc1 -ffast-math -emit-mlir -o - %s | FileCheck %s --check-prefixes=CHECK-FM%if target=x86_64{{.*}} %{,CHECK-FM-KIND10%}%if flang-supports-f128-math %{,CHECK-FM-KIND16%}
25! RUN: %flang_fc1 -ffast-math -fno-fast-real-mod -emit-mlir -o - %s | FileCheck %s --check-prefixes=CHECK-NFRM%if target=x86_64{{.*}} %{,CHECK-NFRM-KIND10%}%if flang-supports-f128-math %{,CHECK-NFRM-KIND16%}
36
4- ! TODO: check line that fir.fast_real_mod is not there
5- ! CHECK-NFRM : module attributes {{{.*}}fir.no_fast_real_mod = true{{.*}}}
7+ ! CHECK-FM: module attributes {{{.*}} fir.fast_real_mod = true{{.*}}}
8+ ! CHECK-FRM : module attributes {{{.*}}fir.fast_real_mod = true{{.*}}}
69
710! CHECK-LABEL: @_QPmod_real4
811subroutine mod_real4 (r , a , p )
912 implicit none
1013 real (kind= 4 ) :: r, a, p
11- ! CHECK: %[[A:.*]] = fir.declare{{.*}}a"
12- ! CHECK: %[[P:.*]] = fir.declare{{.*}}p"
13- ! CHECK: %[[R:.*]] = fir.declare{{.*}}r"
14- ! CHECK: %[[A_LOAD:.*]] = fir.load %[[A]]
15- ! CHECK: %[[P_LOAD:.*]] = fir.load %[[P]]
16- ! CHECK: %[[DIV:.*]] = arith.divf %[[A_LOAD]], %[[P_LOAD]] fastmath<fast> : f32
17- ! CHECK: %[[CV1:.*]] = fir.convert %[[DIV]] : (f32) -> si32
18- ! CHECK: %[[CV2:.*]] = fir.convert %[[CV1]] : (si32) -> f32
19- ! CHECK: %[[MUL:.*]] = arith.mulf %[[CV2]], %[[P_LOAD]] fastmath<fast> : f32
20- ! CHECK: %[[SUB:.*]] = arith.subf %[[A_LOAD]], %[[MUL]] fastmath<fast> : f32
21- ! CHECK: fir.store %[[SUB]] to %[[R]] : !fir.ref<f32>
14+ ! CHECK-FRM: %[[A:.*]] = fir.declare{{.*}}a"
15+ ! CHECK-FRM: %[[P:.*]] = fir.declare{{.*}}p"
16+ ! CHECK-FRM: %[[R:.*]] = fir.declare{{.*}}r"
17+ ! CHECK-FRM: %[[A_LOAD:.*]] = fir.load %[[A]]
18+ ! CHECK-FRM: %[[P_LOAD:.*]] = fir.load %[[P]]
19+ ! CHECK-FRM: %[[DIV:.*]] = arith.divf %[[A_LOAD]], %[[P_LOAD]] fastmath<contract> : f32
20+ ! CHECK-FRM: %[[CV1:.*]] = fir.convert %[[DIV]] : (f32) -> si32
21+ ! CHECK-FRM: %[[CV2:.*]] = fir.convert %[[CV1]] : (si32) -> f32
22+ ! CHECK-FRM: %[[MUL:.*]] = arith.mulf %[[CV2]], %[[P_LOAD]] fastmath<contract> : f32
23+ ! CHECK-FRM: %[[SUB:.*]] = arith.subf %[[A_LOAD]], %[[MUL]] fastmath<contract> : f32
24+ ! CHECK-FRM: fir.store %[[SUB]] to %[[R]] : !fir.ref<f32>
25+ ! CHECK-FM: %[[A:.*]] = fir.declare{{.*}}a"
26+ ! CHECK-FM: %[[P:.*]] = fir.declare{{.*}}p"
27+ ! CHECK-FM: %[[R:.*]] = fir.declare{{.*}}r"
28+ ! CHECK-FM: %[[A_LOAD:.*]] = fir.load %[[A]]
29+ ! CHECK-FM: %[[P_LOAD:.*]] = fir.load %[[P]]
30+ ! CHECK-FM: %[[DIV:.*]] = arith.divf %[[A_LOAD]], %[[P_LOAD]] fastmath<fast> : f32
31+ ! CHECK-FM: %[[CV1:.*]] = fir.convert %[[DIV]] : (f32) -> si32
32+ ! CHECK-FM: %[[CV2:.*]] = fir.convert %[[CV1]] : (si32) -> f32
33+ ! CHECK-FM: %[[MUL:.*]] = arith.mulf %[[CV2]], %[[P_LOAD]] fastmath<fast> : f32
34+ ! CHECK-FM: %[[SUB:.*]] = arith.subf %[[A_LOAD]], %[[MUL]] fastmath<fast> : f32
35+ ! CHECK-FM: fir.store %[[SUB]] to %[[R]] : !fir.ref<f32>
2236! CHECK-NFRM: fir.call @_FortranAModReal4(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) {{.*}}: (f32, f32, !fir.ref<i8>, i32) -> f32
2337 r = mod (a, p)
2438end subroutine mod_real4
@@ -27,17 +41,28 @@ end subroutine mod_real4
2741subroutine mod_real8 (r , a , p )
2842 implicit none
2943 real (kind= 8 ) :: r, a, p
30- ! CHECK: %[[A:.*]] = fir.declare{{.*}}a"
31- ! CHECK: %[[P:.*]] = fir.declare{{.*}}p"
32- ! CHECK: %[[R:.*]] = fir.declare{{.*}}r"
33- ! CHECK: %[[A_LOAD:.*]] = fir.load %[[A]]
34- ! CHECK: %[[P_LOAD:.*]] = fir.load %[[P]]
35- ! CHECK: %[[DIV:.*]] = arith.divf %[[A_LOAD]], %[[P_LOAD]] fastmath<fast> : f64
36- ! CHECK: %[[CV1:.*]] = fir.convert %[[DIV]] : (f64) -> si64
37- ! CHECK: %[[CV2:.*]] = fir.convert %[[CV1]] : (si64) -> f64
38- ! CHECK: %[[MUL:.*]] = arith.mulf %[[CV2]], %[[P_LOAD]] fastmath<fast> : f64
39- ! CHECK: %[[SUB:.*]] = arith.subf %[[A_LOAD]], %[[MUL]] fastmath<fast> : f64
40- ! CHECK: fir.store %[[SUB]] to %[[R]] : !fir.ref<f64>
44+ ! CHECK-FRM: %[[A:.*]] = fir.declare{{.*}}a"
45+ ! CHECK-FRM: %[[P:.*]] = fir.declare{{.*}}p"
46+ ! CHECK-FRM: %[[R:.*]] = fir.declare{{.*}}r"
47+ ! CHECK-FRM: %[[A_LOAD:.*]] = fir.load %[[A]]
48+ ! CHECK-FRM: %[[P_LOAD:.*]] = fir.load %[[P]]
49+ ! CHECK-FRM: %[[DIV:.*]] = arith.divf %[[A_LOAD]], %[[P_LOAD]] fastmath<contract> : f64
50+ ! CHECK-FRM: %[[CV1:.*]] = fir.convert %[[DIV]] : (f64) -> si64
51+ ! CHECK-FRM: %[[CV2:.*]] = fir.convert %[[CV1]] : (si64) -> f64
52+ ! CHECK-FRM: %[[MUL:.*]] = arith.mulf %[[CV2]], %[[P_LOAD]] fastmath<contract> : f64
53+ ! CHECK-FRM: %[[SUB:.*]] = arith.subf %[[A_LOAD]], %[[MUL]] fastmath<contract> : f64
54+ ! CHECK-FRM: fir.store %[[SUB]] to %[[R]] : !fir.ref<f64>
55+ ! CHECK-FM: %[[A:.*]] = fir.declare{{.*}}a"
56+ ! CHECK-FM: %[[P:.*]] = fir.declare{{.*}}p"
57+ ! CHECK-FM: %[[R:.*]] = fir.declare{{.*}}r"
58+ ! CHECK-FM: %[[A_LOAD:.*]] = fir.load %[[A]]
59+ ! CHECK-FM: %[[P_LOAD:.*]] = fir.load %[[P]]
60+ ! CHECK-FM: %[[DIV:.*]] = arith.divf %[[A_LOAD]], %[[P_LOAD]] fastmath<fast> : f64
61+ ! CHECK-FM: %[[CV1:.*]] = fir.convert %[[DIV]] : (f64) -> si64
62+ ! CHECK-FM: %[[CV2:.*]] = fir.convert %[[CV1]] : (si64) -> f64
63+ ! CHECK-FM: %[[MUL:.*]] = arith.mulf %[[CV2]], %[[P_LOAD]] fastmath<fast> : f64
64+ ! CHECK-FM: %[[SUB:.*]] = arith.subf %[[A_LOAD]], %[[MUL]] fastmath<fast> : f64
65+ ! CHECK-FM: fir.store %[[SUB]] to %[[R]] : !fir.ref<f64>
4166! CHECK-NFRM: fir.call @_FortranAModReal8(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) {{.*}}: (f64, f64, !fir.ref<i8>, i32) -> f64
4267 r = mod (a, p)
4368end subroutine mod_real8
@@ -47,17 +72,28 @@ subroutine mod_real10(r, a, p)
4772 implicit none
4873 integer , parameter :: kind10 = merge (10 , 4 , selected_real_kind (p= 18 ).eq. 10 )
4974 real (kind= kind10) :: r, a, p
50- ! CHECK-KIND10: %[[A:.*]] = fir.declare{{.*}}a"
51- ! CHECK-KIND10: %[[P:.*]] = fir.declare{{.*}}p"
52- ! CHECK-KIND10: %[[R:.*]] = fir.declare{{.*}}r"
53- ! CHECK-KIND10: %[[A_LOAD:.*]] = fir.load %[[A]]
54- ! CHECK-KIND10: %[[P_LOAD:.*]] = fir.load %[[P]]
55- ! CHECK-KIND10: %[[DIV:.*]] = arith.divf %[[A_LOAD]], %[[P_LOAD]] fastmath<fast> : f80
56- ! CHECK-KIND10: %[[CV1:.*]] = fir.convert %[[DIV]] : (f80) -> si80
57- ! CHECK-KIND10: %[[CV2:.*]] = fir.convert %[[CV1]] : (si80) -> f80
58- ! CHECK-KIND10: %[[MUL:.*]] = arith.mulf %[[CV2]], %[[P_LOAD]] fastmath<fast> : f80
59- ! CHECK-KIND10: %[[SUB:.*]] = arith.subf %[[A_LOAD]], %[[MUL]] fastmath<fast> : f80
60- ! CHECK-KIND10: fir.store %[[SUB]] to %[[R]] : !fir.ref<f80>
75+ ! CHECK-FRM-KIND10: %[[A:.*]] = fir.declare{{.*}}a"
76+ ! CHECK-FRM-KIND10: %[[P:.*]] = fir.declare{{.*}}p"
77+ ! CHECK-FRM-KIND10: %[[R:.*]] = fir.declare{{.*}}r"
78+ ! CHECK-FRM-KIND10: %[[A_LOAD:.*]] = fir.load %[[A]]
79+ ! CHECK-FRM-KIND10: %[[P_LOAD:.*]] = fir.load %[[P]]
80+ ! CHECK-FRM-KIND10: %[[DIV:.*]] = arith.divf %[[A_LOAD]], %[[P_LOAD]] fastmath<contract> : f80
81+ ! CHECK-FRM-KIND10: %[[CV1:.*]] = fir.convert %[[DIV]] : (f80) -> si80
82+ ! CHECK-FRM-KIND10: %[[CV2:.*]] = fir.convert %[[CV1]] : (si80) -> f80
83+ ! CHECK-FRM-KIND10: %[[MUL:.*]] = arith.mulf %[[CV2]], %[[P_LOAD]] fastmath<contract> : f80
84+ ! CHECK-FRM-KIND10: %[[SUB:.*]] = arith.subf %[[A_LOAD]], %[[MUL]] fastmath<contract> : f80
85+ ! CHECK-FRM-KIND10: fir.store %[[SUB]] to %[[R]] : !fir.ref<f80>
86+ ! CHECK-FM-KIND10: %[[A:.*]] = fir.declare{{.*}}a"
87+ ! CHECK-FM-KIND10: %[[P:.*]] = fir.declare{{.*}}p"
88+ ! CHECK-FM-KIND10: %[[R:.*]] = fir.declare{{.*}}r"
89+ ! CHECK-FM-KIND10: %[[A_LOAD:.*]] = fir.load %[[A]]
90+ ! CHECK-FM-KIND10: %[[P_LOAD:.*]] = fir.load %[[P]]
91+ ! CHECK-FM-KIND10: %[[DIV:.*]] = arith.divf %[[A_LOAD]], %[[P_LOAD]] fastmath<fast> : f80
92+ ! CHECK-FM-KIND10: %[[CV1:.*]] = fir.convert %[[DIV]] : (f80) -> si80
93+ ! CHECK-FM-KIND10: %[[CV2:.*]] = fir.convert %[[CV1]] : (si80) -> f80
94+ ! CHECK-FM-KIND10: %[[MUL:.*]] = arith.mulf %[[CV2]], %[[P_LOAD]] fastmath<fast> : f80
95+ ! CHECK-FM-KIND10: %[[SUB:.*]] = arith.subf %[[A_LOAD]], %[[MUL]] fastmath<fast> : f80
96+ ! CHECK-FM-KIND10: fir.store %[[SUB]] to %[[R]] : !fir.ref<f80>
6197! CHECK-NFRM-KIND10: fir.call @_FortranAModReal10(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) {{.*}}: (f80, f80, !fir.ref<i8>, i32) -> f80
6298 r = mod (a, p)
6399end subroutine mod_real10
@@ -67,17 +103,28 @@ subroutine mod_real16(r, a, p)
67103 implicit none
68104 integer , parameter :: kind16 = merge (16 , 4 , selected_real_kind (p= 33 ).eq. 16 )
69105 real (kind= kind16) :: r, a, p
70- ! CHECK-KIND16: %[[A:.*]] = fir.declare{{.*}}a"
71- ! CHECK-KIND16: %[[P:.*]] = fir.declare{{.*}}p"
72- ! CHECK-KIND16: %[[R:.*]] = fir.declare{{.*}}r"
73- ! CHECK-KIND16: %[[A_LOAD:.*]] = fir.load %[[A]]
74- ! CHECK-KIND16: %[[P_LOAD:.*]] = fir.load %[[P]]
75- ! CHECK-KIND16: %[[DIV:.*]] = arith.divf %[[A_LOAD]], %[[P_LOAD]] fastmath<fast> : f128
76- ! CHECK-KIND16: %[[CV1:.*]] = fir.convert %[[DIV]] : (f128) -> si128
77- ! CHECK-KIND16: %[[CV2:.*]] = fir.convert %[[CV1]] : (si128) -> f128
78- ! CHECK-KIND16: %[[MUL:.*]] = arith.mulf %[[CV2]], %[[P_LOAD]] fastmath<fast> : f128
79- ! CHECK-KIND16: %[[SUB:.*]] = arith.subf %[[A_LOAD]], %[[MUL]] fastmath<fast> : f128
80- ! CHECK-KIND16: fir.store %[[SUB]] to %[[R]] : !fir.ref<f128>
106+ ! CHECK-FRM-KIND16: %[[A:.*]] = fir.declare{{.*}}a"
107+ ! CHECK-FRM-KIND16: %[[P:.*]] = fir.declare{{.*}}p"
108+ ! CHECK-FRM-KIND16: %[[R:.*]] = fir.declare{{.*}}r"
109+ ! CHECK-FRM-KIND16: %[[A_LOAD:.*]] = fir.load %[[A]]
110+ ! CHECK-FRM-KIND16: %[[P_LOAD:.*]] = fir.load %[[P]]
111+ ! CHECK-FRM-KIND16: %[[DIV:.*]] = arith.divf %[[A_LOAD]], %[[P_LOAD]] fastmath<contract> : f128
112+ ! CHECK-FRM-KIND16: %[[CV1:.*]] = fir.convert %[[DIV]] : (f128) -> si128
113+ ! CHECK-FRM-KIND16: %[[CV2:.*]] = fir.convert %[[CV1]] : (si128) -> f128
114+ ! CHECK-FRM-KIND16: %[[MUL:.*]] = arith.mulf %[[CV2]], %[[P_LOAD]] fastmath<contract> : f128
115+ ! CHECK-FRM-KIND16: %[[SUB:.*]] = arith.subf %[[A_LOAD]], %[[MUL]] fastmath<contract> : f128
116+ ! CHECK-FRM-KIND16: fir.store %[[SUB]] to %[[R]] : !fir.ref<f128>
117+ ! CHECK-FM-KIND16: %[[A:.*]] = fir.declare{{.*}}a"
118+ ! CHECK-FM-KIND16: %[[P:.*]] = fir.declare{{.*}}p"
119+ ! CHECK-FM-KIND16: %[[R:.*]] = fir.declare{{.*}}r"
120+ ! CHECK-FM-KIND16: %[[A_LOAD:.*]] = fir.load %[[A]]
121+ ! CHECK-FM-KIND16: %[[P_LOAD:.*]] = fir.load %[[P]]
122+ ! CHECK-FM-KIND16: %[[DIV:.*]] = arith.divf %[[A_LOAD]], %[[P_LOAD]] fastmath<fast> : f128
123+ ! CHECK-FM-KIND16: %[[CV1:.*]] = fir.convert %[[DIV]] : (f128) -> si128
124+ ! CHECK-FM-KIND16: %[[CV2:.*]] = fir.convert %[[CV1]] : (si128) -> f128
125+ ! CHECK-FM-KIND16: %[[MUL:.*]] = arith.mulf %[[CV2]], %[[P_LOAD]] fastmath<fast> : f128
126+ ! CHECK-FM-KIND16: %[[SUB:.*]] = arith.subf %[[A_LOAD]], %[[MUL]] fastmath<fast> : f128
127+ ! CHECK-FM-KIND16: fir.store %[[SUB]] to %[[R]] : !fir.ref<f128>
81128! CHECK-NFRM-KIND16: fir.call @_FortranAModReal16(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) {{.*}}: (f128, f128, !fir.ref<i8>, i32) -> f128
82129 r = mod (a, p)
83130end subroutine mod_real16
0 commit comments